]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
cleanup: use open_memstream
authorBaptiste Daroussin <bapt@FreeBSD.org>
Fri, 5 Nov 2021 09:40:08 +0000 (10:40 +0100)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Fri, 5 Nov 2021 09:40:08 +0000 (10:40 +0100)
It simplifies the code handling the preparation of the body and the
headers from a mmap

src/mail-functions.c

index 2facc1dea606bdec3cdb5589149ef7facf0d6bae..0928ff177526d203a17f65702343f47a5796d3fb 100644 (file)
@@ -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;
 }