int safewrite(int fd, void *buf, int len) { int r; #ifdef QMQP_COMPRESS stream.avail_in = len; stream.next_in = buf; do { r = deflate(&stream, 0); switch (r) { case Z_OK: if (stream.avail_out == 0) { r = timeoutwrite(60,qmqpfd,zbuf,sizeof(zbuf)); if (r <= 0) die_conn(); stream.avail_out = sizeof(zbuf); stream.next_out = zbuf; } break; default: die_format(); } } while (stream.avail_in != 0); return len; #endif r = timeoutwrite(60,qmqpfd,buf,len); if (r <= 0) die_conn(); return r; }
void compression_done(void) { int r; do { r = deflate(&stream,Z_FINISH); switch (r) { case Z_OK: if (stream.avail_out == 0) { r = timeoutwrite(60,qmqpfd,zbuf,sizeof(zbuf)); if (r <= 0) die_conn(); stream.avail_out = sizeof(zbuf); stream.next_out = zbuf; r = Z_OK; } break; case Z_STREAM_END: break; default: die_format(); } } while (r!=Z_STREAM_END); if (stream.avail_out != sizeof(zbuf)) { /* write left data */ r = timeoutwrite(60,qmqpfd,zbuf,sizeof(zbuf)-stream.avail_out); if (r <= 0) die_conn(); } if (deflateEnd(&stream) != Z_OK) die_format(); }
int safewrite(int fd, void *buf, int len) { int r; r = timeoutwrite(1200,fd,buf,len); if (r <= 0) die(); return r; }
int safewrite(int fd,char *buf,unsigned int len) { int w; w = timeoutwrite(60,fd,buf,len); if (w <= 0) die_netwrite(); return w; }
int safewrite (int fd, char *buf, unsigned int len) { int w = 0; w = timeoutwrite (60, fd, buf, len); if (w <= 0) errx (-1, "could not write to network"); return w; }
void openandwrite(char *filename, stralloc *sa) { int fdfifo; /* we need this to keep the fifo from beeing closed */ fdfifo = open_write(filename); if (fdfifo == -1) strerr_warn3("ddnsd: unable to open ", filename, "for writing: ", &strerr_sys); // XXX is 5 second timeout a good idea? if(timeoutwrite(5, fdfifo, sa->s, sa->len) != sa->len) strerr_warn3("can't write to fifo ", filename, ": ", &strerr_sys); close(fdfifo); }
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 mywrite(int fd, void *buf, int len) { return timeoutwrite(mytimeout,fd,buf,len); }