]> git.pld-linux.org Git - packages/nfs-utils.git/blob - nfs-utils-CITI_NFS4.patch
- fix without nfs4
[packages/nfs-utils.git] / nfs-utils-CITI_NFS4.patch
1
2
3 The complete set of CITI nfs-utils patches rolled into one patch.
4
5 Changes since 1.0.11-CITI_NFS4_ALL-1:
6
7  * Update to nfs-utils-1.1.0
8
9  * Include patches from git not yet in a release:
10    - Fix mount error messages
11
12  * Update gssd usage message to include new -n option.
13
14  * Patches from Bruce Fields to clean up compile warning, and
15    move pseudoflavor code to a common location
16
17  * Patch from Bruce Fields and Fred Isaman that adds support
18    to exportfs for reading a sec= option and sending server
19    security data through cache via
20    "... secinfo n flavor1 flag1 ... flavorN flagN".
21
22
23 ---
24
25  nfs-utils-1.1.0-kwc/support/include/nfslib.h        |   10 +
26  nfs-utils-1.1.0-kwc/support/include/pseudoflavors.h |   17 ++
27  nfs-utils-1.1.0-kwc/support/nfs/exports.c           |  158 ++++++++++++++++++--
28  nfs-utils-1.1.0-kwc/utils/exportfs/exportfs.c       |    1 
29  nfs-utils-1.1.0-kwc/utils/gssd/gssd.c               |    2 
30  nfs-utils-1.1.0-kwc/utils/mount/mount.c             |   40 ++++-
31  nfs-utils-1.1.0-kwc/utils/mount/nfs4_mount.h        |   12 -
32  nfs-utils-1.1.0-kwc/utils/mount/nfs4mount.c         |   27 ---
33  nfs-utils-1.1.0-kwc/utils/mountd/cache.c            |   21 ++
34  10 files changed, 240 insertions(+), 49 deletions(-)
35
36 diff -puN utils/mount/mount.c~CITI_NFS4_ALL utils/mount/mount.c
37 --- nfs-utils-1.1.0/utils/mount/mount.c~CITI_NFS4_ALL   2007-06-22 10:51:38.885022000 -0400
38 +++ nfs-utils-1.1.0-kwc/utils/mount/mount.c     2007-06-22 10:52:04.954241000 -0400
39 @@ -285,22 +285,49 @@ static void parse_opts (const char *opti
40         }
41  }
42  
43 -static void mount_error(char *node)
44 +static void mount_error(char *mntpnt, char *node)
45  {
46         switch(errno) {
47                 case ENOTDIR:
48 -                       fprintf(stderr, "%s: mount point %s is not a directory\n", progname, node);
49 +                       fprintf(stderr, "%s: mount point %s is not a directory\n", 
50 +                               progname, mntpnt);
51                         break;
52                 case EBUSY:
53 -                       fprintf(stderr, "%s: %s is already mounted or busy\n", progname, node);
54 +                       fprintf(stderr, "%s: %s is already mounted or busy\n", 
55 +                               progname, mntpnt);
56                         break;
57                 case ENOENT:
58 -                       fprintf(stderr, "%s: mount point %s does not exist\n", progname, node);
59 +                       if (node) {
60 +                               fprintf(stderr, "%s: %s failed, reason given by server: %s\n",
61 +                                       progname, node, strerror(errno));
62 +                       } else
63 +                               fprintf(stderr, "%s: mount point %s does not exist\n", 
64 +                                       progname, mntpnt);
65                         break;
66                 default:
67                         fprintf(stderr, "%s: %s\n", progname, strerror(errno));
68         }
69  }
70 +static int chk_mountpoint(char *mount_point)
71 +{
72 +       struct stat sb;
73 +
74 +       if (stat(mount_point, &sb) < 0){
75 +               mount_error(mount_point, NULL);
76 +               return 1;
77 +       }
78 +       if (S_ISDIR(sb.st_mode) == 0){
79 +               errno = ENOTDIR;
80 +               mount_error(mount_point, NULL);
81 +               return 1;
82 +       }
83 +       if (access(mount_point, X_OK) < 0) {
84 +               mount_error(mount_point, NULL);
85 +               return 1;
86 +       }
87 +
88 +       return 0;
89 +}
90  
91  extern u_short getport(
92         struct sockaddr_in *saddr,
93 @@ -508,6 +535,9 @@ int main(int argc, char *argv[])
94             }
95         }
96  
97 +       if (chk_mountpoint(mount_point))
98 +               exit(EX_FAIL);
99 +
100         if (nfs_mount_vers == 4)
101                 mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
102         else {
103 @@ -538,7 +568,7 @@ int main(int argc, char *argv[])
104                                            mount_opts);
105  
106                 if (mnt_err) {
107 -                       mount_error(mount_point);
108 +                       mount_error(mount_point, spec);
109                         exit(EX_FAIL);
110                 }
111         }
112 diff -puN utils/gssd/gssd.c~CITI_NFS4_ALL utils/gssd/gssd.c
113 --- nfs-utils-1.1.0/utils/gssd/gssd.c~CITI_NFS4_ALL     2007-06-22 10:51:53.782368000 -0400
114 +++ nfs-utils-1.1.0-kwc/utils/gssd/gssd.c       2007-06-22 10:51:56.521019000 -0400
115 @@ -81,7 +81,7 @@ sig_hup(int signal)
116  static void
117  usage(char *progname)
118  {
119 -       fprintf(stderr, "usage: %s [-f] [-n] [-v] [-r] [-p pipefsdir] [-k keytab] [-d ccachedir]\n",
120 +       fprintf(stderr, "usage: %s [-f] [-M] [-n] [-v] [-r] [-p pipefsdir] [-k keytab] [-d ccachedir]\n",
121                 progname);
122         exit(1);
123  }
124 diff -puN /dev/null support/include/pseudoflavors.h
125 --- /dev/null   2007-06-21 19:03:53.875366737 -0400
126 +++ nfs-utils-1.1.0-kwc/support/include/pseudoflavors.h 2007-06-22 10:52:22.335293000 -0400
127 @@ -0,0 +1,17 @@
128 +#define RPC_AUTH_GSS_KRB5       390003
129 +#define RPC_AUTH_GSS_KRB5I      390004
130 +#define RPC_AUTH_GSS_KRB5P      390005
131 +#define RPC_AUTH_GSS_LKEY       390006
132 +#define RPC_AUTH_GSS_LKEYI      390007
133 +#define RPC_AUTH_GSS_LKEYP      390008
134 +#define RPC_AUTH_GSS_SPKM       390009
135 +#define RPC_AUTH_GSS_SPKMI      390010
136 +#define RPC_AUTH_GSS_SPKMP      390011
137 +
138 +struct flav_info {
139 +       char    *flavour;
140 +       int     fnum;
141 +};
142 +
143 +extern struct flav_info flav_map[];
144 +extern const int flav_map_size;
145 diff -puN support/nfs/exports.c~CITI_NFS4_ALL support/nfs/exports.c
146 --- nfs-utils-1.1.0/support/nfs/exports.c~CITI_NFS4_ALL 2007-06-22 10:52:16.682999000 -0400
147 +++ nfs-utils-1.1.0-kwc/support/nfs/exports.c   2007-06-22 10:52:40.578175000 -0400
148 @@ -30,10 +30,29 @@
149  #include "xmalloc.h"
150  #include "xlog.h"
151  #include "xio.h"
152 +#include "pseudoflavors.h"
153  
154  #define EXPORT_DEFAULT_FLAGS   \
155    (NFSEXP_READONLY|NFSEXP_ROOTSQUASH|NFSEXP_GATHERED_WRITES|NFSEXP_NOSUBTREECHECK)
156  
157 +struct flav_info flav_map[] = {
158 +       { "krb5",       RPC_AUTH_GSS_KRB5       },
159 +       { "krb5i",      RPC_AUTH_GSS_KRB5I      },
160 +       { "krb5p",      RPC_AUTH_GSS_KRB5P      },
161 +       { "lipkey",     RPC_AUTH_GSS_LKEY       },
162 +       { "lipkey-i",   RPC_AUTH_GSS_LKEYI      },
163 +       { "lipkey-p",   RPC_AUTH_GSS_LKEYP      },
164 +       { "spkm3",      RPC_AUTH_GSS_SPKM       },
165 +       { "spkm3i",     RPC_AUTH_GSS_SPKMI      },
166 +       { "spkm3p",     RPC_AUTH_GSS_SPKMP      },
167 +       { "unix",       AUTH_UNIX               },
168 +       { "sys",        AUTH_SYS                },
169 +       { "null",       AUTH_NULL               },
170 +       { "none",       AUTH_NONE               },
171 +};
172 +
173 +const int flav_map_size = sizeof(flav_map)/sizeof(flav_map[0]);
174 +
175  int export_errno;
176  
177  static char    *efname = NULL;
178 @@ -100,6 +119,7 @@ getexportent(int fromkernel, int fromexp
179                 def_ee.e_mountpoint = NULL;
180                 def_ee.e_fslocmethod = FSLOC_NONE;
181                 def_ee.e_fslocdata = NULL;
182 +               def_ee.e_secinfo[0].flav = NULL;
183                 def_ee.e_nsquids = 0;
184                 def_ee.e_nsqgids = 0;
185  
186 @@ -179,6 +199,27 @@ getexportent(int fromkernel, int fromexp
187         return &ee;
188  }
189  
190 +void secinfo_show(FILE *fp, struct exportent *ep)
191 +{
192 +       struct sec_entry *p1, *p2;
193 +       int flags;
194 +
195 +       for (p1=ep->e_secinfo; p1->flav; p1=p2) {
196 +
197 +               fprintf(fp, ",sec=%s", p1->flav->flavour);
198 +               for (p2=p1+1; (p2->flav != NULL) && (p1->flags == p2->flags);
199 +                                                               p2++) {
200 +                       fprintf(fp, ":%s", p2->flav->flavour);
201 +               }
202 +               flags = p1->flags;
203 +               fprintf(fp, ",%s", (flags & NFSEXP_READONLY) ? "ro" : "rw");
204 +               fprintf(fp, ",%sroot_squash", (flags & NFSEXP_ROOTSQUASH)?
205 +                               "" : "no_");
206 +               fprintf(fp, ",%sall_squash", (flags & NFSEXP_ALLSQUASH)?
207 +                               "" : "no_");
208 +       }
209 +}
210 +
211  void
212  putexportent(struct exportent *ep)
213  {
214 @@ -259,7 +300,9 @@ putexportent(struct exportent *ep)
215                         else
216                                 fprintf(fp, "%d,", id[i]);
217         }
218 -       fprintf(fp, "anonuid=%d,anongid=%d)\n", ep->e_anonuid, ep->e_anongid);
219 +       fprintf(fp, "anonuid=%d,anongid=%d", ep->e_anonuid, ep->e_anongid);
220 +       secinfo_show(fp, ep);
221 +       fprintf(fp, ")\n");
222  }
223  
224  void
225 @@ -307,6 +350,7 @@ mkexportent(char *hname, char *path, cha
226         ee.e_mountpoint = NULL;
227         ee.e_fslocmethod = FSLOC_NONE;
228         ee.e_fslocdata = NULL;
229 +       ee.e_secinfo[0].flav = NULL;
230         ee.e_nsquids = 0;
231         ee.e_nsqgids = 0;
232         ee.e_uuid = NULL;
233 @@ -350,18 +394,110 @@ static int valid_uuid(char *uuid)
234  }
235  
236  /*
237 + * Append the given flavor to the exportent's e_secinfo array, or
238 + * do nothing if it's already there.  Returns the index of flavor
239 + * in the resulting array in any case.
240 + */
241 +static int secinfo_addflavor(struct flav_info *flav, struct exportent *ep)
242 +{
243 +       struct sec_entry *p;
244 +
245 +       for (p=ep->e_secinfo; p->flav; p++) {
246 +               if (p->flav == flav)
247 +                       return p - ep->e_secinfo;
248 +       }
249 +       if (p - ep->e_secinfo >= SECFLAVOR_COUNT) {
250 +               xlog(L_ERROR, "more than %d security flavors on an export\n",
251 +                       SECFLAVOR_COUNT);
252 +               return -1;
253 +       }
254 +       p->flav = flav;
255 +       p->flags = ep->e_flags;
256 +       (p+1)->flav = NULL;
257 +       return p - ep->e_secinfo;
258 +}
259 +
260 +static struct flav_info *find_flavor(char *name)
261 +{
262 +       struct flav_info *flav;
263 +       for (flav = flav_map; flav < flav_map + flav_map_size; flav++)
264 +               if (strcmp(flav->flavour, name) == 0)
265 +                       return flav;
266 +       return NULL;
267 +}
268 +
269 +/* @str is a colon seperated list of security flavors.  Their order
270 + * is recorded in @ep, and a bitmap corresponding to the list is returned.
271 + * A zero return indicates an error.
272 + */
273 +static unsigned int parse_flavors(char *str, struct exportent *ep)
274 +{
275 +       unsigned int out=0;
276 +       char *flavor;
277 +       int bit;
278 +
279 +       while ( (flavor=strsep(&str, ":")) ) {
280 +               struct flav_info *flav = find_flavor(flavor);
281 +               if (flav == NULL) {
282 +                       xlog(L_ERROR, "unknown flavor %s\n", flavor);
283 +                       return 0;
284 +               }
285 +               bit = secinfo_addflavor(flav, ep);
286 +               if (bit < 0)
287 +                       return 0;
288 +               out |= 1<<bit;
289 +       }
290 +       return out;
291 +}
292 +
293 +/* Sets the bits in @mask for the appropriate security flavor flags. */
294 +static void setflags(int mask, unsigned int active, struct exportent *ep)
295 +{
296 +       int bit=0;
297 +
298 +       ep->e_flags |= mask;
299 +
300 +       while (active) {
301 +               if (active & 1)
302 +                       ep->e_secinfo[bit].flags |= mask;
303 +               bit++;
304 +               active >>= 1;
305 +       }
306 +}
307 +
308 +/* Clears the bits in @mask for the appropriate security flavor flags. */
309 +static void clearflags(int mask, unsigned int active, struct exportent *ep)
310 +{
311 +       int bit=0;
312 +
313 +       ep->e_flags &= ~mask;
314 +
315 +       while (active) {
316 +               if (active & 1)
317 +                       ep->e_secinfo[bit].flags &= ~mask;
318 +               bit++;
319 +               active >>= 1;
320 +       }
321 +}
322 +
323 +/* options that can vary per flavor: */
324 +#define NFSEXP_SECINFO_FLAGS (NFSEXP_READONLY | NFSEXP_ROOTSQUASH \
325 +                                       | NFSEXP_ALLSQUASH)
326 +
327 +/*
328   * Parse option string pointed to by cp and set mount options accordingly.
329   */
330  static int
331  parseopts(char *cp, struct exportent *ep, int warn, int *had_subtree_opt_ptr)
332  {
333 +       struct sec_entry *p;
334         int     had_subtree_opt = 0;
335         char    *flname = efname?efname:"command line";
336         int     flline = efp?efp->x_line:0;
337 +       unsigned int active = 0;
338  
339         squids = ep->e_squids; nsquids = ep->e_nsquids;
340         sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
341 -
342         if (!cp)
343                 goto out;
344  
345 @@ -380,9 +516,9 @@ parseopts(char *cp, struct exportent *ep
346  
347                 /* process keyword */
348                 if (strcmp(opt, "ro") == 0)
349 -                       ep->e_flags |= NFSEXP_READONLY;
350 +                       setflags(NFSEXP_READONLY, active, ep);
351                 else if (strcmp(opt, "rw") == 0)
352 -                       ep->e_flags &= ~NFSEXP_READONLY;
353 +                       clearflags(NFSEXP_READONLY, active, ep);
354                 else if (!strcmp(opt, "secure"))
355                         ep->e_flags &= ~NFSEXP_INSECURE_PORT;
356                 else if (!strcmp(opt, "insecure"))
357 @@ -404,13 +540,13 @@ parseopts(char *cp, struct exportent *ep
358                 else if (!strcmp(opt, "no_wdelay"))
359                         ep->e_flags &= ~NFSEXP_GATHERED_WRITES;
360                 else if (strcmp(opt, "root_squash") == 0)
361 -                       ep->e_flags |= NFSEXP_ROOTSQUASH;
362 +                       setflags(NFSEXP_ROOTSQUASH, active, ep);
363                 else if (!strcmp(opt, "no_root_squash"))
364 -                       ep->e_flags &= ~NFSEXP_ROOTSQUASH;
365 +                       clearflags(NFSEXP_ROOTSQUASH, active, ep);
366                 else if (strcmp(opt, "all_squash") == 0)
367 -                       ep->e_flags |= NFSEXP_ALLSQUASH;
368 +                       setflags(NFSEXP_ALLSQUASH, active, ep);
369                 else if (strcmp(opt, "no_all_squash") == 0)
370 -                       ep->e_flags &= ~NFSEXP_ALLSQUASH;
371 +                       clearflags(NFSEXP_ALLSQUASH, active, ep);
372                 else if (strcmp(opt, "subtree_check") == 0) {
373                         had_subtree_opt = 1;
374                         ep->e_flags &= ~NFSEXP_NOSUBTREECHECK;
375 @@ -498,6 +634,10 @@ bad_option:
376                 } else if (strncmp(opt, "replicas=", 9) == 0) {
377                         ep->e_fslocmethod = FSLOC_REPLICA;
378                         ep->e_fslocdata = strdup(opt+9);
379 +               } else if (strncmp(opt, "sec=", 4) == 0) {
380 +                       active = parse_flavors(opt+4, ep);
381 +                       if (!active)
382 +                               goto bad_option;
383                 } else {
384                         xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n",
385                                         flname, flline, opt);
386 @@ -509,6 +649,8 @@ bad_option:
387                         cp++;
388         }
389  
390 +       for (p = ep->e_secinfo; p->flav; p++)
391 +               p->flags |= ep->e_flags & ~NFSEXP_SECINFO_FLAGS;
392         ep->e_squids = squids;
393         ep->e_sqgids = sqgids;
394         ep->e_nsquids = nsquids;
395 diff -puN utils/mount/nfs4mount.c~CITI_NFS4_ALL utils/mount/nfs4mount.c
396 --- nfs-utils-1.1.0/utils/mount/nfs4mount.c~CITI_NFS4_ALL       2007-06-22 10:52:18.413097000 -0400
397 +++ nfs-utils-1.1.0-kwc/utils/mount/nfs4mount.c 2007-06-22 10:52:25.846889000 -0400
398 @@ -36,6 +36,7 @@
399  #define nfsstat nfs_stat
400  #endif
401  
402 +#include "pseudoflavors.h"
403  #include "nls.h"
404  #include "conn.h"
405  #include "xcommon.h"
406 @@ -71,26 +72,6 @@ char *GSSDLCK = DEFAULT_DIR "/rpcgssd";
407  #define NFS_PORT 2049
408  #endif
409  
410 -struct {
411 -       char    *flavour;
412 -       int     fnum;
413 -} flav_map[] = {
414 -       { "krb5",       RPC_AUTH_GSS_KRB5       },
415 -       { "krb5i",      RPC_AUTH_GSS_KRB5I      },
416 -       { "krb5p",      RPC_AUTH_GSS_KRB5P      },
417 -       { "lipkey",     RPC_AUTH_GSS_LKEY       },
418 -       { "lipkey-i",   RPC_AUTH_GSS_LKEYI      },
419 -       { "lipkey-p",   RPC_AUTH_GSS_LKEYP      },
420 -       { "spkm3",      RPC_AUTH_GSS_SPKM       },
421 -       { "spkm3i",     RPC_AUTH_GSS_SPKMI      },
422 -       { "spkm3p",     RPC_AUTH_GSS_SPKMP      },
423 -       { "unix",       AUTH_UNIX               },
424 -       { "sys",        AUTH_SYS                },
425 -       { "null",       AUTH_NULL               },
426 -       { "none",       AUTH_NONE               },
427 -};
428 -
429 -#define FMAPSIZE               (sizeof(flav_map)/sizeof(flav_map[0]))
430  #define MAX_USER_FLAVOUR       16
431  
432  static int parse_sec(char *sec, int *pseudoflavour)
433 @@ -104,13 +85,13 @@ static int parse_sec(char *sec, int *pse
434                                   "exceeded\n"));
435                         return 0;
436                 }
437 -               for (i = 0; i < FMAPSIZE; i++) {
438 +               for (i = 0; i < flav_map_size; i++) {
439                         if (strcmp(sec, flav_map[i].flavour) == 0) {
440                                 pseudoflavour[num_flavour++] = flav_map[i].fnum;
441                                 break;
442                         }
443                 }
444 -               if (i == FMAPSIZE) {
445 +               if (i == flav_map_size) {
446                         fprintf(stderr,
447                                 _("mount: unknown security type %s\n"), sec);
448                         return 0;
449 @@ -399,7 +380,7 @@ int nfs4mount(const char *spec, const ch
450  
451                 printf("sec = ");
452                 for (pf_cnt = 0; pf_cnt < num_flavour; pf_cnt++) {
453 -                       for (i = 0; i < FMAPSIZE; i++) {
454 +                       for (i = 0; i < flav_map_size; i++) {
455                                 if (flav_map[i].fnum == pseudoflavour[pf_cnt]) {
456                                         printf("%s", flav_map[i].flavour);
457                                         break;
458 diff -puN utils/mount/nfs4_mount.h~CITI_NFS4_ALL utils/mount/nfs4_mount.h
459 --- nfs-utils-1.1.0/utils/mount/nfs4_mount.h~CITI_NFS4_ALL      2007-06-22 10:52:21.626744000 -0400
460 +++ nfs-utils-1.1.0-kwc/utils/mount/nfs4_mount.h        2007-06-22 10:52:24.715391000 -0400
461 @@ -67,18 +67,6 @@ struct nfs4_mount_data {
462  #define NFS4_MOUNT_STRICTLOCK  0x1000  /* 1 */
463  #define NFS4_MOUNT_FLAGMASK    0xFFFF
464  
465 -/* pseudoflavors: */
466 -
467 -#define RPC_AUTH_GSS_KRB5       390003
468 -#define RPC_AUTH_GSS_KRB5I      390004
469 -#define RPC_AUTH_GSS_KRB5P      390005
470 -#define RPC_AUTH_GSS_LKEY       390006
471 -#define RPC_AUTH_GSS_LKEYI      390007
472 -#define RPC_AUTH_GSS_LKEYP      390008
473 -#define RPC_AUTH_GSS_SPKM       390009
474 -#define RPC_AUTH_GSS_SPKMI      390010
475 -#define RPC_AUTH_GSS_SPKMP      390011
476 -
477  int nfs4mount(const char *, const char *, int *, char **,
478         char **, int);
479  
480 diff -puN support/include/nfslib.h~CITI_NFS4_ALL support/include/nfslib.h
481 --- nfs-utils-1.1.0/support/include/nfslib.h~CITI_NFS4_ALL      2007-06-22 10:52:31.311234000 -0400
482 +++ nfs-utils-1.1.0-kwc/support/include/nfslib.h        2007-06-22 10:52:39.718626000 -0400
483 @@ -51,6 +51,14 @@
484  #define        _PATH_PROC_EXPORTS_ALT  "/proc/fs/nfsd/exports"
485  #endif
486  
487 +/* Maximum number of security flavors on an export: */
488 +#define SECFLAVOR_COUNT 8
489 +
490 +struct sec_entry {
491 +       struct flav_info *flav;
492 +       int flags;
493 +};
494 +
495  /*
496   * Data related to a single exports entry as returned by getexportent.
497   * FIXME: export options should probably be parsed at a later time to
498 @@ -76,6 +84,7 @@ struct exportent {
499         int             e_fslocmethod;
500         char *          e_fslocdata;
501         char *          e_uuid;
502 +       struct sec_entry e_secinfo[SECFLAVOR_COUNT+1];
503  };
504  
505  struct rmtabent {
506 @@ -89,6 +98,7 @@ struct rmtabent {
507   */
508  void                   setexportent(char *fname, char *type);
509  struct exportent *     getexportent(int,int);
510 +void                   secinfo_show(FILE *fp, struct exportent *ep);
511  void                   putexportent(struct exportent *xep);
512  void                   endexportent(void);
513  struct exportent *     mkexportent(char *hname, char *path, char *opts);
514 diff -puN utils/exportfs/exportfs.c~CITI_NFS4_ALL utils/exportfs/exportfs.c
515 --- nfs-utils-1.1.0/utils/exportfs/exportfs.c~CITI_NFS4_ALL     2007-06-22 10:52:33.386332000 -0400
516 +++ nfs-utils-1.1.0-kwc/utils/exportfs/exportfs.c       2007-06-22 10:52:40.698175000 -0400
517 @@ -515,6 +515,7 @@ dump(int verbose)
518                                 break;
519  #endif
520                         }
521 +                       secinfo_show(stdout, ep);
522                         printf("%c\n", (c != '(')? ')' : ' ');
523                 }
524         }
525 diff -puN utils/mountd/cache.c~CITI_NFS4_ALL utils/mountd/cache.c
526 --- nfs-utils-1.1.0/utils/mountd/cache.c~CITI_NFS4_ALL  2007-06-22 10:52:38.862018000 -0400
527 +++ nfs-utils-1.1.0-kwc/utils/mountd/cache.c    2007-06-22 10:52:40.837142000 -0400
528 @@ -30,6 +30,7 @@
529  #include "mountd.h"
530  #include "xmalloc.h"
531  #include "fsloc.h"
532 +#include "pseudoflavors.h"
533  
534  #ifdef USE_BLKID
535  #include "blkid/blkid.h"
536 @@ -518,6 +519,25 @@ static void write_fsloc(FILE *f, struct 
537         release_replicas(servers);
538  }
539  
540 +static void write_secinfo(FILE *f, struct exportent *ep)
541 +{
542 +       struct sec_entry *p;
543 +
544 +       for (p = ep->e_secinfo; p->flav; p++)
545 +               ; /* Do nothing */
546 +       if (p == ep->e_secinfo) {
547 +               /* There was no sec= option */
548 +               return;
549 +       }
550 +       qword_print(f, "secinfo");
551 +       qword_printint(f, p - ep->e_secinfo);
552 +       for (p = ep->e_secinfo; p->flav; p++) {
553 +               qword_printint(f, p->flav->fnum);
554 +               qword_printint(f, p->flags);
555 +       }
556 +
557 +}
558 +
559  static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
560  {
561         qword_print(f, domain);
562 @@ -529,6 +549,7 @@ static int dump_to_cache(FILE *f, char *
563                 qword_printint(f, exp->e_anongid);
564                 qword_printint(f, exp->e_fsid);
565                 write_fsloc(f, exp, path);
566 +               write_secinfo(f, exp);
567  #if USE_BLKID
568                 if (exp->e_uuid == NULL) {
569                         char u[16];
570
571 _
This page took 0.072816 seconds and 3 git commands to generate.