diff -I '\$Id: ' -u -r -b -w -p -d --new-file --exclude-from=/Users/rstory/.rcfiles/diff-ignore SVN/include/net-snmp/library/dir_utils.h APPLE/include/net-snmp/library/dir_utils.h --- SVN/include/net-snmp/library/dir_utils.h +++ APPLE/include/net-snmp/library/dir_utils.h @@ -0,0 +1,32 @@ + +#ifndef NETSNMP_DIR_UTILS_H +#define NETSNMP_DIR_UTILS_H + +#ifdef _cplusplus +extern "C" { +#endif + + /*------------------------------------------------------------------ + * + * Prototypes + */ + netsnmp_container * netsnmp_directory_container_read(netsnmp_container *c, + const char *dir, + u_int flags); + void netsnmp_directory_container_free(netsnmp_container *c); + + + + /*------------------------------------------------------------------ + * + * flags + */ +#define NETSNMP_DIR_RECURSE 0x1 + + + +#ifdef _cplusplus +} +#endif + +#endif /* NETSNMP_DIR_UTILS_H */ diff -I '\$Id: ' -u -r -b -w -p -d --new-file --exclude-from=/Users/rstory/.rcfiles/diff-ignore SVN/snmplib/Makefile.in APPLE/snmplib/Makefile.in --- SVN/snmplib/Makefile.in +++ APPLE/snmplib/Makefile.in @@ -55,6 +55,7 @@ INCLUDESUBDIRHEADERS=README \ factory.h \ data_list.h \ default_store.h \ + dir_utils.h \ fd_event_manager.h \ file_utils.h \ int64.h \ @@ -137,7 +138,7 @@ CSRCS= snmp_client.c mib.c parse.c snmp_ snmp_auth.c asn1.c md5.c snmp_parse_args.c \ system.c vacm.c int64.c read_config.c pkcs.c \ snmp_debug.c tools.c snmp_logging.c text_utils.c \ - snmpv3.c lcd_time.c keytools.c file_utils.c \ + snmpv3.c lcd_time.c keytools.c file_utils.c dir_utils.c \ scapi.c callback.c default_store.c snmp_alarm.c \ data_list.c oid_stash.c fd_event_manager.c \ mt_support.c snmp_enum.c snmp-tc.c snmp_service.c \ @@ -152,7 +153,7 @@ OBJS= snmp_client.o mib.o parse.o snmp_a snmp_auth.o asn1.o md5.o snmp_parse_args.o \ system.o vacm.o int64.o read_config.o pkcs.o \ snmp_debug.o tools.o snmp_logging.o text_utils.o \ - snmpv3.o lcd_time.o keytools.o file_utils.o \ + snmpv3.o lcd_time.o keytools.o file_utils.o dir_utils.o \ scapi.o callback.o default_store.o snmp_alarm.o \ data_list.o oid_stash.o fd_event_manager.o \ mt_support.o snmp_enum.o snmp-tc.o snmp_service.o \ @@ -167,7 +168,7 @@ LOBJS= snmp_client.lo mib.lo parse.lo sn snmp_auth.lo asn1.lo md5.lo snmp_parse_args.lo \ system.lo vacm.lo int64.lo read_config.lo pkcs.lo \ snmp_debug.lo tools.lo snmp_logging.lo text_utils.lo \ - snmpv3.lo lcd_time.lo keytools.lo file_utils.lo \ + snmpv3.lo lcd_time.lo keytools.lo file_utils.lo dir_utils.lo \ scapi.lo callback.lo default_store.lo snmp_alarm.lo \ data_list.lo oid_stash.lo fd_event_manager.lo \ mt_support.lo snmp_enum.lo snmp-tc.lo snmp_service.lo \ diff -I '\$Id: ' -u -r -b -w -p -d --new-file --exclude-from=/Users/rstory/.rcfiles/diff-ignore SVN/snmplib/dir_utils.c APPLE/snmplib/dir_utils.c --- SVN/snmplib/dir_utils.c +++ APPLE/snmplib/dir_utils.c @@ -0,0 +1,125 @@ +#include +#include + +#include +#include +#if HAVE_STDLIB_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_STRING_H +# include +#else +# include +#endif + +#include +#if HAVE_LIMITS_H +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_DIRENT_H +#include +#endif + +#include + +#if HAVE_DMALLOC_H +# include +#endif + +#include +#include +#include + +netsnmp_container * +netsnmp_directory_container_read(netsnmp_container *user_container, + const char *dirname, u_int flags) +{ + DIR *dir; + netsnmp_container *container = user_container, *tmp_c; + struct dirent *file; + char path[PATH_MAX]; + u_char dirname_len; + int rc; + + DEBUGMSGTL(("directory:container", "reading %s\n", dirname)); + + /* + * create the container, if needed + */ + if (NULL == container) { + container = netsnmp_container_find("directory_container:cstring"); + if (NULL == container) + return NULL; + container->container_name = strdup("directory container"); + netsnmp_binary_array_options_set(container, 1, CONTAINER_KEY_UNSORTED); + } + + dir = opendir(dirname); + if (NULL == dir) { + DEBUGMSGTL(("directory:container", " not a dir\n")); + return NULL; + } + + /** copy dirname into path */ + dirname_len = strlen(dirname); + strncpy(path, dirname, sizeof(path)); + if ((dirname_len + 2) > sizeof(path)) { + /** not enough room for files */ + closedir(dir); + return NULL; + } + path[dirname_len] = '/'; + path[++dirname_len] = 0; + + /** iterate over dir */ + while ((file = readdir(dir))) { + + if ((file->d_name == NULL) || (file->d_name[0] == 0)) + continue; + + /** skip '.' and '..' */ + if ((file->d_name[0] == '.') && + ((file->d_name[1] == 0) || + ((file->d_name[1] == '.') && ((file->d_name[2] == 0))))) + continue; + + strncpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len); + DEBUGMSGTL(("9:directory:container", " found %s\n", path)); + if ((file->d_type == DT_DIR) && (flags & NETSNMP_DIR_RECURSE)) { + /** xxx add the dir as well? not for now.. maybe another flag? */ + tmp_c = netsnmp_directory_container_read(container, path, flags); + } + else { + char *dup = strdup(path); + if (NULL == dup) { + snmp_log(LOG_ERR, "strdup failed\n"); + break; + } + rc = CONTAINER_INSERT(container, dup); + if (-1 == rc ) { + DEBUGMSGTL(("directory:container", " err adding %s\n", path)); + free(dup); + } + } + } + + closedir(dir); + + DEBUGMSGTL(("directory:container", " container now has %d items\n", + CONTAINER_SIZE(container))); + + return container; +} + +void +netsnmp_directory_container_free(netsnmp_container *container) +{ + CONTAINER_CLEAR(container, netsnmp_container_simple_free, NULL); + CONTAINER_FREE(container); +}