From mboxrd@z Thu Jan 1 00:00:00 1970 From: fabbione@sourceware.org Date: 15 Nov 2007 04:14:16 -0000 Subject: [Cluster-devel] cluster/cman/qdisk disk.h main.c mkqdisk.c proc.c Message-ID: <20071115041416.5458.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: fabbione at sourceware.org 2007-11-15 04:14:15 Modified files: cman/qdisk : disk.h main.c mkqdisk.c proc.c Log message: Fix bugzilla 362031 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/disk.h.diff?cvsroot=cluster&r1=1.7&r2=1.8 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/main.c.diff?cvsroot=cluster&r1=1.11&r2=1.12 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/mkqdisk.c.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/qdisk/proc.c.diff?cvsroot=cluster&r1=1.3&r2=1.4 --- cluster/cman/qdisk/disk.h 2007/02/21 20:24:30 1.7 +++ cluster/cman/qdisk/disk.h 2007/11/15 04:14:15 1.8 @@ -277,7 +277,7 @@ void qd_destroy(qd_ctx *ctx); /* proc.c */ -int find_partitions(const char *partfile, const char *label, +int find_partitions(const char *devdir, const char *label, char *devname, size_t devlen, int print); int check_device(char *device, char *label, quorum_header_t *qh); --- cluster/cman/qdisk/main.c 2007/11/01 00:25:28 1.11 +++ cluster/cman/qdisk/main.c 2007/11/15 04:14:15 1.12 @@ -1491,7 +1491,8 @@ } if (ctx.qc_label) { - if (find_partitions("/proc/partitions", + memset(device, 0, sizeof(device)); + if (find_partitions("/dev", ctx.qc_label, device, sizeof(device), 0) != 0) { clulog_and_print(LOG_CRIT, "Unable to match label" --- cluster/cman/qdisk/mkqdisk.c 2006/11/21 14:50:49 1.4 +++ cluster/cman/qdisk/mkqdisk.c 2007/11/15 04:14:15 1.5 @@ -39,19 +39,19 @@ char *newdev = NULL, *newlabel = NULL; int rv; - printf("mkqdisk v0.5.1\n"); + printf("mkqdisk v" RELEASE_VERSION "\n\n"); while ((rv = getopt(argc, argv, "Lf:c:l:h")) != EOF) { switch (rv) { case 'L': /* List */ close(2); - return find_partitions("/proc/partitions", + return find_partitions("/dev", NULL, NULL, 0, 1); break; case 'f': close(2); - return find_partitions("/proc/partitions", + return find_partitions("/dev", optarg, device, sizeof(device), 1); case 'c': --- cluster/cman/qdisk/proc.c 2007/09/11 12:38:08 1.3 +++ cluster/cman/qdisk/proc.c 2007/11/15 04:14:15 1.4 @@ -26,10 +26,12 @@ #include #include #include +#include #include #include #include - +#include +#include int check_device(char *device, char *label, quorum_header_t *qh) @@ -68,62 +70,61 @@ int -find_partitions(const char *partfile, const char *label, +find_partitions(const char *devdir, const char *label, char *devname, size_t devlen, int print) { - char line[4096]; - FILE *fp; - int minor, major; - unsigned long long blkcnt; - char device[128]; - char realdev[256]; + struct dirent **namelist; + struct stat sb; + char newpath[256]; + int n; quorum_header_t qh; - fp = fopen(partfile, "r"); - if (!fp) + n = scandir(devdir, &namelist, 0, alphasort); + if (n <= 0) return -1; - while (fgets(line, sizeof(line), fp) != NULL) { - if (strlen(line) > 128 + (22) /* 5 + 5 + 11 + 1 */) { - /*printf("Line too long!\n");*/ - continue; - } - - /* This line is taken from 2.6.15.4's proc line */ - sscanf(line, "%4d %4d %10llu %s", &major, &minor, - &blkcnt, device); - - if (strlen(device)) { - snprintf(realdev, sizeof(realdev), - "/dev/%s", device); - if (check_device(realdev, (char *)label, &qh) != 0) - continue; - - if (print) { - time_t timestamp = qh.qh_timestamp; - printf("%s:\n", realdev); - printf("\tMagic: %08x\n", qh.qh_magic); - printf("\tLabel: %s\n", qh.qh_cluster); - printf("\tCreated: %s", - ctime((time_t *)×tamp)); - printf("\tHost: %s\n\n", qh.qh_updatehost); - } - - if (devname && devlen) { - /* Got it */ - strncpy(devname, realdev, devlen); - fclose(fp); - return 0; + while (n--) { + /* filter out: + * . and .. + * .static and .udev that are typical udev dirs that we don't want to scan + */ + if (strcmp(namelist[n]->d_name, ".") && + strcmp(namelist[n]->d_name, "..") && + strcmp(namelist[n]->d_name, ".static") && + strcmp(namelist[n]->d_name, ".udev")) { + snprintf(newpath, sizeof(newpath), "%s/%s", devdir, namelist[n]->d_name); + if (!lstat(newpath, &sb)) { + /* dive into directories */ + if (S_ISDIR(sb.st_mode)) { + if (!find_partitions(newpath, label, devname, devlen, print)) { + if (devname && (strlen(devname) > 0)) + return 0; + } + } + /* check if it's a block device */ + if (S_ISBLK(sb.st_mode)) { + if (!check_device(newpath, (char *)label, &qh)) { + if (print) { + time_t timestamp = qh.qh_timestamp; + printf("%s:\n", newpath); + printf("\tMagic: %08x\n", qh.qh_magic); + printf("\tLabel: %s\n", qh.qh_cluster); + printf("\tCreated: %s", + ctime((time_t *)×tamp)); + printf("\tHost: %s\n\n", qh.qh_updatehost); + } + + if (devname && devlen) { + strncpy(devname, newpath, devlen); + return 0; + } + } + } } } + free(namelist[n]); } - fclose(fp); - - if (print) - /* No errors if we're just printing stuff */ - return 0; - errno = ENOENT; return -1; }