#include "imap4d.h"
static int
openpipe(int *pip, char *cmd, char *av[])
{
int pid, fd[2];
if(pipe(fd) != 0)
sysfatal("pipe: %r");
pid = fork();
switch(pid){
case -1:
return -1;
case 0:
close(1);
dup(fd[1], 1);
if(fd[1] != 1)
close(fd[1]);
if(fd[0] != 0)
close(fd[0]);
exec(cmd, av);
ilog("exec: %r");
_exits("b0rked");
return -1;
default:
*pip = fd[0];
close(fd[1]);
return pid;
}
}
static int
closepipe(int pid, int fd)
{
int nz, wpid;
Waitmsg *w;
close(fd);
while(w = wait()){
nz = !w->msg || !w->msg[0];
wpid = w->pid;
free(w);
if(wpid == pid)
return nz? 0: -1;
}
return -1;
}
static char dupath[Pathlen];
static char *duav[] = { "du", "-s", dupath, 0};
vlong
getquota(void)
{
char buf[Pathlen + 128], *f[3];
int fd, pid;
werrstr("");
memset(buf, 0, sizeof buf);
snprint(dupath, sizeof dupath, "%s", mboxdir);
pid = openpipe(&fd, "/bin/du", duav);
if(pid == -1)
return -1;
if(read(fd, buf, sizeof buf) < 4){
closepipe(pid, fd);
return -1;
}
if(closepipe(pid, fd) == -1)
return -1;
if(getfields(buf, f, 2, 1, "\t") != 2)
return -1;
return strtoull(f[0], 0, 0);
}
|