int cli_uuencode(const char *dir, fmap_t *map) { message *m; char buffer[RFC2821LENGTH + 1]; size_t at = 0; if(!fmap_gets(map, buffer, &at, sizeof(buffer) - 1)) { /* empty message */ return CL_CLEAN; } if(!isuuencodebegin(buffer)) { cli_dbgmsg("Message is not in uuencoded format\n"); return CL_EFORMAT; } m = messageCreate(); if(m == NULL) { return CL_EMEM; } cli_dbgmsg("found uuencode file\n"); if(uudecodeFile(m, buffer, dir, map, &at) < 0) { messageDestroy(m); cli_dbgmsg("Message is not in uuencoded format\n"); return CL_EFORMAT; } messageDestroy(m); return CL_CLEAN; /* a lie - but it gets things going */ }
int cli_binhex(const char *dir, int desc) { #ifndef HAVE_MMAP cli_warnmsg("File not decoded - binhex decoding needs mmap() (for now)\n"); return CL_CLEAN; #else struct stat statb; char *buf, *start, *line; size_t size; long bytesleft; message *m; fileblob *fb; if(fstat(desc, &statb) < 0) return CL_EOPEN; size = (size_t)statb.st_size; if(size == 0) return CL_CLEAN; m = messageCreate(); if(m == NULL) return CL_EMEM; start = buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, desc, 0); if(buf == MAP_FAILED) { messageDestroy(m); return CL_EMEM; } cli_dbgmsg("mmap'ed binhex file\n"); bytesleft = (long)size; line = NULL; while(bytesleft > 0) { int length = 0; char *ptr, *newline; /*printf("%d: ", bytesleft);*/ for(ptr = buf; bytesleft && (*ptr != '\n') && (*ptr != '\r'); ptr++) { length++; --bytesleft; } /*printf("%d: ", length);*/ newline = cli_realloc(line, (size_t)(length + 1)); if(newline == NULL) break; line = newline; memcpy(line, buf, length); line[length] = '\0'; /*puts(line);*/ if(messageAddStr(m, line) < 0) break; if((bytesleft > 0) && (*ptr == '\r')) { ptr++; bytesleft--; } buf = ++ptr; bytesleft--; } munmap(start, size); if(line) free(line); if(binhexBegin(m) == NULL) { messageDestroy(m); cli_errmsg("No binhex line found\n"); return CL_EFORMAT; } /* similar to binhexMessage */ messageSetEncoding(m, "x-binhex"); fb = messageToFileblob(m, dir, 1); if(fb) { cli_dbgmsg("Binhex file decoded to %s\n", fileblobGetFilename(fb)); fileblobDestroy(fb); } else cli_errmsg("Couldn't decode binhex file to %s\n", dir); messageDestroy(m); if(fb) return CL_CLEAN; /* a lie - but it gets things going */ return CL_EIO; /* probably CL_EMEM, but we can't tell at this layer */ #endif }