From 5c5d89f985603556c781b256b91e545d92a00f5d Mon Sep 17 00:00:00 2001
From: "robert.read" <robert.read>
Date: Wed, 6 Aug 2008 00:20:22 +0000
Subject: [PATCH] Land b_head_libcfs onto HEAD (20080805_1715)

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.
---
 lnet/include/lnet/lnetctl.h |  12 -
 lnet/lnet/router.c          |   1 -
 lnet/selftest/selftest.h    |  18 +-
 lnet/utils/Makefile.am      |  15 +-
 lnet/utils/debug.c          |  14 +-
 lnet/utils/debugctl.c       |   3 +-
 lnet/utils/genlib.sh        |   1 +
 lnet/utils/l_ioctl.c        | 358 --------------------
 lnet/utils/lst.c            |   2 +-
 lnet/utils/parser.c         | 656 ------------------------------------
 lnet/utils/parser.h         | 103 ------
 lnet/utils/portals.c        |   3 +-
 lnet/utils/ptlctl.c         |   4 +-
 13 files changed, 14 insertions(+), 1176 deletions(-)
 delete mode 100644 lnet/utils/l_ioctl.c
 delete mode 100644 lnet/utils/parser.c
 delete mode 100644 lnet/utils/parser.h

diff --git a/lnet/include/lnet/lnetctl.h b/lnet/include/lnet/lnetctl.h
index 07b27976f2..5b58e2afc6 100644
--- a/lnet/include/lnet/lnetctl.h
+++ b/lnet/include/lnet/lnetctl.h
@@ -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);
 
-/* 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
diff --git a/lnet/lnet/router.c b/lnet/lnet/router.c
index bc7bd71dd0..1be457b5ed 100644
--- a/lnet/lnet/router.c
+++ b/lnet/lnet/router.c
@@ -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. */
-                set_current_state(CFS_TASK_INTERRUPTIBLE);
                 cfs_schedule_timeout(CFS_TASK_INTERRUPTIBLE,
                                      cfs_time_seconds(1));
         }
diff --git a/lnet/selftest/selftest.h b/lnet/selftest/selftest.h
index 972acfcdaa..bd8677fa33 100644
--- a/lnet/selftest/selftest.h
+++ b/lnet/selftest/selftest.h
@@ -1,3 +1,4 @@
+
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
@@ -49,23 +50,6 @@
 #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>
diff --git a/lnet/utils/Makefile.am b/lnet/utils/Makefile.am
index 4dd8eacd6c..51de201cd6 100644
--- a/lnet/utils/Makefile.am
+++ b/lnet/utils/Makefile.am
@@ -38,11 +38,13 @@
 #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
 
-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
 
@@ -55,7 +57,7 @@ noinst_LIBRARIES += liblst.a
 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
@@ -76,17 +78,17 @@ gmlndnid_LDFLAGS = -static
 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
-debugctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE)
+debugctl_LDADD = -L. -lptlctl $(LIBCFSUTIL) $(LIBREADLINE) $(LIBEFENCE)
 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 =
@@ -107,7 +109,4 @@ lstclient_LDADD = -L. -lptlctl -llst $(LIBREADLINE) $(LIBEFENCE) $(PTHREAD_LIBS)
 lstclient_DEPENDENCIES = libptlctl.a liblst.a
 endif
 
-nidstrings.c: @top_srcdir@/libcfs/libcfs/nidstrings.c
-	ln -sf $< $@
-
 EXTRA_DIST = genlib.sh
diff --git a/lnet/utils/debug.c b/lnet/utils/debug.c
index 832f5139b5..055bf95373 100644
--- a/lnet/utils/debug.c
+++ b/lnet/utils/debug.c
@@ -66,10 +66,9 @@
 #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 "parser.h"
 
 #include <time.h>
 
@@ -100,17 +99,6 @@ static const char *libcfs_debug_masks[] =
          "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"
diff --git a/lnet/utils/debugctl.c b/lnet/utils/debugctl.c
index fafb7e93c1..cade3ebba4 100644
--- a/lnet/utils/debugctl.c
+++ b/lnet/utils/debugctl.c
@@ -24,9 +24,8 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
-#include "parser.h"
+#include <libcfs/libcfsutil.h>
 
 
 command_t list[] = {
diff --git a/lnet/utils/genlib.sh b/lnet/utils/genlib.sh
index 1f4d24c4ec..4cb1bfccfb 100755
--- a/lnet/utils/genlib.sh
+++ b/lnet/utils/genlib.sh
@@ -26,6 +26,7 @@ build_obj_list() {
 
 # 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
diff --git a/lnet/utils/l_ioctl.c b/lnet/utils/l_ioctl.c
deleted file mode 100644
index 1058279c8c..0000000000
--- a/lnet/utils/l_ioctl.c
+++ /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;
-}
diff --git a/lnet/utils/lst.c b/lnet/utils/lst.c
index 1ffad4752e..b1e42aa5f5 100644
--- a/lnet/utils/lst.c
+++ b/lnet/utils/lst.c
@@ -49,7 +49,7 @@
 #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;
diff --git a/lnet/utils/parser.c b/lnet/utils/parser.c
deleted file mode 100644
index 986c1f8026..0000000000
--- a/lnet/utils/parser.c
+++ /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
index e634705d4d..0000000000
--- a/lnet/utils/parser.h
+++ /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
diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c
index 4ba907f1c5..eb81727c13 100644
--- a/lnet/utils/portals.c
+++ b/lnet/utils/portals.c
@@ -46,11 +46,10 @@
 #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 "parser.h"
 
 unsigned int libcfs_debug;
 unsigned int libcfs_printk = D_CANTMASK;
diff --git a/lnet/utils/ptlctl.c b/lnet/utils/ptlctl.c
index 0ecfad25aa..1482dcac6d 100644
--- a/lnet/utils/ptlctl.c
+++ b/lnet/utils/ptlctl.c
@@ -22,10 +22,8 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <lnet/api-support.h>
 #include <lnet/lnetctl.h>
-
-#include "parser.h"
+#include <libcfs/libcfsutil.h>
 
 
 command_t list[] = {
-- 
GitLab