upas/send: use openfolder() to deliver mail to avoid code duplication
This commit is contained in:
parent
fd78f6722e
commit
a208a93733
1 changed files with 8 additions and 91 deletions
|
@ -1,88 +1,14 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "send.h"
|
#include "send.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* warning will robinson
|
|
||||||
*
|
|
||||||
* mbox and mdir should likely be merged with ../common/folder.c
|
|
||||||
* at a minimum, changes need to done in sync.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
mbox(dest *dp, message *mp, char *s)
|
|
||||||
{
|
|
||||||
char *tmp;
|
|
||||||
int i, n, e;
|
|
||||||
Biobuf *b;
|
|
||||||
Mlock *l;
|
|
||||||
|
|
||||||
for(i = 0;; i++){
|
|
||||||
l = syslock(s);
|
|
||||||
if(l == 0)
|
|
||||||
return refuse(dp, mp, "can't lock mail file", 0, 0);
|
|
||||||
b = sysopen(s, "al", Mboxmode);
|
|
||||||
if(b)
|
|
||||||
break;
|
|
||||||
b = sysopen(tmp = smprint("%s.tmp", s), "al", Mboxmode);
|
|
||||||
free(tmp);
|
|
||||||
sysunlock(l);
|
|
||||||
if(b){
|
|
||||||
syslog(0, "mail", "error: used %s.tmp", s);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(i >= 5)
|
|
||||||
return refuse(dp, mp, "mail file cannot be opened", 0, 0);
|
|
||||||
sleep(1000);
|
|
||||||
}
|
|
||||||
e = 0;
|
|
||||||
n = m_print(mp, b, 0, 1);
|
|
||||||
if(n == -1 || Bprint(b, "\n") == -1 || Bflush(b) == -1)
|
|
||||||
e = 1;
|
|
||||||
sysclose(b);
|
|
||||||
sysunlock(l);
|
|
||||||
if(e)
|
|
||||||
return refuse(dp, mp, "error writing mail file", 0, 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
mdir(dest *dp, message *mp, char *s)
|
|
||||||
{
|
|
||||||
char buf[100];
|
|
||||||
int fd, i, n, e;
|
|
||||||
ulong t;
|
|
||||||
Biobuf b;
|
|
||||||
|
|
||||||
t = time(0);
|
|
||||||
for(i = 0; i < 100; i++){
|
|
||||||
snprint(buf, sizeof buf, "%s/%lud.%.2d", s, t, i);
|
|
||||||
if((fd = create(buf, OWRITE|OEXCL, DMAPPEND|0660)) != -1)
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
return refuse(dp, mp, "mdir file cannot be opened", 0, 0);
|
|
||||||
found:
|
|
||||||
e = 0;
|
|
||||||
Binit(&b, fd, OWRITE);
|
|
||||||
n = m_print(mp, &b, 0, 1);
|
|
||||||
if(n == -1 || Bprint(&b, "\n") == -1 || Bflush(&b) == -1)
|
|
||||||
e = 1;
|
|
||||||
Bterm(&b);
|
|
||||||
close(fd);
|
|
||||||
if(e){
|
|
||||||
remove(buf);
|
|
||||||
return refuse(dp, mp, "error writing mail file", 0, 0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dispose of local addresses */
|
/* dispose of local addresses */
|
||||||
int
|
int
|
||||||
cat_mail(dest *dp, message *mp)
|
cat_mail(dest *dp, message *mp)
|
||||||
{
|
{
|
||||||
char *rcvr, *cp, *s;
|
char *rcvr, *cp, *s;
|
||||||
int e, isdir;
|
|
||||||
Dir *d;
|
|
||||||
String *ss;
|
String *ss;
|
||||||
|
Biobuf *b;
|
||||||
|
int e;
|
||||||
|
|
||||||
ss = unescapespecial(s_clone(dp->repl1));
|
ss = unescapespecial(s_clone(dp->repl1));
|
||||||
s = s_to_c(ss);
|
s = s_to_c(ss);
|
||||||
|
@ -99,23 +25,14 @@ cat_mail(dest *dp, message *mp)
|
||||||
s_free(ss);
|
s_free(ss);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
if(d = dirstat(s)){
|
b = openfolder(s, time(0));
|
||||||
isdir = d->mode&DMDIR;
|
|
||||||
free(d);
|
|
||||||
}else{
|
|
||||||
isdir = create(s, OREAD, DMDIR|0777);
|
|
||||||
if(isdir == -1)
|
|
||||||
return refuse(dp, mp, "mdir cannot be created", 0, 0);
|
|
||||||
close(isdir);
|
|
||||||
isdir = 1;
|
|
||||||
}
|
|
||||||
if(isdir)
|
|
||||||
e = mdir(dp, mp, s);
|
|
||||||
else
|
|
||||||
e = mbox(dp, mp, s);
|
|
||||||
s_free(ss);
|
s_free(ss);
|
||||||
|
if(b == nil)
|
||||||
|
return refuse(dp, mp, "mail file cannot be created", 0, 0);
|
||||||
|
e = m_print(mp, b, 0, 1) == -1 || Bprint(b, "\n") == -1;
|
||||||
|
e |= closefolder(b);
|
||||||
if(e != 0)
|
if(e != 0)
|
||||||
return e;
|
return refuse(dp, mp, "error writing mail file", 0, 0);
|
||||||
rcvr = s_to_c(dp->addr);
|
rcvr = s_to_c(dp->addr);
|
||||||
if(cp = strrchr(rcvr, '!'))
|
if(cp = strrchr(rcvr, '!'))
|
||||||
rcvr = cp+1;
|
rcvr = cp+1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue