#include "filesrvmng.h" int create_config() { int not_exist_file = 0; FILE *fp = NULL; char *ShareId, *Name, *Description, *Path; int writable, guestOk, anyValidUsers, noneValidUsers, selectValidUsers; char *SmbName, *SysName; char buff[N], smb_conf_include[N], filename[N]; uid_t uid; gid_t gid; mode_t mode; struct stat sb; MYSQL *my = NULL; MYSQL_RES *res = NULL; MYSQL_RES *res_users = NULL; MYSQL_ROW row; MYSQL_ROW row_users; if (!(my = db_connect())) { snprintf(buff, sizeof(buff), "Unable to connect to the mysql database\n"); messlog(buff, EXIT, MESS); } // SMB_CONF snprintf(smb_conf_include, sizeof(smb_conf_include), "%s.include", SMB_CONF); if (stat(smb_conf_include, &sb)) { if (errno != ENOENT) { snprintf(buff, sizeof(buff), "Unable to stat file %s: %s\n", smb_conf_include, strerror(errno)); messlog(buff, EXIT, MESS); } not_exist_file = 1; // File not exist } snprintf(filename, sizeof(filename), "%s.tmp", smb_conf_include); if (!(fp = fopen(filename, "w"))) { snprintf(buff, sizeof(buff), "Unable to open file %s for writing: %s\n", filename, strerror(errno)); messlog(buff, EXIT, MESS); } //============== Conf writing ============================= //global section if (print_preferences(fp, my) !=OK) messlog2(EXIT, MESS, "Unable to print [global] section to %s", SMB_CONF); // shares snprintf(buff, sizeof(buff), "select id, name, description, path, writable, guest_ok, valid_users \ from module_fileserver_shares" ); if (mysql_real_query(my, buff, strlen(buff)) || !(res = mysql_store_result(my))) { messlog2(EXIT, MESS, "Unable to query: %s\n", mysql_error(my)); } while((row = mysql_fetch_row(res))) { ShareId = row[0]; Name = row[1]; Description = row[2]; Path = row[3]; writable = (row[4] && !strncmp(row[4], "true", 4)) ? 1 : 0; guestOk = (row[5] && !strncmp(row[5], "true", 4)) ? 1 : 0; anyValidUsers = (row[6] && !strncmp(row[6], "any", 4)) ? 1 : 0; // noneValidUsers = (row[6] && !strncmp(row[6], "none", 4)) ? 1 : 0; selectValidUsers= (row[6] && !strncmp(row[6], "select", 4)) ? 1 : 0; // any valid users? snprintf(buff, sizeof(buff), "select name, sys_name \ from module_fileserver_users u, module_fileserver_valid_users v \ where v.sid='%s' and v.uid=u.id", ShareId ); if (mysql_real_query(my, buff, strlen(buff)) || !(res_users = mysql_store_result(my))) { messlog2(EXIT, MESS, "Unable to query: %s\n", mysql_error(my)); } noneValidUsers = (selectValidUsers && !mysql_num_rows(res_users)); if (!guestOk && noneValidUsers) // Disabled Share continue; if (!Name || !Path) // Bad Share continue; fprintf(fp, "[%s]\n" "\tpath = %s\n" "\twritable = %s\n" "\tguest ok = %s\n" , Name, Path, writable ? "yes" : "no", guestOk ? "yes" : "no"); if (noneValidUsers && guestOk) fprintf(fp, "\tguest only = yes\n"); if (Description) fprintf(fp, "\tcomment = %s\n", Description); if (anyValidUsers || noneValidUsers) { // Enabled to All Share fprintf(fp, "\n"); continue; } // valid users fprintf(fp, "\tvalid users ="); while((row_users = mysql_fetch_row(res_users))) { SmbName = row_users[0]; SysName = row_users[0]; if (SysName) { fprintf(fp, " %s", SysName); } } mysql_free_result(res_users); fprintf(fp, "\n\n"); } mysql_free_result(res); //============== Conf writing End ========================= mysql_close(my); if (fclose(fp) != 0) { snprintf(buff, sizeof(buff), "Unable to close file %s: %s\n", filename, strerror(errno)); messlog(buff, EXIT, MESS); } if (rename(filename, smb_conf_include) == -1) { snprintf(buff, sizeof(buff), "Error while rename file %s to %s: %s\n", filename, smb_conf_include, strerror(errno)); messlog(buff, EXIT, MESS); } if (!not_exist_file) { uid = sb.st_uid; gid = sb.st_gid; mode= sb.st_mode; } else { uid = 0; /// Root gid = 0; /// Root mode= 0644; } if (file_set_perms(smb_conf_include, uid, gid, mode) !=OK) { messlog2(EXIT, MESS, "Unable to set permissions on file %s", smb_conf_include); } return OK; }