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;
*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;
} 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;
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) {
/* 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;
}
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 */
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 \
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 \
-/*
- * 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"
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++ = ' ';
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+
+++ /dev/null
-/* 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);
-}
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);
}
#include "attr.h"
#include "var.h"
#include "address_conf.h"
+#include "guid_to_name.h"
#include "protos.h"
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,
+++ /dev/null
-/*
- 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
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.