int uagent_fix(char *buffer, int maxlen) { /* makes useragent strings into something * clean and simple ap@geekz.com.au */ int x, y=0, len; char junk[128]; /* convert to lowercase */ strnlower(buffer, maxlen); /* trim any leading space off */ len = strlen(buffer); for(x = 0; x < len && x < maxlen; x++) if( !isspace(buffer[x]) ) break; if(x > 0) strncpy(buffer, &buffer[x], maxlen); /* delete any weird characters & duplicate spaces */ len = strlen(buffer); for ( x = 0; x < len && x < maxlen && buffer[x] != 0; x++ ) if ( ( isspace(buffer[x]) && isspace(buffer[x + 1]) ) || (!isprint(buffer[x]) && !isspace(buffer[x])) ) { strncpy(&buffer[x], &buffer[x + 1], maxlen - x); x--; } /* change mozilla to netscape */ if( fastcmp(buffer, "mozilla/", 8) ) { strncpy(junk, buffer, sizeof(junk) - 1); strncpy(junk, &junk[8], sizeof(junk) - 1); strncpy(buffer, "netscape ", maxlen); strncpy(&buffer[9], junk, maxlen - 9); } /* change microsoft internet explorer to msie */ if( fastcmp(buffer, "microsoft internet explorer", 27) ) { strncpy(junk, buffer, sizeof(junk) - 1); strncpy(junk, &junk[27], sizeof(junk) - 1); strncpy(buffer, "msie", maxlen); strncpy(&buffer[4], junk, maxlen - 9); } /* detect comaptibility hack */ len=strlen(buffer); for( x = 0; x < len && x < maxlen; x++ ) if( buffer[x] == '(' && fastcmp(&buffer[x], "(compatible;", 12) ) goto chack; goto nochack; /* jump over compatibility hack */ /* we only get here if we have a compatibility hack on our hands */ chack: x += 13; for( ; x < len && x < maxlen; x++ ) { if ( buffer[x] == ';' || buffer[x] == ')' ) break; buffer[y] = buffer[x]; y++; } buffer[y] = 0; len = strlen(buffer); /* check if a mozilla/... was on the end of the compat string (some dumb programmer fucked up) */ for( x = 0; x < len - 8 && x < maxlen - 7; x++ ) if ( buffer[x] == 'm' && buffer[x + 1] == 'o' && buffer[x + 2] == 'z' && buffer[x + 3] == 'i' && buffer[x + 4] == 'l' && buffer[x + 5] == 'l' && buffer[x + 6] == 'a' && buffer[x + 7] == '/' ) buffer[x] = 0; /* some msie's come out as msie+4 or msie.4 - change to msie/... */ if ( buffer[0] == 'm' && buffer[1] == 's' && buffer[2] == 'i' && buffer[3] == 'e' && buffer[4] != '/' && !isalnum(buffer[4]) ) buffer[4] = '/'; nochack: /* trim trailing junk in brackets off */ for( x = 0; x < len && x < maxlen; x++ ) if( buffer[x] == '(' ) buffer[x] = 0; /* trim trailing spaces off */ len = strlen(buffer); if( maxlen < len ) len = maxlen; for( x = len - 1; x >= 1; x-- ) if ( isspace(buffer[x]) ) buffer[x] = 0; else break; /* if msie/ or netscape/ */ if ( strncmp(buffer, "msie", 4) == 0 || strncmp(buffer, "netscape", 8) == 0) { /* remove any crap after the version # */ len = strlen(buffer); for( y = x = 0; x < len && x < maxlen; x++ ) if ( buffer[x] == ' ' ) { if ( y++ ) { buffer[x] = 0; break; } else buffer[x] = '/'; } /* remove -c... c-... -... and trailing c crap */ if ( strncmp(buffer, "netscape", 8) == 0 ) { len = strlen(buffer); for ( x = 0; x < len && x < maxlen; x++ ) if ( (buffer[x] == '-' && buffer[x + 1] == 'c') || (buffer[x] == 'c' && buffer[x + 1] == '-') || (buffer[x] == '-') ) { buffer[x] = 0; break; } len = strlen(buffer); if ( buffer[x - 1] == 'c' ) buffer[x - 1] = 0; } } /* delete any weird characters and convert _'s to spaces */ len = strlen(buffer); for ( x = 0; x < len && x < maxlen && buffer[x] != 0; x++ ) { if ( buffer[x] >= 'a' && buffer[x] <= 'z' ) /* do nothing */; else if ( buffer[x] >= '0' && buffer[x] <= '9' ) /* do nothing */; else if ( buffer[x] == '.' || buffer[x] == '/' || buffer[x] == '-' || buffer[x] == '[' || buffer[x] == ']' || buffer[x] == ' ') /* do nothing */; else if ( buffer[x] == '_' ) buffer[x] = ' '; else { strncpy(&buffer[x], &buffer[x + 1], maxlen - x); x--; } } /* trim any leading space off result */ len = strlen(buffer); for( x = 0; x < len && x < maxlen; x++ ) if( !isspace(buffer[x]) ) break; if( x > 0 ) strncpy(buffer, &buffer[x], maxlen); /* anything 1 or 2 chars is considered 'unknown' */ len = strlen(buffer); if ( len <= 2 ) strncpy(buffer, "unknown", maxlen); return 1; }