# HG changeset patch # User Binki # Date 2010-01-10 02:34:01 # Node ID 0ec89d48ac6d40e03caea1ebc0addd26da5a7903 # Parent f26936aa69e0510567da8c7b4b28de2b572e82c4 correct general_info.xml location, recursive mkdir() support diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -56,6 +56,13 @@ struct general_info struct distrend_config *config; + struct + { + /** general_info.xml */ + char *geninfo; + + } files; + int jobs_in_queue; unsigned int free_clients; unsigned int rendering_clients; @@ -86,6 +93,7 @@ int import_general_info(struct general_i int updateJobStatsXML(struct distrenjob *job); char *job_getserialfilename(struct general_info *, unsigned int jobnum); +int distren_mkdir_recurse(char *fname); /* ********************** Functions ************************* */ @@ -105,7 +113,7 @@ int distrend_do() /** Fill variables at startup from XML dumps or defaults */ -int start_data(struct general_info *general_info, char *datadir) +int start_data(struct general_info *general_info) { struct stat buffer; @@ -128,9 +136,9 @@ int start_data(struct general_info *gene fprintf(stderr, "Initialized default global and queue states\n"); - if(stat("general_info.xml", &buffer) == 0) + if(stat(general_info->files.geninfo, &buffer) == 0) { - fprintf(stderr, "previous state file found, loading:\n"); + fprintf(stderr, "Previous state file found, loading:\n"); fprintf(stderr, "Parsing XML files and restoring previous state...\n"); if(import_general_info(general_info)) @@ -287,7 +295,7 @@ int prepare_distrenjob(struct general_in } _distren_asprintf(&path_with_num, "stor/job%d/out/", distrenjob->jobnum); - fprintf(stderr, ">>NOT<< creating dir ``%s''\n", path_with_num); /*< @TODO recursively create job directory */ + distren_mkdir_recurse(path_with_num); serialfile = job_getserialfilename(geninfo, distrenjob->jobnum); free(path_with_num); @@ -667,11 +675,8 @@ int distrend_do_config(int argc, char *a CFG_END() }; - struct distrenjob *distrenjob; cfg_t *cfg_listen; - int tmp; - fprintf(stderr, "%s:%d: running config\n", __FILE__, __LINE__); *config = malloc(sizeof(struct distrend_config)); myopts[1].simple_value = &(*config)->datadir; @@ -711,7 +716,7 @@ void update_general_info(struct general_ xmlTextWriterPtr writer; char *tmp; - writer = xmlNewTextWriterFilename("general_info.xml", 0); + writer = xmlNewTextWriterFilename(geninfo->files.geninfo, 0); xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL); xmlTextWriterStartElement(writer, (xmlChar*)"general_info"); @@ -742,7 +747,7 @@ int import_general_info(struct general_i xmlDocPtr doc; xmlNodePtr cur; - doc = xmlParseFile("general_info.xml"); + doc = xmlParseFile(general_info->files.geninfo); cur = xmlDocGetRootElement(doc); if (xmlStrcmp(cur->name, (xmlChar*)"general_info")) { @@ -1175,7 +1180,11 @@ int main(int argc, char *argv[]) if(distrend_do_config(argc, argv, &general_info.config)) return 1; - if(start_data(&general_info, general_info.config->datadir)) + /** preset paths */ + _distren_asprintf(&general_info.files.geninfo, "%s/general_info.xml", + general_info.config->datadir); + + if(start_data(&general_info)) { fprintf(stderr, "%s:%d: start_data() failed\n", __FILE__, __LINE__); return 1; @@ -1300,6 +1309,9 @@ int main(int argc, char *argv[]) xmlcleanup(); + /** free() paths */ + free(general_info.files.geninfo); + return 0; } @@ -1320,3 +1332,23 @@ char *job_getserialfilename(struct gener return filename; } + +int distren_mkdir_recurse(char *dirname) +{ + size_t counter; + char *nextdir; + + nextdir = strdup(dirname); + for(counter = 0; nextdir[counter]; counter ++) + { + /** @TODO OS-portabalize the path-separators */ + if(nextdir[counter] == '/') + { + nextdir[counter] = '\0'; + mkdir(nextdir, S_IRWXU | S_IRGRP | S_IROTH); + nextdir[counter] = '/'; + } + } + + return 0; +} diff --git a/src/server/listen.c b/src/server/listen.c --- a/src/server/listen.c +++ b/src/server/listen.c @@ -79,6 +79,9 @@ int distrend_listen(struct distrend_conf FD_ZERO(&(*clients)->readfds); FD_ZERO(&(*clients)->writefds); + /** accept()able sockets are considered ``readable'' */ + FD_SET(config->listens->sock, &(*clients)->readfds); + return 0; }