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.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 9622 invoked from network); 29 May 2021 02:25:05 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 29 May 2021 02:25:05 -0000 Received: from mout.gmx.net ([212.227.15.15]) by 1ess; Fri May 28 11:24:16 -0400 2021 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1622215451; bh=vfYF8ZnZ8Kf9Lexd3GmB8u6L9jQpUE2s9VJSiWhHDaQ=; h=X-UI-Sender-Class:Date:From:To:Subject; b=lG2rq/JUep7opGbw7V11dMarXVv+G8gpx4K4l/yaleg/mvnjsvgtgKl8u+aPtGtth fyKtcmWr7DZcRYJU/6Y8Pty6vv4oNqJYIGjcADUVSmV+sZb5qu9XexTbiQn/jDmiNP Z9lFi7hXQu7kSkhmQ4qxX+rwVQS9XQ0Fhb4iksbg= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from purple.my.domain ([84.248.10.74]) by mail.gmx.net (mrgmx004 [212.227.17.184]) with ESMTPSA (Nemesis) id 1N2mBa-1lPmjX3cxY-0134GG; Fri, 28 May 2021 17:11:32 +0200 Message-ID: Date: Fri, 28 May 2021 18:10:37 +0300 From: risto.salminen@gmx.com To: 9front@9front.org MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:pJbDm+PzMBLHvG+RLU+GZ3ykcQNcRhVzDuGlUJxNJv7my1osxmA XgMJIiegRVq3hEYXyKJxmnih0sYnHty2iBVKd9jT5NJx4tAUttMy31LRjz46p6lsUVieTRa KNm0KSa3ikjjHicuN7ExkEgI/cQxBmJTja+Ia4z/wjfP77jfFiKLv1dVcXIqRnv2IlqNUcI 4z45SzUvkXg2PnLBQa0fQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:Jar3EBL8Gvo=:ZRhX3cmL9hexP1B72oxm/M 7Cnp3rRQg4LO+9Nn1q6fNkAJpG9dp0rK0aw8PSXMB7nfO4G0Pz6LPbrxf0SguDHFsEdqXP1wH 5JJ9jB+7Cz1Hc8Fy2S/whFOy05mgizWgIdKtzCpRbP53YKNwG508VLSOxzNtowGNRARC77fe3 KmrHOyKfnfbtWAKjCTL5x3tJ7XYdJsUs2fwtAnJrPvt9kTDeAmCbrDFaeHuwddIIFQMaTP+NV M2E6WW6D5ynw6NgH/I9XzMLYORCpK/nvkjlOhS3/MUnpGtuH6VNCNqpjL0kzsg3/Dk7oP/pyt 8JQtngy0zVFRwpwwe6ouDzX9qo9R1iVyt1eOkQBaXtOV4kY2QuR8SrwbKkwiO2zrl+TBUyjQK ow20TKdBs5BHfXv4KennO0Jeu5XzHh/WCFPt0yOm26ieku93dirfDZF+7UiwxKjV+uf6dPzBz NgC28w4m0DES+9m+Ys5/S+NaGVpzN0wmJVh5p37WeaLlZJs41tTHPDCti1+ZlmbAMbXbFekEt 6qdZWK5ND6RJNwsbqoQAtfhHM7AKazKzrh3b1PSUd+IMLmExxZrDaqnGzNaLvYYiNVXPzLlZJ liYbFQe6dloauHC3s3gkRxmV+RFGROHB35gZU6l2cozodoeJt6ZGF1Bw7RpdD2oYw8wirUfj4 PldzOAN+TljoM1F+yqx+uaDCGzvHqAIl/ear4kY6Li9n8nrOJcP8SSJNxcEdks6YDslYUaHPR /Y33jqxc43uNw6vaMqU601f3kJx/UKs1VGO2tvJA258sXoA6Thn0viybjh9noA3feBQSxL51x OyylfokcXDrAFUNURkxbqejiSMdjV5G4kFuJIMAQ8arw6T/vNVqtDe+4G0FtdxMa/uT/YQ3QH 2KJCAmfphTJdStEq6VHAby1WkpuQOKe6Ua7xQd2vZSaq6Kp8jztcRST5m71BAPqHOVvQZ7CXY /n3iSPPp49VLKtKogElnKejceu++c7Y4rm7G93QKwLOCg1x84At58XjATExl2THL+heuWqNP+ 8slDUASv0TVnc/sgPnEV6BvQFz4c9wklUBhEWfq+rC4K+bsT4eY0GrHq6D5gqkS8UUBIrGKiR BF+wvlSOpYj9s4YxI6J10m8TvmadD2ilzdAD9hd+RHnmDMvPqUWs7MgQIWkT7bM1mhD8RGfXm bmACKtQ3sc6qXrgv/Py+6hD9ZYW813s7M8UNgOhgwa3cBw2ZS1M6W3EylgxDtVyOYrOHZh8zF JzbzZj3rWSZ0Rk4IV List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: base CMS YAML over SOAP framework lifecycle frontend Subject: [9front] upas/fs: copy messages between IMAP folders Reply-To: 9front@9front.org Precedence: bulk Dear 9front community, it is currently not possible to copy messages between IMAP folders in any way using upas, if I understand correctly. upas/fs does not support putting messages to the mailbox directories in /mail/fs/. The need for this arises when someone wants to archive messages from inbox to another IMAP folder. The following patch attempts to implement the support for copying messages between IMAP folders in a similar way in which flagging and deleting messages are handled. The same functionality could be extended to other mailbox types too, although it seems that currently this is only useful with IMAP. I have been using this for half a year now without any problems. The alternative way to achieve the same result would be to make upas/fs support writing files to the /mail/fs/ folders. Then perhaps upas/mbappend could be used to write messages to these folders in the same way as it can currently be used to write messages to the /mail/box/ folders. However, the message numbering schemes are different between these two folder hierarchies, so there would have to be some special casing for that, which would complicate things. Implementing the feature that way would seem to be more challenging in other ways too, which is why I am presenting a simpler approach. Would this be useful for the broader audience? Thanks, rsal diff -r 7c895ae504fa sys/man/4/upasfs =2D-- a/sys/man/4/upasfs Fri May 28 13:02:58 2021 +0200 +++ b/sys/man/4/upasfs Fri May 28 16:40:56 2021 +0300 @@ -206,7 +206,7 @@ .I fs to open, close, rename, create or remove new mailboxes, and also to -delete or flag groups of messages atomically. +delete, flag, or copy groups of messages atomically. The messages that can be written to this file are: .TP 2i .PD 0 @@ -260,6 +260,13 @@ .TP .B "flag \fImboxname flags number ...\fP flag the given messages. +.TP +.B "copy \fImboxname number ... target\fP +Copy the given messages from +.IR mboxname +to mailbox named +.IR target. +At the moment only supported with IMAP mailboxes. .PD .PP The diff -r 7c895ae504fa sys/src/cmd/upas/fs/dat.h =2D-- a/sys/src/cmd/upas/fs/dat.h Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/dat.h Fri May 28 16:40:56 2021 +0300 @@ -174,6 +174,7 @@ void (*decache)(Mailbox*, Message*); int (*fetch)(Mailbox*, Message*, uvlong, ulong); void (*delete)(Mailbox*, Message*); + char *(*copy)(Mailbox*, Message*, char*); char *(*ctl)(Mailbox*, int, char**); char *(*remove)(Mailbox *, int); char *(*rename)(Mailbox*, char*, int); @@ -215,6 +216,7 @@ void unnewmessage(Mailbox*, Message*, Message*); char* delmessages(int, char**); char *flagmessages(int, char**); +char* copymessages(int, char**); void digestmessage(Mailbox*, Message*); int wraptls(int, char*); diff -r 7c895ae504fa sys/src/cmd/upas/fs/fs.c =2D-- a/sys/src/cmd/upas/fs/fs.c Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/fs.c Fri May 28 16:40:56 2021 +0300 @@ -1242,6 +1242,11 @@ return nil; return flagmessages(argc - 1, argv + 1); } + if(strcmp(argv[0], "copy") =3D=3D 0){ + if(argc < 4) + return nil; + return copymessages(argc - 1, argv + 1); + } if(strcmp(argv[0], "remove") =3D=3D 0){ v0 =3D argv0; flags =3D 0; diff -r 7c895ae504fa sys/src/cmd/upas/fs/imap.c =2D-- a/sys/src/cmd/upas/fs/imap.c Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/imap.c Fri May 28 16:40:56 2021 +0300 @@ -1025,6 +1025,22 @@ } static char* +imap4copy(Mailbox *mb, Message *m, char *dest) +{ + char *r; + Imap *imap; + + imap =3D mb->aux; + if((ulong)(m->imapuid>>32) =3D=3D imap->validity){ + imap4cmd(imap, "uid copy %lud %s", (ulong)m->imapuid, dest); + r =3D imap4resp(imap); + if(!isokay(r)) + return r; + } + return 0; +} + +static char* imap4sync(Mailbox *mb) { char *err; @@ -1183,6 +1199,7 @@ mb->delete =3D imap4delete; mb->rename =3D imap4rename; mb->modflags =3D imap4modflags; + mb->copy =3D imap4copy; mb->addfrom =3D 1; return nil; } diff -r 7c895ae504fa sys/src/cmd/upas/fs/mbox.c =2D-- a/sys/src/cmd/upas/fs/mbox.c Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/mbox.c Fri May 28 16:40:56 2021 +0300 @@ -1137,6 +1137,31 @@ return rerr; } +char* +copymessages(int argc, char **argv) +{ + char *err, *dest, *rerr; + int i; + Mailbox *mb; + Message *m; + + rerr =3D 0; + for(mb =3D mbl; mb !=3D nil; mb =3D mb->next) + if(strcmp(*argv, mb->name) =3D=3D 0) + break; + if(mb =3D=3D nil) + return "no such mailbox"; + if(mb->copy =3D=3D nil) + return "copy not supported"; + dest =3D argv[argc - 1]; + for(i =3D 1; i < argc - 1; i++) + for(m =3D mb->root->part; m; m =3D m->next) + if(strcmp(m->name, argv[i]) =3D=3D 0) + if(err =3D mb->copy(mb, m, dest)) + rerr =3D err; + return rerr; +} + void msgincref(Mailbox *mb, Message *m) { diff -r 7c895ae504fa sys/src/cmd/upas/fs/mdir.c =2D-- a/sys/src/cmd/upas/fs/mdir.c Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/mdir.c Fri May 28 16:40:56 2021 +0300 @@ -294,5 +294,6 @@ mb->idxread =3D idxr; mb->idxwrite =3D idxw; mb->ctl =3D mdirctl; + mb->copy =3D nil; return nil; } diff -r 7c895ae504fa sys/src/cmd/upas/fs/plan9.c =2D-- a/sys/src/cmd/upas/fs/plan9.c Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/plan9.c Fri May 28 16:40:56 2021 +0300 @@ -411,5 +411,6 @@ mb->remove =3D localremove; mb->rename =3D localrename; mb->decache =3D plan9decache; + mb->copy =3D nil; return nil; } diff -r 7c895ae504fa sys/src/cmd/upas/fs/pop3.c =2D-- a/sys/src/cmd/upas/fs/pop3.c Fri May 28 13:02:58 2021 +0200 +++ b/sys/src/cmd/upas/fs/pop3.c Fri May 28 16:40:56 2021 +0300 @@ -624,6 +624,7 @@ mb->sync =3D pop3sync; mb->close =3D pop3close; mb->ctl =3D pop3ctl; + mb->copy =3D nil; mb->addfrom =3D 1; return nil; }