--- projects/libstatgrab/src/libstatgrab/tools.c 2004/11/06 19:09:00 1.60 +++ projects/libstatgrab/src/libstatgrab/tools.c 2007/06/18 20:58:12 1.65 @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * - * $Id: tools.c,v 1.60 2004/11/06 19:09:00 tdb Exp $ + * $Id: tools.c,v 1.65 2007/06/18 20:58:12 tdb Exp $ */ #ifdef HAVE_CONFIG_H @@ -64,6 +64,9 @@ #include #include #endif +#ifdef WIN32 +#include "win32.h" +#endif #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H) struct map{ @@ -176,7 +179,7 @@ static int get_alias(char *alias){ di_node_t root_node; di_node_t node; di_minor_t minor = DI_MINOR_NIL; - char tmpnode[MAXPATHLEN]; + char tmpnode[MAXPATHLEN + 1]; char *phys_path; char *minor_name; char *value; @@ -190,7 +193,7 @@ static int get_alias(char *alias){ instance = di_instance(node); phys_path = di_devfs_path(node); minor_name = di_minor_name(minor); - strcpy(tmpnode, alias); + sg_strlcpy(tmpnode, alias, MAXPATHLEN); sprintf(tmpnode, "%s%d", tmpnode, instance); sg_strlcpy(file, "/devices", sizeof file); sg_strlcat(file, phys_path, sizeof file); @@ -234,7 +237,7 @@ static int build_mapping(){ if(strcmp(ksp->ks_module, "md")==0) continue; if((kstat_read(kc, ksp, &kios))==-1) continue; strncpy(device_name, ksp->ks_name, sizeof device_name); - for(x=0;x<(sizeof device_name);x++){ + for(x=0;x<(int)(sizeof device_name);x++){ if( isdigit((int)device_name[x]) ) break; } if(x == sizeof device_name) x--; @@ -246,6 +249,7 @@ static int build_mapping(){ if (x>=BIG_ENOUGH){ /* We've got bigger than we thought was massive */ /* If we hit this.. Make big enough bigger */ + kstat_close(kc); return -1; } if( !strncmp(driver_list[x], device_name, BIG_ENOUGH)){ @@ -256,6 +260,7 @@ static int build_mapping(){ if(!found){ if((get_alias(device_name)) != 0){ + kstat_close(kc); return -1; } strncpy(driver_list[x], device_name, BIG_ENOUGH); @@ -264,6 +269,8 @@ static int build_mapping(){ } } + kstat_close(kc); + return 0; } @@ -294,7 +301,7 @@ char *sg_get_string_match(char *line, regmatch_t *matc return match_string; } -/* FIXME do Linux and Cygwin always have atoll? */ +/* Cygwin (without a recent newlib) doesn't have atoll */ #ifndef HAVE_ATOLL static long long atoll(const char *s) { long long value = 0; @@ -326,7 +333,7 @@ long long sg_get_ll_match(char *line, regmatch_t *matc } #endif -/* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */ +/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ /* * Copyright (c) 1998 Todd C. Miller @@ -350,16 +357,16 @@ long long sg_get_ll_match(char *line, regmatch_t *matc * Returns strlen(src); if retval >= siz, truncation occurred. */ size_t sg_strlcpy(char *dst, const char *src, size_t siz){ - register char *d = dst; - register const char *s = src; - register size_t n = siz; + char *d = dst; + const char *s = src; + size_t n = siz; /* Copy as many bytes as will fit */ - if (n != 0 && --n != 0) { - do { - if ((*d++ = *s++) == 0) + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') break; - } while (--n != 0); + } } /* Not enough room in dst, add NUL and traverse rest of src */ @@ -373,7 +380,7 @@ size_t sg_strlcpy(char *dst, const char *src, size_t s return(s - src - 1); /* count does not include NUL */ } -/* $OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $ */ +/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ /* * Copyright (c) 1998 Todd C. Miller @@ -399,9 +406,9 @@ size_t sg_strlcpy(char *dst, const char *src, size_t s * If retval >= siz, truncation occurred. */ size_t sg_strlcat(char *dst, const char *src, size_t siz){ - register char *d = dst; - register const char *s = src; - register size_t n = siz; + char *d = dst; + const char *s = src; + size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ @@ -439,11 +446,26 @@ int sg_update_string(char **dest, const char *src) { return -1; } - strcpy(new, src); + sg_strlcpy(new, src, strlen(src) + 1); *dest = new; return 0; } +/* join two strings together */ +int sg_concat_string(char **dest, const char *src) { + char *new; + int len = strlen(*dest) + strlen(src) + 1; + + new = sg_realloc(*dest, len); + if (new == NULL) { + return -1; + } + + *dest = new; + sg_strlcat(*dest, src, len); + return 0; +} + #if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) kvm_t *sg_get_kvm() { static kvm_t *kvmd = NULL; @@ -531,10 +553,29 @@ int sg_init(){ build_mapping(); #endif #endif +#ifdef WIN32 + return sg_win32_start_capture(); +#endif return 0; } +int sg_shutdown() { +#ifdef WIN32 + sg_win32_end_capture(); +#endif + return 0; +} + +int sg_snapshot() { +#ifdef WIN32 + return sg_win32_snapshot(); +#else + return 0; +#endif +} + int sg_drop_privileges() { +#ifndef WIN32 #ifdef HAVE_SETEGID if (setegid(getgid()) != 0) { #elif defined(HAVE_SETRESGID) @@ -555,6 +596,7 @@ int sg_drop_privileges() { sg_set_error_with_errno(SG_ERROR_SETEUID, NULL); return -1; } +#endif /* WIN32 */ return 0; }