diff options
| author | John Vogel <jvogel@stygian.me> | 2024-12-14 00:46:32 -0500 |
|---|---|---|
| committer | John Vogel <jvogel@stygian.me> | 2024-12-14 00:46:32 -0500 |
| commit | 5037bf99c02b04c1ac1326615f74395fc585ed65 (patch) | |
| tree | 7275167ef414d3026f591c33e1a9db68cc1a94ef | |
| parent | c0b3c407f2c3eaf0852191db7125761cfbe49bed (diff) | |
| download | my-aports-5037bf99c02b04c1ac1326615f74395fc585ed65.tar.gz | |
local/uw-imap: new aport
| -rw-r--r-- | uw-imap/0001-Add-missing-headers.patch | 58 | ||||
| -rw-r--r-- | uw-imap/APKBUILD | 85 | ||||
| -rw-r--r-- | uw-imap/c-client-2006k_GENTOO_amd64-so-fix.patch | 13 | ||||
| -rw-r--r-- | uw-imap/c-client-2007f-scandir-callback-types.patch | 167 | ||||
| -rw-r--r-- | uw-imap/c-client-2007f_p7-c99.patch | 791 | ||||
| -rw-r--r-- | uw-imap/c-client-2007f_p7-implicit-declaration-fix.patch | 46 |
6 files changed, 1160 insertions, 0 deletions
diff --git a/uw-imap/0001-Add-missing-headers.patch b/uw-imap/0001-Add-missing-headers.patch new file mode 100644 index 0000000..7ba4cba --- /dev/null +++ b/uw-imap/0001-Add-missing-headers.patch @@ -0,0 +1,58 @@ +From 5bd4a19408ebeba2f9baac7edaee1df2ae3f332f Mon Sep 17 00:00:00 2001 +From: John Vogel <jvogel@stygian.me> +Date: Fri, 29 Nov 2024 02:48:15 -0500 +Subject: [PATCH] Add missing headers + +--- + src/dmail/dmail.c | 1 + + src/mlock/mlock.c | 2 ++ + src/tmail/tmail.c | 1 + + 3 files changed, 4 insertions(+) + +diff --git a/src/dmail/dmail.c b/src/dmail/dmail.c +index f78b957..18f54ee 100644 +--- a/src/dmail/dmail.c ++++ b/src/dmail/dmail.c +@@ -33,6 +33,7 @@ extern int errno; /* just in case */ + #include <sysexits.h> + #include <sys/file.h> + #include <sys/stat.h> ++#include <ctype.h> + #include "c-client.h" + #include "dquota.h" + +diff --git a/src/mlock/mlock.c b/src/mlock/mlock.c +index 1dca40e..7e15a64 100644 +--- a/src/mlock/mlock.c ++++ b/src/mlock/mlock.c +@@ -27,6 +27,7 @@ + */ + + #include <errno.h> ++#include <unistd.h> + #include <fcntl.h> + #include <stdio.h> + #include <sysexits.h> +@@ -40,6 +41,7 @@ + #include <netdb.h> + #include <ctype.h> + #include <string.h> ++#include <time.h> + + #define LOCKTIMEOUT 5 /* lock timeout in minutes */ + #define LOCKPROTECTION 0664 +diff --git a/src/tmail/tmail.c b/src/tmail/tmail.c +index ed5fc58..c833646 100644 +--- a/src/tmail/tmail.c ++++ b/src/tmail/tmail.c +@@ -33,6 +33,7 @@ extern int errno; /* just in case */ + #include <sysexits.h> + #include <sys/file.h> + #include <sys/stat.h> ++#include <ctype.h> + #include "c-client.h" + #include "tquota.h" + +-- +2.47.0 + diff --git a/uw-imap/APKBUILD b/uw-imap/APKBUILD new file mode 100644 index 0000000..e816e9d --- /dev/null +++ b/uw-imap/APKBUILD @@ -0,0 +1,85 @@ +# Contributor: John Vogel <jvogel4@stny.rr.com> +# Maintainer: John Vogel <jvogel4@stny.rr.com> +pkgname=uw-imap +pkgver=2007f_git20190104 +_commit=b4cecc531513cbb7506668f02f2144eae6e03511 +pkgrel=0 +pkgdesc="University of Washington IMAP Toolkit Environment" +url="https://github.com/uw-imap/imap/" +arch="all" +license="Apache-2.0" +depends_dev="openssl-dev linux-pam-dev" +makedepends="$depends_dev" +subpackages="$pkgname-dev $pkgname-doc $pkgname-libs" +source="uw-imap-$_commit.tar.gz::https://github.com/uw-imap/imap/archive/$_commit.tar.gz + c-client-2006k_GENTOO_amd64-so-fix.patch + c-client-2007f-scandir-callback-types.patch + c-client-2007f_p7-c99.patch + c-client-2007f_p7-implicit-declaration-fix.patch + 0001-Add-missing-headers.patch + " +builddir="$srcdir/imap-$_commit" +options="!check" # no tests + +build() { + #BUILDTYPE= # this one should probably not be set + #EXTRAAUTHENTICATORS="gss, Kerberos V" + #EXTRADRIVERS=mbox + #PASSWDTYPE=afs,dce,gss,nul,pam,pmb,std,two + #SSLTYPE=none,unix,nopwd,sco,(unix,nopwd),(sco,nopwd) + #IP=o,4,6 + #IP6=4,6 + #EXTRACFLAGS= + #EXTRALDFLAGS= + #EXTRASPECIALS= + #SPECIALS= + yes "y" | \ + make -j1 lnp \ + EXTRACFLAGS="$CFLAGS -std=gnu99" \ + EXTRALDFLAGS="$LDFLAGS" \ + IP=6 \ + IP6=6 \ + PASSWDTYPE=pam \ + SSLTYPE=nopwd \ + SPECIALS="SSLINCLUDE=/usr/include/openssl SSLLIB=/usr/lib SSLCERTS=/etc/ssl/certs SSLKEYS=/etc/ssl/private" +} + +package() { + install -Dm755 -t "$pkgdir"/usr/bin dmail/dmail + install -Dm755 -t "$pkgdir"/usr/bin tmail/tmail + install -Dm755 -t "$pkgdir"/usr/bin mailutil/mailutil + install -Dm755 -t "$pkgdir"/usr/bin mtest/mtest + install -Dm755 -t "$pkgdir"/usr/sbin imapd/imapd + install -Dm755 -t "$pkgdir"/usr/sbin ipopd/ipop2d + install -Dm755 -t "$pkgdir"/usr/sbin ipopd/ipop3d + install -Dm755 -t "$pkgdir"/usr/sbin mlock/mlock + install -Dm644 -t "$pkgdir"/usr/share/man/man1 src/dmail/dmail.1 + install -Dm644 -t "$pkgdir"/usr/share/man/man1 src/mailutil/mailutil.1 + install -Dm644 -t "$pkgdir"/usr/share/man/man1 src/tmail/tmail.1 + install -Dm644 -t "$pkgdir"/usr/share/man/man8 src/imapd/imapd.8 + install -Dm644 -t "$pkgdir"/usr/share/man/man8 src/ipopd/ipopd.8 + install -Dm644 -t "$pkgdir"/usr/share/doc/"$pkgname" \ + CONTENTS NOTICE README README.md SUPPORT + cp -r docs "$pkgdir"/usr/share/doc/"$pkgname" + install -Dm644 -t "$pkgdir"/usr/share/licenses/"$pkgname" LICENSE + install -Dm644 -t "$pkgdir"/usr/lib c-client/libc-client.so.1.0.0 + ln -sf libc-client.so.1.0.0 "$pkgdir"/usr/lib/libc-client.so.1 + ln -sf libc-client.so.1.0.0 "$pkgdir"/usr/lib/libc-client.so + install -m644 c-client/c-client.a "$pkgdir"/usr/lib/libc-client.a + install -Dm644 -t "$pkgdir"/usr/include/imap \ + src/osdep/unix/*.h \ + src/c-client/*.h \ + c-client/linkage.h \ + c-client/linkage.c \ + c-client/osdep.h + echo " ssl_onceonlyinit ();" >> "$pkgdir"/usr/include/imap/linkage.c +} + +sha512sums=" +db46d77198ec7ab4c9983232a1606ee09be035cb4e2ebb7782ea13bb21aa60bd48f1265302c59303ee676a027863d7e25cde1647aa1d0dc7dd689166fdb9b854 uw-imap-b4cecc531513cbb7506668f02f2144eae6e03511.tar.gz +213f06e133704ed2bb9fc6900edb7a4505bf6965409ecf76502bf9cafdf7c981bca552479f8ffaa1a355d2f1c1c08dbe0453fa5bce06590f6627d0e622c70879 c-client-2006k_GENTOO_amd64-so-fix.patch +1c461c7114e2cc238b8716936708df1f5faf747f79c49308d35384b27c4809577c26a77e7753668a576f68a37ee78debb8c7533820f21d0da6f40b2b2c6e2c1a c-client-2007f-scandir-callback-types.patch +45e6d5da8d511bb308baa52c9eb17c3c5bbfc0767966ddb797e09aabb0e047fae09fbf21a7107a4afb802bfb73f4e2a2fc6c9699955a6fec6fcaf286106bdd57 c-client-2007f_p7-c99.patch +9c0276c32059e17fb17a466da4a87b2a4c8e08d0671d14e37e5dd02e52faaec179e92e7b9fa20f40bcb7ac24d3da8d22ba00b4575ccb38c7680402d888e228da c-client-2007f_p7-implicit-declaration-fix.patch +0cbb915bb5797d3ba7961aa62d764657e63c1063ffd7b5ae95fa77479a156a6c2b0b31fbf66d1a813ff05d596e78a317dbedb24543abb3f0841500fd19d743d1 0001-Add-missing-headers.patch +" diff --git a/uw-imap/c-client-2006k_GENTOO_amd64-so-fix.patch b/uw-imap/c-client-2006k_GENTOO_amd64-so-fix.patch new file mode 100644 index 0000000..79b067d --- /dev/null +++ b/uw-imap/c-client-2006k_GENTOO_amd64-so-fix.patch @@ -0,0 +1,13 @@ +diff -r 7c3e6c6ef2ba src/osdep/unix/Makefile +--- a/src/osdep/unix/Makefile Thu Feb 21 18:51:32 2008 +0100 ++++ b/src/osdep/unix/Makefile Thu Feb 21 18:53:15 2008 +0100 +@@ -962,6 +962,9 @@ onceenv: + -DRSHPATH=\"$(RSHPATH)\" -DLOCKPGM=\"$(LOCKPGM)\" > OSCFLAGS + echo $(BASELDFLAGS) $(EXTRALDFLAGS) > LDFLAGS + echo "$(ARRC) $(ARCHIVE) $(BINARIES);$(RANLIB) $(ARCHIVE)" > ARCHIVE ++ echo "`$(CAT) CCTYPE` `$(CAT) CFLAGS` `$(CAT) OSFLAGS` -shared \ ++ -Wl,-soname,libc-client.so.1 -o libc-client.so.1.0.0 $(BINARIES)" \ ++ >> ARCHIVE + echo $(OS) > OSTYPE + ./drivers $(EXTRADRIVERS) $(DEFAULTDRIVERS) dummy + ./mkauths $(EXTRAAUTHENTICATORS) $(DEFAULTAUTHENTICATORS) diff --git a/uw-imap/c-client-2007f-scandir-callback-types.patch b/uw-imap/c-client-2007f-scandir-callback-types.patch new file mode 100644 index 0000000..9e067a8 --- /dev/null +++ b/uw-imap/c-client-2007f-scandir-callback-types.patch @@ -0,0 +1,167 @@ +clang-16 compiler complains with following error message in multiple +places: + + error: incompatible function pointer types passing 'int (struct dirent *)' to + parameter of type 'int (*)(const struct dirent *)' [-Wincompatible-function-pointer-types] + + error: incompatible function pointer types passing + 'int (const void *, const void *)' to parameter of type 'int (*)(const struct dirent **, const struct dirent **)' [-Wincompatible-function-pointer-types] + +This patch fixes all those places by correcting function pointer types +for scandir callbacks. + +Bug: https://bugs.gentoo.org/870478 + +diff --git a/src/osdep/unix/mh.c b/src/osdep/unix/mh.c +index 0226b7a..ace2b32 100644 +--- a/src/osdep/unix/mh.c ++++ b/src/osdep/unix/mh.c +@@ -103,8 +103,8 @@ long mh_copy (MAILSTREAM *stream,char *sequence,char *mailbox, + long options); + long mh_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data); + +-int mh_select (struct direct *name); +-int mh_numsort (const void *d1,const void *d2); ++int mh_select (const struct direct *name); ++int mh_numsort (const struct direct **d1,const struct direct **d2); + char *mh_file (char *dst,char *name); + long mh_canonicalize (char *pattern,char *ref,char *pat); + void mh_setdate (char *file,MESSAGECACHE *elt); +@@ -1194,7 +1194,7 @@ long mh_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data) + * Returns: T to use file name, NIL to skip it + */ + +-int mh_select (struct direct *name) ++int mh_select (const struct direct *name) + { + char c; + char *s = name->d_name; +@@ -1209,7 +1209,7 @@ int mh_select (struct direct *name) + * Returns: negative if d1 < d2, 0 if d1 == d2, postive if d1 > d2 + */ + +-int mh_numsort (const void *d1,const void *d2) ++int mh_numsort (const struct direct **d1,const struct direct **d2) + { + return atoi ((*(struct direct **) d1)->d_name) - + atoi ((*(struct direct **) d2)->d_name); +diff --git a/src/osdep/unix/mix.c b/src/osdep/unix/mix.c +index fbf4a02..0964842 100644 +--- a/src/osdep/unix/mix.c ++++ b/src/osdep/unix/mix.c +@@ -125,7 +125,7 @@ long mix_unsubscribe (MAILSTREAM *stream,char *mailbox); + long mix_create (MAILSTREAM *stream,char *mailbox); + long mix_delete (MAILSTREAM *stream,char *mailbox); + long mix_rename (MAILSTREAM *stream,char *old,char *newname); +-int mix_rselect (struct direct *name); ++int mix_rselect (const struct direct *name); + MAILSTREAM *mix_open (MAILSTREAM *stream); + void mix_close (MAILSTREAM *stream,long options); + void mix_abort (MAILSTREAM *stream); +@@ -140,8 +140,8 @@ THREADNODE *mix_thread (MAILSTREAM *stream,char *type,char *charset, + long mix_ping (MAILSTREAM *stream); + void mix_check (MAILSTREAM *stream); + long mix_expunge (MAILSTREAM *stream,char *sequence,long options); +-int mix_select (struct direct *name); +-int mix_msgfsort (const void *d1,const void *d2); ++int mix_select (const struct direct *name); ++int mix_msgfsort (const struct direct **d1,const struct direct **d2); + long mix_addset (SEARCHSET **set,unsigned long start,unsigned long size); + long mix_burp (MAILSTREAM *stream,MIXBURP *burp,unsigned long *reclaimed); + long mix_burp_check (SEARCHSET *set,size_t size,char *file); +@@ -587,7 +587,7 @@ long mix_rename (MAILSTREAM *stream,char *old,char *newname) + * Returns: T if mix file name, NIL otherwise + */ + +-int mix_rselect (struct direct *name) ++int mix_rselect (const struct direct *name) + { + return mix_dirfmttest (name->d_name); + } +@@ -1146,7 +1146,7 @@ long mix_expunge (MAILSTREAM *stream,char *sequence,long options) + * ".mix" with no suffix was used by experimental versions + */ + +-int mix_select (struct direct *name) ++int mix_select (const struct direct *name) + { + char c,*s; + /* make sure name has prefix */ +@@ -1165,7 +1165,7 @@ int mix_select (struct direct *name) + * Returns: -1 if d1 < d2, 0 if d1 == d2, 1 d1 > d2 + */ + +-int mix_msgfsort (const void *d1,const void *d2) ++int mix_msgfsort (const struct direct **d1,const struct direct **d2) + { + char *n1 = (*(struct direct **) d1)->d_name + sizeof (MIXNAME) - 1; + char *n2 = (*(struct direct **) d2)->d_name + sizeof (MIXNAME) - 1; +diff --git a/src/osdep/unix/mx.c b/src/osdep/unix/mx.c +index 4549527..994f12c 100644 +--- a/src/osdep/unix/mx.c ++++ b/src/osdep/unix/mx.c +@@ -98,8 +98,8 @@ long mx_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data); + long mx_append_msg (MAILSTREAM *stream,char *flags,MESSAGECACHE *elt, + STRING *st,SEARCHSET *set); + +-int mx_select (struct direct *name); +-int mx_numsort (const void *d1,const void *d2); ++int mx_select (const struct direct *name); ++int mx_numsort (const struct direct **d1,const struct direct **d2); + char *mx_file (char *dst,char *name); + long mx_lockindex (MAILSTREAM *stream); + void mx_unlockindex (MAILSTREAM *stream); +@@ -1110,7 +1110,7 @@ long mx_append_msg (MAILSTREAM *stream,char *flags,MESSAGECACHE *elt, + * Returns: T to use file name, NIL to skip it + */ + +-int mx_select (struct direct *name) ++int mx_select (const struct direct *name) + { + char c; + char *s = name->d_name; +@@ -1125,7 +1125,7 @@ int mx_select (struct direct *name) + * Returns: negative if d1 < d2, 0 if d1 == d2, postive if d1 > d2 + */ + +-int mx_numsort (const void *d1,const void *d2) ++int mx_numsort (const struct direct **d1,const struct direct **d2) + { + return atoi ((*(struct direct **) d1)->d_name) - + atoi ((*(struct direct **) d2)->d_name); +diff --git a/src/osdep/unix/news.c b/src/osdep/unix/news.c +index 4cf5bb7..caa6785 100644 +--- a/src/osdep/unix/news.c ++++ b/src/osdep/unix/news.c +@@ -76,8 +76,8 @@ long news_create (MAILSTREAM *stream,char *mailbox); + long news_delete (MAILSTREAM *stream,char *mailbox); + long news_rename (MAILSTREAM *stream,char *old,char *newname); + MAILSTREAM *news_open (MAILSTREAM *stream); +-int news_select (struct direct *name); +-int news_numsort (const void *d1,const void *d2); ++int news_select (const struct direct *name); ++int news_numsort (const struct direct **d1,const struct direct **d2); + void news_close (MAILSTREAM *stream,long options); + void news_fast (MAILSTREAM *stream,char *sequence,long flags); + void news_flags (MAILSTREAM *stream,char *sequence,long flags); +@@ -402,7 +402,7 @@ MAILSTREAM *news_open (MAILSTREAM *stream) + * Returns: T to use file name, NIL to skip it + */ + +-int news_select (struct direct *name) ++int news_select (const struct direct *name) + { + char c; + char *s = name->d_name; +@@ -417,7 +417,7 @@ int news_select (struct direct *name) + * Returns: negative if d1 < d2, 0 if d1 == d2, postive if d1 > d2 + */ + +-int news_numsort (const void *d1,const void *d2) ++int news_numsort (const struct direct **d1,const struct direct **d2) + { + return atoi ((*(struct direct **) d1)->d_name) - + atoi ((*(struct direct **) d2)->d_name); +-- +2.35.1 + diff --git a/uw-imap/c-client-2007f_p7-c99.patch b/uw-imap/c-client-2007f_p7-c99.patch new file mode 100644 index 0000000..4ee62e7 --- /dev/null +++ b/uw-imap/c-client-2007f_p7-c99.patch @@ -0,0 +1,791 @@ +https://bugs.gentoo.org/919252#c9 +--- a/src/osdep/unix/mbx.c ++++ b/src/osdep/unix/mbx.c +@@ -209,7 +209,7 @@ + off_t pos; + char c,*s,*t,hdr[HDRSIZE]; + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + int error = EINVAL; /* assume invalid argument */ + if (ld) *ld = -1; /* initially no lock */ + if ((s = mbx_file (tmp,name)) && !stat (s,&sbuf) && +@@ -298,9 +298,9 @@ + else lseek (fd,0,L_SET); /* else rewind to start */ + /* \Marked status? */ + if (sbuf.st_ctime > sbuf.st_atime) { +- tp[0] = sbuf.st_atime; /* preserve atime and mtime */ +- tp[1] = sbuf.st_mtime; +- utime (tmp,tp); /* set the times */ ++ tp.actime = sbuf.st_atime; /* preserve atime and mtime */ ++ tp.modtime = sbuf.st_mtime; ++ utime (tmp,&tp); /* set the times */ + } + } + /* in case INBOX but not mbx format */ +@@ -759,22 +759,22 @@ + + void mbx_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags) + { +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + unsigned long oldpid = LOCAL->lastpid; + /* make sure the update takes */ + if (!stream->rdonly && LOCAL && (LOCAL->fd >= 0) && (LOCAL->ld >= 0)) { + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get current write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; + /* we are the last flag updater */ + LOCAL->lastpid = (unsigned long) getpid (); + /* update header if needed */ + if (((LOCAL->ffuserflag < NUSERFLAGS) && + stream->user_flags[LOCAL->ffuserflag]) || (oldpid != LOCAL->lastpid)) + mbx_update_header (stream); +- tp[0] = time (0); /* make sure read comes after all that */ +- utime (stream->mailbox,tp); ++ tp.actime = time (0); /* make sure read comes after all that */ ++ utime (stream->mailbox,&tp); + } + if (LOCAL->ld >= 0) { /* unlock now */ + unlockfd (LOCAL->ld,LOCAL->lock); +@@ -984,7 +984,7 @@ + long mbx_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options) + { + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + MESSAGECACHE *elt; + unsigned long i,j,k,m; + long ret = LONGT; +@@ -1069,11 +1069,11 @@ + mail_free_searchset (&source); + mail_free_searchset (&dest); + } +- if (ret) tp[0] = time (0) - 1;/* set atime to now-1 if successful copy */ ++ if (ret) tp.actime = time (0) - 1;/* set atime to now-1 if successful copy */ + /* else preserve \Marked status */ +- else tp[0] = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); +- tp[1] = sbuf.st_mtime; /* preserve mtime */ +- utime (file,tp); /* set the times */ ++ else tp.actime = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); ++ tp.modtime = sbuf.st_mtime; /* preserve mtime */ ++ utime (file,&tp); /* set the times */ + close (fd); /* close the file */ + MM_NOCRITICAL (stream); /* release critical */ + unlockfd (ld,lock); /* release exclusive parse/append permission */ +@@ -1105,7 +1105,7 @@ + struct stat sbuf; + int fd,ld; + char *flags,*date,tmp[MAILTMPLEN],file[MAILTMPLEN],lock[MAILTMPLEN]; +- time_t tp[2]; ++ struct utimbuf tp; + FILE *df; + MESSAGECACHE elt; + long f; +@@ -1207,11 +1207,11 @@ + } + else mail_free_searchset (&dst); + /* set atime to now-1 if successful copy */ +- if (ret) tp[0] = time (0) - 1; ++ if (ret) tp.actime = time (0) - 1; + /* else preserve \Marked status */ +- else tp[0] = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); +- tp[1] = sbuf.st_mtime; /* preserve mtime */ +- utime (file,tp); /* set the times */ ++ else tp.actime = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); ++ tp.modtime = sbuf.st_mtime; /* preserve mtime */ ++ utime (file,&tp); /* set the times */ + fclose (df); /* close the file */ + MM_NOCRITICAL (dstream); /* release critical */ + } +@@ -1441,10 +1441,10 @@ + fstat (LOCAL->fd,&sbuf); /* get status again to ensure time is right */ + LOCAL->filetime = sbuf.st_mtime; + if (added && !stream->rdonly){/* make sure atime updated */ +- time_t tp[2]; +- tp[0] = time (0); +- tp[1] = LOCAL->filetime; +- utime (stream->mailbox,tp); ++ struct utimbuf tp; ++ tp.actime = time (0); ++ tp.modtime = LOCAL->filetime; ++ utime (stream->mailbox,&tp); + } + stream->silent = silent; /* can pass up events now */ + mail_exists (stream,nmsgs); /* notify upper level of new mailbox size */ +@@ -1691,7 +1691,7 @@ + unsigned long mbx_rewrite (MAILSTREAM *stream,unsigned long *reclaimed, + long flags) + { +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + off_t pos,ppos; + int ld; +@@ -1810,9 +1810,9 @@ + fsync (LOCAL->fd); /* force disk update */ + } + fstat (LOCAL->fd,&sbuf); /* get new write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* reset atime to now */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* reset atime to now */ ++ utime (stream->mailbox,&tp); + unlockfd (ld,lock); /* release exclusive parse/append permission */ + /* notify upper level of new mailbox size */ + mail_exists (stream,stream->nmsgs); +--- a/src/osdep/unix/mh.c ++++ b/src/osdep/unix/mh.c +@@ -1276,8 +1276,8 @@ + + void mh_setdate (char *file,MESSAGECACHE *elt) + { +- time_t tp[2]; +- tp[0] = time (0); /* atime is now */ +- tp[1] = mail_longdate (elt); /* modification time */ +- utime (file,tp); /* set the times */ ++ struct utimbuf tp; ++ tp.actime = time (0); /* atime is now */ ++ tp.modtime = mail_longdate (elt); /* modification time */ ++ utime (file,&tp); /* set the times */ + } +--- a/src/osdep/unix/mmdf.c ++++ b/src/osdep/unix/mmdf.c +@@ -366,7 +366,7 @@ + int ret = NIL; + char *t,file[MAILTMPLEN]; + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + errno = EINVAL; /* assume invalid argument */ + /* must be non-empty file */ + if ((t = dummy_file (file,name)) && !stat (t,&sbuf)) { +@@ -377,9 +377,9 @@ + close (fd); /* close the file */ + /* \Marked status? */ + if ((sbuf.st_ctime > sbuf.st_atime) || (sbuf.st_mtime > sbuf.st_atime)) { +- tp[0] = sbuf.st_atime; /* preserve atime and mtime */ +- tp[1] = sbuf.st_mtime; +- utime (file,tp); /* set the times */ ++ tp.actime = sbuf.st_atime; /* preserve atime and mtime */ ++ tp.modtime = sbuf.st_mtime; ++ utime (file,&tp); /* set the times */ + } + } + } +@@ -1024,7 +1024,7 @@ + int fd; + char *s,file[MAILTMPLEN]; + DOTLOCK lock; +- time_t tp[2]; ++ struct utimbuf tp; + unsigned long i,j; + MESSAGECACHE *elt; + long ret = T; +@@ -1126,12 +1126,12 @@ + mail_free_searchset (&source); + mail_free_searchset (&dest); + } +- tp[1] = time (0); /* set mtime to now */ +- if (ret) tp[0] = tp[1] - 1; /* set atime to now-1 if successful copy */ +- else tp[0] = /* else preserve \Marked status */ ++ tp.modtime = time (0); /* set mtime to now */ ++ if (ret) tp.actime = tp.modtime - 1; /* set atime to now-1 if successful copy */ ++ else tp.actime = /* else preserve \Marked status */ + ((sbuf.st_ctime > sbuf.st_atime) || (sbuf.st_mtime > sbuf.st_atime)) ? +- sbuf.st_atime : tp[1]; +- utime (file,tp); /* set the times */ ++ sbuf.st_atime : tp.modtime; ++ utime (file,&tp); /* set the times */ + mmdf_unlock (fd,NIL,&lock); /* unlock and close mailbox */ + if (tstream) { /* update last UID if we can */ + MMDFLOCAL *local = (MMDFLOCAL *) tstream->local; +@@ -1165,7 +1165,7 @@ + int fd; + unsigned long i; + char *flags,*date,buf[BUFLEN],tmp[MAILTMPLEN],file[MAILTMPLEN]; +- time_t tp[2]; ++ struct utimbuf tp; + FILE *sf,*df; + MESSAGECACHE elt; + DOTLOCK lock; +@@ -1279,20 +1279,20 @@ + } + fstat (fd,&sbuf); /* get current file size */ + rewind (sf); +- tp[1] = time (0); /* set mtime to now */ ++ tp.modtime = time (0); /* set mtime to now */ + /* write all messages */ + if (!mmdf_append_msgs (tstream,sf,df,au ? dst : NIL) || + (fflush (df) == EOF) || fsync (fd)) { + sprintf (buf,"Message append failed: %s",strerror (errno)); + MM_LOG (buf,ERROR); + ftruncate (fd,sbuf.st_size); +- tp[0] = /* preserve \Marked status */ ++ tp.actime = /* preserve \Marked status */ + ((sbuf.st_ctime > sbuf.st_atime) || (sbuf.st_mtime > sbuf.st_atime)) ? +- sbuf.st_atime : tp[1]; ++ sbuf.st_atime : tp.modtime; + ret = NIL; /* return error */ + } +- else tp[0] = tp[1] - 1; /* set atime to now-1 if successful copy */ +- utime (file,tp); /* set the times */ ++ else tp.actime = tp.modtime - 1; /* set atime to now-1 if successful copy */ ++ utime (file,&tp); /* set the times */ + fclose (sf); /* done with scratch file */ + /* force UIDVALIDITY assignment now */ + if (tstream && !tstream->uid_validity) tstream->uid_validity = time (0); +@@ -1526,31 +1526,31 @@ + { + if (stream) { /* need to muck with times? */ + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + time_t now = time (0); + fstat (fd,&sbuf); /* get file times */ + if (LOCAL->ld >= 0) { /* yes, readwrite session? */ +- tp[0] = now; /* set atime to now */ ++ tp.actime = now; /* set atime to now */ + /* set mtime to (now - 1) if necessary */ +- tp[1] = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; ++ tp.modtime = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; + } + else if (stream->recent) { /* readonly with recent messages */ + if ((sbuf.st_atime >= sbuf.st_mtime) || + (sbuf.st_atime >= sbuf.st_ctime)) + /* keep past mtime, whack back atime */ +- tp[0] = (tp[1] = (sbuf.st_mtime < now) ? sbuf.st_mtime : now) - 1; ++ tp.actime = (tp.modtime = (sbuf.st_mtime < now) ? sbuf.st_mtime : now) - 1; + else now = 0; /* no time change needed */ + } + /* readonly with no recent messages */ + else if ((sbuf.st_atime < sbuf.st_mtime) || + (sbuf.st_atime < sbuf.st_ctime)) { +- tp[0] = now; /* set atime to now */ ++ tp.actime = now; /* set atime to now */ + /* set mtime to (now - 1) if necessary */ +- tp[1] = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; ++ tp.modtime = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; + } + else now = 0; /* no time change needed */ + /* set the times, note change */ +- if (now && !utime (stream->mailbox,tp)) LOCAL->filetime = tp[1]; ++ if (now && !utime (stream->mailbox,&tp)) LOCAL->filetime = tp.modtime; + } + flock (fd,LOCK_UN); /* release flock'ers */ + if (!stream) close (fd); /* close the file if no stream */ +@@ -2238,7 +2238,7 @@ + MESSAGECACHE *elt; + MMDFFILE f; + char *s; +- time_t tp[2]; ++ struct utimbuf tp; + long ret,flag; + unsigned long i,j; + unsigned long recent = stream->recent; +@@ -2391,9 +2391,9 @@ + mail_exists (stream,stream->nmsgs); + mail_recent (stream,recent); + /* set atime to now, mtime a second earlier */ +- tp[1] = (tp[0] = time (0)) - 1; ++ tp.modtime = (tp.actime = time (0)) - 1; + /* set the times, note change */ +- if (!utime (stream->mailbox,tp)) LOCAL->filetime = tp[1]; ++ if (!utime (stream->mailbox,&tp)) LOCAL->filetime = tp.modtime; + close (LOCAL->fd); /* close and reopen file */ + if ((LOCAL->fd = open (stream->mailbox,O_RDWR, + (long) mail_parameters (NIL,GET_MBXPROTECTION,NIL))) +--- a/src/osdep/unix/mtx.c ++++ b/src/osdep/unix/mtx.c +@@ -172,7 +172,7 @@ + int ret = NIL; + char *s,file[MAILTMPLEN]; + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + errno = EINVAL; /* assume invalid argument */ + /* if file, get its status */ + if ((s = mtx_file (file,name)) && !stat (s,&sbuf)) { +@@ -194,9 +194,9 @@ + close (fd); /* close the file */ + /* \Marked status? */ + if (sbuf.st_ctime > sbuf.st_atime) { +- tp[0] = sbuf.st_atime; /* preserve atime and mtime */ +- tp[1] = sbuf.st_mtime; +- utime (file,tp); /* set the times */ ++ tp.actime = sbuf.st_atime; /* preserve atime and mtime */ ++ tp.modtime = sbuf.st_mtime; ++ utime (file,&tp); /* set the times */ + } + } + } +@@ -558,14 +558,14 @@ + + void mtx_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags) + { +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + if (!stream->rdonly) { /* make sure the update takes */ + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get current write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* make sure read comes after all that */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* make sure read comes after all that */ ++ utime (stream->mailbox,&tp); + } + } + +@@ -729,7 +729,7 @@ + long mtx_expunge (MAILSTREAM *stream,char *sequence,long options) + { + long ret; +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + off_t pos = 0; + int ld; +@@ -832,9 +832,9 @@ + else MM_LOG ("No messages deleted, so no update needed",(long) NIL); + fsync (LOCAL->fd); /* force disk update */ + fstat (LOCAL->fd,&sbuf); /* get new write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* reset atime to now */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* reset atime to now */ ++ utime (stream->mailbox,&tp); + MM_NOCRITICAL (stream); /* release critical */ + /* notify upper level of new mailbox size */ + mail_exists (stream,stream->nmsgs); +@@ -859,7 +859,7 @@ + long mtx_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options) + { + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + MESSAGECACHE *elt; + unsigned long i,j,k; + long ret = LONGT; +@@ -925,11 +925,11 @@ + MM_LOG (LOCAL->buf,ERROR); + ftruncate (fd,sbuf.st_size); + } +- if (ret) tp[0] = time (0) - 1;/* set atime to now-1 if successful copy */ ++ if (ret) tp.actime = time (0) - 1;/* set atime to now-1 if successful copy */ + /* else preserve \Marked status */ +- else tp[0] = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); +- tp[1] = sbuf.st_mtime; /* preserve mtime */ +- utime (file,tp); /* set the times */ ++ else tp.actime = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); ++ tp.modtime = sbuf.st_mtime; /* preserve mtime */ ++ utime (file,&tp); /* set the times */ + close (fd); /* close the file */ + unlockfd (ld,lock); /* release exclusive parse/append permission */ + MM_NOCRITICAL (stream); /* release critical */ +@@ -944,9 +944,9 @@ + if (!stream->rdonly) { /* make sure the update takes */ + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get current write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* make sure atime remains greater */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* make sure atime remains greater */ ++ utime (stream->mailbox,&tp); + } + } + if (ret && mail_parameters (NIL,GET_COPYUID,NIL)) +@@ -967,7 +967,7 @@ + struct stat sbuf; + int fd,ld,c; + char *flags,*date,tmp[MAILTMPLEN],file[MAILTMPLEN],lock[MAILTMPLEN]; +- time_t tp[2]; ++ struct utimbuf tp; + FILE *df; + MESSAGECACHE elt; + long f; +@@ -1058,11 +1058,11 @@ + } + ret = NIL; + } +- if (ret) tp[0] = time (0) - 1;/* set atime to now-1 if successful copy */ ++ if (ret) tp.actime = time (0) - 1;/* set atime to now-1 if successful copy */ + /* else preserve \Marked status */ +- else tp[0] = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); +- tp[1] = sbuf.st_mtime; /* preserve mtime */ +- utime (file,tp); /* set the times */ ++ else tp.actime = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); ++ tp.modtime = sbuf.st_mtime; /* preserve mtime */ ++ utime (file,&tp); /* set the times */ + fclose (df); /* close the file */ + unlockfd (ld,lock); /* release exclusive parse/append permission */ + MM_NOCRITICAL (stream); /* release critical */ +@@ -1209,10 +1209,10 @@ + fstat (LOCAL->fd,&sbuf); /* get status again to ensure time is right */ + LOCAL->filetime = sbuf.st_mtime; + if (added && !stream->rdonly){/* make sure atime updated */ +- time_t tp[2]; +- tp[0] = time (0); +- tp[1] = LOCAL->filetime; +- utime (stream->mailbox,tp); ++ struct utimbuf tp; ++ tp.actime = time (0); ++ tp.modtime = LOCAL->filetime; ++ utime (stream->mailbox,&tp); + } + stream->silent = silent; /* can pass up events now */ + mail_exists (stream,nmsgs); /* notify upper level of new mailbox size */ +@@ -1287,7 +1287,7 @@ + + void mtx_update_status (MAILSTREAM *stream,unsigned long msgno,long syncflag) + { +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + MESSAGECACHE *elt = mail_elt (stream,msgno); + unsigned long j,k = 0; +@@ -1310,9 +1310,9 @@ + if (syncflag) { /* sync if requested */ + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get new write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* make sure read is later */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* make sure read is later */ ++ utime (stream->mailbox,&tp); + } + } + } +--- a/src/osdep/unix/mx.c ++++ b/src/osdep/unix/mx.c +@@ -1280,8 +1280,8 @@ + + void mx_setdate (char *file,MESSAGECACHE *elt) + { +- time_t tp[2]; +- tp[0] = time (0); /* atime is now */ +- tp[1] = mail_longdate (elt); /* modification time */ +- utime (file,tp); /* set the times */ ++ struct utimbuf tp; ++ tp.actime = time (0); /* atime is now */ ++ tp.modtime = mail_longdate (elt); /* modification time */ ++ utime (file,&tp); /* set the times */ + } +--- a/src/osdep/unix/tenex.c ++++ b/src/osdep/unix/tenex.c +@@ -179,7 +179,7 @@ + int ret = NIL; + char *s,file[MAILTMPLEN]; + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + errno = EINVAL; /* assume invalid argument */ + /* if file, get its status */ + if ((s = tenex_file (file,name)) && !stat (s,&sbuf)) { +@@ -201,9 +201,9 @@ + close (fd); /* close the file */ + /* \Marked status? */ + if (sbuf.st_ctime > sbuf.st_atime) { +- tp[0] = sbuf.st_atime; /* preserve atime and mtime */ +- tp[1] = sbuf.st_mtime; +- utime (file,tp); /* set the times */ ++ tp.actime = sbuf.st_atime; /* preserve atime and mtime */ ++ tp.modtime = sbuf.st_mtime; ++ utime (file,&tp); /* set the times */ + } + } + } +@@ -647,14 +647,14 @@ + + void tenex_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags) + { +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + if (!stream->rdonly) { /* make sure the update takes */ + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get current write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* make sure read comes after all that */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* make sure read comes after all that */ ++ utime (stream->mailbox,&tp); + } + } + +@@ -818,7 +818,7 @@ + long tenex_expunge (MAILSTREAM *stream,char *sequence,long options) + { + long ret; +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + off_t pos = 0; + int ld; +@@ -922,9 +922,9 @@ + else MM_LOG ("No messages deleted, so no update needed",(long) NIL); + fsync (LOCAL->fd); /* force disk update */ + fstat (LOCAL->fd,&sbuf); /* get new write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* reset atime to now */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* reset atime to now */ ++ utime (stream->mailbox,&tp); + MM_NOCRITICAL (stream); /* release critical */ + /* notify upper level of new mailbox size */ + mail_exists (stream,stream->nmsgs); +@@ -949,7 +949,7 @@ + long tenex_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options) + { + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + MESSAGECACHE *elt; + unsigned long i,j,k; + long ret = LONGT; +@@ -1015,11 +1015,11 @@ + MM_LOG (LOCAL->buf,ERROR); + ftruncate (fd,sbuf.st_size); + } +- if (ret) tp[0] = time (0) - 1;/* set atime to now-1 if successful copy */ ++ if (ret) tp.actime = time (0) - 1;/* set atime to now-1 if successful copy */ + /* else preserve \Marked status */ +- else tp[0] = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); +- tp[1] = sbuf.st_mtime; /* preserve mtime */ +- utime (file,tp); /* set the times */ ++ else tp.actime = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); ++ tp.modtime = sbuf.st_mtime; /* preserve mtime */ ++ utime (file,&tp); /* set the times */ + close (fd); /* close the file */ + unlockfd (ld,lock); /* release exclusive parse/append permission */ + MM_NOCRITICAL (stream); /* release critical */ +@@ -1034,9 +1034,9 @@ + if (!stream->rdonly) { /* make sure the update takes */ + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get current write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* make sure atime remains greater */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* make sure atime remains greater */ ++ utime (stream->mailbox,&tp); + } + } + if (ret && mail_parameters (NIL,GET_COPYUID,NIL)) +@@ -1057,7 +1057,7 @@ + struct stat sbuf; + int fd,ld,c; + char *flags,*date,tmp[MAILTMPLEN],file[MAILTMPLEN],lock[MAILTMPLEN]; +- time_t tp[2]; ++ struct utimbuf tp; + FILE *df; + MESSAGECACHE elt; + long f; +@@ -1155,11 +1155,11 @@ + } + ret = NIL; + } +- if (ret) tp[0] = time (0) - 1;/* set atime to now-1 if successful copy */ ++ if (ret) tp.actime = time (0) - 1;/* set atime to now-1 if successful copy */ + /* else preserve \Marked status */ +- else tp[0] = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); +- tp[1] = sbuf.st_mtime; /* preserve mtime */ +- utime (file,tp); /* set the times */ ++ else tp.actime = (sbuf.st_ctime > sbuf.st_atime) ? sbuf.st_atime : time(0); ++ tp.modtime = sbuf.st_mtime; /* preserve mtime */ ++ utime (file,&tp); /* set the times */ + fclose (df); /* close the file */ + unlockfd (ld,lock); /* release exclusive parse/append permission */ + MM_NOCRITICAL (stream); /* release critical */ +@@ -1321,10 +1321,10 @@ + fstat (LOCAL->fd,&sbuf); /* get status again to ensure time is right */ + LOCAL->filetime = sbuf.st_mtime; + if (added && !stream->rdonly){/* make sure atime updated */ +- time_t tp[2]; +- tp[0] = time (0); +- tp[1] = LOCAL->filetime; +- utime (stream->mailbox,tp); ++ struct utimbuf tp; ++ tp.actime = time (0); ++ tp.modtime = LOCAL->filetime; ++ utime (stream->mailbox,&tp); + } + stream->silent = silent; /* can pass up events now */ + mail_exists (stream,nmsgs); /* notify upper level of new mailbox size */ +@@ -1399,7 +1399,7 @@ + + void tenex_update_status (MAILSTREAM *stream,unsigned long msgno,long syncflag) + { +- time_t tp[2]; ++ struct utimbuf tp; + struct stat sbuf; + MESSAGECACHE *elt = mail_elt (stream,msgno); + unsigned long j,k = 0; +@@ -1422,9 +1422,9 @@ + if (syncflag) { /* sync if requested */ + fsync (LOCAL->fd); + fstat (LOCAL->fd,&sbuf); /* get new write time */ +- tp[1] = LOCAL->filetime = sbuf.st_mtime; +- tp[0] = time (0); /* make sure read is later */ +- utime (stream->mailbox,tp); ++ tp.modtime = LOCAL->filetime = sbuf.st_mtime; ++ tp.actime = time (0); /* make sure read is later */ ++ utime (stream->mailbox,&tp); + } + } + } +--- a/src/osdep/unix/unix.c ++++ b/src/osdep/unix/unix.c +@@ -214,7 +214,7 @@ + DRIVER *ret = NIL; + char *t,file[MAILTMPLEN]; + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + errno = EINVAL; /* assume invalid argument */ + /* must be non-empty file */ + if ((t = dummy_file (file,name)) && !stat (t,&sbuf)) { +@@ -226,9 +226,9 @@ + close (fd); /* close the file */ + /* \Marked status? */ + if ((sbuf.st_ctime > sbuf.st_atime) || (sbuf.st_mtime > sbuf.st_atime)) { +- tp[0] = sbuf.st_atime; /* yes, preserve atime and mtime */ +- tp[1] = sbuf.st_mtime; +- utime (file,tp); /* set the times */ ++ tp.actime = sbuf.st_atime; /* yes, preserve atime and mtime */ ++ tp.modtime = sbuf.st_mtime; ++ utime (file,&tp); /* set the times */ + } + } + } +@@ -884,7 +884,7 @@ + int fd; + char *s,file[MAILTMPLEN]; + DOTLOCK lock; +- time_t tp[2]; ++ struct utimbuf tp; + unsigned long i,j; + MESSAGECACHE *elt; + long ret = T; +@@ -990,12 +990,12 @@ + mail_free_searchset (&source); + mail_free_searchset (&dest); + } +- tp[1] = time (0); /* set mtime to now */ +- if (ret) tp[0] = tp[1] - 1; /* set atime to now-1 if successful copy */ +- else tp[0] = /* else preserve \Marked status */ ++ tp.modtime = time (0); /* set mtime to now */ ++ if (ret) tp.actime = tp.modtime - 1; /* set atime to now-1 if successful copy */ ++ else tp.actime = /* else preserve \Marked status */ + ((sbuf.st_ctime > sbuf.st_atime) || (sbuf.st_mtime > sbuf.st_atime)) ? +- sbuf.st_atime : tp[1]; +- utime (file,tp); /* set the times */ ++ sbuf.st_atime : tp.modtime; ++ utime (file,&tp); /* set the times */ + unix_unlock (fd,NIL,&lock); /* unlock and close mailbox */ + if (tstream) { /* update last UID if we can */ + UNIXLOCAL *local = (UNIXLOCAL *) tstream->local; +@@ -1029,7 +1029,7 @@ + int fd; + unsigned long i; + char *flags,*date,buf[BUFLEN],tmp[MAILTMPLEN],file[MAILTMPLEN]; +- time_t tp[2]; ++ struct utimbuf tp; + FILE *sf,*df; + MESSAGECACHE elt; + DOTLOCK lock; +@@ -1143,20 +1143,20 @@ + } + fstat (fd,&sbuf); /* get current file size */ + rewind (sf); +- tp[1] = time (0); /* set mtime to now */ ++ tp.modtime = time (0); /* set mtime to now */ + /* write all messages */ + if (!unix_append_msgs (tstream,sf,df,au ? dst : NIL) || + (fflush (df) == EOF) || fsync (fd)) { + sprintf (buf,"Message append failed: %s",strerror (errno)); + MM_LOG (buf,ERROR); + ftruncate (fd,sbuf.st_size); +- tp[0] = /* preserve \Marked status */ ++ tp.actime = /* preserve \Marked status */ + ((sbuf.st_ctime > sbuf.st_atime) || (sbuf.st_mtime > sbuf.st_atime)) ? +- sbuf.st_atime : tp[1]; ++ sbuf.st_atime : tp.modtime; + ret = NIL; /* return error */ + } +- else tp[0] = tp[1] - 1; /* set atime to now-1 if successful copy */ +- utime (file,tp); /* set the times */ ++ else tp.actime = tp.modtime - 1; /* set atime to now-1 if successful copy */ ++ utime (file,&tp); /* set the times */ + fclose (sf); /* done with scratch file */ + /* force UIDVALIDITY assignment now */ + if (tstream && !tstream->uid_validity) tstream->uid_validity = time (0); +@@ -1397,31 +1397,31 @@ + { + if (stream) { /* need to muck with times? */ + struct stat sbuf; +- time_t tp[2]; ++ struct utimbuf tp; + time_t now = time (0); + fstat (fd,&sbuf); /* get file times */ + if (LOCAL->ld >= 0) { /* yes, readwrite session? */ +- tp[0] = now; /* set atime to now */ ++ tp.actime = now; /* set atime to now */ + /* set mtime to (now - 1) if necessary */ +- tp[1] = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; ++ tp.modtime = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; + } + else if (stream->recent) { /* readonly with recent messages */ + if ((sbuf.st_atime >= sbuf.st_mtime) || + (sbuf.st_atime >= sbuf.st_ctime)) + /* keep past mtime, whack back atime */ +- tp[0] = (tp[1] = (sbuf.st_mtime < now) ? sbuf.st_mtime : now) - 1; ++ tp.actime = (tp.modtime = (sbuf.st_mtime < now) ? sbuf.st_mtime : now) - 1; + else now = 0; /* no time change needed */ + } + /* readonly with no recent messages */ + else if ((sbuf.st_atime < sbuf.st_mtime) || + (sbuf.st_atime < sbuf.st_ctime)) { +- tp[0] = now; /* set atime to now */ ++ tp.actime = now; /* set atime to now */ + /* set mtime to (now - 1) if necessary */ +- tp[1] = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; ++ tp.modtime = (now > sbuf.st_mtime) ? sbuf.st_mtime : now - 1; + } + else now = 0; /* no time change needed */ + /* set the times, note change */ +- if (now && !utime (stream->mailbox,tp)) LOCAL->filetime = tp[1]; ++ if (now && !utime (stream->mailbox,&tp)) LOCAL->filetime = tp.modtime; + } + flock (fd,LOCK_UN); /* release flock'ers */ + if (!stream) close (fd); /* close the file if no stream */ +@@ -2075,7 +2075,7 @@ + MESSAGECACHE *elt; + UNIXFILE f; + char *s; +- time_t tp[2]; ++ struct utimbuf tp; + long ret,flag; + unsigned long i,j; + unsigned long recent = stream->recent; +@@ -2245,9 +2245,9 @@ + mail_exists (stream,stream->nmsgs); + mail_recent (stream,recent); + /* set atime to now, mtime a second earlier */ +- tp[1] = (tp[0] = time (0)) - 1; ++ tp.modtime = (tp.actime = time (0)) - 1; + /* set the times, note change */ +- if (!utime (stream->mailbox,tp)) LOCAL->filetime = tp[1]; ++ if (!utime (stream->mailbox,&tp)) LOCAL->filetime = tp.modtime; + close (LOCAL->fd); /* close and reopen file */ + if ((LOCAL->fd = open (stream->mailbox,O_RDWR, + (long) mail_parameters (NIL,GET_MBXPROTECTION,NIL))) diff --git a/uw-imap/c-client-2007f_p7-implicit-declaration-fix.patch b/uw-imap/c-client-2007f_p7-implicit-declaration-fix.patch new file mode 100644 index 0000000..413ddbf --- /dev/null +++ b/uw-imap/c-client-2007f_p7-implicit-declaration-fix.patch @@ -0,0 +1,46 @@ +This patch solves build issues with -Werror=implicit-function-declaration +enabled. + +- safe_flock is a function from flocklnx.c but header file for consumers + is missing, the simplest was to add function prototype to other + header file. +- utime.h is needed also in multiple places but os_slx.h header file is + used in all of them + +Bug: https://bugs.gentoo.org/870478 +--- a/src/osdep/unix/os_lnx.h ++++ b/src/osdep/unix/os_lnx.h +@@ -46,6 +46,7 @@ + #include <sys/types.h> + #include <dirent.h> + #include <time.h> /* for struct tm */ ++#include <utime.h> + #include <fcntl.h> + #include <syslog.h> + #include <sys/file.h> +@@ -57,6 +58,7 @@ + + #define direct dirent + ++int safe_flock(int, int); + #define flock safe_flock + + +--- a/src/osdep/unix/os_slx.h ++++ b/src/osdep/unix/os_slx.h +@@ -46,6 +46,7 @@ + #include <sys/types.h> + #include <dirent.h> + #include <time.h> /* for struct tm */ ++#include <utime.h> + #include <fcntl.h> + #include <syslog.h> + #include <sys/file.h> +@@ -57,6 +58,7 @@ + + #define direct dirent + ++int safe_flock(int, int); + #define flock safe_flock + + |
