X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_mount.c;h=cae3706794737fe438c79132cea13121c22b7ad9;hb=be99a844a40d7037a910d37a894988b807631a6e;hp=72ce930130bfb45dbb9b50c78ffdb9a336414f06;hpb=5835a87810b4870c98bf3ab541a376a80c109713;p=collectd.git diff --git a/src/utils_mount.c b/src/utils_mount.c index 72ce9301..cae37067 100644 --- a/src/utils_mount.c +++ b/src/utils_mount.c @@ -1,6 +1,6 @@ /** * collectd - src/utils_mount.c - * Copyright (C) 2005 Niki W. Waibel + * Copyright (C) 2005,2006 Niki W. Waibel * * This program is free software; you can redistribute it and/ * or modify it under the terms of the GNU General Public Li- @@ -21,7 +21,9 @@ * Niki W. Waibel **/ - +#if HAVE_CONFIG_H +# include "config.h" +#endif #include "common.h" #if HAVE_XFS_XQM_H @@ -29,10 +31,20 @@ #define XFS_SUPER_MAGIC_STR "XFSB" #define XFS_SUPER_MAGIC2_STR "BSFX" #endif -#include "utils_debug.h" + +#include "plugin.h" #include "utils_mount.h" -#if HAVE_GETFSSTAT +#if HAVE_GETVFSSTAT +# if HAVE_SYS_TYPES_H +# include +# endif +# if HAVE_SYS_STATVFS_H +# include +# endif +/* #endif HAVE_GETVFSSTAT */ + +#elif HAVE_GETFSSTAT # if HAVE_SYS_PARAM_H # include # endif @@ -42,7 +54,7 @@ # if HAVE_SYS_MOUNT_H # include # endif -#endif /* HAVE_GETMNTINFO */ +#endif /* HAVE_GETFSSTAT */ #if HAVE_MNTENT_H # include @@ -51,18 +63,26 @@ # include #endif -#ifndef MNTTAB -# if defined(_PATH_MOUNTED) -# define MNTTAB _PATH_MOUNTED -# elif defined(MNT_MNTTAB) -# define MNTTAB MNT_MNTTAB -# elif defined(MNTTABNAME) -# define MNTTAB MNTTABNAME -# elif defined(KMTAB) -# define MNTTAB KMTAB -# else -# define MNTTAB "/etc/mnttab" -# endif +#if HAVE_PATHS_H +# include +#endif + +#ifdef COLLECTD_MNTTAB +# undef COLLECTD_MNTTAB +#endif + +#if defined(_PATH_MOUNTED) /* glibc */ +# define COLLECTD_MNTTAB _PATH_MOUNTED +#elif defined(MNTTAB) /* Solaris */ +# define COLLECTD_MNTTAB MNTTAB +#elif defined(MNT_MNTTAB) +# define COLLECTD_MNTTAB MNT_MNTTAB +#elif defined(MNTTABNAME) +# define COLLECTD_MNTTAB MNTTABNAME +#elif defined(KMTAB) +# define COLLECTD_MNTTAB KMTAB +#else +# define COLLECTD_MNTTAB "/etc/mnttab" #endif /* *** *** *** ********************************************* *** *** *** */ @@ -240,7 +260,7 @@ uuidcache_init(void) * (This is useful, if the cdrom on /dev/hdc must not * be accessed.) */ - snprintf(device, sizeof(device), "%s/%s", + ssnprintf(device, sizeof(device), "%s/%s", DEVLABELDIR, ptname); if(!get_label_uuid(device, &label, uuid)) { uuidcache_addentry(sstrdup(device), @@ -314,7 +334,7 @@ get_spec_by_uuid(const char *s) return get_spec_by_x(UUID, uuid); bad_uuid: - DBG("Found an invalid UUID: %s", s); + DEBUG("utils_mount: Found an invalid UUID: %s", s); return NULL; } @@ -333,12 +353,12 @@ static char *get_device_name(const char *optstr) } else if (strncmp (optstr, "UUID=", 5) == 0) { - DBG ("TODO: check UUID= code!"); + DEBUG ("utils_mount: TODO: check UUID= code!"); rc = get_spec_by_uuid (optstr + 5); } else if (strncmp (optstr, "LABEL=", 6) == 0) { - DBG ("TODO: check LABEL= code!"); + DEBUG ("utils_mount: TODO: check LABEL= code!"); rc = get_spec_by_volume_label (optstr + 6); } else @@ -348,7 +368,7 @@ static char *get_device_name(const char *optstr) if(!rc) { - DBG ("Error checking device name: optstr = %s", optstr); + DEBUG ("utils_mount: Error checking device name: optstr = %s", optstr); } return rc; } @@ -362,8 +382,12 @@ static cu_mount_t *cu_mount_listmntent (void) struct mntent *mnt; struct tabmntent *mntlist; - if(listmntent(&mntlist, MNTTAB, NULL, NULL) < 0) { - DBG("calling listmntent() failed: %s", strerror(errno)); + if(listmntent(&mntlist, COLLECTD_MNTTAB, NULL, NULL) < 0) { +#if COLLECT_DEBUG + char errbuf[1024]; + DEBUG("utils_mount: calling listmntent() failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); +#endif /* COLLECT_DEBUG */ } for(p = mntlist; p; p = p->next) { @@ -374,7 +398,7 @@ static cu_mount_t *cu_mount_listmntent (void) if(loop == NULL) { /* no loop= mount */ device = get_device_name(mnt->mnt_fsname); if(device == NULL) { - DBG("can't get devicename for fs (%s) %s (%s)" + DEBUG("utils_mount: can't get devicename for fs (%s) %s (%s)" ": ignored", mnt->mnt_type, mnt->mnt_dir, mnt->mnt_fsname); continue; @@ -404,12 +428,23 @@ static cu_mount_t *cu_mount_listmntent (void) } /* cu_mount_t *cu_mount_listmntent(void) */ /* #endif HAVE_LISTMNTENT */ -/* 4.4BSD and Mac OS X */ -#elif HAVE_GETFSSTAT +/* 4.4BSD and Mac OS X (getfsstat) or NetBSD (getvfsstat) */ +#elif HAVE_GETVFSSTAT || HAVE_GETFSSTAT static cu_mount_t *cu_mount_getfsstat (void) { +#if HAVE_GETVFSSTAT +# define STRUCT_STATFS struct statvfs +# define CMD_STATFS getvfsstat +# define FLAGS_STATFS ST_NOWAIT +/* #endif HAVE_GETVFSSTAT */ +#elif HAVE_GETFSSTAT +# define STRUCT_STATFS struct statfs +# define CMD_STATFS getfsstat +# define FLAGS_STATFS MNT_NOWAIT +#endif /* HAVE_GETFSSTAT */ + int bufsize; - struct statfs *buf; + STRUCT_STATFS *buf; int num; int i; @@ -419,16 +454,30 @@ static cu_mount_t *cu_mount_getfsstat (void) cu_mount_t *new = NULL; /* Get the number of mounted file systems */ - if ((bufsize = getfsstat (NULL, 0, MNT_NOWAIT)) < 1) + if ((bufsize = CMD_STATFS (NULL, 0, FLAGS_STATFS)) < 1) + { +#if COLLECT_DEBUG + char errbuf[1024]; + DEBUG ("utils_mount: getv?fsstat failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); +#endif /* COLLECT_DEBUG */ return (NULL); + } - if ((buf = (struct statfs *) malloc (bufsize * sizeof (struct statfs))) == NULL) + if ((buf = (STRUCT_STATFS *) malloc (bufsize * sizeof (STRUCT_STATFS))) + == NULL) return (NULL); - memset (buf, '\0', bufsize * sizeof (struct statfs)); + memset (buf, '\0', bufsize * sizeof (STRUCT_STATFS)); - /* FIXME: If `bufsize' in bytes or structures? */ - if ((num = getfsstat (buf, bufsize, MNT_NOWAIT)) < 1) + /* The bufsize needs to be passed in bytes. Really. This is not in the + * manpage.. -octo */ + if ((num = CMD_STATFS (buf, bufsize * sizeof (STRUCT_STATFS), FLAGS_STATFS)) < 1) { +#if COLLECT_DEBUG + char errbuf[1024]; + DEBUG ("utils_mount: getv?fsstat failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); +#endif /* COLLECT_DEBUG */ free (buf); return (NULL); } @@ -464,10 +513,10 @@ static cu_mount_t *cu_mount_getfsstat (void) return (first); } -/* #endif HAVE_GETFSSTAT */ +/* #endif HAVE_GETVFSSTAT || HAVE_GETFSSTAT */ /* Solaris (SunOS 10): int getmntent(FILE *fp, struct mnttab *mp); */ -#elif HAVE_GEN_GETMNTENT +#elif HAVE_TWO_GETMNTENT || HAVE_GEN_GETMNTENT || HAVE_SUN_GETMNTENT static cu_mount_t *cu_mount_gen_getmntent (void) { struct mnttab mt; @@ -477,8 +526,15 @@ static cu_mount_t *cu_mount_gen_getmntent (void) cu_mount_t *last = NULL; cu_mount_t *new = NULL; - if ((fp = fopen (MNTTAB, "r")) == NULL) + DEBUG ("utils_mount: (void); COLLECTD_MNTTAB = %s", COLLECTD_MNTTAB); + + if ((fp = fopen (COLLECTD_MNTTAB, "r")) == NULL) + { + char errbuf[1024]; + ERROR ("fopen (%s): %s", COLLECTD_MNTTAB, + sstrerror (errno, errbuf, sizeof (errbuf))); return (NULL); + } while (getmntent (fp, &mt) == 0) { @@ -511,17 +567,13 @@ static cu_mount_t *cu_mount_gen_getmntent (void) return (first); } /* static cu_mount_t *cu_mount_gen_getmntent (void) */ -/* #endif HAVE_GEN_GETMNTENT */ +/* #endif HAVE_TWO_GETMNTENT || HAVE_GEN_GETMNTENT || HAVE_SUN_GETMNTENT */ #elif HAVE_SEQ_GETMNTENT #warn "This version of `getmntent' hat not yet been implemented!" /* #endif HAVE_SEQ_GETMNTENT */ -#elif HAVE_SUN_GETMNTENT -#warn "This version of `getmntent' hat not yet been implemented!" -/* #endif HAVE_SUN_GETMNTENT */ - -#elif HAVE_GETMNTENT +#elif HAVE_ONE_GETMNTENT static cu_mount_t *cu_mount_getmntent (void) { FILE *fp; @@ -531,8 +583,15 @@ static cu_mount_t *cu_mount_getmntent (void) cu_mount_t *last = NULL; cu_mount_t *new = NULL; - if ((fp = setmntent (MNTTAB, "r")) == NULL) + DEBUG ("utils_mount: (void); COLLECTD_MNTTAB = %s", COLLECTD_MNTTAB); + + if ((fp = setmntent (COLLECTD_MNTTAB, "r")) == NULL) + { + char errbuf[1024]; + ERROR ("setmntent (%s): %s", COLLECTD_MNTTAB, + sstrerror (errno, errbuf, sizeof (errbuf))); return (NULL); + } while ((me = getmntent (fp)) != NULL) { @@ -548,6 +607,9 @@ static cu_mount_t *cu_mount_getmntent (void) new->device = get_device_name (new->options); new->next = NULL; + DEBUG ("utils_mount: new = {dir = %s, spec_device = %s, type = %s, options = %s, device = %s}", + new->dir, new->spec_device, new->type, new->options, new->device); + /* Append to list */ if (first == NULL) { @@ -563,9 +625,11 @@ static cu_mount_t *cu_mount_getmntent (void) endmntent (fp); + DEBUG ("utils_mount: return (0x%p)", (void *) first); + return (first); } -#endif /* HAVE_GETMNTENT */ +#endif /* HAVE_ONE_GETMNTENT */ /* *** *** *** ******************************************** *** *** *** */ /* *** *** *** *** *** *** public functions *** *** *** *** *** *** */ @@ -590,14 +654,16 @@ cu_mount_t *cu_mount_getlist(cu_mount_t **list) #if HAVE_LISTMNTENT && 0 new = cu_mount_listmntent (); -#elif HAVE_GETFSSTAT +#elif HAVE_GETVFSSTAT || HAVE_GETFSSTAT new = cu_mount_getfsstat (); -#elif HAVE_GEN_GETMNTENT +#elif HAVE_TWO_GETMNTENT || HAVE_GEN_GETMNTENT || HAVE_SUN_GETMNTENT new = cu_mount_gen_getmntent (); -#elif HAVE_GETMNTENT +#elif HAVE_SEQ_GETMNTENT +# error "This version of `getmntent' hat not yet been implemented!" +#elif HAVE_ONE_GETMNTENT new = cu_mount_getmntent (); #else - new = NULL; +# error "Could not determine how to find mountpoints." #endif if (first != NULL) @@ -703,8 +769,6 @@ cu_mount_getoptionvalue(char *line, char *keyword) return r; } /* char *cu_mount_getoptionvalue(char *line, char *keyword) */ - - int cu_mount_type(const char *type) { @@ -716,5 +780,3 @@ cu_mount_type(const char *type) return CUMT_UNKNOWN; } /* int cu_mount_type(const char *type) */ - -