/* AccessLog.c : Count access CGI. Programed by Kaburaya Seiden. http://www2.justnet.ne.jp/~kabstudio/ kab-studio@multimedia.design.co.jp This program is "Copyleft". */ /* If you compile in DEBUG mode, set 1.*/ /* else(Release mode), set 0 */ #define MODE_DEBUG 0 /* If you use "flock", set 1 */ /* If you use "lockf", set 0 */ #define MODE_FLOCK 1 #include #include #include #if MODE_FLOCK #include #else #include #endif #define MAX_URL_LEN 257 #define LOG_FILE_NAME "./AccessLog.txt" #define IMG_DEFAULT "./TPDot.gif" #define START_COUNT "000001" /* programs */ int Locking( p_pfLogFile ) FILE *p_pfLogFile; { int iFileNo, iLockRes; iFileNo = fileno( p_pfLogFile ); #if MODE_FLOCK iLockRes = flock( iFileNo, LOCK_EX ); #else lseek( iFileNo, 0L, 0 ); iLockRes = lockf( iFileNo, F_LOCK, 0L ); #endif if( iLockRes == -1 ) return 0; return 1; } int Unlocking( p_pfLogFile ) FILE *p_pfLogFile; { int iFileNo, iLockRes; iFileNo = fileno( p_pfLogFile ); #if MODE_FLOCK iLockRes = flock( iFileNo, LOCK_UN ); #else lseek( iFileNo, 0L, 0 ); iLockRes = lockf( iFileNo, F_ULOCK, 0L ); #endif if( iLockRes == -1 ) return 0; return 1; } long UrlSearch( p_pchRetCount, p_pchUrl, p_pfLogFile ) char *p_pchRetCount; char *p_pchUrl; FILE *p_pfLogFile; { int iScanRes; long lFilePos; char chUrl[MAX_URL_LEN]; rewind( p_pfLogFile ); do { iScanRes = fscanf( p_pfLogFile, "%s", chUrl ); /* Read. */ if( strcmp( chUrl, p_pchUrl ) == 0 ) /* Hit!! */ { lFilePos = ftell( p_pfLogFile ); /* Return file POINTER position */ iScanRes = fscanf( p_pfLogFile, "%s", p_pchRetCount ); /* Get count. */ return lFilePos; } }while( iScanRes != EOF ); return 0L; } void IncTextCount( p_pchRetCount ) char *p_pchRetCount; { int iCarryUp, iLen, iF1; char chChar; iCarryUp = 1; iLen = strlen( p_pchRetCount ); for( iF1 = iLen - 1; 0 <= iF1; iF1-- ) { chChar = p_pchRetCount[iF1]; if( iCarryUp == 1 && chChar == '9' ) { p_pchRetCount[iF1] = '0'; iCarryUp = 1; } else { p_pchRetCount[iF1] += iCarryUp; iCarryUp = 0; } } return; } void IncCount( p_pchLogFile, p_pchUrl ) char *p_pchLogFile; char *p_pchUrl; { int iLockRes; long lFilePos; char chCount[12]; FILE *pfLogFile; pfLogFile = fopen( p_pchLogFile, "r+" ); if( pfLogFile == NULL ) return; iLockRes = Locking( pfLogFile ); if( iLockRes == -1 ) { fclose( pfLogFile ); return; } /* Lock Start!! */ lFilePos = UrlSearch( chCount, p_pchUrl, pfLogFile ); /* Search same name. */ if( lFilePos == 0L ) /* New Url */ { fseek( pfLogFile, 0L, 2 ); /* Go to EOF. */ fprintf( pfLogFile, "%s %s\n", p_pchUrl, START_COUNT ); /* Write log. */ } else { IncTextCount( chCount ); /* Increment count. */ fseek( pfLogFile, lFilePos, 0 ); /* Set postion. */ fprintf( pfLogFile, " %s\n", chCount ); /* Write log. */ } /* Lock End */ Unlocking( pfLogFile ); return; } void DelYen( p_pchRet, p_pchArg ) char *p_pchRet; char *p_pchArg; { int iChar, iPArg, iPRet; iPArg = 0; iPRet = 0; do { iChar = p_pchArg[iPArg]; if( iChar != '\\' ) { p_pchRet[iPRet] = iChar; ++iPRet; } ++iPArg; }while( iChar != '\0' ); return; } int WriteImg( p_pchFile ) char *p_pchFile; { int iChar, iScanRes; FILE *pfImg; printf( "Content-type: image/gif\n\n" ); pfImg = fopen( p_pchFile, "rb" ); /* Read Only, Bynary mode */ if( pfImg == NULL ) return 0; rewind( pfImg ); /* Go to Top */ while( !feof( pfImg ) ) putchar( fgetc( pfImg ) ); /* Output */ fclose( pfImg ); return 1; } int main( argc, argv ) int argc; char *argv[]; { char chPara[MAX_URL_LEN]; /* display dot */ WriteImg( IMG_DEFAULT ); if( argc != 2 ) exit( 1 ); DelYen( chPara, argv[1] ); /* Count */ IncCount( LOG_FILE_NAME, chPara ); exit( 0 ); }