int saferead(int fd, void *buf, int len) { int r; r = timeoutread(60,qmqpfd,buf,len); if (r <= 0) die_conn(); return r; }
int saferead(int fd, void *buf, int len) { int r; r = timeoutread(1200,fd,buf,len); if (r <= 0) die(); return r; }
void netread(char *buf,unsigned int len) { int r; while (len > 0) { r = timeoutread(60,0,buf,len); if (r == 0) _exit(0); if (r < 0) die_netread(); buf += r; len -= r; } }
static int waitread(int fd, char *buf, unsigned int len) { int r; r = timeoutread(60, fd, buf, len); if (r <= 0) if(errno != error_timeout) /* XXX: should we ignore (some) errors ? */ die_read(); return r; }
void netread (char *buf, unsigned int len) { int r = 0; while (len > 0) { r = timeoutread (60, 0, buf, len); if (r == 0) exit (0); if (r < 0) err (-1, "could not read from the network"); buf += r; len -= r; } }
int main() { unsigned char *remotehost, *remoteip, *remoteport, *localip, *localport; unsigned char query[256] = {0}; uint32 uid = 0xffffffff; // that's our default for "not found" int query_len = 0; int pos = 0; char *problem = "ok"; stralloc answer = {0}; char strnum[FMT_ULONG]; int proto = 0; char *x; char lip[16] = {0}; char rip[16] = {0}; uint16 lport = 0; uint16 rport = 0; didentd_init(); x = env_get("PROTO"); if(x) { if(str_equal(x, "TCP")) proto = 4; if(str_equal(x, "TCP6")) proto = 6; } if(proto == 0) { buffer_puts(buffer_2, "warning: can't determine $PROTO\n"); buffer_flush(buffer_2); } srandom(((long long) getpid () * (long long) time(0) * (long long) getppid() * (long long) random() * (long long) clock()) % 0xffffffff); /* since we run under tcpserver, we can get all info about the remote side from the enviroment */ remotehost = env_get("TCPREMOTEHOST"); if (!remotehost) remotehost = "unknown"; remoteport = env_get("TCPREMOTEPORT"); if (remoteport) scan_ushort(remoteport, &rport); else remoteport = "0"; localport = env_get("TCPLOCALPORT"); if (localport) scan_ushort(localport, &lport); else localport = "0"; remoteip = env_get("TCPREMOTEIP"); if (!remoteip) remoteip = "0.0.0.0"; localip = env_get("TCPLOCALIP"); if (!localip) localip = "0.0.0.0"; if(proto == 4) { if(remoteip) ip4_scan(remoteip, rip); if(localip) ip4_scan(localip, lip); /* seed some entropy into the by IPv4 unsused bytes */ rip[5] = (char) random() & 0xff; rip[6] = (char) random() & 0xff; } if(proto == 6) { if (remoteip) ip6_scan(remoteip, rip); if (localip) ip6_scan(localip, lip); } /* Read the request from the client and \0-terminate it */ /* timeout after 60 seconds */ query_len = timeoutread(60, stdin, query, sizeof(query) - 1); query[query_len] = '\0'; /* If there was any data we can go on */ problem = "empty query"; if (query_len > 0) { problem = "illegal query"; pos = scan_ushort(query, &lport); if(query[pos++] == ' ') if(query[pos++] == ',') if(query[pos++] == ' ') { pos = scan_ushort(&query[pos], &rport); problem = "ok"; if(proto == 4) uid = get_connection_info4(lip, lport, rip, rport); if(proto == 6) uid = get_connection_info6(lip, lport, rip, rport); stralloc_copyb(&answer, strnum, fmt_ulong(strnum, lport)); stralloc_cats(&answer, " , "); stralloc_catb(&answer, strnum, fmt_ulong(strnum, rport)); if(uid != 0xffffffff) problem = generate_answer(&answer, uid, lip, lport, rip, rport); else generate_answer(&answer, uid, lip, lport, rip, rport); buffer_puts(buffer_1, answer.s); buffer_flush(buffer_1); } } /* Do logging */ buffer_puts(buffer_2, localip); buffer_puts(buffer_2, ":"); buffer_put(buffer_2, strnum, fmt_ulong(strnum, lport)); buffer_puts(buffer_2, " -> "); buffer_puts(buffer_2, remoteip); buffer_puts(buffer_2, ":"); buffer_put(buffer_2, strnum, fmt_ulong(strnum, rport)); buffer_puts(buffer_2, " ["); buffer_puts(buffer_2, problem); buffer_puts(buffer_2, "] "); if(uid < 0xffffffff) buffer_put(buffer_2, strnum, fmt_ulong(strnum,uid)); else buffer_puts(buffer_2, "unknown"); buffer_puts(buffer_2, "\n"); buffer_flush(buffer_2); return 0; }
int main() { unsigned char *remotehost, *remoteinfo, *remoteip, *remoteport; unsigned char query[256]; unsigned char clean_query[256]; unsigned char *qptr, *qptr2; int len, query_len; int fd, r = 0; struct cdb c; stralloc answer = {0}; /* chroot() to $ROOT and switch to $UID:$GID */ droproot("dffingerd: "); /* since we run under tcpserver, we can get all info about the remote side from the enviroment */ remotehost = env_get("TCPREMOTEHOST"); if (!remotehost) remotehost = "unknown"; remoteinfo = env_get("TCPREMOTEINFO"); if (!remoteinfo) remoteinfo = "-"; remoteip = env_get("TCPREMOTEIP"); if (!remoteip) remoteip = "unknown"; remoteport = env_get("TCPREMOTEPORT"); if (!remoteport) remoteport = "unknown"; /* now: remotehost is the remote hostname or "unknown" remoteinfo is some ident string or "-" remoteip is the remote ipadress or "unknown" (?) */ /* Read the request from the client and \0-terminate it */ /* timeout after 60 seconds */ query_len = timeoutread(60, stdin, query, sizeof(query) - 1); query[query_len] = '\0'; /* Handle RfC 1288 stuff */ qptr=query; if (*qptr==' ') qptr++; if (*qptr=='/' && (*(qptr+1)=='W' || *(qptr+1)=='w') && *(qptr+2) == ' ') qptr+=3; /* \0-terminate query at the first \r or \n */ for (len = 0; query[len]; len++) { if (query[len] == '\r' || query[len] == '\n') { query[len] = '\0'; break; } } /* clean up query string a bit by removing chars witch could clobber logging or so and replace them with _ -> extra Paranoia */ for(qptr2 = clean_query; *qptr; qptr++) { if(is_meta (*qptr)) { *qptr2++ = '_'; } else { *qptr2++ = *qptr; } } *qptr2 = '\0'; /* Do logging */ buffer_puts(buffer_2, remotehost); buffer_puts(buffer_2, " ["); buffer_puts(buffer_2, remoteip); buffer_puts(buffer_2, ":"); buffer_puts(buffer_2, remoteport); buffer_puts(buffer_2, "] "); buffer_puts(buffer_2, remoteinfo); buffer_puts(buffer_2, " "); buffer_puts(buffer_2, clean_query); buffer_puts(buffer_2, "\n"); buffer_flush(buffer_2); /* If there was any data we will go on */ if (query_len > 0) { /* Open & init our cdb */ fd = open_read("data.cdb"); if (fd == -1) { /* If opening failed quit */ strerr_die2sys(111, FATAL, "can't open data.cdb"); } cdb_init(&c, fd); /* Search query for "user" on the database */ r = cdb_find(&c, clean_query, str_len(clean_query)); if (r == 1) { /* read data */ stralloc_ready(&answer, cdb_datalen(&c)); if (cdb_read(&c, answer.s, cdb_datalen(&c), cdb_datapos(&c)) == -1) { strerr_die2sys(111, FATAL, "can't read from data.cdb"); } else { answer.len = cdb_datalen(&c); } } else { /* We didn't find the requested user, try DEFAULTUSER */ r = cdb_find(&c,DEFAULTUSER, str_len(DEFAULTUSER)); if (r == 1) { /* read data */ stralloc_ready(&answer, cdb_datalen(&c)); if (cdb_read(&c, answer.s ,cdb_datalen(&c) ,cdb_datapos(&c)) == -1) { strerr_die2sys(111, FATAL, "can't read from data.cdb"); } else { answer.len = cdb_datalen(&c); } } else { /* no data for DEFAULTUSER either, so we don't have any data for the client */ stralloc_copys(&answer, NOPE); } } /* write to the network with 120s timeout */ /* I guess the timeout isn't needed on an usual Unix */ r = timeoutwrite(120, stdout, answer.s, answer.len); if (r <= 0) { strerr_die2sys(111, FATAL, "unable to write to network: "); } /* free database */ cdb_free(&c); close(fd); } else { *clean_query = '\0'; } return 0; }
static int myread(int fd, void *buf, int len) { return timeoutread(mytimeout,fd,buf,len); }
int saferead(int fd, void *buf, int len) { return timeoutread(timeout,fd,buf,len); }