Author: qboosh                       Date: Sat Nov  3 12:46:42 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- 
http://www.citi.umich.edu/projects/nfsv4/linux/nfs-utils-patches/1.1.1-1/nfs-utils-1.1.1-CITI_NFS4_ALL-1.dif
 with auto* parts removed

---- Files affected:
SOURCES:
   nfs-utils-CITI_NFS4.patch (1.5 -> 1.6) 

---- Diffs:

================================================================
Index: SOURCES/nfs-utils-CITI_NFS4.patch
diff -u SOURCES/nfs-utils-CITI_NFS4.patch:1.5 
SOURCES/nfs-utils-CITI_NFS4.patch:1.6
--- SOURCES/nfs-utils-CITI_NFS4.patch:1.5       Tue Aug 14 16:12:41 2007
+++ SOURCES/nfs-utils-CITI_NFS4.patch   Sat Nov  3 13:46:37 2007
@@ -2,570 +2,1658 @@
 
 The complete set of CITI nfs-utils patches rolled into one patch.
 
-Changes since 1.0.11-CITI_NFS4_ALL-1:
+Changes since 1.1.0-CITI_NFS4_ALL-2:
 
- * Update to nfs-utils-1.1.0
+ * Update to nfs-utils-1.1.1
 
- * Include patches from git not yet in a release:
-   - Fix mount error messages
+ * Patch from Steve Langasek <[EMAIL PROTECTED]> and
+   Steinar H. Gunderson <[EMAIL PROTECTED]> fixing segfault problem on
+   64-bit platforms introduced by the xlog cleanup (re-using va_list).
 
- * Update gssd usage message to include new -n option.
 
- * Patches from Bruce Fields to clean up compile warning, and
-   move pseudoflavor code to a common location
-
- * Patch from Bruce Fields and Fred Isaman that adds support
-   to exportfs for reading a sec= option and sending server
-   security data through cache via
-   "... secinfo n flavor1 flag1 ... flavorN flagN".
 
 
 ---
 
- nfs-utils-1.1.0-kwc/support/include/nfslib.h        |   10 +
- nfs-utils-1.1.0-kwc/support/include/pseudoflavors.h |   17 ++
- nfs-utils-1.1.0-kwc/support/nfs/exports.c           |  158 
++++++++++++++++++--
- nfs-utils-1.1.0-kwc/utils/exportfs/exportfs.c       |    1 
- nfs-utils-1.1.0-kwc/utils/gssd/gssd.c               |    2 
- nfs-utils-1.1.0-kwc/utils/mount/mount.c             |   40 ++++-
- nfs-utils-1.1.0-kwc/utils/mount/nfs4_mount.h        |   12 -
- nfs-utils-1.1.0-kwc/utils/mount/nfs4mount.c         |   27 ---
- nfs-utils-1.1.0-kwc/utils/mountd/cache.c            |   21 ++
- 10 files changed, 240 insertions(+), 49 deletions(-)
+-nfs-utils-1.1.1-kwc/aclocal.m4                  |  569 +++--------
+-nfs-utils-1.1.1-kwc/config.guess                |   34 
+-nfs-utils-1.1.1-kwc/config.sub                  |   24 
+-nfs-utils-1.1.1-kwc/configure                   | 1195 
++++++++++--------------
+-nfs-utils-1.1.1-kwc/ltmain.sh                   |  147 +-
+ nfs-utils-1.1.1-kwc/support/nfs/xlog.c          |    8 
+ nfs-utils-1.1.1-kwc/utils/gssd/context.h        |    6 
+ nfs-utils-1.1.1-kwc/utils/gssd/context_lucid.c  |  391 +++++++
+ nfs-utils-1.1.1-kwc/utils/gssd/context_mit.c    |  256 ++++-
+ nfs-utils-1.1.1-kwc/utils/gssd/gssd.c           |    8 
+ nfs-utils-1.1.1-kwc/utils/gssd/gssd.h           |    3 
+ nfs-utils-1.1.1-kwc/utils/gssd/gssd_main_loop.c |   20 
+ nfs-utils-1.1.1-kwc/utils/gssd/gssd_proc.c      |  119 +-
+ nfs-utils-1.1.1-kwc/utils/gssd/krb5_util.c      |  231 +++-
+ nfs-utils-1.1.1-kwc/utils/gssd/krb5_util.h      |    2 
+ nfs-utils-1.1.1-kwc/utils/gssd/svcgssd_proc.c   |   84 +
+ 16 files changed, 1786 insertions(+), 1311 deletions(-)
 
-diff -puN utils/mount/mount.c~CITI_NFS4_ALL utils/mount/mount.c
---- nfs-utils-1.1.0/utils/mount/mount.c~CITI_NFS4_ALL  2007-06-22 
10:51:38.885022000 -0400
-+++ nfs-utils-1.1.0-kwc/utils/mount/mount.c    2007-06-22 10:52:04.954241000 
-0400
-@@ -285,22 +285,49 @@ static void parse_opts (const char *opti
+diff -puN support/nfs/xlog.c~CITI_NFS4_ALL support/nfs/xlog.c
+--- nfs-utils-1.1.1/support/nfs/xlog.c~CITI_NFS4_ALL   2007-10-23 
14:17:18.316202000 -0400
++++ nfs-utils-1.1.1-kwc/support/nfs/xlog.c     2007-10-23 14:17:18.385133000 
-0400
+@@ -133,9 +133,13 @@ xlog_enabled(int fac)
+ void
+ xlog_backend(int kind, const char *fmt, va_list args)
+ {
++      va_list args2;
++
+       if (!(kind & (L_ALL)) && !(logging && (kind & logmask)))
+               return;
+ 
++      va_copy(args2, args);
++
+       if (log_syslog) {
+               switch (kind) {
+               case L_FATAL:
+@@ -172,10 +176,12 @@ xlog_backend(int kind, const char *fmt, 
+               fprintf(stderr, "%s: ", log_name);
+ #endif
+ 
+-              vfprintf(stderr, fmt, args);
++              vfprintf(stderr, fmt, args2);
+               fprintf(stderr, "\n");
        }
+ 
++      va_end(args2);
++
+       if (kind == L_FATAL)
+               exit(1);
  }
+diff -puN utils/gssd/svcgssd_proc.c~CITI_NFS4_ALL utils/gssd/svcgssd_proc.c
+--- nfs-utils-1.1.1/utils/gssd/svcgssd_proc.c~CITI_NFS4_ALL    2007-10-23 
14:17:18.488030000 -0400
++++ nfs-utils-1.1.1-kwc/utils/gssd/svcgssd_proc.c      2007-10-23 
14:17:18.505013000 -0400
+@@ -51,6 +51,7 @@
+ #include "gss_util.h"
+ #include "err_util.h"
+ #include "context.h"
++#include "gss_oids.h"
+ 
+ extern char * mech2file(gss_OID mech);
+ #define SVCGSSD_CONTEXT_CHANNEL "/proc/net/rpc/auth.rpcsec.context/channel"
+@@ -66,8 +67,30 @@ struct svc_cred {
+ };
  
--static void mount_error(char *node)
-+static void mount_error(char *mntpnt, char *node)
- {
-       switch(errno) {
-               case ENOTDIR:
--                      fprintf(stderr, "%s: mount point %s is not a 
directory\n", progname, node);
-+                      fprintf(stderr, "%s: mount point %s is not a 
directory\n", 
-+                              progname, mntpnt);
-                       break;
-               case EBUSY:
--                      fprintf(stderr, "%s: %s is already mounted or busy\n", 
progname, node);
-+                      fprintf(stderr, "%s: %s is already mounted or busy\n", 
-+                              progname, mntpnt);
-                       break;
-               case ENOENT:
--                      fprintf(stderr, "%s: mount point %s does not exist\n", 
progname, node);
-+                      if (node) {
-+                              fprintf(stderr, "%s: %s failed, reason given by 
server: %s\n",
-+                                      progname, node, strerror(errno));
-+                      } else
-+                              fprintf(stderr, "%s: mount point %s does not 
exist\n", 
-+                                      progname, mntpnt);
-                       break;
-               default:
-                       fprintf(stderr, "%s: %s\n", progname, strerror(errno));
+ static int
++get_krb5_hostbased_name (gss_buffer_desc name, char **hostbased_name)
++{
++      char *p, *sname = NULL;
++      if (strchr(name.value, '@') && strchr(name.value, '/')) {
++              if (!(sname = calloc(name.length, 1))) {
++                      printerr(0, "ERROR: get_krb5_hostbased_name failed "
++                               "to allocate %d bytes\n", name.length);
++                      goto out_err;
++              }
++              /* read in name and instance and replace '/' with '@' */
++              sscanf(name.value, "[EMAIL PROTECTED]", sname);
++              p = strchr(sname, '/');
++              p[0] = '@';
++      }
++      *hostbased_name = sname;
++      return 0;
++out_err:
++      return -1;
++}
++
++static int
+ do_svc_downcall(gss_buffer_desc *out_handle, struct svc_cred *cred,
+-              gss_OID mech, gss_buffer_desc *context_token)
++              gss_OID mech, gss_buffer_desc *context_token,
++              char *client_name)
+ {
+       FILE *f;
+       int i;
+@@ -91,8 +114,9 @@ do_svc_downcall(gss_buffer_desc *out_han
+       qword_printint(f, cred->cr_gid);
+       qword_printint(f, cred->cr_ngroups);
+       printerr(2, "mech: %s, hndl len: %d, ctx len %d, timeout: %d, "
+-               "uid: %d, gid: %d, num aux grps: %d:\n",
++               "clnt: %s, uid: %d, gid: %d, num aux grps: %d:\n",
+                fname, out_handle->length, context_token->length, 0x7fffffff,
++               client_name ? client_name : "<null>",
+                cred->cr_uid, cred->cr_gid, cred->cr_ngroups);
+       for (i=0; i < cred->cr_ngroups; i++) {
+               qword_printint(f, cred->cr_groups[i]);
+@@ -100,6 +124,8 @@ do_svc_downcall(gss_buffer_desc *out_han
        }
+       qword_print(f, fname);
+       qword_printhex(f, context_token->value, context_token->length);
++      if (client_name)
++              qword_print(f, client_name);
+       err = qword_eol(f);
+       fclose(f);
+       return err;
+@@ -294,6 +320,45 @@ print_hexl(const char *description, unsi
  }
-+static int chk_mountpoint(char *mount_point)
+ #endif
+ 
++static int
++get_hostbased_client_name(gss_name_t client_name, gss_OID mech,
++                        char **hostbased_name)
 +{
-+      struct stat sb;
++      u_int32_t       maj_stat, min_stat;
++      gss_buffer_desc name;
++      gss_OID         name_type = GSS_C_NO_OID;
++      char            *cname;
++      int             res = -1;
++
++      /* get the client name and for service principals only
++       * add it after the context (service name used for
++       * authenticating callbacks) */
++      maj_stat = gss_display_name(&min_stat, client_name, &name, &name_type);
++      if (maj_stat != GSS_S_COMPLETE) {
++              pgsserr("get_hostbased_client_name: gss_display_name",
++                      maj_stat, min_stat, mech);
++              goto out_err;
++      }
++      if (name.length >= 0xffff) { /* be certain name.length+1 doesn't 
overflow */
++              printerr(0, "ERROR: get_hostbased_client_name: "
++                       "received gss_name is too long (%d bytes)\n",
++                       name.length);
++              goto out_rel_buf;
++      }
++      /* For Kerberos, transform the NT_KRB5_PRINCIPAL to
++       * NT_HOSTBASED_SERVICE */
++      if (g_OID_equal(&krb5oid, mech)) {
++              if (!get_krb5_hostbased_name(name, &cname))
++                      *hostbased_name = cname;
++      }
++      /* For SPKM3, do ??? */
++      res = 0;
++out_rel_buf:
++      gss_release_buffer(&min_stat, &name);
++out_err:
++      return res;
++}
 +
-+      if (stat(mount_point, &sb) < 0){
-+              mount_error(mount_point, NULL);
-+              return 1;
-+      }
-+      if (S_ISDIR(sb.st_mode) == 0){
-+              errno = ENOTDIR;
-+              mount_error(mount_point, NULL);
-+              return 1;
-+      }
-+      if (access(mount_point, X_OK) < 0) {
-+              mount_error(mount_point, NULL);
-+              return 1;
+ void
+ handle_nullreq(FILE *f) {
+       /* XXX initialize to a random integer to reduce chances of unnecessary
+@@ -320,6 +385,7 @@ handle_nullreq(FILE *f) {
+       static char             *lbuf = NULL;
+       static int              lbuflen = 0;
+       static char             *cp;
++      char                    *hostbased_name = NULL;
+ 
+       printerr(1, "handling null request\n");
+ 
+@@ -385,8 +451,12 @@ handle_nullreq(FILE *f) {
+               gss_release_name(&ignore_min_stat, &client_name);
+               goto out_err;
+       }
+-      gss_release_name(&ignore_min_stat, &client_name);
+-
++      if (get_hostbased_client_name(client_name, mech, &hostbased_name)) {
++              /* get_hostbased_client_name() prints error msg */
++              maj_stat = GSS_S_BAD_NAME; /* XXX ? */
++              gss_release_name(&ignore_min_stat, &client_name);
++              goto out_err;
++      }
+ 
+       /* Context complete. Pass handle_seq in out_handle to use
+        * for context lookup in the kernel. */
+@@ -400,12 +470,14 @@ handle_nullreq(FILE *f) {
+               printerr(0, "WARNING: handle_nullreq: "
+                           "serialize_context_for_kernel failed\n");
+               maj_stat = GSS_S_FAILURE;
++              gss_release_name(&ignore_min_stat, &client_name);
+               goto out_err;
+       }
+       /* We no longer need the gss context */
+       gss_delete_sec_context(&ignore_min_stat, &ctx, &ignore_out_tok);
+ 
+-      do_svc_downcall(&out_handle, &cred, mech, &ctx_token);
++      do_svc_downcall(&out_handle, &cred, mech, &ctx_token, hostbased_name);
++      gss_release_name(&ignore_min_stat, &client_name);
+ continue_needed:
+       send_response(f, &in_handle, &in_tok, maj_stat, min_stat,
+                       &out_handle, &out_tok);
+@@ -414,6 +486,8 @@ out:
+               free(ctx_token.value);
+       if (out_tok.value != NULL)
+               gss_release_buffer(&ignore_min_stat, &out_tok);
++      if (hostbased_name)
++              free(hostbased_name);
+       printerr(1, "finished handling null request\n");
+       return;
+ 
+diff -puN utils/gssd/gssd_main_loop.c~CITI_NFS4_ALL utils/gssd/gssd_main_loop.c
+--- nfs-utils-1.1.1/utils/gssd/gssd_main_loop.c~CITI_NFS4_ALL  2007-10-23 
14:17:18.606911000 -0400
++++ nfs-utils-1.1.1-kwc/utils/gssd/gssd_main_loop.c    2007-10-23 
14:17:18.878793000 -0400
+@@ -98,7 +98,7 @@ gssd_run()
+ {
+       int                     ret;
+       struct sigaction        dn_act;
+-      int                     fd;
++      int                     fd, fd_cb;
+ 
+       /* Taken from linux/Documentation/dnotify.txt: */
+       dn_act.sa_sigaction = dir_notify_handler;
+@@ -114,6 +114,19 @@ gssd_run()
+       fcntl(fd, F_SETSIG, DNOTIFY_SIGNAL);
+       fcntl(fd, F_NOTIFY, DN_CREATE|DN_DELETE|DN_MODIFY|DN_MULTISHOT);
+ 
++      if ((fd_cb = open(pipefs_nfscbdir, O_RDONLY)) == -1) {
++              /* could be an older kernel or a newer one doing NFS 4.1 */
++              if (errno != ENOENT)
++                      printerr(0, "WARNING: failed to open %s: %s\n",
++                               pipefs_nfscbdir, strerror(errno));
++              /* ignore processing callback directory */
++              memset(pipefs_nfscbdir, '\0', sizeof(pipefs_nfscbdir));
++      } else {
++              fcntl(fd_cb, F_SETSIG, DNOTIFY_SIGNAL);
++              fcntl(fd_cb, F_NOTIFY,
++                      DN_CREATE|DN_DELETE|DN_MODIFY|DN_MULTISHOT);
 +      }
 +
-+      return 0;
-+}
+       init_client_list();
  
- extern u_short getport(
-       struct sockaddr_in *saddr,
-@@ -508,6 +535,9 @@ int main(int argc, char *argv[])
-           }
-       }
- 
-+      if (chk_mountpoint(mount_point))
-+              exit(EX_FAIL);
-+
-       if (nfs_mount_vers == 4)
-               mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, 
&mount_opts, 0);
-       else {
-@@ -538,7 +568,7 @@ int main(int argc, char *argv[])
-                                          mount_opts);
- 
-               if (mnt_err) {
--                      mount_error(mount_point);
-+                      mount_error(mount_point, spec);
-                       exit(EX_FAIL);
+       printerr(1, "beginning poll\n");
+@@ -121,8 +134,7 @@ gssd_run()
+               while (dir_changed) {
+                       dir_changed = 0;
+                       if (update_client_list()) {
+-                              printerr(0, "ERROR: couldn't update "
+-                                       "client list\n");
++                              /* Error msg is already printed */
+                               exit(1);
+                       }
+               }
+@@ -141,5 +153,7 @@ gssd_run()
                }
        }
-diff -puN utils/gssd/gssd.c~CITI_NFS4_ALL utils/gssd/gssd.c
---- nfs-utils-1.1.0/utils/gssd/gssd.c~CITI_NFS4_ALL    2007-06-22 
10:51:53.782368000 -0400
-+++ nfs-utils-1.1.0-kwc/utils/gssd/gssd.c      2007-06-22 10:51:56.521019000 
-0400
-@@ -81,7 +81,7 @@ sig_hup(int signal)
+       close(fd);
++      if (fd_cb != -1)
++              close(fd_cb);
+       return;
+ }
+diff -puN utils/gssd/gssd_proc.c~CITI_NFS4_ALL utils/gssd/gssd_proc.c
+--- nfs-utils-1.1.1/utils/gssd/gssd_proc.c~CITI_NFS4_ALL       2007-10-23 
14:17:18.662855000 -0400
++++ nfs-utils-1.1.1-kwc/utils/gssd/gssd_proc.c 2007-10-23 14:17:19.021793000 
-0400
+@@ -102,7 +102,7 @@ int pollsize;  /* the size of pollaray (
+ /* XXX buffer problems: */
+ static int
+ read_service_info(char *info_file_name, char **servicename, char **servername,
+-                int *prog, int *vers, char **protocol) {
++                int *prog, int *vers, char **protocol, int *port) {
+ #define INFOBUFLEN 256
+       char            buf[INFOBUFLEN];
+       static char     dummy[128];
+@@ -112,6 +112,9 @@ read_service_info(char *info_file_name, 
+       char            program[16];
+       char            version[16];
+       char            protoname[16];
++      char            princname[128];
++      char            cb_port[128];
++      char            *p;
+       in_addr_t       inaddr;
+       int             fd = -1;
+       struct hostent  *ent = NULL;
+@@ -136,19 +139,33 @@ read_service_info(char *info_file_name, 
+                  service, program, version,
+                  address,
+                  protoname);
+-
+       if (numfields == 5) {
+               strcpy(protoname, "tcp");
+       } else if (numfields != 6) {
+               goto fail;
+       }
+ 
++      princname[0] = '\0';
++      if ((p = strstr(buf, "principal name:")) != NULL)
++              sscanf(p, "principal name: %127s\n", princname);
++      cb_port[0] = '\0';
++      if ((p = strstr(buf, "port")) != NULL)
++              sscanf(p, "port: %127s\n", cb_port);
++
+       /* check service, program, and version */
+-      if(memcmp(service, "nfs", 3)) return -1;
++      if (memcmp(service, "nfs", 3))
++              return -1;
+       *prog = atoi(program + 1); /* skip open paren */
+       *vers = atoi(version);
+-      if((*prog != 100003) || ((*vers != 2) && (*vers != 3) && (*vers != 4)))
+-              goto fail;
++
++      if (strlen(service) == 3 && !memcmp(service, "nfs", 3)) {
++              if ((*prog != 100003) || ((*vers != 2) && (*vers != 3) &&
++                  (*vers != 4)))
++                      goto fail;
++      } else if (!memcmp(service, "nfs4_cb", 7)) {
++              if (*vers != 1)
++                      goto fail;
++      }
+ 
+       /* create service name */
+       inaddr = inet_addr(address);
+@@ -159,7 +176,12 @@ read_service_info(char *info_file_name, 
+       if (!(*servername = calloc(strlen(ent->h_name) + 1, 1)))
+               goto fail;
+       memcpy(*servername, ent->h_name, strlen(ent->h_name));
+-      snprintf(buf, INFOBUFLEN, "[EMAIL PROTECTED]", service, ent->h_name);
++      if (princname[0] != '\0')
++              printerr(2, "info file contains princname=%s\n", princname);
++
++      snprintf(buf, INFOBUFLEN, "[EMAIL PROTECTED]", ent->h_name);
++      if (cb_port[0] != '\0')
++              *port = atoi(cb_port);
+       if (!(*servicename = calloc(strlen(buf) + 1, 1)))
+               goto fail;
+       memcpy(*servicename, buf, strlen(buf));
+@@ -219,9 +241,9 @@ out:
+ static int
+ process_clnt_dir_files(struct clnt_info * clp)
+ {
+-      char    kname[32];
+-      char    sname[32];
+-      char    info_file_name[32];
++      char    kname[PATH_MAX];
++      char    sname[PATH_MAX];
++      char    info_file_name[PATH_MAX];
+ 
+       if (clp->krb5_fd == -1) {
+               snprintf(kname, sizeof(kname), "%s/krb5", clp->dirname);
+@@ -231,14 +253,14 @@ process_clnt_dir_files(struct clnt_info 
+               snprintf(sname, sizeof(sname), "%s/spkm3", clp->dirname);
+               clp->spkm3_fd = open(sname, O_RDWR);
+       }
+-      if((clp->krb5_fd == -1) && (clp->spkm3_fd == -1))
++      if ((clp->krb5_fd == -1) && (clp->spkm3_fd == -1))
+               return -1;
+       snprintf(info_file_name, sizeof(info_file_name), "%s/info",
+                       clp->dirname);
+       if ((clp->servicename == NULL) &&
+            read_service_info(info_file_name, &clp->servicename,
+                               &clp->servername, &clp->prog, &clp->vers,
+-                              &clp->protocol))
++                              &clp->protocol, &clp->port))
+               return -1;
+       return 0;
+ }
+@@ -288,17 +310,17 @@ insert_clnt_poll(struct clnt_info *clp)
+ }
+ 
  static void
- usage(char *progname)
+-process_clnt_dir(char *dir)
++process_clnt_dir(char *dir, char *pdir)
  {
--      fprintf(stderr, "usage: %s [-f] [-n] [-v] [-r] [-p pipefsdir] [-k 
keytab] [-d ccachedir]\n",
-+      fprintf(stderr, "usage: %s [-f] [-M] [-n] [-v] [-r] [-p pipefsdir] [-k 
keytab] [-d ccachedir]\n",
-               progname);
-       exit(1);
- }
-diff -puN /dev/null support/include/pseudoflavors.h
---- /dev/null  2007-06-21 19:03:53.875366737 -0400
-+++ nfs-utils-1.1.0-kwc/support/include/pseudoflavors.h        2007-06-22 
10:52:22.335293000 -0400
-@@ -0,0 +1,17 @@
-+#define RPC_AUTH_GSS_KRB5       390003
-+#define RPC_AUTH_GSS_KRB5I      390004
-+#define RPC_AUTH_GSS_KRB5P      390005
-+#define RPC_AUTH_GSS_LKEY       390006
-+#define RPC_AUTH_GSS_LKEYI      390007
-+#define RPC_AUTH_GSS_LKEYP      390008
-+#define RPC_AUTH_GSS_SPKM       390009
-+#define RPC_AUTH_GSS_SPKMI      390010
-+#define RPC_AUTH_GSS_SPKMP      390011
-+
-+struct flav_info {
-+      char    *flavour;
-+      int     fnum;
-+};
+       struct clnt_info *      clp;
+ 
+       if (!(clp = insert_new_clnt()))
+               goto fail_destroy_client;
+ 
+-      if (!(clp->dirname = calloc(strlen(dir) + 1, 1))) {
++      if (!(clp->dirname = calloc(strlen(dir) + strlen(pdir) + 1, 1))) {
+               goto fail_destroy_client;
+       }
+-      memcpy(clp->dirname, dir, strlen(dir));
++      sprintf(clp->dirname, "%s/%s", pdir, dir);
+       if ((clp->dir_fd = open(clp->dirname, O_RDONLY)) == -1) {
+               printerr(0, "ERROR: can't open %s: %s\n",
+                        clp->dirname, strerror(errno));
+@@ -342,16 +364,24 @@ init_client_list(void)
+  * directories, since the DNOTIFY could have been in there.
+  */
+ static void
+-update_old_clients(struct dirent **namelist, int size)
++update_old_clients(struct dirent **namelist, int size, char *pdir)
+ {
+       struct clnt_info *clp;
+       void *saveprev;
+       int i, stillhere;
++      char fname[PATH_MAX];
+ 
+       for (clp = clnt_list.tqh_first; clp != NULL; clp = clp->list.tqe_next) {
++              /* only compare entries in the global list that are from the
++               * same pipefs parent directory as "pdir"
++               */
++              if (strncmp(clp->dirname, pdir, strlen(pdir)) != 0) break;
++
+               stillhere = 0;
+               for (i=0; i < size; i++) {
+-                      if (!strcmp(clp->dirname, namelist[i]->d_name)) {
++                      snprintf(fname, sizeof(fname), "%s/%s",
++                               pdir, namelist[i]->d_name);
++                      if (strcmp(clp->dirname, fname) == 0) {
+                               stillhere = 1;
+                               break;
+                       }
+@@ -372,47 +402,72 @@ update_old_clients(struct dirent **namel
+ 
+ /* Search for a client by directory name, return 1 if found, 0 otherwise */
+ static int
+-find_client(char *dirname)
++find_client(char *dirname, char *pdir)
+ {
+       struct clnt_info        *clp;
++      char fname[PATH_MAX];
+ 
+-      for (clp = clnt_list.tqh_first; clp != NULL; clp = clp->list.tqe_next)
+-              if (!strcmp(clp->dirname, dirname))
++      for (clp = clnt_list.tqh_first; clp != NULL; clp = clp->list.tqe_next) {
++              snprintf(fname, sizeof(fname), "%s/%s", pdir, dirname);
++              if (strcmp(clp->dirname, fname) == 0)
+                       return 1;
++      }
+       return 0;
+ }
+ 
+-/* Used to read (and re-read) list of clients, set up poll array. */
+-int
+-update_client_list(void)
++static int
++process_pipedir(char *pipe_name)
+ {
+       struct dirent **namelist;
+       int i, j;
+ 
+-      if (chdir(pipefs_nfsdir) < 0) {
++      if (chdir(pipe_name) < 0) {
+               printerr(0, "ERROR: can't chdir to %s: %s\n",
+-                       pipefs_nfsdir, strerror(errno));
++                       pipe_name, strerror(errno));
+               return -1;
+       }
+ 
+-      j = scandir(pipefs_nfsdir, &namelist, NULL, alphasort);
++      j = scandir(pipe_name, &namelist, NULL, alphasort);
+       if (j < 0) {
+               printerr(0, "ERROR: can't scandir %s: %s\n",
+-                       pipefs_nfsdir, strerror(errno));
++                       pipe_name, strerror(errno));
+               return -1;
+       }
+-      update_old_clients(namelist, j);
 +
-+extern struct flav_info flav_map[];
-+extern const int flav_map_size;
-diff -puN support/nfs/exports.c~CITI_NFS4_ALL support/nfs/exports.c
---- nfs-utils-1.1.0/support/nfs/exports.c~CITI_NFS4_ALL        2007-06-22 
10:52:16.682999000 -0400
-+++ nfs-utils-1.1.0-kwc/support/nfs/exports.c  2007-06-22 10:52:40.578175000 
-0400
-@@ -30,10 +30,29 @@
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/nfs-utils-CITI_NFS4.patch?r1=1.5&r2=1.6&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to