int aa_service_status_write (aa_service_status *svst, const char *dir) { size_t len = strlen (dir); char file[len + 1 + sizeof (AA_SVST_FILENAME)]; mode_t mask; int r; int e; if (!stralloc_ready_tuned (&svst->sa, AA_SVST_FIXED_SIZE, 0, 0, 1)) return -1; tain_pack (svst->sa.s, &svst->stamp); uint32_pack (svst->sa.s + 12, (uint32_t) svst->event); uint32_pack (svst->sa.s + 16, (uint32_t) svst->code); if (svst->sa.len < AA_SVST_FIXED_SIZE) svst->sa.len = AA_SVST_FIXED_SIZE; byte_copy (file, len, dir); byte_copy (file + len, 1 + sizeof (AA_SVST_FILENAME), "/" AA_SVST_FILENAME); mask = umask (0033); if (!openwritenclose_suffix (file, svst->sa.s, svst->sa.len + ((svst->sa.len > AA_SVST_FIXED_SIZE) ? -1 : 0), ".new")) r = -1; else r = 0; e = errno; umask (mask); tain_now_g (); errno = e; return r; }
char *generate_answer(stralloc *answer, uint32 uid, char *lip, uint16 lport, char *rip, uint16 rport) { char *problem = "ok"; char *x; char buf[5]; stralloc out = {0}; stralloc tmp = {0}; stralloc key = {0}; /* get key from enviroment */ x = env_get("KEY"); if (!x) { problem = "$KEY not set"; strerr_warn1("didentd warning: $KEY not set using 'snakeoilkey'", NULL); x = "snakeoilkey"; } /* initialize rijndael with $KEY */ stralloc_copys(&key, x); txtparse(&key); pad(&key, 32); rijndaelKeySched(6, 8, key.s); /* build answer */ stralloc_cats(answer, " : USERID : OTHER : "); uint32_pack(buf, uid); stralloc_catb(&tmp, buf, 4); uint16_pack(buf, lport); stralloc_catb(&tmp, buf, 2); uint16_pack(buf, rport); stralloc_catb(&tmp, buf, 2); uint32_pack(buf, time(NULL)); stralloc_catb(&tmp, buf, 4); stralloc_catb(&tmp, lip, 4); stralloc_catb(&tmp, rip, 8); /* encrypt last part of answer with rijndael */ rijndaelEncrypt(tmp.s); stralloc_readyplus(&out, 32); base64encode(out.s, tmp.s, 24); stralloc_catb(answer, out.s, 32); stralloc_cats(answer, "\r\n"); stralloc_0(answer); return problem; }
int freelist_push (char *s, unsigned int *sp, unsigned int max, unsigned int n) { char pack[4] ; register unsigned int esize = freelist_size(max) ; if (*sp / esize >= max) return 0 ; uint32_pack(pack, (uint32)n) ; byte_copy(s + *sp, esize, pack) ; *sp += esize ; return 1 ; }
static int smb_handle_negotiate_request(unsigned char* c,size_t len,struct smb_response* sr) { size_t i,j,k; int ack; const char nr[2*17+100*2]= "\x11" // word count 17 "xx" // dialect index; ofs 1 "\x02" // security mode, for NT: plaintext passwords XOR unicode #if 0 "\x02\x00" // Max Mpx Count 2 "\x01\x00" // Max VCs 1 #else "\x10\x00" // Max Mpx Count 16 "\x10\x00" // Max VCs 16 #endif "\x04\x41\x00\x00" // Max Buffer Size (16644, like XP) "\x00\x00\x01\x00" // Max Raw Buffer (65536, like XP) "\x01\x02\x03\x04" // Session Key "\x5e\x40\x00\x00" // Capabilities, the bare minimum "xxxxxxxx" // system time; ofs 24 "xx" // server time zone; ofs 32 "\x00" // key len "xx" // byte count; ofs 35 ; // workgroup name; ofs 37 char* x; if (len<3) return -1; j=uint16_read((char*)c+1); if (len<3+j) return -1; ack=-1; for (k=0,i=3; i<3+j; ++k) { if (c[i]!=2) return -1; if (str_equal((char*)c+i+1,"NT LM 0.12")) { ack=k; break; } i+=2+str_len((char*)c+i+1); } if (ack==-1) return -1; // wrong dialect if (!(x=add_smb_response2(sr,nr,38+wglen16,0x72))) return -1; uint16_pack(x+1,ack); { struct timeval t; unsigned long long ntdate; gettimeofday(&t,&tz); ntdate=10000000ll * ( t.tv_sec + 11644473600ll ) + t.tv_usec * 10ll; uint32_pack(x+24,ntdate&0xffffffff); uint32_pack(x+24+4,ntdate>>32); uint16_pack(x+32,tz.tz_minuteswest); } uint16_pack(x+35,wglen16); byte_copy(x+37,wglen16,workgroup_utf16); return 0; }
static void rr_addloq(const char type[2],const char *d, uint32 loc, uint32 mid,uint32 uid) { #ifdef USE_LOCMAPS char map[8]; dbger("-addloq: %s,%u (%u),%u,%u",d,loc,NOMATCH_HASH,uid,mid); if (loc != NOMATCH_HASH) return; dbger("NOMATCH hash found, adding loq records for %s",d); /* if (byte_equal(type,2,DNS_T_A)) { dbger("lookup LOQ for A record %s",fqdn_read(out,d)); } dbger("+addloq %s,%u,%u",fqdn_read(out,d),mid,uid); */ if (!stralloc_copyb(&key,"\0?",2)) nomem(); if (!stralloc_catb(&key,type,2)) nomem(); if (!stralloc_catb(&key,d,dns_domain_length(d))) nomem(); uint32_pack(map,mid); uint32_pack(map+4,uid); cdb_make_add(&cdb,key.s,key.len,map,8); #endif return; }
void rr_start(const char type[2],unsigned long ttl,const char ttd[8],uint32 loc) { char buf[4]; char locp[4]; if (!stralloc_copyb(&result,type,2)) nomem(); //if (byte_equal(loc,2,"\0\0")) char[2]->>uint32loc if (loc == 0U) rr_add("=",1); else { rr_add(">",1); uint32_pack(locp,loc); rr_add(locp,4); } uint32_pack_big(buf,ttl); rr_add(buf,4); rr_add(ttd,8); }
int freelist_init (char *s, unsigned int *sp, unsigned int oldmax, unsigned int newmax) { unsigned int esize = freelist_size(newmax) ; char pack[4] ; register uint32 i = newmax ; #ifdef DEBUG lolprintf("freelist_init: sp is %u, adding freecells from %u to %u\n", *sp/esize, oldmax, newmax) ; buffer_flush(buffer_1) ; #endif for (; i > oldmax ; i--) { uint32_pack(pack, i-1) ; byte_copy(s + *sp, esize, pack) ; *sp += esize ; } return 1 ; }
int main(int argc,char **argv) { int fd; unsigned long loop; if (!*argv) _exit(0); if (!*++argv) _exit(0); scan_ulong(*argv,&loop); if (cdb_make_start(&c,1) == -1) die_write(); while (loop) { uint32_pack(key,--loop); if (cdb_make_add(&c,key,4,data,sizeof data) == -1) die_write(); } if (cdb_make_finish(&c) == -1) die_write(); _exit(0); }
void ttymodes_packt (char *s, ttymodes const *t) { unsigned int i ; uint32_pack(s, (uint32)NCCS) ; s += 4 ; uint64_pack(s, (uint64)t->ti.c_iflag) ; s += 8 ; uint64_pack(s, (uint64)t->ti.c_oflag) ; s += 8 ; uint64_pack(s, (uint64)t->ti.c_cflag) ; s += 8 ; uint64_pack(s, (uint64)t->ti.c_lflag) ; s += 8 ; for (i = 0 ; i < NCCS ; i++) { uint64_pack(s, t->ti.c_cc[i]) ; s += 8 ; } }
int main(int argc,char **argv) { long long pos; long long len; long long u; long long r; long long i; long long k; long long recent; long long nextaction; long long timeout; struct pollfd *q; struct pollfd *watch8; struct pollfd *watchtochild; struct pollfd *watchfromchild; signal(SIGPIPE,SIG_IGN); if (!argv[0]) die_usage(0); for (;;) { char *x; if (!argv[1]) break; if (argv[1][0] != '-') break; x = *++argv; if (x[0] == '-' && x[1] == 0) break; if (x[0] == '-' && x[1] == '-' && x[2] == 0) break; while (*++x) { if (*x == 'q') { flagverbose = 0; continue; } if (*x == 'Q') { flagverbose = 1; continue; } if (*x == 'v') { if (flagverbose == 2) flagverbose = 3; else flagverbose = 2; continue; } if (*x == 'c') { flagserver = 0; wantping = 2; continue; } if (*x == 'C') { flagserver = 0; wantping = 1; continue; } if (*x == 's') { flagserver = 1; wantping = 0; continue; } die_usage(0); } } if (!*++argv) die_usage("missing prog"); for (;;) { r = open_read("/dev/null"); if (r == -1) die_fatal("unable to open /dev/null",0,0); if (r > 9) { close(r); break; } } if (open_pipe(tochild) == -1) die_fatal("unable to create pipe",0,0); if (open_pipe(fromchild) == -1) die_fatal("unable to create pipe",0,0); blocking_enable(tochild[0]); blocking_enable(fromchild[1]); child = fork(); if (child == -1) die_fatal("unable to fork",0,0); if (child == 0) { close(8); close(9); if (flagserver) { close(0); if (dup(tochild[0]) != 0) die_fatal("unable to dup",0,0); close(1); if (dup(fromchild[1]) != 1) die_fatal("unable to dup",0,0); } else { close(6); if (dup(tochild[0]) != 6) die_fatal("unable to dup",0,0); close(7); if (dup(fromchild[1]) != 7) die_fatal("unable to dup",0,0); } signal(SIGPIPE,SIG_DFL); execvp(*argv,argv); die_fatal("unable to run",*argv,0); } close(tochild[0]); close(fromchild[1]); recent = nanoseconds(); lastspeedadjustment = recent; if (flagserver) maxblocklen = 1024; for (;;) { if (sendeofacked) if (receivewritten == receivetotalbytes) if (receiveeof) if (tochild[1] < 0) break; /* XXX: to re-ack should enter a TIME-WAIT state here */ q = p; watch8 = q; if (watch8) { q->fd = 8; q->events = POLLIN; ++q; } watchtochild = q; if (tochild[1] < 0) watchtochild = 0; if (receivewritten >= receivebytes) watchtochild = 0; if (watchtochild) { q->fd = tochild[1]; q->events = POLLOUT; ++q; } watchfromchild = q; if (sendeof) watchfromchild = 0; if (sendbytes + 4096 > sizeof sendbuf) watchfromchild = 0; if (watchfromchild) { q->fd = fromchild[0]; q->events = POLLIN; ++q; } nextaction = recent + 60000000000LL; if (wantping == 1) nextaction = recent + 1000000000; if (wantping == 2) nextaction = 0; if (blocknum < OUTGOING) if (!(sendeof ? sendeofprocessed : sendprocessed >= sendbytes)) if (nextaction > lastblocktime + nsecperblock) nextaction = lastblocktime + nsecperblock; if (earliestblocktime) { long long nextretry = earliestblocktime + rtt_timeout; if (nextretry < lastblocktime + nsecperblock) nextretry = lastblocktime + nsecperblock; if (nextretry < nextaction) nextaction = nextretry; } if (messagenum) if (!watchtochild) nextaction = 0; if (nextaction <= recent) timeout = 0; else timeout = (nextaction - recent) / 1000000 + 1; /* XXX */ if (childdied) timeout = 10; pollret = poll(p,q - p,timeout); if (pollret < 0) { watch8 = 0; watchtochild = 0; watchfromchild = 0; } else { if (watch8) if (!watch8->revents) watch8 = 0; if (watchtochild) if (!watchtochild->revents) watchtochild = 0; if (watchfromchild) if (!watchfromchild->revents) watchfromchild = 0; } /* XXX */ if (childdied && !pollret) { if (childdied++ > 999) goto finish; } /* XXX: keepalives */ do { /* try receiving data from child: */ if (!watchfromchild) break; if (sendeof) break; if (sendbytes + 4096 > sizeof sendbuf) break; pos = (sendacked & (sizeof sendbuf - 1)) + sendbytes; if (pos < sizeof sendbuf) { r = read(fromchild[0],sendbuf + pos,sizeof sendbuf - pos); } else { r = read(fromchild[0],sendbuf + pos - sizeof sendbuf,sizeof sendbuf - sendbytes); } if (r == -1) if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) break; if (r < 0) { sendeof = 4096; break; } if (r == 0) { sendeof = 2048; break; } sendbytes += r; if (sendbytes >= 1152921504606846976LL) die_internalerror(); } while(0); recent = nanoseconds(); do { /* try re-sending an old block: */ if (recent < lastblocktime + nsecperblock) break; if (earliestblocktime == 0) break; if (recent < earliestblocktime + rtt_timeout) break; for (i = 0;i < blocknum;++i) { pos = (blockfirst + i) & (OUTGOING - 1); if (blocktime[pos] == earliestblocktime) { if (recent > lastpanic + 4 * rtt_timeout) { nsecperblock *= 2; lastpanic = recent; lastedge = recent; } goto sendblock; } } } while(0); do { /* try sending a new block: */ if (recent < lastblocktime + nsecperblock) break; if (blocknum >= OUTGOING) break; if (!wantping) if (sendeof ? sendeofprocessed : sendprocessed >= sendbytes) break; /* XXX: if any Nagle-type processing is desired, do it here */ pos = (blockfirst + blocknum) & (OUTGOING - 1); ++blocknum; blockpos[pos] = sendacked + sendprocessed; blocklen[pos] = sendbytes - sendprocessed; if (blocklen[pos] > maxblocklen) blocklen[pos] = maxblocklen; if ((blockpos[pos] & (sizeof sendbuf - 1)) + blocklen[pos] > sizeof sendbuf) blocklen[pos] = sizeof sendbuf - (blockpos[pos] & (sizeof sendbuf - 1)); /* XXX: or could have the full block in post-buffer space */ sendprocessed += blocklen[pos]; blockeof[pos] = 0; if (sendprocessed == sendbytes) { blockeof[pos] = sendeof; if (sendeof) sendeofprocessed = 1; } blocktransmissions[pos] = 0; sendblock: blocktransmissions[pos] += 1; blocktime[pos] = recent; blockid[pos] = nextmessageid; if (!++nextmessageid) ++nextmessageid; /* constraints: u multiple of 16; u >= 16; u <= 1088; u >= 48 + blocklen[pos] */ u = 64 + blocklen[pos]; if (u <= 192) u = 192; else if (u <= 320) u = 320; else if (u <= 576) u = 576; else if (u <= 1088) u = 1088; else die_internalerror(); if (blocklen[pos] < 0 || blocklen[pos] > 1024) die_internalerror(); byte_zero(buf + 8,u); buf[7] = u / 16; uint32_pack(buf + 8,blockid[pos]); /* XXX: include any acknowledgments that have piled up */ uint16_pack(buf + 46,blockeof[pos] | (crypto_uint16) blocklen[pos]); uint64_pack(buf + 48,blockpos[pos]); byte_copy(buf + 8 + u - blocklen[pos],blocklen[pos],sendbuf + (blockpos[pos] & (sizeof sendbuf - 1))); if (writeall(9,buf + 7,u + 1) == -1) die_fatal("unable to write descriptor 9",0,0); lastblocktime = recent; wantping = 0; earliestblocktime_compute(); } while(0); do { /* try receiving messages: */ if (!watch8) break; r = read(8,buf,sizeof buf); if (r == -1) if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) break; if (r == 0) die_badmessage(); if (r < 0) die_fatal("unable to read from file descriptor 8",0,0); for (k = 0;k < r;++k) { messagetodo[messagetodolen++] = buf[k]; u = 16 * (unsigned long long) messagetodo[0]; if (u < 16) die_badmessage(); if (u > 1088) die_badmessage(); if (messagetodolen == 1 + u) { if (messagenum < INCOMING) { pos = (messagefirst + messagenum) & (INCOMING - 1); messagelen[pos] = messagetodo[0]; byte_copy(message[pos],u,messagetodo + 1); ++messagenum; } else { ; /* drop tail */ } messagetodolen = 0; } } } while(0); do { /* try processing a message: */ if (!messagenum) break; if (tochild[1] >= 0 && receivewritten < receivebytes) break; maxblocklen = 1024; pos = messagefirst & (INCOMING - 1); len = 16 * (unsigned long long) messagelen[pos]; do { /* handle this message if it's comprehensible: */ unsigned long long D; unsigned long long SF; unsigned long long startbyte; unsigned long long stopbyte; crypto_uint32 id; long long i; if (len < 48) break; if (len > 1088) break; id = uint32_unpack(message[pos] + 4); for (i = 0;i < blocknum;++i) { k = (blockfirst + i) & (OUTGOING - 1); if (blockid[k] == id) { rtt = recent - blocktime[k]; if (!rtt_average) { nsecperblock = rtt; rtt_average = rtt; rtt_deviation = rtt / 2; rtt_highwater = rtt; rtt_lowwater = rtt; } /* Jacobson's retransmission timeout calculation: */ rtt_delta = rtt - rtt_average; rtt_average += rtt_delta / 8; if (rtt_delta < 0) rtt_delta = -rtt_delta; rtt_delta -= rtt_deviation; rtt_deviation += rtt_delta / 4; rtt_timeout = rtt_average + 4 * rtt_deviation; /* adjust for delayed acks with anti-spiking: */ rtt_timeout += 8 * nsecperblock; /* recognizing top and bottom of congestion cycle: */ rtt_delta = rtt - rtt_highwater; rtt_highwater += rtt_delta / 1024; rtt_delta = rtt - rtt_lowwater; if (rtt_delta > 0) rtt_lowwater += rtt_delta / 8192; else rtt_lowwater += rtt_delta / 256; if (rtt_average > rtt_highwater + 5000000) rtt_seenrecenthigh = 1; else if (rtt_average < rtt_lowwater) rtt_seenrecentlow = 1; if (recent >= lastspeedadjustment + 16 * nsecperblock) { if (recent - lastspeedadjustment > 10000000000LL) { nsecperblock = 1000000000; /* slow restart */ nsecperblock += randommod(nsecperblock / 8); } lastspeedadjustment = recent; if (nsecperblock >= 131072) { /* additive increase: adjust 1/N by a constant c */ /* rtt-fair additive increase: adjust 1/N by a constant c every nanosecond */ /* approximation: adjust 1/N by cN every N nanoseconds */ /* i.e., N <- 1/(1/N + cN) = N/(1 + cN^2) every N nanoseconds */ if (nsecperblock < 16777216) { /* N/(1+cN^2) approx N - cN^3 */ u = nsecperblock / 131072; nsecperblock -= u * u * u; } else { double d = nsecperblock; nsecperblock = d/(1 + d*d / 2251799813685248.0); } } if (rtt_phase == 0) { if (rtt_seenolderhigh) { rtt_phase = 1; lastedge = recent; nsecperblock += randommod(nsecperblock / 4); } } else { if (rtt_seenolderlow) { rtt_phase = 0; } } rtt_seenolderhigh = rtt_seenrecenthigh; rtt_seenolderlow = rtt_seenrecentlow; rtt_seenrecenthigh = 0; rtt_seenrecentlow = 0; } do { if (recent - lastedge < 60000000000LL) { if (recent < lastdoubling + 4 * nsecperblock + 64 * rtt_timeout + 5000000000LL) break; } else { if (recent < lastdoubling + 4 * nsecperblock + 2 * rtt_timeout) break; } if (nsecperblock <= 65535) break; nsecperblock /= 2; lastdoubling = recent; if (lastedge) lastedge = recent; } while(0); } } stopbyte = uint64_unpack(message[pos] + 8); acknowledged(0,stopbyte); startbyte = stopbyte + (unsigned long long) uint32_unpack(message[pos] + 16); stopbyte = startbyte + (unsigned long long) uint16_unpack(message[pos] + 20); acknowledged(startbyte,stopbyte); startbyte = stopbyte + (unsigned long long) uint16_unpack(message[pos] + 22); stopbyte = startbyte + (unsigned long long) uint16_unpack(message[pos] + 24); acknowledged(startbyte,stopbyte); startbyte = stopbyte + (unsigned long long) uint16_unpack(message[pos] + 26); stopbyte = startbyte + (unsigned long long) uint16_unpack(message[pos] + 28); acknowledged(startbyte,stopbyte); startbyte = stopbyte + (unsigned long long) uint16_unpack(message[pos] + 30); stopbyte = startbyte + (unsigned long long) uint16_unpack(message[pos] + 32); acknowledged(startbyte,stopbyte); startbyte = stopbyte + (unsigned long long) uint16_unpack(message[pos] + 34); stopbyte = startbyte + (unsigned long long) uint16_unpack(message[pos] + 36); acknowledged(startbyte,stopbyte); D = uint16_unpack(message[pos] + 38); SF = D & (2048 + 4096); D -= SF; if (D > 1024) break; if (48 + D > len) break; startbyte = uint64_unpack(message[pos] + 40); stopbyte = startbyte + D; if (stopbyte > receivewritten + sizeof receivebuf) { break; /* of course, flow control would avoid this case */ } if (SF) { receiveeof = SF; receivetotalbytes = stopbyte; } for (k = 0;k < D;++k) { unsigned char ch = message[pos][len - D + k]; unsigned long long where = startbyte + k; if (where >= receivewritten && where < receivewritten + sizeof receivebuf) { receivevalid[where & (sizeof receivebuf - 1)] = 1; receivebuf[where & (sizeof receivebuf - 1)] = ch; } } for (;;) { if (receivebytes >= receivewritten + sizeof receivebuf) break; if (!receivevalid[receivebytes & (sizeof receivebuf - 1)]) break; ++receivebytes; } if (!uint32_unpack(message[pos])) break; /* never acknowledge a pure acknowledgment */ /* XXX: delay acknowledgments */ u = 192; byte_zero(buf + 8,u); buf[7] = u / 16; byte_copy(buf + 12,4,message[pos]); if (receiveeof && receivebytes == receivetotalbytes) { uint64_pack(buf + 16,receivebytes + 1); } else uint64_pack(buf + 16,receivebytes); /* XXX: incorporate selective acknowledgments */ if (writeall(9,buf + 7,u + 1) == -1) die_fatal("unable to write descriptor 9",0,0); } while(0); ++messagefirst; --messagenum; } while(0); do { /* try sending data to child: */ if (!watchtochild) break; if (tochild[1] < 0) { receivewritten = receivebytes; break; } if (receivewritten >= receivebytes) break; pos = receivewritten & (sizeof receivebuf - 1); len = receivebytes - receivewritten; if (pos + len > sizeof receivebuf) len = sizeof receivebuf - pos; r = write(tochild[1],receivebuf + pos,len); if (r == -1) if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) break; if (r <= 0) { close(tochild[1]); tochild[1] = -1; break; } byte_zero(receivevalid + pos,r); receivewritten += r; } while(0); do { /* try closing pipe to child: */ if (!receiveeof) break; if (receivewritten < receivetotalbytes) break; if (tochild[1] < 0) break; if (receiveeof == 4096) ; /* XXX: UNIX doesn't provide a way to signal an error through a pipe */ close(tochild[1]); tochild[1] = -1; } while(0); /* XXX */ if (!childdied){ if (waitpid(child,&childstatus, WNOHANG) > 0) { close(tochild[1]); tochild[1] = -1; childdied = 1; } } } if (!childdied) { do { r = waitpid(child,&childstatus,0); } while (r == -1 && errno == EINTR); } finish: if (!WIFEXITED(childstatus)) { errno = 0; die_fatal("process killed by signal",0,0); } return WEXITSTATUS(childstatus); }
int main(int argc, char **argv) { int fddata; uint32 loc; //int v; char ipa[4]; //char ipb[4]; //ip4_cidr_t *subnets = (ip4_cidr_t *)NULL; //unsigned int slen = 0; uint32 ipinta = 0U; //unsigned int ipintb = 0; unsigned short mask; uint32 uid = 0; uint32 mid = 0; int i; int j; int k; char ch; unsigned long ttl; char ttd[8]; //uint32 loc; unsigned char keyloc[15]; unsigned long u; char ip[4]; char locp[4]; //char map[9]; char type[2]; char soa[20]; char buf[4]; //int namlen = 0; umask(022); fddata = STDIN_FILENO; if (argc != 3) { fddata = open_read("data"); if (fddata == -1) strerr_die2sys(111,FATAL,"unable to open data: "); if ( (fdcdb = open_trunc("data.tmp")) == -1) die_datatmp(); } else { fddata = STDIN_FILENO; if ( (fdcdb = open_trunc(argv[1])) == -1) die_datatmp(); } defaultsoa_init(fddata); buffer_init(&b,buffer_unixread,fddata,bspace,sizeof bspace); if (cdb_make_start(&cdb,fdcdb) == -1) die_datatmp(); while (match) { ++linenum; if (getln(&b,&line,&match,'\n') == -1) strerr_die2sys(111,FATAL,"unable to read line: "); while (line.len) { ch = line.s[line.len - 1]; if ((ch != ' ') && (ch != '\t') && (ch != '\n')) break; --line.len; } if (!line.len) continue; if (line.s[0] == '#') continue; if (line.s[0] == '-') continue; //write(1,line.s,line.len); //write(1,"\n",1); j = 1; for (i = 0;i < NUMFIELDS;++i) { if (j >= line.len) { if (!stralloc_copys(&f[i],"")) nomem(); } else { k = byte_chr(line.s + j,line.len - j,':'); if (!stralloc_copyb(&f[i],line.s + j,k)) nomem(); j += k + 1; } } switch(line.s[0]) { #ifdef USE_LOCMAPS case '%': //locparse(&f[0],loc); loc = gethash(f[0].s,f[0].len); uint32_pack(locp,loc); if (!stralloc_0(&f[1])) nomem(); if (!stralloc_0(&f[2])) nomem(); ip4_scan(f[1].s,ipa); //ip4_scan(f[2].s,ipb); scan_ushort(f[2].s,&mask); ip4_num(&ipinta,ipa); //ip4_num(&ipintb,ipb); //if (ipintb<ipinta) nomem(); //if (ip4_deaggregate(ipinta,ipintb,&subnets,&slen) <= 0) nomem(); mid = gethash(f[3].s,f[3].len); uid = gethash(f[4].s,f[4].len); //for (v = 0; v < slen; v++) { ipdb_key4build(keyloc,ipinta,(unsigned char )mask&0xff,mid,uid); //ipdb_key_from_uint(keyloc,ipinta,(unsigned char )mask&0xff,0,mid,uid); cdb_make_add(&cdb,keyloc,15,locp,4); //} uid = 0; //alloc_free(subnets); //subnets = NULL; //slen = 0; byte_zero(ipa,4);ipinta=0; //byte_zero(ipb,4);ipinta=0;ipintb=0; break; #endif case 'Z': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!stralloc_0(&f[3])) nomem(); if (!scan_ulong(f[3].s,&u)) uint32_unpack_big(defaultsoa,&u); uint32_pack_big(soa,u); if (!stralloc_0(&f[4])) nomem(); if (!scan_ulong(f[4].s,&u)) uint32_unpack_big(defaultsoa + 4,&u); uint32_pack_big(soa + 4,u); if (!stralloc_0(&f[5])) nomem(); if (!scan_ulong(f[5].s,&u)) uint32_unpack_big(defaultsoa + 8,&u); uint32_pack_big(soa + 8,u); if (!stralloc_0(&f[6])) nomem(); if (!scan_ulong(f[6].s,&u)) uint32_unpack_big(defaultsoa + 12,&u); uint32_pack_big(soa + 12,u); if (!stralloc_0(&f[7])) nomem(); if (!scan_ulong(f[7].s,&u)) uint32_unpack_big(defaultsoa + 16,&u); uint32_pack_big(soa + 16,u); if (!stralloc_0(&f[8])) nomem(); if (!scan_ulong(f[8].s,&ttl)) ttl = TTL_NEGATIVE; ttdparse(&f[9],ttd); loc = gethash(f[10].s,f[10].len); mid = gethash(f[11].s,f[11].len); uid = gethash(f[12].s,f[12].len); rr_addloq(DNS_T_SOA,d1,loc,mid,uid); rr_start(DNS_T_SOA,ttl,ttd,loc); if (!dns_domain_fromdot(&d2,f[1].s,f[1].len)) nomem(); rr_addname(d2); if (!dns_domain_fromdot(&d2,f[2].s,f[2].len)) nomem(); rr_addname(d2); rr_add(soa,20); rr_finish(d1); break; case '.': case '&': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!stralloc_0(&f[3])) nomem(); if (!scan_ulong(f[3].s,&ttl)) ttl = TTL_NS; ttdparse(&f[4],ttd); loc = gethash(f[5].s,f[5].len); mid = gethash(f[6].s,f[6].len); uid = gethash(f[7].s,f[7].len); if (!stralloc_0(&f[1])) nomem(); if (byte_chr(f[2].s,f[2].len,'.') >= f[2].len) { if (!stralloc_cats(&f[2],".ns.")) nomem(); if (!stralloc_catb(&f[2],f[0].s,f[0].len)) nomem(); } if (!dns_domain_fromdot(&d2,f[2].s,f[2].len)) nomem(); if (line.s[0] == '.') { rr_start(DNS_T_SOA,ttl ? TTL_NEGATIVE : 0,ttd,loc); rr_addloq(DNS_T_SOA,d1,loc,mid,uid); rr_addname(d2); rr_add("\12hostmaster",11); rr_addname(d1); rr_add(defaultsoa,20); rr_finish(d1); } rr_start(DNS_T_NS,ttl,ttd,loc); rr_addname(d2); rr_addloq(DNS_T_NS,d2,loc,mid,uid); rr_finish(d1); if (ip4_scan(f[1].s,ip)) { rr_start(DNS_T_A,ttl,ttd,loc); rr_addloq(DNS_T_A,d2,loc,mid,uid); rr_add(ip,4); rr_finish(d2); } break; case '+': case '=': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!stralloc_0(&f[2])) nomem(); if (!scan_ulong(f[2].s,&ttl)) ttl = TTL_POSITIVE; ttdparse(&f[3],ttd); loc = gethash(f[4].s,f[4].len); mid = gethash(f[5].s,f[5].len); uid = gethash(f[6].s,f[6].len); if (!stralloc_0(&f[1])) nomem(); if (ip4_scan(f[1].s,ip)) { rr_addloq(DNS_T_A,d1,loc,mid,uid); rr_start(DNS_T_A,ttl,ttd,loc); //dbger("+addloq:d=%s,loc=%u,uid=%u,mid=%u",d1,loc,uid,mid); rr_add(ip,4); rr_finish(d1); if (line.s[0] == '=') { rr_addloq(DNS_T_PTR,d1,loc,mid,uid); //??????????????????/ TODO: checkthis dns_name4_domain(dptr,ip); rr_start(DNS_T_PTR,ttl,ttd,loc); rr_addname(d1); rr_finish(dptr); } } break; case '@': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!stralloc_0(&f[4])) nomem(); if (!scan_ulong(f[4].s,&ttl)) ttl = TTL_POSITIVE; ttdparse(&f[5],ttd); loc = gethash(f[6].s,f[6].len); mid = gethash(f[7].s,f[7].len); uid = gethash(f[8].s,f[8].len); if (!stralloc_0(&f[1])) nomem(); if (byte_chr(f[2].s,f[2].len,'.') >= f[2].len) { if (!stralloc_cats(&f[2],".mx.")) nomem(); if (!stralloc_catb(&f[2],f[0].s,f[0].len)) nomem(); } if (!dns_domain_fromdot(&d2,f[2].s,f[2].len)) nomem(); if (!stralloc_0(&f[3])) nomem(); if (!scan_ulong(f[3].s,&u)) u = 0; rr_addloq(DNS_T_MX,d1,loc,mid,uid); rr_start(DNS_T_MX,ttl,ttd,loc); uint16_pack_big(buf,u); rr_add(buf,2); rr_addname(d2); rr_finish(d1); if (ip4_scan(f[1].s,ip)) { rr_addloq(DNS_T_A,d2,loc,mid,uid); rr_start(DNS_T_A,ttl,ttd,loc); rr_add(ip,4); rr_finish(d2); } break; case '^': case 'C': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!dns_domain_fromdot(&d2,f[1].s,f[1].len)) nomem(); if (!stralloc_0(&f[2])) nomem(); if (!scan_ulong(f[2].s,&ttl)) ttl = TTL_POSITIVE; ttdparse(&f[3],ttd); loc = gethash(f[4].s,f[4].len); mid = gethash(f[5].s,f[5].len); uid = gethash(f[6].s,f[6].len); if (line.s[0] == 'C') { //rr_addloq(DNS_T_CNAME,d1,loc,mid,uid); //dbger("add loq for cname!"); rr_addloq(DNS_T_A,d1,loc,mid,uid); rr_addloq(DNS_T_CNAME,d1,loc,mid,uid); rr_start(DNS_T_CNAME,ttl,ttd,loc); } else { rr_addloq(DNS_T_PTR,d1,loc,mid,uid); rr_start(DNS_T_PTR,ttl,ttd,loc); } rr_addname(d2); rr_finish(d1); break; case '\'': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!stralloc_0(&f[2])) nomem(); if (!scan_ulong(f[2].s,&ttl)) ttl = TTL_POSITIVE; ttdparse(&f[3],ttd); loc = gethash(f[4].s,f[4].len); mid = gethash(f[5].s,f[5].len); uid = gethash(f[6].s,f[6].len); rr_addloq(DNS_T_TXT,d1,loc,mid,uid); rr_start(DNS_T_TXT,ttl,ttd,loc); txtparse(&f[1]); i = 0; while (i < f[1].len) { k = f[1].len - i; if (k > 127) k = 127; ch = k; rr_add(&ch,1); rr_add(f[1].s + i,k); i += k; } rr_finish(d1); break; case ':': if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem(); if (!stralloc_0(&f[3])) nomem(); if (!scan_ulong(f[3].s,&ttl)) ttl = TTL_POSITIVE; ttdparse(&f[4],ttd); loc = gethash(f[5].s,f[5].len); mid = gethash(f[6].s,f[6].len); uid = gethash(f[7].s,f[7].len); if (!stralloc_0(&f[1])) nomem(); scan_ulong(f[1].s,&u); uint16_pack_big(type,u); if (byte_equal(type,2,DNS_T_AXFR)) syntaxerror(": type AXFR prohibited"); if (byte_equal(type,2,"\0\0")) syntaxerror(": type 0 prohibited"); if (byte_equal(type,2,DNS_T_SOA)) syntaxerror(": type SOA prohibited"); if (byte_equal(type,2,DNS_T_NS)) syntaxerror(": type NS prohibited"); if (byte_equal(type,2,DNS_T_CNAME)) syntaxerror(": type CNAME prohibited"); if (byte_equal(type,2,DNS_T_PTR)) syntaxerror(": type PTR prohibited"); if (byte_equal(type,2,DNS_T_MX)) syntaxerror(": type MX prohibited"); txtparse(&f[2]); rr_addloq(type,d1,loc,mid,uid); rr_start(type,ttl,ttd,loc); rr_add(f[2].s,f[2].len); rr_finish(d1); break; default: dienow("error here: %s\n", line.s); syntaxerror(": unrecognized leading character"); } } if (cdb_make_finish(&cdb) == -1) die_datatmp(); if (fsync(fdcdb) == -1) die_datatmp(); if (close(fdcdb) == -1) die_datatmp(); /* NFS stupidity */ if (argc == 3) { if (rename(argv[1],argv[2]) == -1) strerr_die2sys(111,FATAL,"unable to move data.tmp to data.cdb: "); } else { if (rename("data.tmp","data.cdb") == -1) strerr_die2sys(111,FATAL,"unable to move data.tmp to data.cdb: "); } _exit(0); }
void taia_pack_little (char *s, struct taia const *t) { uint32_pack(s, t->atto) ; uint32_pack(s+4, t->nano) ; tai_pack_little(s+8, &t->sec) ; }
static int smb_handle_OpenAndX(struct http_data* h,unsigned char* c,size_t len,uint32_t pid,struct smb_response* sr) { static const char nr[34]= "\x0f" // word count 15 "\xff" // AndXCommand "\x00" // Reserved "w1" // AndXOffset; ofs 3 "w2" // FID; ofs 5 "\x00\x00" // file attributes; normal file "u1__" // ctime; ofs 9 "u2__" // file size; ofs 13 "\x00\x00" // granted access: read, compatibility mode, caching permitted "\x00\x00" // file type: disk file or directory "\x00\x00" // ipc state "\x01\x00" // action: file existed and was opened "\x00\x00\x00\x00" // server FID (?!?) "\x00\x00" // reserved "\x00\x00" // byte count 0 ; if (len<2*15 || c[0]!=15) return -1; /* see if it is an open for reading */ if ((c[7]&7) || ((c[17]&3)!=1)) { /* we only support read access */ // printf("non-read-access requested: %x %x!\n",c[7],c[17]); set_smb_error(sr,ERROR_ACCESS_DENIED,0x2d); return 0; } /* now look at file name */ { size_t fnlen=uint16_read((char*)c+31); uint16_t* remotefilename=(uint16_t*)(c+34); struct stat ss; struct handle* hdl; int fd; char* x; if (fnlen%2) --fnlen; if (fnlen>2046 || ((uintptr_t)remotefilename%2)) return -1; hdl=alloc_handle(&h->h); if (!hdl) { // printf("could not open file handle!"); set_smb_error(sr,STATUS_TOO_MANY_OPENED_FILES,0x2d); return 0; } fd=smb_open(h,remotefilename,fnlen,&ss,WANT_OPEN); if (fd==-1) { set_smb_error(sr,ERROR_OBJECT_NAME_NOT_FOUND,0x2d); close_handle(hdl); return 0; } hdl->fd=fd; hdl->pid=pid; hdl->size=ss.st_size; hdl->cur=0; hdl->filename=malloc(fnlen+2); if (hdl->filename) { memcpy(hdl->filename+1,remotefilename,fnlen); hdl->filename[0]=fnlen; } { size_t oldlen=sr->used; if (!(x=add_smb_response2(sr,nr,15*2+3,0x2d))) return -1; uint16_pack(x+OFS16(nr,"w1"),oldlen+15*2+3); } uint16_pack(x+OFS16(nr,"w2"),hdl->handle); uint32_pack(x+OFS16(nr,"u1"),ss.st_mtime); uint32_pack(x+OFS16(nr,"u2"),ss.st_size); } return 0; }
static void set_smb_error(struct smb_response* sr,uint32_t error,unsigned char req) { add_smb_response(sr,"\x00\x00",3,req); assert(sr->allocated>=0x20); uint32_pack(sr->buf+4+5,error); }
size_t fmt_pb_type5_fixed32(char* dest,uint32_t l) { if (dest) uint32_pack(dest,l); return 4; }