Imported Upstream version 1.8.4p4
[debian/sudo] / plugins / sudoers / alias.c
index 274b446e1a19efe0d086042ff09ddc1fe32abc46..aaba72881d809c065f43866f7e7a09e33dc8759f 100644 (file)
@@ -39,6 +39,7 @@
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif /* HAVE_UNISTD_H */
+#include <errno.h>
 
 #include "sudoers.h"
 #include "parse.h"
@@ -61,6 +62,7 @@ alias_compare(const void *v1, const void *v2)
     const struct alias *a1 = (const struct alias *)v1;
     const struct alias *a2 = (const struct alias *)v2;
     int res;
+    debug_decl(alias_compare, SUDO_DEBUG_ALIAS)
 
     if (v1 == NULL)
        res = -1;
@@ -68,7 +70,7 @@ alias_compare(const void *v1, const void *v2)
        res = 1;
     else if ((res = strcmp(a1->name, a2->name)) == 0)
        res = a1->type - a2->type;
-    return res;
+    debug_return_int(res);
 }
 
 /*
@@ -81,21 +83,26 @@ alias_find(char *name, int type)
     struct alias key;
     struct rbnode *node;
     struct alias *a = NULL;
+    debug_decl(alias_find, SUDO_DEBUG_ALIAS)
 
     key.name = name;
     key.type = type;
     if ((node = rbfind(aliases, &key)) != NULL) {
-           /*
-            * Compare the global sequence number with the one stored
-            * in the alias.  If they match then we've seen this alias
-            * before and found a loop.
-            */
-           a = node->data;
-           if (a->seqno == alias_seqno)
-               return NULL;
-           a->seqno = alias_seqno;
+       /*
+        * Compare the global sequence number with the one stored
+        * in the alias.  If they match then we've seen this alias
+        * before and found a loop.
+        */
+       a = node->data;
+       if (a->seqno == alias_seqno) {
+           errno = ELOOP;
+           debug_return_ptr(NULL);
+       }
+       a->seqno = alias_seqno;
+    } else {
+       errno = ENOENT;
     }
-    return a;
+    debug_return_ptr(a);
 }
 
 /*
@@ -107,6 +114,7 @@ alias_add(char *name, int type, struct member *members)
 {
     static char errbuf[512];
     struct alias *a;
+    debug_decl(alias_add, SUDO_DEBUG_ALIAS)
 
     a = emalloc(sizeof(*a));
     a->name = name;
@@ -114,11 +122,11 @@ alias_add(char *name, int type, struct member *members)
     a->seqno = 0;
     list2tq(&a->members, members);
     if (rbinsert(aliases, a)) {
-       snprintf(errbuf, sizeof(errbuf), "Alias `%s' already defined", name);
+       snprintf(errbuf, sizeof(errbuf), _("Alias `%s' already defined"), name);
        alias_free(a);
-       return errbuf;
+       debug_return_str(errbuf);
     }
-    return NULL;
+    debug_return_str(NULL);
 }
 
 /*
@@ -127,16 +135,21 @@ alias_add(char *name, int type, struct member *members)
 void
 alias_apply(int (*func)(void *, void *), void *cookie)
 {
+    debug_decl(alias_apply, SUDO_DEBUG_ALIAS)
+
     rbapply(aliases, func, cookie, inorder);
+
+    debug_return;
 }
 
 /*
- * Returns TRUE if there are no aliases, else FALSE.
+ * Returns true if there are no aliases, else false.
  */
-int
+bool
 no_aliases(void)
 {
-    return rbisempty(aliases);
+    debug_decl(no_aliases, SUDO_DEBUG_ALIAS)
+    debug_return_bool(rbisempty(aliases));
 }
 
 /*
@@ -149,6 +162,7 @@ alias_free(void *v)
     struct member *m;
     struct sudo_command *c;
     void *next;
+    debug_decl(alias_free, SUDO_DEBUG_ALIAS)
 
     efree(a->name);
     for (m = a->members.first; m != NULL; m = next) {
@@ -162,6 +176,8 @@ alias_free(void *v)
        efree(m);
     }
     efree(a);
+
+    debug_return;
 }
 
 /*
@@ -172,18 +188,25 @@ alias_remove(char *name, int type)
 {
     struct rbnode *node;
     struct alias key;
+    debug_decl(alias_remove, SUDO_DEBUG_ALIAS)
 
     key.name = name;
     key.type = type;
-    if ((node = rbfind(aliases, &key)) == NULL)
+    if ((node = rbfind(aliases, &key)) == NULL) {
+       errno = ENOENT;
        return NULL;
-    return rbdelete(aliases, node);
+    }
+    debug_return_ptr(rbdelete(aliases, node));
 }
 
 void
 init_aliases(void)
 {
+    debug_decl(init_aliases, SUDO_DEBUG_ALIAS)
+
     if (aliases != NULL)
        rbdestroy(aliases, alias_free);
     aliases = rbcreate(alias_compare);
+
+    debug_return;
 }