#include #include #include #include #include #include #include "manhat-lib/shared_util.h" #include "manhat-lib/shared_super_util.h" #include "manhat-lib/shared_roster_xml_parser.h" #include "manhat-lib/shared_survey_string.h" #include "manhat-lib/shared_file_util.h" #include "manhat-lib/shared_cs_util.h" #include "manhat-lib/shared_course_info.h" #include "manhat-lib/shared_super_menu.h" static void write_roster_file(const char *buf, char *roster_path) { int fd; FILE *fp; const char *ptr; snprintf (roster_path, MAX_PATH + 1, "%sCGI_DATA_roster_XXXXXX", TMP_PATH); fd = mkstemp (roster_path); if(fd == -1) cs_critical_error (ERR_MKSTEMP_FAILED, ""); close(fd); change_mkstemp_permission(roster_path); /*shared_file_util.c */ fp = fopen (roster_path, "w"); if (!fp) cs_critical_error (ERR_FOPEN_WRITE_FAILED, roster_path); for(ptr=buf; *ptr; ptr++) { fputc(*ptr, fp); } fclose(fp); } void buffer_standard_xml_file ( const char *roster_path, char **buffer ) { FILE *fp; struct stat statbuf; *buffer = (char *) 0; if (stat (roster_path, &statbuf)) { cs_critical_error(ERR_FOPEN_READ_FAILED , ""); } *buffer = (char *) malloc((statbuf.st_size + 1) * sizeof(char)); if(!*buffer) { cs_critical_error (ERR_MALLOC_FAILED, ""); } fp = fopen(roster_path, "r"); if(!fp) { cs_critical_error(ERR_FOPEN_READ_FAILED , ""); } if(fread(*buffer,statbuf.st_size,1,fp) != 1) { cs_critical_error(ERR_FREAD_FAILED, ""); } fclose(fp); *(*buffer + statbuf.st_size) = '\0'; /* null terminate the string */ } XML_COURSE_INFO_LIST * build_xml_data_list( char *roster_path, const char *username) { XML_COURSE_INFO_LIST *head; /* shared_roster_xml_parser.h */ char *buf; char *xml_data =0; char *roster =0; xml_data = hdf_get_value(global_cgi->hdf, "Query.xml_data", 0); /* was xml_data passed via CGI input? */ roster = hdf_get_value(global_cgi->hdf, "Query.roster_file", 0); /* was xml_data passed via CGI input? */ if(xml_data) { /** allocate enough space to hold all of the XML data */ buf = malloc_str(xml_data); /* shared_survey_string.c */ write_roster_file(buf, roster_path); } else if(roster && strlen(roster)) { snprintf(roster_path, MAX_PATH + 1, "%s/%s", AUTO_UPDATE_ROSTER_PATH, roster); buffer_standard_xml_file(roster_path, &buf); } else /* no xml_data provided via a form - try reading the standard text file */ { snprintf(roster_path, MAX_PATH + 1, XML_ROSTER_PATH, username); buffer_standard_xml_file(roster_path, &buf); } head = xml_course_data_parser(buf); /* shared_roster_xml_parser.c */ free(buf); return head; } int main() { char key[MAX_KEY + 1]; char roster_path[MAX_PATH + 1]; /* path to roster file containing XML data */ XML_COURSE_INFO_LIST *list; /* shared_roster_xml_parser.h */ SESSION user; SUB_DIR_ID_NODE *unique_dir_list; SUBDIR_COURSE_LIST *sub_list; cs_cgi_init(); cs_get_required_parameter ("id", key, MAX_KEY ); /* shared_cs_util.c */ validate_super_key(key, &user); /* shared_super_util.c */ set_admin_page(&user, key, 0, "super_new_course_form"); /* shared_super_menu.c */ list = build_xml_data_list(roster_path, user.username); /* shared_roster_xml_paraser.c */ unique_dir_list = build_unique_subdir_list(list); /* shared_course_info.c */ sub_list = build_sub_list_info(unique_dir_list); /* shared_course_info.c */ free_sub_list_info(unique_dir_list); /* shared_course_info.c */ list_courses(list, key, roster_path, sub_list); /* shared_course_info.c */ free_subdir_course_list(sub_list); /* shared_course_info.c */ free_xml_data_list(list); /* shared_roster_xml_parser.c */ cs_cgi_display("super_xml_create_courses", 1); cs_cgi_destroy(); return 0; }