X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=umpf.c;h=663294f752b1d21aa4c193bef4737238068c925f;hb=4a7b9ef7cccc634e5078ed7540a83cc99ea05bae;hp=e01aca26a1d1a042d342e466c9513ba5984f0be0;hpb=d354d049c4067efb4611a3d466e447bb2aceb85b;p=umpf.git diff --git a/umpf.c b/umpf.c index e01aca2..663294f 100644 --- a/umpf.c +++ b/umpf.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "umpf.h" @@ -19,6 +21,75 @@ init(void) empty = ""; } +char* buf; +int buflen; +char tmpbuf[BUFSIZE]; +int tmpbufpos; +int tmpread; + +char* +read_line(int fd) +{ + if (! buflen) + buf = xmalloc(BUFSIZE); + char* p = buf; + do { + if (tmpbufpos >= tmpread) { + tmpread = read(fd, tmpbuf, BUFSIZE); + tmpbufpos = 0; + } + if (!tmpread) + return NULL; + if (p >= (buf + buflen - 1)) + buf = xrealloc(buf, buflen *= 2); + *p++ = tmpbuf[tmpbufpos++]; + } while (*p != '\n'); + *++p = 0; + + return buf; +} + +char* +get_home_from_passwd(void) +{ + struct passwd* pas; + pas = getpwuid(getuid()); + if (! pas) + die("Cannot get uid, please specify config file path"); + + char* login = pas->pw_name; + int len = strlen(pas->pw_name); + char* buf; + char* p, *q; + int r, i; + + int fd; + fd = open("/etc/passwd", O_RDONLY); + if (fd < 0) + die("Cannot open /etc/passwd, please specify config file path"); + + do { + buf = read_line(fd); + r = strncmp(buf, login, len); + if (!r) + break; + } while (buf); + if (!r) + die("Cannot find your login %s in /etc/passwd, please specify config file path", login); + p = buf; + for (i = 0; i < 5; i++) { + p = strchr(p, ':'); + if (! p) + die("Cannot parse /etc/passwd, please specify config file path"); + } + q = p + 1; + while (*q && *q != '\n' && *q != ':') + q++; + *q = 0; + + return xstrdup(p + 1); +} + int main(int argc, char** argv) { @@ -42,6 +113,8 @@ main(int argc, char** argv) struct passwd* p; p = getpwuid(getuid()); + if (! p) + die("Cannot get uid, please specify default mailbox"); default_mailbox = cat("/var/mail/", p->pw_name); } @@ -57,6 +130,8 @@ main(int argc, char** argv) char* home; home = getenv("HOME"); + if (! home) + home = get_home_from_passwd(); if (! home) goto skip_conf; @@ -73,9 +148,10 @@ main(int argc, char** argv) compile(input_tree, NULL); skip_conf: - var_tab = xmalloc((max_varcode + 1) * sizeof(char*)); + var_tab = xmalloc((max_varcode + 1) * sizeof(struct vartab)); for (i = 0; i <= max_varcode; i++) { - var_tab[i] = empty; + var_tab[i].value = empty; + var_tab[i].modif = 0; } current_headers = make_hlist(0);