]> git.armaanb.net Git - opendoas.git/blobdiff - doas.c
Break out make functionality into utility makefile.
[opendoas.git] / doas.c
diff --git a/doas.c b/doas.c
index a4d79841651513f5957f9a24418e4f0af088aa07..6fabd7bf1b9887dbf65f1d60f1f8cd906623b455 100644 (file)
--- a/doas.c
+++ b/doas.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: doas.c,v 1.29 2015/07/28 14:08:52 zhuk Exp $ */
+/* $OpenBSD: doas.c,v 1.32 2015/07/29 00:00:31 tedu Exp $ */
 /*
  * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
  *
@@ -19,8 +19,6 @@
 #include <sys/stat.h>
 
 #include <limits.h>
-#include <login_cap.h>
-#include <bsd_auth.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -31,6 +29,8 @@
 #include <syslog.h>
 #include <errno.h>
 
+#include "openbsd.h"
+
 #include "doas.h"
 
 static void __dead
@@ -45,9 +45,11 @@ arraylen(const char **arr)
 {
        size_t cnt = 0;
 
-       while (*arr) {
-               cnt++;
-               arr++;
+       if (arr) {
+               while (*arr) {
+                       cnt++;
+                       arr++;
+               }
        }
        return cnt;
 }
@@ -80,19 +82,20 @@ uidcheck(const char *s, uid_t desired)
        return 0;
 }
 
-static gid_t
-strtogid(const char *s)
+static int
+parsegid(const char *s, gid_t *gid)
 {
        struct group *gr;
        const char *errstr;
-       gid_t gid;
 
-       if ((gr = getgrnam(s)) != NULL)
-               return gr->gr_gid;
-       gid = strtonum(s, 0, GID_MAX, &errstr);
+       if ((gr = getgrnam(s)) != NULL) {
+               *gid = gr->gr_gid;
+               return 0;
+       }
+       *gid = strtonum(s, 0, GID_MAX, &errstr);
        if (errstr)
                return -1;
-       return gid;
+       return 0;
 }
 
 static int
@@ -102,8 +105,8 @@ match(uid_t uid, gid_t *groups, int ngroups, uid_t target, const char *cmd,
        int i;
 
        if (r->ident[0] == ':') {
-               gid_t rgid = strtogid(r->ident + 1);
-               if (rgid == -1)
+               gid_t rgid;
+               if (parsegid(r->ident + 1, &rgid) == -1)
                        return 0;
                for (i = 0; i < ngroups; i++) {
                        if (rgid == groups[i])
@@ -143,7 +146,8 @@ permit(uid_t uid, gid_t *groups, int ngroups, struct rule **lastr,
 
        *lastr = NULL;
        for (i = 0; i < nrules; i++) {
-               if (match(uid, groups, ngroups, target, cmd, cmdargs, rules[i]))
+               if (match(uid, groups, ngroups, target, cmd,
+                   cmdargs, rules[i]))
                        *lastr = rules[i];
        }
        if (!*lastr)
@@ -160,10 +164,7 @@ parseconfig(const char *filename, int checkperms)
 
        yyfp = fopen(filename, "r");
        if (!yyfp) {
-               if (checkperms)
-                       fprintf(stderr, "doas is not enabled.\n");
-               else
-                       warn("could not open config file");
+               warn("could not open config file");
                exit(1);
        }
 
@@ -183,14 +184,13 @@ parseconfig(const char *filename, int checkperms)
 }
 
 /*
- * Copy to envp environment variables from oldenvp which names are
- * in safeset.
+ * Copy the environment variables in safeset from oldenvp to envp.
  */
 static int
-copyenvhelper(const char **oldenvp, const char **safeset, int nsafe,
+copyenvhelper(const char **oldenvp, const char **safeset, size_t nsafe,
     char **envp, int ei)
 {
-       int i;
+       size_t i;
 
        for (i = 0; i < nsafe; i++) {
                const char **oe = oldenvp;
@@ -223,8 +223,8 @@ copyenv(const char **oldenvp, struct rule *rule)
        char **envp;
        const char **extra;
        int ei;
-       int nsafe, nbad;
-       int nextras = 0;
+       size_t nsafe, nbad;
+       size_t nextras = 0;
 
        /* if there was no envvar whitelist, pass all except badset ones */
        nbad = arraylen(badset);