]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Remove idcache.c
authorKern Sibbald <kern@sibbald.com>
Wed, 5 Sep 2007 11:13:57 +0000 (11:13 +0000)
committerKern Sibbald <kern@sibbald.com>
Wed, 5 Sep 2007 11:13:57 +0000 (11:13 +0000)
kes  Add guid_to_name.c/h which replace idcache.
kes  Remove enh_fnmatch.c.  Make code that references it use fnmatch.c

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@5460 91ce42f0-d328-0410-95d8-f526ca767f89

12 files changed:
bacula/src/dird/ua_tree.c
bacula/src/jcr.h
bacula/src/lib/Makefile.in
bacula/src/lib/attr.c
bacula/src/lib/guid_to_name.c [new file with mode: 0644]
bacula/src/lib/guid_to_name.h [new file with mode: 0644]
bacula/src/lib/idcache.c [deleted file]
bacula/src/lib/jcr.c
bacula/src/lib/lib.h
bacula/src/lib/protos.h
bacula/src/lib/uid_gid_name.c [deleted file]
bacula/technotes-2.3

index 576049f023f4c29891019c5d3a9cb4d496ecfab2..032c16476875cf822536746b57173d7924351e0f 100644 (file)
@@ -490,17 +490,11 @@ static int lsmarkcmd(UAContext *ua, TREE_CTX *tree)
    return 1;
 }
 
-
-
-extern char *getuser(uid_t uid, char *name, int len);
-extern char *getgroup(gid_t gid, char *name, int len);
-
 /*
  * This is actually the long form used for "dir"
  */
-static void ls_output(char *buf, const char *fname, const char *tag, 
+static void ls_output(guid_list *guid, char *buf, const char *fname, const char *tag, 
                       struct stat *statp, bool dot_cmd) 
-                    
 {
    char *p;
    const char *f;
@@ -514,8 +508,9 @@ static void ls_output(char *buf, const char *fname, const char *tag,
       *p++ = ',';
       n = sprintf(p, "%d,", (uint32_t)statp->st_nlink);
       p += n;
-      n = sprintf(p, "%s,%s,", getuser(statp->st_uid, en1, sizeof(en1)),
-                  getgroup(statp->st_gid, en2, sizeof(en2)));
+      n = sprintf(p, "%s,%s,", 
+                  guid->uid_to_name(statp->st_uid, en1, sizeof(en1)),
+                  guid->gid_to_name(statp->st_gid, en2, sizeof(en2)));
       p += n;
       n = sprintf(p, "%s,", edit_uint64(statp->st_size, ec1));
       p += n;
@@ -526,8 +521,9 @@ static void ls_output(char *buf, const char *fname, const char *tag,
    } else {
       n = sprintf(p, "  %2d ", (uint32_t)statp->st_nlink);
       p += n;
-      n = sprintf(p, "%-8.8s %-8.8s", getuser(statp->st_uid, en1, sizeof(en1)),
-                  getgroup(statp->st_gid, en2, sizeof(en2)));
+      n = sprintf(p, "%-8.8s %-8.8s", 
+                  guid->uid_to_name(statp->st_uid, en1, sizeof(en1)),
+                  guid->gid_to_name(statp->st_gid, en2, sizeof(en2)));
       p += n;
       n = sprintf(p, "%10.10s  ", edit_uint64(statp->st_size, ec1));
       p += n;
@@ -557,12 +553,14 @@ static int do_dircmd(UAContext *ua, TREE_CTX *tree, bool dot_cmd)
    struct stat statp;
    char buf[1100];
    char cwd[1100], *pcwd;
+   guid_list *guid;
 
    if (!tree_node_has_child(tree->node)) {
       ua->send_msg(_("Node %s has no children.\n"), tree->node->fname);
       return 1;
    }
 
+   guid = new_guid_list();
    foreach_child(node, tree->node) {
       const char *tag;
       if (ua->argc == 1 || fnmatch(ua->argk[1], node->fname, 0) == 0) {
@@ -600,10 +598,11 @@ static int do_dircmd(UAContext *ua, TREE_CTX *tree, bool dot_cmd)
             /* Something went wrong getting attributes -- print name */
             memset(&statp, 0, sizeof(statp));
          }
-         ls_output(buf, cwd, tag, &statp, dot_cmd);
+         ls_output(guid, buf, cwd, tag, &statp, dot_cmd);
          ua->send_msg("%s\n", buf);
       }
    }
+   free_guid_list(guid);
    return 1;
 }
 
index 89e2095cdbc2308cdf4e1c4413eee8f1bfe1c685..e54a97837a22a92c024200cc4e5a39e014b9040b 100644 (file)
@@ -188,6 +188,7 @@ public:
    B_DB *db;                          /* database pointer */
    B_DB *db_batch;                    /* database pointer for batch insert */
    ATTR_DBR *ar;                      /* DB attribute record */
+   guid_list *id_list;                /* User/group id to name list */
 
    /* Daemon specific part of JCR */
    /* This should be empty in the library */
index b9ca9acaa6ba840dd42127686c9030bc97ffb51f..c32085f46045bbdd69db204be21f3ac3cea6746a 100644 (file)
@@ -23,7 +23,7 @@ LIBSRCS = attr.c base64.c berrno.c bsys.c bget_msg.c \
          bnet.c bnet_server.c runscript.c \
          bsock.c bpipe.c bsnprintf.c btime.c \
          cram-md5.c crc32.c crypto.c daemon.c edit.c fnmatch.c \
-         hmac.c idcache.c jcr.c lex.c alist.c dlist.c \
+         guid_to_name.c hmac.c jcr.c lex.c alist.c dlist.c \
          md5.c message.c mem_pool.c openssl.c parse_conf.c \
          queue.c bregex.c \
          res.c rwlock.c scan.c serial.c sha1.c \
@@ -35,8 +35,8 @@ LIBSRCS = attr.c base64.c berrno.c bsys.c bget_msg.c \
 LIBOBJS = attr.o base64.o berrno.o bsys.o bget_msg.o \
          bnet.o bnet_server.o runscript.o \
          bsock.o bpipe.o bsnprintf.o btime.o \
-         cram-md5.o crc32.o crypto.o daemon.o edit.o enh_fnmatch.o fnmatch.o \
-         hmac.o idcache.o jcr.o lex.o alist.o dlist.o \
+         cram-md5.o crc32.o crypto.o daemon.o edit.o fnmatch.o \
+         guid_to_name.o hmac.o jcr.o lex.o alist.o dlist.o \
          md5.o message.o mem_pool.o openssl.o parse_conf.o \
          queue.o bregex.o \
          res.o rwlock.o scan.o serial.o sha1.o \
index d3f59bffb041b8ee24afca39f6c529a93a4e6752..cbe673f1cbda4c378f5526db7d86e53f76284865 100644 (file)
@@ -1,14 +1,7 @@
-/*
- *   attr.c  Unpack an Attribute record returned from the tape
- *
- *    Kern Sibbald, June MMIII  (code pulled from filed/restore.c and updated)
- *
- *   Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2003-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2003-2007 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *   attr.c  Unpack an Attribute record returned from the tape
+ *
+ *    Kern Sibbald, June MMIII  (code pulled from filed/restore.c and updated)
+ *
+ *   Version $Id$
+ */
+
 
 #include "bacula.h"
 #include "jcr.h"
@@ -237,11 +238,17 @@ void print_ls_output(JCR *jcr, ATTR *attr)
    char ec1[30];
    char en1[30], en2[30];
    char *p, *f;
+   guid_list *guid;
 
+   if (!jcr->id_list) {
+      jcr->id_list = new_guid_list();
+   }
+   guid = jcr->id_list;
    p = encode_mode(attr->statp.st_mode, buf);
    p += sprintf(p, "  %2d ", (uint32_t)attr->statp.st_nlink);
-   p += sprintf(p, "%-8.8s %-8.8s", getuser(attr->statp.st_uid, en1, sizeof(en1)),
-                getgroup(attr->statp.st_gid, en2, sizeof(en2)));
+   p += sprintf(p, "%-8.8s %-8.8s", 
+                guid->uid_to_name(attr->statp.st_uid, en1, sizeof(en1)),
+                guid->gid_to_name(attr->statp.st_gid, en2, sizeof(en2)));
    p += sprintf(p, "%10.10s ", edit_uint64(attr->statp.st_size, ec1));
    p = encode_time(attr->statp.st_ctime, p);
    *p++ = ' ';
diff --git a/bacula/src/lib/guid_to_name.c b/bacula/src/lib/guid_to_name.c
new file mode 100644 (file)
index 0000000..f5415f3
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+   Bacula® - The Network Backup Solution
+
+   Copyright (C) 2007 Kern Sibbald
+
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation, which is 
+   listed in the file LICENSE.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of John Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
+/*
+ * Written by Kern Sibbald, July 2007 to replace idcache.c
+ * 
+ *  Program to convert uid and gid into names, and cache the results
+ *   for preformance reasons.
+ *
+ *  Version $Id$
+ */
+
+#include "bacula.h"
+
+#ifndef WIN32
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+struct guitem {
+   dlink link;
+   char *name;
+   union {
+      uid_t uid;
+      gid_t gid;
+   };
+};
+
+
+guid_list *new_guid_list()
+{
+   guid_list *list;
+   guitem *item = NULL;
+   list = (guid_list *)malloc(sizeof(guid_list));
+   list->uid_list = New(dlist(item, &item->link));
+   list->gid_list = New(dlist(item, &item->link));
+   return list;
+}
+
+void free_guid_list(guid_list *list)
+{
+   guitem *item;
+   foreach_dlist(item, list->uid_list) {
+      free(item->name);
+   }
+   foreach_dlist(item, list->gid_list) {
+      free(item->name);
+   }
+   delete list->uid_list;
+   delete list->gid_list;
+   free(list);
+}
+
+static int uid_compare(void *item1, void *item2)
+{
+   guitem *i1 = (guitem *)item1;
+   guitem *i2 = (guitem *)item2;
+   if (i1->uid < i2->uid) {
+      return -1;
+   } else if (i1->uid > i2->uid) {
+      return 1;
+   } else {
+      return 0;
+   }
+}
+
+static int gid_compare(void *item1, void *item2)
+{
+   guitem *i1 = (guitem *)item1;
+   guitem *i2 = (guitem *)item2;
+   if (i1->gid < i2->gid) {
+      return -1;
+   } else if (i1->gid > i2->gid) {
+      return 1;
+   } else {
+      return 0;
+   }
+}
+
+
+static void get_uidname(uid_t uid, guitem *item)
+{
+#ifndef HAVE_WIN32
+   struct passwd *pwbuf;
+   P(mutex);
+   pwbuf = getpwuid(uid);
+   if (pwbuf != NULL && strcmp(pwbuf->pw_name, "????????") != 0) {
+      item->name = bstrdup(pwbuf->pw_name);
+   }
+   V(mutex);
+#endif
+}
+
+static void get_gidname(gid_t gid, guitem *item)
+{
+#ifndef HAVE_WIN32
+   struct group *grbuf;
+   P(mutex);
+   grbuf = getgrgid(gid);
+   if (grbuf != NULL && strcmp(grbuf->gr_name, "????????") != 0) {
+      item->name = bstrdup(grbuf->gr_name);
+   }
+   V(mutex);
+#endif
+}
+
+
+char *guid_list::uid_to_name(uid_t uid, char *name, int maxlen)
+{
+   guitem sitem, *item, *fitem;
+   sitem.uid = uid;
+   char buf[50];
+
+   item = (guitem *)uid_list->binary_search(&sitem, uid_compare);
+   Dmsg2(900, "uid=%d item=%p\n", uid, item);
+   if (!item) {
+      item = (guitem *)malloc(sizeof(guitem));
+      item->uid = uid;
+      item->name = NULL;
+      get_uidname(uid, item);
+      if (!item->name) {
+         item->name = bstrdup(edit_int64(uid, buf));
+         Dmsg2(900, "set uid=%d name=%s\n", uid, item->name);
+      }
+      fitem = (guitem *)uid_list->binary_insert(item, uid_compare);
+      if (fitem != item) {               /* item already there this shouldn't happen */
+         free(item);
+         item = fitem;   
+      }
+   }
+   bstrncpy(name, item->name, maxlen);
+   return name;
+}
+
+char *guid_list::gid_to_name(gid_t gid, char *name, int maxlen)
+{
+   guitem sitem, *item, *fitem;
+   sitem.gid = gid;
+   char buf[50];
+
+   item = (guitem *)uid_list->binary_search(&sitem, gid_compare);
+   if (!item) {
+      item = (guitem *)malloc(sizeof(guitem));
+      item->gid = gid;
+      item->name = NULL;
+      get_gidname(gid, item);
+      if (!item->name) {
+         item->name = bstrdup(edit_int64(gid, buf));
+      }
+      fitem = (guitem *)gid_list->binary_insert(item, gid_compare);
+      if (fitem != item) {               /* item already there this shouldn't happen */
+         free(item);
+         item = fitem;   
+      }
+   }
+
+   bstrncpy(name, item->name, maxlen);
+   return name;
+}
+
+#ifdef TEST_PROGRAM
+
+int main()
+{
+   int i;
+   guid_list *list;
+   char ed1[50], ed2[50];
+   list = new_guid_list();
+   for (i=0; i<1001; i++) {
+      printf("uid=%d name=%s  gid=%d name=%s\n", i, list->uid_to_name(i, ed1, sizeof(ed1)),
+         i, list->gid_to_name(i, ed2, sizeof(ed2)));
+      printf("uid=%d name=%s  gid=%d name=%s\n", i, list->uid_to_name(i, ed1, sizeof(ed1)),
+         i, list->gid_to_name(i, ed2, sizeof(ed2)));
+   }
+    
+   free_guid_list(list);
+   sm_dump(false);
+
+   return 0;
+}
+#endif
diff --git a/bacula/src/lib/guid_to_name.h b/bacula/src/lib/guid_to_name.h
new file mode 100644 (file)
index 0000000..0fb1acc
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+   Bacula® - The Network Backup Solution
+
+   Copyright (C) 2007 Kern Sibbald
+
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation, which is 
+   listed in the file LICENSE.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of John Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
+/*
+ * Written by Kern Sibbald, July 2007 to replace idcache.c
+ * 
+ *  Program to convert uid and gid into names, and cache the results
+ *   for preformance reasons.
+ *
+ *  Version $Id$
+ */
+
+class guid_list {
+public:
+   dlist *uid_list;
+   dlist *gid_list;
+
+   char *uid_to_name(uid_t uid, char *name, int maxlen);
+   char *gid_to_name(gid_t gid, char *name, int maxlen);
+};
+
+guid_list *new_guid_list();
+void free_guid_list(guid_list *list);
+
diff --git a/bacula/src/lib/idcache.c b/bacula/src/lib/idcache.c
deleted file mode 100644 (file)
index d3e78f8..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/* idcache.c -- map user and group IDs, cached for speed
-   Copyright (C) 1985, 1988, 1989, 1990 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-
-#include "bacula.h"
-
-struct userid {
-  union {
-      uid_t u;
-      gid_t g;
-  } id;
-  char *name;
-  struct userid *next;
-};
-
-static struct userid *user_alist = NULL;
-/* Use the same struct as for userids. */
-static struct userid *group_alist = NULL;
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/* Translate UID to a login name or a stringified number,
-   with cache. */
-
-char *getuser(uid_t uid, char *name, int len)
-{
-   register struct userid *tail;
-   char usernum_string[20];
-
-   P(mutex);
-   for (tail = user_alist; tail; tail = tail->next) {
-      if (tail->id.u == uid) {
-         goto uid_done;
-      }
-   }
-
-   tail = (struct userid *)malloc(sizeof (struct userid));
-   tail->id.u = uid;
-   tail->name = NULL;
-
-#if !defined(HAVE_WIN32)
-   {
-      struct passwd *pwent = getpwuid(uid);
-
-      if (pwent != NULL && strcmp(pwent->pw_name, "????????") != 0) {
-         tail->name = bstrdup(pwent->pw_name);
-      }
-   }
-#endif
-
-   if (tail->name == NULL) {
-      sprintf(usernum_string, "%u", (uint32_t)uid);
-      tail->name = bstrdup(usernum_string);
-   }
-
-   /* Add to the head of the list, so most recently used is first.  */
-   tail->next = user_alist;
-   user_alist = tail;
-
-uid_done:
-   bstrncpy(name, tail->name, len);
-   V(mutex);
-   return name;
-}
-
-void free_getuser_cache()
-{
-  register struct userid *tail;
-
-  P(mutex);
-  for (tail = user_alist; tail; ) {
-     struct userid *otail = tail;
-     free(tail->name);
-     tail = tail->next;
-     free(otail);
-  }
-  user_alist = NULL;
-  V(mutex);
-}
-
-
-
-/* Translate GID to a group name or a stringified number,
-   with cache. */
-char *getgroup(gid_t gid, char *name, int len)
-{
-   register struct userid *tail;
-   char groupnum_string[20];
-
-   P(mutex);
-   for (tail = group_alist; tail; tail = tail->next) {
-      if (tail->id.g == gid) {
-         goto gid_done;
-      }
-   }
-
-   tail = (struct userid *)malloc(sizeof (struct userid));
-   tail->id.g = gid;
-   tail->name = NULL;
-
-#if !defined(HAVE_WIN32)
-   {
-      struct group *grent = getgrgid(gid);
-
-      if (grent != NULL && strcmp(grent->gr_name, "????????") != 0) {
-         tail->name = bstrdup(grent->gr_name);
-      }
-   }
-#endif
-
-   if (tail->name == NULL) {
-      sprintf (groupnum_string, "%u", (uint32_t)gid);
-      tail->name = bstrdup(groupnum_string);
-   }
-
-   /* Add to the head of the list, so most recently used is first. */
-   tail->next = group_alist;
-   group_alist = tail;
-
-gid_done:
-   bstrncpy(name, tail->name, len);
-   V(mutex);
-   return name;
-}
-
-void free_getgroup_cache()
-{
-  register struct userid *tail;
-
-  P(mutex);
-  for (tail = group_alist; tail; ) {
-     struct userid *otail = tail;
-     free(tail->name);
-     tail = tail->next;
-     free(otail);
-  }
-  group_alist = NULL;
-  V(mutex);
-}
index 0b5e01fdc84f372f581c3b1b53c1b9a58b9b0f12..ef542cc09ea4252141cce439493471195a3270cc 100644 (file)
@@ -401,8 +401,10 @@ static void free_common_jcr(JCR *jcr)
       jcr->cached_path = NULL;
       jcr->cached_pnl = 0;
    }
-   free_getuser_cache();
-   free_getgroup_cache();
+   if (jcr->id_list) {
+      free_guid_list(jcr->id_list);
+      jcr->id_list = NULL;
+   }
    free(jcr);
 }
 
index 0397bd952123f041133f769ac777e91ff5bda8b4..7ecc0858a64fd4133f35a003dd9ba6e84ffffc89 100644 (file)
@@ -67,5 +67,6 @@
 #include "attr.h"
 #include "var.h"
 #include "address_conf.h"
+#include "guid_to_name.h"
 
 #include "protos.h"
index e3b9340bdc1928cc474193d2947f5f3d1b1b47e6..ef09d9f05a60084524a408225810ca354f7076a3 100644 (file)
@@ -240,12 +240,6 @@ int              net_connect             (int port);
 BSOCK *          bnet_bind               (int port);
 BSOCK *          bnet_accept             (BSOCK *bsock, char *who);
 
-/* idcache.c */
-char *getuser(uid_t uid);
-void free_getuser_cache();
-char *getgroup (gid_t gid);
-void free_getgroup_cache();
-
 /* python.c */
 typedef int (EVENT_HANDLER)(JCR *jcr, const char *event);
 void init_python_interpreter(const char *progname, const char *scripts,
diff --git a/bacula/src/lib/uid_gid_name.c b/bacula/src/lib/uid_gid_name.c
deleted file mode 100644 (file)
index 7f7d665..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2007 Kern Sibbald
-
-   The main author of Bacula is Kern Sibbald, with contributions from
-   many others, a complete list can be found in the file AUTHORS.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation, which is 
-   listed in the file LICENSE.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of John Walker.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
-*/
-/*
- * Written by Kern Sibbald, July 2005 to replace idcache.c
- * 
- *  Program to convert uid and gid into names, and cache the results
- *   for preformance reasons.
- */
-
-#include "bacula.h"
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-
-struct guitem {
-   dlink link;
-   char *name;
-   union {
-      uid_t uid;
-      gid_t gid;
-   };
-};
-
-class guid_list {
-public:
-   dlist *uid_list;
-   dlist *gid_list;
-
-   char *uid_to_name(uid_t uid, char *name, int maxlen);
-   char *gid_to_name(gid_t gid, char *name, int maxlen);
-};
-
-guid_list *new_guid_list()
-{
-   guid_list *list;
-   guitem *item = NULL;
-   list = (guid_list *)malloc(sizeof(guid_list));
-   list->uid_list = New(dlist(item, &item->link));
-   list->gid_list = New(dlist(item, &item->link));
-   return list;
-}
-
-void free_guid_list(guid_list *list)
-{
-   guitem *item;
-   foreach_dlist(item, list->uid_list) {
-      free(item->name);
-   }
-   foreach_dlist(item, list->gid_list) {
-      free(item->name);
-   }
-   delete list->uid_list;
-   delete list->gid_list;
-   free(list);
-}
-
-static int uid_compare(void *item1, void *item2)
-{
-   guitem *i1 = (guitem *)item1;
-   guitem *i2 = (guitem *)item2;
-   if (i1->uid < i2->uid) {
-      return -1;
-   } else if (i1->uid > i2->uid) {
-      return 1;
-   } else {
-      return 0;
-   }
-}
-
-static int gid_compare(void *item1, void *item2)
-{
-   guitem *i1 = (guitem *)item1;
-   guitem *i2 = (guitem *)item2;
-   if (i1->gid < i2->gid) {
-      return -1;
-   } else if (i1->gid > i2->gid) {
-      return 1;
-   } else {
-      return 0;
-   }
-}
-
-
-static void get_uidname(uid_t uid, guitem *item)
-{
-#ifndef HAVE_WIN32
-   struct passwd *pwbuf;
-   P(mutex);
-   pwbuf = getpwuid(uid);
-   if (pwbuf != NULL && strcmp(pwbuf->pw_name, "????????") != 0) {
-      item->name = bstrdup(pwbuf->pw_name);
-   }
-   V(mutex);
-#endif
-}
-
-static void get_gidname(gid_t gid, guitem *item)
-{
-#ifndef HAVE_WIN32
-   struct group *grbuf;
-   P(mutex);
-   grbuf = getgrgid(gid);
-   if (grbuf != NULL && strcmp(grbuf->gr_name, "????????") != 0) {
-      item->name = bstrdup(grbuf->gr_name);
-   }
-   V(mutex);
-#endif
-}
-
-
-char *guid_list::uid_to_name(uid_t uid, char *name, int maxlen)
-{
-   guitem sitem, *item, *fitem;
-   sitem.uid = uid;
-   char buf[50];
-
-   item = (guitem *)uid_list->binary_search(&sitem, uid_compare);
-   Dmsg2(900, "uid=%d item=%p\n", uid, item);
-   if (!item) {
-      item = (guitem *)malloc(sizeof(guitem));
-      item->uid = uid;
-      item->name = NULL;
-      get_uidname(uid, item);
-      if (!item->name) {
-         item->name = bstrdup(edit_int64(uid, buf));
-         Dmsg2(900, "set uid=%d name=%s\n", uid, item->name);
-      }
-      fitem = (guitem *)uid_list->binary_insert(item, uid_compare);
-      if (fitem != item) {               /* item already there this shouldn't happen */
-         free(item);
-         item = fitem;   
-      }
-   }
-   bstrncpy(name, item->name, maxlen);
-   return name;
-}
-
-char *guid_list::gid_to_name(gid_t gid, char *name, int maxlen)
-{
-   guitem sitem, *item, *fitem;
-   sitem.gid = gid;
-   char buf[50];
-
-   item = (guitem *)uid_list->binary_search(&sitem, gid_compare);
-   if (!item) {
-      item = (guitem *)malloc(sizeof(guitem));
-      item->gid = gid;
-      item->name = NULL;
-      get_gidname(gid, item);
-      if (!item->name) {
-         item->name = bstrdup(edit_int64(gid, buf));
-      }
-      fitem = (guitem *)gid_list->binary_insert(item, gid_compare);
-      if (fitem != item) {               /* item already there this shouldn't happen */
-         free(item);
-         item = fitem;   
-      }
-   }
-
-   bstrncpy(name, item->name, maxlen);
-   return name;
-}
-
-#ifdef TEST_PROGRAM
-
-int main()
-{
-   int i;
-   guid_list *list;
-   char ed1[50], ed2[50];
-   list = new_guid_list();
-   for (i=0; i<1001; i++) {
-      printf("uid=%d name=%s  gid=%d name=%s\n", i, list->uid_to_name(i, ed1, sizeof(ed1)),
-         i, list->gid_to_name(i, ed2, sizeof(ed2)));
-      printf("uid=%d name=%s  gid=%d name=%s\n", i, list->uid_to_name(i, ed1, sizeof(ed1)),
-         i, list->gid_to_name(i, ed2, sizeof(ed2)));
-   }
-    
-   free_guid_list(list);
-   sm_dump(false);
-
-   return 0;
-}
-#endif
index 008575c414a96352fc6da7b74b32797b6e8d4250..bb08001bd6228315458ecc802a5a707d6fbbe9a7 100644 (file)
@@ -2,6 +2,8 @@
 
 General:
 05Sep07
+kes  Remove idcache.c 
+kes  Add guid_to_name.c/h which replace idcache.
 kes  Remove enh_fnmatch.c.  Make code that references it use fnmatch.c
 04Sep07
 ebl  Detect if new PosgreSQL batch insert API is present.