]> mj.ucw.cz Git - umpf.git/blobdiff - umpf.c
umpf.1 done
[umpf.git] / umpf.c
diff --git a/umpf.c b/umpf.c
index e01aca26a1d1a042d342e466c9513ba5984f0be0..663294f752b1d21aa4c193bef4737238068c925f 100644 (file)
--- a/umpf.c
+++ b/umpf.c
@@ -3,6 +3,8 @@
 #include <string.h>
 #include <pwd.h>
 #include <getopt.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 #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);