diff --git a/Makefile.am b/Makefile.am index 7440d134721..1e50eb89872 100644 --- a/Makefile.am +++ b/Makefile.am @@ -763,6 +763,7 @@ include_HEADERS = \ lib/bitvector.h \ lib/bloom.h \ lib/bsearch.h \ + lib/buf.h \ lib/charset.h \ lib/command.h \ lib/crc32.h \ @@ -780,6 +781,7 @@ include_HEADERS = \ lib/imparse.h \ lib/iostat.h \ lib/iptostring.h \ + lib/libconfig.h \ lib/libcyr_cfg.h \ lib/lsort.h \ lib/map.h \ @@ -810,14 +812,16 @@ include_HEADERS = \ nodist_include_HEADERS = \ lib/imapopts.h -nobase_include_HEADERS = sieve/sieve_interface.h +nobase_include_HEADERS = \ + imap/message_guid.h \ + sieve/sieve_interface.h + nobase_nodist_include_HEADERS = sieve/sieve_err.h noinst_HEADERS += \ lib/bufarray.h \ lib/byteorder.h \ lib/gai.h \ - lib/libconfig.h \ lib/md5.h \ lib/prot.h \ lib/ptrarray.h \ @@ -1010,7 +1014,6 @@ imap_libcyrus_imap_la_SOURCES = \ imap/mboxname.c \ imap/mboxname.h \ imap/message_guid.c \ - imap/message_guid.h \ imap/message.c \ imap/message.h \ imap/message_priv.h \ diff --git a/imap/message.h b/imap/message.h index 3412adb5904..39c2b8abd56 100644 --- a/imap/message.h +++ b/imap/message.h @@ -45,10 +45,12 @@ #include +#include "arrayu64.h" +#include "buf.h" #include "prot.h" #include "mailbox.h" +#include "imap/message_guid.h" #include "strarray.h" -#include "util.h" #include "charset.h" /* (draft standard) MIME tspecials */ diff --git a/lib/buf.h b/lib/buf.h new file mode 100644 index 00000000000..a25563036b7 --- /dev/null +++ b/lib/buf.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2024 Carnegie Mellon University. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Carnegie Mellon University + * Center for Technology Transfer and Enterprise Creation + * 4615 Forbes Avenue + * Suite 302 + * Pittsburgh, PA 15213 + * (412) 268-7393, fax: (412) 268-7395 + * innovation@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef INCLUDED_BUF_H +#define INCLUDED_BUF_H + +/* Examine the name of a file, and return a single character + * (as an int) that can be used as the name of a hash + * directory. Caller is responsible for skipping any prefix + * of the name. + */ +int dir_hash_c(const char *name, int full); + +#include +#define BUF_MMAP (1<<1) +typedef unsigned long long int modseq_t; + +struct buf { + char *s; + size_t len; + size_t alloc; + unsigned flags; +}; +#define BUF_INITIALIZER { NULL, 0, 0, 0 } + +#define buf_new() ((struct buf *) xzmalloc(sizeof(struct buf))) +#define buf_destroy(b) do { buf_free((b)); free((b)); } while (0) +#define buf_ensure(b, n) do { if ((b)->alloc < (b)->len + (n)) _buf_ensure((b), (n)); } while (0) +#define buf_putc(b, c) do { buf_ensure((b), 1); (b)->s[(b)->len++] = (c); } while (0) + +void _buf_ensure(struct buf *buf, size_t len); +const char *buf_cstring(const struct buf *buf); +const char *buf_cstringnull(const struct buf *buf); +const char *buf_cstringnull_ifempty(const struct buf *buf); +const char *buf_cstring_or_empty(const struct buf *buf); +char *buf_newcstring(struct buf *buf); +char *buf_release(struct buf *buf); +char *buf_releasenull(struct buf *buf); +void buf_getmap(struct buf *buf, const char **base, size_t *len); +size_t buf_len(const struct buf *buf); +const char *buf_base(const struct buf *buf); +void buf_reset(struct buf *buf); +void buf_setcstr(struct buf *buf, const char *str); +void buf_setmap(struct buf *buf, const char *base, size_t len); +void buf_copy(struct buf *dst, const struct buf *src); +void buf_append(struct buf *dst, const struct buf *src); +void buf_appendcstr(struct buf *buf, const char *str); +void buf_appendoverlap(struct buf *buf, const char *str); +void buf_appendmap(struct buf *buf, const char *base, size_t len); +void buf_cowappendmap(struct buf *buf, const char *base, unsigned int len); +void buf_cowappendfree(struct buf *buf, char *base, unsigned int len); +void buf_insert(struct buf *dst, unsigned int off, const struct buf *src); +void buf_insertcstr(struct buf *buf, unsigned int off, const char *str); +void buf_insertmap(struct buf *buf, unsigned int off, const char *base, int len); +void buf_printf(struct buf *buf, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); +void buf_replace_buf(struct buf *buf, size_t offset, size_t length, + const struct buf *replace); +int buf_replace_all(struct buf *buf, const char *match, + const char *replace); +int buf_replace_char(struct buf *buf, char match, char replace); +void buf_remove(struct buf *buf, unsigned int off, unsigned int len); +int buf_cmp(const struct buf *, const struct buf *); +int buf_findchar(const struct buf *, unsigned int off, int c); +int buf_findline(const struct buf *buf, const char *line); +void buf_init_ro(struct buf *buf, const char *base, size_t len); +void buf_initm(struct buf *buf, char *base, int len); +void buf_initmcstr(struct buf *buf, char *str); +void buf_init_ro_cstr(struct buf *buf, const char *str); +void buf_refresh_mmap(struct buf *buf, int onceonly, int fd, + const char *fname, size_t size, const char *mboxname); +void buf_free(struct buf *buf); +void buf_move(struct buf *dst, struct buf *src); +const char *buf_lcase(struct buf *buf); +const char *buf_ucase(struct buf *buf); +const char *buf_tocrlf(struct buf *buf); +void buf_trim(struct buf *buf); + +#endif /* INCLUDED_BUF_H */ diff --git a/lib/charset.h b/lib/charset.h index 5fba6fd2d38..283f0035d73 100644 --- a/lib/charset.h +++ b/lib/charset.h @@ -68,7 +68,7 @@ #define MIME_MAX_HEADER_LENGTH 78 #define MIME_MAX_LINE_LENGTH 998 -#include "util.h" +#include "buf.h" #include "xsha1.h" #define charset_base64_len_unpadded(n) \ diff --git a/lib/util.h b/lib/util.h index 6cdd95a2717..d081161a4bc 100644 --- a/lib/util.h +++ b/lib/util.h @@ -65,6 +65,7 @@ #define STDERR_FILENO 2 /* Standard error output. */ #endif +#include "buf.h" #include "xmalloc.h" /* version string printable in gdb tracking */ @@ -106,7 +107,6 @@ typedef unsigned short bit32; #endif typedef unsigned long long int bit64; -typedef unsigned long long int modseq_t; #define MODSEQ_FMT "%llu" #define atomodseq_t(s) strtoull(s, NULL, 10) char *modseqtoa(modseq_t modseq); @@ -191,12 +191,6 @@ int strcmpnull(const char *a, const char *b); extern keyvalue *kv_bsearch (const char *key, keyvalue *kv, int nelem, int (*cmpf)(const char *s1, const char *s2)); -/* Examine the name of a file, and return a single character - * (as an int) that can be used as the name of a hash - * directory. Caller is responsible for skipping any prefix - * of the name. - */ -extern int dir_hash_c(const char *name, int full); /* * Like dir_hash_c() but builds the result as a single-byte * C string in the provided buffer, and returns the buffer, @@ -279,80 +273,18 @@ extern int64_t now_ms(void); extern clock_t sclock(void); -#define BUF_MMAP (1<<1) - -struct buf { - char *s; - size_t len; - size_t alloc; - unsigned flags; -}; -#define BUF_INITIALIZER { NULL, 0, 0, 0 } - -#define buf_new() ((struct buf *) xzmalloc(sizeof(struct buf))) -#define buf_destroy(b) do { buf_free((b)); free((b)); } while (0) -#define buf_ensure(b, n) do { if ((b)->alloc < (b)->len + (n)) _buf_ensure((b), (n)); } while (0) -#define buf_putc(b, c) do { buf_ensure((b), 1); (b)->s[(b)->len++] = (c); } while (0) - -void _buf_ensure(struct buf *buf, size_t len); -const char *buf_cstring(const struct buf *buf); -const char *buf_cstringnull(const struct buf *buf); -const char *buf_cstringnull_ifempty(const struct buf *buf); -const char *buf_cstring_or_empty(const struct buf *buf); -char *buf_newcstring(struct buf *buf); -char *buf_release(struct buf *buf); -char *buf_releasenull(struct buf *buf); -void buf_getmap(struct buf *buf, const char **base, size_t *len); int buf_getline(struct buf *buf, FILE *fp); -size_t buf_len(const struct buf *buf); -const char *buf_base(const struct buf *buf); -void buf_reset(struct buf *buf); void buf_truncate(struct buf *buf, ssize_t len); -void buf_setcstr(struct buf *buf, const char *str); -void buf_setmap(struct buf *buf, const char *base, size_t len); -void buf_copy(struct buf *dst, const struct buf *src); -void buf_append(struct buf *dst, const struct buf *src); -void buf_appendcstr(struct buf *buf, const char *str); -void buf_appendoverlap(struct buf *buf, const char *str); void buf_appendbit32(struct buf *buf, bit32 num); void buf_appendbit64(struct buf *buf, bit64 num); -void buf_appendmap(struct buf *buf, const char *base, size_t len); -void buf_cowappendmap(struct buf *buf, const char *base, unsigned int len); -void buf_cowappendfree(struct buf *buf, char *base, unsigned int len); -void buf_insert(struct buf *dst, unsigned int off, const struct buf *src); -void buf_insertcstr(struct buf *buf, unsigned int off, const char *str); -void buf_insertmap(struct buf *buf, unsigned int off, const char *base, int len); void buf_vprintf(struct buf *buf, const char *fmt, va_list args) __attribute__((format(printf, 2, 0))); -void buf_printf(struct buf *buf, const char *fmt, ...) - __attribute__((format(printf, 2, 3))); -void buf_replace_buf(struct buf *buf, size_t offset, size_t length, - const struct buf *replace); -int buf_replace_all(struct buf *buf, const char *match, - const char *replace); -int buf_replace_char(struct buf *buf, char match, char replace); #ifdef ENABLE_REGEX int buf_replace_all_re(struct buf *buf, const regex_t *, const char *replace); int buf_replace_one_re(struct buf *buf, const regex_t *, const char *replace); #endif -void buf_remove(struct buf *buf, unsigned int off, unsigned int len); -int buf_cmp(const struct buf *, const struct buf *); -int buf_findchar(const struct buf *, unsigned int off, int c); -int buf_findline(const struct buf *buf, const char *line); -void buf_init_ro(struct buf *buf, const char *base, size_t len); -void buf_initm(struct buf *buf, char *base, int len); -void buf_initmcstr(struct buf *buf, char *str); -void buf_init_ro_cstr(struct buf *buf, const char *str); -void buf_refresh_mmap(struct buf *buf, int onceonly, int fd, - const char *fname, size_t size, const char *mboxname); -void buf_free(struct buf *buf); -void buf_move(struct buf *dst, struct buf *src); -const char *buf_lcase(struct buf *buf); -const char *buf_ucase(struct buf *buf); -const char *buf_tocrlf(struct buf *buf); -void buf_trim(struct buf *buf); /* * Given a list of strings, terminated by (char *)NULL, diff --git a/sieve/sieve_interface.h b/sieve/sieve_interface.h index e2a5e31a7da..e54b3de4767 100644 --- a/sieve/sieve_interface.h +++ b/sieve/sieve_interface.h @@ -51,8 +51,8 @@ #define SIEVE_OK (0) #include "arrayu64.h" +#include "buf.h" #include "strarray.h" -#include "util.h" #include "sieve/sieve_err.h" /* external sieve types */