]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/acl/uuid.c
Merge remote branch 'netafp/master' into branch-allea
[netatalk.git] / libatalk / acl / uuid.c
index 397d3b8483be09a318dd344c68a812690f27d34f..6df8d62b8b9ab0aae0c37adde0d150415a9d198f 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <pwd.h>
 #include <grp.h>
+#include <arpa/inet.h>
 
 #include <atalk/logger.h>
 #include <atalk/afp.h>
@@ -33,7 +34,7 @@
 #include "aclldap.h"
 #include "cache.h"
 
-char *uuidtype[] = {"USER", "GROUP", "LOCAL"};
+char *uuidtype[] = {"", "USER", "GROUP", "LOCAL"};
 
 /********************************************************
  * Public helper function
@@ -71,7 +72,7 @@ void localuuid_from_id(unsigned char *buf, uuidtype_t type, unsigned int id)
  * convert ascii string that can include dashes to binary uuid.
  * caller must provide a buffer.
  */
-void uuid_string2bin( const char *uuidstring, uuidp_t uuid) {
+void uuid_string2bin( const char *uuidstring, unsigned char *uuid) {
     int nibble = 1;
     int i = 0;
     unsigned char c, val = 0;
@@ -105,7 +106,7 @@ void uuid_string2bin( const char *uuidstring, uuidp_t uuid) {
  *
  * Returns pointer to static buffer.
  */
-const char *uuid_bin2string(unsigned char *uuid) {
+const char *uuid_bin2string(const unsigned char *uuid) {
     static char uuidstring[UUID_STRINGSIZE + 1];
 
     int i = 0;
@@ -133,7 +134,7 @@ const char *uuid_bin2string(unsigned char *uuid) {
  *   uuid: pointer to uuid_t storage that the caller must provide
  * returns 0 on success !=0 on errror
  */
-int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) {
+int getuuidfromname( const char *name, uuidtype_t type, unsigned char *uuid) {
     int ret = 0;
     uuidtype_t mytype = type;
     char nulluuid[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
@@ -158,7 +159,7 @@ int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) {
 #ifdef HAVE_LDAP
         if ((ret = ldap_getuuidfromname( name, type, &uuid_string)) == 0) {
             uuid_string2bin( uuid_string, uuid);
-            LOG(log_debug, logtype_afpd, "getuuidfromname{local}: name: %s, type: %s -> UUID: %s",
+            LOG(log_debug, logtype_afpd, "getuuidfromname{LDAP}: name: %s, type: %s -> UUID: %s",
                 name, uuidtype[type & UUIDTYPESTR_MASK], uuid_bin2string(uuid));
         } else {
             LOG(log_debug, logtype_afpd, "getuuidfromname(\"%s\",t:%u): no result from ldap search",
@@ -215,7 +216,7 @@ cleanup:
  * Caller must free name appropiately.
  */
 int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) {
-    int ret = 0;
+    int ret;
     uid_t uid;
     gid_t gid;
     struct passwd *pwd;
@@ -242,40 +243,44 @@ int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) {
         uid = ntohl(*(uint32_t *)(uuidp + 12));
         if ((pwd = getpwuid(uid)) == NULL) {
             /* not found, add negative entry to cache */
-            *type |= UUID_ENOENT;
-            *name = "UUID_ENOENT";
+            add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0);
+            ret = -1;
+        } else {
+            *name = strdup(pwd->pw_name);
             add_cachebyuuid(uuidp, *name, *type, 0);
-            return -1;
+            ret = 0;
         }
-        *name = pwd->pw_name;
-        add_cachebyuuid(uuidp, *name, *type, 0);
-        return 0;
+        LOG(log_debug, logtype_afpd,
+            "getnamefromuuid{local}: UUID: %s -> name: %s, type:%s",
+            uuid_bin2string(uuidp), *name, uuidtype[(*type) & UUIDTYPESTR_MASK]);
+        return ret;
     } else if (memcmp(uuidp, local_group_uuid, 12) == 0) {
         *type = UUID_GROUP;
         gid = ntohl(*(uint32_t *)(uuidp + 12));
         if ((grp = getgrgid(gid)) == NULL) {
             /* not found, add negative entry to cache */
-            *type |= UUID_ENOENT;
-            *name = "UUID_ENOENT";
+            add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0);
+            ret = -1;
+        } else {
+            *name = strdup(grp->gr_name);
             add_cachebyuuid(uuidp, *name, *type, 0);
-            return -1;
+            ret = 0;
         }
-        *name = grp->gr_name;
-        add_cachebyuuid(uuidp, *name, *type, 0);
-        return 0;
+        return ret;
     }
 
 #ifdef HAVE_LDAP
     ret = ldap_getnamefromuuid(uuid_bin2string(uuidp), name, type);
+#else
+    ret = -1;
+#endif
+
     if (ret != 0) {
-        LOG(log_warning, logtype_afpd, "getnamefromuuid(%s): no result from ldap_getnamefromuuid",
+        LOG(log_debug, logtype_afpd, "getnamefromuuid(%s): not found",
             uuid_bin2string(uuidp));
-        *type |= UUID_ENOENT;
-        *name = "UUID_ENOENT";
-        add_cachebyuuid(uuidp, *name, *type, 0);
+        add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0);
         return -1;
     }
-#endif
 
     add_cachebyuuid(uuidp, *name, *type, 0);