⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 routevector.c

📁 wu-ftpd类unix下的ftp服务器,可用于嵌入式系统
💻 C
📖 第 1 页 / 共 2 页
字号:
    return (v);}static void makeportentry(v_paddr * p, u_long entry, u_short s_sig, char *minport_in, char *maxport_in){    p->s_address = entry;    p->s_sig = s_sig;    p->minport = atoi(minport_in);    p->maxport = atoi(maxport_in);    if (p->maxport < p->minport) {	p->minport = -1;	p->maxport = -1;    }}static void makevectentry(v_addr * p, u_long external_identity, u_long vector, u_short s_sig){    p->s_external_identity = external_identity;    p->s_vector = vector;    p->s_sig = s_sig;}static void addportentry(char *address_in, char *minport_in, char *maxport_in){    u_long entry;    int cmp;    u_short s_sig;    char *s1, *s2;    char addrstr[MAXHOSTNAMELEN + 1];    register unsigned short i, fnd;    s_sig = (u_short) 0;    if (PORTS == NULL) {	syslog(LOG_INFO, "ERROR port index addition, invalid ptr");	perror_reply(421, "Local resource failure: malloc");	dologout(1);    }    else {	if (strlen(address_in) > MAXHOSTNAMELEN)	    syslog(LOG_INFO, "ERROR ftpaccess port entry<%s> too large", address_in);	else {	    /* Find the significance of the entry ( if it exists )	       *  eg XXX.XXX.XXX.XXX/sig	     */	    for (i = 0; i < MAXHOSTNAMELEN; i++)		addrstr[i] = '\0';	    for (s1 = address_in, s2 = &(addrstr[0]); *s1 && *s1 != '/'; s1++, s2++)		*s2 = *s1;	    *s2 = '\0';	    if (*s1 == '/') {		s1++;		if (*s1)		    s_sig = (u_short) atoi(s1);	    }	    if ((int) (entry = ntohl(inet_addr(addrstr))) == -1)		syslog(LOG_INFO, "ERROR ftpaccess port entry<%s> invalid", address_in);	    else {		for (i = 0, fnd = 0; i < PORTS->count && fnd == 0 && entry != (u_long) 0; i++) {		    v_paddr *vp = *(PORTS->index + i);		    cmp = addr_cmp(vp->s_address, vp->s_sig, entry, s_sig);		    if (cmp == 0) {			fnd = 1;			makeportentry(vp, entry, s_sig, minport_in, maxport_in);		    }		    else if (cmp > 0) {			v_paddr *p1;			for (p1 = *(PORTS->index + PORTS->count); p1 >= vp; p1--)			    *p1 = *(p1 - 1);			fnd = 2;			makeportentry(vp, entry, s_sig, minport_in, maxport_in);			PORTS->count += 1;		    }		}		if (fnd == 0) {		    makeportentry(*(PORTS->index + PORTS->count), entry, s_sig, minport_in, maxport_in);		    PORTS->count += 1;		}		if (i == PORTS->slots) {		    syslog(LOG_INFO, "ERROR bad slot count  for port index record");		    perror_reply(421, "Local resource failure: malloc");		    dologout(1);		}	    }	}    }}static void addvectentry(char *external_identity_in, char *vector_in){    u_long external_identity, vector;    int cmp;    u_short s_sig;    char *s1, *s2;    char addrstr[MAXHOSTNAMELEN + 1];    register unsigned short i, fnd;    s_sig = (u_short) 0;    if (VECTORS == NULL) {	syslog(LOG_INFO, "ERROR vector index addition, invalid ptr");	perror_reply(421, "Local resource failure: malloc");	dologout(1);    }    else {	if (strlen(external_identity_in) > MAXHOSTNAMELEN)	    syslog(LOG_INFO, "ERROR ftpaccess passive entry <%s> to large", external_identity_in);	else {	    if (strlen(vector_in) > MAXHOSTNAMELEN)		syslog(LOG_INFO, "ERROR ftpaccess vector entry<%s> to large", vector_in);	    else {		/* Find the significance of the entry ( if it exists )		   *  eg XXX.XXX.XXX.XXX/sig		 */		for (i = 0; i < MAXHOSTNAMELEN; i++)		    addrstr[i] = '\0';		for (s1 = vector_in, s2 = &(addrstr[0]); *s1 && (*s1 != '/'); s1++, s2++)		    *s2 = *s1;		*s2 = '\0';		if (*s1 == '/') {		    s1++;		    if (*s1)			s_sig = (u_short) atoi(s1);		}		if ((int) (vector = ntohl(inet_addr(addrstr))) == -1)		    syslog(LOG_INFO, "ERROR ftpaccess vector entry<%s> invalid", vector_in);		else {		    if ((int) (external_identity = ntohl(inet_addr(external_identity_in))) == -1)			syslog(LOG_INFO, "ERROR ftpaccess vector entry<%s> invalid", external_identity_in);		    else {			for (i = 0, fnd = 0; i < VECTORS->count && fnd == 0 && vector != (u_long) 0; i++) {			    v_addr *vp = *(VECTORS->index + i);			    cmp = addr_cmp(vp->s_vector, vp->s_sig, vector, s_sig);			    if (cmp == 0) {				fnd = 1;				makevectentry(vp, external_identity, vector, s_sig);			    }			    else if (cmp > 0) {				v_addr *p1;				for (p1 = *(VECTORS->index + VECTORS->count); p1 >= vp; p1--)				    *p1 = *(p1 - 1);				fnd = 2;				makevectentry(vp, external_identity, vector, s_sig);				VECTORS->count += 1;			    }			}			if (fnd == 0) {			    makevectentry(*(VECTORS->index + VECTORS->count), external_identity, vector, s_sig);			    VECTORS->count += 1;			}			if (i >= VECTORS->slots) {			    syslog(LOG_INFO, "ERROR bad slot count  for passive vectors index record");			    perror_reply(421, "Local resource failure: malloc");			    dologout(1);			}		    }		}	    }	}    }}static void initportvectors(void){    struct aclmember *entry = NULL;    int pcnt;    int acnt;    pcnt = 0;    acnt = 0;    entry = (struct aclmember *) NULL;    while (getaclentry("passive", &entry)) {	if (!strcasecmp(ARG0, "ports")) {	    if (!ARG0 || !ARG1 || !ARG2)		continue;	    pcnt++;	}	if (!strcasecmp(ARG0, "address")) {	    if (!ARG0 || !ARG1 || !ARG2)		continue;	    acnt++;	}    }    PORTS = (pcnt > 0) ? initportstruct(pcnt) : NULL;    VECTORS = (acnt > 0) ? initvectstruct(acnt) : NULL;    while (getaclentry("passive", &entry)) {	if (!strcasecmp(ARG0, "ports"))	    addportentry(ARG1, ARG2, ARG3);	else if (!strcasecmp(ARG0, "address"))	    addvectentry(ARG1, ARG2);    }}/* compare two internet masks so that the significance order * is from the widest mask down (wide masks match before narrow ones) */static int addr_cmp(u_long s1, u_short s1_sig, u_long s2, u_short s2_sig){    if (s1_sig > s2_sig)	return (-1);    if (s1_sig < s2_sig)	return (1);    if (s1 < s2)	return (-1);    if (s1 > s2)	return (1);    return (0);}/* Compare the first x bits of two internet addresses  * 32  means match all ( return is zero on exact match only ) * 24  means match on first 3 bytes  * 16  means match on first 2 bytes  *  8  means match on first 1 bytes  *  0  means assume match ( match 0 bytes ) */#define BITS_PER_BYTE 8static int addr_smatch(u_long s1, u_long s2, u_short shift_in){    u_long sh1, sh2;    int shift;    if (shift_in > 0) {	shift = sizeof(u_long) * BITS_PER_BYTE;	if (shift >= (int) shift_in)	    shift -= (int) shift_in;	if (shift > 0) {	    sh2 = (s2 >> shift) << shift;	    sh1 = (s1 >> shift) << shift;	}	else {	    sh2 = s2;	    sh1 = s1;	}	if (sh1 < sh2)	    return (-1);	if (sh1 > sh2)	    return (1);    }    return (0);}static v_paddr *find_passive_port_entry(u_long addr){    register int i;    v_paddr *p;    if (PORTS != NULL)	for (i = 0; i < PORTS->count; i++) {	    p = *(PORTS->index + i);	    if (addr_smatch(addr, p->s_address, p->s_sig) == 0)		return (p);	}    return (NULL);}static v_addr *find_passive_vect_entry(u_long addr){    register int i;    v_addr *p;    if (VECTORS != NULL)	for (i = 0; i < VECTORS->count; i++) {	    p = *(VECTORS->index + i);	    if (addr_smatch(addr, p->s_vector, p->s_sig) == 0)		return (p);	}    return (NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -