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(); }
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(); } }
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; }
/* 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; }
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(); }
/* 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; } }
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; }
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; }
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; }
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); }
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); }