Exemplo n.º 1
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();
}
Exemplo n.º 2
0
void getmess()
{
  int match;

  if (slurpclose(0,&message,1024) == -1) die_read();

  strnum[fmt_uint(strnum,message.len)] = 0;
  if (!stralloc_copys(&beforemessage,strnum)) nomem();
  if (!stralloc_cats(&beforemessage,":")) nomem();
  if (!stralloc_copys(&aftermessage,",")) nomem();

  if (getln(&envelope,&line,&match,'\0') == -1) die_read();
  if (!match) die_format();
  if (line.len < 2) die_format();
  if (line.s[0] != 'F') die_format();

  strnum[fmt_uint(strnum,line.len - 2)] = 0;
  if (!stralloc_cats(&aftermessage,strnum)) nomem();
  if (!stralloc_cats(&aftermessage,":")) nomem();
  if (!stralloc_catb(&aftermessage,line.s + 1,line.len - 2)) nomem();
  if (!stralloc_cats(&aftermessage,",")) nomem();

  for (;;) {
    if (getln(&envelope,&line,&match,'\0') == -1) die_read();
    if (!match) die_format();
    if (line.len < 2) break;
    if (line.s[0] != 'T') die_format();

    strnum[fmt_uint(strnum,line.len - 2)] = 0;
    if (!stralloc_cats(&aftermessage,strnum)) nomem();
    if (!stralloc_cats(&aftermessage,":")) nomem();
    if (!stralloc_catb(&aftermessage,line.s + 1,line.len - 2)) nomem();
    if (!stralloc_cats(&aftermessage,",")) nomem();
  }
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
0
/* Read one character from stdin and die if it fails. */
static inline char get_ch() {
  char ch;
  switch (BIO_GETC(&ch, bio_0)) {
    case 0:
      die_format();
    case -1:
      die_read();
  }
  return ch;
}
Exemplo n.º 5
0
void compression_init(void)
{
  stream.zalloc = Z_NULL;
  stream.zfree = Z_NULL;
  stream.opaque = Z_NULL;
  stream.avail_out = sizeof(zbuf);
  stream.next_out = zbuf;
  if (deflateInit(&stream,Z_DEFAULT_COMPRESSION) != Z_OK)
    die_format();
}
Exemplo n.º 6
0
Arquivo: huffman.c Projeto: cifkao/bis
/* Build the Huffman tree recursively.
 */
void read_tree(file *f, huf_node *node, bool isRoot){
  int bit = bitfile_get_bit(f);
  if(bit==EOF){
    if(isRoot) return;
    else die_format();
  }
  if(!bit){ // internal node
    huf_node *left = (huf_node *)malloc_or_die(2*sizeof(huf_node));
    huf_node *right = left+1;
    node->left = left;
    node->right = right;
    read_tree(f, left, false);
    read_tree(f, right, false);
  }else{ // leaf node
    int s = bitfile_get_symbol(f, SYMBOL_LENGTH);
    if(s==EOF) die_format();
    node->symbol = s;
    node->left = NULL;
    node->right = NULL;
  }
}
Exemplo n.º 7
0
Arquivo: huffman.c Projeto: cifkao/bis
size_t huf_decode(file *f, symbol **data, huf_tree tree){
  symbol_buffer buf;
  buf.size = 1024;
  buf.dataLength = 0;
  buf.buffer = NULL;
  int s = decode_symbol(f, tree);
  if(s==EOF)
    return 0;
  do{
    if(s==EOF) die_format();
    buffer_put(s, &buf);
    s = decode_symbol(f, tree);
  }while(s!=HUF_EOF);

  *data = buf.buffer;
  return buf.dataLength;
}
Exemplo n.º 8
0
Arquivo: huffman.c Projeto: cifkao/bis
int decode_symbol(file *f, huf_tree tree){
  huf_node *node = tree.root;
  int bit = bitfile_get_bit(f);
  if(bit==EOF)
    return EOF;
  // read until we reach a leaf node
  while(node->left){
    if(bit==EOF) die_format();
    if(!bit)
      node = node->left;
    else
      node = node->right;

    if(node->left)
      bit = bitfile_get_bit(f);
  }
  
  return node->symbol;
}
Exemplo n.º 9
0
static inline int32_t get_len(char end) {
  char ch;
  int32_t len = 0;
  
  for (;;) {
    ch = get_ch();
    if (ch == end)
      break;
    if ((ch < '0') || (ch > '9'))
      die_format();
    if (len > 429496720) {
      errno = ENOMEM;
      die_write();
    }
    len = len * 10 + (ch - '0');
  }
  
  return len;
}
Exemplo n.º 10
0
void main()
{
  int i;
  int numcolons;

  umask(033);
  if (chdir(auto_qmail) == -1) die_chdir();

  fd = open_read("users/assign");
  if (fd == -1) die_opena();

  substdio_fdbuf(&ssin,read,fd,inbuf,sizeof(inbuf));

  fdtemp = open_trunc("users/cdb.tmp");
  if (fdtemp == -1) die_opent();

  if (cdbmss_start(&cdbmss,fdtemp) == -1) die_writet();

  if (!stralloc_copys(&wildchars,"")) die_nomem();

  for (;;) {
    if (getln(&ssin,&line,&match,'\n') != 0) die_reada();
    if (line.len && (line.s[0] == '.')) break;
    if (!match) die_format();

    if (byte_chr(line.s,line.len,'\0') < line.len) die_format();
    i = byte_chr(line.s,line.len,':');
    if (i == line.len) die_format();
    if (i == 0) die_format();
    if (!stralloc_copys(&key,"!")) die_nomem();
    if (line.s[0] == '+') {
      if (!stralloc_catb(&key,line.s + 1,i - 1)) die_nomem();
      case_lowerb(key.s,key.len);
      if (i >= 2)
	if (byte_chr(wildchars.s,wildchars.len,line.s[i - 1]) == wildchars.len)
	  if (!stralloc_append(&wildchars,line.s + i - 1)) die_nomem();
    }
    else {
      if (!stralloc_catb(&key,line.s + 1,i - 1)) die_nomem();
      if (!stralloc_0(&key)) die_nomem();
      case_lowerb(key.s,key.len);
    }

    if (!stralloc_copyb(&data,line.s + i + 1,line.len - i - 1)) die_nomem();

    numcolons = 0;
    for (i = 0;i < data.len;++i)
      if (data.s[i] == ':') {
	data.s[i] = 0;
	if (++numcolons == 6)
	  break;
      }
    if (numcolons < 6) die_format();
    data.len = i;

    if (cdbmss_add(&cdbmss,key.s,key.len,data.s,data.len) == -1) die_writet();
  }

  if (cdbmss_add(&cdbmss,"",0,wildchars.s,wildchars.len) == -1) die_writet();

  if (cdbmss_finish(&cdbmss) == -1) die_writet();
  if (fsync(fdtemp) == -1) die_writet();
  if (close(fdtemp) == -1) die_writet(); /* NFS stupidity */
  if (rename("users/cdb.tmp","users/cdb") == -1) die_rename();

  _exit(0);
}
Exemplo n.º 11
0
int main(int argc, char **argv, char **envp) {
  char ch;
  struct cdbmake cm;
  array_t data = ARRAY_INIT(1);
  int32_t dlen;
  int fd;
  uint32_t i;
  array_t key = ARRAY_INIT(1);
  int32_t klen;
  char *path;
  char *tmp;
  
  if (!*argv || !*++argv)
    usage();
  path = *argv;
  
  if (!*++argv)
    usage();
  tmp = *argv;
  
  /* Create the temporary file and start the cdb creation process with it. */
  fd = open("test.cdb", O_CREAT | O_TRUNC | O_WRONLY, 0644);
  if (fd == -1)
    strerr_die4sys(111, FATAL, "unable to create ", tmp, ": ");
  if (cdbmake_start(&cm, fd) == -1)
    strerr_die2sys(111, FATAL, "cdbmake initialization failed: ");
    
  for (;;) {
    /* Skip over new lines and require the first character to be '+'. */
    ch = get_ch();
    if (ch == '\n')
      break;
    if (ch != '+')
      die_format();
      
    /* Read the key length. */
    klen = get_len(',');
    if (klen == -1)
      die_format();
      
    /* Read the data length. */
    dlen = get_len(':');
    if (dlen == -1)
      die_format();
      
    /* Truncate the key array and load it with the key from the cdb record. */
    array_trunc(&key);
    for (i = 0; i < klen; i++) {
      ch = get_ch();
      array_append(&key, &ch, 1);
    }
    
    /* Verify the separator is ->. */
    if ((get_ch() != '-') || (get_ch() != '>'))
      die_format();
      
    /* Truncate the data array and load it with the data from the cdb record. */
    array_trunc(&data);
    for (i = 0; i < dlen; i++) {
      ch = get_ch();
      array_append(&data, &ch, 1);
    }
    
    /* The line is valid, so add it to the cdb file and check that it ends with
     * a new line. */
    if (cdbmake_add(&cm, array_start(&key), klen, array_start(&data), dlen) == -1)
      die_write();
    if (get_ch() != '\n')
      die_format();
  }
  
  /* Finish the cdb file, sync it to disk, close it, and finally rename it to
   * the target path. */
  if (cdbmake_finish(&cm) == -1)
    die_write();
  if (fsync(fd) == -1)
    die_write();
  if (close(fd) == -1)
    die_write();
  if (rename(tmp, path) == -1)
    strerr_die6sys(111, FATAL, "unable to rename ", tmp, " to ", path, ": ");
    
  _exit(0);
}