void AssertRootPermission() { if(getuid()) { fprintf(stderr,"Need Root Permission\n"); #ifndef __DEBUG__ SafeExit(1); #endif } }
/*================================================================*/ int WINAPI WinMain( HINSTANCE _hInstance , HINSTANCE _hPrevInst , LPSTR _lpszArgs , int _nWinMode ) { bool FullScreenFlag = false; CDebug *m_pDebug = nullptr; #ifdef _DEBUG // メモリリークの検出 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // デバッグ管理用のクラス m_pDebug = DEBUG; #endif // インスタンスをコピーしておく CAPP->hInst = _hInstance; CAPP->SetCDebug( m_pDebug ); DEBUG->PrintConsole( "===" + GAME_TITLE + "の初期化を始めます===\n" , CDebug::ConPreside ); DEBUG->PrintConsole( "================================================================\n" , CDebug::ConFence ); DEBUG->PrintConsole( "\n\n" ); // ウィンドウを作成する if( MakeWindow( &FullScreenFlag , _nWinMode ) == false ) { std::string sErrorMessage = "ウィンドウの作成に失敗しました\n本作品はXP以降のWindowsOSでの動作を前提としています。\nもし上記を満たしており、エラーが発生した場合はご連絡お願いします"; ErrorMessage( sErrorMessage ); SafeExit(); SafeDelete( VARIABLE_DATA( m_pDebug ) ); return 1; } DEBUG->PrintConsole( "ウィンドウの作成に成功しました...\n" , CDebug::ConPreside ); // アプリケーションの初期化 if( CAPP->InitializeApplication( FullScreenFlag ) == false ) { std::string sErrorMessage = "ゲームの初期化中にエラーが発生しました\n安全にゲームを終了します"; ErrorMessage( sErrorMessage ); SafeExit(); SafeDelete( VARIABLE_DATA( m_pDebug ) ); return 1; } DEBUG->PrintConsole( "================================================================\n" , CDebug::ConFence ); DEBUG->PrintConsole( GAME_TITLE + "の初期化に成功しました...\n" , CDebug::ConPreside ); DEBUG->PrintConsole( "\n\n" ); // ゲームループの開始 CAPP->GameLoop(); // 解放 CAPP->Delete(); #ifdef _DEBUG // CDebugの解放は一番最後に行う SafeDelete( VARIABLE_DATA( m_pDebug ) ); #endif return 0; }
int main(int argc, char *argv[]) { int Pid; int c; int rvExist1=0, rvExist2=0; PGresult *result; char *NewDir="."; char *AgentName = "ununpack"; char *AgentARSName = "ununpack_ars"; char *agent_desc = "Unpacks archives (iso, tar, etc)"; int Recurse=0; int ars_pk = 0; int user_pk = 0; long Pfile_size = 0; char *ListOutName=NULL; char *Fname = NULL; char *FnameCheck = NULL; char *COMMIT_HASH; char *VERSION; char agent_rev[PATH_MAX]; struct stat Stat; /* connect to the scheduler */ fo_scheduler_connect(&argc, argv, &pgConn); while((c = getopt(argc,argv,"ACc:d:FfHhL:m:PQiqRr:T:t:U:VvXx")) != -1) { switch(c) { case 'A': SetContainerArtifact=0; break; case 'C': ForceContinue=1; break; case 'c': break; /* handled by fo_scheduler_connect() */ case 'd': /* if there is a %U in the path, substitute a unique ID */ NewDir=PathCheck(optarg); break; case 'F': UseRepository=1; break; case 'f': ForceDuplicate=1; break; case 'L': ListOutName=optarg; break; case 'm': MaxThread = atoi(optarg); if (MaxThread < 1) MaxThread=1; break; case 'P': PruneFiles=1; break; case 'R': Recurse=-1; break; case 'r': Recurse=atoi(optarg); break; case 'i': if (!IsExe("dpkg-source",Quiet)) LOG_WARNING("dpkg-source is not available on this system. This means that debian source packages will NOT be unpacked."); SafeExit(0); break; /* never reached */ case 'Q': UseRepository=1; user_pk = fo_scheduler_userID(); /* get user_pk for user who queued the agent */ /* Get the upload_pk from the scheduler */ if((Upload_Pk = fo_scheduler_next()) == NULL) SafeExit(0); break; case 'q': Quiet=1; break; case 'T': memset(REP_GOLD,0,sizeof(REP_GOLD)); strncpy(REP_GOLD,optarg,sizeof(REP_GOLD)-1); break; case 't': memset(REP_FILES,0,sizeof(REP_FILES)); strncpy(REP_FILES,optarg,sizeof(REP_FILES)-1); break; case 'U': UseRepository = 1; Recurse = -1; Upload_Pk = optarg; break; case 'V': printf("%s", BuildVersion);SafeExit(0); case 'v': Verbose++; break; case 'X': UnlinkSource=1; break; case 'x': UnlinkAll=1; break; default: Usage(argv[0], BuildVersion); SafeExit(25); } } /* Open DB and Initialize CMD table */ if (UseRepository) { /* Check Permissions */ if (GetUploadPerm(pgConn, atoi(Upload_Pk), user_pk) < PERM_WRITE) { LOG_ERROR("You have no update permissions on upload %s", Upload_Pk); SafeExit(100); } COMMIT_HASH = fo_sysconfig(AgentName, "COMMIT_HASH"); VERSION = fo_sysconfig(AgentName, "VERSION"); sprintf(agent_rev, "%s.%s", VERSION, COMMIT_HASH); /* Get the unpack agent key */ agent_pk = fo_GetAgentKey(pgConn, AgentName, atoi(Upload_Pk), agent_rev,agent_desc); InitCmd(); /* Make sure ars table exists */ if (!fo_CreateARSTable(pgConn, AgentARSName)) SafeExit(0); /* Has this user previously unpacked this upload_pk successfully? * In this case we are done. No new ars record is needed since no * processing is initiated. * The unpack version is ignored. */ snprintf(SQL,MAXSQL, "SELECT ars_pk from %s where upload_fk='%s' and ars_success=TRUE", AgentARSName, Upload_Pk); result = PQexec(pgConn, SQL); if (fo_checkPQresult(pgConn, result, SQL, __FILE__, __LINE__)) SafeExit(101); if (PQntuples(result) > 0) /* if there is a value */ { PQclear(result); LOG_WARNING("Upload_pk %s, has already been unpacked. No further action required", Upload_Pk) SafeExit(0); } PQclear(result); /* write the unpack_ars start record */ ars_pk = fo_WriteARS(pgConn, ars_pk, atoi(Upload_Pk), agent_pk, AgentARSName, 0, 0); /* Get Pfile path and Pfile_Pk, from Upload_Pk */ snprintf(SQL,MAXSQL, "SELECT pfile.pfile_sha1 || '.' || pfile.pfile_md5 || '.' || pfile.pfile_size AS pfile, pfile_fk, pfile_size FROM upload INNER JOIN pfile ON upload.pfile_fk = pfile.pfile_pk WHERE upload.upload_pk = '%s'", Upload_Pk); result = PQexec(pgConn, SQL); if (fo_checkPQresult(pgConn, result, SQL, __FILE__, __LINE__)) SafeExit(102); if (PQntuples(result) > 0) /* if there is a value */ { Pfile = strdup(PQgetvalue(result,0,0)); Pfile_Pk = strdup(PQgetvalue(result,0,1)); Pfile_size = atol(PQgetvalue(result, 0, 2)); if (Pfile_size == 0) { PQclear(result); LOG_WARNING("Uploaded file (Upload_pk %s), is zero length. There is nothing to unpack.", Upload_Pk) SafeExit(0); } PQclear(result); } // Determine if uploadtree records should go into a separate table. // If the input file size is > 500MB, then create a separate uploadtree_{upload_pk} table // that inherits from the master uploadtree table. // Save uploadtree_tablename, it will get written to upload.uploadtree_tablename later. if (Pfile_size > 500000000) { sprintf(uploadtree_tablename, "uploadtree_%s", Upload_Pk); if (!fo_tableExists(pgConn, uploadtree_tablename)) { snprintf(SQL,MAXSQL,"CREATE TABLE %s (LIKE uploadtree INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES); ALTER TABLE %s ADD CONSTRAINT %s CHECK (upload_fk=%s); ALTER TABLE %s INHERIT uploadtree", uploadtree_tablename, uploadtree_tablename, uploadtree_tablename, Upload_Pk, uploadtree_tablename); PQsetNoticeProcessor(pgConn, SQLNoticeProcessor, SQL); // ignore notice about implicit primary key index creation result = PQexec(pgConn, SQL); // Ignore postgres notice about creating an implicit index if (PQresultStatus(result) != PGRES_NONFATAL_ERROR) if (fo_checkPQcommand(pgConn, result, SQL, __FILE__, __LINE__)) SafeExit(103); PQclear(result); } } else strcpy(uploadtree_tablename, "uploadtree_a"); } CheckCommands(Quiet); if (NewDir) MkDir(NewDir); if (Verbose) { fclose(stderr) ; stderr=stdout; } /* don't interlace! */ if (ListOutName != NULL) { if ((ListOutName[0]=='-') && (ListOutName[1]=='\0')) ListOutFile=stdout; else ListOutFile = fopen(ListOutName,"w"); if (!ListOutFile) { LOG_ERROR("pfile %s Unable to write to %s\n",Pfile_Pk,ListOutName) SafeExit(104); } else { /* Start the file */ fputs("<xml tool=\"ununpack\" ",ListOutFile); fputs("version=\"",ListOutFile); fputs(Version,ListOutFile); fputs("\" ",ListOutFile); fputs("compiled_date=\"",ListOutFile); fputs(__DATE__,ListOutFile); fputs(" ",ListOutFile); fputs(__TIME__,ListOutFile); fputs("\"",ListOutFile); fputs(">\n",ListOutFile); } /* Problem: When parallel processing, the XML may be generated out of order. Solution? When using XML, only use 1 thread. */ MaxThread=1; } // Set ReunpackSwitch if the uploadtree records are missing from the database. if (!ReunpackSwitch && UseRepository) { snprintf(SQL,MAXSQL,"SELECT uploadtree_pk FROM uploadtree WHERE upload_fk=%s limit 1;",Upload_Pk); result = PQexec(pgConn, SQL); if (fo_checkPQresult(pgConn, result, SQL, __FILE__, __LINE__)) SafeExit(105); if (PQntuples(result) == 0) ReunpackSwitch=1; PQclear(result); } /*** process files from command line ***/ for( ; optind<argc; optind++) { CksumFile *CF=NULL; Cksum *Sum; int i; if (Fname) { free(Fname); Fname=NULL; } if (ListOutName != NULL) { fprintf(ListOutFile,"<source source=\"%s\" ",argv[optind]); if (UseRepository && !fo_RepExist(REP_FILES,argv[optind])) { /* make sure the source exists in the src repository */ if (fo_RepImport(argv[optind],REP_FILES,argv[optind],1) != 0) { LOG_ERROR("Failed to import '%s' as '%s' into the repository",argv[optind],argv[optind]) SafeExit(106); } } } if (UseRepository) { if (fo_RepExist(REP_FILES,argv[optind])) { Fname=fo_RepMkPath(REP_FILES,argv[optind]); } else if (fo_RepExist(REP_GOLD,argv[optind])) { Fname=fo_RepMkPath(REP_GOLD,argv[optind]); if (fo_RepImport(Fname,REP_FILES,argv[optind],1) != 0) { LOG_ERROR("Failed to import '%s' as '%s' into the repository",Fname,argv[optind]) SafeExit(107); } } if (Fname) { FnameCheck = Fname; CF = SumOpenFile(Fname); } else { LOG_ERROR("NO file unpacked. File %s does not exist either in GOLD or FILES", Pfile); SafeExit(108); } /* else: Fname is NULL and CF is NULL */ } else { FnameCheck = argv[optind]; CF = SumOpenFile(argv[optind]); } /* Check file to unpack. Does it exist? Is it zero length? */ if (stat(FnameCheck,&Stat)) { LOG_ERROR("File to unpack is unavailable: %s, error: %s", Fname, strerror(errno)); SafeExit(109); } else if (Stat.st_size < 1) { LOG_WARNING("File to unpack is empty: %s", Fname); SafeExit(110); } if (ListOutFile) { if (CF) { Sum = SumComputeBuff(CF); SumCloseFile(CF); if (Sum) { fputs("fuid=\"",ListOutFile); for(i=0; i<20; i++) { fprintf(ListOutFile,"%02X",Sum->SHA1digest[i]); } fputs(".",ListOutFile); for(i=0; i<16; i++) { fprintf(ListOutFile,"%02X",Sum->MD5digest[i]); } fputs(".",ListOutFile); fprintf(ListOutFile,"%Lu",(long long unsigned int)Sum->DataLen); fputs("\" ",ListOutFile); free(Sum); } /* if Sum */ } /* if CF */ else /* file too large to mmap (probably) */ { FILE *Fin; Fin = fopen(argv[optind],"rb"); if (Fin) { Sum = SumComputeFile(Fin); if (Sum) { fputs("fuid=\"",ListOutFile); for(i=0; i<20; i++) { fprintf(ListOutFile,"%02X",Sum->SHA1digest[i]); } fputs(".",ListOutFile); for(i=0; i<16; i++) { fprintf(ListOutFile,"%02X",Sum->MD5digest[i]); } fputs(".",ListOutFile); fprintf(ListOutFile,"%Lu",(long long unsigned int)Sum->DataLen); fputs("\" ",ListOutFile); free(Sum); } fclose(Fin); } } /* else no CF */ fprintf(ListOutFile,">\n"); /* end source XML */ } if (Fname) TraverseStart(Fname,"called by main via args",NewDir,Recurse); else TraverseStart(argv[optind],"called by main",NewDir,Recurse); if (ListOutName != NULL) fprintf(ListOutFile,"</source>\n"); } /* end for */ /* free memory */ if (Fname) { free(Fname); Fname=NULL; } /* process pfile from scheduler */ if (Pfile) { if (0 == (rvExist1 = fo_RepExist2(REP_FILES,Pfile))) { Fname=fo_RepMkPath(REP_FILES,Pfile); } else if (0 == (rvExist2 = fo_RepExist2(REP_GOLD,Pfile))) { Fname=fo_RepMkPath(REP_GOLD,Pfile); if (fo_RepImport(Fname,REP_FILES,Pfile,1) != 0) { LOG_ERROR("Failed to import '%s' as '%s' into the repository",Fname,Pfile) SafeExit(111); } } if (Fname) { TraverseStart(Fname,"called by main via env",NewDir,Recurse); free(Fname); Fname=NULL; } else { LOG_ERROR("NO file unpacked!"); if (rvExist1 > 0) { Fname=fo_RepMkPath(REP_FILES, Pfile); LOG_ERROR("Error is %s for %s", strerror(rvExist1), Fname); } if (rvExist2 > 0) { Fname=fo_RepMkPath(REP_GOLD, Pfile); LOG_ERROR("Error is %s for %s", strerror(rvExist2), Fname); } SafeExit(112); } } /* recurse on all the children */ if (Thread > 0) do { Pid = ParentWait(); Thread--; if (Pid >= 0) { if (!Queue[Pid].ChildEnd) { /* copy over data */ if (Recurse > 0) Traverse(Queue[Pid].ChildRecurse,NULL,"called by wait",NULL,Recurse-1,&Queue[Pid].PI); else if (Recurse < 0) Traverse(Queue[Pid].ChildRecurse,NULL,"called by wait",NULL,Recurse,&Queue[Pid].PI); } } } while(Pid >= 0); if (MagicCookie) magic_close(MagicCookie); if (ListOutFile) { fprintf(ListOutFile,"<summary files_regular=\"%d\" files_compressed=\"%d\" artifacts=\"%d\" directories=\"%d\" containers=\"%d\" />\n", TotalFiles,TotalCompressedFiles,TotalArtifacts, TotalDirectories,TotalContainers); fputs("</xml>\n",ListOutFile); } if (pgConn) { /* If it completes, mark it! */ if (Upload_Pk) { snprintf(SQL,MAXSQL,"UPDATE upload SET upload_mode = (upload_mode | (1<<5)), uploadtree_tablename='%s' WHERE upload_pk = '%s';",uploadtree_tablename, Upload_Pk); result = PQexec(pgConn, SQL); /* UPDATE upload */ if (fo_checkPQcommand(pgConn, result, SQL, __FILE__ ,__LINE__)) SafeExit(113); PQclear(result); snprintf(SQL,MAXSQL,"UPDATE %s SET realparent = getItemParent(uploadtree_pk) WHERE upload_fk = '%s'",uploadtree_tablename, Upload_Pk); result = PQexec(pgConn, SQL); /* UPDATE uploadtree */ if (fo_checkPQcommand(pgConn, result, SQL, __FILE__ ,__LINE__)) SafeExit(114); PQclear(result); } if (ars_pk) fo_WriteARS(pgConn, ars_pk, atoi(Upload_Pk), agent_pk, AgentARSName, 0, 1); } if (ListOutFile && (ListOutFile != stdout)) { fclose(ListOutFile); } if (UnlinkAll && MaxThread > 1) { /* Delete temporary files */ if (strcmp(NewDir, ".")) RemoveDir(NewDir); } SafeExit(0); return(0); // never executed but makes the compiler happy }
/** * \brief Given an ISO image and a directory, * extract the image to the directory. * * ISO images have magic type "application/x-iso". * This can unpack any known ISO9660 format including: * ISO9660, Rock Ridge, Joliet, and El Torrito. * * Uses the following external commands: `isoinfo grep` * \note This spawns multiple processes. * \param Source * \param Destination * \return 0 on success, non-zero on failure. **/ int ExtractISO (char *Source, char *Destination) { char Cmd[FILENAME_MAX*4]; /* command to run */ char Line[FILENAME_MAX]; int Len; char *s; /* generic string pointer */ FILE *Fin; int rc; char TempSource[FILENAME_MAX], TempDestination[FILENAME_MAX]; /* judge if the parameters are empty */ if ((NULL == Source) || (!strcmp(Source, "")) || (NULL == Destination) || (!strcmp(Destination, ""))) return 1; if (!Quiet && Verbose) fprintf(stderr,"Extracting ISO: %s\n",Source); /* get list of directories in the ISO and make the directories */ if (TaintString(TempSource,FILENAME_MAX,Source,1,NULL) || TaintString(TempDestination,FILENAME_MAX,Destination,1,NULL)) return(-1); memset(Cmd,'\0',sizeof(Cmd)); snprintf(Cmd,sizeof(Cmd)," (isoinfo -l -R -J -i '%s' || isoinfo -l -R -i '%s' " "|| isoinfo -l -i '%s') 2>/dev/null | grep '^Directory'", TempSource, TempSource, TempSource); Fin = popen(Cmd,"r"); if (!Fin) { fprintf(stderr,"ERROR: ISO failed: %s\n",Cmd); return(-1); } while(ReadLine(Fin,Line,sizeof(Line)-1) >= 0) { s=strchr(Line,'/'); /* find first slash */ if (s==NULL) continue; snprintf(Cmd,sizeof(Cmd),"%s%s",Destination,s); if (Verbose > 1) printf("ISO directory: %s\n",Cmd); if (MkDir(Cmd)) { fprintf(stderr,"ERROR: Unable to mkdir(%s) in ExtractISO\n",Cmd); if (!ForceContinue) SafeExit(40); } } pclose(Fin); /* Now let's extract each file */ snprintf(Cmd,sizeof(Cmd),"(isoinfo -f -R -J -i '%s' || isoinfo -f -R -i '%s' || isoinfo -f -i '%s') 2>/dev/null", TempSource, TempSource, TempSource); Fin = popen(Cmd,"r"); if (!Fin) { fprintf(stderr,"ERROR: ISO failed: %s\n",Cmd); return(-1); } memset(Line,'\0',sizeof(Line)); strcpy(Line,Destination); Len=strlen(Destination); while(ReadLine(Fin,Line+Len,sizeof(Line)-1-Len) >= 0) { if (Line[Len] != '/') continue; /* should not happen, but... */ if (IsDir(Line)) continue; /* don't do directories */ if (Verbose > 1) printf("ISO file: %s\n",Line); /* create extraction command */ snprintf(Cmd,sizeof(Cmd),"(isoinfo -R -J -i '%s' -x '%s' || isoinfo -R -i '%s' -x '%s' || isoinfo -i '%s' -x '%s') > '%s' 2>/dev/null",TempSource,Line+Len,TempSource,Line+Len,TempSource, Line+Len,Line); rc = system(Cmd); if (WIFSIGNALED(rc)) { printf("ERROR: Process killed by signal (%d): %s\n",WTERMSIG(rc),Cmd); SafeExit(-1); } rc = WEXITSTATUS(rc); if (rc) { fprintf(stderr,"ERROR: Command failed (rc=%d): %s\n",rc,Cmd); pclose(Fin); return(rc); } } pclose(Fin); #if 0 /* save the ISO information */ snprintf(Cmd,sizeof(Cmd),"(isoinfo -d -R -i '%s' || isoinfo -d -R -J -i '%s' || isoinfo -d -i '%s') > '%s/ISO_INFO' 2>/dev/null", TempSource, TempSource, TempSource, TempDestination); rc = system(Cmd); if (WIFSIGNALED(rc)) { printf("ERROR: Process killed by signal (%d): %s\n",WTERMSIG(rc),Cmd); SafeExit(-1); } rc = WEXITSTATUS(rc); if (rc) { fprintf(stderr,"ERROR: Command failed (rc=%d): %s\n",rc,Cmd); return(rc); } #endif /* Set the permissions on every file and directory */ /* Only RockRidge saves permission information! */ snprintf(Cmd,sizeof(Cmd),"(isoinfo -l -R -J -i '%s' || isoinfo -l -R -i '%s' || isoinfo -l -i '%s') 2>/dev/null", TempSource, TempSource, TempSource); Fin = popen(Cmd,"r"); if (Fin) { mode_t Mode; char Dir[FILENAME_MAX]; memset(Dir,'\0',sizeof(Dir)); while((Len = ReadLine(Fin,Line,sizeof(Line)-1)) >= 0) { if (Len == 0) continue; if (!strchr("Dd-",Line[0])) continue; /* Every line is either a "Directory" or desirable chmod */ if (!strncmp(Line,"Directory listing of ",21)) { strcpy(Dir,Line+22); continue; } snprintf(Cmd,sizeof(Cmd)-1,"%s/%s%s",Destination,Dir,Line+67); Mode = GetISOMode(Line); chmod(Cmd,Mode); } pclose(Fin); } /* All done */ return(0); } /* ExtractISO() */
int main (int argc, char *argv[]) { int arg; char *Parm = NULL; char *TempFileDir=NULL; int c; int InitFlag=0; int CmdlineFlag = 0; /** run from command line flag, 1 yes, 0 not */ int user_pk; char *agent_desc = "Network downloader. Uses wget(1)."; memset(GlobalTempFile,'\0',MAXCMD); memset(GlobalURL,'\0',MAXCMD); memset(GlobalParam,'\0',MAXCMD); memset(GlobalType,'\0',MAXCMD); GlobalUploadKey = -1; int upload_pk = 0; // the upload primary key //int Agent_pk; char *SVN_REV; char *VERSION; char agent_rev[MAXCMD]; /* open the connection to the scheduler and configuration */ fo_scheduler_connect(&argc, argv, &pgConn); /* Process command-line */ while((c = getopt(argc,argv,"d:Gg:ik:A:R:l:Cc:Vvh")) != -1) { switch(c) { case 'd': TempFileDir = PathCheck(optarg); break; case 'g': { struct group *SG; SG = getgrnam(optarg); if (SG) ForceGroup = SG->gr_gid; } break; case 'G': GlobalImportGold=0; break; case 'i': InitFlag=1; break; case 'k': GlobalUploadKey = atol(optarg); if (!GlobalTempFile[0]) strcpy(GlobalTempFile,"wget.default_download"); break; case 'A': sprintf(GlobalParam, "%s -A %s ",GlobalParam, optarg); break; case 'R': sprintf(GlobalParam, "%s -R %s ",GlobalParam, optarg); break; case 'l': sprintf(GlobalParam, "%s -l %s ",GlobalParam, optarg); break; case 'c': break; /* handled by fo_scheduler_connect() */ case 'C': CmdlineFlag = 1; break; case 'v': break; case 'V': printf("%s", BuildVersion); SafeExit(0); default: Usage(argv[0]); SafeExit(-1); } } if (argc - optind > 1) { Usage(argv[0]); SafeExit(-1); } /* When initializing the DB, don't do anything else */ if (InitFlag) { if (pgConn) PQfinish(pgConn); SafeExit(0); } SVN_REV = fo_sysconfig("wget_agent", "SVN_REV"); VERSION = fo_sysconfig("wget_agent", "VERSION"); sprintf(agent_rev, "%s.%s", VERSION, SVN_REV); /* Get the Agent Key from the DB */ fo_GetAgentKey(pgConn, basename(argv[0]), GlobalUploadKey, agent_rev, agent_desc); /** get proxy */ GetProxy(); /* Run from the command-line (for testing) */ for(arg=optind; arg < argc; arg++) { memset(GlobalURL,'\0',sizeof(GlobalURL)); strncpy(GlobalURL,argv[arg],sizeof(GlobalURL)); /* If the file contains "://" then assume it is a URL. Else, assume it is a file. */ LOG_VERBOSE0("Command-line: %s",GlobalURL); if (strstr(GlobalURL,"://")) { fo_scheduler_heart(1); LOG_VERBOSE0("It's a URL"); if (GetURL(GlobalTempFile,GlobalURL,TempFileDir) != 0) { LOG_FATAL("Download of %s failed.",GlobalURL); SafeExit(21); } if (GlobalUploadKey != -1) { DBLoadGold(); } unlink(GlobalTempFile); } else /* must be a file */ { LOG_VERBOSE0("It's a file -- GlobalUploadKey = %ld",GlobalUploadKey); if (GlobalUploadKey != -1) { memcpy(GlobalTempFile,GlobalURL,MAXCMD); DBLoadGold(); } } } /* Run from scheduler! */ if (0 == CmdlineFlag) { user_pk = fo_scheduler_userID(); /* get user_pk for user who queued the agent */ while(fo_scheduler_next()) { Parm = fo_scheduler_current(); /* get piece of information, including upload_pk, downloadfile url, and parameters */ if (Parm && Parm[0]) { fo_scheduler_heart(1); /* set globals: uploadpk, downloadfile url, parameters */ SetEnv(Parm,TempFileDir); upload_pk = GlobalUploadKey; /* Check Permissions */ if (GetUploadPerm(pgConn, upload_pk, user_pk) < PERM_WRITE) { LOG_ERROR("You have no update permissions on upload %d", upload_pk); continue; } char TempDir[MAXCMD]; memset(TempDir,'\0',MAXCMD); snprintf(TempDir, MAXCMD-1, "%s/wget", TempFileDir); // /var/local/lib/fossology/agents/wget struct stat Status; if (GlobalType[0]) { if (GetVersionControl() == 0) { DBLoadGold(); unlink(GlobalTempFile); } else { LOG_FATAL("upload %ld File retrieval failed: uploadpk=%ld tempfile=%s URL=%s Type=%s", GlobalUploadKey,GlobalUploadKey,GlobalTempFile,GlobalURL, GlobalType); SafeExit(23); } } else if (strstr(GlobalURL, "*") || stat(GlobalURL, &Status) == 0) { if (!Archivefs(GlobalURL, GlobalTempFile, TempFileDir, Status)) { LOG_FATAL("Failed to archieve. GlobalURL, GlobalTempFile, TempFileDir are: %s, %s, %s, " "Mode is: %lo (octal)\n", GlobalURL, GlobalTempFile, TempFileDir, (unsigned long) Status.st_mode); SafeExit(50); } DBLoadGold(); unlink(GlobalTempFile); } else { if (GetURL(GlobalTempFile,GlobalURL,TempDir) == 0) { DBLoadGold(); unlink(GlobalTempFile); } else { LOG_FATAL("upload %ld File retrieval failed: uploadpk=%ld tempfile=%s URL=%s", GlobalUploadKey,GlobalUploadKey,GlobalTempFile,GlobalURL); SafeExit(22); } } } } } /* if run from scheduler */ SafeExit(0); exit(0); /* to prevent compiler warning */ } /* main() */