Bläddra i källkod

get rid of unsigned chars

z3APA3A 5 år sedan
förälder
incheckning
1f7a33d5ab

+ 6 - 6
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);

+ 2 - 8
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)

+ 37 - 52
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 *)&param->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(&param->sincr)!=AF_INET){
 		char *s = buf;
 		for(i=15; i>=0; i--){
-			unsigned char c=((unsigned char *)SAADDR(&param->sincr))[i];
+			char c=((char *)SAADDR(&param->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(&param->sincr), (unsigned char *)buf, (unsigned char *)addr, NULL, param, 1)) {
+	if(!udpresolve(*SAFAMILY(&param->sincr), (char *)buf, (char *)addr, NULL, param, 1)) {
 		return 3;
 	}
 	if(memcmp(SAADDR(&param->sincr), addr, SAADDRLEN(&param->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; i<n; i++){
 		unsigned short nq, na;
-		unsigned char b[4098], *buf, *s1, *s2;
+		char b[4098], *s1, *s2;
+		unsigned char *buf;
 		int j, k, len, flen;
 		SOCKET sock;
 		unsigned ttl;
@@ -1199,7 +1184,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
 		int usetcp = 0;
 		unsigned short serial = 1;
 
-		buf = b+2;
+		buf = (unsigned char*)b+2;
 
 		sinsl = (param && !makeauth)? &param->sinsl : &addr;
 		sinsr = (param && !makeauth)? &param->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);

+ 9 - 24
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);
 }
 
 

+ 7 - 7
src/base64.c

@@ -7,11 +7,11 @@
 
 #include <string.h>
 
-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<len; i++) {
@@ -91,13 +91,13 @@ void tohex(unsigned char *in, unsigned char *out, int len){
 	out[(i<<1)] = 0;
 }
 
-void fromhex(unsigned char *in, unsigned char *out, int len){
+void fromhex(char *in, char *out, int len){
 	char *c1, *c2;
 	for (; len > 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));
 		}
 	}
 }

+ 16 - 16
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;

+ 90 - 90
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; j<argc; j++) {
@@ -409,22 +409,22 @@ static int h_users(int argc, unsigned char **argv){
 		}
 		memset(pwl, 0, sizeof(struct passwords));
 
-		arg = (unsigned char *)strchr((char *)argv[j], ':');
+		arg = (char *)strchr((char *)argv[j], ':');
 		if(!arg||!arg[1]||!arg[2]||arg[3]!=':')	{
-			pwl->user = (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)){

+ 4 - 4
src/dnspr.c

@@ -153,12 +153,12 @@ void * dnsprchild(struct clientparam* param) {
 #endif
 	}
 
-	if(socksendto(param->remsock, (struct sockaddr *)&param->sinsr, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){
+	if(socksendto(param->remsock, (struct sockaddr *)&param->sinsr, (char *)buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){
 		RETURN(820);
 	}
 	param->statscli64 += i;
 	param->nwrites++;
-	len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->sinsr, buf, BUFSIZE, conf.timeouts[DNS_TO]*1000);
+	len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->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 *)&param->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){
+		if(socksendto(param->clisock, (struct sockaddr *)&param->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 *)&param->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000); 
+ res = socksendto(param->clisock, (struct sockaddr *)&param->sincr, (char *)buf, len, conf.timeouts[SINGLEBYTE_L]*1000); 
  if(res != len){RETURN(819);}
  if(!ip) {RETURN(888);}
 

+ 26 - 26
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);

+ 20 - 20
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(&param->sincl) == AF_INET)
 					sprintf((char *)buf, "227 OK (%u,%u,%u,%u,%u,%u)\r\n",
-					 (unsigned)(((unsigned char *)(SAADDR(&param->sincl)))[0]),
-					 (unsigned)(((unsigned char *)(SAADDR(&param->sincl)))[1]),
-					 (unsigned)(((unsigned char *)(SAADDR(&param->sincl)))[2]),
-					 (unsigned)(((unsigned char *)(SAADDR(&param->sincl)))[3]),
-					 (unsigned)(((unsigned char *)(SAPORT(&param->sincl)))[0]),
-					 (unsigned)(((unsigned char *)(SAPORT(&param->sincl)))[1])
+					 (unsigned)(((char *)(SAADDR(&param->sincl)))[0]),
+					 (unsigned)(((char *)(SAADDR(&param->sincl)))[1]),
+					 (unsigned)(((char *)(SAADDR(&param->sincl)))[2]),
+					 (unsigned)(((char *)(SAADDR(&param->sincl)))[3]),
+					 (unsigned)(((char *)(SAPORT(&param->sincl)))[0]),
+					 (unsigned)(((char *)(SAPORT(&param->sincl)))[1])
 					);
 				else sprintf((char *)buf, "227 OK (127,0,0,1,%u,%u)\r\n", 
-					 (unsigned)(((unsigned char *)(SAPORT(&param->sincl)))[0]),
-					 (unsigned)(((unsigned char *)(SAPORT(&param->sincl)))[1])
+					 (unsigned)(((char *)(SAPORT(&param->sincl)))[0]),
+					 (unsigned)(((char *)(SAPORT(&param->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 *)&param->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 *)&param->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);

+ 0 - 3821
src/libs/regex.c

@@ -1,3821 +0,0 @@
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <ctype.h>
-#include <assert.h>
-
-#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<<OPSHIFT)	/* endmarker	-			*/
-#define	OCHAR	(2<<OPSHIFT)	/* character	unsigned char		*/
-#define	OBOL	(3<<OPSHIFT)	/* left anchor	-			*/
-#define	OEOL	(4<<OPSHIFT)	/* right anchor	-			*/
-#define	OANY	(5<<OPSHIFT)	/* .		-			*/
-#define	OANYOF	(6<<OPSHIFT)	/* [...]	set number		*/
-#define	OBACK_	(7<<OPSHIFT)	/* begin \d	paren number		*/
-#define	O_BACK	(8<<OPSHIFT)	/* end \d	paren number		*/
-#define	OPLUS_	(9<<OPSHIFT)	/* + prefix	fwd to suffix		*/
-#define	O_PLUS	(10<<OPSHIFT)	/* + suffix	back to prefix		*/
-#define	OQUEST_	(11<<OPSHIFT)	/* ? prefix	fwd to suffix		*/
-#define	O_QUEST	(12<<OPSHIFT)	/* ? suffix	back to prefix		*/
-#define	OLPAREN	(13<<OPSHIFT)	/* (		fwd to )		*/
-#define	ORPAREN	(14<<OPSHIFT)	/* )		back to (		*/
-#define	OCH_	(15<<OPSHIFT)	/* begin choice	fwd to OOR2		*/
-#define	OOR1	(16<<OPSHIFT)	/* | pt. 1	back to OOR1 or OCH_	*/
-#define	OOR2	(17<<OPSHIFT)	/* | pt. 2	fwd to OOR2 or O_CH	*/
-#define	O_CH	(18<<OPSHIFT)	/* end choice	back to OOR1		*/
-#define	OBOW	(19<<OPSHIFT)	/* begin word	-			*/
-#define	OEOW	(20<<OPSHIFT)	/* end word	-			*/
-
-/*
- * Structure for [] character-set representation.  Character sets are
- * done as bit vectors, grouped 8 to a byte vector for compactness.
- * The individual set therefore has both a pointer to the byte vector
- * and a mask to pick out the relevant bit of each byte.  A hash code
- * simplifies testing whether two sets could be identical.
- *
- * This will get trickier for multicharacter collating elements.  As
- * preliminary hooks for dealing with such things, we also carry along
- * a string of multi-character elements, and decide the size of the
- * vectors at run time.
- */
-typedef struct {
-	uch *ptr;		/* -> 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 <assert.h>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&REG_EXTENDED) && (cflags&REG_NOSPEC))
-		return(REG_INVARG);
-
-	if (cflags&REG_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&REG_EXTENDED)
-		p_ere(p, OUT);
-	else if (cflags&REG_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&REG_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<<CHAR_BIT)
-
-	pos = HERE();		/* repetion op, if any, covers from here */
-
-	assert(MORE());		/* caller should have ensured this */
-	c = GETNEXT();
-	if (c == '\\') {
-		REQUIRE(MORE(), REG_EESCAPE);
-		c = BACKSL | (unsigned char)GETNEXT();
-	}
-	switch (c) {
-	case '.':
-		if (p->g->cflags&REG_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&REG_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&REG_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&REG_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<<OPSHIFT);
-
-	/* deal with undersized strip */
-	if (p->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<<OPSHIFT);
-	p->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&REG_NOSUB)
-		nmatch = 0;
-	if (eflags&REG_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&REG_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&REG_NOTBOL)) ||
-					(sp < m->endp && *(sp-1) == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) )
-				{ /* yes */ }
-			else
-				return(NULL);
-			break;
-		case OEOL:
-			if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
-					(sp < m->endp && *sp == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) )
-				{ /* yes */ }
-			else
-				return(NULL);
-			break;
-		case OBOW:
-			if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
-					(sp < m->endp && *(sp-1) == '\n' &&
-						(m->g->cflags&REG_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&REG_NOTEOL)) ||
-					(sp < m->endp && *sp == '\n' &&
-						(m->g->cflags&REG_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&REG_NEWLINE) ||
-				(lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
-			flagch = BOL;
-			i = m->g->nbol;
-		}
-		if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
-				(c == OUT && !(m->eflags&REG_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&REG_NEWLINE) ||
-				(lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
-			flagch = BOL;
-			i = m->g->nbol;
-		}
-		if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
-				(c == OUT && !(m->eflags&REG_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&REG_NOSUB)
-		nmatch = 0;
-	if (eflags&REG_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&REG_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&REG_NOTBOL)) ||
-					(sp < m->endp && *(sp-1) == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) )
-				{ /* yes */ }
-			else
-				return(NULL);
-			break;
-		case OEOL:
-			if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
-					(sp < m->endp && *sp == '\n' &&
-						(m->g->cflags&REG_NEWLINE)) )
-				{ /* yes */ }
-			else
-				return(NULL);
-			break;
-		case OBOW:
-			if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
-					(sp < m->endp && *(sp-1) == '\n' &&
-						(m->g->cflags&REG_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&REG_NOTEOL)) ||
-					(sp < m->endp && *sp == '\n' &&
-						(m->g->cflags&REG_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&REG_NEWLINE) ||
-				(lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
-			flagch = BOL;
-			i = m->g->nbol;
-		}
-		if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
-				(c == OUT && !(m->eflags&REG_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&REG_NEWLINE) ||
-				(lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
-			flagch = BOL;
-			i = m->g->nbol;
-		}
-		if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
-				(c == OUT && !(m->eflags&REG_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&REG_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<argc; i++){
-   s = regexec(&preg, argv[i], 0, NULL, 0);
-   fprintf(stdout, "String[%d]: ", i-1);
-   switch(s){
-	case 0:
-		printf("match\n");
-		break;
-	case REG_NOMATCH:
-		printf("not match\n");
-		break;
-	default:
-		printf("failed (%d)\n", s);
-   }
- }
- regfree(&preg);
- return 0;
-}
-#endif

+ 0 - 74
src/libs/regex.h

@@ -1,74 +0,0 @@
-/*
-
-  Minimal version of Henry Spencer's regex library 
-  with minor modifications
-
-*/
-
-
-#ifndef _REGEX_H_
-#define	_REGEX_H_
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef off_t regoff_t;
-typedef struct {
-	int re_magic;
-	size_t re_nsub;		/* number of parenthesized subexpressions */
-	const char *re_endp;	/* end pointer for REG_PEND */
-	struct re_guts *re_g;	/* none of your business :-) */
-} regex_t;
-typedef struct {
-	regoff_t rm_so;		/* start of match */
-	regoff_t rm_eo;		/* end of match */
-} regmatch_t;
-
-
-extern int regcomp(regex_t *, const char *, int);
-#define	REG_BASIC	0000
-#define	REG_EXTENDED	0001
-#define	REG_ICASE	0002
-#define	REG_NOSUB	0004
-#define	REG_NEWLINE	0010
-#define	REG_NOSPEC	0020
-#define	REG_PEND	0040
-#define	REG_DUMP	0200
-
-
-#define	REG_OKAY	 0
-#define	REG_NOMATCH	 1
-#define	REG_BADPAT	 2
-#define	REG_ECOLLATE	 3
-#define	REG_ECTYPE	 4
-#define	REG_EESCAPE	 5
-#define	REG_ESUBREG	 6
-#define	REG_EBRACK	 7
-#define	REG_EPAREN	 8
-#define	REG_EBRACE	 9
-#define	REG_BADBR	10
-#define	REG_ERANGE	11
-#define	REG_ESPACE	12
-#define	REG_BADRPT	13
-#define	REG_EMPTY	14
-#define	REG_ASSERT	15
-#define	REG_INVARG	16
-#define	REG_ATOI	255	/* convert name to number (!) */
-#define	REG_ITOA	0400	/* convert number to name (!) */
-
-
-extern int regexec(const regex_t *, const char *, size_t, regmatch_t [], int);
-#define	REG_NOTBOL	00001
-#define	REG_NOTEOL	00002
-#define	REG_STARTEND	00004
-#define	REG_TRACE	00400	/* tracing of execution */
-#define	REG_LARGE	01000	/* force large representation */
-#define	REG_BACKR	02000	/* force use of backref code */
-
-
-extern void regfree(regex_t *);
-
-#ifdef __cplusplus
-}
-#endif
-#endif

+ 0 - 321
src/libs/smbdes.c

@@ -1,321 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-
-   a partial implementation of DES designed for use in the 
-   SMB authentication protocol
-
-   Copyright (C) Andrew Tridgell 1998
-   
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-   
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-   
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include <string.h>
-#include <ctype.h>
-
-
-#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<n;i++)
-		out[i] = in[p[i]-1];
-}
-
-static void lshift(char *d, int count, int n)
-{
-	char out[64];
-	int i;
-	for (i=0;i<n;i++)
-		out[i] = d[(i+count)%n];
-	for (i=0;i<n;i++)
-		d[i] = out[i];
-}
-
-static void concat(char *out, char *in1, char *in2, int l1, int l2)
-{
-	while (l1--)
-		*out++ = *in1++;
-	while (l2--)
-		*out++ = *in2++;
-}
-
-static void xor(char *out, char *in1, char *in2, int n)
-{
-	int i;
-	for (i=0;i<n;i++)
-		out[i] = in1[i] ^ in2[i];
-}
-
-static void dohash(char *out, char *in, char *key)
-{
-	int i, j, k;
-	char pk1[56];
-	char c[28];
-	char d[28];
-	char cd[56];
-	char ki[16][48];
-	char pd1[64];
-	char l[32], r[32];
-	char rl[64];
-
-	permute(pk1, key, perm1, 56);
-
-	for (i=0;i<28;i++)
-		c[i] = pk1[i];
-	for (i=0;i<28;i++)
-		d[i] = pk1[i+28];
-
-	for (i=0;i<16;i++) {
-		lshift(c, sc[i], 28);
-		lshift(d, sc[i], 28);
-
-		concat(cd, c, d, 28, 28); 
-		permute(ki[i], cd, perm2, 48); 
-	}
-
-	permute(pd1, in, perm3, 64);
-
-	for (j=0;j<32;j++) {
-		l[j] = pd1[j];
-		r[j] = pd1[j+32];
-	}
-
-	for (i=0;i<16;i++) {
-		char er[48];
-		char erk[48];
-		char b[8][6];
-		char cb[32];
-		char pcb[32];
-		char r2[32];
-
-		permute(er, r, perm4, 48);
-
-		xor(erk, er, ki[i], 48);
-
-		for (j=0;j<8;j++)
-			for (k=0;k<6;k++)
-				b[j][k] = erk[j*6 + k];
-
-		for (j=0;j<8;j++) {
-			int m, n;
-			m = (b[j][0]<<1) | b[j][5];
-
-			n = (b[j][1]<<3) | (b[j][2]<<2) | (b[j][3]<<1) | b[j][4]; 
-
-			for (k=0;k<4;k++) 
-				b[j][k] = (sbox[j][m][n] & (1<<(3-k)))?1:0; 
-		}
-
-		for (j=0;j<8;j++)
-			for (k=0;k<4;k++)
-				cb[j*4+k] = b[j][k];
-		permute(pcb, cb, perm5, 32);
-
-		xor(r2, l, pcb, 32);
-
-		for (j=0;j<32;j++)
-			l[j] = r[j];
-
-		for (j=0;j<32;j++)
-			r[j] = r2[j];
-	}
-
-	concat(rl, r, l, 32, 32);
-
-	permute(out, rl, perm6, 64);
-}
-
-static void str_to_key(unsigned char *str,unsigned char *key)
-{
-	int i;
-
-	key[0] = str[0]>>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);
-}

+ 11 - 11
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, "\'");
 }
 
 

+ 16 - 16
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 <stdio.h>
 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;
 }

+ 0 - 88
src/ntlm.c

@@ -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; i<len; i++){
-		buf[i] = unicode[(i<<1)];
-	}
-	buf[i] = 0;
-}
-
-void genchallenge(struct clientparam *param, char * challenge, char *buf){
-	struct ntlmchal *chal;
-	char tmpbuf[1024];
-	char hostname[128];
-	int len, i;
-	
-
-	chal = (struct ntlmchal *)tmpbuf;
-	memset(chal, 0, 1024);
-	memcpy(chal->sig, "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(&param->sincr), 4);
-	challenge[1]^=*SAPORT(&param->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);	
-}

+ 5 - 5
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;

+ 7 - 7
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;
 }

+ 1 - 1
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 )
   {

+ 14 - 14
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;
     

+ 5 - 5
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;

+ 2 - 2
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)
 {
   
   

+ 4 - 4
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];

+ 11 - 11
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;

+ 2 - 2
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;

+ 2 - 2
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;
 }

+ 8 - 8
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;

+ 9 - 9
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);

+ 65 - 119
src/proxy.c

@@ -89,9 +89,6 @@ char * proxy_stringtable[] = {
 	"<body><h2>403 Access Denied</h2><h3>Access control list denies you to access this resource</body></html>\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[] = {
 	"<html><head><title>407 Proxy Authentication Required</title></head>\r\n"
 	"<body><h2>407 Proxy Authentication Required</h2><h3>Access to requested resource disallowed by administrator or you need valid username/password to use this resource</h3></body></html>\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);
-			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);
-			}
+			param->username = (char *)mystrdup((char *)username);
 			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, "<hr>", 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, " <A HREF=\"", 10);
 			inbuf+=10;
 			sb = NULL;
-			if(islink) sb = (unsigned char *)strstr((char *)tokens[filetoken], " -> ");
+			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(&param->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(&param->srv->intsa)), conf.stringtable?conf.stringtable[2]:(char *)"", conf.stringtable?conf.stringtable[3]:(char *)"");
 		if(anonymous != 2)myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->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);

+ 36 - 36
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);
 

+ 39 - 39
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*)&param->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*)&param->sinsr, (unsigned char *)"C", 1, CONNBACK_TO) != 1){
-			dolog(param, (unsigned char *)"Connect back sending command failed");
+		if(socksendto(param->remsock, (struct sockaddr*)&param->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;
 

+ 24 - 24
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);

+ 4 - 4
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;
 

+ 3 - 3
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;

+ 24 - 24
src/stringtable.c

@@ -9,26 +9,26 @@
 #include <stdio.h>
 #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 */	
 	"<table align=\"center\" width=\"75%\"><tr><td>\n"
 	"<h3>Welcome to 3proxy Web Interface</h3>\n"
 	"Probably you've noticed interface is very ugly currently.\n"

+ 44 - 44
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;
 };
 

+ 1 - 1
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;

+ 12 - 12
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);