From: Baptiste Daroussin Date: Fri, 5 Nov 2021 09:40:08 +0000 (+0100) Subject: cleanup: use open_memstream X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d74afbbf8e2f678b0b32026bd8723c87280a0b1c;p=thirdparty%2Fmlmmj.git cleanup: use open_memstream It simplifies the code handling the preparation of the body and the headers from a mmap --- diff --git a/src/mail-functions.c b/src/mail-functions.c index 2facc1de..0928ff17 100644 --- a/src/mail-functions.c +++ b/src/mail-functions.c @@ -133,79 +133,55 @@ int write_mailbody_from_map(int sockfd, char *mapstart, size_t size, char *get_preppedhdrs_from_map(char *mapstart, size_t *hlen) { - char *cur, *next, *endhdrs, *retstr, *r; - const char newlinebuf[] = "\r\n"; - size_t hdrlen, n = 0; + char *cur, *next, *endhdrs, *retstr; + size_t hdrlen; + FILE *memstream; endhdrs = strstr(mapstart, "\n\n"); if(endhdrs == NULL) return NULL; /* The map doesn't map a file with a mail */ - hdrlen = endhdrs - mapstart + 1; - - for(next = cur = mapstart; next < mapstart + hdrlen; next++) - if(*next == '\n') - n++; + memstream = open_memstream(&retstr, hlen); + if (memstream == NULL) + return NULL; - retstr = mymalloc(hdrlen + n); - *hlen = hdrlen + n; - r = retstr; + hdrlen = endhdrs - mapstart + 1; for(next = cur = mapstart; next < mapstart + hdrlen; next++) { if(*next == '\n') { - strncpy(r, cur, next - cur); - r += next - cur; - strncpy(r, newlinebuf, 2); - r += 2; + fprintf(memstream, "%.*s\r\n", (int)(next - cur), cur); cur = next + 1; } } + fclose(memstream); return retstr; } char *get_prepped_mailbody_from_map(char *mapstart, size_t size, size_t *blen) { - char *cur, *next, *endhdrs, *retstr, *r; - char newlinebuf[3]; - size_t bodylen, len, n = 0; + char *cur, *next, *endhdrs, *retstr; + FILE *memstream; endhdrs = strstr(mapstart, "\n\n"); if(endhdrs == NULL) return NULL; /* The map doesn't map a file with a mail */ + memstream = open_memstream(&retstr, blen); + if (memstream == NULL) + return NULL; + endhdrs++; /* Skip the first newline, it's in hdrs */ - bodylen = size - (endhdrs - mapstart); - for(next = cur = endhdrs; next < mapstart + size; next++) { if(*next == '\n') { - n++; + fprintf(memstream, "%.*s\r\n", (int)(next - cur), cur); if((next < mapstart + size - 1) && *(next+1) == '.') - n++; - } - } - - retstr = mymalloc(bodylen + n); - *blen = bodylen + n; - r = retstr; - - for(next = cur = endhdrs; next < mapstart + size; next++) { - if(*next == '\n') { - strncpy(r, cur, next - cur); - r += next - cur; - newlinebuf[0] = '\r'; - newlinebuf[1] = '\n'; - len = 2; - if((next < mapstart + size - 1) && *(next+1) == '.') { - newlinebuf[2] = '.'; - len = 3; - } - strncpy(r, newlinebuf, len); - r += len; + fputc('.', memstream); cur = next + 1; } } + fclose(memstream); return retstr; }