int update_finish(void) { #ifdef WIN32 char *temp, *self=exe_name(), *p; int timeout = 60, err; temp = malloc(strlen(self)+12); strcpy(temp, self); p = temp + strlen(temp) - 4; if (_stricmp(p, ".exe")) p += 4; strcpy(p, "_update.exe"); while (!DeleteFile(temp)) { err = GetLastError(); if (err == ERROR_FILE_NOT_FOUND) { // just as well, then free(temp); return 0; } Sleep(500); timeout--; if (timeout <= 0) { free(temp); return 1; } } free(temp); #endif return 0; }
bool Process(wxCmdLineParser& parser) { parser.Parse(); // long process_id (wxNOT_FOUND); wxString exe_name(wxEmptyString); //We got a command to close eTrigger // parser.Found(wxT("pid"), &process_id); parser.Found(wxT("name"), &exe_name); if ( /*process_id == wxNOT_FOUND || */exe_name.IsEmpty() ) { PrintUsage(); return false; } // Kill the process // if (wxProcess::Exists(process_id)) { // // //Okay, then let's close parent.exe // int killError = wxProcess::Kill(process_id, wxSIGTERM); // if (killError) { // if (killError == wxKILL_BAD_SIGNAL) { // wxPrintf(wxT("wxProcess::Kill Error: no such signal\n")); // return true; // } // if (killError == wxKILL_ACCESS_DENIED) { // wxPrintf(wxT("wxProcess::Kill Error: permission denied\n")); // return true; // } // if (killError == wxKILL_NO_PROCESS) { // wxPrintf(wxT("wxProcess::Kill Error: no such process\n")); // return true; // } // if (killError == wxKILL_ERROR) { // wxPrintf(wxT("An Error occurred attempting to close parent.exe, the helper will now attempt to forcefully close %s\n"), exe_name.c_str()); // int killError2 = wxProcess::Kill(process_id, wxSIGKILL); // if (killError2) { // wxPrintf(wxT("The Helper could not close %s\n"), exe_name.c_str()); // return true; // } // } // } // } else { // wxPrintf(wxT("Error: process %d does not exist\n"), process_id); // } // Now let's open the parent wxProcess proc; wxSleep( 3 ); proc.Open(wxString::Format(wxT("%s"), exe_name.c_str()), wxEXEC_ASYNC | wxEXEC_NOHIDE); proc.Detach(); }
int register_extension() { #if defined(WIN) int returnval; LONG rresult; HKEY newkey; char *currentfilename = exe_name(); char *iconname = NULL; char *opencommand = NULL; //char AppDataPath[MAX_PATH]; char *AppDataPath = NULL; iconname = (char*)malloc(strlen(currentfilename)+6); sprintf(iconname, "%s,-102", currentfilename); //Create Roaming application data folder /*if(!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0, AppDataPath))) { returnval = 0; goto finalise; }*/ //AppDataPath = _getcwd(NULL, 0); //Move Game executable into application data folder //TODO: Implement opencommand = (char*)malloc(strlen(currentfilename)+53+strlen(AppDataPath)); /*if((strlen(AppDataPath)+strlen(APPDATA_SUBDIR "\\Powder Toy"))<MAX_PATH) { strappend(AppDataPath, APPDATA_SUBDIR); _mkdir(AppDataPath); strappend(AppDataPath, "\\Powder Toy"); _mkdir(AppDataPath); } else { returnval = 0; goto finalise; }*/ sprintf(opencommand, "\"%s\" open \"%%1\" ddir \"%s\"", currentfilename, AppDataPath); //Create extension entry rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\.cps", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { returnval = 0; goto finalise; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"PowderToySave", strlen("PowderToySave")+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); returnval = 0; goto finalise; } RegCloseKey(newkey); rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\.stm", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { returnval = 0; goto finalise; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"PowderToySave", strlen("PowderToySave")+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); returnval = 0; goto finalise; } RegCloseKey(newkey); //Create program entry rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { returnval = 0; goto finalise; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"Powder Toy Save", strlen("Powder Toy Save")+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); returnval = 0; goto finalise; } RegCloseKey(newkey); //Set DefaultIcon rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave\\DefaultIcon", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { returnval = 0; goto finalise; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)iconname, strlen(iconname)+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); returnval = 0; goto finalise; } RegCloseKey(newkey); //Set Launch command rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave\\shell\\open\\command", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { returnval = 0; goto finalise; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)opencommand, strlen(opencommand)+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); returnval = 0; goto finalise; } RegCloseKey(newkey); returnval = 1; finalise: if(iconname) free(iconname); if(opencommand) free(opencommand); if(currentfilename) free(currentfilename); return returnval; #elif defined(LIN) char *currentfilename = exe_name(); FILE *f; const char *mimedata = "<?xml version=\"1.0\"?>\n" " <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>\n" " <mime-type type=\"application/vnd.powdertoy.save\">\n" " <comment>Powder Toy save</comment>\n" " <glob pattern=\"*.cps\"/>\n" " <glob pattern=\"*.stm\"/>\n" " </mime-type>\n" "</mime-info>\n"; f = fopen("powdertoy-save.xml", "wb"); if (!f) return 0; fwrite(mimedata, 1, strlen(mimedata), f); fclose(f); const char *desktopfiledata_tmp = "[Desktop Entry]\n" "Type=Application\n" "Name=Powder Toy\n" "Comment=Physics sandbox game\n" "MimeType=application/vnd.powdertoy.save;\n" "NoDisplay=true\n"; char *desktopfiledata = (char *)malloc(strlen(desktopfiledata_tmp)+strlen(currentfilename)+100); strcpy(desktopfiledata, desktopfiledata_tmp); strappend(desktopfiledata, "Exec="); strappend(desktopfiledata, currentfilename); strappend(desktopfiledata, " open %f\n"); f = fopen("powdertoy-tpt.desktop", "wb"); if (!f) return 0; fwrite(desktopfiledata, 1, strlen(desktopfiledata), f); fclose(f); system("xdg-mime install powdertoy-save.xml"); system("xdg-desktop-menu install powdertoy-tpt.desktop"); f = fopen("powdertoy-save-32.png", "wb"); if (!f) return 0; fwrite(icon_doc_32_png, 1, sizeof(icon_doc_32_png), f); fclose(f); f = fopen("powdertoy-save-16.png", "wb"); if (!f) return 0; fwrite(icon_doc_16_png, 1, sizeof(icon_doc_16_png), f); fclose(f); system("xdg-icon-resource install --noupdate --context mimetypes --size 32 powdertoy-save-32.png application-vnd.powdertoy.save"); system("xdg-icon-resource install --noupdate --context mimetypes --size 16 powdertoy-save-16.png application-vnd.powdertoy.save"); system("xdg-icon-resource forceupdate"); system("xdg-mime default powdertoy-tpt.desktop application/vnd.powdertoy.save"); unlink("powdertoy-save-32.png"); unlink("powdertoy-save-16.png"); unlink("powdertoy-save.xml"); unlink("powdertoy-tpt.desktop"); return 1; #elif defined MACOSX return 0; #endif }
char *exe_name(void) { #if defined WIN32 char *name= (char *)malloc(64); DWORD max=64, res; while ((res = GetModuleFileName(NULL, name, max)) >= max) { #elif defined MACOSX char *fn=malloc(64),*name=malloc(PATH_MAX); uint32_t max=64, res; if (_NSGetExecutablePath(fn, &max) != 0) { fn = realloc(fn, max); _NSGetExecutablePath(fn, &max); } if (realpath(fn, name) == NULL) { free(fn); free(name); return NULL; } res = 1; #else char fn[64], *name=malloc(64); size_t max=64, res; sprintf(fn, "/proc/self/exe"); memset(name, 0, max); while ((res = readlink(fn, name, max)) >= max-1) { #endif #ifndef MACOSX max *= 2; name = realloc(name, max); memset(name, 0, max); } #endif if (res <= 0) { free(name); return NULL; } return name; } int update_start(char *data, int len) { char *self=exe_name(), *temp; #ifdef WIN32 char *p; #endif FILE *f; int res = 1; if (!self) return 1; #ifdef WIN32 temp = malloc(strlen(self)+12); strcpy(temp, self); p = temp + strlen(temp) - 4; if (_stricmp(p, ".exe")) p += 4; strcpy(p, "_update.exe"); if (!MoveFile(self, temp)) goto fail; f = fopen(self, "wb"); if (!f) goto fail; if (fwrite(data, 1, len, f) != len) { fclose(f); DeleteFile(self); goto fail; } fclose(f); if ((int)ShellExecute(NULL, "open", self, NULL, NULL, SW_SHOWNORMAL) <= 32) { DeleteFile(self); goto fail; } return 0; #else temp = malloc(strlen(self)+8); strcpy(temp, self); strcat(temp, "-update"); f = fopen(temp, "w"); if (!f) goto fail; if (fwrite(data, 1, len, f) != len) { fclose(f); unlink(temp); goto fail; } fclose(f); if (chmod(temp, 0755)) { unlink(temp); goto fail; } if (rename(temp, self)) { unlink(temp); goto fail; } execl(self, "powder-update", NULL); #endif fail: free(temp); free(self); return res; }
int register_extension() { #if defined WIN32 LONG rresult; HKEY newkey; char *currentfilename = exe_name(); char *iconname; char *opencommand; iconname = malloc(strlen(currentfilename)+6); opencommand = malloc(strlen(currentfilename)+13); sprintf(iconname, "%s,-102", currentfilename); sprintf(opencommand, "\"%s\" open \"%%1\"", currentfilename); //Create extension entry rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\.cps", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { return 0; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"PowderToySave", strlen("PowderToySave")+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); return 0; } RegCloseKey(newkey); rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\.stm", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { return 0; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"PowderToySave", strlen("PowderToySave")+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); return 0; } RegCloseKey(newkey); //Create program entry rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { return 0; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)"Powder Toy Save", strlen("Powder Toy Save")+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); return 0; } RegCloseKey(newkey); //Set DefaultIcon rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave\\DefaultIcon", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { return 0; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)iconname, strlen(iconname)+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); return 0; } RegCloseKey(newkey); //Set Launch command rresult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\PowderToySave\\shell\\open\\command", 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, NULL); if (rresult != ERROR_SUCCESS) { return 0; } rresult = RegSetValueEx(newkey, 0, 0, REG_SZ, (LPBYTE)opencommand, strlen(opencommand)+1); if (rresult != ERROR_SUCCESS) { RegCloseKey(newkey); return 0; } RegCloseKey(newkey); return 1; #elif defined(LIN32) || defined(LIN64) char *currentfilename = exe_name(); FILE *f; char *mimedata = "<?xml version=\"1.0\"?>\n" " <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>\n" " <mime-type type=\"application/vnd.powdertoy.save\">\n" " <comment>Powder Toy save</comment>\n" " <glob pattern=\"*.cps\"/>\n" " <glob pattern=\"*.stm\"/>\n" " </mime-type>\n" "</mime-info>\n"; f = fopen("powdertoy-save.xml", "wb"); if (!f) return 0; fwrite(mimedata, 1, strlen(mimedata), f); fclose(f); char *desktopfiledata_tmp = "[Desktop Entry]\n" "Type=Application\n" "Name=Powder Toy\n" "Comment=Physics sandbox game\n" "MimeType=application/vnd.powdertoy.save;\n" "NoDisplay=true\n"; char *desktopfiledata = malloc(strlen(desktopfiledata_tmp)+strlen(currentfilename)+100); strcpy(desktopfiledata, desktopfiledata_tmp); strappend(desktopfiledata, "Exec="); strappend(desktopfiledata, currentfilename); strappend(desktopfiledata, " open %f\n"); f = fopen("powdertoy-tpt.desktop", "wb"); if (!f) return 0; fwrite(desktopfiledata, 1, strlen(desktopfiledata), f); fclose(f); system("xdg-mime install powdertoy-save.xml"); system("xdg-desktop-menu install powdertoy-tpt.desktop"); f = fopen("powdertoy-save-32.png", "wb"); if (!f) return 0; fwrite(icon_doc_32_png, 1, sizeof(icon_doc_32_png), f); fclose(f); f = fopen("powdertoy-save-16.png", "wb"); if (!f) return 0; fwrite(icon_doc_16_png, 1, sizeof(icon_doc_16_png), f); fclose(f); system("xdg-icon-resource install --noupdate --context mimetypes --size 32 powdertoy-save-32.png application-vnd.powdertoy.save"); system("xdg-icon-resource install --noupdate --context mimetypes --size 16 powdertoy-save-16.png application-vnd.powdertoy.save"); system("xdg-icon-resource forceupdate"); system("xdg-mime default powdertoy-tpt.desktop application/vnd.powdertoy.save"); unlink("powdertoy-save-32.png"); unlink("powdertoy-save-16.png"); unlink("powdertoy-save.xml"); unlink("powdertoy-tpt.desktop"); return 1; #elif defined MACOSX return 0; #endif }
int main(int argc, char **argv) { int i; int x; char *s; char *mpath; char *debuglog; FILE *debugfile; char *common_cflags="-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -D_CRT_SECURE_NO_DEPRECATE"; char *md = "-MD"; char *debug_flags = ""; char *optimize_flags = ""; char *outfile = ""; char *cmd = ""; char **sources = NULL; char *accum_objects = ""; char *linkcmd = ""; int md_forced = 0; int preprocessing = 0; int debug_build = 0; int optimized_build = 0; int linking = 1; int retval; save_args(argc,argv); for(i = 1; i < argc; ++i) { if (argv[i][0] == '-') { char *opt = argv[i]+1; switch(*opt) { case 'W': if(strcmp(opt,"Wall")) { goto filename; } break; case 'c': if(strlen(opt) > 1) { goto filename; } linking = 0; break; case 'E': if(strlen(opt) > 1) { if (opt[1] == 'H') { cmd = add_to(cmd," "); cmd = add_to(cmd,opt); } else { goto filename; } } preprocessing = 1; linking = 0; break; case 'O': /* ignore what opt is requested, set hard */ optimize_flags = "-Ox -Zi"; debug_flags = ""; debug_build = 0; if (!md_forced) { md = "-MD"; } optimized_build = 1; break; case 'g': if (strcmp(opt,"g") && strcmp(opt,"ggdb")) { goto filename; } if (!optimized_build) { debug_flags = "-Z7"; if (!md_forced) { md = "-MDd"; } linkcmd = add_to(linkcmd," -g"); debug_build = 1; } break; case 'm': case 'M': if(!strcmp(opt,"mt") || !strcmp(opt,"MT")) { md = "-MT"; } else if (!strcmp(opt,"md") || !strcmp(opt,"MD")) { md = "-MD"; } else if (!strcmp(opt,"ml") || !strcmp(opt,"ML")) { md = "-ML"; } else if (!strcmp(opt,"mdd") || !strcmp(opt,"MDd") || !strcmp(opt,"MDD")) { md = "-MDd"; } else if (!strcmp(opt,"mtd") || !strcmp(opt,"MTd") || !strcmp(opt,"MTD")) { md = "-MTd"; } else if (!strcmp(opt,"mld") || !strcmp(opt,"MLd") || !strcmp(opt,"MLD")) { md = "-MLd"; } else { goto filename; } md_forced = 1; break; case 'o': if (!strcmp(opt,"o")) { ++i; if (i >= argc) { error("-o without filename"); } outfile = argv[i]; } else { outfile = opt+1; } break; case 'I': if(opt[1] == '/') { mpath = do_cyp(opt+1); cmd = add_to(cmd," -I\""); cmd = add_to(cmd,mpath); cmd = add_to(cmd,"\""); free(mpath); } else { cmd = add_to(cmd," "); cmd = add_to(cmd,opt); } break; case 'D': cmd = add_to(cmd," -"); cmd = add_to(cmd,opt); case 'l': linkcmd = add_to(linkcmd," -"); linkcmd = add_to(linkcmd,opt); break; default: goto filename; } continue; } filename: s = argv[i]; x = strlen(s); if (x > 1 && s[x-1] == 'c' && s[x-2] == '.') { /* C source */ sources = add_to_src(sources,s); } else if (x > 3 && !strcmp(s + (x - 4),".cpp")) { /* C++ */ sources = add_to_src(sources,s); } else if (x > 1 && s[x-1] == 'o' && s[x-2] == '.') { linkcmd = add_to(linkcmd," "); linkcmd = add_to(linkcmd,s); } else { /* Pass rest to linker */ linkcmd = add_to(linkcmd," "); linkcmd = add_to(linkcmd,s); } } if ((debuglog = getenv("CC_SH_DEBUG_LOG")) != NULL) { debugfile = fopen(debuglog,"wb+"); if (debugfile) { fprintf(debugfile,"----------------\n"); } } else { debugfile = NULL; } tmpobjdir = add_to("","/tmp/tmpobj"); { char pidstr[100]; pid_t pid = getpid(); sprintf(pidstr,"%d",pid); tmpobjdir = add_to(tmpobjdir,pidstr); } mkdir(tmpobjdir,0777); if (sources != NULL) { char *output_filename; char *output_flag; char *params; for (i=0;sources[i] != NULL; ++i) { if (!linking) { int x = strlen(outfile); if (x > 1 && outfile[x-1] == 'o' && outfile[x-2] == '.') { if (*outfile != '/') { /* non absolute object */ if (i > 0) { error("Single object multiple sources"); } output_filename = add_to("",outfile); } else { if (i > 0) { error("Single object multiple sources"); } output_filename = do_cyp(outfile); } } else { char *tmp = object_name(sources[i]); /*fprintf(stderr,"sources[i] = %s\ntmp = %s\n", sources[i],tmp);*/ if (!x || outfile[0] != '/') { /* non absolute directory */ output_filename = add_to("",outfile); } else { output_filename = do_cyp(outfile); } /*fprintf(stderr,"output_filename = %s\n",output_filename);*/ if (*output_filename != '\0') { output_filename = add_to(output_filename,"/"); } output_filename = add_to(output_filename,tmp); free(tmp); } } else { char *tmp = object_name(sources[i]); output_filename = add_to("",tmpobjdir); output_filename = add_to(output_filename,"/"); output_filename = add_to(output_filename,tmp); accum_objects = add_to(accum_objects," "); accum_objects = add_to(accum_objects,output_filename); /* reform to dos path */ free(output_filename); output_filename = do_cyp(tmpobjdir); output_filename = add_to(output_filename,"/"); output_filename = add_to(output_filename,tmp); } mpath = do_cyp(sources[i]); if (preprocessing) { output_flag = add_to("","-E"); } else { output_flag = add_to("","-c -Fo"); output_flag = add_to(output_flag,output_filename); } params = add_to("","cl.exe "); params = add_to(params,common_cflags); params = add_to(params," "); params = add_to(params,md); params = add_to(params," "); params = add_to(params,debug_flags); params = add_to(params," "); params = add_to(params,optimize_flags); params = add_to(params," "); params = add_to(params,cmd); params = add_to(params," "); params = add_to(params,output_flag); params = add_to(params," "); params = add_to(params,mpath); free(output_filename); free(output_flag); free(mpath); if (debugfile) { fprintf(debugfile,"%s\n",save); fprintf(debugfile,"%s\n",params); } if (preprocessing) { retval = run(params,0,1); } else { retval = run(params,1,0); } if (retval != 0) { maybe_cleanup(); return retval; } free(params); } } if (linking) { char *out_spec; char *stdlib; char *params; if (strlen(outfile) == 0) { if (sources != NULL && sources[0] != NULL) { char *tmp = exe_name(sources[0]); out_spec = add_to("","-o "); out_spec = add_to(out_spec,tmp); free(tmp); } else { out_spec = add_to("",""); } } else { out_spec = add_to("","-o "); out_spec = add_to(out_spec,outfile); } if (!strcmp(md,"-ML")) { stdlib="-lLIBC"; } else if (!strcmp(md,"-MLd")) { stdlib="-lLIBCD"; } else if (!strcmp(md,"-MD")) { stdlib="-lMSVCRT"; } else if (!strcmp(md,"-MDd")) { stdlib="-lMSVCRTD"; } else if (!strcmp(md,"-MT")) { stdlib="-lLIBCMT"; } else if (!strcmp(md,"-MTd")) { stdlib="-lLIBMTD"; } else { stdlib = ""; } #if 0 params = add_to("","bash ld.sh "); #else params = add_to("","ld_wrap.exe "); #endif params = add_to(params,accum_objects); params = add_to(params," "); params = add_to(params,out_spec); params = add_to(params," "); params = add_to(params,linkcmd); params = add_to(params," "); params = add_to(params,stdlib); free(out_spec); free(accum_objects); if (debugfile) { fprintf(debugfile,"%s\n",params); } if (retval = run(params,0,0) != 0) { maybe_cleanup(); return retval; } free(params); } maybe_cleanup(); return 0; }