summaryrefslogtreecommitdiffstats
path: root/support/nfs
diff options
context:
space:
mode:
Diffstat (limited to 'support/nfs')
-rw-r--r--support/nfs/exports.c9
-rw-r--r--support/nfs/xio.c20
2 files changed, 27 insertions, 2 deletions
diff --git a/support/nfs/exports.c b/support/nfs/exports.c
index dbb2da0..eb1bf2c 100644
--- a/support/nfs/exports.c
+++ b/support/nfs/exports.c
@@ -135,12 +135,19 @@ putexportent(struct exportent *ep)
{
FILE *fp;
int *id, i;
+ char *esc=ep->e_path;
if (!efp)
return;
fp = efp->x_fp;
- fprintf(fp, "%s\t%s(", ep->e_path, ep->e_hostname);
+ for (i=0; esc[i]; i++)
+ if (iscntrl(esc[i]) || esc[i] == '"' || esc[i] == '\\'|| isspace(esc[i]))
+ fprintf(fp, "\\%03o", esc[i]);
+ else
+ fprintf(fp, "%c", esc[i]);
+
+ fprintf(fp, "\t%s(", ep->e_hostname);
fprintf(fp, "%s,", (ep->e_flags & NFSEXP_READONLY)? "ro" : "rw");
fprintf(fp, "%ssync,", (ep->e_flags & NFSEXP_ASYNC)? "a" : "");
fprintf(fp, "%swdelay,", (ep->e_flags & NFSEXP_GATHERED_WRITES)?
diff --git a/support/nfs/xio.c b/support/nfs/xio.c
index cfdb1d1..9bb5100 100644
--- a/support/nfs/xio.c
+++ b/support/nfs/xio.c
@@ -83,14 +83,32 @@ xfunlock(int fd)
close(fd);
}
+#define isoctal(x) (isdigit(x) && ((x)<'8'))
int
xgettok(XFILE *xfp, char sepa, char *tok, int len)
{
int i = 0;
int c = 0;
+ int quoted=0;
- while (i < len && (c = xgetc(xfp)) != EOF && c != sepa && !isspace(c))
+ while (i < len && (c = xgetc(xfp)) != EOF &&
+ (quoted || (c != sepa && !isspace(c)))) {
+ if (c == '"') {
+ quoted = !quoted;
+ continue;
+ }
tok[i++] = c;
+ if (i >= 4 &&
+ tok[i-4] == '\\' &&
+ isoctal(tok[i-3]) &&
+ isoctal(tok[i-2]) &&
+ isoctal(tok[i-1]) &&
+ ((tok[i]=0),
+ (c = strtol(tok+i-3,NULL, 8)) < 256)) {
+ i -= 4;
+ tok[i++] = c;
+ }
+ }
if (c == '\n')
xungetc(c, xfp);
if (!i)