From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 12160 invoked from network); 15 Feb 2021 09:59:59 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 15 Feb 2021 09:59:59 -0000 Received: from outgoing.selfhost.de ([82.98.82.6]) by 1ess; Mon Feb 15 04:56:31 -0500 2021 Received: (qmail 780 invoked from network); 15 Feb 2021 09:56:10 -0000 Received: from unknown (HELO mx03.bss-wf.de) (postmaster@emdtgvmf.mail.selfhost.de@84.150.39.186) by mailout.selfhost.de with ESMTPA; 15 Feb 2021 09:56:10 -0000 Received: by mx03.bss-wf.de (Postfix, from userid 1000) id 04F713DD76; Mon, 15 Feb 2021 10:56:09 +0100 (CET) Received: from 9nb.pala (p5b3bcb58.dip0.t-ipconnect.de [91.59.203.88]) by mx03.bss-wf.de (Postfix) with ESMTPSA id 1CA403DD74 for <9front@9front.org>; Mon, 15 Feb 2021 10:56:08 +0100 (CET) Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit To: 9front@9front.org Date: Mon, 15 Feb 2021 10:56:03 +0100 From: theinicke@bss-wf.de In-Reply-To: <3722F8754191D3F8DE6B80755E5B34F4@bss-wf.de> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: immutable overflow-preventing template module-oriented event high-performance-scale DOM locator Subject: Re: [9front] Mail rewrite; open path with stored mails Reply-To: 9front@9front.org Precedence: bulk Ouch.. I should not write code and mails while being tired and doing other things... I apologize to anyone who has wasted time reading through my previous patch. @Ori: Thanks again for your feedback - and also your patience. What follows is a patch that adresses most of the feedback and hopefully looks better: diff -r 02e3059af5bc sys/man/1/acmemail --- a/sys/man/1/acmemail Thu Feb 11 09:37:36 2021 +0100 +++ b/sys/man/1/acmemail Mon Feb 15 10:48:11 2021 +0100 @@ -1,4 +1,4 @@ -.TH NAIL 1 +.TH ACMEMAIL 1 .SH NAME Mail \- view mail in acme @@ -6,7 +6,7 @@ Mail [ -.B -OsT +.B -TOs ] [ .B -m @@ -20,6 +20,13 @@ .B -o .I outbox ] +[ +.B -p +.I path +] +[ +.I mbox +] .SH DESCRIPTION .PP @@ -64,6 +71,10 @@ Save a copy of outgoing messages to the mailbox .IR outbox , instead of discarding them after they're enqueued. +.TP +.BI -p " path +Opens new mailbox for the given path, +closes it on exit. .PP Mail presents and acme interface for a upas/fs mailbox. diff -r 02e3059af5bc sys/src/cmd/upas/Mail/mbox.c --- a/sys/src/cmd/upas/Mail/mbox.c Thu Feb 11 09:37:36 2021 +0100 +++ b/sys/src/cmd/upas/Mail/mbox.c Mon Feb 15 10:48:11 2021 +0100 @@ -45,6 +45,31 @@ static void showmesg(Biobuf*, Mesg*, int, int); +int +openctlfile(void) +{ + int fd; + char *path; + + path = estrjoin(maildir, "/ctl", nil); + fd = open(path, OWRITE); + free(path); + return fd; +} + +void +closembox(void) +{ + int fd; + + fd = openctlfile(); + if(fd == -1) + return; + + fprint(fd, "close %s", mailbox); + close(fd); +} + static void plumbloop(Channel *ch, int fd) { @@ -676,13 +701,10 @@ mbflush(char **, int) { int i, j, ln, fd; - char *path; Mesg *m, *p; i = 0; - path = estrjoin(maildir, "/ctl", nil); - fd = open(path, OWRITE); - free(path); + fd = openctlfile(); if(fd == -1) sysfatal("open mbox: %r"); while(i < mbox.nmesg){ @@ -975,15 +997,91 @@ static void usage(void) { - fprint(2, "usage: %s [-T] [-m mailfs] [-s] [-f format] [mbox]\n", argv0); + fprint(2, "usage: %s [-TOs] [-m maildir] [-f format] [-o outbox] [-p path] [mbox]\n", argv0); exits("usage"); } +static char* +basename(char *path) +{ + char *base; + base = strrchr(path, '/'); + if(base == nil) + base = path; + return base+1; +} + +static char* +absmboxpath(char *path) +{ + char *abspath; + char buf[512]; + int fd, i; + + /* if path is already absolute, leave it as it is - to allow /imap... + otherwise get absolute path from relative one */ + if(*path == '/'){ + i = strlen(path); + while(i > 0 && path[--i] == '/') + path[i] = '\0'; + abspath = estrdup(path); + }else{ + fd = open(path, OREAD); + if(fd < 0) + sysfatal("can't open %s: %r", path); + + if(fd2path(fd, buf, sizeof buf) != 0) + sysfatal("fd2path %s: %r", path); + close(fd); + abspath = estrdup(buf); + } + + return abspath; +} + +static void +openmbox(char *path, char *mboxname) +{ + int fd, i; + char err[ERRMAX]; + char *name, *fsname, *abspath; + + abspath = absmboxpath(path); + + if(mboxname != nil) + name = mboxname; + else{ + name = basename(abspath); + } + + fd = openctlfile(); + if(fd == -1) + sysfatal("open mbox: %r"); + fsname = estrdup(name); + for(i=0; i<10; i++){ + if(fprint(fd, "open %s %s", abspath, fsname) >= 0) + break; + err[0] = '\0'; + errstr(err, sizeof err); + if(strstr(err, "mbox name in use") == nil) + sysfatal("can't create directory %s for mail: %s", name, err); + free(fsname); + fsname = smprint("%s-%d", name, i); + } + if(i == 10) + sysfatal("can't open %s: %r", abspath); + + mailbox = fsname; + free(abspath); + close(fd); +} + void threadmain(int argc, char **argv) { Fmt fmt; char *cmd; + char *path = nil, *mboxname = nil; int i; mbox.view = Vgroup; @@ -1017,6 +1115,9 @@ case 'o': savebox = EARGF(usage()); break; + case 'p': + path = EARGF(usage()); + break; default: usage(); break; @@ -1024,8 +1125,18 @@ if(argc > 1) usage(); - if(argc == 1) + if(argc == 1) { mailbox = argv[0]; + mboxname = mailbox; + } + + if(path != nil) { + openmbox(path, mboxname); + if(atexit(closembox) == 0) { + closembox(); + sysfatal("atexit: %r"); + } + } mesgpat = regcomp("([0-9]+)(/.*)?"); cwait = threadwaitchan();