]> git.ipfire.org Git - people/ms/dma.git/blobdiff - util.c
Merge pull request #12 from emaste/master
[people/ms/dma.git] / util.c
diff --git a/util.c b/util.c
index e25cdb5653c5855281f4a1a053ca390375824855..a139b20d383166db75fd48f722f506509942f96f 100644 (file)
--- a/util.c
+++ b/util.c
@@ -35,6 +35,7 @@
 #include <sys/param.h>
 #include <sys/file.h>
 
+#include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <netdb.h>
 const char *
 hostname(void)
 {
-       static char name[MAXHOSTNAMELEN+1];
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX  255
+#endif
+       static char name[HOST_NAME_MAX+1];
        static int initialized = 0;
-       FILE *fp;
-       char *res;
-       size_t len;
+       char *s;
 
        if (initialized)
                return (name);
 
-       if (config.mailname != NULL && config.mailname[0] != '\0') {
+       if (config.mailname == NULL || !*config.mailname)
+               goto local;
+
+       if (config.mailname[0] == '/') {
+               /*
+                * If the mailname looks like an absolute path,
+                * treat it as a file.
+                */
+               FILE *fp;
+
+               fp = fopen(config.mailname, "r");
+               if (fp == NULL)
+                       goto local;
+
+               s = fgets(name, sizeof(name), fp);
+               fclose(fp);
+               if (s == NULL)
+                       goto local;
+
+               for (s = name; *s != 0 && (isalnum(*s) || strchr("_.-", *s)); ++s)
+                       /* NOTHING */;
+               *s = 0;
+
+               if (!*name)
+                       goto local;
+
+               initialized = 1;
+               return (name);
+       } else {
                snprintf(name, sizeof(name), "%s", config.mailname);
                initialized = 1;
                return (name);
        }
-       if (config.mailnamefile != NULL && config.mailnamefile[0] != '\0') {
-               fp = fopen(config.mailnamefile, "r");
-               if (fp != NULL) {
-                       res = fgets(name, sizeof(name), fp);
-                       fclose(fp);
-                       if (res != NULL) {
-                               len = strlen(name);
-                               while (len > 0 &&
-                                   (name[len - 1] == '\r' ||
-                                    name[len - 1] == '\n'))
-                                       name[--len] = '\0';
-                               if (name[0] != '\0') {
-                                       initialized = 1;
-                                       return (name);
-                               }
-                       }
-               }
-       }
+
+local:
        if (gethostname(name, sizeof(name)) != 0)
-               strcpy(name, "(unknown hostname)");
+               *name = 0;
+       /*
+        * gethostname() is allowed to truncate name without NUL-termination
+        * and at the same time not return an error.
+        */
+       name[sizeof(name) - 1] = 0;
+
+       for (s = name; *s != 0 && (isalnum(*s) || strchr("_.-", *s)); ++s)
+               /* NOTHING */;
+       *s = 0;
+
+       if (!*name)
+               snprintf(name, sizeof(name), "unknown-hostname");
+
        initialized = 1;
-       return name;
+       return (name);
 }
 
 void
 setlogident(const char *fmt, ...)
 {
-       char *tag = NULL;
+       static char tag[50];
 
+       snprintf(tag, sizeof(tag), "%s", logident_base);
        if (fmt != NULL) {
                va_list ap;
-               char *sufx;
+               char sufx[50];
 
                va_start(ap, fmt);
-               if (vasprintf(&sufx, fmt, ap) != -1 && sufx != NULL) {
-                       if (asprintf(&tag, "%s[%s]", logident_base, sufx) == -1)
-                               tag = NULL;
-                       free(sufx);
-               }
+               vsnprintf(sufx, sizeof(sufx), fmt, ap);
                va_end(ap);
+               snprintf(tag, sizeof(tag), "%s[%s]", logident_base, sufx);
        }
        closelog();
-       openlog(tag != NULL ? tag : logident_base, 0, LOG_MAIL);
+       openlog(tag, 0, LOG_MAIL);
 }
 
 void
@@ -114,16 +139,17 @@ errlog(int exitcode, const char *fmt, ...)
 {
        int oerrno = errno;
        va_list ap;
-       char *outs = NULL;
+       char outs[ERRMSG_SIZE];
 
+       outs[0] = 0;
        if (fmt != NULL) {
                va_start(ap, fmt);
-               if (vasprintf(&outs, fmt, ap) == -1)
-                       outs = NULL;
+               vsnprintf(outs, sizeof(outs), fmt, ap);
                va_end(ap);
        }
 
-       if (outs != NULL) {
+       errno = oerrno;
+       if (*outs != 0) {
                syslog(LOG_ERR, "%s: %m", outs);
                fprintf(stderr, "%s: %s: %s\n", getprogname(), outs, strerror(oerrno));
        } else {
@@ -138,16 +164,16 @@ void
 errlogx(int exitcode, const char *fmt, ...)
 {
        va_list ap;
-       char *outs = NULL;
+       char outs[ERRMSG_SIZE];
 
+       outs[0] = 0;
        if (fmt != NULL) {
                va_start(ap, fmt);
-               if (vasprintf(&outs, fmt, ap) == -1)
-                       outs = NULL;
+               vsnprintf(outs, sizeof(outs), fmt, ap);
                va_end(ap);
        }
 
-       if (outs != NULL) {
+       if (*outs != 0) {
                syslog(LOG_ERR, "%s", outs);
                fprintf(stderr, "%s: %s\n", getprogname(), outs);
        } else {
@@ -158,49 +184,38 @@ errlogx(int exitcode, const char *fmt, ...)
        exit(exitcode);
 }
 
-static const char *
+static int
 check_username(const char *name, uid_t ckuid)
 {
        struct passwd *pwd;
 
        if (name == NULL)
-               return (NULL);
+               return (0);
        pwd = getpwnam(name);
        if (pwd == NULL || pwd->pw_uid != ckuid)
-               return (NULL);
-       return (name);
+               return (0);
+       snprintf(username, sizeof(username), "%s", name);
+       return (1);
 }
 
 void
 set_username(void)
 {
        struct passwd *pwd;
-       char *u = NULL;
-       uid_t uid;
 
-       uid = getuid();
-       username = check_username(getlogin(), uid);
-       if (username != NULL)
+       useruid = getuid();
+       if (check_username(getlogin(), useruid))
                return;
-       username = check_username(getenv("LOGNAME"), uid);
-       if (username != NULL)
+       if (check_username(getenv("LOGNAME"), useruid))
                return;
-       username = check_username(getenv("USER"), uid);
-       if (username != NULL)
+       if (check_username(getenv("USER"), useruid))
                return;
-       pwd = getpwuid(uid);
-       if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0] != '\0' &&
-           (u = strdup(pwd->pw_name)) != NULL) {
-               username = check_username(u, uid);
-               if (username != NULL)
+       pwd = getpwuid(useruid);
+       if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0] != '\0') {
+               if (check_username(pwd->pw_name, useruid))
                        return;
-               else
-                       free(u);
        }
-       if (asprintf(__DECONST(void *, &username), "%ld", (long)uid) != -1 &&
-           username != NULL)
-               return;
-       username = "unknown-or-invalid-username";
+       snprintf(username, sizeof(username), "uid=%ld", (long)useruid);
 }
 
 void