diff options
author | Sam James <sam@gentoo.org> | 2024-11-27 04:43:54 +0000 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2024-11-27 04:43:54 +0000 |
commit | 047bf91f2c9c3bedd713e2d89c4bd67e87f85304 (patch) | |
tree | 949e94e3b16d4fd88b8ddec839d73aa1bfc3484c /net-libs | |
parent | net-libs/c-client: drop 2007f-r8 (diff) | |
download | gentoo-047bf91f2c9c3bedd713e2d89c4bd67e87f85304.tar.gz gentoo-047bf91f2c9c3bedd713e2d89c4bd67e87f85304.tar.bz2 gentoo-047bf91f2c9c3bedd713e2d89c4bd67e87f85304.zip |
net-libs/c-client: fix modern C issues
Debian haven't moved on since _p7 in 2019 unfortunately. A friend of mine
has a fork he needs to rebase which I may join him on as a proper base
for distros rather than us all hoarding various patches, but for now,
apply the patch from the bug (which does indeed fix various issues properly
- thanks).
Closes: https://bugs.gentoo.org/919252
Thanks-to: asears@conestogawood.com
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'net-libs')
-rw-r--r-- | net-libs/c-client/c-client-2007f_p7-r1.ebuild | 171 | ||||
-rw-r--r-- | net-libs/c-client/files/c-client-2007f_p7-c99.patch | 791 |
2 files changed, 962 insertions, 0 deletions
diff --git a/net-libs/c-client/c-client-2007f_p7-r1.ebuild b/net-libs/c-client/c-client-2007f_p7-r1.ebuild new file mode 100644 index 000000000000..fbc76af8b9a9 --- /dev/null +++ b/net-libs/c-client/c-client-2007f_p7-r1.ebuild @@ -0,0 +1,171 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit flag-o-matic libtool toolchain-funcs + +MY_PN=imap +MY_P="${MY_PN}-${PV}" + +DESCRIPTION="UW IMAP c-client library" +HOMEPAGE="http://www.washington.edu/imap/" +SRC_URI=" + ftp://ftp.cac.washington.edu/imap/${MY_PN}-$(ver_cut 1-2).tar.Z + mirror://debian/pool/main/u/uw-${MY_PN}/uw-${MY_PN}_${PV/_p/"~dfsg-"}.debian.tar.xz +" +S="${WORKDIR}"/${MY_PN}-$(ver_cut 1-2) + +LICENSE="Apache-2.0" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86" +IUSE="doc +ipv6 kerberos pam ssl static-libs topal" + +RDEPEND=" + ssl? ( + dev-libs/openssl:= + ) + kernel_linux? ( + pam? ( >=sys-libs/pam-0.72 ) + !pam? ( virtual/libcrypt:= ) + ) + kerberos? ( app-crypt/mit-krb5 ) +" +DEPEND="${RDEPEND}" + +PATCHES=( + "${WORKDIR}"/debian/patches + + # Apply a patch to only build the stuff we need for c-client + "${FILESDIR}/${PN}-2006k_GENTOO_Makefile.patch" + + # Apply patch to add the compilation of a .so for PHP + # This was previously conditional, but is more widely useful. + "${FILESDIR}/${PN}-2007f_GENTOO_amd64-so-fix.patch" + + # Respect LDFLAGS + "${FILESDIR}/${PN}-2007f_p7-ldflags.patch" + + # build fix for -Werror=implicit-function-declaration and + # incompatible function pointer types, bug #870478 and bug #919252 + "${FILESDIR}/${PN}-2007f-scandir-callback-types.patch" + "${FILESDIR}/${PN}-2007f_p7-implicit-declaration-fix.patch" + "${FILESDIR}/${PN}-2007f_p7-c99.patch" +) + +src_prepare() { + use topal && PATCHES+=( "${FILESDIR}/${PN}-2007f-topal.patch" ) + + default + + # Tarball packed with bad file perms + chmod -R u+rwX,go-w . || die "failed to fix permissions" + + # Lots of things need -fPIC, including various platforms, and this library + # generally should be built with it anyway. + append-flags -fPIC + + # Modifications so we can build it optimally and correctly + sed \ + -e "s:BASECFLAGS=\".*\":BASECFLAGS=:g" \ + -e 's:SSLDIR=/usr/local/ssl:SSLDIR=/usr:g' \ + -e 's:SSLCERTS=$(SSLDIR)/certs:SSLCERTS=/etc/ssl/certs:g' \ + -i src/osdep/unix/Makefile \ + || die "failed to fix compiler flags and SSL paths in the Makefile" + + # Make the build system more multilib aware + sed \ + -e "s:^SSLLIB=\$(SSLDIR)/lib:SSLLIB=\$(SSLDIR)/$(get_libdir):" \ + -e "s:^AFSLIB=\$(AFSDIR)/lib:AFSLIB=\$(AFSDIR)/$(get_libdir):" \ + -i src/osdep/unix/Makefile \ + || die "failed to fix our libdir in the Makefile" + + # Targets should use the Gentoo (ie linux) fs + sed -e '/^bsf:/,/^$/ s:ACTIVEFILE=.*:ACTIVEFILE=/var/lib/news/active:g' \ + -i src/osdep/unix/Makefile \ + || die "failed to fix the FreeBSD ACTIVEFILE path in the Makefile" + + # Remove the pesky checks about SSL stuff + sed -e '/read.*exit/d' -i Makefile \ + || die "failed to disable SSL warning in the Makefile" + + sed -e "s:CC=cc:CC=$(tc-getCC):" \ + -e "s:ARRC=ar:ARRC=$(tc-getAR):" \ + -e "s:RANLIB=ranlib:RANLIB=$(tc-getRANLIB):" \ + -i src/osdep/unix/Makefile \ + || die "failed to fix build flags support in the Makefile" + + sed -i -e "s:krb5-config.mit:krb5-config:" src/osdep/unix/Makefile.gss || die + + elibtoolize +} + +src_compile() { + local mymake target passwdtype + + local ipver='IP=4' + if use ipv6 ; then + ipver="IP=6" + touch ip6 || die "failed to create ip6 file" + fi + + local ssltype="none" + if use ssl ; then + ssltype="unix" + fi + + if use kernel_linux ; then + # Fall back to "slx" when USE=pam is not set. This ensures that + # we link in libcrypt to get the crypt() routine (bug #456928). + use pam && target=lnps passwdtype=pam || target=slx passwdtype=std + fi + + if use kerberos ; then + mymake="EXTRAAUTHENTICATORS=gss" + EXTRALIBS="-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err" + fi + + emake -j1 \ + SSLTYPE=${ssltype} ${target} \ + PASSWDTYPE=${passwdtype} ${ipver} ${mymake} \ + EXTRACFLAGS="${CFLAGS}" \ + EXTRALDFLAGS="${LDFLAGS}" \ + EXTRALIBS="${EXTRALIBS}" \ + GSSDIR=/usr +} + +src_install() { + if use static-libs; then + # Library binary + dolib.a c-client/c-client.a + dosym c-client.a "/usr/$(get_libdir)/libc-client.a" + fi + + # Now the shared library + dolib.so c-client/libc-client.so.1.0.0 + + dosym libc-client.so.1.0.0 "/usr/$(get_libdir)/libc-client.so" + dosym libc-client.so.1.0.0 "/usr/$(get_libdir)/libc-client.so.1" + + # Headers + insinto /usr/include/imap + doins src/osdep/unix/*.h + doins src/c-client/*.h + doins c-client/linkage.h + doins c-client/linkage.c + doins c-client/osdep.h + + if use ssl; then + echo " ssl_onceonlyinit ();" >> "${D}"/usr/include/imap/linkage.c \ + || die "failed to add ssl init statement to linkage.c" + fi + + # Documentation + dodoc README docs/*.txt docs/BUILD docs/CONFIG docs/RELNOTES docs/SSLBUILD + if use doc; then + docinto rfc + dodoc docs/rfc/*.txt + docinto draft + dodoc docs/draft/* + fi +} diff --git a/net-libs/c-client/files/c-client-2007f_p7-c99.patch b/net-libs/c-client/files/c-client-2007f_p7-c99.patch new file mode 100644 index 000000000000..4ee62e7d6d1a --- /dev/null +++ b/net-libs/c-client/files/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))) |