static void sdl_free(struct sdlist *sdl) { free(sdl->tag); free(sdl->string); free(sdl->addrs); sdl_clear(sdl); }
uint64_t kick(uint64_t f) { switch(f) { case 0x102: printf("%lx ", *llsp++); fflush(stdout); break; case 0x103: stack(); break; case 0x104: if(*llsp) putchar(*llsp); llsp++; fflush(stdout); break; case 0x204: { void *p=(void*)(*llsp++); return (uint64_t)realloc(p,*llsp++); } case 0x300: sdl_init(); break; case 0x301: sdl_poll(); break; case 0x302: sdl_clear(); break; case 0x303: { int c=*llsp++; int p=*llsp++; return sdl_char(c,p&0xffff,p>>16); }; case 0x304: sdl_color(*llsp++); break; } return 0; }
int sdl_add(char *sdname, char *sdstring, char ** addrs, int addrc) { int i, idx = -1; char astring[40]; unsigned int maskbits; struct sdaddr *m, *n; /* * if a blacklist of same tag name is already there, replace it, * otherwise append. */ for (i = 0; i < blu; i++) { if (strcmp(blacklists[i].tag, sdname) == 0) { idx = i; break; } } if (idx != -1) { if (debug > 0) printf("replacing list %s; %d new entries\n", blacklists[idx].tag, addrc); sdl_free(&blacklists[idx]); } else { if (debug > 0) printf("adding list %s; %d entries\n", sdname, addrc); idx = blu; } if (idx == blu && blu == blc) { struct sdlist *tmp; tmp = realloc(blacklists, (blc + 128) * sizeof(struct sdlist)); if (tmp == NULL) return (-1); blacklists = tmp; blc += 128; sdl_clear(&blacklists[idx]); } if ((blacklists[idx].tag = strdup(sdname)) == NULL) goto misc_error; if ((blacklists[idx].string = strdup(sdstring)) == NULL) goto misc_error; blacklists[idx].naddrs = addrc; /* * Cycle through addrs, converting. We assume they are correctly * formatted v4 and v6 addrs, if they don't all convert correctly, the * add fails. Each address should be address/maskbits */ blacklists[idx].addrs = malloc(addrc * sizeof(struct sdentry)); if (blacklists[idx].addrs == NULL) goto misc_error; for (i = 0; i < addrc; i++) { int j, k, af; n = &blacklists[idx].addrs[i].sda; m = &blacklists[idx].addrs[i].sdm; j = sscanf(addrs[i], "%39[^/]/%u", astring, &maskbits); if (j != 2) goto parse_error; if (maskbits > 128) goto parse_error; /* * sanity check! we don't allow a 0 mask - * don't blacklist the entire net. */ if (maskbits == 0) goto parse_error; if (strchr(astring, ':') != NULL) af = AF_INET6; else af = AF_INET; if (af == AF_INET && maskbits > 32) goto parse_error; j = inet_pton(af, astring, n); if (j != 1) goto parse_error; if (debug > 0) printf("added %s/%u\n", astring, maskbits); /* set mask, borrowed from pf */ k = 0; for (j = 0; j < 4; j++) m->addr32[j] = 0; while (maskbits >= 32) { m->addr32[k++] = 0xffffffff; maskbits -= 32; } for (j = 31; j > 31 - maskbits; --j) m->addr32[k] |= (1 << j); if (maskbits) m->addr32[k] = htonl(m->addr32[k]); /* mask off address bits that won't ever be used */ for (j = 0; j < 4; j++) n->addr32[j] = n->addr32[j] & m->addr32[j]; } if (idx == blu) { blu++; blacklists[blu].tag = NULL; } return (0); parse_error: if (debug > 0) printf("sdl_add: parse error, \"%s\"\n", addrs[i]); misc_error: sdl_free(&blacklists[idx]); return (-1); }