]> 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 5918a0db7dfdc5aaddb5c32222bf94d88362d254..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;