summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Vogel <jvogel@stygian.me>2024-12-14 00:46:32 -0500
committerJohn Vogel <jvogel@stygian.me>2024-12-14 00:46:32 -0500
commit5037bf99c02b04c1ac1326615f74395fc585ed65 (patch)
tree7275167ef414d3026f591c33e1a9db68cc1a94ef
parentc0b3c407f2c3eaf0852191db7125761cfbe49bed (diff)
downloadmy-aports-5037bf99c02b04c1ac1326615f74395fc585ed65.tar.gz
local/uw-imap: new aport
-rw-r--r--uw-imap/0001-Add-missing-headers.patch58
-rw-r--r--uw-imap/APKBUILD85
-rw-r--r--uw-imap/c-client-2006k_GENTOO_amd64-so-fix.patch13
-rw-r--r--uw-imap/c-client-2007f-scandir-callback-types.patch167
-rw-r--r--uw-imap/c-client-2007f_p7-c99.patch791
-rw-r--r--uw-imap/c-client-2007f_p7-implicit-declaration-fix.patch46
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
+
+