Whamcloud - gitweb
Land b_head_libcfs onto HEAD (20080805_1715)
authorrobert.read <robert.read>
Wed, 6 Aug 2008 00:20:22 +0000 (00:20 +0000)
committerrobert.read <robert.read>
Wed, 6 Aug 2008 00:20:22 +0000 (00:20 +0000)
b=16620
i=adilger
i=shadow
i=isaac

First stage of Libcfs cleanup. This landing includes the patches from bugs
16159, 16420, 16445, 16478, and 16479.

13 files changed:
lnet/include/lnet/lnetctl.h
lnet/lnet/router.c
lnet/selftest/selftest.h
lnet/utils/Makefile.am
lnet/utils/debug.c
lnet/utils/debugctl.c
lnet/utils/genlib.sh
lnet/utils/l_ioctl.c [deleted file]
lnet/utils/lst.c
lnet/utils/parser.c [deleted file]
lnet/utils/parser.h [deleted file]
lnet/utils/portals.c
lnet/utils/ptlctl.c

index 07b2797..5b58e2a 100644 (file)
@@ -78,16 +78,4 @@ int jt_dbg_mark_debug_buf(int argc, char **argv);
 int jt_dbg_modules(int argc, char **argv);
 int jt_dbg_panic(int argc, char **argv);
 
 int jt_dbg_modules(int argc, char **argv);
 int jt_dbg_panic(int argc, char **argv);
 
-/* l_ioctl.c */
-typedef int (ioc_handler_t)(int dev_id, unsigned int opc, void *buf);
-void set_ioc_handler(ioc_handler_t *handler);
-int register_ioc_dev(int dev_id, const char * dev_name, int major, int minor);
-void unregister_ioc_dev(int dev_id);
-int set_ioctl_dump(char * file);
-int l_ioctl(int dev_id, unsigned int opc, void *buf);
-int parse_dump(char * dump_file, ioc_handler_t ioc_func);
-int jt_ioc_dump(int argc, char **argv);
-extern char *dump_filename;
-int dump(int dev_id, unsigned int opc, void *buf);
-
 #endif
 #endif
index bc7bd71..1be457b 100644 (file)
@@ -705,7 +705,6 @@ rescan:
                 /* Call cfs_pause() here always adds 1 to load average 
                  * because kernel counts # active tasks as nr_running 
                  * + nr_uninterruptible. */
                 /* Call cfs_pause() here always adds 1 to load average 
                  * because kernel counts # active tasks as nr_running 
                  * + nr_uninterruptible. */
-                set_current_state(CFS_TASK_INTERRUPTIBLE);
                 cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
                                      cfs_time_seconds(1));
         }
                 cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
                                      cfs_time_seconds(1));
         }
index 972acfc..bd8677f 100644 (file)
@@ -1,3 +1,4 @@
+
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
 #endif
 
-/* TODO: remove these when libcfs provides proper primitives for userspace
- *
- * Dummy implementations of spinlock_t and atomic_t work since userspace
- * selftest is completely single-threaded, even using multi-threaded usocklnd.
- */
-typedef struct { } spinlock_t;
-static inline void spin_lock(spinlock_t *l) {return;}
-static inline void spin_unlock(spinlock_t *l) {return;}
-static inline void spin_lock_init(spinlock_t *l) {return;}
-
-typedef struct { volatile int counter; } atomic_t;
-#define atomic_read(a) ((a)->counter)
-#define atomic_set(a,b) do {(a)->counter = b; } while (0)
-#define atomic_dec_and_test(a) ((--((a)->counter)) == 0)
-#define atomic_inc(a)  (((a)->counter)++)
-#define atomic_dec(a)  do { (a)->counter--; } while (0)
-
 #endif
 #include <libcfs/libcfs.h>
 #include <lnet/lnet.h>
 #endif
 #include <libcfs/libcfs.h>
 #include <lnet/lnet.h>
index 4dd8eac..51de201 100644 (file)
 #COMPILE = $(CC) -Wall -g -I$(srcdir)/../include -I../../include
 #LINK = $(CC) -o $@
 
 #COMPILE = $(CC) -Wall -g -I$(srcdir)/../include -I../../include
 #LINK = $(CC) -o $@
 
+LIBCFSUTIL= $(top_builddir)/libcfs/libcfs/libcfsutil.a
+
 if LIBLUSTRE
 noinst_LIBRARIES = libuptlctl.a
 endif
 
 if LIBLUSTRE
 noinst_LIBRARIES = libuptlctl.a
 endif
 
-libuptlctl_a_SOURCES = portals.c nidstrings.c debug.c l_ioctl.c
+libuptlctl_a_SOURCES = portals.c debug.c
 libuptlctl_a_CPPFLAGS = $(LLCPPFLAGS)
 libuptlctl_a_CFLAGS = $(LLCFLAGS) -DLUSTRE_UTILS=1
 
 libuptlctl_a_CPPFLAGS = $(LLCPPFLAGS)
 libuptlctl_a_CFLAGS = $(LLCFLAGS) -DLUSTRE_UTILS=1
 
@@ -55,7 +57,7 @@ noinst_LIBRARIES += liblst.a
 liblst_a_SOURCES =
 endif
 
 liblst_a_SOURCES =
 endif
 
-libptlctl_a_SOURCES = portals.c nidstrings.c debug.c l_ioctl.c parser.c parser.h
+libptlctl_a_SOURCES = portals.c debug.c
 
 if UTILS
 sbin_PROGRAMS += ptlctl routerstat wirecheck lst
 
 if UTILS
 sbin_PROGRAMS += ptlctl routerstat wirecheck lst
@@ -76,17 +78,17 @@ gmlndnid_LDFLAGS = -static
 gmlndnid_LDADD = $(GMLIBS) -lgm
 
 ptlctl_SOURCES = ptlctl.c
 gmlndnid_LDADD = $(GMLIBS) -lgm
 
 ptlctl_SOURCES = ptlctl.c
-ptlctl_LDADD =  -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE)
+ptlctl_LDADD =  -L. -lptlctl $(LIBCFSUTIL) $(LIBREADLINE) $(LIBEFENCE)
 ptlctl_DEPENDENCIES = libptlctl.a
 
 routerstat_SOURCES = routerstat.c
 
 debugctl_SOURCES = debugctl.c
 ptlctl_DEPENDENCIES = libptlctl.a
 
 routerstat_SOURCES = routerstat.c
 
 debugctl_SOURCES = debugctl.c
-debugctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE)
+debugctl_LDADD = -L. -lptlctl $(LIBCFSUTIL) $(LIBREADLINE) $(LIBEFENCE)
 debugctl_DEPENDENCIES = libptlctl.a
 
 lst_SOURCES = lst.c
 debugctl_DEPENDENCIES = libptlctl.a
 
 lst_SOURCES = lst.c
-lst_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE)
+lst_LDADD = -L. -lptlctl $(LIBCFSUTIL) $(LIBREADLINE) $(LIBEFENCE)
 lst_DEPENDENCIES = libptlctl.a
 
 LND_LIBS =
 lst_DEPENDENCIES = libptlctl.a
 
 LND_LIBS =
@@ -107,7 +109,4 @@ lstclient_LDADD = -L. -lptlctl -llst $(LIBREADLINE) $(LIBEFENCE) $(PTHREAD_LIBS)
 lstclient_DEPENDENCIES = libptlctl.a liblst.a
 endif
 
 lstclient_DEPENDENCIES = libptlctl.a liblst.a
 endif
 
-nidstrings.c: @top_srcdir@/libcfs/libcfs/nidstrings.c
-       ln -sf $< $@
-
 EXTRA_DIST = genlib.sh
 EXTRA_DIST = genlib.sh
index 832f513..055bf95 100644 (file)
 #include <sys/mman.h>
 #include <sys/utsname.h>
 
 #include <sys/mman.h>
 #include <sys/utsname.h>
 
-#include <lnet/api-support.h>
+#include <libcfs/libcfsutil.h>
 #include <lnet/lnetctl.h>
 #include <libcfs/portals_utils.h>
 #include <lnet/lnetctl.h>
 #include <libcfs/portals_utils.h>
-#include "parser.h"
 
 #include <time.h>
 
 
 #include <time.h>
 
@@ -100,17 +99,6 @@ static const char *libcfs_debug_masks[] =
          "rpctrace", "vfstrace", "reada", "mmap",
          "config", "console", "quota", "sec", NULL};
 
          "rpctrace", "vfstrace", "reada", "mmap",
          "config", "console", "quota", "sec", NULL};
 
-struct debug_daemon_cmd {
-        char *cmd;
-        unsigned int cmdv;
-};
-
-static const struct debug_daemon_cmd libcfs_debug_daemon_cmd[] = {
-        {"start", DEBUG_DAEMON_START},
-        {"stop", DEBUG_DAEMON_STOP},
-        {0, 0}
-};
-
 #ifdef __linux__
 
 #define DAEMON_CTL_NAME         "/proc/sys/lnet/daemon_file"
 #ifdef __linux__
 
 #define DAEMON_CTL_NAME         "/proc/sys/lnet/daemon_file"
index fafb7e9..cade3eb 100644 (file)
@@ -24,9 +24,8 @@
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
 #include <lnet/lnetctl.h>
-#include "parser.h"
+#include <libcfs/libcfsutil.h>
 
 
 command_t list[] = {
 
 
 command_t list[] = {
index 1f4d24c..4cb1bfc 100755 (executable)
@@ -26,6 +26,7 @@ build_obj_list() {
 
 # lnet components libs
 build_obj_list ../../libcfs/libcfs libcfs.a
 
 # lnet components libs
 build_obj_list ../../libcfs/libcfs libcfs.a
+build_obj_list ../../libcfs/libcfs libcfsutil.a
 if $(echo "$LND_LIBS" | grep "socklnd" >/dev/null) ; then
        build_obj_list ../../lnet/ulnds/socklnd libsocklnd.a
 fi
 if $(echo "$LND_LIBS" | grep "socklnd" >/dev/null) ; then
        build_obj_list ../../lnet/ulnds/socklnd libsocklnd.a
 fi
diff --git a/lnet/utils/l_ioctl.c b/lnet/utils/l_ioctl.c
deleted file mode 100644 (file)
index 1058279..0000000
+++ /dev/null
@@ -1,358 +0,0 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
- *
- *   This file is part of Portals, http://www.sf.net/projects/lustre/
- *
- *   Portals is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
- *
- *   Portals 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 Portals; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#define __USE_FILE_OFFSET64
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <sys/ioctl.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <lnet/api-support.h>
-#include <lnet/lnetctl.h>
-#include <libcfs/portals_utils.h>
-
-
-static ioc_handler_t  do_ioctl;                 /* forward ref */
-static ioc_handler_t *current_ioc_handler = &do_ioctl;
-
-struct ioc_dev {
-        const char * dev_name;
-        int dev_fd;
-        int dev_major;
-        int dev_minor;
-};
-
-static struct ioc_dev ioc_dev_list[10];
-
-struct dump_hdr {
-        int magic;
-        int dev_id;
-        unsigned int opc;
-};
-
-char *dump_filename;
-
-void
-set_ioc_handler (ioc_handler_t *handler)
-{
-        if (handler == NULL)
-                current_ioc_handler = do_ioctl;
-        else
-                current_ioc_handler = handler;
-}
-
-/* Catamount has no <linux/kdev_t.h>, so just define it here */
-#ifndef MKDEV
-# define MKDEV(a,b) (((a) << 8) | (b))
-#endif
-
-static int
-open_ioc_dev(int dev_id) 
-{
-        const char * dev_name;
-
-        if (dev_id < 0 || 
-            dev_id >= sizeof(ioc_dev_list) / sizeof(ioc_dev_list[0]))
-                return -EINVAL;
-
-        dev_name = ioc_dev_list[dev_id].dev_name;
-        if (dev_name == NULL) {
-                fprintf(stderr, "unknown device id: %d\n", dev_id);
-                return -EINVAL;
-        }
-
-        if (ioc_dev_list[dev_id].dev_fd < 0) {
-                int fd = open(dev_name, O_RDWR);
-
-                /* Make the /dev/ node if we need to */
-                if (fd < 0 && errno == ENOENT) {
-                        if (mknod(dev_name, 
-                                  S_IFCHR|S_IWUSR|S_IRUSR,
-                                  MKDEV(ioc_dev_list[dev_id].dev_major,
-                                        ioc_dev_list[dev_id].dev_minor)) == 0)
-                                fd = open(dev_name, O_RDWR);
-                        else
-                                fprintf(stderr, "mknod %s failed: %s\n",
-                                        dev_name, strerror(errno));
-                }
-
-                if (fd < 0) {
-                        fprintf(stderr, "opening %s failed: %s\n"
-                                "hint: the kernel modules may not be loaded\n",
-                                dev_name, strerror(errno));
-                        return fd;
-                }
-                ioc_dev_list[dev_id].dev_fd = fd;
-        }
-
-        return ioc_dev_list[dev_id].dev_fd;
-}
-
-
-static int 
-do_ioctl(int dev_id, unsigned int opc, void *buf)
-{
-        int fd, rc;
-        
-        fd = open_ioc_dev(dev_id);
-        if (fd < 0) 
-                return fd;
-
-        rc = ioctl(fd, opc, buf);
-        return rc;
-        
-}
-
-static FILE *
-get_dump_file() 
-{
-        FILE *fp = NULL;
-        
-        if (!dump_filename) {
-                fprintf(stderr, "no dump filename\n");
-        } else 
-                fp = fopen(dump_filename, "a");
-        return fp;
-}
-
-/*
- * The dump file should start with a description of which devices are
- * used, but for now it will assumed whatever app reads the file will
- * know what to do. */
-int 
-dump(int dev_id, unsigned int opc, void *buf)
-{
-        FILE *fp;
-        struct dump_hdr dump_hdr;
-        struct libcfs_ioctl_hdr * ioc_hdr = (struct  libcfs_ioctl_hdr *) buf;
-        int rc;
-        
-        printf("dumping opc %x to %s\n", opc, dump_filename);
-        
-
-        dump_hdr.magic = 0xdeadbeef;
-        dump_hdr.dev_id = dev_id;
-        dump_hdr.opc = opc;
-
-        fp = get_dump_file();
-        if (fp == NULL) {
-                fprintf(stderr, "%s: %s\n", dump_filename, 
-                        strerror(errno));
-                return -EINVAL;
-        }
-        
-        rc = fwrite(&dump_hdr, sizeof(dump_hdr), 1, fp);
-        if (rc == 1)
-                rc = fwrite(buf, ioc_hdr->ioc_len, 1, fp);
-        fclose(fp);
-        if (rc != 1) {
-                fprintf(stderr, "%s: %s\n", dump_filename,
-                        strerror(errno));
-                return -EINVAL;
-        }
-
-        return 0;
-}
-
-/* register a device to send ioctls to.  */
-int 
-register_ioc_dev(int dev_id, const char * dev_name, int major, int minor) 
-{
-
-        if (dev_id < 0 || 
-            dev_id >= sizeof(ioc_dev_list) / sizeof(ioc_dev_list[0]))
-                return -EINVAL;
-
-        unregister_ioc_dev(dev_id);
-
-        ioc_dev_list[dev_id].dev_name = dev_name;
-        ioc_dev_list[dev_id].dev_fd = -1;
-        ioc_dev_list[dev_id].dev_major = major;
-        ioc_dev_list[dev_id].dev_minor = minor;
-        return dev_id;
-}
-
-void
-unregister_ioc_dev(int dev_id) 
-{
-
-        if (dev_id < 0 || 
-            dev_id >= sizeof(ioc_dev_list) / sizeof(ioc_dev_list[0]))
-                return;
-        if (ioc_dev_list[dev_id].dev_name != NULL &&
-            ioc_dev_list[dev_id].dev_fd >= 0) 
-                close(ioc_dev_list[dev_id].dev_fd);
-
-        ioc_dev_list[dev_id].dev_name = NULL;
-        ioc_dev_list[dev_id].dev_fd = -1;
-}
-
-/* If this file is set, then all ioctl buffers will be 
-   appended to the file. */
-int
-set_ioctl_dump(char * file)
-{
-        if (dump_filename)
-                free(dump_filename);
-        
-        dump_filename = strdup(file);
-        if (dump_filename == NULL)
-                abort();
-
-        set_ioc_handler(&dump);
-        return 0;
-}
-
-int
-l_ioctl(int dev_id, unsigned int opc, void *buf)
-{
-        return current_ioc_handler(dev_id, opc, buf);
-}
-
-/* Read an ioctl dump file, and call the ioc_func for each ioctl buffer
- * in the file.  For example:
- *
- * parse_dump("lctl.dump", l_ioctl);
- *
- * Note: if using l_ioctl, then you also need to register_ioc_dev() for 
- * each device used in the dump.
- */
-int 
-parse_dump(char * dump_file, ioc_handler_t ioc_func)
-{
-        int line =0;
-        struct stat st;
-        char *start, *buf, *end;
-#ifndef __CYGWIN__
-        int fd;
-#else
-        HANDLE fd, hmap;
-        DWORD size;
-#endif
-        
-#ifndef __CYGWIN__
-        fd = syscall(SYS_open, dump_file, O_RDONLY);
-        if (fd < 0) {
-                fprintf(stderr, "couldn't open %s: %s\n", dump_file, 
-                        strerror(errno));
-                exit(1);
-        }
-
-        if (fstat(fd, &st)) { 
-                perror("stat fails");
-                exit(1);
-        }
-
-        if (st.st_size < 1) {
-                fprintf(stderr, "KML is empty\n");
-                exit(1);
-        }
-
-        start = buf = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE , fd, 0);
-        end = start + st.st_size;
-        close(fd);
-        if (start == MAP_FAILED) {
-                fprintf(stderr, "can't create file mapping\n");
-                exit(1);
-        }
-#else
-        fd = CreateFile(dump_file, GENERIC_READ, FILE_SHARE_READ, NULL,
-                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-        size = GetFileSize(fd, NULL);
-        if (size < 1) {
-                fprintf(stderr, "KML is empty\n");
-                exit(1);
-        }
-
-        hmap = CreateFileMapping(fd, NULL, PAGE_READONLY, 0,0, NULL);
-        start = buf = MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 0);
-        end = buf + size;
-        CloseHandle(fd);
-        if (start == NULL) {
-                fprintf(stderr, "can't create file mapping\n");
-                exit(1);
-        }
-#endif /* __CYGWIN__ */
-
-        while (buf < end) {
-                struct dump_hdr *dump_hdr = (struct dump_hdr *) buf;
-                struct libcfs_ioctl_hdr * data;
-                char tmp[8096];
-                int rc;
-
-                line++;
-
-                data = (struct libcfs_ioctl_hdr *) (buf + sizeof(*dump_hdr));
-                if (buf + data->ioc_len > end ) {
-                        fprintf(stderr, "dump file overflow, %p + %d > %p\n", buf,
-                                data->ioc_len, end);
-                        return -1;
-                }
-#if 0
-                printf ("dump_hdr: %lx data: %lx\n",
-                        (unsigned long)dump_hdr - (unsigned long)buf, (unsigned long)data - (unsigned long)buf);
-
-                printf("%d: opcode %x len: %d  ver: %x ", line, dump_hdr->opc,
-                       data->ioc_len, data->ioc_version);
-#endif
-
-                memcpy(tmp, data, data->ioc_len);
-
-                rc = ioc_func(dump_hdr->dev_id, dump_hdr->opc, tmp);
-                if (rc) {
-                        printf("failed: %d\n", rc);
-                        exit(1);
-                }
-
-                buf += data->ioc_len + sizeof(*dump_hdr);
-        }
-
-#ifndef __CYGWIN__
-        munmap(start, end - start);
-#else
-        UnmapViewOfFile(start);
-        CloseHandle(hmap);
-#endif
-
-        return 0;
-}
-
-int 
-jt_ioc_dump(int argc, char **argv)
-{
-        if (argc > 2) {
-                fprintf(stderr, "usage: %s [hostname]\n", argv[0]);
-                return 0;
-        }
-        printf("setting dumpfile to: %s\n", argv[1]);
-        
-        set_ioctl_dump(argv[1]);
-        return 0;
-}
index 1ffad47..b1e42aa 100644 (file)
@@ -49,7 +49,7 @@
 #include <pwd.h>
 #include <lnet/lnetctl.h>
 #include <lnet/lnetst.h>
 #include <pwd.h>
 #include <lnet/lnetctl.h>
 #include <lnet/lnetst.h>
-#include "parser.h"
+#include <libcfs/libcfsutil.h>
 
 static command_t           lst_cmdlist[];
 static lst_sid_t           session_id;
 
 static command_t           lst_cmdlist[];
 static lst_sid_t           session_id;
diff --git a/lnet/utils/parser.c b/lnet/utils/parser.c
deleted file mode 100644 (file)
index 986c1f8..0000000
+++ /dev/null
@@ -1,656 +0,0 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * 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 version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <assert.h>
-#include <lnet/api-support.h>
-
-#include "parser.h"
-
-static command_t * top_level;      /* Top level of commands, initialized by
-                                    * InitParser                            */
-static char * parser_prompt = NULL;/* Parser prompt, set by InitParser      */
-static int done;                  /* Set to 1 if user types exit or quit   */
-
-
-/* static functions */
-static char *skipwhitespace(char *s);
-static char *skiptowhitespace(char *s);
-static command_t *find_cmd(char *name, command_t cmds[], char **next);
-static int process(char *s, char **next, command_t *lookup, command_t **result,
-                   char **prev);
-static void print_commands(char *str, command_t *table);
-
-static char * skipwhitespace(char * s)
-{
-    char * t;
-    int    len;
-
-    len = (int)strlen(s);
-    for (t = s; t <= s + len && isspace(*t); t++);
-    return(t);
-}
-
-
-static char * skiptowhitespace(char * s)
-{
-    char * t;
-
-    for (t = s; *t && !isspace(*t); t++);
-    return(t);
-}
-
-static int line2args(char *line, char **argv, int maxargs)
-{
-    char *arg;
-    int i = 0;
-
-    arg = strtok(line, " \t");
-    if ( arg ) {
-            argv[i] = arg;
-       i++;
-    } else
-       return 0;
-
-    while( (arg = strtok(NULL, " \t")) && (i <= maxargs)) {
-       argv[i] = arg;
-       i++;
-    }
-    return i;
-}
-
-/* find a command -- return it if unique otherwise print alternatives */
-static command_t *Parser_findargcmd(char *name, command_t cmds[])
-{
-       command_t *cmd;
-
-       for (cmd = cmds; cmd->pc_name; cmd++) {
-               if (strcmp(name, cmd->pc_name) == 0)
-                       return cmd;
-       }
-       return NULL;
-}
-
-int Parser_execarg(int argc, char **argv, command_t cmds[])
-{
-       command_t *cmd;
-
-        cmd = Parser_findargcmd(argv[0], cmds);
-       if ( cmd ) {
-                int rc = (cmd->pc_func)(argc, argv);
-                if (rc == CMD_HELP)
-                        fprintf(stderr, "%s\n", cmd->pc_help);
-                return rc;
-       } else {
-               printf("Try interactive use without arguments or use one of:\n");
-               for (cmd = cmds; cmd->pc_name; cmd++)
-                       printf("\"%s\" ", cmd->pc_name);
-               printf("\nas argument.\n");
-       }
-       return -1;
-}
-
-/* returns the command_t * (NULL if not found) corresponding to a
-   _partial_ match with the first token in name.  It sets *next to
-   point to the following token. Does not modify *name. */
-static command_t * find_cmd(char * name, command_t cmds[], char ** next)
-{
-        int    i, len;
-    
-        if (!cmds || !name ) 
-                return NULL;
-    
-        /* This sets name to point to the first non-white space character,
-           and next to the first whitespace after name, len to the length: do
-           this with strtok*/
-        name = skipwhitespace(name);
-        *next = skiptowhitespace(name);
-        len = *next - name;
-        if (len == 0) 
-                return NULL;
-
-        for (i = 0; cmds[i].pc_name; i++) {
-                if (strncasecmp(name, cmds[i].pc_name, len) == 0) {
-                        *next = skipwhitespace(*next);
-                        return(&cmds[i]);
-                }
-        }
-        return NULL;
-}
-
-/* Recursively process a command line string s and find the command
-   corresponding to it. This can be ambiguous, full, incomplete,
-   non-existent. */
-static int process(char *s, char ** next, command_t *lookup,
-                  command_t **result, char **prev)
-{
-    *result = find_cmd(s, lookup, next);
-    *prev = s;
-
-        /* non existent */
-        if ( ! *result ) 
-                return CMD_NONE;
-
-        /* found entry: is it ambigous, i.e. not exact command name and
-           more than one command in the list matches.  Note that find_cmd
-           points to the first ambiguous entry */
-        if ( strncasecmp(s, (*result)->pc_name, strlen((*result)->pc_name)) &&
-             find_cmd(s, (*result) + 1, next)) 
-                return CMD_AMBIG;
-
-        /* found a unique command: component or full? */
-        if ( (*result)->pc_func ) {
-                return CMD_COMPLETE;
-        } else {
-                if ( *next == '\0' ) {
-                        return CMD_INCOMPLETE;
-                } else {
-                        return process(*next, next, (*result)->pc_sub_cmd, result, prev);
-                }
-        }
-}
-
-#ifdef HAVE_LIBREADLINE
-static command_t * match_tbl;   /* Command completion against this table */
-static char * command_generator(const char * text, int state)
-{
-        static int index,
-                len;
-        char       *name;
-
-        /* Do we have a match table? */
-        if (!match_tbl)
-                return NULL;
-
-        /* If this is the first time called on this word, state is 0 */
-        if (!state) {
-                index = 0;
-                len = (int)strlen(text);
-        }
-
-        /* Return next name in the command list that paritally matches test */
-        while ( (name = (match_tbl + index)->pc_name) ) {
-                index++;
-
-                if (strncasecmp(name, text, len) == 0) {
-                        return(strdup(name));
-                }
-        }
-
-    /* No more matches */
-    return NULL;
-}
-
-/* probably called by readline */
-static char **command_completion(char * text, int start, int end)
-{
-    command_t  * table;
-    char       * pos;
-
-    match_tbl = top_level;
-    
-    for (table = find_cmd(rl_line_buffer, match_tbl, &pos);
-        table; table = find_cmd(pos, match_tbl, &pos)) 
-    {
-
-       if (*(pos - 1) == ' ') match_tbl = table->pc_sub_cmd;
-    }
-
-    return completion_matches(text, command_generator);
-}
-#endif
-
-/* take a string and execute the function or print help */
-int execute_line(char * line)
-{
-        command_t         *cmd, *ambig;
-        char *prev;
-        char *next, *tmp;
-        char *argv[MAXARGS];
-        int         i;
-        int rc = 0;
-
-        switch( process(line, &next, top_level, &cmd, &prev) ) {
-        case CMD_AMBIG:
-                fprintf(stderr, "Ambiguous command \'%s\'\nOptions: ", line);
-                while( (ambig = find_cmd(prev, cmd, &tmp)) ) {
-                        fprintf(stderr, "%s ", ambig->pc_name);
-                        cmd = ambig + 1;
-                }
-                fprintf(stderr, "\n");
-                break;
-        case CMD_NONE:
-                fprintf(stderr, "No such command, type help\n");
-                break;
-        case CMD_INCOMPLETE:
-                fprintf(stderr,
-                        "'%s' incomplete command.  Use '%s x' where x is one of:\n",
-                        line, line);
-                fprintf(stderr, "\t");
-                for (i = 0; cmd->pc_sub_cmd[i].pc_name; i++) {
-                        fprintf(stderr, "%s ", cmd->pc_sub_cmd[i].pc_name);
-                }
-                fprintf(stderr, "\n");
-                break;
-        case CMD_COMPLETE:
-                i = line2args(line, argv, MAXARGS);
-                rc = (cmd->pc_func)(i, argv);
-
-                if (rc == CMD_HELP)
-                        fprintf(stderr, "%s\n", cmd->pc_help);
-
-                break;
-        }
-
-        return rc;
-}
-
-int
-noop_fn ()
-{
-        return (0);
-}
-
-/* just in case you're ever in an airplane and discover you 
-   forgot to install readline-dev. :) */
-int init_input() 
-{
-        int   interactive = isatty (fileno (stdin));
-
-#ifdef HAVE_LIBREADLINE
-        using_history();
-        stifle_history(HISTORY);
-
-        if (!interactive)
-        {
-                rl_prep_term_function = (rl_vintfunc_t *)noop_fn;
-                rl_deprep_term_function = (rl_voidfunc_t *)noop_fn;
-        }
-
-        rl_attempted_completion_function = (CPPFunction *)command_completion;
-        rl_completion_entry_function = (void *)command_generator;
-#endif 
-        return interactive;
-}
-
-#ifndef HAVE_LIBREADLINE
-#define add_history(s)
-char * readline(char * prompt) 
-{
-        char line[2048];
-        int n = 0;
-        if (prompt)
-                printf ("%s", prompt);
-        if (fgets(line, sizeof(line), stdin) == NULL)
-                return (NULL);
-        n = strlen(line);
-        if (n && line[n-1] == '\n')
-                line[n-1] = '\0';
-        return strdup(line);
-}
-#endif
-
-/* this is the command execution machine */
-int Parser_commands(void)
-{
-        char *line, *s;
-        int rc = 0;
-        int interactive;
-        
-        interactive = init_input();
-
-        while(!done) {
-                line = readline(interactive ? parser_prompt : NULL);
-
-                if (!line) break;
-
-                s = skipwhitespace(line);
-
-                if (*s) {
-                        add_history(s);
-                        rc = execute_line(s);
-
-                        /* reset optind to 0 to tell getopt
-                         * to reinitialize itself */
-                        optind = 0;
-                }
-                
-                free(line);
-        }
-        return rc;
-}
-
-
-/* sets the parser prompt */
-void Parser_init(char * prompt, command_t * cmds)
-{
-    done = 0;
-    top_level = cmds;
-    if (parser_prompt) free(parser_prompt);
-    parser_prompt = strdup(prompt);
-}
-
-/* frees the parser prompt */
-void Parser_exit(int argc, char *argv[])
-{
-    done = 1;
-    free(parser_prompt);
-    parser_prompt = NULL;
-}
-
-/* convert a string to an integer */
-int Parser_int(char *s, int *val)
-{
-    int ret;
-
-    if (*s != '0')
-       ret = sscanf(s, "%d", val);
-    else if (*(s+1) != 'x')
-       ret = sscanf(s, "%o", val);
-    else {
-       s++;
-       ret = sscanf(++s, "%x", val);
-    }
-
-    return(ret);
-}
-
-
-void Parser_qhelp(int argc, char *argv[]) {
-
-    printf("Available commands are:\n");
-
-    print_commands(NULL, top_level);
-    printf("For more help type: help command-name\n");
-}
-
-int Parser_help(int argc, char **argv) 
-{
-        char line[1024];
-        char *next, *prev, *tmp;
-        command_t *result, *ambig;
-        int i;
-
-        if ( argc == 1 ) {
-                Parser_qhelp(argc, argv);
-                return 0;
-        }
-
-        line[0]='\0';
-        for ( i = 1 ;  i < argc ; i++ ) {
-                strcat(line, argv[i]);
-        }
-
-        switch ( process(line, &next, top_level, &result, &prev) ) {
-        case CMD_COMPLETE:
-                fprintf(stderr, "%s: %s\n",line, result->pc_help);
-                break;
-        case CMD_NONE:
-                fprintf(stderr, "%s: Unknown command.\n", line);
-                break;
-        case CMD_INCOMPLETE:
-                fprintf(stderr,
-                        "'%s' incomplete command.  Use '%s x' where x is one of:\n",
-                        line, line);
-                fprintf(stderr, "\t");
-                for (i = 0; result->pc_sub_cmd[i].pc_name; i++) {
-                        fprintf(stderr, "%s ", result->pc_sub_cmd[i].pc_name);
-                }
-                fprintf(stderr, "\n");
-                break;
-        case CMD_AMBIG:
-                fprintf(stderr, "Ambiguous command \'%s\'\nOptions: ", line);
-                while( (ambig = find_cmd(prev, result, &tmp)) ) {
-                        fprintf(stderr, "%s ", ambig->pc_name);
-                        result = ambig + 1;
-                }
-                fprintf(stderr, "\n");
-                break;
-        }
-        return 0;
-}  
-
-
-void Parser_printhelp(char *cmd)
-{
-        char *argv[] = { "help", cmd }; 
-        Parser_help(2, argv);
-}
-
-/*************************************************************************
- * COMMANDS                                                             *
- *************************************************************************/
-
-
-static void print_commands(char * str, command_t * table) {
-    command_t * cmds;
-    char       buf[80];
-
-    for (cmds = table; cmds->pc_name; cmds++) {
-       if (cmds->pc_func) {
-           if (str) printf("\t%s %s\n", str, cmds->pc_name);
-           else printf("\t%s\n", cmds->pc_name);
-       }
-       if (cmds->pc_sub_cmd) {
-           if (str) {
-               sprintf(buf, "%s %s", str, cmds->pc_name);
-               print_commands(buf, cmds->pc_sub_cmd);
-           } else {
-               print_commands(cmds->pc_name, cmds->pc_sub_cmd);
-           }
-       }
-    }
-}
-
-char *Parser_getstr(const char *prompt, const char *deft, char *res,
-                   size_t len)
-{
-    char *line = NULL;
-    int size = strlen(prompt) + strlen(deft) + 8;
-    char *theprompt;
-    theprompt = malloc(size);
-    assert(theprompt);
-
-    sprintf(theprompt, "%s [%s]: ", prompt, deft);
-
-    line  = readline(theprompt);
-    free(theprompt);
-
-    if ( line == NULL || *line == '\0' ) {
-       strncpy(res, deft, len);
-    } else {
-       strncpy(res, line, len);
-    }
-
-    if ( line ) {
-       free(line);
-       return res;
-    } else {
-       return NULL;
-    }
-}
-
-/* get integer from prompt, loop forever to get it */
-int Parser_getint(const char *prompt, long min, long max, long deft, int base)
-{
-    int rc;
-    long result;
-    char *line;
-    int size = strlen(prompt) + 40;
-    char *theprompt = malloc(size);
-    assert(theprompt);
-    sprintf(theprompt,"%s [%ld, (0x%lx)]: ", prompt, deft, deft);
-
-    fflush(stdout);
-
-    do {
-       line = NULL;
-       line = readline(theprompt);
-       if ( !line ) {
-           fprintf(stdout, "Please enter an integer.\n");
-           fflush(stdout);
-           continue;
-       }
-       if ( *line == '\0' ) {
-           free(line);
-           result =  deft;
-           break;
-       }
-       rc = Parser_arg2int(line, &result, base);
-       free(line);
-       if ( rc != 0 ) {
-           fprintf(stdout, "Invalid string.\n");
-           fflush(stdout);
-       } else if ( result > max || result < min ) {
-           fprintf(stdout, "Error: response must lie between %ld and %ld.\n",
-                   min, max);
-           fflush(stdout);
-       } else {
-           break;
-       }
-    } while ( 1 ) ;
-
-    if (theprompt)
-       free(theprompt);
-    return result;
-
-}
-
-/* get boolean (starting with YyNn; loop forever */
-int Parser_getbool(const char *prompt, int deft)
-{
-    int result = 0;
-    char *line;
-    int size = strlen(prompt) + 8;
-    char *theprompt = malloc(size);
-    assert(theprompt);
-
-    fflush(stdout);
-
-    if ( deft != 0 && deft != 1 ) {
-       fprintf(stderr, "Error: Parser_getbool given bad default (%d).\n",
-               deft);
-       assert ( 0 );
-    }
-    sprintf(theprompt, "%s [%s]: ", prompt, (deft==0)? "N" : "Y");
-
-    do {
-       line = NULL;
-       line = readline(theprompt);
-       if ( line == NULL ) {
-           result = deft;
-           break;
-       }
-       if ( *line == '\0' ) {
-           result = deft;
-           break;
-       }
-       if ( *line == 'y' || *line == 'Y' ) {
-           result = 1;
-           break;
-       }
-       if ( *line == 'n' || *line == 'N' ) {
-           result = 0;
-           break;
-       }
-       if ( line )
-           free(line);
-       fprintf(stdout, "Invalid string. Must start with yY or nN\n");
-       fflush(stdout);
-    } while ( 1 );
-
-    if ( line )
-       free(line);
-    if ( theprompt )
-       free(theprompt);
-    return result;
-}
-
-/* parse int out of a string or prompt for it */
-long Parser_intarg(const char *inp, const char *prompt, int deft,
-                 int min, int max, int base)
-{
-    long result;
-    int rc;
-
-    rc = Parser_arg2int(inp, &result, base);
-
-    if ( rc == 0 ) {
-       return result;
-    } else {
-       return Parser_getint(prompt, deft, min, max, base);
-    }
-}
-
-/* parse int out of a string or prompt for it */
-char *Parser_strarg(char *inp, const char *prompt, const char *deft,
-                   char *answer, int len)
-{
-    if ( inp == NULL || *inp == '\0' ) {
-       return Parser_getstr(prompt, deft, answer, len);
-    } else
-       return inp;
-}
-
-/* change a string into a number: return 0 on success. No invalid characters
-   allowed. The processing of base and validity follows strtol(3)*/
-int Parser_arg2int(const char *inp, long *result, int base)
-{
-    char *endptr;
-
-    if ( (base !=0) && (base < 2 || base > 36) )
-       return 1;
-
-    *result = strtol(inp, &endptr, base);
-
-        if ( *inp != '\0' && *endptr == '\0' )
-                return 0;
-        else 
-                return 1;
-}
-
-int Parser_quit(int argc, char **argv)
-{
-        argc = argc;
-        argv = argv;
-        done = 1;
-        return 0;
-}
diff --git a/lnet/utils/parser.h b/lnet/utils/parser.h
deleted file mode 100644 (file)
index e634705..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
- * GPL HEADER START
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 only,
- * as published by the Free Software Foundation.
- *
- * 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 version 2 for more details (a copy is included
- * in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * GPL HEADER END
- */
-/*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
- * Use is subject to license terms.
- */
-/*
- * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
- */
-
-#ifndef _PARSER_H_
-#define _PARSER_H_
-
-#define HISTORY        100             /* Don't let history grow unbounded    */
-#define MAXARGS 512
-
-#define CMD_COMPLETE   0
-#define CMD_INCOMPLETE 1
-#define CMD_NONE       2
-#define CMD_AMBIG      3
-#define CMD_HELP       4
-
-typedef struct parser_cmd {
-       char    *pc_name;
-       int     (* pc_func)(int, char **);
-       struct parser_cmd * pc_sub_cmd;
-       char *pc_help;
-} command_t;
-
-typedef struct argcmd {
-       char    *ac_name;
-       int      (*ac_func)(int, char **);
-       char     *ac_help;
-} argcmd_t;
-
-typedef struct network {
-       char    *type;
-       char    *server;
-       int     port;
-} network_t;
-
-int  Parser_quit(int argc, char **argv);
-void Parser_init(char *, command_t *); /* Set prompt and load command list */
-int Parser_commands(void);                     /* Start the command parser */
-void Parser_qhelp(int, char **);       /* Quick help routine */
-int Parser_help(int, char **);         /* Detailed help routine */
-void Parser_printhelp(char *);         /* Detailed help routine */
-void Parser_exit(int, char **);                /* Shuts down command parser */
-int Parser_execarg(int argc, char **argv, command_t cmds[]);
-int execute_line(char * line);
-
-/* Converts a string to an integer */
-int Parser_int(char *, int *);
-
-/* Prompts for a string, with default values and a maximum length */
-char *Parser_getstr(const char *prompt, const char *deft, char *res, 
-                   size_t len);
-
-/* Prompts for an integer, with minimum, maximum and default values and base */
-int Parser_getint(const char *prompt, long min, long max, long deft,
-                 int base);
-
-/* Prompts for a yes/no, with default */
-int Parser_getbool(const char *prompt, int deft);
-
-/* Extracts an integer from a string, or prompts if it cannot get one */
-long Parser_intarg(const char *inp, const char *prompt, int deft,
-                  int min, int max, int base);
-
-/* Extracts a word from the input, or propmts if it cannot get one */
-char *Parser_strarg(char *inp, const char *prompt, const char *deft,
-                   char *answer, int len);
-
-/* Extracts an integer from a string  with a base */
-int Parser_arg2int(const char *inp, long *result, int base);
-
-#endif
index 4ba907f..eb81727 100644 (file)
 #include <endian.h>
 #endif
 
 #include <endian.h>
 #endif
 
-#include <libcfs/portals_utils.h>
+#include <libcfs/libcfsutil.h>
 #include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
 #include <lnet/socklnd.h>
 #include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
 #include <lnet/socklnd.h>
-#include "parser.h"
 
 unsigned int libcfs_debug;
 unsigned int libcfs_printk = D_CANTMASK;
 
 unsigned int libcfs_debug;
 unsigned int libcfs_printk = D_CANTMASK;
index 0ecfad2..1482dca 100644 (file)
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
 #include <lnet/lnetctl.h>
-
-#include "parser.h"
+#include <libcfs/libcfsutil.h>
 
 
 command_t list[] = {
 
 
 command_t list[] = {