📄 routevector.c
字号:
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 + -