diff --git a/src/3proxy.c b/src/3proxy.c index 0e32d14..9d7e4bd 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -19,7 +19,7 @@ #endif FILE * confopen(); -extern unsigned char *strings[]; +extern char *strings[]; extern FILE *writable; extern struct counter_header cheader; extern struct counter_record crecord; @@ -79,7 +79,7 @@ void __stdcall CommandHandler( DWORD dwCommand ) } -void __stdcall ServiceMain(int argc, unsigned char* argv[] ) +void __stdcall ServiceMain(int argc, char* argv[] ) { hSrv = RegisterServiceCtrlHandler((LPCSTR)conf.stringtable[1], (LPHANDLER_FUNCTION)CommandHandler); @@ -181,7 +181,7 @@ void doschedule(void){ void dumpcounters(struct trafcount *tlin, int counterd){ - unsigned char tmpbuf[8192]; + char tmpbuf[8192]; struct trafcount *tl; if(counterd >= 0 && tlin) { @@ -189,7 +189,7 @@ void dumpcounters(struct trafcount *tlin, int counterd){ if(cheader.updated && conf.countertype && timechanged(cheader.updated, conf.time, conf.countertype)){ FILE * cfp; - cfp = fopen((char *)dologname(tmpbuf, sizeof(tmpbuf), (unsigned char *)conf.counterfile, NULL, conf.countertype, cheader.updated), "w"); + cfp = fopen((char *)dologname(tmpbuf, sizeof(tmpbuf), (char *)conf.counterfile, NULL, conf.countertype, cheader.updated), "w"); if(cfp){ for(tl = tlin; cfp && tl; tl = tl->next){ if(tl->type >= conf.countertype) @@ -293,9 +293,9 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int FILE * fp = NULL; #ifdef _WIN32 - unsigned char * arg; + char * arg; WSADATA wd; - unsigned char tmpbuf[8192]; + char tmpbuf[8192]; WSAStartup(MAKEWORD( 1, 1 ), &wd); osv.dwOSVersionInfoSize = sizeof(osv); diff --git a/src/Makefile.inc b/src/Makefile.inc index d7ee013..732439d 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -133,20 +133,14 @@ $(BUILDDIR)mycrypt$(EXESUFFICS): md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycryptmain$( md4$(OBJSUFFICS): libs/md4.h libs/md4.c $(CC) $(COUT)md4$(OBJSUFFICS) $(CFLAGS) libs/md4.c -smbdes$(OBJSUFFICS): libs/smbdes.c - $(CC) $(COUT)smbdes$(OBJSUFFICS) $(CFLAGS) libs/smbdes.c - md5$(OBJSUFFICS): libs/md5.h libs/md5.c $(CC) $(COUT)md5$(OBJSUFFICS) $(CFLAGS) libs/md5.c -ntlm$(OBJSUFFICS): ntlm.c - $(CC) $(COUT)ntlm$(OBJSUFFICS) $(CFLAGS) ntlm.c - stringtable$(OBJSUFFICS): stringtable.c $(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c -$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) log$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) log$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) clean: @$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES) diff --git a/src/auth.c b/src/auth.c index b71fff2..b740cb3 100644 --- a/src/auth.c +++ b/src/auth.c @@ -9,12 +9,12 @@ #include "proxy.h" -int clientnegotiate(struct chain * redir, struct clientparam * param, struct sockaddr * addr, unsigned char * hostname){ +int clientnegotiate(struct chain * redir, struct clientparam * param, struct sockaddr * addr, char * hostname){ unsigned char *buf; - unsigned char *username; + char *username; int res; int len=0; - unsigned char * user, *pass; + char * user, *pass; user = redir->extuser; @@ -56,7 +56,7 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc ":%hu HTTP/1.0\r\nConnection: keep-alive\r\n", ntohs(*SAPORT(addr))); if(user){ len += sprintf((char *)buf + len, "Proxy-Authorization: Basic "); - sprintf((char *)username, "%.128s:%.128s", user, pass?pass:(unsigned char *)""); + sprintf((char *)username, "%.128s:%.128s", user, pass?pass:(char *)""); en64(username, buf+len, (int)strlen((char *)username)); len = (int)strlen((char *)buf); len += sprintf((char *)buf + len, "\r\n"); @@ -87,7 +87,7 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc buf[7] = 3; } else memcpy(buf+4, SAADDR(addr), 4); - if(!user)user = (unsigned char *)"anonymous"; + if(!user)user = (char *)"anonymous"; len = (int)strlen((char *)user) + 1; memcpy(buf+8, user, len); len += 8; @@ -138,10 +138,10 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc } if(buf[1] == 2){ buf[inbuf++] = 1; - buf[inbuf] = (unsigned char)strlen((char *)user); + buf[inbuf] = (char)strlen((char *)user); memcpy(buf+inbuf+1, user, buf[inbuf]); inbuf += buf[inbuf] + 1; - buf[inbuf] = pass?(unsigned char)strlen((char *)pass):0; + buf[inbuf] = pass?(char)strlen((char *)pass):0; if(pass)memcpy(buf+inbuf+1, pass, buf[inbuf]); inbuf += buf[inbuf] + 1; if(socksend(param->remsock, buf, inbuf, conf.timeouts[CHAIN_TO]) != inbuf){ @@ -260,11 +260,11 @@ int handleredirect(struct clientparam * param, struct ace * acentry){ if(cur->extuser){ if(param->extusername) myfree(param->extusername); - param->extusername = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser)); + param->extusername = (char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser)); if(cur->extpass){ if(param->extpassword) myfree(param->extpassword); - param->extpassword = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass)); + param->extpassword = (char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass)); } if(*cur->extuser == '*' && !param->username) return 4; } @@ -312,11 +312,11 @@ int handleredirect(struct clientparam * param, struct ace * acentry){ if(*cur -> extuser == '*' && !param->username) return 4; if(param->extusername) myfree(param->extusername); - param->extusername = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser)); + param->extusername = (char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser)); if(cur->extpass){ if(param->extpassword) myfree(param->extpassword); - param->extpassword = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass)); + param->extpassword = (char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass)); } } return 0; @@ -330,14 +330,14 @@ int handleredirect(struct clientparam * param, struct ace * acentry){ int IPInentry(struct sockaddr *sa, struct iplist *ipentry){ int addrlen; - unsigned char *ip, *ipf, *ipt; + char *ip, *ipf, *ipt; if(!sa || ! ipentry || *SAFAMILY(sa) != ipentry->family) return 0; - ip = (unsigned char *)SAADDR(sa); - ipf = (unsigned char *)&ipentry->ip_from; - ipt = (unsigned char *)&ipentry->ip_to; + ip = (char *)SAADDR(sa); + ipf = (char *)&ipentry->ip_from; + ipt = (char *)&ipentry->ip_to; addrlen = SAADDRLEN(sa); @@ -352,12 +352,12 @@ int ACLmatches(struct ace* acentry, struct clientparam * param){ struct iplist *ipentry; struct portlist *portentry; struct period *periodentry; - unsigned char * username; + char * username; struct hostname * hstentry=NULL; int i; int match = 0; - username = param->username?param->username:(unsigned char *)"-"; + username = param->username?param->username:(char *)"-"; if(acentry->src) { for(ipentry = acentry->src; ipentry; ipentry = ipentry->next) if(IPInentry((struct sockaddr *)¶m->sincr, ipentry)) { @@ -770,7 +770,7 @@ int cacheauth(struct clientparam * param){ if(param->username){ myfree(param->username); } - param->username = (unsigned char *)mystrdup(ac->username); + param->username = (char *)mystrdup(ac->username); pthread_mutex_unlock(&hash_mutex); return 0; } @@ -873,7 +873,7 @@ int doauth(struct clientparam * param){ int ipauth(struct clientparam * param){ int res; - unsigned char *username; + char *username; if(param->preauthorized) return (0); username = param->username; @@ -898,7 +898,7 @@ int dnsauth(struct clientparam * param){ if(*SAFAMILY(¶m->sincr)!=AF_INET){ char *s = buf; for(i=15; i>=0; i--){ - unsigned char c=((unsigned char *)SAADDR(¶m->sincr))[i]; + char c=((char *)SAADDR(¶m->sincr))[i]; *s++ = dig[(c&0xf)]; *s++ = '.'; *s++ = dig[(c>>4)]; @@ -916,7 +916,7 @@ int dnsauth(struct clientparam * param){ ((u&0xFF000000)>>24)); } - if(!udpresolve(*SAFAMILY(¶m->sincr), (unsigned char *)buf, (unsigned char *)addr, NULL, param, 1)) { + if(!udpresolve(*SAFAMILY(¶m->sincr), (char *)buf, (char *)addr, NULL, param, 1)) { return 3; } if(memcmp(SAADDR(¶m->sincr), addr, SAADDRLEN(¶m->sincr))) { @@ -928,7 +928,7 @@ int dnsauth(struct clientparam * param){ int strongauth(struct clientparam * param){ struct passwords * pwl; - unsigned char buf[256]; + char buf[256]; if(!param->username) return 4; @@ -942,15 +942,6 @@ int strongauth(struct clientparam * param){ else if (!param->pwtype && param->password && !strcmp((char *)param->password, (char *)pwl->password)){ break; } -#ifndef NOCRYPT - else if (param->pwtype == 2 && param->password) { - ntpwdhash(buf, pwl->password, 0); - mschap(buf, param->password, buf + 16); - if(!memcmp(buf+16, param->password+8, 24)) { - break; - } - } -#endif pthread_mutex_unlock(&pwl_mutex); return 6; #ifndef NOCRYPT @@ -964,13 +955,6 @@ int strongauth(struct clientparam * param){ if(param->password && !param->pwtype && !memcmp(pwl->password, ntpwdhash(buf,param->password, 1), 32)) { break; } - else if (param->pwtype == 2){ - fromhex(pwl->password, buf, 16); - mschap(buf, param->password, buf + 16); - if(!memcmp(buf + 16, param->password+8, 24)) { - break; - } - } pthread_mutex_unlock(&pwl_mutex); return 8; #endif @@ -1011,7 +995,7 @@ struct hashtable dns_table = {0, 4, {0,0,0,0}, NULL, NULL, NULL}; struct hashtable dns6_table = {0, 16, {0,0,0,0}, NULL, NULL, NULL}; -void nametohash(const unsigned char * name, unsigned char *hash, unsigned char *rnd){ +void nametohash(const char * name, char *hash, char *rnd){ unsigned i, j, k; memcpy(hash, rnd, sizeof(unsigned)*4); for(i=0, j=0, k=0; name[j]; j++){ @@ -1023,7 +1007,7 @@ void nametohash(const unsigned char * name, unsigned char *hash, unsigned char * } } -unsigned hashindex(struct hashtable *ht, const unsigned char* hash){ +unsigned hashindex(struct hashtable *ht, const char* hash){ unsigned t1, t2, t3, t4; t1 = *(unsigned *)hash; t2 = *(unsigned *)(hash + sizeof(unsigned)); @@ -1102,7 +1086,7 @@ int inithashtable(struct hashtable *ht, unsigned nhashsize){ return 0; } -void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires){ +void hashadd(struct hashtable *ht, const char* name, char* value, time_t expires){ struct hashentry * hen, *he; struct hashentry ** hep; @@ -1115,7 +1099,7 @@ void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* val } hen = ht->hashempty; ht->hashempty = ht->hashempty->next; - nametohash(name, hen->hash, (unsigned char *)ht->rnd); + nametohash(name, hen->hash, (char *)ht->rnd); memcpy(hen->value, value, ht->recsize); hen->expires = expires; hen->next = NULL; @@ -1135,8 +1119,8 @@ void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* val pthread_mutex_unlock(&hash_mutex); } -unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsigned char* value, unsigned *ttl){ - unsigned char hash[sizeof(unsigned)*4]; +unsigned long hashresolv(struct hashtable *ht, const char* name, char* value, unsigned *ttl){ + char hash[sizeof(unsigned)*4]; struct hashentry ** hep; struct hashentry *he; unsigned index; @@ -1146,7 +1130,7 @@ unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsign pthread_mutex_unlock(&hash_mutex); return 0; } - nametohash(name, hash, (unsigned char *)ht->rnd); + nametohash(name, hash, (char *)ht->rnd); index = hashindex(ht, hash); for(hep = ht->hashtable + index; (he = *hep)!=NULL; ){ if(he->expires < conf.time) { @@ -1171,7 +1155,7 @@ struct nserver nservers[MAXNSERVERS] = {{{0},0}, {{0},0}, {{0},0}, {{0},0}, {{0} struct nserver authnserver; -unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth){ +unsigned long udpresolve(int af, char * name, char * value, unsigned *retttl, struct clientparam* param, int makeauth){ int i,n; unsigned long retval; @@ -1185,7 +1169,8 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers; for(i=0; isinsl : &addr; sinsr = (param && !makeauth)? ¶m->sinsr : &addr; @@ -1257,7 +1242,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un memcpy(buf + 13, name, len); len += 13; buf[len] = 0; - for(s2 = buf + 12; (s1 = (unsigned char *)strchr((char *)s2 + 1, '.')); s2 = s1)*s2 = (unsigned char)((s1 - s2) - 1); + for(s2 = buf + 12; (s1 = (char *)strchr((char *)s2 + 1, '.')); s2 = s1)*s2 = (char)((s1 - s2) - 1); *s2 = (len - (int)(s2 - buf)) - 1; len++; buf[len++] = 0; @@ -1343,7 +1328,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un } *s2 = 0; if(param->username)myfree(param->username); - param->username = (unsigned char *)mystrdup ((char *)buf + k + 13); + param->username = mystrdup ((char *)buf + k + 13); return udpresolve(af,param->username, value, NULL, NULL, 2); } @@ -1352,11 +1337,11 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un return 0; } -unsigned long myresolver(int af, unsigned char * name, unsigned char * value){ +unsigned long myresolver(int af, char * name, char * value){ return udpresolve(af, name, value, NULL, NULL, 0); } -unsigned long fakeresolver (int af, unsigned char *name, unsigned char * value){ +unsigned long fakeresolver (int af, char *name, char * value){ memset(value, 0, af == AF_INET6? 16 : 4); if(af == AF_INET6){ memset(value, 0, 16); diff --git a/src/authradius.c b/src/authradius.c index 345aa87..1419b87 100644 --- a/src/authradius.c +++ b/src/authradius.c @@ -168,22 +168,7 @@ char radiussecret[64]=""; pthread_mutex_t rad_mutex; -void md5_calc(unsigned char *output, unsigned char *input, - unsigned int inputlen); - - -char *strNcpy(char *dest, const char *src, int n) -{ - if (n > 0) - strncpy(dest, src, n); - else - n = 1; - dest[n - 1] = 0; - - return dest; -} - -void md5_calc(unsigned char *output, unsigned char *input, +static void md5_calc(unsigned char *output, unsigned char *input, unsigned int inlen) { MD5_CTX context; @@ -220,7 +205,7 @@ static int calc_replydigest(char *packet, char *original, const char *secret, in } #define AUTH_PASS_LEN (16) -int rad_pwencode(char *passwd, int *pwlen, const char *secret, const char *vector) +static int rad_pwencode(char *passwd, int *pwlen, const char *secret, const char *vector) { uint8_t buffer[AUTH_VECTOR_LEN + MAX_STRING_LEN + 1]; char digest[AUTH_VECTOR_LEN]; @@ -258,7 +243,7 @@ int rad_pwencode(char *passwd, int *pwlen, const char *secret, const char *vecto } -void random_vector(uint8_t *vector, struct clientparam *param) +static void random_vector(uint8_t *vector, struct clientparam *param) { int i; static int did_random = 0; @@ -300,7 +285,7 @@ typedef struct radius_packet_t { #define packet (*((radius_packet_t *)inbuf)) -int radbuf(struct clientparam * param, unsigned char * inbuf, int auth, int stop){ +static int radbuf(struct clientparam * param, unsigned char * inbuf, int auth, int stop){ int id; int res = 4; SOCKET sockfd = -1; @@ -518,7 +503,7 @@ int radbuf(struct clientparam * param, unsigned char * inbuf, int auth, int stop } -int radsend(const unsigned char *inbuf, int total_length, int auth, +static int radsend(const unsigned char *inbuf, int total_length, int auth, #ifdef NOIPV6 struct sockaddr_in* sinsl #else @@ -685,12 +670,12 @@ int radauth(struct clientparam * param){ } -int raddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){ - return radbuf(param, buf, 0, 1); +int raddobuf(struct clientparam * param, char * buf, const unsigned char *s){ + return radbuf(param, (unsigned char *)buf, 0, 1); } -void logradius(const unsigned char *buf, int len, struct LOGGER *logger){ - if(len)radsend(buf, len, 0, NULL); +void logradius(const char *buf, int len, struct LOGGER *logger){ + if(len)radsend((unsigned char *)buf, len, 0, NULL); } diff --git a/src/base64.c b/src/base64.c index e6d0295..000b29c 100644 --- a/src/base64.c +++ b/src/base64.c @@ -7,11 +7,11 @@ #include -static const unsigned char base64digits[] = +static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; #define BAD 255 -static const unsigned char base64val[] = { +static const char base64val[] = { BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63, @@ -23,7 +23,7 @@ static const unsigned char base64val[] = { }; #define DECODE64(c) ((c > 32 && c<127)? base64val[(int)c] : BAD) -unsigned char* en64 (const unsigned char *in, unsigned char *out, int inlen) +unsigned char* en64 (const char *in, char *out, int inlen) { for (; inlen > 0; inlen -= 3, in+=3) { @@ -79,9 +79,9 @@ int de64 (const char *in, char *out, int maxlen) return (len); } -unsigned char hex[] = "0123456789ABCDEF"; +char hex[] = "0123456789ABCDEF"; -void tohex(unsigned char *in, unsigned char *out, int len){ +void tohex(char *in, char *out, int len){ int i; for (i=0; i 0; len--) { c1 = strchr((char *)hex, *in++); c2 = strchr((char *)hex, *in++); if(c1 && c2){ - *out++ = ((unsigned char)((unsigned char *)c1 - hex) << 4) + (unsigned char)((unsigned char *)c2 - hex); + *out++ = (char)(unsigned char)(((c1 - hex) << 4) + (c2 - hex)); } } } diff --git a/src/common.c b/src/common.c index bf3658d..4309db1 100644 --- a/src/common.c +++ b/src/common.c @@ -31,7 +31,7 @@ int randomizer = 1; #endif -unsigned char **stringtable = NULL; +char **stringtable = NULL; #ifdef WITH_LINUX_FUTEX int sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) @@ -124,12 +124,12 @@ struct extparam conf = { NULL, /* BANDLIMFUNC bandlimfunc; */ NULL, /* TRAFCOUNTFUNC trafcountfunc; */ NULL, /* void (*prelog)(struct clientparam * param); */ - NULL, NULL, /* unsigned char *logtarget, *logformat; */ + NULL, NULL, /* char *logtarget, *logformat; */ NULL, /* struct filemon * fmon; */ NULL, /* struct filter * filters; */ NULL, /* struct auth *authfuncs; */ NULL, /* char* demanddialprog; */ - NULL, /* unsigned char **stringtable; */ + NULL, /* char **stringtable; */ (time_t)0, /* time_t time; */ 0,0, /* unsigned logdumpsrv, logdumpcli; */ '@', /* char delimchar; */ @@ -270,7 +270,7 @@ int ceparseargs(const char *str){ #endif -int parsehost(int family, unsigned char *host, struct sockaddr *sa){ +int parsehost(int family, char *host, struct sockaddr *sa){ char *sp=NULL,*se=NULL; unsigned short port=0; int ret = 0; @@ -306,7 +306,7 @@ int parsehostname(char *hostname, struct clientparam *param, unsigned short port } if(hostname != (char *)param->hostname){ if(param->hostname) myfree(param->hostname); - param->hostname = (unsigned char *)mystrdup(hostname + (se!=0)); + param->hostname = (char *)mystrdup(hostname + (se!=0)); } if(sp){ port = atoi(sp+1); @@ -329,11 +329,11 @@ int parseusername(char *username, struct clientparam *param, int extpasswd){ if(sp) *sp = 0; if(*(sb+1)) { if(param->password) myfree(param->password); - param->password = (unsigned char *)mystrdup(sb+1); + param->password = (char *)mystrdup(sb+1); } if(*username) { if(param->username) myfree(param->username); - param->username = (unsigned char *)mystrdup(username); + param->username = (char *)mystrdup(username); } username = se+1; } @@ -342,11 +342,11 @@ int parseusername(char *username, struct clientparam *param, int extpasswd){ if(sp){ *sp = 0; if(param->extpassword) myfree(param->extpassword); - param->extpassword = (unsigned char *) mystrdup(sp+1); + param->extpassword = (char *) mystrdup(sp+1); } } if(param->extusername) myfree(param->extusername); - param->extusername = (unsigned char *)mystrdup(username); + param->extusername = (char *)mystrdup(username); if(sb) *sb = ':'; if(se) *se = ':'; if(sp) *sp = ':'; @@ -429,7 +429,7 @@ int doconnect(struct clientparam * param){ #endif #ifdef SO_REUSEPORT opt = 1; - so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int)); + so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int)); #endif } #endif @@ -462,7 +462,7 @@ int doconnect(struct clientparam * param){ return 0; } -int scanaddr(const unsigned char *s, unsigned long * ip, unsigned long * mask) { +int scanaddr(const char *s, unsigned long * ip, unsigned long * mask) { unsigned d1, d2, d3, d4, m; int res; if ((res = sscanf((char *)s, "%u.%u.%u.%u/%u", &d1, &d2, &d3, &d4, &m)) < 4) return 0; @@ -495,7 +495,7 @@ struct hostent * my_gethostbyname(char *name, char *buf, struct hostent *hp){ #endif #ifdef NOIPV6 -unsigned long getip(unsigned char *name){ +unsigned long getip(char *name){ unsigned long retval; int i; int ndots = 0; @@ -522,8 +522,8 @@ unsigned long getip(unsigned char *name){ } } if((tmpresolv=resolvfunc)){ - if((*tmpresolv)(AF_INET, name, (unsigned char *)&retval)) return retval; - return (*tmpresolv)(AF_INET, name, (unsigned char *)&retval)?retval:0; + if((*tmpresolv)(AF_INET, name, (char *)&retval)) return retval; + return (*tmpresolv)(AF_INET, name, (char *)&retval)?retval:0; } #if !defined(_WIN32) && !defined(GETHOSTBYNAME_R) if(!ghbn_init){ @@ -548,7 +548,7 @@ unsigned long getip(unsigned char *name){ } #endif -int afdetect(unsigned char *name){ +int afdetect(char *name){ int ndots=0, ncols=0, nhex=0; int i; @@ -580,7 +580,7 @@ int afdetect(unsigned char *name){ } -unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){ +unsigned long getip46(int family, char *name, struct sockaddr *sa){ #ifndef NOIPV6 int detect; struct addrinfo *ai, hint; diff --git a/src/conf.c b/src/conf.c index 7a8c08d..ba30f90 100644 --- a/src/conf.c +++ b/src/conf.c @@ -131,7 +131,7 @@ int start_proxy_thread(struct child * chp){ return 0; } -static int h_proxy(int argc, unsigned char ** argv){ +static int h_proxy(int argc, char ** argv){ struct child ch; ch.argc = argc; @@ -216,12 +216,12 @@ static int h_proxy(int argc, unsigned char ** argv){ return start_proxy_thread(&ch); } -static int h_internal(int argc, unsigned char ** argv){ +static int h_internal(int argc, char ** argv){ getip46(46, argv[1], (struct sockaddr *)&conf.intsa); return 0; } -static int h_external(int argc, unsigned char ** argv){ +static int h_external(int argc, char ** argv){ int res; #ifndef NOIPV6 struct sockaddr_in6 sa6; @@ -237,49 +237,49 @@ static int h_external(int argc, unsigned char ** argv){ } -static int h_log(int argc, unsigned char ** argv){ +static int h_log(int argc, char ** argv){ myfree(conf.logtarget); - if(argc < 2) conf.logtarget = (unsigned char *)mystrdup(""); - else conf.logtarget = (unsigned char *)mystrdup((char *)argv[1]); + if(argc < 2) conf.logtarget = (char *)mystrdup(""); + else conf.logtarget = (char *)mystrdup((char *)argv[1]); if(argc > 2) { conf.logtype = getrotate(*argv[2]); } return 0; } -static int h_stacksize(int argc, unsigned char **argv){ +static int h_stacksize(int argc, char **argv){ conf.stacksize = atoi((char *)argv[1]); return 0; } -static int h_force(int argc, unsigned char **argv){ +static int h_force(int argc, char **argv){ conf.noforce = 0; return 0; } -static int h_noforce(int argc, unsigned char **argv){ +static int h_noforce(int argc, char **argv){ conf.noforce = 1; return 0; } -static int h_service(int argc, unsigned char **argv){ +static int h_service(int argc, char **argv){ return 0; } -static int h_daemon(int argc, unsigned char **argv){ +static int h_daemon(int argc, char **argv){ if(!conf.demon)daemonize(); conf.demon = 1; return 0; } -static int h_config(int argc, unsigned char **argv){ +static int h_config(int argc, char **argv){ if(conf.conffile)myfree(conf.conffile); conf.conffile = mystrdup((char *)argv[1]); return 0; } -static int h_include(int argc, unsigned char **argv){ +static int h_include(int argc, char **argv){ int res; FILE *fp1; @@ -293,18 +293,18 @@ static int h_include(int argc, unsigned char **argv){ return res; } -static int h_archiver(int argc, unsigned char **argv){ +static int h_archiver(int argc, char **argv){ int j; conf.archiver = myalloc(argc * sizeof(char *)); if(conf.archiver) { conf.archiverc = argc; - for(j = 0; j < conf.archiverc; j++) conf.archiver[j] = (unsigned char *)mystrdup((char *)argv[j]); + for(j = 0; j < conf.archiverc; j++) conf.archiver[j] = (char *)mystrdup((char *)argv[j]); } return 0; } -static int h_counter(int argc, unsigned char **argv){ +static int h_counter(int argc, char **argv){ struct counter_header ch1; if(conf.counterd >=0)close(conf.counterd); if(!conf.trafcountfunc) conf.trafcountfunc = trafcountfunc; @@ -344,19 +344,19 @@ static int h_counter(int argc, unsigned char **argv){ return 0; } -static int h_rotate(int argc, unsigned char **argv){ +static int h_rotate(int argc, char **argv){ conf.rotate = atoi((char *)argv[1]); return 0; } -static int h_logformat(int argc, unsigned char **argv){ - unsigned char * old = conf.logformat; - conf.logformat = (unsigned char *)mystrdup((char *)argv[1]); +static int h_logformat(int argc, char **argv){ + char * old = conf.logformat; + conf.logformat = (char *)mystrdup((char *)argv[1]); if(old) myfree(old); return 0; } -static int h_timeouts(int argc, unsigned char **argv){ +static int h_timeouts(int argc, char **argv){ int j; for(j = 0; conf.timeouts[j] && j + 1 < argc; j++) { @@ -368,11 +368,11 @@ static int h_timeouts(int argc, unsigned char **argv){ return 0; } -static int h_noop(int argc, unsigned char **argv){ +static int h_noop(int argc, char **argv){ return 0; } -static int h_auth(int argc, unsigned char **argv){ +static int h_auth(int argc, char **argv){ struct auth *au, * newau; freeauth(conf.authfuncs); @@ -397,9 +397,9 @@ static int h_auth(int argc, unsigned char **argv){ return 0; } -static int h_users(int argc, unsigned char **argv){ +static int h_users(int argc, char **argv){ int j; - unsigned char *arg; + char *arg; struct passwords *pwl = NULL; for (j = 1; juser = (unsigned char *)mystrdup((char *)argv[j]); + pwl->user = (char *)mystrdup((char *)argv[j]); pwl->pwtype = SYS; } else { *arg = 0; - pwl->user = (unsigned char *)mystrdup((char *)argv[j]); + pwl->user = (char *)mystrdup((char *)argv[j]); if((arg[1] == 'C' && arg[2] == 'L' && (pwl->pwtype = CL)) || (arg[1] == 'C' && arg[2] == 'R' && (pwl->pwtype = CR)) || (arg[1] == 'N' && arg[2] == 'T' && (pwl->pwtype = NT)) || (arg[1] == 'L' && arg[2] == 'M' && (pwl->pwtype = LM))){ - pwl->password = (unsigned char *)mystrdup((char *)arg+4); + pwl->password = (char *)mystrdup((char *)arg+4); } else { - pwl->password = (unsigned char *) mystrdup((char *)arg + 1); + pwl->password = (char *) mystrdup((char *)arg + 1); pwl->pwtype = UN; } } @@ -438,7 +438,7 @@ static int h_users(int argc, unsigned char **argv){ return 0; } -static int h_maxconn(int argc, unsigned char **argv){ +static int h_maxconn(int argc, char **argv){ conf.maxchild = atoi((char *)argv[1]); if(!conf.maxchild) { return(1); @@ -458,21 +458,21 @@ static int h_maxconn(int argc, unsigned char **argv){ return 0; } -static int h_flush(int argc, unsigned char **argv){ +static int h_flush(int argc, char **argv){ freeacl(conf.acl); conf.acl = NULL; return 0; } /* -static int h_flushusers(int argc, unsigned char **argv){ +static int h_flushusers(int argc, char **argv){ freepwl(conf.pwl); conf.pwl = NULL; return 0; } */ -static int h_nserver(int argc, unsigned char **argv){ +static int h_nserver(int argc, char **argv){ char *str; if(numservers < MAXNSERVERS) { @@ -491,7 +491,7 @@ static int h_nserver(int argc, unsigned char **argv){ return 0; } -static int h_authnserver(int argc, unsigned char **argv){ +static int h_authnserver(int argc, char **argv){ char *str; if((str = strchr((char *)argv[1], '/'))) @@ -505,12 +505,12 @@ static int h_authnserver(int argc, unsigned char **argv){ return 0; } -static int h_fakeresolve(int argc, unsigned char **argv){ +static int h_fakeresolve(int argc, char **argv){ resolvfunc = fakeresolver; return 0; } -static int h_nscache(int argc, unsigned char **argv){ +static int h_nscache(int argc, char **argv){ int res; res = atoi((char *)argv[1]); @@ -524,7 +524,7 @@ static int h_nscache(int argc, unsigned char **argv){ } return 0; } -static int h_nscache6(int argc, unsigned char **argv){ +static int h_nscache6(int argc, char **argv){ int res; res = atoi((char *)argv[1]); @@ -539,7 +539,7 @@ static int h_nscache6(int argc, unsigned char **argv){ return 0; } -static int h_nsrecord(int argc, unsigned char **argv){ +static int h_nsrecord(int argc, char **argv){ #ifndef NOIPV6 struct sockaddr_in6 sa; #else @@ -552,7 +552,7 @@ static int h_nsrecord(int argc, unsigned char **argv){ return 0; } -static int h_system(int argc, unsigned char **argv){ +static int h_system(int argc, char **argv){ int res; if((res = system((char *)argv[1])) == -1){ @@ -562,7 +562,7 @@ static int h_system(int argc, unsigned char **argv){ return 0; } -static int h_pidfile(int argc, unsigned char **argv){ +static int h_pidfile(int argc, char **argv){ FILE *pidf; if(!(pidf = fopen((char *)argv[1], "w"))){ @@ -574,7 +574,7 @@ static int h_pidfile(int argc, unsigned char **argv){ return 0; } -static int h_monitor(int argc, unsigned char **argv){ +static int h_monitor(int argc, char **argv){ struct filemon * fm; fm = myalloc(sizeof (struct filemon)); @@ -590,7 +590,7 @@ static int h_monitor(int argc, unsigned char **argv){ return 0; } -static int h_parent(int argc, unsigned char **argv){ +static int h_parent(int argc, char **argv){ struct ace *acl = NULL; struct chain *chains; @@ -637,10 +637,10 @@ static int h_parent(int argc, unsigned char **argv){ #else getip46(46, argv[3], (struct sockaddr *)&chains->addr); #endif - chains->exthost = (unsigned char *)mystrdup((char *)argv[3]); + chains->exthost = (char *)mystrdup((char *)argv[3]); *SAPORT(&chains->addr) = htons((unsigned short)atoi((char *)argv[4])); - if(argc > 5) chains->extuser = (unsigned char *)mystrdup((char *)argv[5]); - if(argc > 6) chains->extpass = (unsigned char *)mystrdup((char *)argv[6]); + if(argc > 5) chains->extuser = (char *)mystrdup((char *)argv[5]); + if(argc > 6) chains->extpass = (char *)mystrdup((char *)argv[6]); if(!acl->chains) { acl->chains = chains; } @@ -654,7 +654,7 @@ static int h_parent(int argc, unsigned char **argv){ } -static int h_nolog(int argc, unsigned char **argv){ +static int h_nolog(int argc, char **argv){ struct ace *acl = NULL; acl = conf.acl; @@ -668,7 +668,7 @@ static int h_nolog(int argc, unsigned char **argv){ return 0; } -int scanipl(unsigned char *arg, struct iplist *dst){ +int scanipl(char *arg, struct iplist *dst){ #ifndef NOIPV6 struct sockaddr_in6 sa; #else @@ -686,7 +686,7 @@ int scanipl(unsigned char *arg, struct iplist *dst){ dst->family = *SAFAMILY(&sa); if(dash){ if(afdetect(dash+1) == -1) return 1; - if(!getip46(46, (unsigned char *)dash+1, (struct sockaddr *)&sa)) return 2; + if(!getip46(46, (char *)dash+1, (struct sockaddr *)&sa)) return 2; memcpy(&dst->ip_to, SAADDR(&sa), SAADDRLEN(&sa)); if(*SAFAMILY(&sa) != dst->family || memcmp(&dst->ip_to, &dst->ip_from, SAADDRLEN(&sa)) < 0) return 3; return 0; @@ -700,12 +700,12 @@ int scanipl(unsigned char *arg, struct iplist *dst){ int i, nbytes = masklen / 8, nbits = (8 - (masklen % 8)) % 8; for(i = addrlen; i>(nbytes + (nbits > 0)); i--){ - ((unsigned char *)&dst->ip_from)[i-1] = 0x00; - ((unsigned char *)&dst->ip_to)[i-1] = 0xff; + ((char *)&dst->ip_from)[i-1] = 0x00; + ((char *)&dst->ip_to)[i-1] = 0xff; } for(;nbits;nbits--){ - ((unsigned char *)&dst->ip_from)[nbytes] &= ~(0x01<<(nbits-1)); - ((unsigned char *)&dst->ip_to)[nbytes] |= (0x01<<(nbits-1)); + ((char *)&dst->ip_from)[nbytes] &= ~(0x01<<(nbits-1)); + ((char *)&dst->ip_to)[nbytes] |= (0x01<<(nbits-1)); } return 0; } @@ -713,9 +713,9 @@ int scanipl(unsigned char *arg, struct iplist *dst){ return 0; } -struct ace * make_ace (int argc, unsigned char ** argv){ +struct ace * make_ace (int argc, char ** argv){ struct ace * acl; - unsigned char *arg; + char *arg; struct iplist *ipl=NULL; struct portlist *portl=NULL; struct userlist *userl=NULL; @@ -727,7 +727,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){ memset(acl, 0, sizeof(struct ace)); if(argc > 0 && strcmp("*", (char *)argv[0])) { arg = argv[0]; - arg = (unsigned char *)strtok((char *)arg, ","); + arg = (char *)strtok((char *)arg, ","); do { if(!acl->users) { acl->users = userl = myalloc(sizeof(struct userlist)); @@ -741,11 +741,11 @@ struct ace * make_ace (int argc, unsigned char ** argv){ return(NULL); } memset(userl, 0, sizeof(struct userlist)); - userl->user=(unsigned char*)mystrdup((char *)arg); - } while((arg = (unsigned char *)strtok((char *)NULL, ","))); + userl->user=(char*)mystrdup((char *)arg); + } while((arg = (char *)strtok((char *)NULL, ","))); } if(argc > 1 && strcmp("*", (char *)argv[1])) { - arg = (unsigned char *)strtok((char *)argv[1], ","); + arg = (char *)strtok((char *)argv[1], ","); do { if(!acl->src) { acl->src = ipl = myalloc(sizeof(struct iplist)); @@ -763,13 +763,13 @@ struct ace * make_ace (int argc, unsigned char ** argv){ fprintf(stderr, "Invalid IP, IP range or CIDR, line %d\n", linenum); return(NULL); } - } while((arg = (unsigned char *)strtok((char *)NULL, ","))); + } while((arg = (char *)strtok((char *)NULL, ","))); } if(argc > 2 && strcmp("*", (char *)argv[2])) { - arg = (unsigned char *)strtok((char *)argv[2], ","); + arg = (char *)strtok((char *)argv[2], ","); do { int arglen; - unsigned char *pattern; + char *pattern; struct iplist tmpip={NULL}; arglen = (int)strlen((char *)arg); @@ -799,7 +799,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){ arglen--; hostnamel->matchtype ^= MATCHBEGIN; } - hostnamel->name = (unsigned char *) mystrdup( (char *)pattern); + hostnamel->name = (char *) mystrdup( (char *)pattern); if(!hostnamel->name) { fprintf(stderr, "No memory for ACL entry, line %d\n", linenum); return(NULL); @@ -820,10 +820,10 @@ struct ace * make_ace (int argc, unsigned char ** argv){ } *ipl = tmpip; } - }while((arg = (unsigned char *)strtok((char *)NULL, ","))); + }while((arg = (char *)strtok((char *)NULL, ","))); } if(argc > 3 && strcmp("*", (char *)argv[3])) { - arg = (unsigned char *)strtok((char *)argv[3], ","); + arg = (char *)strtok((char *)argv[3], ","); do { if(!acl->ports) { acl->ports = portl = myalloc(sizeof(struct portlist)); @@ -843,10 +843,10 @@ struct ace * make_ace (int argc, unsigned char ** argv){ return(NULL); } if (res == 1) portl->endport = portl->startport; - } while((arg = (unsigned char *)strtok((char *)NULL, ","))); + } while((arg = (char *)strtok((char *)NULL, ","))); } if(argc > 4 && strcmp("*", (char *)argv[4])) { - arg = (unsigned char *)strtok((char *)argv[4], ","); + arg = (char *)strtok((char *)argv[4], ","); do { if(!strcmp((char *)arg, "CONNECT")){ acl->operation |= CONNECT; @@ -909,7 +909,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){ fprintf(stderr, "Unknown operation type: %s line %d\n", arg, linenum); return(NULL); } - } while((arg = (unsigned char *)strtok((char *)NULL, ","))); + } while((arg = (char *)strtok((char *)NULL, ","))); } if(argc > 5){ for(arg = argv[5]; *arg;){ @@ -973,7 +973,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){ } -static int h_ace(int argc, unsigned char **argv){ +static int h_ace(int argc, char **argv){ int res = 0; int offset = 0; struct ace *acl = NULL; @@ -1187,26 +1187,26 @@ static int h_ace(int argc, unsigned char **argv){ return 0; } -static int h_logdump(int argc, unsigned char **argv){ +static int h_logdump(int argc, char **argv){ conf.logdumpsrv = (unsigned) atoi((char *) *(argv + 1)); if(argc > 2) conf.logdumpcli = (unsigned) atoi((char *) *(argv + 2)); return 0; } -static int h_filtermaxsize(int argc, unsigned char **argv){ +static int h_filtermaxsize(int argc, char **argv){ conf.filtermaxsize = atoi((char *) *(argv + 1)); return 0; } -static int h_delimchar(int argc, unsigned char **argv){ +static int h_delimchar(int argc, char **argv){ conf.delimchar = *argv[1]; return 0; } #ifndef NORADIUS -static int h_radius(int argc, unsigned char **argv){ +static int h_radius(int argc, char **argv){ unsigned short port; /* @@ -1248,7 +1248,7 @@ static int h_radius(int argc, unsigned char **argv){ return 0; } #endif -static int h_authcache(int argc, unsigned char **argv){ +static int h_authcache(int argc, char **argv){ conf.authcachetype = 0; if(strstr((char *) *(argv + 1), "ip")) conf.authcachetype |= 1; if(strstr((char *) *(argv + 1), "user")) conf.authcachetype |= 2; @@ -1262,7 +1262,7 @@ static int h_authcache(int argc, unsigned char **argv){ return 0; } -static int h_plugin(int argc, unsigned char **argv){ +static int h_plugin(int argc, char **argv){ #ifdef NOPLUGINS return 999; #else @@ -1302,7 +1302,7 @@ static int h_plugin(int argc, unsigned char **argv){ #ifndef _WIN32 -uid_t strtouid(unsigned char *str){ +uid_t strtouid(char *str){ uid_t res = 0; if(!isnumber(*(char *)str)){ @@ -1315,7 +1315,7 @@ uid_t strtouid(unsigned char *str){ } -static int h_setuid(int argc, unsigned char **argv){ +static int h_setuid(int argc, char **argv){ uid_t res = 0; res = strtouid(argv[1]); if(!res || setreuid(res,res)) { @@ -1325,7 +1325,7 @@ static int h_setuid(int argc, unsigned char **argv){ return 0; } -gid_t strtogid(unsigned char *str){ +gid_t strtogid(char *str){ gid_t res = 0; if(!isnumber(*(char *)str)){ @@ -1337,7 +1337,7 @@ gid_t strtogid(unsigned char *str){ return res; } -static int h_setgid(int argc, unsigned char **argv){ +static int h_setgid(int argc, char **argv){ gid_t res = 0; res = strtogid(argv[1]); @@ -1349,7 +1349,7 @@ static int h_setgid(int argc, unsigned char **argv){ } -static int h_chroot(int argc, unsigned char **argv){ +static int h_chroot(int argc, char **argv){ uid_t uid = 0; gid_t gid = 0; if(argc > 2) { @@ -1468,15 +1468,15 @@ struct commands commandhandlers[]={ {specificcommands, "", h_noop, 1, 0} }; -int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned char ** buff, int *inbuf, int *bufsize){ +int parsestr (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize){ #define buf (*buff) int argc = 0; int space = 1; int comment = 0; - unsigned char * incbegin = 0; + char * incbegin = 0; int fd; int res, len; - unsigned char *str1; + char *str1; for(;;str++){ if(*str == '\"'){ @@ -1566,15 +1566,15 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha int readconfig(FILE * fp){ - unsigned char ** argv = NULL; - unsigned char * buf = NULL; + char ** argv = NULL; + char * buf = NULL; int bufsize = STRINGBUF*2; int inbuf = 0; int argc; struct commands * cm; int res = 0; - if( !(buf = myalloc(bufsize)) || ! (argv = myalloc((NPARAMS + 1) * sizeof(unsigned char *))) ) { + if( !(buf = myalloc(bufsize)) || ! (argv = myalloc((NPARAMS + 1) * sizeof(char *))) ) { fprintf(stderr, "No memory for configuration"); return(10); } @@ -1642,9 +1642,9 @@ void freeconf(struct extparam *confp){ struct ace *acl; struct filemon *fm; int counterd, archiverc; - unsigned char *logtarget; - unsigned char **archiver; - unsigned char * logformat; + char *logtarget; + char **archiver; + char * logformat; int i; @@ -1711,7 +1711,7 @@ void freeconf(struct extparam *confp){ { char * args[] = {"auth", "iponly", NULL}; - h_auth(2, (unsigned char **)args); + h_auth(2, (char **)args); } if(tc)dumpcounters(tc,counterd); for(; tc; tc = (struct trafcount *) itfree(tc, tc->next)){ diff --git a/src/dnspr.c b/src/dnspr.c index bdf2e61..916d7a7 100644 --- a/src/dnspr.c +++ b/src/dnspr.c @@ -153,12 +153,12 @@ void * dnsprchild(struct clientparam* param) { #endif } - if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){ + if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, (char *)buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){ RETURN(820); } param->statscli64 += i; param->nwrites++; - len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, buf, BUFSIZE, conf.timeouts[DNS_TO]*1000); + len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, (char *)buf, BUFSIZE, conf.timeouts[DNS_TO]*1000); if(len <= 13) { RETURN(821); } @@ -174,7 +174,7 @@ void * dnsprchild(struct clientparam* param) { if(len != us) RETURN(832); } if(buf[6] || buf[7]){ - if(socksendto(param->clisock, (struct sockaddr *)¶m->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){ + if(socksendto(param->clisock, (struct sockaddr *)¶m->sincr, (char *)buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){ RETURN(822); } RETURN(0); @@ -185,7 +185,7 @@ void * dnsprchild(struct clientparam* param) { buf[2] = 0x85; buf[3] = 0x83; } - res = socksendto(param->clisock, (struct sockaddr *)¶m->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000); + res = socksendto(param->clisock, (struct sockaddr *)¶m->sincr, (char *)buf, len, conf.timeouts[SINGLEBYTE_L]*1000); if(res != len){RETURN(819);} if(!ip) {RETURN(888);} diff --git a/src/ftp.c b/src/ftp.c index 6f6931c..b964c7d 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -20,7 +20,7 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) { if(innbuf)*innbuf = 0; if(len < 140) return 707; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ + while((i = sockgetlinebuf(param, SERVER, (char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ } if(i < 3) return 706; buf[i] = 0; @@ -28,13 +28,13 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) { *innbuf = i; return 702; } - sprintf(buf, "USER %.128s\r\n", param->extusername?param->extusername:(unsigned char *)"anonymous"); - if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ + sprintf(buf, "USER %.128s\r\n", param->extusername?param->extusername:(char *)"anonymous"); + if((int)socksend(param->remsock, (char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ return 703; } param->statscli64 += (int)strlen(buf); param->nwrites++; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ + while((i = sockgetlinebuf(param, SERVER, (char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ } if(i < 3) return 704; buf[i] = 0; @@ -43,15 +43,15 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) { sprintf(buf, "PASS %.128s\r\n", param->extusername? (param->extpassword? - param->extpassword:(unsigned char *)"") - :(unsigned char *)"3proxy@"); + param->extpassword:(char *)"") + :(char *)"3proxy@"); res = (int)strlen(buf); - if((int)socksend(param->remsock, (unsigned char *)buf, res, conf.timeouts[STRING_S]) != (int)strlen(buf)){ + if((int)socksend(param->remsock, (char *)buf, res, conf.timeouts[STRING_S]) != (int)strlen(buf)){ return 705; } param->statscli64 += res; param->nwrites++; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0){ + while((i = sockgetlinebuf(param, SERVER, (char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0){ buf[i] = 0; res = (i>3 && buf[3] != '-')? atoi(buf)/100 : 0; if(res || (nbuf && (len-i) > 256 && i > 3)) { @@ -71,18 +71,18 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) { return 0; } -int ftpcd(struct clientparam *param, unsigned char* path, char *nbuf, int *innbuf){ +int ftpcd(struct clientparam *param, char* path, char *nbuf, int *innbuf){ char buf[1024]; int i; int inbuf = 0; sprintf(buf, "CWD %.512s\r\n", path); - if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ + if((int)socksend(param->remsock, (char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ return 711; } param->statscli64 += (int)strlen(buf); param->nwrites++; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ + while((i = sockgetlinebuf(param, SERVER, (char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ if(nbuf && innbuf && inbuf + i < *innbuf && i > 6) { memcpy(nbuf + inbuf, buf, i); inbuf += i; @@ -95,7 +95,7 @@ int ftpcd(struct clientparam *param, unsigned char* path, char *nbuf, int *innbu return 0; } -int ftpres(struct clientparam *param, unsigned char * buf, int l){ +int ftpres(struct clientparam *param, char * buf, int l){ int i; if (l < 16) return 755; @@ -107,10 +107,10 @@ int ftpres(struct clientparam *param, unsigned char * buf, int l){ return 0; } -int ftpsyst(struct clientparam *param, unsigned char *buf, unsigned len){ +int ftpsyst(struct clientparam *param, char *buf, unsigned len){ int i; - if(socksend(param->remsock, (unsigned char *)"SYST\r\n", 6, conf.timeouts[STRING_S]) != 6){ + if(socksend(param->remsock, (char *)"SYST\r\n", 6, conf.timeouts[STRING_S]) != 6){ return 721; } param->statscli64 += 6; @@ -125,11 +125,11 @@ int ftpsyst(struct clientparam *param, unsigned char *buf, unsigned len){ return 0; } -int ftppwd(struct clientparam *param, unsigned char *buf, unsigned len){ +int ftppwd(struct clientparam *param, char *buf, unsigned len){ int i; char *b, *e; - if(socksend(param->remsock, (unsigned char *)"PWD\r\n", 5, conf.timeouts[STRING_S]) != 5){ + if(socksend(param->remsock, (char *)"PWD\r\n", 5, conf.timeouts[STRING_S]) != 5){ return 731; } param->statscli64 += 5; @@ -149,17 +149,17 @@ int ftppwd(struct clientparam *param, unsigned char *buf, unsigned len){ return 0; } -int ftptype(struct clientparam *param, unsigned char* f_type){ +int ftptype(struct clientparam *param, char* f_type){ char buf[1024]; int i; sprintf(buf, "TYPE %.512s\r\n", f_type); - if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ + if((int)socksend(param->remsock, (char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ return 741; } param->statscli64 += (int)strlen(buf); param->nwrites++; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ + while((i = sockgetlinebuf(param, SERVER, (char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ } if(i < 3) return 742; if(buf[0] != '2') return 740; @@ -176,12 +176,12 @@ SOCKET ftpdata(struct clientparam *param){ unsigned short b5, b6; SASIZETYPE sasize; - if(socksend(param->remsock, (unsigned char *)"PASV\r\n", 6, conf.timeouts[STRING_S]) != 6){ + if(socksend(param->remsock, (char *)"PASV\r\n", 6, conf.timeouts[STRING_S]) != 6){ return INVALID_SOCKET; } param->statscli64 += 6; param->nwrites++; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ + while((i = sockgetlinebuf(param, SERVER, (char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ } if(i < 7) return INVALID_SOCKET; if(buf[0] != '2') return INVALID_SOCKET; @@ -216,7 +216,7 @@ SOCKET ftpdata(struct clientparam *param){ return s; } -SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned char *arg) { +SOCKET ftpcommand(struct clientparam *param, char * command, char *arg) { char buf[1024]; int i; SOCKET s; @@ -225,15 +225,15 @@ SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned c s = ftpdata(param); if(s==INVALID_SOCKET) return INVALID_SOCKET; sprintf(buf, "%.15s%s%.512s\r\n", command, arg? - (unsigned char *)" ":(unsigned char *)"", - arg?arg:(unsigned char *)""); - if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ + " ":"", + arg?arg:""); + if((int)socksend(param->remsock, buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){ so._closesocket(s); return INVALID_SOCKET; } param->statscli64 += (int)strlen(buf); param->nwrites++; - while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ + while((i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){ } if(i < 3) { so._closesocket(s); diff --git a/src/ftppr.c b/src/ftppr.c index d2f4ab4..0b92e43 100644 --- a/src/ftppr.c +++ b/src/ftppr.c @@ -13,8 +13,8 @@ void * ftpprchild(struct clientparam* param) { int i=0, res; - unsigned char *buf; - unsigned char *se; + char *buf; + char *se; int status = 0; int inbuf; int pasv = 0; @@ -29,7 +29,7 @@ void * ftpprchild(struct clientparam* param) { param->operation = CONNECT; lg.l_onoff = 1; lg.l_linger = conf.timeouts[STRING_L];; - if(socksend(param->ctrlsock, (unsigned char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);} + if(socksend(param->ctrlsock, (char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);} for(;;){ i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 10, '\n', conf.timeouts[CONNECTION_S]); if(!i) { @@ -37,7 +37,7 @@ void * ftpprchild(struct clientparam* param) { } if(i<4) {RETURN(802);} buf[i] = 0; - if ((se=(unsigned char *)strchr((char *)buf, '\r'))) *se = 0; + if ((se=(char *)strchr((char *)buf, '\r'))) *se = 0; if (req) myfree (req); req = NULL; @@ -50,7 +50,7 @@ void * ftpprchild(struct clientparam* param) { } if((res = (*param->srv->authfunc)(param))) {RETURN(res);} param->ctrlsocksrv = param->remsock; - if(socksend(param->ctrlsock, (unsigned char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);} + if(socksend(param->ctrlsock, (char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);} status = 1; } else if (!strncasecmp((char *)buf, "USER ", 5)){ @@ -59,12 +59,12 @@ void * ftpprchild(struct clientparam* param) { if((res = (*param->srv->authfunc)(param))) {RETURN(res);} param->ctrlsocksrv = param->remsock; } - if(socksend(param->ctrlsock, (unsigned char *)"331 ok\r\n", 8, conf.timeouts[STRING_S])!=8) {RETURN (807);} + if(socksend(param->ctrlsock, (char *)"331 ok\r\n", 8, conf.timeouts[STRING_S])!=8) {RETURN (807);} status = 2; } else if (!strncasecmp((char *)buf, "PASS ", 5)){ - param->extpassword = (unsigned char *)mystrdup((char *)buf+5); + param->extpassword = (char *)mystrdup((char *)buf+5); inbuf = BUFSIZE; res = ftplogin(param, (char *)buf, &inbuf); param->res = res; @@ -129,16 +129,16 @@ void * ftpprchild(struct clientparam* param) { if(pasv == 1){ if(*SAFAMILY(¶m->sincl) == AF_INET) sprintf((char *)buf, "227 OK (%u,%u,%u,%u,%u,%u)\r\n", - (unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[0]), - (unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[1]), - (unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[2]), - (unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[3]), - (unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[0]), - (unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[1]) + (unsigned)(((char *)(SAADDR(¶m->sincl)))[0]), + (unsigned)(((char *)(SAADDR(¶m->sincl)))[1]), + (unsigned)(((char *)(SAADDR(¶m->sincl)))[2]), + (unsigned)(((char *)(SAADDR(¶m->sincl)))[3]), + (unsigned)(((char *)(SAPORT(¶m->sincl)))[0]), + (unsigned)(((char *)(SAPORT(¶m->sincl)))[1]) ); else sprintf((char *)buf, "227 OK (127,0,0,1,%u,%u)\r\n", - (unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[0]), - (unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[1]) + (unsigned)(((char *)(SAPORT(¶m->sincl)))[0]), + (unsigned)(((char *)(SAPORT(¶m->sincl)))[1]) ); } else { @@ -230,11 +230,11 @@ void * ftpprchild(struct clientparam* param) { so._closesocket(clidatasock); clidatasock = INVALID_SOCKET; - if(socksend(param->ctrlsock, (unsigned char *)"550 err\r\n", 9, conf.timeouts[STRING_S])!=9) {RETURN (831);} + if(socksend(param->ctrlsock, (char *)"550 err\r\n", 9, conf.timeouts[STRING_S])!=9) {RETURN (831);} continue; } - if(socksend(param->ctrlsock, (unsigned char *)"125 data\r\n", 10, conf.timeouts[STRING_S]) != 10) { + if(socksend(param->ctrlsock, (char *)"125 data\r\n", 10, conf.timeouts[STRING_S]) != 10) { param->remsock = INVALID_SOCKET; RETURN (832); } @@ -274,7 +274,7 @@ void * ftpprchild(struct clientparam* param) { } else { if(status < 3) { - if(socksend(param->remsock, (unsigned char *)"530 login\r\n", 11, conf.timeouts[STRING_S])!=1) {RETURN (810);} + if(socksend(param->remsock, (char *)"530 login\r\n", 11, conf.timeouts[STRING_S])!=1) {RETURN (810);} continue; } if(!strncasecmp((char *)buf, "QUIT", 4)) status = 5; @@ -295,7 +295,7 @@ void * ftpprchild(struct clientparam* param) { sasize = sizeof(param->sincr); if(so._getpeername(param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize)){RETURN(819);} if(req && (param->statscli64 || param->statssrv64)){ - dolog(param, (unsigned char *)req); + dolog(param, (char *)req); } } @@ -316,7 +316,7 @@ CLEANRET: sasize = sizeof(param->sincr); so._getpeername(param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize); if(param->res != 0 || param->statscli64 || param->statssrv64 ){ - dolog(param, (unsigned char *)((req && (param->res > 802))? req:NULL)); + dolog(param, (req && (param->res > 802))? req:NULL); } if(req) myfree(req); if(buf) myfree(buf); diff --git a/src/libs/regex.c b/src/libs/regex.c deleted file mode 100644 index 82ae70a..0000000 --- a/src/libs/regex.c +++ /dev/null @@ -1,3821 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "regex.h" - -/* utility definitions */ -#ifdef _POSIX2_RE_DUP_MAX -#define DUPMAX _POSIX2_RE_DUP_MAX -#else -#define DUPMAX 255 -#endif -#define INFINITY (DUPMAX + 1) -#define NC (CHAR_MAX - CHAR_MIN + 1) -typedef unsigned char uch; - -/* for old systems with bcopy() but no memmove() */ -#ifdef USEBCOPY -#define memmove(d, s, c) bcopy(s, d, c) -#endif - -#define MAGIC1 ((('r'^0200)<<8) | 'e') - -/* - * The internal representation is a *strip*, a sequence of - * operators ending with an endmarker. (Some terminology etc. is a - * historical relic of earlier versions which used multiple strips.) - * Certain oddities in the representation are there to permit running - * the machinery backwards; in particular, any deviation from sequential - * flow must be marked at both its source and its destination. Some - * fine points: - * - * - OPLUS_ and O_PLUS are *inside* the loop they create. - * - OQUEST_ and O_QUEST are *outside* the bypass they create. - * - OCH_ and O_CH are *outside* the multi-way branch they create, while - * OOR1 and OOR2 are respectively the end and the beginning of one of - * the branches. Note that there is an implicit OOR2 following OCH_ - * and an implicit OOR1 preceding O_CH. - * - * In state representations, an operator's bit is on to signify a state - * immediately *preceding* "execution" of that operator. - */ -typedef long sop; /* strip operator */ -typedef long sopno; -#define OPRMASK 0x7c000000 -#define OPDMASK 0x03ffffff -#define OPSHIFT (26) -#define OP(n) ((n)&OPRMASK) -#define OPND(n) ((n)&OPDMASK) -#define SOP(op, opnd) ((op)|(opnd)) -/* operators meaning operand */ -/* (back, fwd are offsets) */ -#define OEND (1< uch [csetsize] */ - uch mask; /* bit within array */ - uch hash; /* hash code */ - size_t smultis; - char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ -} cset; -/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ -#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c)) -#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c)) -#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) -#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ - -/* stuff for character categories */ -typedef unsigned char cat_t; - -/* - * main compiled-expression structure - */ -struct re_guts { - int magic; -# define MAGIC2 ((('R'^0200)<<8)|'E') - sop *strip; /* malloced area for strip */ - int csetsize; /* number of bits in a cset vector */ - int ncsets; /* number of csets in use */ - cset *sets; /* -> cset [ncsets] */ - uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ - int cflags; /* copy of regcomp() cflags argument */ - sopno nstates; /* = number of sops */ - sopno firststate; /* the initial OEND (normally 0) */ - sopno laststate; /* the final OEND */ - int iflags; /* internal flags */ -# define USEBOL 01 /* used ^ */ -# define USEEOL 02 /* used $ */ -# define BAD 04 /* something wrong */ - int nbol; /* number of ^ used */ - int neol; /* number of $ used */ - int ncategories; /* how many character categories */ - cat_t *categories; /* ->catspace[-CHAR_MIN] */ - char *must; /* match must contain this string */ - int mlen; /* length of must */ - size_t nsub; /* copy of re_nsub */ - int backrefs; /* does it use back references? */ - sopno nplus; /* how deep does it nest +s? */ - /* catspace must be last */ - cat_t catspace[1]; /* actually [NC] */ -}; - -/* misc utilities */ -#define OUT (CHAR_MAX+1) /* a non-character value */ -#define ISWORD(c) (isalnum(c) || (c) == '_') - - -/* character-class table */ -static struct cclass { - char *name; - char *chars; - char *multis; -} cclasses[] = { - {"alnum","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",""}, - {"alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", ""}, - {"blank"," \t", ""}, - {"cntrl","\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\177",""}, - {"digit","0123456789",""}, - {"graph","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",""}, - {"lower","abcdefghijklmnopqrstuvwxyz",""}, - {"print","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",""}, - {"punct","!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",""}, - {"space","\t\n\v\f\r ", ""}, - {"upper","ABCDEFGHIJKLMNOPQRSTUVWXYZ",""}, - {"xdigit","0123456789ABCDEFabcdef",""}, - {NULL,NULL,""} -}; - -/* character-name table */ -static struct cname { - char *name; - char code; -} cnames[] = { - {"NUL", '\0'}, - {"SOH", '\001'}, - {"STX", '\002'}, - {"ETX", '\003'}, - {"EOT", '\004'}, - {"ENQ", '\005'}, - {"ACK", '\006'}, - {"BEL", '\007'}, - {"alert", '\007'}, - {"BS", '\010'}, - {"backspace", '\b'}, - {"HT", '\011'}, - {"tab", '\t'}, - {"LF", '\012'}, - {"newline", '\n'}, - {"VT", '\013'}, - {"vertical-tab", '\v'}, - {"FF", '\014'}, - {"form-feed", '\f'}, - {"CR", '\015'}, - {"carriage-return", '\r'}, - {"SO", '\016'}, - {"SI", '\017'}, - {"DLE", '\020'}, - {"DC1", '\021'}, - {"DC2", '\022'}, - {"DC3", '\023'}, - {"DC4", '\024'}, - {"NAK", '\025'}, - {"SYN", '\026'}, - {"ETB", '\027'}, - {"CAN", '\030'}, - {"EM", '\031'}, - {"SUB", '\032'}, - {"ESC", '\033'}, - {"IS4", '\034'}, - {"FS", '\034'}, - {"IS3", '\035'}, - {"GS", '\035'}, - {"IS2", '\036'}, - {"RS", '\036'}, - {"IS1", '\037'}, - {"US", '\037'}, - {"space", ' '}, - {"exclamation-mark", '!'}, - {"quotation-mark", '"'}, - {"number-sign", '#'}, - {"dollar-sign", '$'}, - {"percent-sign", '%'}, - {"ampersand", '&'}, - {"apostrophe", '\''}, - {"left-parenthesis", '('}, - {"right-parenthesis", ')'}, - {"asterisk", '*'}, - {"plus-sign", '+'}, - {"comma", ','}, - {"hyphen", '-'}, - {"hyphen-minus", '-'}, - {"period", '.'}, - {"full-stop", '.'}, - {"slash", '/'}, - {"solidus", '/'}, - {"zero", '0'}, - {"one", '1'}, - {"two", '2'}, - {"three", '3'}, - {"four", '4'}, - {"five", '5'}, - {"six", '6'}, - {"seven", '7'}, - {"eight", '8'}, - {"nine", '9'}, - {"colon", ':'}, - {"semicolon", ';'}, - {"less-than-sign", '<'}, - {"equals-sign", '='}, - {"greater-than-sign", '>'}, - {"question-mark", '?'}, - {"commercial-at", '@'}, - {"left-square-bracket", '['}, - {"backslash", '\\'}, - {"reverse-solidus", '\\'}, - {"right-square-bracket", ']'}, - {"circumflex", '^'}, - {"circumflex-accent", '^'}, - {"underscore", '_'}, - {"low-line", '_'}, - {"grave-accent", '`'}, - {"left-brace", '{'}, - {"left-curly-bracket", '{'}, - {"vertical-line", '|'}, - {"right-brace", '}'}, - {"right-curly-bracket", '}'}, - {"tilde", '~'}, - {"DEL", '\177'}, - {NULL, 0} -}; - - -/* - * parse structure, passed up and down to avoid global variables and - * other clumsinesses - */ -struct parse { - char *next; /* next character in RE */ - char *end; /* end of string (-> NUL normally) */ - int error; /* has an error been seen? */ - sop *strip; /* malloced strip */ - sopno ssize; /* malloced strip size (allocated) */ - sopno slen; /* malloced strip length (used) */ - int ncsalloc; /* number of csets allocated */ - struct re_guts *g; -# define NPAREN 10 /* we need to remember () 1-9 for back refs */ - sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ - sopno pend[NPAREN]; /* -> ) ([0] unused) */ -}; - -#ifdef __cplusplus -extern "C" { -#endif - -static void p_ere(register struct parse *p, int stop); -static void p_ere_exp(register struct parse *p); -static void p_str(register struct parse *p); -static void p_bre(register struct parse *p, register int end1, register int end2); -static int p_simp_re(register struct parse *p, int starordinary); -static int p_count(register struct parse *p); -static void p_bracket(register struct parse *p); -static void p_b_term(register struct parse *p, register cset *cs); -static void p_b_cclass(register struct parse *p, register cset *cs); -static void p_b_eclass(register struct parse *p, register cset *cs); -static char p_b_symbol(register struct parse *p); -static char p_b_coll_elem(register struct parse *p, int endc); -static char othercase(int ch); -static void bothcases(register struct parse *p, int ch); -static void ordinary(register struct parse *p, register int ch); -static void nonnewline(register struct parse *p); -static void repeat(register struct parse *p, sopno start, int from, int to); -static int seterr(register struct parse *p, int e); -static cset *allocset(register struct parse *p); -static void freeset(register struct parse *p, register cset *cs); -static int freezeset(register struct parse *p, register cset *cs); -static int firstch(register struct parse *p, register cset *cs); -static int nch(register struct parse *p, register cset *cs); -static void mcadd(register struct parse *p, register cset *cs, register char *cp); -static void mcinvert(register struct parse *p, register cset *cs); -static void mccase(register struct parse *p, register cset *cs); -static int isinsets(register struct re_guts *g, int c); -static int samesets(register struct re_guts *g, int c1, int c2); -static void categorize(struct parse *p, register struct re_guts *g); -static sopno dupl(register struct parse *p, sopno start, sopno finish); -static void doemit(register struct parse *p, sop op, size_t opnd); -static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); -static void dofwd(register struct parse *p, sopno pos, sop value); -static void enlarge(register struct parse *p, sopno size); -static void stripsnug(register struct parse *p, register struct re_guts *g); -static void findmust(register struct parse *p, register struct re_guts *g); -static sopno pluscount(register struct parse *p, register struct re_guts *g); - -#ifdef __cplusplus -} -#endif - -static char nuls[10]; /* place to point scanner in event of error */ - -/* - * macros for use with parse structure - * BEWARE: these know that the parse structure is named `p' !!! - */ -#define PEEK() (*p->next) -#define PEEK2() (*(p->next+1)) -#define MORE() (p->next < p->end) -#define MORE2() (p->next+1 < p->end) -#define SEE(c) (MORE() && PEEK() == (c)) -#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) -#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) -#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) -#define NEXT() (p->next++) -#define NEXT2() (p->next += 2) -#define NEXTn(n) (p->next += (n)) -#define GETNEXT() (*p->next++) -#define SETERROR(e) seterr(p, (e)) -#define REQUIRE(co, e) ((co) || SETERROR(e)) -#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e)) -#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e)) -#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e)) -#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) -#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) -#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) -#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) -#define HERE() (p->slen) -#define THERE() (p->slen - 1) -#define THERETHERE() (p->slen - 2) -#define DROP(n) (p->slen -= (n)) - -#define never 0 /* some s have bugs too */ - -int /* 0 success, otherwise REG_something */ -regcomp(preg, pattern, cflags) -regex_t *preg; -const char *pattern; -int cflags; -{ - struct parse pa; - register struct re_guts *g; - register struct parse *p = &pa; - register int i; - register size_t len; -#define GOODFLAGS(f) ((f)&~REG_DUMP) - - cflags = GOODFLAGS(cflags); - if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) - return(REG_INVARG); - - if (cflags®_PEND) { - if (preg->re_endp < pattern) - return(REG_INVARG); - len = preg->re_endp - pattern; - } else - len = strlen((char *)pattern); - - /* do the mallocs early so failure handling is easy */ - g = (struct re_guts *)malloc(sizeof(struct re_guts) + - (NC-1)*sizeof(cat_t)); - if (g == NULL) - return(REG_ESPACE); - p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ - p->strip = (sop *)malloc(p->ssize * sizeof(sop)); - p->slen = 0; - if (p->strip == NULL) { - free((char *)g); - return(REG_ESPACE); - } - - /* set things up */ - p->g = g; - p->next = (char *)pattern; /* convenience; we do not modify it */ - p->end = p->next + len; - p->error = 0; - p->ncsalloc = 0; - for (i = 0; i < NPAREN; i++) { - p->pbegin[i] = 0; - p->pend[i] = 0; - } - g->csetsize = NC; - g->sets = NULL; - g->setbits = NULL; - g->ncsets = 0; - g->cflags = cflags; - g->iflags = 0; - g->nbol = 0; - g->neol = 0; - g->must = NULL; - g->mlen = 0; - g->nsub = 0; - g->ncategories = 1; /* category 0 is "everything else" */ - g->categories = &g->catspace[-(CHAR_MIN)]; - (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); - g->backrefs = 0; - - /* do it */ - EMIT(OEND, 0); - g->firststate = THERE(); - if (cflags®_EXTENDED) - p_ere(p, OUT); - else if (cflags®_NOSPEC) - p_str(p); - else - p_bre(p, OUT, OUT); - EMIT(OEND, 0); - g->laststate = THERE(); - - /* tidy up loose ends and fill things in */ - categorize(p, g); - stripsnug(p, g); - findmust(p, g); - g->nplus = pluscount(p, g); - g->magic = MAGIC2; - preg->re_nsub = g->nsub; - preg->re_g = g; - preg->re_magic = MAGIC1; - /* not debugging, so can't rely on the assert() in regexec() */ - if (g->iflags&BAD) - SETERROR(REG_ASSERT); - - /* win or lose, we're done */ - if (p->error != 0) /* lose */ - regfree(preg); - return(p->error); -#undef GOODFLAGS -} - -/* - - p_ere - ERE parser top level, concatenation and alternation - == static void p_ere(register struct parse *p, int stop); - */ -static void -p_ere(p, stop) -register struct parse *p; -int stop; /* character this ERE should end at */ -{ - register char c; - register sopno prevback; - register sopno prevfwd; - register sopno conc; - register int first = 1; /* is this the first alternative? */ - - for (;;) { - /* do a bunch of concatenated expressions */ - conc = HERE(); - while (MORE() && (c = PEEK()) != '|' && c != stop) - p_ere_exp(p); - REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ - - if (!EAT('|')) - break; /* NOTE BREAK OUT */ - - if (first) { - INSERT(OCH_, conc); /* offset is wrong */ - prevfwd = conc; - prevback = conc; - first = 0; - } - ASTERN(OOR1, prevback); - prevback = THERE(); - AHEAD(prevfwd); /* fix previous offset */ - prevfwd = HERE(); - EMIT(OOR2, 0); /* offset is very wrong */ - } - - if (!first) { /* tail-end fixups */ - AHEAD(prevfwd); - ASTERN(O_CH, prevback); - } - - assert(!MORE() || SEE(stop)); -} - -/* - - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op - == static void p_ere_exp(register struct parse *p); - */ -static void -p_ere_exp(p) -register struct parse *p; -{ - register char c; - register sopno pos; - register int count; - register int count2; - register sopno subno; - int wascaret = 0; - - assert(MORE()); /* caller should have ensured this */ - c = GETNEXT(); - - pos = HERE(); - switch (c) { - case '(': - REQUIRE(MORE(), REG_EPAREN); - p->g->nsub++; - subno = p->g->nsub; - if (subno < NPAREN) - p->pbegin[subno] = HERE(); - EMIT(OLPAREN, subno); - if (!SEE(')')) - p_ere(p, ')'); - if (subno < NPAREN) { - p->pend[subno] = HERE(); - assert(p->pend[subno] != 0); - } - EMIT(ORPAREN, subno); - MUSTEAT(')', REG_EPAREN); - break; - case '^': - EMIT(OBOL, 0); - p->g->iflags |= USEBOL; - p->g->nbol++; - wascaret = 1; - break; - case '$': - EMIT(OEOL, 0); - p->g->iflags |= USEEOL; - p->g->neol++; - break; - case '|': - SETERROR(REG_EMPTY); - break; - case '*': - case '+': - case '?': - SETERROR(REG_BADRPT); - break; - case '.': - if (p->g->cflags®_NEWLINE) - nonnewline(p); - else - EMIT(OANY, 0); - break; - case '[': - p_bracket(p); - break; - case '\\': - REQUIRE(MORE(), REG_EESCAPE); - c = GETNEXT(); - ordinary(p, c); - break; - case '{': /* okay as ordinary except if digit follows */ - REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT); - /* FALLTHROUGH */ - default: - ordinary(p, c); - break; - } - - if (!MORE()) - return; - c = PEEK(); - /* we call { a repetition if followed by a digit */ - if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) )) - return; /* no repetition, we're done */ - NEXT(); - - REQUIRE(!wascaret, REG_BADRPT); - switch (c) { - case '*': /* implemented as +? */ - /* this case does not require the (y|) trick, noKLUDGE */ - INSERT(OPLUS_, pos); - ASTERN(O_PLUS, pos); - INSERT(OQUEST_, pos); - ASTERN(O_QUEST, pos); - break; - case '+': - INSERT(OPLUS_, pos); - ASTERN(O_PLUS, pos); - break; - case '?': - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, pos); /* offset slightly wrong */ - ASTERN(OOR1, pos); /* this one's right */ - AHEAD(pos); /* fix the OCH_ */ - EMIT(OOR2, 0); /* offset very wrong... */ - AHEAD(THERE()); /* ...so fix it */ - ASTERN(O_CH, THERETHERE()); - break; - case '{': - count = p_count(p); - if (EAT(',')) { - if (isdigit(PEEK())) { - count2 = p_count(p); - REQUIRE(count <= count2, REG_BADBR); - } else /* single number with comma */ - count2 = INFINITY; - } else /* just a single number */ - count2 = count; - repeat(p, pos, count, count2); - if (!EAT('}')) { /* error heuristics */ - while (MORE() && PEEK() != '}') - NEXT(); - REQUIRE(MORE(), REG_EBRACE); - SETERROR(REG_BADBR); - } - break; - } - - if (!MORE()) - return; - c = PEEK(); - if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) ) ) - return; - SETERROR(REG_BADRPT); -} - -/* - - p_str - string (no metacharacters) "parser" - == static void p_str(register struct parse *p); - */ -static void -p_str(p) -register struct parse *p; -{ - REQUIRE(MORE(), REG_EMPTY); - while (MORE()) - ordinary(p, GETNEXT()); -} - -/* - - p_bre - BRE parser top level, anchoring and concatenation - == static void p_bre(register struct parse *p, register int end1, \ - == register int end2); - * Giving end1 as OUT essentially eliminates the end1/end2 check. - * - * This implementation is a bit of a kludge, in that a trailing $ is first - * taken as an ordinary character and then revised to be an anchor. The - * only undesirable side effect is that '$' gets included as a character - * category in such cases. This is fairly harmless; not worth fixing. - * The amount of lookahead needed to avoid this kludge is excessive. - */ -static void -p_bre(p, end1, end2) -register struct parse *p; -register int end1; /* first terminating character */ -register int end2; /* second terminating character */ -{ - register sopno start = HERE(); - register int first = 1; /* first subexpression? */ - register int wasdollar = 0; - - if (EAT('^')) { - EMIT(OBOL, 0); - p->g->iflags |= USEBOL; - p->g->nbol++; - } - while (MORE() && !SEETWO(end1, end2)) { - wasdollar = p_simp_re(p, first); - first = 0; - } - if (wasdollar) { /* oops, that was a trailing anchor */ - DROP(1); - EMIT(OEOL, 0); - p->g->iflags |= USEEOL; - p->g->neol++; - } - - REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ -} - -/* - - p_simp_re - parse a simple RE, an atom possibly followed by a repetition - == static int p_simp_re(register struct parse *p, int starordinary); - */ -static int /* was the simple RE an unbackslashed $? */ -p_simp_re(p, starordinary) -register struct parse *p; -int starordinary; /* is a leading * an ordinary character? */ -{ - register int c; - register int count; - register int count2; - register sopno pos; - register int i; - register sopno subno; -# define BACKSL (1<g->cflags®_NEWLINE) - nonnewline(p); - else - EMIT(OANY, 0); - break; - case '[': - p_bracket(p); - break; - case BACKSL|'{': - SETERROR(REG_BADRPT); - break; - case BACKSL|'(': - p->g->nsub++; - subno = p->g->nsub; - if (subno < NPAREN) - p->pbegin[subno] = HERE(); - EMIT(OLPAREN, subno); - /* the MORE here is an error heuristic */ - if (MORE() && !SEETWO('\\', ')')) - p_bre(p, '\\', ')'); - if (subno < NPAREN) { - p->pend[subno] = HERE(); - assert(p->pend[subno] != 0); - } - EMIT(ORPAREN, subno); - REQUIRE(EATTWO('\\', ')'), REG_EPAREN); - break; - case BACKSL|')': /* should not get here -- must be user */ - case BACKSL|'}': - SETERROR(REG_EPAREN); - break; - case BACKSL|'1': - case BACKSL|'2': - case BACKSL|'3': - case BACKSL|'4': - case BACKSL|'5': - case BACKSL|'6': - case BACKSL|'7': - case BACKSL|'8': - case BACKSL|'9': - i = (c&~BACKSL) - '0'; - assert(i < NPAREN); - if (p->pend[i] != 0) { - assert(i <= p->g->nsub); - EMIT(OBACK_, i); - assert(p->pbegin[i] != 0); - assert(OP(p->strip[p->pbegin[i]]) == OLPAREN); - assert(OP(p->strip[p->pend[i]]) == ORPAREN); - (void) dupl(p, p->pbegin[i]+1, p->pend[i]); - EMIT(O_BACK, i); - } else - SETERROR(REG_ESUBREG); - p->g->backrefs = 1; - break; - case '*': - REQUIRE(starordinary, REG_BADRPT); - /* FALLTHROUGH */ - default: - ordinary(p, (char)c); /* takes off BACKSL, if any */ - break; - } - - if (EAT('*')) { /* implemented as +? */ - /* this case does not require the (y|) trick, noKLUDGE */ - INSERT(OPLUS_, pos); - ASTERN(O_PLUS, pos); - INSERT(OQUEST_, pos); - ASTERN(O_QUEST, pos); - } else if (EATTWO('\\', '{')) { - count = p_count(p); - if (EAT(',')) { - if (MORE() && isdigit(PEEK())) { - count2 = p_count(p); - REQUIRE(count <= count2, REG_BADBR); - } else /* single number with comma */ - count2 = INFINITY; - } else /* just a single number */ - count2 = count; - repeat(p, pos, count, count2); - if (!EATTWO('\\', '}')) { /* error heuristics */ - while (MORE() && !SEETWO('\\', '}')) - NEXT(); - REQUIRE(MORE(), REG_EBRACE); - SETERROR(REG_BADBR); - } - } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */ - return(1); - - return(0); -} - -/* - - p_count - parse a repetition count - == static int p_count(register struct parse *p); - */ -static int /* the value */ -p_count(p) -register struct parse *p; -{ - register int count = 0; - register int ndigits = 0; - - while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { - count = count*10 + (GETNEXT() - '0'); - ndigits++; - } - - REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); - return(count); -} - -/* - - p_bracket - parse a bracketed character list - == static void p_bracket(register struct parse *p); - * - * Note a significant property of this code: if the allocset() did SETERROR, - * no set operations are done. - */ -static void -p_bracket(p) -register struct parse *p; -{ - register cset *cs = allocset(p); - register int invert = 0; - - /* Dept of Truly Sickening Special-Case Kludges */ - if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) { - EMIT(OBOW, 0); - NEXTn(6); - return; - } - if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) { - EMIT(OEOW, 0); - NEXTn(6); - return; - } - - if (EAT('^')) - invert++; /* make note to invert set at end */ - if (EAT(']')) - CHadd(cs, ']'); - else if (EAT('-')) - CHadd(cs, '-'); - while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) - p_b_term(p, cs); - if (EAT('-')) - CHadd(cs, '-'); - MUSTEAT(']', REG_EBRACK); - - if (p->error != 0) /* don't mess things up further */ - return; - - if (p->g->cflags®_ICASE) { - register int i; - register int ci; - - for (i = p->g->csetsize - 1; i >= 0; i--) - if (CHIN(cs, i) && isalpha(i)) { - ci = othercase(i); - if (ci != i) - CHadd(cs, ci); - } - if (cs->multis != NULL) - mccase(p, cs); - } - if (invert) { - register int i; - - for (i = p->g->csetsize - 1; i >= 0; i--) - if (CHIN(cs, i)) - CHsub(cs, i); - else - CHadd(cs, i); - if (p->g->cflags®_NEWLINE) - CHsub(cs, '\n'); - if (cs->multis != NULL) - mcinvert(p, cs); - } - - assert(cs->multis == NULL); /* xxx */ - - if (nch(p, cs) == 1) { /* optimize singleton sets */ - ordinary(p, firstch(p, cs)); - freeset(p, cs); - } else - EMIT(OANYOF, freezeset(p, cs)); -} - -/* - - p_b_term - parse one term of a bracketed character list - == static void p_b_term(register struct parse *p, register cset *cs); - */ -static void -p_b_term(p, cs) -register struct parse *p; -register cset *cs; -{ - register char c; - register char start, finish; - register int i; - - /* classify what we've got */ - switch ((MORE()) ? PEEK() : '\0') { - case '[': - c = (MORE2()) ? PEEK2() : '\0'; - break; - case '-': - SETERROR(REG_ERANGE); - return; /* NOTE RETURN */ - break; - default: - c = '\0'; - break; - } - - switch (c) { - case ':': /* character class */ - NEXT2(); - REQUIRE(MORE(), REG_EBRACK); - c = PEEK(); - REQUIRE(c != '-' && c != ']', REG_ECTYPE); - p_b_cclass(p, cs); - REQUIRE(MORE(), REG_EBRACK); - REQUIRE(EATTWO(':', ']'), REG_ECTYPE); - break; - case '=': /* equivalence class */ - NEXT2(); - REQUIRE(MORE(), REG_EBRACK); - c = PEEK(); - REQUIRE(c != '-' && c != ']', REG_ECOLLATE); - p_b_eclass(p, cs); - REQUIRE(MORE(), REG_EBRACK); - REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); - break; - default: /* symbol, ordinary character, or range */ -/* xxx revision needed for multichar stuff */ - start = p_b_symbol(p); - if (SEE('-') && MORE2() && PEEK2() != ']') { - /* range */ - NEXT(); - if (EAT('-')) - finish = '-'; - else - finish = p_b_symbol(p); - } else - finish = start; -/* xxx what about signed chars here... */ - REQUIRE(start <= finish, REG_ERANGE); - for (i = start; i <= finish; i++) - CHadd(cs, i); - break; - } -} - -/* - - p_b_cclass - parse a character-class name and deal with it - == static void p_b_cclass(register struct parse *p, register cset *cs); - */ -static void -p_b_cclass(p, cs) -register struct parse *p; -register cset *cs; -{ - register char *sp = p->next; - register struct cclass *cp; - register size_t len; - register char *u; - register char c; - - while (MORE() && isalpha(PEEK())) - NEXT(); - len = p->next - sp; - for (cp = cclasses; cp->name != NULL; cp++) - if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') - break; - if (cp->name == NULL) { - /* oops, didn't find it */ - SETERROR(REG_ECTYPE); - return; - } - - u = cp->chars; - while ((c = *u++) != '\0') - CHadd(cs, c); - for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) - MCadd(p, cs, u); -} - -/* - - p_b_eclass - parse an equivalence-class name and deal with it - == static void p_b_eclass(register struct parse *p, register cset *cs); - * - * This implementation is incomplete. xxx - */ -static void -p_b_eclass(p, cs) -register struct parse *p; -register cset *cs; -{ - register char c; - - c = p_b_coll_elem(p, '='); - CHadd(cs, c); -} - -/* - - p_b_symbol - parse a character or [..]ed multicharacter collating symbol - == static char p_b_symbol(register struct parse *p); - */ -static char /* value of symbol */ -p_b_symbol(p) -register struct parse *p; -{ - register char value; - - REQUIRE(MORE(), REG_EBRACK); - if (!EATTWO('[', '.')) - return(GETNEXT()); - - /* collating symbol */ - value = p_b_coll_elem(p, '.'); - REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); - return(value); -} - -/* - - p_b_coll_elem - parse a collating-element name and look it up - == static char p_b_coll_elem(register struct parse *p, int endc); - */ -static char /* value of collating element */ -p_b_coll_elem(p, endc) -register struct parse *p; -int endc; /* name ended by endc,']' */ -{ - register char *sp = p->next; - register struct cname *cp; - register int len; - - while (MORE() && !SEETWO(endc, ']')) - NEXT(); - if (!MORE()) { - SETERROR(REG_EBRACK); - return(0); - } - len = p->next - sp; - for (cp = cnames; cp->name != NULL; cp++) - if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') - return(cp->code); /* known name */ - if (len == 1) - return(*sp); /* single character */ - SETERROR(REG_ECOLLATE); /* neither */ - return(0); -} - -/* - - othercase - return the case counterpart of an alphabetic - == static char othercase(int ch); - */ -static char /* if no counterpart, return ch */ -othercase(ch) -int ch; -{ - assert(isalpha(ch)); - if (isupper(ch)) - return(tolower(ch)); - else if (islower(ch)) - return(toupper(ch)); - else /* peculiar, but could happen */ - return(ch); -} - -/* - - bothcases - emit a dualcase version of a two-case character - == static void bothcases(register struct parse *p, int ch); - * - * Boy, is this implementation ever a kludge... - */ -static void -bothcases(p, ch) -register struct parse *p; -int ch; -{ - register char *oldnext = p->next; - register char *oldend = p->end; - char bracket[3]; - - assert(othercase(ch) != ch); /* p_bracket() would recurse */ - p->next = bracket; - p->end = bracket+2; - bracket[0] = ch; - bracket[1] = ']'; - bracket[2] = '\0'; - p_bracket(p); - assert(p->next == bracket+2); - p->next = oldnext; - p->end = oldend; -} - -/* - - ordinary - emit an ordinary character - == static void ordinary(register struct parse *p, register int ch); - */ -static void -ordinary(p, ch) -register struct parse *p; -register int ch; -{ - register cat_t *cap = p->g->categories; - - if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) - bothcases(p, ch); - else { - EMIT(OCHAR, (unsigned char)ch); - if (cap[ch] == 0) - cap[ch] = p->g->ncategories++; - } -} - -/* - - nonnewline - emit REG_NEWLINE version of OANY - == static void nonnewline(register struct parse *p); - * - * Boy, is this implementation ever a kludge... - */ -static void -nonnewline(p) -register struct parse *p; -{ - register char *oldnext = p->next; - register char *oldend = p->end; - char bracket[4]; - - p->next = bracket; - p->end = bracket+3; - bracket[0] = '^'; - bracket[1] = '\n'; - bracket[2] = ']'; - bracket[3] = '\0'; - p_bracket(p); - assert(p->next == bracket+3); - p->next = oldnext; - p->end = oldend; -} - -/* - - repeat - generate code for a bounded repetition, recursively if needed - == static void repeat(register struct parse *p, sopno start, int from, int to); - */ -static void -repeat(p, start, from, to) -register struct parse *p; -sopno start; /* operand from here to end of strip */ -int from; /* repeated from this number */ -int to; /* to this number of times (maybe INFINITY) */ -{ - register sopno finish = HERE(); -# define N 2 -# define INF 3 -# define REP(f, t) ((f)*8 + (t)) -# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) - register sopno copy; - - if (p->error != 0) /* head off possible runaway recursion */ - return; - - assert(from <= to); - - switch (REP(MAP(from), MAP(to))) { - case REP(0, 0): /* must be user doing this */ - DROP(finish-start); /* drop the operand */ - break; - case REP(0, 1): /* as x{1,1}? */ - case REP(0, N): /* as x{1,n}? */ - case REP(0, INF): /* as x{1,}? */ - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, start); /* offset is wrong... */ - repeat(p, start+1, 1, to); - ASTERN(OOR1, start); - AHEAD(start); /* ... fix it */ - EMIT(OOR2, 0); - AHEAD(THERE()); - ASTERN(O_CH, THERETHERE()); - break; - case REP(1, 1): /* trivial case */ - /* done */ - break; - case REP(1, N): /* as x?x{1,n-1} */ - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, start); - ASTERN(OOR1, start); - AHEAD(start); - EMIT(OOR2, 0); /* offset very wrong... */ - AHEAD(THERE()); /* ...so fix it */ - ASTERN(O_CH, THERETHERE()); - copy = dupl(p, start+1, finish+1); - assert(copy == finish+4); - repeat(p, copy, 1, to-1); - break; - case REP(1, INF): /* as x+ */ - INSERT(OPLUS_, start); - ASTERN(O_PLUS, start); - break; - case REP(N, N): /* as xx{m-1,n-1} */ - copy = dupl(p, start, finish); - repeat(p, copy, from-1, to-1); - break; - case REP(N, INF): /* as xx{n-1,INF} */ - copy = dupl(p, start, finish); - repeat(p, copy, from-1, to); - break; - default: /* "can't happen" */ - SETERROR(REG_ASSERT); /* just in case */ - break; - } -} - -/* - - seterr - set an error condition - == static int seterr(register struct parse *p, int e); - */ -static int /* useless but makes type checking happy */ -seterr(p, e) -register struct parse *p; -int e; -{ - if (p->error == 0) /* keep earliest error condition */ - p->error = e; - p->next = nuls; /* try to bring things to a halt */ - p->end = nuls; - return(0); /* make the return value well-defined */ -} - -/* - - allocset - allocate a set of characters for [] - == static cset *allocset(register struct parse *p); - */ -static cset * -allocset(p) -register struct parse *p; -{ - register int no = p->g->ncsets++; - register size_t nc; - register size_t nbytes; - register cset *cs; - register size_t css = (size_t)p->g->csetsize; - register int i; - - if (no >= p->ncsalloc) { /* need another column of space */ - p->ncsalloc += CHAR_BIT; - nc = p->ncsalloc; - assert(nc % CHAR_BIT == 0); - nbytes = nc / CHAR_BIT * css; - if (p->g->sets == NULL) - p->g->sets = (cset *)malloc(nc * sizeof(cset)); - else - p->g->sets = (cset *)realloc((char *)p->g->sets, - nc * sizeof(cset)); - if (p->g->setbits == NULL) - p->g->setbits = (uch *)malloc(nbytes); - else { - p->g->setbits = (uch *)realloc((char *)p->g->setbits, - nbytes); - /* xxx this isn't right if setbits is now NULL */ - for (i = 0; i < no; i++) - p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); - } - if (p->g->sets != NULL && p->g->setbits != NULL) - (void) memset((char *)p->g->setbits + (nbytes - css), - 0, css); - else { - no = 0; - SETERROR(REG_ESPACE); - /* caller's responsibility not to do set ops */ - } - } - - assert(p->g->sets != NULL); /* xxx */ - cs = &p->g->sets[no]; - cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); - cs->mask = 1 << ((no) % CHAR_BIT); - cs->hash = 0; - cs->smultis = 0; - cs->multis = NULL; - - return(cs); -} - -/* - - freeset - free a now-unused set - == static void freeset(register struct parse *p, register cset *cs); - */ -static void -freeset(p, cs) -register struct parse *p; -register cset *cs; -{ - register int i; - register cset *top = &p->g->sets[p->g->ncsets]; - register size_t css = (size_t)p->g->csetsize; - - for (i = 0; i < css; i++) - CHsub(cs, i); - if (cs == top-1) /* recover only the easy case */ - p->g->ncsets--; -} - -/* - - freezeset - final processing on a set of characters - == static int freezeset(register struct parse *p, register cset *cs); - * - * The main task here is merging identical sets. This is usually a waste - * of time (although the hash code minimizes the overhead), but can win - * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash - * is done using addition rather than xor -- all ASCII [aA] sets xor to - * the same value! - */ -static int /* set number */ -freezeset(p, cs) -register struct parse *p; -register cset *cs; -{ - register uch h = cs->hash; - register int i; - register cset *top = &p->g->sets[p->g->ncsets]; - register cset *cs2; - register size_t css = (size_t)p->g->csetsize; - - /* look for an earlier one which is the same */ - for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) - if (cs2->hash == h && cs2 != cs) { - /* maybe */ - for (i = 0; i < css; i++) - if (!!CHIN(cs2, i) != !!CHIN(cs, i)) - break; /* no */ - if (i == css) - break; /* yes */ - } - - if (cs2 < top) { /* found one */ - freeset(p, cs); - cs = cs2; - } - - return((int)(cs - p->g->sets)); -} - -/* - - firstch - return first character in a set (which must have at least one) - == static int firstch(register struct parse *p, register cset *cs); - */ -static int /* character; there is no "none" value */ -firstch(p, cs) -register struct parse *p; -register cset *cs; -{ - register int i; - register size_t css = (size_t)p->g->csetsize; - - for (i = 0; i < css; i++) - if (CHIN(cs, i)) - return((char)i); - assert(never); - return(0); /* arbitrary */ -} - -/* - - nch - number of characters in a set - == static int nch(register struct parse *p, register cset *cs); - */ -static int -nch(p, cs) -register struct parse *p; -register cset *cs; -{ - register int i; - register size_t css = (size_t)p->g->csetsize; - register int n = 0; - - for (i = 0; i < css; i++) - if (CHIN(cs, i)) - n++; - return(n); -} - -/* - - mcadd - add a collating element to a cset - == static void mcadd(register struct parse *p, register cset *cs, \ - == register char *cp); - */ -static void -mcadd(p, cs, cp) -register struct parse *p; -register cset *cs; -register char *cp; -{ - register size_t oldend = cs->smultis; - - cs->smultis += strlen(cp) + 1; - if (cs->multis == NULL) - cs->multis = malloc(cs->smultis); - else - cs->multis = realloc(cs->multis, cs->smultis); - if (cs->multis == NULL) { - SETERROR(REG_ESPACE); - return; - } - - (void) strcpy(cs->multis + oldend - 1, cp); - cs->multis[cs->smultis - 1] = '\0'; -} - -/* - - mcinvert - invert the list of collating elements in a cset - == static void mcinvert(register struct parse *p, register cset *cs); - * - * This would have to know the set of possibilities. Implementation - * is deferred. - */ -static void -mcinvert(p, cs) -register struct parse *p; -register cset *cs; -{ - assert(cs->multis == NULL); /* xxx */ -} - -/* - - mccase - add case counterparts of the list of collating elements in a cset - == static void mccase(register struct parse *p, register cset *cs); - * - * This would have to know the set of possibilities. Implementation - * is deferred. - */ -static void -mccase(p, cs) -register struct parse *p; -register cset *cs; -{ - assert(cs->multis == NULL); /* xxx */ -} - -/* - - isinsets - is this character in any sets? - == static int isinsets(register struct re_guts *g, int c); - */ -static int /* predicate */ -isinsets(g, c) -register struct re_guts *g; -int c; -{ - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc = (unsigned char)c; - - for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) - if (col[uc] != 0) - return(1); - return(0); -} - -/* - - samesets - are these two characters in exactly the same sets? - == static int samesets(register struct re_guts *g, int c1, int c2); - */ -static int /* predicate */ -samesets(g, c1, c2) -register struct re_guts *g; -int c1; -int c2; -{ - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc1 = (unsigned char)c1; - register unsigned uc2 = (unsigned char)c2; - - for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) - if (col[uc1] != col[uc2]) - return(0); - return(1); -} - -/* - - categorize - sort out character categories - == static void categorize(struct parse *p, register struct re_guts *g); - */ -static void -categorize(p, g) -struct parse *p; -register struct re_guts *g; -{ - register cat_t *cats = g->categories; - register int c; - register int c2; - register cat_t cat; - - /* avoid making error situations worse */ - if (p->error != 0) - return; - - for (c = CHAR_MIN; c <= CHAR_MAX; c++) - if (cats[c] == 0 && isinsets(g, c)) { - cat = g->ncategories++; - cats[c] = cat; - for (c2 = c+1; c2 <= CHAR_MAX; c2++) - if (cats[c2] == 0 && samesets(g, c, c2)) - cats[c2] = cat; - } -} - -/* - - dupl - emit a duplicate of a bunch of sops - == static sopno dupl(register struct parse *p, sopno start, sopno finish); - */ -static sopno /* start of duplicate */ -dupl(p, start, finish) -register struct parse *p; -sopno start; /* from here */ -sopno finish; /* to this less one */ -{ - register sopno ret = HERE(); - register sopno len = finish - start; - - assert(finish >= start); - if (len == 0) - return(ret); - enlarge(p, p->ssize + len); /* this many unexpected additions */ - assert(p->ssize >= p->slen + len); - (void) memcpy((char *)(p->strip + p->slen), - (char *)(p->strip + start), (size_t)len*sizeof(sop)); - p->slen += len; - return(ret); -} - -/* - - doemit - emit a strip operator - == static void doemit(register struct parse *p, sop op, size_t opnd); - * - * It might seem better to implement this as a macro with a function as - * hard-case backup, but it's just too big and messy unless there are - * some changes to the data structures. Maybe later. - */ -static void -doemit(p, op, opnd) -register struct parse *p; -sop op; -size_t opnd; -{ - /* avoid making error situations worse */ - if (p->error != 0) - return; - - /* deal with oversize operands ("can't happen", more or less) */ - assert(opnd < 1<slen >= p->ssize) - enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */ - assert(p->slen < p->ssize); - - /* finally, it's all reduced to the easy case */ - p->strip[p->slen++] = SOP(op, opnd); -} - -/* - - doinsert - insert a sop into the strip - == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); - */ -static void -doinsert(p, op, opnd, pos) -register struct parse *p; -sop op; -size_t opnd; -sopno pos; -{ - register sopno sn; - register sop s; - register int i; - - /* avoid making error situations worse */ - if (p->error != 0) - return; - - sn = HERE(); - EMIT(op, opnd); /* do checks, ensure space */ - assert(HERE() == sn+1); - s = p->strip[sn]; - - /* adjust paren pointers */ - assert(pos > 0); - for (i = 1; i < NPAREN; i++) { - if (p->pbegin[i] >= pos) { - p->pbegin[i]++; - } - if (p->pend[i] >= pos) { - p->pend[i]++; - } - } - - memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], - (HERE()-pos-1)*sizeof(sop)); - p->strip[pos] = s; -} - -/* - - dofwd - complete a forward reference - == static void dofwd(register struct parse *p, sopno pos, sop value); - */ -static void -dofwd(p, pos, value) -register struct parse *p; -register sopno pos; -sop value; -{ - /* avoid making error situations worse */ - if (p->error != 0) - return; - - assert(value < 1<strip[pos] = OP(p->strip[pos]) | value; -} - -/* - - enlarge - enlarge the strip - == static void enlarge(register struct parse *p, sopno size); - */ -static void -enlarge(p, size) -register struct parse *p; -register sopno size; -{ - register sop *sp; - - if (p->ssize >= size) - return; - - sp = (sop *)realloc(p->strip, size*sizeof(sop)); - if (sp == NULL) { - SETERROR(REG_ESPACE); - return; - } - p->strip = sp; - p->ssize = size; -} - -/* - - stripsnug - compact the strip - == static void stripsnug(register struct parse *p, register struct re_guts *g); - */ -static void -stripsnug(p, g) -register struct parse *p; -register struct re_guts *g; -{ - g->nstates = p->slen; - g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); - if (g->strip == NULL) { - SETERROR(REG_ESPACE); - g->strip = p->strip; - } -} - -/* - - findmust - fill in must and mlen with longest mandatory literal string - == static void findmust(register struct parse *p, register struct re_guts *g); - * - * This algorithm could do fancy things like analyzing the operands of | - * for common subsequences. Someday. This code is simple and finds most - * of the interesting cases. - * - * Note that must and mlen got initialized during setup. - */ -static void -findmust(p, g) -struct parse *p; -register struct re_guts *g; -{ - register sop *scan; - sop *start; - register sop *newstart; - register sopno newlen; - register sop s; - register char *cp; - register sopno i; - - /* avoid making error situations worse */ - if (p->error != 0) - return; - - /* find the longest OCHAR sequence in strip */ - newlen = 0; - scan = g->strip + 1; - do { - s = *scan++; - switch (OP(s)) { - case OCHAR: /* sequence member */ - if (newlen == 0) /* new sequence */ - newstart = scan - 1; - newlen++; - break; - case OPLUS_: /* things that don't break one */ - case OLPAREN: - case ORPAREN: - break; - case OQUEST_: /* things that must be skipped */ - case OCH_: - scan--; - do { - scan += OPND(s); - s = *scan; - /* assert() interferes w debug printouts */ - if (OP(s) != O_QUEST && OP(s) != O_CH && - OP(s) != OOR2) { - g->iflags |= BAD; - return; - } - } while (OP(s) != O_QUEST && OP(s) != O_CH); - /* fallthrough */ - default: /* things that break a sequence */ - if (newlen > g->mlen) { /* ends one */ - start = newstart; - g->mlen = newlen; - } - newlen = 0; - break; - } - } while (OP(s) != OEND); - - if (g->mlen == 0) /* there isn't one */ - return; - - /* turn it into a character string */ - g->must = malloc((size_t)g->mlen + 1); - if (g->must == NULL) { /* argh; just forget it */ - g->mlen = 0; - return; - } - cp = g->must; - scan = start; - for (i = g->mlen; i > 0; i--) { - while (OP(s = *scan++) != OCHAR) - continue; - assert(cp < g->must + g->mlen); - *cp++ = (char)OPND(s); - } - assert(cp == g->must + g->mlen); - *cp++ = '\0'; /* just on general principles */ -} - -/* - - pluscount - count + nesting - == static sopno pluscount(register struct parse *p, register struct re_guts *g); - */ -static sopno /* nesting depth */ -pluscount(p, g) -struct parse *p; -register struct re_guts *g; -{ - register sop *scan; - register sop s; - register sopno plusnest = 0; - register sopno maxnest = 0; - - if (p->error != 0) - return(0); /* there may not be an OEND */ - - scan = g->strip + 1; - do { - s = *scan++; - switch (OP(s)) { - case OPLUS_: - plusnest++; - break; - case O_PLUS: - if (plusnest > maxnest) - maxnest = plusnest; - plusnest--; - break; - } - } while (OP(s) != OEND); - if (plusnest != 0) - g->iflags |= BAD; - return(maxnest); -} - -static int nope = 0; /* for use in asserts; shuts lint up */ - -/* macros for manipulating states, small version */ -#define states unsigned -#define states1 unsigned /* for later use in regexec() decision */ -#define CLEAR(v) ((v) = 0) -#define SET0(v, n) ((v) &= ~((unsigned)1 << (n))) -#define SET1(v, n) ((v) |= (unsigned)1 << (n)) -#define ISSET(v, n) ((v) & ((unsigned)1 << (n))) -#define ASSIGN(d, s) ((d) = (s)) -#define EQ(a, b) ((a) == (b)) -#define STATEVARS int dummy /* dummy version */ -#define STATESETUP(m, n) /* nothing */ -#define STATETEARDOWN(m) /* nothing */ -#define SETUP(v) ((v) = 0) -#define onestate unsigned -#define INIT(o, n) ((o) = (unsigned)1 << (n)) -#define INC(o) ((o) <<= 1) -#define ISSTATEIN(v, o) ((v) & (o)) -/* some abbreviations; note that some of these know variable names! */ -/* do "if I'm here, I can also be there" etc without branches */ -#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n)) -#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n)) -#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n))) -/* function names */ -#define SNAMES /* engine.c looks after details */ - -/* - * The matching engine and friends. This file is #included by regexec.c - * after suitable #defines of a variety of macros used herein, so that - * different state representations can be used without duplicating masses - * of code. - */ - -#ifdef SNAMES -#define matcher smatcher -#define fast sfast -#define slow sslow -#define dissect sdissect -#define backref sbackref -#define step sstep -#define print sprint -#define at sat -#define match smat -#endif -#ifdef LNAMES -#define matcher lmatcher -#define fast lfast -#define slow lslow -#define dissect ldissect -#define backref lbackref -#define step lstep -#define print lprint -#define at lat -#define match lmat -#endif - -/* another structure passed up and down to avoid zillions of parameters */ -struct match { - struct re_guts *g; - int eflags; - regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ - char *offp; /* offsets work from here */ - char *beginp; /* start of string -- virtual NUL precedes */ - char *endp; /* end of string -- virtual NUL here */ - char *coldp; /* can be no match starting before here */ - char **lastpos; /* [nplus+1] */ - STATEVARS; - states st; /* current states */ - states fresh; /* states for a fresh start */ - states tmp; /* temporary */ - states empty; /* empty set of states */ -}; - -static int matcher(register struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); -static char *dissect(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *backref(register struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); -static char *fast(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *slow(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static states step(register struct re_guts *g, sopno start, sopno stop, register states bef, int ch, register states aft); -#define BOL (OUT+1) -#define EOL (BOL+1) -#define BOLEOL (BOL+2) -#define NOTHING (BOL+3) -#define BOW (BOL+4) -#define EOW (BOL+5) -#define CODEMAX (BOL+5) /* highest code used */ -#define NONCHAR(c) ((c) > CHAR_MAX) -#define NNONCHAR (CODEMAX-CHAR_MAX) -#define SP(t, s, c) /* nothing */ -#define AT(t, p1, p2, s1, s2) /* nothing */ -#define NOTE(s) /* nothing */ - -/* - - matcher - the actual matching engine - == static int matcher(register struct re_guts *g, char *string, \ - == size_t nmatch, regmatch_t pmatch[], int eflags); - */ -static int /* 0 success, REG_NOMATCH failure */ -matcher(g, string, nmatch, pmatch, eflags) -register struct re_guts *g; -char *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; -{ - register char *endp; - register int i; - struct match mv; - register struct match *m = &mv; - register char *dp; - const register sopno gf = g->firststate+1; /* +1 for OEND */ - const register sopno gl = g->laststate; - char *start; - char *stop; - - /* simplify the situation where possible */ - if (g->cflags®_NOSUB) - nmatch = 0; - if (eflags®_STARTEND) { - start = string + pmatch[0].rm_so; - stop = string + pmatch[0].rm_eo; - } else { - start = string; - stop = start + strlen(start); - } - if (stop < start) - return(REG_INVARG); - - /* prescreening; this does wonders for this rather slow code */ - if (g->must != NULL) { - for (dp = start; dp < stop; dp++) - if (*dp == g->must[0] && stop - dp >= g->mlen && - memcmp(dp, g->must, (size_t)g->mlen) == 0) - break; - if (dp == stop) /* we didn't find g->must */ - return(REG_NOMATCH); - } - - /* match struct setup */ - m->g = g; - m->eflags = eflags; - m->pmatch = NULL; - m->lastpos = NULL; - m->offp = string; - m->beginp = start; - m->endp = stop; - STATESETUP(m, 4); - SETUP(m->st); - SETUP(m->fresh); - SETUP(m->tmp); - SETUP(m->empty); - CLEAR(m->empty); - - /* this loop does only one repetition except for backrefs */ - for (;;) { - endp = fast(m, start, stop, gf, gl); - if (endp == NULL) { /* a miss */ - STATETEARDOWN(m); - return(REG_NOMATCH); - } - if (nmatch == 0 && !g->backrefs) - break; /* no further info needed */ - - /* where? */ - assert(m->coldp != NULL); - for (;;) { - NOTE("finding start"); - endp = slow(m, m->coldp, stop, gf, gl); - if (endp != NULL) - break; - assert(m->coldp < m->endp); - m->coldp++; - } - if (nmatch == 1 && !g->backrefs) - break; /* no further info needed */ - - /* oh my, he wants the subexpressions... */ - if (m->pmatch == NULL) - m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * - sizeof(regmatch_t)); - if (m->pmatch == NULL) { - STATETEARDOWN(m); - return(REG_ESPACE); - } - for (i = 1; i <= m->g->nsub; i++) - m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; - if (!g->backrefs && !(m->eflags®_BACKR)) { - NOTE("dissecting"); - dp = dissect(m, m->coldp, endp, gf, gl); - } else { - if (g->nplus > 0 && m->lastpos == NULL) - m->lastpos = (char **)malloc((g->nplus+1) * - sizeof(char *)); - if (g->nplus > 0 && m->lastpos == NULL) { - free(m->pmatch); - STATETEARDOWN(m); - return(REG_ESPACE); - } - NOTE("backref dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); - } - if (dp != NULL) - break; - - /* uh-oh... we couldn't find a subexpression-level match */ - assert(g->backrefs); /* must be back references doing it */ - assert(g->nplus == 0 || m->lastpos != NULL); - for (;;) { - if (dp != NULL || endp <= m->coldp) - break; /* defeat */ - NOTE("backoff"); - endp = slow(m, m->coldp, endp-1, gf, gl); - if (endp == NULL) - break; /* defeat */ - /* try it on a shorter possibility */ - NOTE("backoff dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); - } - assert(dp == NULL || dp == endp); - if (dp != NULL) /* found a shorter one */ - break; - - /* despite initial appearances, there is no match here */ - NOTE("false alarm"); - start = m->coldp + 1; /* recycle starting later */ - assert(start <= stop); - } - - /* fill in the details if requested */ - if (nmatch > 0) { - pmatch[0].rm_so = m->coldp - m->offp; - pmatch[0].rm_eo = endp - m->offp; - } - if (nmatch > 1) { - assert(m->pmatch != NULL); - for (i = 1; i < nmatch; i++) - if (i <= m->g->nsub) - pmatch[i] = m->pmatch[i]; - else { - pmatch[i].rm_so = -1; - pmatch[i].rm_eo = -1; - } - } - - if (m->pmatch != NULL) - free((char *)m->pmatch); - if (m->lastpos != NULL) - free((char *)m->lastpos); - STATETEARDOWN(m); - return(0); -} - -/* - - dissect - figure out what matched what, no back references - == static char *dissect(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* == stop (success) always */ -dissect(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register int i; - register sopno ss; /* start sop of current subRE */ - register sopno es; /* end sop of current subRE */ - register char *sp; /* start of string matched by it */ - register char *stp; /* string matched by it cannot pass here */ - register char *rest; /* start of rest of string */ - register char *tail; /* string unmatched by rest of RE */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *sep; /* end of string matched by subsubRE */ - register char *oldssp; /* previous ssp */ - register char *dp; - - AT("diss", start, stop, startst, stopst); - sp = start; - for (ss = startst; ss < stopst; ss = es) { - /* identify end of subRE */ - es = ss; - switch (OP(m->g->strip[es])) { - case OPLUS_: - case OQUEST_: - es += OPND(m->g->strip[es]); - break; - case OCH_: - while (OP(m->g->strip[es]) != O_CH) - es += OPND(m->g->strip[es]); - break; - } - es++; - - /* figure out what it matched */ - switch (OP(m->g->strip[ss])) { - case OEND: - assert(nope); - break; - case OCHAR: - sp++; - break; - case OBOL: - case OEOL: - case OBOW: - case OEOW: - break; - case OANY: - case OANYOF: - sp++; - break; - case OBACK_: - case O_BACK: - assert(nope); - break; - /* cases where length of match is hard to find */ - case OQUEST_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = es - 1; - /* did innards match? */ - if (slow(m, sp, rest, ssub, esub) != NULL) { - dp = dissect(m, sp, rest, ssub, esub); - assert(dp == rest); - } else /* no */ - assert(sp == rest); - sp = rest; - break; - case OPLUS_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = es - 1; - ssp = sp; - oldssp = ssp; - for (;;) { /* find last match of innards */ - sep = slow(m, ssp, rest, ssub, esub); - if (sep == NULL || sep == ssp) - break; /* failed or matched null */ - oldssp = ssp; /* on to next try */ - ssp = sep; - } - if (sep == NULL) { - /* last successful match */ - sep = ssp; - ssp = oldssp; - } - assert(sep == rest); /* must exhaust substring */ - assert(slow(m, ssp, sep, ssub, esub) == rest); - dp = dissect(m, ssp, sep, ssub, esub); - assert(dp == sep); - sp = rest; - break; - case OCH_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = ss + OPND(m->g->strip[ss]) - 1; - assert(OP(m->g->strip[esub]) == OOR1); - for (;;) { /* find first matching branch */ - if (slow(m, sp, rest, ssub, esub) == rest) - break; /* it matched all of it */ - /* that one missed, try next one */ - assert(OP(m->g->strip[esub]) == OOR1); - esub++; - assert(OP(m->g->strip[esub]) == OOR2); - ssub = esub + 1; - esub += OPND(m->g->strip[esub]); - if (OP(m->g->strip[esub]) == OOR2) - esub--; - else - assert(OP(m->g->strip[esub]) == O_CH); - } - dp = dissect(m, sp, rest, ssub, esub); - assert(dp == rest); - sp = rest; - break; - case O_PLUS: - case O_QUEST: - case OOR1: - case OOR2: - case O_CH: - assert(nope); - break; - case OLPAREN: - i = OPND(m->g->strip[ss]); - assert(0 < i && i <= m->g->nsub); - m->pmatch[i].rm_so = sp - m->offp; - break; - case ORPAREN: - i = OPND(m->g->strip[ss]); - assert(0 < i && i <= m->g->nsub); - m->pmatch[i].rm_eo = sp - m->offp; - break; - default: /* uh oh */ - assert(nope); - break; - } - } - - assert(sp == stop); - return(sp); -} - -/* - - backref - figure out what matched what, figuring in back references - == static char *backref(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst, sopno lev); - */ -static char * /* == stop (success) or NULL (failure) */ -backref(m, start, stop, startst, stopst, lev) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -sopno lev; /* PLUS nesting level */ -{ - register int i; - register sopno ss; /* start sop of current subRE */ - register char *sp; /* start of string matched by it */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *dp; - register size_t len; - register int hard; - register sop s; - register regoff_t offsave; - register cset *cs; - - AT("back", start, stop, startst, stopst); - sp = start; - - /* get as far as we can with easy stuff */ - hard = 0; - for (ss = startst; !hard && ss < stopst; ss++) - switch (OP(s = m->g->strip[ss])) { - case OCHAR: - if (sp == stop || *sp++ != (char)OPND(s)) - return(NULL); - break; - case OANY: - if (sp == stop) - return(NULL); - sp++; - break; - case OANYOF: - cs = &m->g->sets[OPND(s)]; - if (sp == stop || !CHIN(cs, *sp++)) - return(NULL); - break; - case OBOL: - if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || - (sp < m->endp && *(sp-1) == '\n' && - (m->g->cflags®_NEWLINE)) ) - { /* yes */ } - else - return(NULL); - break; - case OEOL: - if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || - (sp < m->endp && *sp == '\n' && - (m->g->cflags®_NEWLINE)) ) - { /* yes */ } - else - return(NULL); - break; - case OBOW: - if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || - (sp < m->endp && *(sp-1) == '\n' && - (m->g->cflags®_NEWLINE)) || - (sp > m->beginp && - !ISWORD(*(sp-1))) ) && - (sp < m->endp && ISWORD(*sp)) ) - { /* yes */ } - else - return(NULL); - break; - case OEOW: - if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || - (sp < m->endp && *sp == '\n' && - (m->g->cflags®_NEWLINE)) || - (sp < m->endp && !ISWORD(*sp)) ) && - (sp > m->beginp && ISWORD(*(sp-1))) ) - { /* yes */ } - else - return(NULL); - break; - case O_QUEST: - break; - case OOR1: /* matches null but needs to skip */ - ss++; - s = m->g->strip[ss]; - do { - assert(OP(s) == OOR2); - ss += OPND(s); - } while (OP(s = m->g->strip[ss]) != O_CH); - /* note that the ss++ gets us past the O_CH */ - break; - default: /* have to make a choice */ - hard = 1; - break; - } - if (!hard) { /* that was it! */ - if (sp != stop) - return(NULL); - return(sp); - } - ss--; /* adjust for the for's final increment */ - - /* the hard stuff */ - AT("hard", sp, stop, ss, stopst); - s = m->g->strip[ss]; - switch (OP(s)) { - case OBACK_: /* the vilest depths */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - if (m->pmatch[i].rm_eo == -1) - return(NULL); - assert(m->pmatch[i].rm_so != -1); - len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; - assert(stop - m->beginp >= len); - if (sp > stop - len) - return(NULL); /* not enough left to match */ - ssp = m->offp + m->pmatch[i].rm_so; - if (memcmp(sp, ssp, len) != 0) - return(NULL); - while (m->g->strip[ss] != SOP(O_BACK, i)) - ss++; - return(backref(m, sp+len, stop, ss+1, stopst, lev)); - break; - case OQUEST_: /* to null or not */ - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); /* not */ - return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); - break; - case OPLUS_: - assert(m->lastpos != NULL); - assert(lev+1 <= m->g->nplus); - m->lastpos[lev+1] = sp; - return(backref(m, sp, stop, ss+1, stopst, lev+1)); - break; - case O_PLUS: - if (sp == m->lastpos[lev]) /* last pass matched null */ - return(backref(m, sp, stop, ss+1, stopst, lev-1)); - /* try another pass */ - m->lastpos[lev] = sp; - dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); - if (dp == NULL) - return(backref(m, sp, stop, ss+1, stopst, lev-1)); - else - return(dp); - break; - case OCH_: /* find the right one, if any */ - ssub = ss + 1; - esub = ss + OPND(s) - 1; - assert(OP(m->g->strip[esub]) == OOR1); - for (;;) { /* find first matching branch */ - dp = backref(m, sp, stop, ssub, esub, lev); - if (dp != NULL) - return(dp); - /* that one missed, try next one */ - if (OP(m->g->strip[esub]) == O_CH) - return(NULL); /* there is none */ - esub++; - assert(OP(m->g->strip[esub]) == OOR2); - ssub = esub + 1; - esub += OPND(m->g->strip[esub]); - if (OP(m->g->strip[esub]) == OOR2) - esub--; - else - assert(OP(m->g->strip[esub]) == O_CH); - } - break; - case OLPAREN: /* must undo assignment if rest fails */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - offsave = m->pmatch[i].rm_so; - m->pmatch[i].rm_so = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); - m->pmatch[i].rm_so = offsave; - return(NULL); - break; - case ORPAREN: /* must undo assignment if rest fails */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - offsave = m->pmatch[i].rm_eo; - m->pmatch[i].rm_eo = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); - m->pmatch[i].rm_eo = offsave; - return(NULL); - break; - default: /* uh oh */ - assert(nope); - break; - } - - /* "can't happen" */ - assert(nope); - /* NOTREACHED */ - return((char *)NULL); /* dummy */ -} - -/* - - fast - step through the string at top speed - == static char *fast(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* where tentative match ended, or NULL */ -fast(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register states st = m->st; - register states fresh = m->fresh; - register states tmp = m->tmp; - register char *p = start; - register int c = (start == m->beginp) ? OUT : *(start-1); - register int lastc; /* previous c */ - register int flagch; - register int i; - register char *coldp; /* last p after which no match was underway */ - - CLEAR(st); - SET1(st, startst); - st = step(m->g, startst, stopst, st, NOTHING, st); - ASSIGN(fresh, st); - SP("start", st, *p); - coldp = NULL; - for (;;) { - /* next character */ - lastc = c; - c = (p == m->endp) ? OUT : *p; - if (EQ(st, fresh)) - coldp = p; - - /* is there an EOL and/or BOL between lastc and c? */ - flagch = '\0'; - i = 0; - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || - (lastc == OUT && !(m->eflags®_NOTBOL)) ) { - flagch = BOL; - i = m->g->nbol; - } - if ( (c == '\n' && m->g->cflags®_NEWLINE) || - (c == OUT && !(m->eflags®_NOTEOL)) ) { - flagch = (flagch == BOL) ? BOLEOL : EOL; - i += m->g->neol; - } - if (i != 0) { - for (; i > 0; i--) - st = step(m->g, startst, stopst, st, flagch, st); - SP("boleol", st, c); - } - - /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { - flagch = BOW; - } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { - flagch = EOW; - } - if (flagch == BOW || flagch == EOW) { - st = step(m->g, startst, stopst, st, flagch, st); - SP("boweow", st, c); - } - - /* are we done? */ - if (ISSET(st, stopst) || p == stop) - break; /* NOTE BREAK OUT */ - - /* no, we must deal with this character */ - ASSIGN(tmp, st); - ASSIGN(st, fresh); - assert(c != OUT); - st = step(m->g, startst, stopst, tmp, c, st); - SP("aft", st, c); - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); - p++; - } - - assert(coldp != NULL); - m->coldp = coldp; - if (ISSET(st, stopst)) - return(p+1); - else - return(NULL); -} - -/* - - slow - step through the string more deliberately - == static char *slow(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* where it ended */ -slow(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register states st = m->st; - register states empty = m->empty; - register states tmp = m->tmp; - register char *p = start; - register int c = (start == m->beginp) ? OUT : *(start-1); - register int lastc; /* previous c */ - register int flagch; - register int i; - register char *matchp; /* last p at which a match ended */ - - AT("slow", start, stop, startst, stopst); - CLEAR(st); - SET1(st, startst); - SP("sstart", st, *p); - st = step(m->g, startst, stopst, st, NOTHING, st); - matchp = NULL; - for (;;) { - /* next character */ - lastc = c; - c = (p == m->endp) ? OUT : *p; - - /* is there an EOL and/or BOL between lastc and c? */ - flagch = '\0'; - i = 0; - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || - (lastc == OUT && !(m->eflags®_NOTBOL)) ) { - flagch = BOL; - i = m->g->nbol; - } - if ( (c == '\n' && m->g->cflags®_NEWLINE) || - (c == OUT && !(m->eflags®_NOTEOL)) ) { - flagch = (flagch == BOL) ? BOLEOL : EOL; - i += m->g->neol; - } - if (i != 0) { - for (; i > 0; i--) - st = step(m->g, startst, stopst, st, flagch, st); - SP("sboleol", st, c); - } - - /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { - flagch = BOW; - } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { - flagch = EOW; - } - if (flagch == BOW || flagch == EOW) { - st = step(m->g, startst, stopst, st, flagch, st); - SP("sboweow", st, c); - } - - /* are we done? */ - if (ISSET(st, stopst)) - matchp = p; - if (EQ(st, empty) || p == stop) - break; /* NOTE BREAK OUT */ - - /* no, we must deal with this character */ - ASSIGN(tmp, st); - ASSIGN(st, empty); - assert(c != OUT); - st = step(m->g, startst, stopst, tmp, c, st); - SP("saft", st, c); - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); - p++; - } - - return(matchp); -} - - -/* - - step - map set of states reachable before char to set reachable after - == static states step(register struct re_guts *g, sopno start, sopno stop, \ - == register states bef, int ch, register states aft); - == #define BOL (OUT+1) - == #define EOL (BOL+1) - == #define BOLEOL (BOL+2) - == #define NOTHING (BOL+3) - == #define BOW (BOL+4) - == #define EOW (BOL+5) - == #define CODEMAX (BOL+5) // highest code used - == #define NONCHAR(c) ((c) > CHAR_MAX) - == #define NNONCHAR (CODEMAX-CHAR_MAX) - */ -static states -step(g, start, stop, bef, ch, aft) -register struct re_guts *g; -sopno start; /* start state within strip */ -sopno stop; /* state after stop state within strip */ -register states bef; /* states reachable before */ -int ch; /* character or NONCHAR code */ -register states aft; /* states already known reachable after */ -{ - register cset *cs; - register sop s; - register sopno pc; - register onestate here; /* note, macros know this name */ - register sopno look; - register long i; - - for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { - s = g->strip[pc]; - switch (OP(s)) { - case OEND: - assert(pc == stop-1); - break; - case OCHAR: - /* only characters can match */ - assert(!NONCHAR(ch) || ch != (char)OPND(s)); - if (ch == (char)OPND(s)) - FWD(aft, bef, 1); - break; - case OBOL: - if (ch == BOL || ch == BOLEOL) - FWD(aft, bef, 1); - break; - case OEOL: - if (ch == EOL || ch == BOLEOL) - FWD(aft, bef, 1); - break; - case OBOW: - if (ch == BOW) - FWD(aft, bef, 1); - break; - case OEOW: - if (ch == EOW) - FWD(aft, bef, 1); - break; - case OANY: - if (!NONCHAR(ch)) - FWD(aft, bef, 1); - break; - case OANYOF: - cs = &g->sets[OPND(s)]; - if (!NONCHAR(ch) && CHIN(cs, ch)) - FWD(aft, bef, 1); - break; - case OBACK_: /* ignored here */ - case O_BACK: - FWD(aft, aft, 1); - break; - case OPLUS_: /* forward, this is just an empty */ - FWD(aft, aft, 1); - break; - case O_PLUS: /* both forward and back */ - FWD(aft, aft, 1); - i = ISSETBACK(aft, OPND(s)); - BACK(aft, aft, OPND(s)); - if (!i && ISSETBACK(aft, OPND(s))) { - /* oho, must reconsider loop body */ - pc -= OPND(s) + 1; - INIT(here, pc); - } - break; - case OQUEST_: /* two branches, both forward */ - FWD(aft, aft, 1); - FWD(aft, aft, OPND(s)); - break; - case O_QUEST: /* just an empty */ - FWD(aft, aft, 1); - break; - case OLPAREN: /* not significant here */ - case ORPAREN: - FWD(aft, aft, 1); - break; - case OCH_: /* mark the first two branches */ - FWD(aft, aft, 1); - assert(OP(g->strip[pc+OPND(s)]) == OOR2); - FWD(aft, aft, OPND(s)); - break; - case OOR1: /* done a branch, find the O_CH */ - if (ISSTATEIN(aft, here)) { - for (look = 1; - OP(s = g->strip[pc+look]) != O_CH; - look += OPND(s)) - assert(OP(s) == OOR2); - FWD(aft, aft, look); - } - break; - case OOR2: /* propagate OCH_'s marking */ - FWD(aft, aft, 1); - if (OP(g->strip[pc+OPND(s)]) != O_CH) { - assert(OP(g->strip[pc+OPND(s)]) == OOR2); - FWD(aft, aft, OPND(s)); - } - break; - case O_CH: /* just empty */ - FWD(aft, aft, 1); - break; - default: /* ooooops... */ - assert(nope); - break; - } - } - - return(aft); -} - -#undef matcher -#undef fast -#undef slow -#undef dissect -#undef backref -#undef step -#undef print -#undef at -#undef match - -/* now undo things */ -#undef states -#undef CLEAR -#undef SET0 -#undef SET1 -#undef ISSET -#undef ASSIGN -#undef EQ -#undef STATEVARS -#undef STATESETUP -#undef STATETEARDOWN -#undef SETUP -#undef onestate -#undef INIT -#undef INC -#undef ISSTATEIN -#undef FWD -#undef BACK -#undef ISSETBACK -#undef SNAMES - -/* macros for manipulating states, large version */ -#define states char * -#define CLEAR(v) memset(v, 0, m->g->nstates) -#define SET0(v, n) ((v)[n] = 0) -#define SET1(v, n) ((v)[n] = 1) -#define ISSET(v, n) ((v)[n]) -#define ASSIGN(d, s) memcpy(d, s, m->g->nstates) -#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0) -#define STATEVARS int vn; char *space -#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \ - if ((m)->space == NULL) return(REG_ESPACE); \ - (m)->vn = 0; } -#define STATETEARDOWN(m) { free((m)->space); } -#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates]) -#define onestate int -#define INIT(o, n) ((o) = (n)) -#define INC(o) ((o)++) -#define ISSTATEIN(v, o) ((v)[o]) -/* some abbreviations; note that some of these know variable names! */ -/* do "if I'm here, I can also be there" etc without branches */ -#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here]) -#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) -#define ISSETBACK(v, n) ((v)[here - (n)]) -/* function names */ -#define LNAMES /* flag */ - -/* - * The matching engine and friends. This file is #included by regexec.c - * after suitable #defines of a variety of macros used herein, so that - * different state representations can be used without duplicating masses - * of code. - */ - -#ifdef SNAMES -#define matcher smatcher -#define fast sfast -#define slow sslow -#define dissect sdissect -#define backref sbackref -#define step sstep -#define print sprint -#define at sat -#define match smat -#endif -#ifdef LNAMES -#define matcher lmatcher -#define fast lfast -#define slow lslow -#define dissect ldissect -#define backref lbackref -#define step lstep -#define print lprint -#define at lat -#define match lmat -#endif - -/* another structure passed up and down to avoid zillions of parameters */ -struct match { - struct re_guts *g; - int eflags; - regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ - char *offp; /* offsets work from here */ - char *beginp; /* start of string -- virtual NUL precedes */ - char *endp; /* end of string -- virtual NUL here */ - char *coldp; /* can be no match starting before here */ - char **lastpos; /* [nplus+1] */ - STATEVARS; - states st; /* current states */ - states fresh; /* states for a fresh start */ - states tmp; /* temporary */ - states empty; /* empty set of states */ -}; - -static int matcher(register struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); -static char *dissect(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *backref(register struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); -static char *fast(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static char *slow(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); -static states step(register struct re_guts *g, sopno start, sopno stop, register states bef, int ch, register states aft); -#define BOL (OUT+1) -#define EOL (BOL+1) -#define BOLEOL (BOL+2) -#define NOTHING (BOL+3) -#define BOW (BOL+4) -#define EOW (BOL+5) -#define CODEMAX (BOL+5) /* highest code used */ -#define NONCHAR(c) ((c) > CHAR_MAX) -#define NNONCHAR (CODEMAX-CHAR_MAX) -#define SP(t, s, c) /* nothing */ -#define AT(t, p1, p2, s1, s2) /* nothing */ -#define NOTE(s) /* nothing */ - -/* - - matcher - the actual matching engine - == static int matcher(register struct re_guts *g, char *string, \ - == size_t nmatch, regmatch_t pmatch[], int eflags); - */ -static int /* 0 success, REG_NOMATCH failure */ -matcher(g, string, nmatch, pmatch, eflags) -register struct re_guts *g; -char *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; -{ - register char *endp; - register int i; - struct match mv; - register struct match *m = &mv; - register char *dp; - const register sopno gf = g->firststate+1; /* +1 for OEND */ - const register sopno gl = g->laststate; - char *start; - char *stop; - - /* simplify the situation where possible */ - if (g->cflags®_NOSUB) - nmatch = 0; - if (eflags®_STARTEND) { - start = string + pmatch[0].rm_so; - stop = string + pmatch[0].rm_eo; - } else { - start = string; - stop = start + strlen(start); - } - if (stop < start) - return(REG_INVARG); - - /* prescreening; this does wonders for this rather slow code */ - if (g->must != NULL) { - for (dp = start; dp < stop; dp++) - if (*dp == g->must[0] && stop - dp >= g->mlen && - memcmp(dp, g->must, (size_t)g->mlen) == 0) - break; - if (dp == stop) /* we didn't find g->must */ - return(REG_NOMATCH); - } - - /* match struct setup */ - m->g = g; - m->eflags = eflags; - m->pmatch = NULL; - m->lastpos = NULL; - m->offp = string; - m->beginp = start; - m->endp = stop; - STATESETUP(m, 4); - SETUP(m->st); - SETUP(m->fresh); - SETUP(m->tmp); - SETUP(m->empty); - CLEAR(m->empty); - - /* this loop does only one repetition except for backrefs */ - for (;;) { - endp = fast(m, start, stop, gf, gl); - if (endp == NULL) { /* a miss */ - STATETEARDOWN(m); - return(REG_NOMATCH); - } - if (nmatch == 0 && !g->backrefs) - break; /* no further info needed */ - - /* where? */ - assert(m->coldp != NULL); - for (;;) { - NOTE("finding start"); - endp = slow(m, m->coldp, stop, gf, gl); - if (endp != NULL) - break; - assert(m->coldp < m->endp); - m->coldp++; - } - if (nmatch == 1 && !g->backrefs) - break; /* no further info needed */ - - /* oh my, he wants the subexpressions... */ - if (m->pmatch == NULL) - m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * - sizeof(regmatch_t)); - if (m->pmatch == NULL) { - STATETEARDOWN(m); - return(REG_ESPACE); - } - for (i = 1; i <= m->g->nsub; i++) - m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; - if (!g->backrefs && !(m->eflags®_BACKR)) { - NOTE("dissecting"); - dp = dissect(m, m->coldp, endp, gf, gl); - } else { - if (g->nplus > 0 && m->lastpos == NULL) - m->lastpos = (char **)malloc((g->nplus+1) * - sizeof(char *)); - if (g->nplus > 0 && m->lastpos == NULL) { - free(m->pmatch); - STATETEARDOWN(m); - return(REG_ESPACE); - } - NOTE("backref dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); - } - if (dp != NULL) - break; - - /* uh-oh... we couldn't find a subexpression-level match */ - assert(g->backrefs); /* must be back references doing it */ - assert(g->nplus == 0 || m->lastpos != NULL); - for (;;) { - if (dp != NULL || endp <= m->coldp) - break; /* defeat */ - NOTE("backoff"); - endp = slow(m, m->coldp, endp-1, gf, gl); - if (endp == NULL) - break; /* defeat */ - /* try it on a shorter possibility */ - NOTE("backoff dissect"); - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); - } - assert(dp == NULL || dp == endp); - if (dp != NULL) /* found a shorter one */ - break; - - /* despite initial appearances, there is no match here */ - NOTE("false alarm"); - start = m->coldp + 1; /* recycle starting later */ - assert(start <= stop); - } - - /* fill in the details if requested */ - if (nmatch > 0) { - pmatch[0].rm_so = m->coldp - m->offp; - pmatch[0].rm_eo = endp - m->offp; - } - if (nmatch > 1) { - assert(m->pmatch != NULL); - for (i = 1; i < nmatch; i++) - if (i <= m->g->nsub) - pmatch[i] = m->pmatch[i]; - else { - pmatch[i].rm_so = -1; - pmatch[i].rm_eo = -1; - } - } - - if (m->pmatch != NULL) - free((char *)m->pmatch); - if (m->lastpos != NULL) - free((char *)m->lastpos); - STATETEARDOWN(m); - return(0); -} - -/* - - dissect - figure out what matched what, no back references - == static char *dissect(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* == stop (success) always */ -dissect(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register int i; - register sopno ss; /* start sop of current subRE */ - register sopno es; /* end sop of current subRE */ - register char *sp; /* start of string matched by it */ - register char *stp; /* string matched by it cannot pass here */ - register char *rest; /* start of rest of string */ - register char *tail; /* string unmatched by rest of RE */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *sep; /* end of string matched by subsubRE */ - register char *oldssp; /* previous ssp */ - register char *dp; - - AT("diss", start, stop, startst, stopst); - sp = start; - for (ss = startst; ss < stopst; ss = es) { - /* identify end of subRE */ - es = ss; - switch (OP(m->g->strip[es])) { - case OPLUS_: - case OQUEST_: - es += OPND(m->g->strip[es]); - break; - case OCH_: - while (OP(m->g->strip[es]) != O_CH) - es += OPND(m->g->strip[es]); - break; - } - es++; - - /* figure out what it matched */ - switch (OP(m->g->strip[ss])) { - case OEND: - assert(nope); - break; - case OCHAR: - sp++; - break; - case OBOL: - case OEOL: - case OBOW: - case OEOW: - break; - case OANY: - case OANYOF: - sp++; - break; - case OBACK_: - case O_BACK: - assert(nope); - break; - /* cases where length of match is hard to find */ - case OQUEST_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = es - 1; - /* did innards match? */ - if (slow(m, sp, rest, ssub, esub) != NULL) { - dp = dissect(m, sp, rest, ssub, esub); - assert(dp == rest); - } else /* no */ - assert(sp == rest); - sp = rest; - break; - case OPLUS_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = es - 1; - ssp = sp; - oldssp = ssp; - for (;;) { /* find last match of innards */ - sep = slow(m, ssp, rest, ssub, esub); - if (sep == NULL || sep == ssp) - break; /* failed or matched null */ - oldssp = ssp; /* on to next try */ - ssp = sep; - } - if (sep == NULL) { - /* last successful match */ - sep = ssp; - ssp = oldssp; - } - assert(sep == rest); /* must exhaust substring */ - assert(slow(m, ssp, sep, ssub, esub) == rest); - dp = dissect(m, ssp, sep, ssub, esub); - assert(dp == sep); - sp = rest; - break; - case OCH_: - stp = stop; - for (;;) { - /* how long could this one be? */ - rest = slow(m, sp, stp, ss, es); - assert(rest != NULL); /* it did match */ - /* could the rest match the rest? */ - tail = slow(m, rest, stop, es, stopst); - if (tail == stop) - break; /* yes! */ - /* no -- try a shorter match for this one */ - stp = rest - 1; - assert(stp >= sp); /* it did work */ - } - ssub = ss + 1; - esub = ss + OPND(m->g->strip[ss]) - 1; - assert(OP(m->g->strip[esub]) == OOR1); - for (;;) { /* find first matching branch */ - if (slow(m, sp, rest, ssub, esub) == rest) - break; /* it matched all of it */ - /* that one missed, try next one */ - assert(OP(m->g->strip[esub]) == OOR1); - esub++; - assert(OP(m->g->strip[esub]) == OOR2); - ssub = esub + 1; - esub += OPND(m->g->strip[esub]); - if (OP(m->g->strip[esub]) == OOR2) - esub--; - else - assert(OP(m->g->strip[esub]) == O_CH); - } - dp = dissect(m, sp, rest, ssub, esub); - assert(dp == rest); - sp = rest; - break; - case O_PLUS: - case O_QUEST: - case OOR1: - case OOR2: - case O_CH: - assert(nope); - break; - case OLPAREN: - i = OPND(m->g->strip[ss]); - assert(0 < i && i <= m->g->nsub); - m->pmatch[i].rm_so = sp - m->offp; - break; - case ORPAREN: - i = OPND(m->g->strip[ss]); - assert(0 < i && i <= m->g->nsub); - m->pmatch[i].rm_eo = sp - m->offp; - break; - default: /* uh oh */ - assert(nope); - break; - } - } - - assert(sp == stop); - return(sp); -} - -/* - - backref - figure out what matched what, figuring in back references - == static char *backref(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst, sopno lev); - */ -static char * /* == stop (success) or NULL (failure) */ -backref(m, start, stop, startst, stopst, lev) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -sopno lev; /* PLUS nesting level */ -{ - register int i; - register sopno ss; /* start sop of current subRE */ - register char *sp; /* start of string matched by it */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register char *ssp; /* start of string matched by subsubRE */ - register char *dp; - register size_t len; - register int hard; - register sop s; - register regoff_t offsave; - register cset *cs; - - AT("back", start, stop, startst, stopst); - sp = start; - - /* get as far as we can with easy stuff */ - hard = 0; - for (ss = startst; !hard && ss < stopst; ss++) - switch (OP(s = m->g->strip[ss])) { - case OCHAR: - if (sp == stop || *sp++ != (char)OPND(s)) - return(NULL); - break; - case OANY: - if (sp == stop) - return(NULL); - sp++; - break; - case OANYOF: - cs = &m->g->sets[OPND(s)]; - if (sp == stop || !CHIN(cs, *sp++)) - return(NULL); - break; - case OBOL: - if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || - (sp < m->endp && *(sp-1) == '\n' && - (m->g->cflags®_NEWLINE)) ) - { /* yes */ } - else - return(NULL); - break; - case OEOL: - if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || - (sp < m->endp && *sp == '\n' && - (m->g->cflags®_NEWLINE)) ) - { /* yes */ } - else - return(NULL); - break; - case OBOW: - if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || - (sp < m->endp && *(sp-1) == '\n' && - (m->g->cflags®_NEWLINE)) || - (sp > m->beginp && - !ISWORD(*(sp-1))) ) && - (sp < m->endp && ISWORD(*sp)) ) - { /* yes */ } - else - return(NULL); - break; - case OEOW: - if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || - (sp < m->endp && *sp == '\n' && - (m->g->cflags®_NEWLINE)) || - (sp < m->endp && !ISWORD(*sp)) ) && - (sp > m->beginp && ISWORD(*(sp-1))) ) - { /* yes */ } - else - return(NULL); - break; - case O_QUEST: - break; - case OOR1: /* matches null but needs to skip */ - ss++; - s = m->g->strip[ss]; - do { - assert(OP(s) == OOR2); - ss += OPND(s); - } while (OP(s = m->g->strip[ss]) != O_CH); - /* note that the ss++ gets us past the O_CH */ - break; - default: /* have to make a choice */ - hard = 1; - break; - } - if (!hard) { /* that was it! */ - if (sp != stop) - return(NULL); - return(sp); - } - ss--; /* adjust for the for's final increment */ - - /* the hard stuff */ - AT("hard", sp, stop, ss, stopst); - s = m->g->strip[ss]; - switch (OP(s)) { - case OBACK_: /* the vilest depths */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - if (m->pmatch[i].rm_eo == -1) - return(NULL); - assert(m->pmatch[i].rm_so != -1); - len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; - assert(stop - m->beginp >= len); - if (sp > stop - len) - return(NULL); /* not enough left to match */ - ssp = m->offp + m->pmatch[i].rm_so; - if (memcmp(sp, ssp, len) != 0) - return(NULL); - while (m->g->strip[ss] != SOP(O_BACK, i)) - ss++; - return(backref(m, sp+len, stop, ss+1, stopst, lev)); - break; - case OQUEST_: /* to null or not */ - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); /* not */ - return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); - break; - case OPLUS_: - assert(m->lastpos != NULL); - assert(lev+1 <= m->g->nplus); - m->lastpos[lev+1] = sp; - return(backref(m, sp, stop, ss+1, stopst, lev+1)); - break; - case O_PLUS: - if (sp == m->lastpos[lev]) /* last pass matched null */ - return(backref(m, sp, stop, ss+1, stopst, lev-1)); - /* try another pass */ - m->lastpos[lev] = sp; - dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); - if (dp == NULL) - return(backref(m, sp, stop, ss+1, stopst, lev-1)); - else - return(dp); - break; - case OCH_: /* find the right one, if any */ - ssub = ss + 1; - esub = ss + OPND(s) - 1; - assert(OP(m->g->strip[esub]) == OOR1); - for (;;) { /* find first matching branch */ - dp = backref(m, sp, stop, ssub, esub, lev); - if (dp != NULL) - return(dp); - /* that one missed, try next one */ - if (OP(m->g->strip[esub]) == O_CH) - return(NULL); /* there is none */ - esub++; - assert(OP(m->g->strip[esub]) == OOR2); - ssub = esub + 1; - esub += OPND(m->g->strip[esub]); - if (OP(m->g->strip[esub]) == OOR2) - esub--; - else - assert(OP(m->g->strip[esub]) == O_CH); - } - break; - case OLPAREN: /* must undo assignment if rest fails */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - offsave = m->pmatch[i].rm_so; - m->pmatch[i].rm_so = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); - m->pmatch[i].rm_so = offsave; - return(NULL); - break; - case ORPAREN: /* must undo assignment if rest fails */ - i = OPND(s); - assert(0 < i && i <= m->g->nsub); - offsave = m->pmatch[i].rm_eo; - m->pmatch[i].rm_eo = sp - m->offp; - dp = backref(m, sp, stop, ss+1, stopst, lev); - if (dp != NULL) - return(dp); - m->pmatch[i].rm_eo = offsave; - return(NULL); - break; - default: /* uh oh */ - assert(nope); - break; - } - - /* "can't happen" */ - assert(nope); - /* NOTREACHED */ - return((char *)NULL); /* dummy */ -} - -/* - - fast - step through the string at top speed - == static char *fast(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* where tentative match ended, or NULL */ -fast(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register states st = m->st; - register states fresh = m->fresh; - register states tmp = m->tmp; - register char *p = start; - register int c = (start == m->beginp) ? OUT : *(start-1); - register int lastc; /* previous c */ - register int flagch; - register int i; - register char *coldp; /* last p after which no match was underway */ - - CLEAR(st); - SET1(st, startst); - st = step(m->g, startst, stopst, st, NOTHING, st); - ASSIGN(fresh, st); - SP("start", st, *p); - coldp = NULL; - for (;;) { - /* next character */ - lastc = c; - c = (p == m->endp) ? OUT : *p; - if (EQ(st, fresh)) - coldp = p; - - /* is there an EOL and/or BOL between lastc and c? */ - flagch = '\0'; - i = 0; - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || - (lastc == OUT && !(m->eflags®_NOTBOL)) ) { - flagch = BOL; - i = m->g->nbol; - } - if ( (c == '\n' && m->g->cflags®_NEWLINE) || - (c == OUT && !(m->eflags®_NOTEOL)) ) { - flagch = (flagch == BOL) ? BOLEOL : EOL; - i += m->g->neol; - } - if (i != 0) { - for (; i > 0; i--) - st = step(m->g, startst, stopst, st, flagch, st); - SP("boleol", st, c); - } - - /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { - flagch = BOW; - } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { - flagch = EOW; - } - if (flagch == BOW || flagch == EOW) { - st = step(m->g, startst, stopst, st, flagch, st); - SP("boweow", st, c); - } - - /* are we done? */ - if (ISSET(st, stopst) || p == stop) - break; /* NOTE BREAK OUT */ - - /* no, we must deal with this character */ - ASSIGN(tmp, st); - ASSIGN(st, fresh); - assert(c != OUT); - st = step(m->g, startst, stopst, tmp, c, st); - SP("aft", st, c); - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); - p++; - } - - assert(coldp != NULL); - m->coldp = coldp; - if (ISSET(st, stopst)) - return(p+1); - else - return(NULL); -} - -/* - - slow - step through the string more deliberately - == static char *slow(register struct match *m, char *start, \ - == char *stop, sopno startst, sopno stopst); - */ -static char * /* where it ended */ -slow(m, start, stop, startst, stopst) -register struct match *m; -char *start; -char *stop; -sopno startst; -sopno stopst; -{ - register states st = m->st; - register states empty = m->empty; - register states tmp = m->tmp; - register char *p = start; - register int c = (start == m->beginp) ? OUT : *(start-1); - register int lastc; /* previous c */ - register int flagch; - register int i; - register char *matchp; /* last p at which a match ended */ - - AT("slow", start, stop, startst, stopst); - CLEAR(st); - SET1(st, startst); - SP("sstart", st, *p); - st = step(m->g, startst, stopst, st, NOTHING, st); - matchp = NULL; - for (;;) { - /* next character */ - lastc = c; - c = (p == m->endp) ? OUT : *p; - - /* is there an EOL and/or BOL between lastc and c? */ - flagch = '\0'; - i = 0; - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || - (lastc == OUT && !(m->eflags®_NOTBOL)) ) { - flagch = BOL; - i = m->g->nbol; - } - if ( (c == '\n' && m->g->cflags®_NEWLINE) || - (c == OUT && !(m->eflags®_NOTEOL)) ) { - flagch = (flagch == BOL) ? BOLEOL : EOL; - i += m->g->neol; - } - if (i != 0) { - for (; i > 0; i--) - st = step(m->g, startst, stopst, st, flagch, st); - SP("sboleol", st, c); - } - - /* how about a word boundary? */ - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && - (c != OUT && ISWORD(c)) ) { - flagch = BOW; - } - if ( (lastc != OUT && ISWORD(lastc)) && - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { - flagch = EOW; - } - if (flagch == BOW || flagch == EOW) { - st = step(m->g, startst, stopst, st, flagch, st); - SP("sboweow", st, c); - } - - /* are we done? */ - if (ISSET(st, stopst)) - matchp = p; - if (EQ(st, empty) || p == stop) - break; /* NOTE BREAK OUT */ - - /* no, we must deal with this character */ - ASSIGN(tmp, st); - ASSIGN(st, empty); - assert(c != OUT); - st = step(m->g, startst, stopst, tmp, c, st); - SP("saft", st, c); - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); - p++; - } - - return(matchp); -} - - -static states -step(g, start, stop, bef, ch, aft) -register struct re_guts *g; -sopno start; /* start state within strip */ -sopno stop; /* state after stop state within strip */ -register states bef; /* states reachable before */ -int ch; /* character or NONCHAR code */ -register states aft; /* states already known reachable after */ -{ - register cset *cs; - register sop s; - register sopno pc; - register onestate here; /* note, macros know this name */ - register sopno look; - register long i; - - for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { - s = g->strip[pc]; - switch (OP(s)) { - case OEND: - assert(pc == stop-1); - break; - case OCHAR: - /* only characters can match */ - assert(!NONCHAR(ch) || ch != (char)OPND(s)); - if (ch == (char)OPND(s)) - FWD(aft, bef, 1); - break; - case OBOL: - if (ch == BOL || ch == BOLEOL) - FWD(aft, bef, 1); - break; - case OEOL: - if (ch == EOL || ch == BOLEOL) - FWD(aft, bef, 1); - break; - case OBOW: - if (ch == BOW) - FWD(aft, bef, 1); - break; - case OEOW: - if (ch == EOW) - FWD(aft, bef, 1); - break; - case OANY: - if (!NONCHAR(ch)) - FWD(aft, bef, 1); - break; - case OANYOF: - cs = &g->sets[OPND(s)]; - if (!NONCHAR(ch) && CHIN(cs, ch)) - FWD(aft, bef, 1); - break; - case OBACK_: /* ignored here */ - case O_BACK: - FWD(aft, aft, 1); - break; - case OPLUS_: /* forward, this is just an empty */ - FWD(aft, aft, 1); - break; - case O_PLUS: /* both forward and back */ - FWD(aft, aft, 1); - i = ISSETBACK(aft, OPND(s)); - BACK(aft, aft, OPND(s)); - if (!i && ISSETBACK(aft, OPND(s))) { - /* oho, must reconsider loop body */ - pc -= OPND(s) + 1; - INIT(here, pc); - } - break; - case OQUEST_: /* two branches, both forward */ - FWD(aft, aft, 1); - FWD(aft, aft, OPND(s)); - break; - case O_QUEST: /* just an empty */ - FWD(aft, aft, 1); - break; - case OLPAREN: /* not significant here */ - case ORPAREN: - FWD(aft, aft, 1); - break; - case OCH_: /* mark the first two branches */ - FWD(aft, aft, 1); - assert(OP(g->strip[pc+OPND(s)]) == OOR2); - FWD(aft, aft, OPND(s)); - break; - case OOR1: /* done a branch, find the O_CH */ - if (ISSTATEIN(aft, here)) { - for (look = 1; - OP(s = g->strip[pc+look]) != O_CH; - look += OPND(s)) - assert(OP(s) == OOR2); - FWD(aft, aft, look); - } - break; - case OOR2: /* propagate OCH_'s marking */ - FWD(aft, aft, 1); - if (OP(g->strip[pc+OPND(s)]) != O_CH) { - assert(OP(g->strip[pc+OPND(s)]) == OOR2); - FWD(aft, aft, OPND(s)); - } - break; - case O_CH: /* just empty */ - FWD(aft, aft, 1); - break; - default: /* ooooops... */ - assert(nope); - break; - } - } - - return(aft); -} - -#undef matcher -#undef fast -#undef slow -#undef dissect -#undef backref -#undef step -#undef print -#undef at -#undef match - -int /* 0 success, REG_NOMATCH failure */ -regexec(preg, string, nmatch, pmatch, eflags) -const regex_t *preg; -const char *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; -{ - register struct re_guts *g = preg->re_g; -#define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND)) - - if (preg->re_magic != MAGIC1 || g->magic != MAGIC2) - return(REG_BADPAT); - assert(!(g->iflags&BAD)); - if (g->iflags&BAD) /* backstop for no-debug case */ - return(REG_BADPAT); - eflags = GOODFLAGS(eflags); - - if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) - return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); - else - return(lmatcher(g, (char *)string, nmatch, pmatch, eflags)); -#undef GOODFLAGS -} -/* - - regfree - free everything - = extern void regfree(regex_t *); - */ -void -regfree(preg) -regex_t *preg; -{ - register struct re_guts *g; - - if (preg->re_magic != MAGIC1) /* oops */ - return; /* nice to complain, but hard */ - - g = preg->re_g; - if (g == NULL || g->magic != MAGIC2) /* oops again */ - return; - preg->re_magic = 0; /* mark it invalid */ - g->magic = 0; /* mark it invalid */ - - if (g->strip != NULL) - free((char *)g->strip); - if (g->sets != NULL) - free((char *)g->sets); - if (g->setbits != NULL) - free((char *)g->setbits); - if (g->must != NULL) - free(g->must); - free((char *)g); -} - -#ifdef WITH_MAIN -int main(int argc, char* argv[]){ - regex_t preg; - int i, s; - if(argc<2) return 1; - if (regcomp(&preg, argv[1], REG_NOSUB)) { - fprintf(stderr, "Failed to compile regex\n"); - return 2; - } - for (i = 2; i -#include - - -#define uchar unsigned char - -static const uchar perm1[56] = {57, 49, 41, 33, 25, 17, 9, - 1, 58, 50, 42, 34, 26, 18, - 10, 2, 59, 51, 43, 35, 27, - 19, 11, 3, 60, 52, 44, 36, - 63, 55, 47, 39, 31, 23, 15, - 7, 62, 54, 46, 38, 30, 22, - 14, 6, 61, 53, 45, 37, 29, - 21, 13, 5, 28, 20, 12, 4}; - -static const uchar perm2[48] = {14, 17, 11, 24, 1, 5, - 3, 28, 15, 6, 21, 10, - 23, 19, 12, 4, 26, 8, - 16, 7, 27, 20, 13, 2, - 41, 52, 31, 37, 47, 55, - 30, 40, 51, 45, 33, 48, - 44, 49, 39, 56, 34, 53, - 46, 42, 50, 36, 29, 32}; - -static const uchar perm3[64] = {58, 50, 42, 34, 26, 18, 10, 2, - 60, 52, 44, 36, 28, 20, 12, 4, - 62, 54, 46, 38, 30, 22, 14, 6, - 64, 56, 48, 40, 32, 24, 16, 8, - 57, 49, 41, 33, 25, 17, 9, 1, - 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, - 63, 55, 47, 39, 31, 23, 15, 7}; - -static const uchar perm4[48] = { 32, 1, 2, 3, 4, 5, - 4, 5, 6, 7, 8, 9, - 8, 9, 10, 11, 12, 13, - 12, 13, 14, 15, 16, 17, - 16, 17, 18, 19, 20, 21, - 20, 21, 22, 23, 24, 25, - 24, 25, 26, 27, 28, 29, - 28, 29, 30, 31, 32, 1}; - -static const uchar perm5[32] = { 16, 7, 20, 21, - 29, 12, 28, 17, - 1, 15, 23, 26, - 5, 18, 31, 10, - 2, 8, 24, 14, - 32, 27, 3, 9, - 19, 13, 30, 6, - 22, 11, 4, 25}; - - -static const uchar perm6[64] ={ 40, 8, 48, 16, 56, 24, 64, 32, - 39, 7, 47, 15, 55, 23, 63, 31, - 38, 6, 46, 14, 54, 22, 62, 30, - 37, 5, 45, 13, 53, 21, 61, 29, - 36, 4, 44, 12, 52, 20, 60, 28, - 35, 3, 43, 11, 51, 19, 59, 27, - 34, 2, 42, 10, 50, 18, 58, 26, - 33, 1, 41, 9, 49, 17, 57, 25}; - - -static const uchar sc[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; - -static const uchar sbox[8][4][16] = { - {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7}, - {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8}, - {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, - {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}}, - - {{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10}, - {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5}, - {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15}, - {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}}, - - {{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8}, - {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1}, - {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7}, - {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}}, - - {{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15}, - {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9}, - {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4}, - {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}}, - - {{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9}, - {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6}, - {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14}, - {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}}, - - {{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11}, - {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8}, - {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6}, - {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}}, - - {{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1}, - {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6}, - {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2}, - {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}}, - - {{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7}, - {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2}, - {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8}, - {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}}}; - -static void permute(char *out, const char *in, const uchar *p, int n) -{ - int i; - for (i=0;i>1; - key[1] = ((str[0]&0x01)<<6) | (str[1]>>2); - key[2] = ((str[1]&0x03)<<5) | (str[2]>>3); - key[3] = ((str[2]&0x07)<<4) | (str[3]>>4); - key[4] = ((str[3]&0x0F)<<3) | (str[4]>>5); - key[5] = ((str[4]&0x1F)<<2) | (str[5]>>6); - key[6] = ((str[5]&0x3F)<<1) | (str[6]>>7); - key[7] = str[6]&0x7F; - for (i=0;i<8;i++) { - key[i] = (key[i]<<1); - } -} - - -static void smbhash(unsigned char *out, const unsigned char *in, unsigned char *key) -{ - int i; - char outb[64]; - char inb[64]; - char keyb[64]; - unsigned char key2[8]; - - str_to_key(key, key2); - - for (i=0;i<64;i++) { - inb[i] = (in[i/8] & (1<<(7-(i%8)))) ? 1 : 0; - keyb[i] = (key2[i/8] & (1<<(7-(i%8)))) ? 1 : 0; - outb[i] = 0; - } - - dohash(outb, inb, keyb); - - for (i=0;i<8;i++) { - out[i] = 0; - } - - for (i=0;i<64;i++) { - if (outb[i]) - out[i/8] |= (1<<(7-(i%8))); - } -} - -/* - * Converts the password to uppercase, and creates the LM - * password hash. - */ -void lmpwdhash(const unsigned char *password,unsigned char *lmhash) -{ - int i; - unsigned char p14[14]; - static unsigned char sp8[8] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25}; - - memset(p14, 0, sizeof(p14)); - for (i = 0; i < 14 && password[i]; i++) { - p14[i] = toupper((int) password[i]); - } - - smbhash(lmhash, sp8, p14); - smbhash(lmhash+8, sp8, p14+7); -} - -/* - * Take the NT or LM password, and return the MSCHAP response - * - * The win_password MUST be exactly 16 bytes long. - */ -void mschap(const unsigned char *win_password, - const unsigned char *challenge, unsigned char *response) -{ - unsigned char p21[21]; - - memset(p21, 0, sizeof(p21)); - memcpy(p21, win_password, 16); - - smbhash(response, challenge, p21); - smbhash(response+8, challenge, p21+7); - smbhash(response+16, challenge, p21+14); -} diff --git a/src/log.c b/src/log.c index 85357f7..182c484 100644 --- a/src/log.c +++ b/src/log.c @@ -58,7 +58,7 @@ void logpush(struct logevent *evt); #define HAVESQL 0 #else #ifndef NORADIUS -int raddobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s); +int raddobuf(struct clientparam * param, char * buf, int bufsize, const char *s); void logradius(const char * buf, int len, struct LOGGER *logger); #define HAVERADIUS 1 #else @@ -67,7 +67,7 @@ void logradius(const char * buf, int len, struct LOGGER *logger); #ifndef NOODBC #define HAVESQL 1 static int sqlinit(struct LOGGER *logger); -static int sqldobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s); +static int sqldobuf(struct clientparam * param, char * buf, int bufsize, const char *s); static void sqllog(const char * buf, int len, struct LOGGER *logger); static void sqlrotate(struct LOGGER *logger); static void sqlclose(struct LOGGER *logger); @@ -87,7 +87,7 @@ static void syslogclose(struct LOGGER *logger); #endif static int stdloginit(struct LOGGER *logger); -static int stddobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s); +static int stddobuf(struct clientparam * param, char * buf, int bufsize, const char *s); static void stdlog(const char * buf, int len, struct LOGGER *logger); static void stdlogrotate(struct LOGGER *logger); static void stdlogclose(struct LOGGER *logger); @@ -346,7 +346,7 @@ static void delaydolog(struct logevent *evt){ } } -void dolog(struct clientparam * param, const unsigned char *s){ +void dolog(struct clientparam * param, const char *s){ static int init = 0; if(!param || !param->srv){ @@ -497,7 +497,7 @@ char months[12][4] = { "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; -unsigned char * dologname (unsigned char *buf, int bufsize, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t) { +char * dologname (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t) { struct tm *ts; ts = localtime(&t); @@ -538,7 +538,7 @@ unsigned char * dologname (unsigned char *buf, int bufsize, unsigned char *name return buf; } -int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format){ +int dobuf2(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format){ int i, j; int len; time_t sec; @@ -670,7 +670,7 @@ int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const u if(param->service < 15) { len = (conf.stringtable)? (int)strlen((char *)conf.stringtable[SERVICES + param->service]) : 0; if(len > 20) len = 20; - memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(unsigned char*)"-", (len)?len:1); + memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(char*)"-", (len)?len:1); i += (len)?len:1; } break; @@ -787,7 +787,7 @@ int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const u return i; } -int dobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec){ +int dobuf(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec){ struct tm* tm; int i; char * format; @@ -828,7 +828,7 @@ static int stdloginit(struct LOGGER *logger){ return 0; } -static int stddobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s){ +static int stddobuf(struct clientparam * param, char * buf, int bufsize, const char *s){ return dobuf(param, buf, bufsize, s, NULL); } @@ -1014,8 +1014,8 @@ static int sqlinit(struct LOGGER *logger){ return 0; } -static int sqldobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s){ - return dobuf(param, buf, bufsize, s, (unsigned char *)"\'"); +static int sqldobuf(struct clientparam * param, char * buf, int bufsize, const char *s){ + return dobuf(param, buf, bufsize, s, "\'"); } diff --git a/src/mycrypt.c b/src/mycrypt.c index c07725f..dd777d2 100644 --- a/src/mycrypt.c +++ b/src/mycrypt.c @@ -16,13 +16,13 @@ #endif -void tohex(unsigned char *in, unsigned char *out, int len); +void tohex(char *in, char *out, int len); -static unsigned char itoa64[] = +static char itoa64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; void -_crypt_to64(unsigned char *s, unsigned long v, int n) +_crypt_to64(char *s, unsigned long v, int n) { while (--n >= 0) { *s++ = itoa64[v&0x3f]; @@ -31,9 +31,9 @@ _crypt_to64(unsigned char *s, unsigned long v, int n) } -unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPassword, int ctohex) +char * ntpwdhash (char *szHash, const char *szPassword, int ctohex) { - unsigned char szUnicodePass[513]; + char szUnicodePass[513]; unsigned int nPasswordLen; MD4_CTX ctx; unsigned int i; @@ -61,14 +61,14 @@ unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPasswor } -unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsigned char *passwd){ +char * mycrypt(const char *pw, const char *salt, char *passwd){ - const unsigned char *ep; - if(salt[0] == '$' && salt[1] == '1' && salt[2] == '$' && (ep = (unsigned char *)strchr((char *)salt+3, '$'))) { - static unsigned char *magic = (unsigned char *)"$1$"; - unsigned char *p; - const unsigned char *sp; - unsigned char final[MD5_SIZE]; + const char *ep; + if(salt[0] == '$' && salt[1] == '1' && salt[2] == '$' && (ep = (char *)strchr((char *)salt+3, '$'))) { + static char *magic = (char *)"$1$"; + char *p; + const char *sp; + char final[MD5_SIZE]; int sl,pl,i; MD5_CTX ctx,ctx1; unsigned long l; @@ -90,7 +90,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi /* Then the raw salt */ MD5Update(&ctx,sp,sl); - /* Then just as many unsigned characters of the MD5(pw,salt,pw) */ + /* Then just as many characters of the MD5(pw,salt,pw) */ MD5Init(&ctx1); MD5Update(&ctx1,pw,strlen((char *)pw)); MD5Update(&ctx1,sp,sl); @@ -170,7 +170,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi #include int main(int argc, char* argv[]){ - unsigned char buf[1024]; + char buf[1024]; unsigned i; if(argc < 2 || argc > 3) { fprintf(stderr, "usage: \n" @@ -185,13 +185,13 @@ int main(int argc, char* argv[]){ return 1; } if(argc == 2) { - printf("NT:%s\n", ntpwdhash(buf, (unsigned char *)argv[1], 1)); + printf("NT:%s\n", ntpwdhash(buf, (char *)argv[1], 1)); } else { i = (int)strlen((char *)argv[1]); if (i > 64) argv[1][64] = 0; sprintf((char *)buf, "$1$%s$", argv[1]); - printf("CR:%s\n", mycrypt((unsigned char *)argv[2], buf, buf+256)); + printf("CR:%s\n", mycrypt(argv[2], buf, buf+256)); } return 0; } diff --git a/src/ntlm.c b/src/ntlm.c deleted file mode 100644 index 21bd0da..0000000 --- a/src/ntlm.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - 3APA3A simpliest proxy server - (c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru> - - please read License Agreement - -*/ - -#include "proxy.h" -struct ntlmchal { - unsigned char sig[8]; - unsigned char messtype[4]; - unsigned char dom_len[2]; - unsigned char dom_max_len[2]; - unsigned char dom_offset[4]; - unsigned char flags[4]; - unsigned char challenge[8]; - unsigned char reserved[8]; - unsigned char addr_len[2]; - unsigned char addr_max_len[2]; - unsigned char addr_offset[4]; - unsigned char data[1]; -}; - -struct ntlmreq { - unsigned char sig[8]; - unsigned char messtype[4]; - unsigned char flags[4]; - unsigned char dom_len[2]; - unsigned char dom_max_len[2]; - unsigned char dom_offset[4]; - unsigned char pad1[2]; - unsigned char host_len[2]; - unsigned char host_max_len[2]; - unsigned char host_offset[4]; - unsigned char pad2[2]; - unsigned char data[1]; -}; - -int text2unicode(const char * text, char * buf, int buflen){ - int count = 0; - buflen = ((buflen>>1)<<1); - if(!text || !buflen) return 0; - do { - buf[count++] = toupper(*text++); - buf[count++] = '\0'; - } while (*text && count < buflen); - return count; -} - -void unicode2text(const char *unicode, char * buf, int len){ - int i; - if(!unicode || !len) return; - for(i=0; isig, "NTLMSSP", 8); - chal->messtype[0] = 2; - gethostname(hostname, 128); - hostname[15] = 0; - len = (((int)strlen(hostname)) << 1); - chal->dom_len[0] = len; - chal->dom_max_len[0] = len; - chal->dom_offset[0] = (unsigned char)((unsigned char *)chal->data - (unsigned char *)chal); - chal->flags[0] = 0x03; - chal->flags[1] = 0x82; - chal->flags[2] = 0x81; - chal->flags[3] = 0xA0; - text2unicode(hostname, (char *)chal->data, 64); - time((time_t *)challenge); - memcpy(challenge+4, SAADDR(¶m->sincr), 4); - challenge[1]^=*SAPORT(¶m->sincr); - for(i = 0; i < 8; i++) challenge[i] ^= myrand(challenge, 8); - memcpy(chal->challenge, challenge, 8); - en64((unsigned char *)tmpbuf, (unsigned char *)buf, (int)((unsigned char *)chal->data - (unsigned char *)chal) + len); -} diff --git a/src/plugins.c b/src/plugins.c index 2927f28..b01e438 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -11,11 +11,11 @@ unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout); void trafcountfunc(struct clientparam *param); int checkACL(struct clientparam * param); -void nametohash(const unsigned char * name, unsigned char *hash); -unsigned hashindex(const unsigned char* hash); -void decodeurl(unsigned char *s, int allowcr); -int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned char ** buff, int *inbuf, int *bufsize); -struct ace * make_ace (int argc, unsigned char ** argv); +void nametohash(const char * name, char *hash); +unsigned hashindex(const char* hash); +void decodeurl(char *s, int allowcr); +int parsestr (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize); +struct ace * make_ace (int argc, char ** argv); extern char * proxy_stringtable[]; extern char * admin_stringtable[]; extern struct schedule * schedule; diff --git a/src/plugins/FilePlugin/FilePlugin.c b/src/plugins/FilePlugin/FilePlugin.c index ad9dbbe..045c370 100644 --- a/src/plugins/FilePlugin/FilePlugin.c +++ b/src/plugins/FilePlugin/FilePlugin.c @@ -760,7 +760,7 @@ static FILTER_ACTION fp_client(void *fo, struct clientparam * param, void** fc){ return CONTINUE; } -static FILTER_ACTION fp_request(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +static FILTER_ACTION fp_request(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ if(fc && (param->service == S_PROXY)){ if(FC->state) { closefiles(FC); @@ -776,7 +776,7 @@ static FILTER_ACTION fp_request(void *fc, struct clientparam * param, unsigned c return CONTINUE; } -static FILTER_ACTION fp_hcli(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +static FILTER_ACTION fp_hcli(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ if(fc && param->service == S_SMTPP) { processcallbacks(FC, FP_CALLONREQUEST, *buf_p + offset, *length_p - offset); if(FC->what & FP_REJECT) return REJECT; @@ -792,7 +792,7 @@ static FILTER_ACTION fp_hcli(void *fc, struct clientparam * param, unsigned char return CONTINUE; } -static FILTER_ACTION fp_hsrv(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +static FILTER_ACTION fp_hsrv(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ if(fc && param->service == S_PROXY && (FC->state == GOT_HTTP_REQUEST || FC->state == GOT_HTTP_CLI_HDR || FC->state == GOT_HTTP_CLIDATA)){ if(FC->what & FP_SRVHEADER) initserverfile(FC); FC->state = GOT_HTTP_SRV_HDR; @@ -801,7 +801,7 @@ static FILTER_ACTION fp_hsrv(void *fc, struct clientparam * param, unsigned char return CONTINUE; } -static FILTER_ACTION fp_dcli(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +static FILTER_ACTION fp_dcli(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ if(fc && FC->state == GOT_HTTP_REQUEST){ FC->state = GOT_HTTP_CLI_HDR2; } @@ -809,7 +809,7 @@ static FILTER_ACTION fp_dcli(void *fc, struct clientparam * param, unsigned char } -static FILTER_ACTION fp_dsrv(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +static FILTER_ACTION fp_dsrv(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ if(fc && (FC->state == GOT_HTTP_REQUEST || FC->state == GOT_HTTP_CLI_HDR || FC->state == GOT_HTTP_CLIDATA || FC->state == GOT_HTTP_CLIDATA || FC->state == GOT_HTTP_SRV_HDR)){ FC->state = GOT_HTTP_SRV_HDR2; } @@ -846,7 +846,7 @@ static struct symbol fp_symbols[] = { {NULL, "fp_stringtable", (void*) fp_stringtable} }; -static int h_cachedir(int argc, unsigned char **argv){ +static int h_cachedir(int argc, char **argv){ char * dirp; size_t len; @@ -866,7 +866,7 @@ static int h_cachedir(int argc, unsigned char **argv){ return 0; } -static int h_preview(int argc, unsigned char **argv){ +static int h_preview(int argc, char **argv){ preview = atoi(argv[1]); return 0; } diff --git a/src/plugins/LdapPlugin/getldapuser.c b/src/plugins/LdapPlugin/getldapuser.c index e5e0904..a509e8a 100644 --- a/src/plugins/LdapPlugin/getldapuser.c +++ b/src/plugins/LdapPlugin/getldapuser.c @@ -27,7 +27,7 @@ main(int argc, char *argv[]) char *attrs[] = { NULL, NULL }; int i, rc = -1; int lderrno; - unsigned char tmpbuf[1000]; + char tmpbuf[1000]; if ( argc < 6 ) { diff --git a/src/plugins/LdapPlugin/ldapauth.c b/src/plugins/LdapPlugin/ldapauth.c index c6c177a..15ec985 100644 --- a/src/plugins/LdapPlugin/ldapauth.c +++ b/src/plugins/LdapPlugin/ldapauth.c @@ -22,7 +22,7 @@ static struct commands ldap_trafgroup_handler; static struct commands ldap_attrsgroup_handler; static struct commands ldap_dircount_handler; -static void (*dolog)(struct clientparam * param, const unsigned char *s); +static void (*ldolog)(struct clientparam * param, const char *s); static char *attrs[] = { NULL, NULL}; @@ -61,7 +61,7 @@ int savecounters(void) struct trafcount *tcd; struct counter_record wcounter; FILE *f; - unsigned char *tmpbuf,pat_file[]="%s%s.lc"; + char *tmpbuf,pat_file[]="%s%s.lc"; /* timetoexit !=0 - áóäåì çàâåðøàòüñÿ.*/ @@ -112,7 +112,7 @@ static int ldapfunc(struct clientparam *param) ld = ldap_init( ldap_serv, 389 ); if ( ld == NULL ) { - dolog(param,"Error ldap_init: No init lib ldap"); + ldolog(param,"Error ldap_init: No init lib ldap"); /*ldap_perror( ld, "Error ldap_init" ); */ return 7; } @@ -136,7 +136,7 @@ static int ldapfunc(struct clientparam *param) if ( rc != LDAP_SUCCESS ) { - dolog(param,"Error ldap_bind: No connect ldap catalog"); + ldolog(param,"Error ldap_bind: No connect ldap catalog"); ldap_unbind_s(ld); return 7; } @@ -147,7 +147,7 @@ static int ldapfunc(struct clientparam *param) if ( ld == NULL ) { - dolog(param,"Error ldap_init: No init lib ldap"); + ldolog(param,"Error ldap_init: No init lib ldap"); /*ldap_perror( ld, "Error ldap_init" ); */ return 7; } @@ -156,7 +156,7 @@ static int ldapfunc(struct clientparam *param) if ( rc != LDAP_SUCCESS ) { - dolog(param, "Error ldap_bind: Not authorize in ldap\ + ldolog(param, "Error ldap_bind: Not authorize in ldap\ catalog, checked option \'ldapconnect\' "); ldap_unbind_s(ld); return 7; @@ -187,7 +187,7 @@ static int ldapfunc(struct clientparam *param) /* -------------------------------------------------------------------------- handle command ldapserv */ -int h_ldapconnect(int argc, unsigned char ** argv) +int h_ldapconnect(int argc, char ** argv) { LDAP *ld = NULL; @@ -216,7 +216,7 @@ int h_ldapconnect(int argc, unsigned char ** argv) } /* -------------------------------------------------------------------------- handle command ldapaccess */ -int h_access(int argc, unsigned char ** argv) +int h_access(int argc, char ** argv) { if (argc < 1) { @@ -229,7 +229,7 @@ int h_access(int argc, unsigned char ** argv) /* -------------------------------------------------------------------------- handle command ldapsbase searching base */ -int h_sbase(int argc, unsigned char ** argv) +int h_sbase(int argc, char ** argv) { if (argc < 1) { @@ -241,7 +241,7 @@ int h_sbase(int argc, unsigned char ** argv) } /* -------------------------------------------------------------------------- handle command ldapuserenv */ -int h_userenv(int argc, unsigned char ** argv) +int h_userenv(int argc, char ** argv) { if (argc < 1) { @@ -253,7 +253,7 @@ int h_userenv(int argc, unsigned char ** argv) } /* -------------------------------------------------------------------------- handle command ldaptrafgroup */ -int h_trafgroup(int argc, unsigned char ** argv) +int h_trafgroup(int argc, char ** argv) { struct trafcount *newtrafcount; struct bandlim *newbandlim; @@ -418,7 +418,7 @@ int h_trafgroup(int argc, unsigned char ** argv) } /* -------------------------------------------------------------------------- handle command ldapattrsgroup */ -int h_attrsgroup(int argc, unsigned char ** argv) +int h_attrsgroup(int argc, char ** argv) { if (argc < 1) { @@ -435,7 +435,7 @@ int h_attrsgroup(int argc, unsigned char ** argv) } /* -------------------------------------------------------------------------- handle command ldapdircount */ -int h_dircount(int argc, unsigned char ** argv) +int h_dircount(int argc, char ** argv) { if (argc < 1) { @@ -476,7 +476,7 @@ PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, } - dolog=pluginlink->findbyname("dolog"); + ldolog=pluginlink->findbyname("dolog"); already_loaded = 1; diff --git a/src/plugins/PCREPlugin/pcre_plugin.c b/src/plugins/PCREPlugin/pcre_plugin.c index 65a63aa..3651cfd 100644 --- a/src/plugins/PCREPlugin/pcre_plugin.c +++ b/src/plugins/PCREPlugin/pcre_plugin.c @@ -123,7 +123,7 @@ static FILTER_ACTION pcre_filter_client(void *fo, struct clientparam * param, vo return (res)? CONTINUE:PASS; } -static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ int ovector[48]; int count = 0; struct ace *acl; @@ -195,7 +195,7 @@ static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, uns } memcpy(newbuf, *buf_p, ovector[0]); pl->freefunc(*buf_p); - *buf_p = (unsigned char *)newbuf; + *buf_p = (char *)newbuf; *bufsize_p = ovector[0] + replen + 1; } memcpy(*buf_p + ovector[0], tmpbuf, replen); @@ -219,7 +219,7 @@ static void pcre_filter_close(void *fo){ pcre_data_free((struct pcre_filter_data *)fo); } -static int h_pcre(int argc, unsigned char **argv){ +static int h_pcre(int argc, char **argv){ int action = 0; pcre *re = NULL; struct ace *acl; @@ -317,7 +317,7 @@ static int h_pcre(int argc, unsigned char **argv){ return 0; } -static int h_pcre_extend(int argc, unsigned char **argv){ +static int h_pcre_extend(int argc, char **argv){ struct ace *acl; if(!pcre_last_filter || !pcre_last_filter->data) return 1; acl = ((struct pcre_filter_data *)pcre_last_filter->data)->acl; @@ -328,7 +328,7 @@ static int h_pcre_extend(int argc, unsigned char **argv){ return 0; } -static int h_pcre_options(int argc, unsigned char **argv){ +static int h_pcre_options(int argc, char **argv){ int i,j; pcre_options = 0; diff --git a/src/plugins/PamAuth/pamauth.c b/src/plugins/PamAuth/pamauth.c index 890beb1..22c127b 100644 --- a/src/plugins/PamAuth/pamauth.c +++ b/src/plugins/PamAuth/pamauth.c @@ -20,7 +20,7 @@ static struct auth pamauth; #ifdef USERCASE static int usercaselow = 0; #endif -static unsigned char *service=NULL; +static char *service=NULL; static struct pluginlink * pl; @@ -125,7 +125,7 @@ static int pamfunc(struct clientparam *param) /*------------------------------- MAIN -------------------------------------- start plugin init */ -PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, int argc, unsigned char** argv) +PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, int argc, char** argv) { diff --git a/src/plugins/SSLPlugin/my_ssl.c b/src/plugins/SSLPlugin/my_ssl.c index a82eff1..f6564da 100644 --- a/src/plugins/SSLPlugin/my_ssl.c +++ b/src/plugins/SSLPlugin/my_ssl.c @@ -47,7 +47,7 @@ static char hexMap[] = { static BIO *bio_err=NULL; -static size_t bin2hex (const unsigned char* bin, size_t bin_length, char* str, size_t str_length) +static size_t bin2hex (const char* bin, size_t bin_length, char* str, size_t str_length) { char *p; size_t i; @@ -111,9 +111,9 @@ SSL_CERT ssl_copy_cert(SSL_CERT cert) EVP_PKEY *pk = NULL; RSA *rsa = NULL; - unsigned char p1[] = "RU"; - unsigned char p2[] = "3proxy"; - unsigned char p3[] = "3proxy CA"; + char p1[] = "RU"; + char p2[] = "3proxy"; + char p3[] = "3proxy CA"; char hash_name_sha1[sizeof(src_cert->sha1_hash)*2 + 1]; char cache_name[200]; diff --git a/src/plugins/SSLPlugin/ssl_plugin.c b/src/plugins/SSLPlugin/ssl_plugin.c index 363e95e..f32ef20 100644 --- a/src/plugins/SSLPlugin/ssl_plugin.c +++ b/src/plugins/SSLPlugin/ssl_plugin.c @@ -28,7 +28,7 @@ extern "C" { #endif PROXYFUNC tcppmfunc, proxyfunc, smtppfunc, ftpprfunc; -static void (*pdolog)(struct clientparam * param, const unsigned char *s); +static void (*pdolog)(struct clientparam * param, const char *s); static struct pluginlink * pl; @@ -239,25 +239,25 @@ int dossl(struct clientparam* param, SSL_CONN* ServerConnp, SSL_CONN* ClientConn ServerConn = ssl_handshake_to_server(param->remsock, (char *)param->hostname, &ServerCert, &errSSL); if ( ServerConn == NULL || ServerCert == NULL ) { param->res = 8011; - pdolog(param, (unsigned char *)"SSL handshake to server failed"); - if(ServerConn == NULL) pdolog(param, (unsigned char *)"ServerConn is NULL"); - if(ServerCert == NULL) pdolog(param, (unsigned char *)"ServerCert is NULL"); - if(errSSL)pdolog(param, (unsigned char *)errSSL); + pdolog(param, (char *)"SSL handshake to server failed"); + if(ServerConn == NULL) pdolog(param, (char *)"ServerConn is NULL"); + if(ServerCert == NULL) pdolog(param, (char *)"ServerCert is NULL"); + if(errSSL)pdolog(param, (char *)errSSL); return 1; } FakeCert = ssl_copy_cert(ServerCert); if ( FakeCert == NULL ) { param->res = 8012; _ssl_cert_free(ServerCert); - pdolog(param, (unsigned char *)"Failed to create certificate copy"); + pdolog(param, (char *)"Failed to create certificate copy"); ssl_conn_free(ServerConn); return 2; } ClientConn = ssl_handshake_to_client(param->clisock, FakeCert, &errSSL); if ( ClientConn == NULL ) { param->res = 8012; - pdolog(param, (unsigned char *)"Handshake to client failed"); - if(errSSL)pdolog(param, (unsigned char *)errSSL); + pdolog(param, (char *)"Handshake to client failed"); + if(errSSL)pdolog(param, (char *)errSSL); _ssl_cert_free(ServerCert); _ssl_cert_free(FakeCert); ssl_conn_free(ServerConn); @@ -329,7 +329,7 @@ static struct filter ssl_filter = { int mitm = 0; int ssl_inited = 0; -static int h_mitm(int argc, unsigned char **argv){ +static int h_mitm(int argc, char **argv){ if(!ssl_inited) { ssl_init(); ssl_inited = 1; @@ -342,7 +342,7 @@ static int h_mitm(int argc, unsigned char **argv){ return 0; } -static int h_nomitm(int argc, unsigned char **argv){ +static int h_nomitm(int argc, char **argv){ struct filter * sf; if(!(mitm&1)) return 1; if(mitm) usleep(100*SLEEPTIME); @@ -357,7 +357,7 @@ static int h_nomitm(int argc, unsigned char **argv){ return 0; } -static int h_certpath(int argc, unsigned char **argv){ +static int h_certpath(int argc, char **argv){ size_t len; len = strlen(argv[1]); if(!len || (argv[1][len - 1] != '/' && argv[1][len - 1] != '\\')) return 1; diff --git a/src/plugins/TrafficPlugin/TrafficPlugin.c b/src/plugins/TrafficPlugin/TrafficPlugin.c index 18fa8f1..a087776 100644 --- a/src/plugins/TrafficPlugin/TrafficPlugin.c +++ b/src/plugins/TrafficPlugin/TrafficPlugin.c @@ -26,7 +26,7 @@ extern "C" { int DBGLEVEL = 0; int already_loaded = 0; -typedef int (* handler)(int argc, unsigned char ** argv); +typedef int (* handler)(int argc, char ** argv); struct extparam * sconfp; struct commands * scommandhandlers; @@ -79,7 +79,7 @@ static void killtrafcorrect() { } struct commands trafcorrect_handler; -int h_trafcorrect(int argc, unsigned char ** argv) { +int h_trafcorrect(int argc, char ** argv) { if (argc < 2) { if(DBGLEVEL == 1)fprintf(stdout, "See documentation of traffic correct plugin.\n"); return 1; diff --git a/src/plugins/TransparentPlugin/transparent_plugin.c b/src/plugins/TransparentPlugin/transparent_plugin.c index c1d28ef..6ae871e 100644 --- a/src/plugins/TransparentPlugin/transparent_plugin.c +++ b/src/plugins/TransparentPlugin/transparent_plugin.c @@ -85,12 +85,12 @@ static struct filter transparent_filter = { transparent_filter_close }; -static int h_transparent(int argc, unsigned char **argv){ +static int h_transparent(int argc, char **argv){ transparent_filter.filter_open = transparent_filter_open; return 0; } -static int h_notransparent(int argc, unsigned char **argv){ +static int h_notransparent(int argc, char **argv){ transparent_filter.filter_open = NULL; return 0; } diff --git a/src/plugins/utf8tocp1251/utf8tocp1251.c b/src/plugins/utf8tocp1251/utf8tocp1251.c index 412c927..f47df77 100644 --- a/src/plugins/utf8tocp1251/utf8tocp1251.c +++ b/src/plugins/utf8tocp1251/utf8tocp1251.c @@ -22,17 +22,17 @@ static struct auth alwaysauth; extern "C" { #endif -unsigned char * conv_utf8_to_cp1251(unsigned char *s){ - int i, j=0, n=(int)strlen((char *)s); - int byte2 = 0; - int c1, new_c1, new_c2, new_i; +char * conv_utf8_to_cp1251(char *s){ + unsigned i, j=0, n=(int)strlen((char *)s); + unsigned byte2 = 0; + unsigned c1, new_c1, new_c2, new_i; for(i = 0; i < n; i++){ - if(byte2 && s[i]>=128 && s[i]<=192){ + if(byte2 && ((unsigned)s[i])>=128 && ((unsigned)s[i])<=192){ new_c2=(c1&3)*64+(s[i]&63); new_c1=(c1>>2)&5; new_i=(new_c1*256)+new_c2; - if(new_i == 1025) s[j++] = 168; - else if (new_i==1105) s[j++] = 184; + if(new_i == 1025) s[j++] = (char)(unsigned char)168; + else if (new_i==1105) s[j++] = (char)(unsigned char)184; else if (new_i < (192 + 848) || new_i > (255 + 848)){ return s; } @@ -46,7 +46,7 @@ unsigned char * conv_utf8_to_cp1251(unsigned char *s){ c1 = s[i]; byte2 = 1; } - else if(s[i] < 128) s[j++] = s[i]; + else if(((unsigned)s[i]) < 128) s[j++] = s[i]; else return s; } s[j] = 0; diff --git a/src/pop3p.c b/src/pop3p.c index 4782ffb..71a3c34 100644 --- a/src/pop3p.c +++ b/src/pop3p.c @@ -12,23 +12,23 @@ void * pop3pchild(struct clientparam* param) { int i=0, res; - unsigned char buf[320]; - unsigned char *se; + char buf[320]; + char *se; - if(socksend(param->clisock, (unsigned char *)"+OK Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);} + if(socksend(param->clisock, (char *)"+OK Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);} i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]); while(i > 4 && strncasecmp((char *)buf, "USER", 4)){ if(!strncasecmp((char *)buf, "QUIT", 4)){ - socksend(param->clisock, (unsigned char *)"+OK\r\n", 5,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"+OK\r\n", 5,conf.timeouts[STRING_S]); RETURN(0); } - socksend(param->clisock, (unsigned char *)"-ERR need USER first\r\n", 22, conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"-ERR need USER first\r\n", 22, conf.timeouts[STRING_S]); i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]); } if(i<6) {RETURN(612);} buf[i] = 0; - if ((se=(unsigned char *)strchr((char *)buf, '\r'))) *se = 0; + if ((se=(char *)strchr((char *)buf, '\r'))) *se = 0; if (strncasecmp((char *)buf, "USER ", 5)){RETURN (614);} if(parseconnusername((char *)buf +5, param, 0, 110)){RETURN(615);} param->operation = CONNECT; @@ -38,9 +38,9 @@ void * pop3pchild(struct clientparam* param) { if( i < 3 ) {RETURN(621);} buf[i] = 0; if(strncasecmp((char *)buf, "+OK", 3)||!strncasecmp((char *)buf+4, "PROXY", 5)){RETURN(622);} - if( socksend(param->remsock, (unsigned char *)"USER ", 5, conf.timeouts[STRING_S])!= 5 || + if( socksend(param->remsock, (char *)"USER ", 5, conf.timeouts[STRING_S])!= 5 || socksend(param->remsock, param->extusername, (int)strlen((char *)param->extusername), conf.timeouts[STRING_S]) <= 0 || - socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S])!=2) + socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S])!=2) {RETURN(623);} param->statscli64 += (uint64_t)(strlen((char *)param->extusername) + 7); param->nwrites++; @@ -53,7 +53,7 @@ CLEANRET: } else dolog(param, NULL); if(param->clisock != INVALID_SOCKET) { - if ((param->res > 0 && param->res < 100) || (param->res > 611 && param->res <700)) socksend(param->clisock, (unsigned char *)"-ERR\r\n", 6,conf.timeouts[STRING_S]); + if ((param->res > 0 && param->res < 100) || (param->res > 611 && param->res <700)) socksend(param->clisock, (char *)"-ERR\r\n", 6,conf.timeouts[STRING_S]); } freeparam(param); return (NULL); diff --git a/src/proxy.c b/src/proxy.c index d3c643c..77db6ba 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -89,9 +89,6 @@ char * proxy_stringtable[] = { "

403 Access Denied

Access control list denies you to access this resource\r\n", /* 12*/ "HTTP/1.0 407 Proxy Authentication Required\r\n" -#ifndef NOCRYPT - "Proxy-Authenticate: NTLM\r\n" -#endif "Proxy-Authenticate: Basic realm=\"proxy\"\r\n" "Connection: close\r\n" "Content-type: text/html; charset=utf-8\r\n" @@ -99,10 +96,7 @@ char * proxy_stringtable[] = { "407 Proxy Authentication Required\r\n" "

407 Proxy Authentication Required

Access to requested resource disallowed by administrator or you need valid username/password to use this resource

\r\n", -/* 13*/ "HTTP/1.0 407 Proxy Authentication Required\r\n" - "Connection: keep-alive\r\n" - "Content-Length: 0\r\n" - "Proxy-Authenticate: NTLM ", +/* 13*/ "", /* 14*/ "HTTP/1.0 403 Forbidden\r\n" "Connection: close\r\n" @@ -152,11 +146,11 @@ static void logurl(struct clientparam * param, char * buf, char * req, int ftp){ strcpy(se, sb); } } - if(param->res != 555 && param->res != 508)dolog(param, (unsigned char *)(req?buf:NULL)); + if(param->res != 555 && param->res != 508)dolog(param, (char *)(req?buf:NULL)); } -void decodeurl(unsigned char *s, int allowcr){ - unsigned char *d = s; +void decodeurl(char *s, int allowcr){ + char *d = s; unsigned u; while(*s){ @@ -184,7 +178,7 @@ void decodeurl(unsigned char *s, int allowcr){ *d = 0; } -void file2url(unsigned char *sb, unsigned char *buf, unsigned bufsize, int * inbuf, int skip255){ +void file2url(char *sb, char *buf, unsigned bufsize, int * inbuf, int skip255){ for(; *sb; sb++){ if((bufsize - *inbuf)<16)break; if(*sb=='\r'||*sb=='\n')continue; @@ -208,14 +202,14 @@ void file2url(unsigned char *sb, unsigned char *buf, unsigned bufsize, int * inb void * proxychild(struct clientparam* param) { int res=0, i=0; - unsigned char* buf = NULL, *newbuf; + char* buf = NULL, *newbuf; int inbuf; int bufsize; unsigned reqlen = 0; - unsigned char *sb=NULL, *sg=NULL, *se=NULL, *sp=NULL, + char *sb=NULL, *sg=NULL, *se=NULL, *sp=NULL, *req=NULL, *su=NULL, *ss = NULL; - unsigned char *ftpbase=NULL; - unsigned char username[1024]; + char *ftpbase=NULL; + char username[1024]; int keepalive = 0; uint64_t contentlength64 = 0; int hascontent =0; @@ -293,7 +287,7 @@ for(;;){ } myfree(req); } - req = (unsigned char *)mystrdup((char *)buf); + req = (char *)mystrdup((char *)buf); if(!req){RETURN(510);} if(i<10) { RETURN(511); @@ -302,7 +296,7 @@ for(;;){ param->transparent = 0; if((isconnect = !strncasecmp((char *)buf, "CONNECT", 7))) keepalive = 2; - if ((sb=(unsigned char *)(unsigned char *)strchr((char *)buf, ' ')) == NULL) {RETURN(512);} + if ((sb=(char *)(char *)strchr((char *)buf, ' ')) == NULL) {RETURN(512);} ss = ++sb; if(!isconnect) { if (!strncasecmp((char *)sb, "http://", 7)) { @@ -320,21 +314,21 @@ for(;;){ } } else { - if ((se=(unsigned char *)(unsigned char *)strchr((char *)sb, ' ')) == NULL || sb==se) {RETURN (514);} + if ((se=(char *)(char *)strchr((char *)sb, ' ')) == NULL || sb==se) {RETURN (514);} *se = 0; } if(!param->transparent || isconnect) { if(!isconnect) { - if ((se=(unsigned char *)(unsigned char *)strchr((char *)sb, '/')) == NULL + if ((se=(char *)(char *)strchr((char *)sb, '/')) == NULL || sb==se - || !(sg=(unsigned char *)strchr((char *)sb, ' '))) {RETURN (515);} + || !(sg=(char *)strchr((char *)sb, ' '))) {RETURN (515);} if(se > sg) se=sg; *se = 0; } prefix = (int)(se - buf); - su = (unsigned char*)strrchr((char *)sb, '@'); + su = (char*)strrchr((char *)sb, '@'); if(su) { - su = (unsigned char *)mystrdup((char *)sb); + su = (char *)mystrdup((char *)sb); decodeurl(su, 0); if(parseconnusername((char *)su, (struct clientparam *)param, 1, (unsigned short)((ftp)?21:80))) RETURN (100); myfree(su); @@ -358,7 +352,7 @@ for(;;){ /*printf("Got: %s\n", buf+inbuf);*/ #ifndef WITHMAIN if(i > 25 && !param->srv->transparent && (!strncasecmp((char *)(buf+inbuf), "proxy-authorization", 19))){ - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -369,65 +363,17 @@ for(;;){ i = de64(sb, username, 255); if(i<=0)continue; username[i] = 0; - sb = (unsigned char *)strchr((char *)username, ':'); + sb = (char *)strchr((char *)username, ':'); if(sb){ *sb = 0; if(param->password)myfree(param->password); - param->password = (unsigned char *)mystrdup((char *)sb+1); + param->password = (char *)mystrdup((char *)sb+1); param->pwtype = 0; } if(param->username)myfree(param->username); - param->username = (unsigned char *)mystrdup((char *)username); + param->username = (char *)mystrdup((char *)username); continue; } -#ifndef NOCRYPT - if(param->srv->usentlm && !strncasecmp((char *)sb, "ntlm", 4)){ - sb+=4; - while(isspace(*sb))sb++; - i = de64(sb, username, 1023); - if(i<=16)continue; - username[i] = 0; - if(strncasecmp((char *)username, "NTLMSSP", 8)) continue; - if(username[8] == 1) { - while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){ - if(i> 15 && (!strncasecmp((char *)(buf), "content-length", 14))){ - buf[i]=0; - sscanf((char *)buf + 15, "%"PRIu64, &contentlength64); - } - } - while( contentlength64 > 0 && (i = sockgetlinebuf(param, CLIENT, buf, (BUFSIZE < contentlength64)? BUFSIZE - 1:(int)contentlength64, '\n', conf.timeouts[STRING_S])) > 0){ - if ((uint64_t)i > contentlength64) break; - contentlength64-=i; - } - contentlength64 = 0; - if(param->password)myfree(param->password); - param->password = myalloc(32); - param->pwtype = 2; - i = (int)strlen(proxy_stringtable[13]); - memcpy(buf, proxy_stringtable[13], i); - genchallenge(param, (char *)param->password, (char *)buf + i); - memcpy(buf + strlen((char *)buf), "\r\n\r\n", 5); - socksend(param->clisock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]); - ckeepalive = keepalive = 1; - goto REQUESTEND; - } - if(username[8] == 3 && param->pwtype == 2 && i>=80) { - unsigned offset, len; - - len = username[20] + (((unsigned)username[21]) << 8); - offset = username[24] + (((unsigned)username[25]) << 8); - if(len != 24 || len + offset > (unsigned)i) continue; - memcpy(param->password + 8, username + offset, 24); - len = username[36] + (((unsigned)username[37]) << 8); - offset = username[40] + (((unsigned)username[41]) << 8); - if(len> 255 || len + offset > (unsigned)i) continue; - if(param->username) myfree(param->username); - unicode2text((char *)username+offset, (char *)username+offset, (len>>1)); - param->username = (unsigned char *)mystrdup((char *)username+offset); - } - continue; - } -#endif } #endif if(!isconnect && ( @@ -435,7 +381,7 @@ for(;;){ || (i> 16 && (!strncasecmp((char *)(buf+inbuf), "connection:", 11))) )){ - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -447,16 +393,16 @@ for(;;){ } if( i > 11 && !strncasecmp((char *)(buf+inbuf), "Expect: 100", 11)){ keepalive = 1; - socksend(param->clisock, (unsigned char *)proxy_stringtable[17], (int)strlen(proxy_stringtable[17]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[17], (int)strlen(proxy_stringtable[17]), conf.timeouts[STRING_S]); continue; } if(param->transparent && i > 6 && !strncasecmp((char *)buf + inbuf, "Host:", 5)){ - unsigned char c; - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + char c; + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; - (se = (unsigned char *)strchr((char *)sb, '\r')) || (se = (unsigned char *)strchr((char *)sb, '\n')); + (se = (char *)strchr((char *)sb, '\r')) || (se = (char *)strchr((char *)sb, '\n')); if(se) { c = *se; *se = 0; @@ -466,7 +412,7 @@ for(;;){ } newbuf = myalloc(strlen((char *)req) + strlen((char *)(buf+inbuf)) + 8); if(newbuf){ - sp = (unsigned char *)strchr((char *)req+1, '/'); + sp = (char *)strchr((char *)req+1, '/'); memcpy(newbuf, req, (sp - req)); sprintf((char*)newbuf + (sp - req), "http://%s%s",sb,sp); myfree(req); @@ -475,7 +421,7 @@ for(;;){ if(se)*se = c; } if(ftp && i > 13 && (!strncasecmp((char *)(buf+inbuf), "authorization", 13))){ - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -486,19 +432,19 @@ for(;;){ i = de64(sb, username, 255); if(i<=0)continue; username[i] = 0; - sb = (unsigned char *)strchr((char *)username, ':'); + sb = (char *)strchr((char *)username, ':'); if(sb){ *sb = 0; if(param->extpassword)myfree(param->extpassword); - param->extpassword = (unsigned char *)mystrdup((char *)sb+1); + param->extpassword = (char *)mystrdup((char *)sb+1); } if(param->extusername)myfree(param->extusername); - param->extusername = (unsigned char *)mystrdup((char *)username); + param->extusername = (char *)mystrdup((char *)username); continue; } } if(i> 15 && (!strncasecmp((char *)(buf+inbuf), "content-length", 14))){ - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -573,7 +519,7 @@ for(;;){ ckeepalive = 1; if(ftpbase) myfree(ftpbase); ftpbase = NULL; - if(!(sp = (unsigned char *)strchr((char *)ss, ' '))){RETURN(799);} + if(!(sp = (char *)strchr((char *)ss, ' '))){RETURN(799);} *sp = 0; decodeurl(ss, 0); @@ -597,10 +543,10 @@ for(;;){ inftpbuf = FTPBUFSIZE - (20 + inftpbuf); res = ftpcd(param, ftpbase, ftpbuf, &inftpbuf); if(res){ - res = ftptype(param, (unsigned char *)"I"); + res = ftptype(param, (char *)"I"); if(res)RETURN(res); ftpbase[--i] = 0; - ftps = ftpcommand(param, param->operation == FTP_PUT? (unsigned char *)"PUT" : (unsigned char *)"RETR", ftpbase); + ftps = ftpcommand(param, param->operation == FTP_PUT? (char *)"PUT" : (char *)"RETR", ftpbase); } else { if(inftpbuf){ @@ -609,12 +555,12 @@ for(;;){ memcpy(buf+inbuf, "
", 4); inbuf += 4; } - ftps = ftpcommand(param, (unsigned char *)"LIST", NULL); + ftps = ftpcommand(param, (char *)"LIST", NULL); mode = 1; } if(ftps == INVALID_SOCKET){RETURN(780);} if(!mode){ - socksend(param->clisock, (unsigned char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]); s = param->remsock; param->remsock = ftps; if((param->operation == FTP_PUT) && (contentlength64 > 0)) param->waitclient64 = contentlength64; @@ -635,7 +581,7 @@ for(;;){ } param->remsock = ftps; - if(gotres <= 0) for(; (res = sockgetlinebuf(param, SERVER, (unsigned char *)ftpbuf, FTPBUFSIZE - 20, '\n', conf.timeouts[STRING_S])) > 0; i++){ + if(gotres <= 0) for(; (res = sockgetlinebuf(param, SERVER, (char *)ftpbuf, FTPBUFSIZE - 20, '\n', conf.timeouts[STRING_S])) > 0; i++){ int isdir = 0; int islink = 0; int filetoken =-1; @@ -643,9 +589,9 @@ for(;;){ int modetoken =-1; int datetoken =-1; int spaces = 1; - unsigned char * tokens[10]; + char * tokens[10]; unsigned wordlen [10]; - unsigned char j=0; + char j=0; int space = 1; ftpbuf[res] = 0; @@ -654,7 +600,7 @@ for(;;){ continue; } if(!isnumber(*ftpbuf) && mode == 1) mode = 2; - for(sb=(unsigned char *)ftpbuf; *sb; sb++){ + for(sb=(char *)ftpbuf; *sb; sb++){ if(!space && isspace(*sb)){ space = 1; wordlen[j]=(unsigned)(sb-tokens[j]); @@ -721,7 +667,7 @@ for(;;){ memcpy(buf+inbuf, " "); + if(islink) sb = (char *)strstr((char *)tokens[filetoken], " -> "); if(sb) sb+=4; else sb=tokens[filetoken]; @@ -760,7 +706,7 @@ for(;;){ if((bufsize - inbuf) < LINESIZE){ if (bufsize > 20000){ if(!headsent++){ - socksend(param->clisock, (unsigned char *)proxy_stringtable[9], (int)strlen(proxy_stringtable[9]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[9], (int)strlen(proxy_stringtable[9]), conf.timeouts[STRING_S]); } if((unsigned)socksend(param->clisock, buf, inbuf, conf.timeouts[STRING_S]) != inbuf){ RETURN(781); @@ -791,7 +737,7 @@ for(;;){ "Connection: keep-alive\r\n" "Content-Length: %d\r\n\r\n", inbuf); - socksend(param->clisock, (unsigned char *)ftpbuf, (int)strlen(ftpbuf), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)ftpbuf, (int)strlen(ftpbuf), conf.timeouts[STRING_S]); } socksend(param->clisock, buf, inbuf, conf.timeouts[STRING_S]); if(res){RETURN(res);} @@ -803,7 +749,7 @@ for(;;){ } if(isconnect && param->redirtype != R_HTTP) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]); if(param->redirectfunc) { if(req)myfree(req); if(buf)myfree(buf); @@ -821,7 +767,7 @@ for(;;){ else { #ifdef TCP_CORK int opt = 1; - so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int)); + so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (char *)&opt, sizeof(int)); #endif redirect = 1; res = (int)strlen((char *)req); @@ -846,7 +792,7 @@ for(;;){ else if(anonymous>1){ sprintf((char*)buf+strlen((char *)buf), "Via: 1.1 "); gethostname((char *)(buf+strlen((char *)buf)), 256); - sprintf((char*)buf+strlen((char *)buf), ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(¶m->srv->intsa)), conf.stringtable?conf.stringtable[2]:(unsigned char *)"", conf.stringtable?conf.stringtable[3]:(unsigned char *)""); + sprintf((char*)buf+strlen((char *)buf), ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(¶m->srv->intsa)), conf.stringtable?conf.stringtable[2]:(char *)"", conf.stringtable?conf.stringtable[3]:(char *)""); if(anonymous != 2)myinet_ntop(*SAFAMILY(¶m->sincr), SAADDR(¶m->sincr), (char *)buf + strlen((char *)buf), 128); else { unsigned long tmp; @@ -862,7 +808,7 @@ for(;;){ } if(param->extusername){ sprintf((char*)buf + strlen((char *)buf), "%s: Basic ", (redirect)?"Proxy-Authorization":"Authorization"); - sprintf((char*)username, "%.128s:%.128s", param->extusername, param->extpassword?param->extpassword:(unsigned char*)""); + sprintf((char*)username, "%.128s:%.128s", param->extusername, param->extpassword?param->extpassword:(char*)""); en64(username, buf+strlen((char *)buf), (int)strlen((char *)username)); sprintf((char*)buf + strlen((char *)buf), "\r\n"); } @@ -873,7 +819,7 @@ for(;;){ #ifdef TCP_CORK { int opt = 0; - so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int)); + so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (char *)&opt, sizeof(int)); } #endif param->statscli64 += res; @@ -904,7 +850,7 @@ for(;;){ || (i> 16 && !strncasecmp((char *)(buf+inbuf), "connection:", 11)) )){ - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -919,7 +865,7 @@ for(;;){ } else if(i > 15 && (!strncasecmp((char *)(buf+inbuf), "content-length", 14))){ buf[inbuf+i]=0; - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -935,7 +881,7 @@ for(;;){ } else if(i>25 && (!strncasecmp((char *)(buf+inbuf), "transfer-encoding", 17))){ buf[inbuf+i]=0; - sb = (unsigned char *)strchr((char *)(buf+inbuf), ':'); + sb = (char *)strchr((char *)(buf+inbuf), ':'); if(!sb)continue; ++sb; while(isspace(*sb))sb++; @@ -1020,7 +966,7 @@ for(;;){ if((param->chunked || contentlength64 > 0) && param->operation != HTTP_HEAD && res != 204 && res != 304) { do { if(param->chunked){ - unsigned char smallbuf[32]; + char smallbuf[32]; while ((i = sockgetlinebuf(param, SERVER, smallbuf, 30, '\n', conf.timeouts[STRING_S])) == 2) { if (socksend(param->clisock, smallbuf, i, conf.timeouts[STRING_S]) != i){ RETURN(533); @@ -1086,41 +1032,41 @@ CLEANRET: if(param->res != 555 && param->res && param->clisock != INVALID_SOCKET && (param->res < 90 || param->res >=800 || param->res == 100 ||(param->res > 500 && param->res< 800))) { if((param->res>=509 && param->res < 517) || param->res > 900) while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S])) > 2); if(param->res == 10) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[2], (int)strlen(proxy_stringtable[2]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[2], (int)strlen(proxy_stringtable[2]), conf.timeouts[STRING_S]); } else if (res == 700 || res == 701){ - socksend(param->clisock, (unsigned char *)proxy_stringtable[16], (int)strlen(proxy_stringtable[16]), conf.timeouts[STRING_S]); - socksend(param->clisock, (unsigned char *)ftpbuf, inftpbuf, conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[16], (int)strlen(proxy_stringtable[16]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)ftpbuf, inftpbuf, conf.timeouts[STRING_S]); } else if(param->res == 100 || (param->res >10 && param->res < 20) || (param->res >701 && param->res <= 705)) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[1], (int)strlen(proxy_stringtable[1]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[1], (int)strlen(proxy_stringtable[1]), conf.timeouts[STRING_S]); } else if(param->res >=20 && param->res < 30) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[6], (int)strlen(proxy_stringtable[6]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[6], (int)strlen(proxy_stringtable[6]), conf.timeouts[STRING_S]); } else if(param->res >=30 && param->res < 80) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[5], (int)strlen(proxy_stringtable[5]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[5], (int)strlen(proxy_stringtable[5]), conf.timeouts[STRING_S]); } else if(param->res == 1 || (!param->srv->needuser && param->res < 10)) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[11], (int)strlen(proxy_stringtable[11]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[11], (int)strlen(proxy_stringtable[11]), conf.timeouts[STRING_S]); } else if(param->res < 10) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[param->srv->usentlm?12:7], (int)strlen(proxy_stringtable[param->srv->usentlm?12:7]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[7], (int)strlen(proxy_stringtable[7]), conf.timeouts[STRING_S]); } else if(param->res == 999) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[4], (int)strlen(proxy_stringtable[4]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[4], (int)strlen(proxy_stringtable[4]), conf.timeouts[STRING_S]); } else if(param->res == 519) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[3], (int)strlen(proxy_stringtable[3]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[3], (int)strlen(proxy_stringtable[3]), conf.timeouts[STRING_S]); } else if(param->res == 517) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[15], (int)strlen(proxy_stringtable[15]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[15], (int)strlen(proxy_stringtable[15]), conf.timeouts[STRING_S]); } else if(param->res == 780) { - socksend(param->clisock, (unsigned char *)proxy_stringtable[10], (int)strlen(proxy_stringtable[10]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[10], (int)strlen(proxy_stringtable[10]), conf.timeouts[STRING_S]); } else if(param->res >= 511 && param->res<=516){ - socksend(param->clisock, (unsigned char *)proxy_stringtable[0], (int)strlen(proxy_stringtable[0]), conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)proxy_stringtable[0], (int)strlen(proxy_stringtable[0]), conf.timeouts[STRING_S]); } } logurl(param, (char *)buf, (char *)req, ftp); diff --git a/src/proxy.h b/src/proxy.h index 37002b4..dc0b007 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -153,9 +153,9 @@ extern int timetoexit; extern struct extparam conf; int sockmap(struct clientparam * param, int timeo, int usesplice); -int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to); -int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to); -int sockrecvfrom(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to); +int socksend(SOCKET sock, char * buf, int bufsize, int to); +int socksendto(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to); +int sockrecvfrom(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to); int sockgetcharcli(struct clientparam * param, int timeosec, int timeousec); @@ -163,14 +163,14 @@ int sockgetcharsrv(struct clientparam * param, int timeosec, int timeousec); int sockfillbuffcli(struct clientparam * param, unsigned long size, int timeosec); int sockfillbuffsrv(struct clientparam * param, unsigned long size, int timeosec); -int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char * buf, int bufsize, int delim, int to); +int sockgetlinebuf(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to); void initlog(void); -void dolog(struct clientparam * param, const unsigned char *s); -int dobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec); -int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format); +void dolog(struct clientparam * param, const char *s); +int dobuf(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec); +int dobuf2(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format); int doconnect(struct clientparam * param); int alwaysauth(struct clientparam * param); int ipauth(struct clientparam * param); @@ -181,15 +181,15 @@ void trafcountfunc(struct clientparam *param); unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout); -int scanaddr(const unsigned char *s, unsigned long * ip, unsigned long * mask); +int scanaddr(const char *s, unsigned long * ip, unsigned long * mask); int myinet_ntop(int af, void *src, char *dst, socklen_t size); extern struct nserver nservers[MAXNSERVERS]; extern struct nserver authnserver; -unsigned long getip(unsigned char *name); -unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa); -int afdetect(unsigned char *name); -unsigned long myresolver(int, unsigned char *, unsigned char *); -unsigned long fakeresolver (int, unsigned char *, unsigned char*); +unsigned long getip(char *name); +unsigned long getip46(int family, char *name, struct sockaddr *sa); +int afdetect(char *name); +unsigned long myresolver(int, char *, char *); +unsigned long fakeresolver (int, char *, char*); int inithashtable(struct hashtable *hashtable, unsigned nhashsize); void freeparam(struct clientparam * param); void srvpostfree(struct srvparam * srv); @@ -207,34 +207,34 @@ int reload (void); extern int paused; extern int demon; -unsigned char * mycrypt(const unsigned char *key, const unsigned char *salt, unsigned char *buf); -unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPassword, int tohex); -int de64 (const unsigned char *in, unsigned char *out, int maxlen); -unsigned char* en64 (const unsigned char *in, unsigned char *out, int inlen); -void tohex(unsigned char *in, unsigned char *out, int len); -void fromhex(unsigned char *in, unsigned char *out, int len); +char * mycrypt(const char *key, const char *salt, char *buf); +char * ntpwdhash (char *szHash, const char *szPassword, int tohex); +int de64 (const char *in, char *out, int maxlen); +char* en64 (const char *in, char *out, int inlen); +void tohex(char *in, char *out, int len); +void fromhex(char *in, char *out, int len); int ftplogin(struct clientparam *param, char *buf, int *inbuf); -int ftpcd(struct clientparam *param, unsigned char* path, char *buf, int *inbuf); -int ftpsyst(struct clientparam *param, unsigned char *buf, unsigned len); -int ftppwd(struct clientparam *param, unsigned char *buf, unsigned len); -int ftptype(struct clientparam *param, unsigned char* f_type); -int ftpres(struct clientparam *param, unsigned char * buf, int len); -SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned char *arg); +int ftpcd(struct clientparam *param, char* path, char *buf, int *inbuf); +int ftpsyst(struct clientparam *param, char *buf, unsigned len); +int ftppwd(struct clientparam *param, char *buf, unsigned len); +int ftptype(struct clientparam *param, char* f_type); +int ftpres(struct clientparam *param, char * buf, int len); +SOCKET ftpcommand(struct clientparam *param, char * command, char *arg); int text2unicode(const char * text, char * buf, int buflen); void unicode2text(const char *unicode, char * buf, int len); void genchallenge(struct clientparam *param, char * challenge, char *buf); -void mschap(const unsigned char *win_password, - const unsigned char *challenge, unsigned char *response); +void mschap(const char *win_password, + const char *challenge, char *response); struct hashtable; -void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires); +void hashadd(struct hashtable *ht, const char* name, char* value, time_t expires); -int parsehost(int family, unsigned char *host, struct sockaddr *sa); +int parsehost(int family, char *host, struct sockaddr *sa); int parsehostname(char *hostname, struct clientparam *param, unsigned short port); int parseusername(char *username, struct clientparam *param, int extpasswd); int parseconnusername(char *username, struct clientparam *param, int extpasswd, unsigned short port); @@ -242,7 +242,7 @@ int ACLmatches(struct ace* acentry, struct clientparam * param); int checkACL(struct clientparam * param); int checkpreACL(struct clientparam * param); extern int havelog; -unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth); +unsigned long udpresolve(int af, char * name, char * value, unsigned *retttl, struct clientparam* param, int makeauth); void copyacl (struct ace *ac, struct srvparam *srv); struct auth * copyauth (struct auth *); @@ -255,17 +255,17 @@ struct passwords * copypwl (struct passwords *pwl); void freepwl(struct passwords *pw); void copyfilter(struct filter *, struct srvparam *srv); FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param); -FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p); -FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p); -FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p); +FILTER_ACTION handlereqfilters(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p); +FILTER_ACTION handlehdrfilterscli(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p); +FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p); FILTER_ACTION handlepredatflt(struct clientparam *param); -FILTER_ACTION handledatfltcli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p); -FILTER_ACTION handledatfltsrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p); +FILTER_ACTION handledatfltcli(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p); +FILTER_ACTION handledatfltsrv(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p); void srvinit(struct srvparam * srv, struct clientparam *param); void srvinit2(struct srvparam * srv, struct clientparam *param); void srvfree(struct srvparam * srv); -unsigned char * dologname (unsigned char *buf, int bufsize, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t); +char * dologname (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t); int readconfig(FILE * fp); int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to); diff --git a/src/proxymain.c b/src/proxymain.c index eac6491..07167ef 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -25,27 +25,27 @@ void * threadfunc (void *p) { fds.revents = 0; for(i=5+(param->srv->maxchild>>10); i; i--){ if(so._poll(&fds, 1, 1000*CONNBACK_TO)!=1){ - dolog(param, (unsigned char *)"Connect back not received, check connback client"); + dolog(param, (char *)"Connect back not received, check connback client"); i = 0; break; } param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size); if(param->remsock == INVALID_SOCKET) { - dolog(param, (unsigned char *)"Connect back accept() failed"); + dolog(param, (char *)"Connect back accept() failed"); continue; } #ifndef WITHMAIN param->req = param->sinsr; if(param->srv->preacl) param->res = checkpreACL(param); if(param->res){ - dolog(param, (unsigned char *)"Connect back ACL failed"); + dolog(param, (char *)"Connect back ACL failed"); so._closesocket(param->remsock); param->remsock = INVALID_SOCKET; continue; } #endif - if(socksendto(param->remsock, (struct sockaddr*)¶m->sinsr, (unsigned char *)"C", 1, CONNBACK_TO) != 1){ - dolog(param, (unsigned char *)"Connect back sending command failed"); + if(socksendto(param->remsock, (struct sockaddr*)¶m->sinsr, (char *)"C", 1, CONNBACK_TO) != 1){ + dolog(param, (char *)"Connect back sending command failed"); so._closesocket(param->remsock); param->remsock = INVALID_SOCKET; continue; @@ -185,10 +185,10 @@ int MODULEMAINFUNC (int argc, char** argv){ struct clientparam * newparam; int error = 0; unsigned sleeptime; - unsigned char buf[256]; + char buf[256]; char *hostname=NULL; int opt = 1, isudp = 0, iscbl = 0, iscbc = 0; - unsigned char *cbc_string = NULL, *cbl_string = NULL; + char *cbc_string = NULL, *cbl_string = NULL; #ifndef NOIPV6 struct sockaddr_in6 cbsa; #else @@ -316,28 +316,28 @@ int MODULEMAINFUNC (int argc, char** argv){ #endif case 'l': myfree(srv->logtarget); - srv->logtarget = (unsigned char *)mystrdup(argv[i] + 2); + srv->logtarget = (char *)mystrdup(argv[i] + 2); break; case 'i': - getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv->intsa); + getip46(46, (char *)argv[i]+2, (struct sockaddr *)&srv->intsa); break; case 'e': { #ifndef NOIPV6 struct sockaddr_in6 sa6; memset(&sa6, 0, sizeof(sa6)); - error = !getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&sa6); + error = !getip46(46, (char *)argv[i]+2, (struct sockaddr *)&sa6); if(!error) { if (*SAFAMILY(&sa6)==AF_INET) srv->extsa = sa6; else srv->extsa6 = sa6; } #else - error = !getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv->extsa); + error = !getip46(46, (char *)argv[i]+2, (struct sockaddr *)&srv->extsa); #endif } break; case 'N': - getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv->extNat); + getip46(46, (char *)argv[i]+2, (struct sockaddr *)&srv->extNat); break; case 'p': *SAPORT(&srv->intsa) = htons(atoi(argv[i]+2)); @@ -365,7 +365,7 @@ int MODULEMAINFUNC (int argc, char** argv){ #endif case 'f': if(srv->logformat)myfree(srv->logformat); - srv->logformat = (unsigned char *)mystrdup(argv[i] + 2); + srv->logformat = (char *)mystrdup(argv[i] + 2); break; case 't': srv->silent = 1; @@ -374,11 +374,11 @@ int MODULEMAINFUNC (int argc, char** argv){ hostname = argv[i] + 2; break; case 'r': - cbc_string = (unsigned char *)mystrdup(argv[i] + 2); + cbc_string = (char *)mystrdup(argv[i] + 2); iscbc = 1; break; case 'R': - cbl_string = (unsigned char *)mystrdup(argv[i] + 2); + cbl_string = (char *)mystrdup(argv[i] + 2); iscbl = 1; break; case 'u': @@ -496,7 +496,7 @@ int MODULEMAINFUNC (int argc, char** argv){ ); return (1); } - srv->target = (unsigned char *)mystrdup(argv[i+1]); + srv->target = (char *)mystrdup(argv[i+1]); #endif #ifndef STDMAIN } @@ -507,8 +507,8 @@ int MODULEMAINFUNC (int argc, char** argv){ if(inetd) { fcntl(0,F_SETFL,O_NONBLOCK | fcntl(0,F_GETFL)); if(!isudp){ - so._setsockopt(0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg)); - so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int)); + so._setsockopt(0, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg)); + so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int)); } defparam.clisock = 0; if(! (newparam = myalloc (sizeof(defparam)))){ @@ -604,7 +604,7 @@ int MODULEMAINFUNC (int argc, char** argv){ if(iscbl){ parsehost(srv->family, cbl_string, (struct sockaddr *)&cbsa); if((srv->cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) { - dolog(&defparam, (unsigned char *)"Failed to allocate connect back socket"); + dolog(&defparam, (char *)"Failed to allocate connect back socket"); return -6; } opt = 1; @@ -617,11 +617,11 @@ int MODULEMAINFUNC (int argc, char** argv){ setopts(srv->cbsock, srv->cbssockopts); if(so._bind(srv->cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) { - dolog(&defparam, (unsigned char *)"Failed to bind connect back socket"); + dolog(&defparam, (char *)"Failed to bind connect back socket"); return -7; } if(so._listen(srv->cbsock, 1 + (srv->maxchild>>4))==-1) { - dolog(&defparam, (unsigned char *)"Failed to listen connect back socket"); + dolog(&defparam, (char *)"Failed to listen connect back socket"); return -8; } } @@ -766,12 +766,12 @@ int MODULEMAINFUNC (int argc, char** argv){ if(! (newparam = myalloc (sizeof(defparam)))){ if(!isudp) so._closesocket(new_sock); defparam.res = 21; - if(!srv->silent)dolog(&defparam, (unsigned char *)"Memory Allocation Failed"); + if(!srv->silent)dolog(&defparam, (char *)"Memory Allocation Failed"); usleep(SLEEPTIME); continue; }; *newparam = defparam; - if(defparam.hostname)newparam->hostname=(unsigned char *)mystrdup((char *)defparam.hostname); + if(defparam.hostname)newparam->hostname=(char *)mystrdup((char *)defparam.hostname); clearstat(newparam); if(!isudp) newparam->clisock = new_sock; @@ -827,7 +827,7 @@ int MODULEMAINFUNC (int argc, char** argv){ if(isudp) while(!srv->fds.events)usleep(SLEEPTIME); } - if(!srv->silent) dolog(&defparam, (unsigned char *)"Exiting thread"); + if(!srv->silent) dolog(&defparam, (char *)"Exiting thread"); srvfree(srv); pthread_mutex_lock(&srv->counter_mutex); @@ -853,8 +853,8 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ srv->version = conf.version + 1; srv->paused = conf.paused; srv->noforce = conf.noforce; - srv->logformat = conf.logformat? (unsigned char *)mystrdup((char *)conf.logformat) : NULL; - srv->logtarget = conf.logtarget? (unsigned char *)mystrdup((char *)conf.logtarget) : NULL; + srv->logformat = conf.logformat? (char *)mystrdup((char *)conf.logformat) : NULL; + srv->logtarget = conf.logtarget? (char *)mystrdup((char *)conf.logtarget) : NULL; srv->authfunc = conf.authfunc; srv->usentlm = 0; srv->maxchild = conf.maxchild; @@ -887,12 +887,12 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){ if(srv->logformat){ char *s; if(*srv->logformat == '-' && (s = strchr((char *)srv->logformat + 1, '+')) && s[1]){ - unsigned char* logformat = srv->logformat; + char* logformat = srv->logformat; *s = 0; - srv->nonprintable = (unsigned char *)mystrdup((char *)srv->logformat + 1); + srv->nonprintable = (char *)mystrdup((char *)srv->logformat + 1); srv->replace = s[1]; - srv->logformat = (unsigned char *)mystrdup(s + 2); + srv->logformat = (char *)mystrdup(s + 2); *s = '+'; myfree(logformat); } @@ -999,17 +999,17 @@ void copyacl (struct ace *ac, struct srvparam *srv){ for(pel = ac->periods; pel; pel = pel->next = itcopy(pel->next, sizeof(struct period))); ac->users = itcopy(ac->users, sizeof(struct userlist)); for(ul = ac->users; ul; ul = ul->next = itcopy(ul->next, sizeof(struct userlist))){ - if(ul->user) ul->user = (unsigned char*)mystrdup((char *)ul->user); + if(ul->user) ul->user = (char*)mystrdup((char *)ul->user); } ac->dstnames = itcopy(ac->dstnames, sizeof(struct hostname)); for(hst = ac->dstnames; hst; hst = hst->next = itcopy(hst->next, sizeof(struct hostname))){ - if(hst->name) hst->name = (unsigned char*)mystrdup((char *)hst->name); + if(hst->name) hst->name = (char*)mystrdup((char *)hst->name); } ac->chains = itcopy(ac->chains, sizeof(struct chain)); for(ch = ac->chains; ch; ch = ch->next = itcopy(ch->next, sizeof(struct chain))){ - if(ch->extuser)ch->extuser = (unsigned char*)mystrdup((char *)ch->extuser); - if(ch->extpass)ch->extpass = (unsigned char*)mystrdup((char *)ch->extpass); - if(ch->exthost)ch->exthost = (unsigned char*)mystrdup((char *)ch->exthost); + if(ch->extuser)ch->extuser = (char*)mystrdup((char *)ch->extuser); + if(ch->extpass)ch->extpass = (char*)mystrdup((char *)ch->extpass); + if(ch->exthost)ch->exthost = (char*)mystrdup((char *)ch->exthost); } if(preacl){ if(ac->dst || ac->ports || ac->users || ac->dstnames || ac->chains|| ac->action>1){ @@ -1126,7 +1126,7 @@ void freeacl(struct ace *ac){ } } -FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +FILTER_ACTION handlereqfilters(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ FILTER_ACTION action; int i; @@ -1137,7 +1137,7 @@ FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p return PASS; } -FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ FILTER_ACTION action; int i; @@ -1148,7 +1148,7 @@ FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** bu return PASS; } -FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +FILTER_ACTION handlehdrfilterscli(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){ FILTER_ACTION action; int i; @@ -1174,7 +1174,7 @@ FILTER_ACTION handlepredatflt(struct clientparam *cparam){ return PASS; } -FILTER_ACTION handledatfltcli(struct clientparam *cparam, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +FILTER_ACTION handledatfltcli(struct clientparam *cparam, char ** buf_p, int * bufsize_p, int offset, int * length_p){ #ifndef STDMAIN FILTER_ACTION action; int i; @@ -1187,7 +1187,7 @@ FILTER_ACTION handledatfltcli(struct clientparam *cparam, unsigned char ** buf_p return PASS; } -FILTER_ACTION handledatfltsrv(struct clientparam *cparam, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ +FILTER_ACTION handledatfltsrv(struct clientparam *cparam, char ** buf_p, int * bufsize_p, int offset, int * length_p){ FILTER_ACTION action; int i; diff --git a/src/smtpp.c b/src/smtpp.c index 205f2c1..9eacab3 100644 --- a/src/smtpp.c +++ b/src/smtpp.c @@ -16,7 +16,7 @@ char ehlo[] = "250-Proxy\r\n" "250 DSN\r\n"; int readreply (struct clientparam* param) { - unsigned char * buf; + char * buf; int res, i, bufsize = 640; if(!(buf = myalloc(bufsize))) return 0; @@ -43,7 +43,7 @@ int readreply (struct clientparam* param) { } int readcommand (struct clientparam* param) { - unsigned char * buf; + char * buf; int res, i, bufsize = 320; int ret = 1; @@ -69,7 +69,7 @@ int readcommand (struct clientparam* param) { } int readdata (struct clientparam* param) { - unsigned char * buf; + char * buf; int res, i, bufsize = 4096; if(!(buf = myalloc(bufsize))) return 0; @@ -96,25 +96,25 @@ int readdata (struct clientparam* param) { void * smtppchild(struct clientparam* param) { int i=0, res; - unsigned char buf[320]; - unsigned char username[256]; + char buf[320]; + char username[256]; char * command = NULL; int login = 0; - if(socksend(param->clisock, (unsigned char *)"220 Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);} + if(socksend(param->clisock, (char *)"220 Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);} i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]); while(i > 4 && (strncasecmp((char *)buf, "AUTH PLAIN", 10) || !(login = 2)) && (strncasecmp((char *)buf, "AUTH LOGIN", 10) || !(login = 1))){ if(!strncasecmp((char *)buf, "QUIT", 4)){ - socksend(param->clisock, (unsigned char *)"221 Proxy\r\n", 11,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"221 Proxy\r\n", 11,conf.timeouts[STRING_S]); RETURN(0); } else if(!strncasecmp((char *)buf, "HELO ", 5)){ - socksend(param->clisock, (unsigned char *)"250 Proxy\r\n", 11,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"250 Proxy\r\n", 11,conf.timeouts[STRING_S]); } else if(!strncasecmp((char *)buf, "EHLO ", 5)){ - socksend(param->clisock, (unsigned char *)ehlo, sizeof(ehlo) - 1,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)ehlo, sizeof(ehlo) - 1,conf.timeouts[STRING_S]); } - else if(!param->hostname) socksend(param->clisock, (unsigned char *)"571 need AUTH first\r\n", 22, conf.timeouts[STRING_S]); + else if(!param->hostname) socksend(param->clisock, (char *)"571 need AUTH first\r\n", 22, conf.timeouts[STRING_S]); else { login = -1; buf[i] = 0; @@ -125,7 +125,7 @@ void * smtppchild(struct clientparam* param) { } if(!login) {RETURN(662);} if(login == 1){ - socksend(param->clisock, (unsigned char *)"334 VXNlcm5hbWU6\r\n", 18,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"334 VXNlcm5hbWU6\r\n", 18,conf.timeouts[STRING_S]); i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]); if(i < 3) {RETURN(663);} buf[i-2] = 0; @@ -133,7 +133,7 @@ void * smtppchild(struct clientparam* param) { if(i < 1) {RETURN(664);} username[i] = 0; parseconnusername((char *)username, param, 0, 25); - socksend(param->clisock, (unsigned char *)"334 UGFzc3dvcmQ6\r\n", 18,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"334 UGFzc3dvcmQ6\r\n", 18,conf.timeouts[STRING_S]); i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]); if(i < 2) {RETURN(665);} buf[i-2] = 0; @@ -141,7 +141,7 @@ void * smtppchild(struct clientparam* param) { if(i < 0) {RETURN(666);} username[i] = 0; if(param->extpassword) myfree(param->extpassword); - param->extpassword = (unsigned char *)mystrdup((char *)username); + param->extpassword = (char *)mystrdup((char *)username); } else if(login == 2){ if(i > 13) { @@ -149,7 +149,7 @@ void * smtppchild(struct clientparam* param) { i = de64(buf+11,username,255); } else { - socksend(param->clisock, (unsigned char *)"334\r\n", 5,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"334\r\n", 5,conf.timeouts[STRING_S]); i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]); if(i < 3) {RETURN(667);} buf[i-2] = 0; @@ -161,7 +161,7 @@ void * smtppchild(struct clientparam* param) { res = (int)strlen((char *)username+1) + 2; if(res < i){ if(param->extpassword) myfree(param->extpassword); - param->extpassword = (unsigned char *)mystrdup((char *)username + res); + param->extpassword = (char *)mystrdup((char *)username + res); } } @@ -204,29 +204,29 @@ void * smtppchild(struct clientparam* param) { if(i<3) {RETURN(672);} if(!command || (param->extusername && param->extpassword)){ if(!param->extusername || !*param->extusername || !param->extpassword || !*param->extpassword || !login){ - socksend(param->clisock, (unsigned char *)"235 auth required\r\n", 19,conf.timeouts[STRING_S]); + socksend(param->clisock, (char *)"235 auth required\r\n", 19,conf.timeouts[STRING_S]); } if ((login & 1)) { - socksend(param->remsock, (unsigned char *)"AUTH LOGIN\r\n", 12, conf.timeouts[STRING_S]); + socksend(param->remsock, (char *)"AUTH LOGIN\r\n", 12, conf.timeouts[STRING_S]); param->statscli64+=12; param->nwrites++; i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]); if(i<4 || strncasecmp((char *)buf, "334", 3)) {RETURN(680);} en64(param->extusername, buf, (int)strlen((char *)param->extusername)); socksend(param->remsock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]); - socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S]); + socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S]); param->statscli64+=(i+2); param->nwrites+=2; i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]); if(i<4 || strncasecmp((char *)buf, "334", 3)) {RETURN(681);} en64(param->extpassword, buf, (int)strlen((char *)param->extpassword)); socksend(param->remsock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]); - socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S]); + socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S]); param->statscli64+=(i+2); param->nwrites+=2; } else if((login & 2)){ - socksend(param->remsock, (unsigned char *)"AUTH PLAIN\r\n", 12, conf.timeouts[STRING_S]); + socksend(param->remsock, (char *)"AUTH PLAIN\r\n", 12, conf.timeouts[STRING_S]); param->statscli64+=(12); param->nwrites++; i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]); @@ -241,7 +241,7 @@ void * smtppchild(struct clientparam* param) { en64(username, buf, i); i = (int)strlen((char *)buf); socksend(param->remsock, buf, i, conf.timeouts[STRING_S]); - socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S]); + socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S]); param->statscli64+=(i+2); param->nwrites+=2; } @@ -256,7 +256,7 @@ void * smtppchild(struct clientparam* param) { if(!strncasecmp(command, "MAIL", 4) || !strncasecmp(command, "RCPT", 4) || !strncasecmp(command, "STARTTLS", 8) || !strncasecmp(command, "TURN", 4)){ res = (int)strlen(command); command[res] = 0; - res = handlehdrfilterscli(param, (unsigned char **)&command, &res, 0, &res); + res = handlehdrfilterscli(param, (char **)&command, &res, 0, &res); if(res != PASS) { if(res == HANDLED) res = 2; else RETURN(677); @@ -266,7 +266,7 @@ void * smtppchild(struct clientparam* param) { } #endif i = (int)strlen(command); - if(res != 2) socksend(param->remsock, (unsigned char *)command, i, conf.timeouts[STRING_S]); + if(res != 2) socksend(param->remsock, (char *)command, i, conf.timeouts[STRING_S]); } #ifndef WITHMAIN @@ -296,7 +296,7 @@ CLEANRET: } else dolog(param, NULL); if(param->clisock != INVALID_SOCKET) { - if ((param->res > 0 && param->res < 100) || (param->res > 661 && param->res <700)) socksend(param->clisock, (unsigned char *)"571 \r\n", 6,conf.timeouts[STRING_S]); + if ((param->res > 0 && param->res < 100) || (param->res > 661 && param->res <700)) socksend(param->clisock, (char *)"571 \r\n", 6,conf.timeouts[STRING_S]); } if(command) myfree(command); freeparam(param); diff --git a/src/sockgetchar.c b/src/sockgetchar.c index da2105c..720712b 100644 --- a/src/sockgetchar.c +++ b/src/sockgetchar.c @@ -7,7 +7,7 @@ #include "proxy.h" -int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to){ +int socksend(SOCKET sock, char * buf, int bufsize, int to){ int sent = 0; int res; struct pollfd fds; @@ -30,7 +30,7 @@ int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to){ } -int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to){ +int socksendto(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to){ int sent = 0; int res; struct pollfd fds; @@ -52,7 +52,7 @@ int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufs return sent; } -int sockrecvfrom(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to){ +int sockrecvfrom(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to){ struct pollfd fds; SASIZETYPE sasize; int res; @@ -153,7 +153,7 @@ int sockgetcharsrv(struct clientparam * param, int timeosec, int timeousec){ return (int)*param->srvbuf; } -int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char * buf, int bufsize, int delim, int to){ +int sockgetlinebuf(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to){ int c; int i=0; diff --git a/src/socks.c b/src/socks.c index 1ff6474..6f60b60 100644 --- a/src/socks.c +++ b/src/socks.c @@ -22,9 +22,9 @@ void * sockschild(struct clientparam* param) { unsigned size; SASIZETYPE sasize; unsigned short port = 0; - unsigned char * buf=NULL; - unsigned char c; - unsigned char command=0; + char * buf=NULL; + char c; + char command=0; struct pollfd fds[3]; int ver=0; int havepass = 0; diff --git a/src/stringtable.c b/src/stringtable.c index 4bfc7c2..08810c1 100644 --- a/src/stringtable.c +++ b/src/stringtable.c @@ -9,26 +9,26 @@ #include #include "version.h" -unsigned char * strings[] = { -/* 00 */ (unsigned char *)"3proxy tiny proxy server " VERSION " stringtable file", -/* 01 */ (unsigned char *)"3proxy", -/* 02 */ (unsigned char *)"3proxy tiny proxy server", -/* 03 */ (unsigned char *)VERSION " (" BUILDDATE ")", -/* 04 */ (unsigned char *)"3proxy allows to share and control Internet connection and count traffic", -/* 05 */ (unsigned char *)"SERVR", -/* 06 */ (unsigned char *)"PROXY", -/* 07 */ (unsigned char *)"TCPPM", -/* 08 */ (unsigned char *)"POP3P", -/* 09 */ (unsigned char *)"SOCK4", -/* 10 */ (unsigned char *)"SOCK5", -/* 11 */ (unsigned char *)"UDPPM", -/* 12 */ (unsigned char *)"SOCKS", -/* 13 */ (unsigned char *)"SOC45", -/* 14 */ (unsigned char *)"ADMIN", -/* 15 */ (unsigned char *)"DNSPR", -/* 16 */ (unsigned char *)"FTPPR", -/* 17 */ (unsigned char *)"SMTPP", -/* 18 */ (unsigned char *)"ZOMBIE", +char * strings[] = { +/* 00 */ "3proxy tiny proxy server " VERSION " stringtable file", +/* 01 */ "3proxy", +/* 02 */ "3proxy tiny proxy server", +/* 03 */ VERSION " (" BUILDDATE ")", +/* 04 */ "3proxy allows to share and control Internet connection and count traffic", +/* 05 */ "SERVR", +/* 06 */ "PROXY", +/* 07 */ "TCPPM", +/* 08 */ "POP3P", +/* 09 */ "SOCK4", +/* 10 */ "SOCK5", +/* 11 */ "UDPPM", +/* 12 */ "SOCKS", +/* 13 */ "SOC45", +/* 14 */ "ADMIN", +/* 15 */ "DNSPR", +/* 16 */ "FTPPR", +/* 17 */ "SMTPP", +/* 18 */ "ZOMBIE", /* 19 */ NULL, /* 20 */ NULL, /* 21 */ NULL, @@ -37,12 +37,12 @@ unsigned char * strings[] = { /* 24 */ NULL, #ifndef TPROXY_CONF #ifndef _WIN32 -/* 25 */ (unsigned char *)"/usr/local/etc/3proxy/3proxy.cfg", +/* 25 */ "/usr/local/etc/3proxy/3proxy.cfg", #else -/* 25 */ (unsigned char *)"3proxy.cfg", +/* 25 */ "3proxy.cfg", #endif #else -/* 25 */ (unsigned char *)TPROXY_CONF, +/* 25 */ TPROXY_CONF, #endif /* 26 */ NULL, /* 27 */ NULL, @@ -53,7 +53,7 @@ unsigned char * strings[] = { /* 32 */ NULL, /* 33 */ NULL, /* 34 */ NULL, -/* 35 */ (unsigned char *) +/* 35 */ "
\n" "

Welcome to 3proxy Web Interface

\n" "Probably you've noticed interface is very ugly currently.\n" diff --git a/src/structures.h b/src/structures.h index 8b89e48..bf50015 100644 --- a/src/structures.h +++ b/src/structures.h @@ -150,14 +150,14 @@ int #ifndef NOIPV6 #define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port) -#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr) +#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr) #define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4) #define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET) #define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in)) -#define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR, (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4))) +#define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR, (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4))) #else #define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port) -#define SAADDR(sa) ((unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr) +#define SAADDR(sa) ((char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr) #define SAADDRLEN(sa) (4) #define SASOCK(sa) (PF_INET) #define SASIZE(sa) (sizeof(struct sockaddr_in)) @@ -199,7 +199,7 @@ struct LOGFUNC; struct LOGGER; typedef int (*AUTHFUNC)(struct clientparam * param); typedef void * (*REDIRECTFUNC)(struct clientparam * param); -typedef unsigned long (*RESOLVFUNC)(int af, unsigned char *name, unsigned char *value); +typedef unsigned long (*RESOLVFUNC)(int af, char *name, char *value); typedef unsigned (*BANDLIMFUNC)(struct clientparam * param, unsigned nbytesin, unsigned nbytesout); typedef void (*TRAFCOUNTFUNC)(struct clientparam * param); typedef void * (*EXTENDFUNC) (struct node *node); @@ -249,7 +249,7 @@ struct portlist { struct userlist { struct userlist * next; - unsigned char * user; + char * user; }; typedef enum { @@ -263,8 +263,8 @@ typedef enum { struct passwords { struct passwords *next; - unsigned char * user; - unsigned char * password; + char * user; + char * password; int pwtype; }; @@ -295,9 +295,9 @@ struct chain { struct sockaddr_in addr; #endif unsigned short weight; - unsigned char * exthost; - unsigned char * extuser; - unsigned char * extpass; + char * exthost; + char * extuser; + char * extpass; }; struct period { @@ -311,7 +311,7 @@ struct period { struct hostname { struct hostname *next; - unsigned char * name; + char * name; int matchtype; }; @@ -375,7 +375,7 @@ struct trafcount { struct LOGFUNC { struct LOGFUNC* next; int (*init)(struct LOGGER *logger); - int (*dobuf)(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s); + int (*dobuf)(struct clientparam * param, char * buf, int bufsize, const char *s); void (*log)(const char * buf, int len, struct LOGGER *logger); void (*rotate)(struct LOGGER *logger); void (*flush)(struct LOGGER *logger); @@ -420,7 +420,7 @@ typedef enum { typedef void* FILTER_OPEN(void * idata, struct srvparam * param); typedef FILTER_ACTION FILTER_CLIENT(void *fo, struct clientparam * param, void** fc); typedef FILTER_ACTION FILTER_PREDATA(void *fc, struct clientparam * param); -typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p); +typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p); typedef void FILTER_CLOSE(void *fo); struct filter { @@ -487,7 +487,7 @@ struct srvparam { pthread_mutex_t counter_mutex; struct pollfd fds; FILE *stdlog; - unsigned char * target; + char * target; #ifdef SO_BINDTODEVICE char * ibindtodevice; char * obindtodevice; @@ -497,12 +497,12 @@ struct srvparam { struct ace *preacl, *acl; struct auth *authfuncs; struct filter *filter; - unsigned char * logtarget; - unsigned char * logformat; - unsigned char * nonprintable; + char * logtarget; + char * logformat; + char * nonprintable; struct LOGGER *log; unsigned short targetport; - unsigned char replace; + char replace; time_t time_start; }; @@ -553,7 +553,7 @@ struct clientparam { paused, version; - unsigned char *hostname, + char *hostname, *username, *password, *extusername, @@ -610,7 +610,7 @@ struct extparam { demon, maxchild, needreload, timetoexit, version, noforce; int authcachetype, authcachetime; int filtermaxsize; - unsigned char **archiver; + char **archiver; ROTATION logtype, countertype; char * counterfile; #ifndef NOIPV6 @@ -627,12 +627,12 @@ struct extparam { BANDLIMFUNC bandlimfunc; TRAFCOUNTFUNC trafcountfunc; void (*prelog)(struct clientparam * param); - unsigned char *logtarget, *logformat; + char *logtarget, *logformat; struct filemon * fmon; struct filter * filters; struct auth *authfuncs; char* demanddialprog; - unsigned char **stringtable; + char **stringtable; time_t time; unsigned logdumpsrv, logdumpcli; char delimchar; @@ -670,7 +670,7 @@ struct dictionary { struct commands { struct commands *next; char * command; - int (* handler)(int argc, unsigned char ** argv); + int (* handler)(int argc, char ** argv); int minargs; int maxargs; }; @@ -694,11 +694,11 @@ extern struct proxydef childdef; struct child { int argc; - unsigned char **argv; + char **argv; }; struct hashentry { - unsigned char hash[sizeof(unsigned)*4]; + char hash[sizeof(unsigned)*4]; time_t expires; struct hashentry *next; char value[4]; @@ -763,31 +763,31 @@ struct pluginlink { struct auth *authfuncs; struct commands * commandhandlers; void * (*findbyname)(const char *name); - int (*socksend)(SOCKET sock, unsigned char * buf, int bufsize, int to); - int (*socksendto)(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to); - int (*sockrecvfrom)(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to); + int (*socksend)(SOCKET sock, char * buf, int bufsize, int to); + int (*socksendto)(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to); + int (*sockrecvfrom)(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to); int (*sockgetcharcli)(struct clientparam * param, int timeosec, int timeousec); int (*sockgetcharsrv)(struct clientparam * param, int timeosec, int timeousec); - int (*sockgetlinebuf)(struct clientparam * param, DIRECTION which, unsigned char * buf, int bufsize, int delim, int to); + int (*sockgetlinebuf)(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to); int (*myinet_ntop)(int af, void *src, char *dst, socklen_t size); - int (*dobuf)(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec); - int (*dobuf2)(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format); - int (*scanaddr)(const unsigned char *s, unsigned long * ip, unsigned long * mask); - unsigned long (*getip46)(int family, unsigned char *name, struct sockaddr *sa); + int (*dobuf)(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec); + int (*dobuf2)(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format); + int (*scanaddr)(const char *s, unsigned long * ip, unsigned long * mask); + unsigned long (*getip46)(int family, char *name, struct sockaddr *sa); int (*sockmap)(struct clientparam * param, int timeo, int usesplice); int (*ACLMatches)(struct ace* acentry, struct clientparam * param); int (*alwaysauth)(struct clientparam * param); int (*checkACL)(struct clientparam * param); int (*checkpreACL)(struct clientparam * param); - void (*nametohash)(const unsigned char * name, unsigned char *hash); - unsigned (*hashindex)(const unsigned char* hash); - unsigned char* (*en64)(const unsigned char *in, unsigned char *out, int inlen); - int (*de64)(const unsigned char *in, unsigned char *out, int maxlen); - void (*tohex)(unsigned char *in, unsigned char *out, int len); - void (*fromhex)(unsigned char *in, unsigned char *out, int len); - void (*decodeurl)(unsigned char *s, int allowcr); - int (*parsestr) (unsigned char *str, unsigned char **argm, int nitems, unsigned char ** buff, int *inbuf, int *bufsize); - struct ace * (*make_ace) (int argc, unsigned char ** argv); + void (*nametohash)(const char * name, char *hash); + unsigned (*hashindex)(const char* hash); + char* (*en64)(const char *in, char *out, int inlen); + int (*de64)(const char *in, char *out, int maxlen); + void (*tohex)(char *in, char *out, int len); + void (*fromhex)(char *in, char *out, int len); + void (*decodeurl)(char *s, int allowcr); + int (*parsestr) (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize); + struct ace * (*make_ace) (int argc, char ** argv); void * (*mallocfunc)(size_t size); void (*freefunc)(void *ptr); void *(*reallocfunc)(void *ptr, size_t size); @@ -804,11 +804,11 @@ struct pluginlink { int (*parseusername)(char *username, struct clientparam *param, int extpasswd); int (*parseconnusername)(char *username, struct clientparam *param, int extpasswd, unsigned short port); struct sockfuncs *so; - unsigned char * (*dologname) (unsigned char *buf, int bufsize, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t); + char * (*dologname) (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t); }; struct counter_header { - unsigned char sig[4]; + char sig[4]; time_t updated; }; diff --git a/src/udppm.c b/src/udppm.c index 7d01730..842cc59 100644 --- a/src/udppm.c +++ b/src/udppm.c @@ -28,7 +28,7 @@ struct udpmap { void * udppmchild(struct clientparam* param) { - unsigned char *buf = NULL; + char *buf = NULL; int res, i; #ifdef _WIN32 SASIZETYPE size; diff --git a/src/webadmin.c b/src/webadmin.c index 615e403..46471bd 100644 --- a/src/webadmin.c +++ b/src/webadmin.c @@ -14,7 +14,7 @@ extern FILE *writable; FILE * confopen(); -extern void decodeurl(unsigned char *s, int filter); +extern void decodeurl(char *s, int filter); struct printparam { char buf[1024]; @@ -24,12 +24,12 @@ struct printparam { static void stdpr(struct printparam* pp, char *buf, int inbuf){ if((pp->inbuf + inbuf > 1024) || !buf) { - socksend(pp->cp->clisock, (unsigned char *)pp->buf, pp->inbuf, conf.timeouts[STRING_S]); + socksend(pp->cp->clisock, (char *)pp->buf, pp->inbuf, conf.timeouts[STRING_S]); pp->inbuf = 0; if(!buf) return; } if(inbuf >= 1000){ - socksend(pp->cp->clisock, (unsigned char *)buf, inbuf, conf.timeouts[STRING_S]); + socksend(pp->cp->clisock, (char *)buf, inbuf, conf.timeouts[STRING_S]); } else { memcpy(pp->buf + pp->inbuf, buf, inbuf); @@ -353,7 +353,7 @@ void * adminchild(struct clientparam* param) { buf = myalloc(LINESIZE); if(!buf) {RETURN(555);} - i = sockgetlinebuf(param, CLIENT, (unsigned char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S]); + i = sockgetlinebuf(param, CLIENT, (char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S]); if(i<5 || ((buf[0]!='G' || buf[1]!='E' || buf[2]!='T' || buf[3]!=' ' || buf[4]!='/') && (buf[0]!='P' || buf[1]!='O' || buf[2]!='S' || buf[3]!='T' || buf[4]!=' ' || buf[5]!='/'))) { @@ -366,7 +366,7 @@ void * adminchild(struct clientparam* param) { } *sb = 0; req = mystrdup(buf + ((*buf == 'P')? 6 : 5)); - while((i = sockgetlinebuf(param, CLIENT, (unsigned char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){ + while((i = sockgetlinebuf(param, CLIENT, (char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){ buf[i] = 0; if(i > 19 && (!strncasecmp(buf, "authorization", 13))){ sb = strchr(buf, ':'); @@ -378,17 +378,17 @@ void * adminchild(struct clientparam* param) { } sb+=5; while(isspace(*sb))sb++; - i = de64((unsigned char *)sb, (unsigned char *)username, 255); + i = de64((char *)sb, (char *)username, 255); if(i<=0)continue; username[i] = 0; sb = strchr((char *)username, ':'); if(sb){ *sb = 0; if(param->password)myfree(param->password); - param->password = (unsigned char *)mystrdup(sb+1); + param->password = (char *)mystrdup(sb+1); } if(param->username) myfree(param->username); - param->username = (unsigned char *)mystrdup(username); + param->username = (char *)mystrdup(username); continue; } else if(i > 15 && (!strncasecmp(buf, "content-length:", 15))){ @@ -542,14 +542,14 @@ void * adminchild(struct clientparam* param) { if(!writable || !contentlen || fseek(writable, 0, 0)){ error = 1; } - while(l < contentlen && (i = sockgetlinebuf(param, CLIENT, (unsigned char *)buf, (contentlen - l) > LINESIZE - 1?LINESIZE - 1:contentlen - l, '+', conf.timeouts[STRING_S])) > 0){ - if(i > (contentlen - l)) i = (contentlen - l); + while(l < contentlen && (i = sockgetlinebuf(param, CLIENT, (char *)buf, (contentlen - l) > LINESIZE - 1?LINESIZE - 1:contentlen - l, '+', conf.timeouts[STRING_S])) > 0){ + if(((unsigned)i) > (contentlen - l)) i = (int)(contentlen - l); if(!l){ if(i<9 || strncasecmp(buf, "conffile=", 9)) error = 1; } if(!error){ buf[i] = 0; - decodeurl((unsigned char *)buf, 1); + decodeurl((char *)buf, 1); fprintf(writable, "%s", l? buf : buf + 9); } l += i; @@ -576,7 +576,7 @@ CLEANRET: printstr(&pp, NULL); if(buf) myfree(buf); - dolog(param, (unsigned char *)req); + dolog(param, req); if(req)myfree(req); freeparam(param); return (NULL);