// The contents of this file are subject to the Mozilla Public License // Version 1.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.mozilla.org/MPL/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations // under the License. // // The Original Code is the Berkeley Open Infrastructure for Network Computing. // // The Initial Developer of the Original Code is the SETI@home project. // Portions created by the SETI@home project are Copyright (C) 2002 // University of California at Berkeley. All Rights Reserved. // // Contributor(s): // #include "windows_cpp.h" #include "error_numbers.h" #include "file_names.h" #include "filesys.h" #include "parse.h" #include "client_types.h" PROJECT::PROJECT() { } PROJECT::~PROJECT() { if (project_specific_prefs) { free(project_specific_prefs); } } // parse project fields from prefs.xml // int PROJECT::parse_prefs(FILE* in) { char buf[256], *p; int retval; strcpy(master_url, ""); strcpy(authenticator, ""); while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", master_url)) continue; else if (parse_str(buf, "", authenticator)) continue; else if (parse_double(buf, "", resource_share)) continue; else if (match_tag(buf, "")) { retval = dup_element_contents(in, "", &p); if (retval) return ERR_XML_PARSE; project_specific_prefs = p; continue; } else fprintf(stderr, "PROJECT::parse_prefs(): unrecognized: %s\n", buf); } return ERR_XML_PARSE; } // parse project fields from client_state.xml // int PROJECT::parse_state(FILE* in) { char buf[256]; STRING256 string; strcpy(project_name, ""); strcpy(user_name, ""); next_request_time = 0; resource_share = 1; exp_avg_cpu = 0; exp_avg_mod_time = 0; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", string.text)) { scheduler_urls.push_back(string); continue; } else if (parse_str(buf, "", project_name)) continue; else if (parse_str(buf, "", user_name)) continue; else if (parse_int(buf, "", rpc_seqno)) continue; else if (parse_int(buf, "", hostid)) continue; else if (parse_int(buf, "", next_request_time)) continue; else if (parse_double(buf, "", exp_avg_cpu)) continue; else if (parse_int(buf, "", exp_avg_mod_time)) continue; else if (match_tag(buf, "")) { dup_element_contents(in, "", &code_sign_key); } else fprintf(stderr, "PROJECT::parse_state(): unrecognized: %s\n", buf); } return ERR_XML_PARSE; } int PROJECT::write_state(FILE* out) { unsigned int i; fprintf(out, "\n" ); for (i=0; i%s\n", scheduler_urls[i].text ); } fprintf(out, " %s\n" " %s\n" " %s\n" " %d\n" " %d\n" " %d\n" " %f\n" " %d\n", master_url, project_name, user_name, rpc_seqno, hostid, next_request_time, exp_avg_cpu, exp_avg_mod_time ); if (code_sign_key) { fprintf(out, " \n%s\n", code_sign_key ); } fprintf(out, "\n" ); return 0; } void PROJECT::copy_state_fields(PROJECT& p) { scheduler_urls = p.scheduler_urls; project_name = p.project_name; user_name = p.user_name; rpc_seqno = p.rpc_seqno; hostid = p.hostid; next_request_time = p.next_request_time; exp_avg_cpu = p.exp_avg_cpu; exp_avg_mod_time = p.exp_avg_mod_time; } void PROJECT::copy_prefs_fields(PROJECT& p) { authenticator = p.authenticator; if (p.project_specific_prefs) { project_specific_prefs = strdup(p.project_specific_prefs); } resource_share = p.resource_share; } int APP::parse(FILE* in) { char buf[256]; strcpy(name, ""); project = NULL; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", name)) continue; else if (parse_int(buf, "", version_num)) continue; else fprintf(stderr, "APP::parse(): unrecognized: %s\n", buf); } return ERR_XML_PARSE; } int APP::write(FILE* out) { fprintf(out, "\n" " %s\n" " %d\n" "\n", name, version_num ); return 0; } FILE_INFO::FILE_INFO() { } FILE_INFO::~FILE_INFO() { } // If from server, make an exact copy of everything // except the start/end tags and the element. // int FILE_INFO::parse(FILE* in, bool from_server) { char buf[256]; STRING256 url; strcpy(name, ""); strcpy(md5_cksum, ""); nbytes = 0; max_nbytes = 0; generated_locally = false; file_present = false; executable = false; uploaded = false; upload_when_present = false; sticky = false; signature_required = false; project = NULL; file_xfer = NULL; urls.clear(); if (from_server) { signed_xml = strdup(""); } else { signed_xml = 0; } xml_signature = 0; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (match_tag(buf, "")) { dup_element_contents(in, "", &xml_signature); continue; } if (from_server) { strcatdup(signed_xml, buf); } if (parse_str(buf, "", name)) continue; else if (parse_str(buf, "", url.text)) { urls.push_back(url); continue; } else if (match_tag(buf, "")) { dup_element_contents(in, "", &file_signature); continue; } else if (parse_str(buf, "", md5_cksum)) continue; else if (parse_double(buf, "", nbytes)) continue; else if (parse_double(buf, "", max_nbytes)) continue; else if (match_tag(buf, "")) generated_locally = true; else if (match_tag(buf, "")) file_present = true; else if (match_tag(buf, "")) executable = true; else if (match_tag(buf, "")) uploaded = true; else if (match_tag(buf, "")) upload_when_present = true; else if (match_tag(buf, "")) sticky = true; else if (match_tag(buf, "")) signature_required = true; else if (!from_server && match_tag(buf, "")) { dup_element_contents(in, "", &signed_xml); continue; } else fprintf(stderr, "FILE_INFO::parse(): unrecognized: %s\n", buf); } return 1; } int FILE_INFO::write(FILE* out, bool to_server) { unsigned int i; fprintf(out, "\n" " %s\n" " %s\n" " %f\n" " %f\n", name, md5_cksum, nbytes, max_nbytes ); if (!to_server) { if (generated_locally) fprintf(out, " \n"); if (file_present) fprintf(out, " \n"); if (executable) fprintf(out, " \n"); if (uploaded) fprintf(out, " \n"); if (upload_when_present) fprintf(out, " \n"); if (sticky) fprintf(out, " \n"); if (signature_required) fprintf(out, " \n"); } for (i=0; i%s\n", urls[i].text); } if (!to_server) { if (signed_xml) { fprintf(out, "\n%s\n", signed_xml); } if (xml_signature) { fprintf(out, "\n%s\n", xml_signature); } } fprintf(out, "\n"); return 0; } // delete underlying file // int FILE_INFO::delete_file() { char path[256]; get_pathname(this, path); return file_delete(path); } int APP_VERSION::parse(FILE* in) { char buf[256]; FILE_REF file_ref; strcpy(app_name, ""); version_num = 0; app = NULL; project = NULL; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", app_name)) continue; else if (match_tag(buf, "")) { file_ref.parse(in); app_files.push_back(file_ref); continue; } else if (parse_int(buf, "", version_num)) continue; else fprintf(stderr, "APP_VERSION::parse(): unrecognized: %s\n", buf); } return 1; } int APP_VERSION::write(FILE* out) { unsigned int i; fprintf(out, "\n" " %s\n" " %d\n", app_name, version_num ); for (i=0; i\n" ); return 0; } int FILE_REF::parse(FILE* in) { char buf[256]; strcpy(file_name, ""); strcpy(open_name, ""); fd = -1; main_program = false; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", file_name)) continue; else if (parse_str(buf, "", open_name)) continue; else if (parse_int(buf, "", fd)) continue; else if (match_tag(buf, "")) main_program = true; else fprintf(stderr, "FILE_REF::parse(): unrecognized: %s\n", buf); } return 1; } int FILE_REF::write(FILE* out) { if (strlen(open_name)) { fprintf(out, " %s\n", open_name); } fprintf(out, " \n" " %s\n", file_name ); if (fd >= 0) { fprintf(out, " %d\n", fd); } if (main_program) { fprintf(out, " \n"); } fprintf(out, " \n"); return 0; } int WORKUNIT::parse(FILE* in) { char buf[256]; FILE_REF file_ref; strcpy(name, ""); strcpy(app_name, ""); version_num = 0; strcpy(command_line, ""); strcpy(env_vars, ""); app = NULL; project = NULL; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", name)) continue; else if (parse_str(buf, "", app_name)) continue; else if (parse_int(buf, "", version_num)) continue; else if (parse_str(buf, "", command_line)) continue; else if (parse_str(buf, "", env_vars)) continue; else if (parse_double(buf, "", seconds_to_complete)) continue; else if (match_tag(buf, "")) { file_ref.parse(in); input_files.push_back(file_ref); continue; } else fprintf(stderr, "WORKUNIT::parse(): unrecognized: %s\n", buf); } return 1; } int WORKUNIT::write(FILE* out) { unsigned int i; fprintf(out, "\n" " %s\n" " %s\n" " %d\n" " %s\n" " %s\n", name, app_name, version_num, command_line, env_vars ); for (i=0; i\n"); return 0; } int RESULT::parse_ack(FILE* in) { char buf[256]; strcpy(name, ""); while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; else if (parse_str(buf, "", name)) continue; else fprintf(stderr, "RESULT::parse(): unrecognized: %s\n", buf); } return 1; } void RESULT::clear() { strcpy(name, ""); strcpy(wu_name, ""); output_files.clear(); is_active = false; is_compute_done = false; is_server_ack = false; cpu_time = 0; exit_status = 0; strcpy(stderr_out, ""); app = NULL; wup = NULL; project = NULL; } // parse a element from scheduling server. // int RESULT::parse_server(FILE* in) { char buf[256]; FILE_REF file_ref; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; if (parse_str(buf, "", name)) continue; if (parse_str(buf, "", wu_name)) continue; if (match_tag(buf, "")) { file_ref.parse(in); output_files.push_back(file_ref); continue; } else fprintf(stderr, "RESULT::parse(): unrecognized: %s\n", buf); } return 1; } // parse a element from state file // int RESULT::parse_state(FILE* in) { char buf[256]; FILE_REF file_ref; while (fgets(buf, 256, in)) { if (match_tag(buf, "")) return 0; if (parse_str(buf, "", name)) continue; if (parse_str(buf, "", wu_name)) continue; if (match_tag(buf, "")) { file_ref.parse(in); output_files.push_back(file_ref); continue; } else if (parse_double(buf, "", cpu_time)) continue; else if (parse_int(buf, "", exit_status)) continue; else if (match_tag(buf, "" )) { while (fgets(buf, 256, in)) { if (match_tag(buf, "")) break; strcat(stderr_out, buf); } continue; } else fprintf(stderr, "RESULT::parse(): unrecognized: %s\n", buf); } return 1; } int RESULT::write(FILE* out, bool to_server) { unsigned int i; FILE_INFO* fip; int n; fprintf(out, "\n" " %s\n" " %d\n" " %f\n", name, exit_status, cpu_time ); n = strlen(stderr_out); if (n) { fprintf(out, "\n" "%s", stderr_out ); if (stderr_out[n-1] != '\n') fprintf(out, "\n"); fprintf(out, "\n" ); } if (!to_server) { fprintf(out, " %s\n", wu_name ); for (i=0; iuploaded) { fip->write(out, to_server); } } } fprintf(out, "\n"); return 0; } // this is called only after is_compute_done is true. // bool RESULT::is_upload_done() { unsigned int i; FILE_INFO* fip; for (i=0; iupload_when_present && !fip->uploaded) { return false; } } return true; }