// Copyright (c) 1999 Relic Entertainment Inc. // Written by Janik Joire // // $History: $ #include #include #include #include #include "plumber.h" #include "leakyfaucet.h" int main(int argc,char **argv) { long n,nSize,nPos,nLen,nArg; unsigned long nCount,nFlag; char *pRoot,*pBuffer,*pLine,szWork[4],szLine[1024]; char szExe[256],szLog[256],szComment[256],szData[512]; unsigned char aData[MAX_LEAK_STRING_LENGTH]; FILE *pExe,*pLog; // Show copyright printf("Plumber\n"); printf("Copyright (c) 1999 Relic Entertainment Inc.\n"); // Check args if(argc < 3) { printf("Usage: plumber [-c] -e| \n"); printf(" -c: Find comment string in log file\n"); printf(" -e: Use environment variable for the work path\n"); printf(" : Work path for executable and log file\n"); printf(" : Comment string for log file\n"); return(-1); } // Set length nLen=strlen(leakString); // Clear flag nFlag=0; // Check first argument nArg=1; if((stricmp(argv[nArg],"-c") == 0) || (stricmp(argv[nArg],"/c") == 0)) { // Set flag nFlag=1; // Increment argument nArg++; } if((stricmp(argv[nArg],"-e") == 0) || (stricmp(argv[nArg],"/e") == 0)) { // Get root name pRoot=getenv(ENV_ROOT); if(pRoot == NULL) { printf("Error: Environment variable %s not defined!\n",ENV_ROOT); return(-1); } // Get EXE name strcpy(szExe,pRoot); if(szExe[strlen(szExe)-1] != '\\') strcat(szExe,"\\"); strcat(szExe,DEF_PATH); strcat(szExe,EXE_NAME); // Get log name strcpy(szLog,pRoot); if(szLog[strlen(szLog)-1] != '\\') strcat(szLog,"\\"); strcat(szLog,DEF_PATH); strcat(szLog,LOG_NAME); } else { // Get EXE name strcpy(szExe,argv[nArg]); if(szExe[strlen(szExe)-1] != '\\') strcat(szExe,"\\"); strcat(szExe,EXE_NAME); // Get log name strcpy(szLog,argv[nArg]); if(szLog[strlen(szLog)-1] != '\\') strcat(szLog,"\\"); strcat(szLog,LOG_NAME); } // Check flag if(nFlag == 0) { // Get comment string nArg++; strcpy(szComment,""); for(n=nArg;n nArg) strcat(szComment," "); strcat(szComment,argv[n]); } } // Open log file to read only pLog=fopen(szLog,"r+t"); if(pLog == NULL) { printf("Error: Unable to open log file (check attributes) %s\n",szLog); return(-1); } // Open EXE file to read and write (file must exist) pExe=fopen(szExe,"r+b"); if(pExe == NULL) { fclose(pLog); printf("Error: Unable to open executable %s\n",szExe); return(-1); } printf("Checking for leaky faucets in executable: %s\n",szExe); printf("Please wait...\n"); // Get executable size fseek(pExe,0,SEEK_SET); nSize=ftell(pExe); fseek(pExe,0,SEEK_END); nSize=ftell(pExe)-nSize; // Allocate buffer for executable pBuffer=(char *)malloc(nSize*sizeof(char)); if(pBuffer == NULL) { fclose(pExe); fclose(pLog); printf("Error: Unable to allocate buffer for executable!\n"); return(-1); } // Read executable into buffer fseek(pExe,0,SEEK_SET); if(fread(pBuffer,1,nSize,pExe) < (size_t)nSize) if(pBuffer == NULL) { fclose(pExe); fclose(pLog); printf("Error: Unable to read executable into buffer!\n"); return(-1); } // Reset count nCount=0; // Look for leaky faucet(s) for(n=0;n