Пример #1
0
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;
}
Пример #2
0
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();
}
Пример #3
0
int safewrite(int fd, void *buf, int len)
{
  int r;
  r = timeoutwrite(1200,fd,buf,len);
  if (r <= 0) die();
  return r;
}
Пример #4
0
int safewrite(int fd,char *buf,unsigned int len)
{
  int w;

  w = timeoutwrite(60,fd,buf,len);
  if (w <= 0) die_netwrite();
  return w;
}
Пример #5
0
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;
}
Пример #6
0
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);
}
Пример #7
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;
}
Пример #8
0
static int
mywrite(int fd, void *buf, int len)
{
	return timeoutwrite(mytimeout,fd,buf,len);
}