-# $NetBSD: Makefile,v 1.25 1995/10/10 21:42:00 gwr Exp $
+# $OpenBSD: Makefile,v 1.3 1996/03/21 00:15:18 niklas Exp $
+# $NetBSD: Makefile,v 1.26 1996/03/16 10:29:36 leo Exp $
# @(#)Makefile 8.5 (Berkeley) 3/31/94
# Not ported: XNSrouted enpload scsiformat startslip
SUBDIR= badsect disklabel ccdconfig dmesg fastboot ifconfig init ipf \
ipfstat mknod modload modunload mount mountd nfsd nfsiod nologin \
- ping quotacheck reboot route routed savecore shutdown slattach \
- swapon ttyflags umount
+ ping quotacheck reboot route routed shutdown slattach swapon \
+ ttyflags umount
+
+# XXX Temporarely until all ports are able to use savecore (leo)
+.if (${MACHINE} == "atari")
+SUBDIR+= savecore
+.else
+SUBDIR+= savecore.old
+.endif
# support for various file systems
SUBDIR+= mount_ados
-.\" $NetBSD: ccdconfig.8,v 1.1.2.1 1995/11/11 02:43:33 thorpej Exp $
+.\" $OpenBSD: ccdconfig.8,v 1.3 1996/03/21 00:15:23 niklas Exp $
+.\" $NetBSD: ccdconfig.8,v 1.4 1996/02/28 01:01:17 thorpej Exp $
.\"
-.\" Copyright (c) 1995 Jason R. Thorpe.
+.\" Copyright (c) 1996 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Jason R. Thorpe.
+.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
-.\" This product includes software developed for the NetBSD Project
-.\" by Jason R. Thorpe.
-.\" 4. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
+.\" This product includes software developed by the NetBSD
+.\" Foundation, Inc. and its contributors.
+.\" 4. Neither the name of The NetBSD Foundation nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd July 17, 1995
.Dt CCDCONFIG 8
.Bd -unfilled -offset indent
CCDF_SWAP 0x01 Interleave should be dmmax
CCDF_UNIFORM 0x02 Use uniform interleave
+CCDF_MIRROR 0x04 Enable data mirroring
.Ed
.Pp
The format in the
-/* $NetBSD: ccdconfig.c,v 1.2.2.1 1995/11/11 02:43:35 thorpej Exp $ */
+/* $OpenBSD: ccdconfig.c,v 1.3 1996/03/21 00:15:24 niklas Exp $ */
+/* $NetBSD: ccdconfig.c,v 1.5 1996/02/28 01:01:18 thorpej Exp $ */
-/*
- * Copyright (c) 1995 Jason R. Thorpe.
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project
- * by Jason R. Thorpe.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/param.h>
} flagvaltab[] = {
{ "CCDF_SWAP", CCDF_SWAP },
{ "CCDF_UNIFORM", CCDF_UNIFORM },
+ { "CCDF_MIRROR", CCDF_MIRROR },
{ NULL, 0 },
};
-/* $NetBSD: pathnames.h,v 1.1 1995/08/17 16:37:20 thorpej Exp $ */
+/* $OpenBSD: pathnames.h,v 1.2 1996/03/21 00:15:27 niklas Exp $ */
+/* $NetBSD: pathnames.h,v 1.2 1996/02/28 01:01:20 thorpej Exp $ */
-/*
- * Copyright (c) 1995 Jason R. Thorpe.
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
* All rights reserved.
*
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project
- * by Jason R. Thorpe.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
*
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
*/
#define _PATH_CCDCONF "/etc/ccd.conf"
-/* $NetBSD: disklabel.c,v 1.29 1995/06/26 23:17:26 jtc Exp $ */
+/* $OpenBSD: disklabel.c,v 1.3 1996/03/21 00:15:31 niklas Exp $ */
+/* $NetBSD: disklabel.c,v 1.30 1996/03/14 19:49:24 ghudson Exp $ */
/*
* Copyright (c) 1987, 1993
/* from static char sccsid[] = "@(#)disklabel.c 1.2 (Symmetric) 11/28/85"; */
static char sccsid[] = "@(#)disklabel.c 8.2 (Berkeley) 1/7/94";
#else
-static char rcsid[] = "$NetBSD: disklabel.c,v 1.29 1995/06/26 23:17:26 jtc Exp $";
+static char rcsid[] = "$NetBSD: disklabel.c,v 1.30 1996/03/14 19:49:24 ghudson Exp $";
#endif
#endif /* not lint */
if (lp->d_flags & D_BADSECT)
fprintf(f, " badsect");
fprintf(f, "\n");
- fprintf(f, "bytes/sector: %d\n", lp->d_secsize);
- fprintf(f, "sectors/track: %d\n", lp->d_nsectors);
- fprintf(f, "tracks/cylinder: %d\n", lp->d_ntracks);
- fprintf(f, "sectors/cylinder: %d\n", lp->d_secpercyl);
- fprintf(f, "cylinders: %d\n", lp->d_ncylinders);
- fprintf(f, "rpm: %d\n", lp->d_rpm);
- fprintf(f, "interleave: %d\n", lp->d_interleave);
- fprintf(f, "trackskew: %d\n", lp->d_trackskew);
- fprintf(f, "cylinderskew: %d\n", lp->d_cylskew);
- fprintf(f, "headswitch: %d\t\t# milliseconds\n", lp->d_headswitch);
- fprintf(f, "track-to-track seek: %d\t# milliseconds\n", lp->d_trkseek);
+ fprintf(f, "bytes/sector: %ld\n", (long) lp->d_secsize);
+ fprintf(f, "sectors/track: %ld\n", (long) lp->d_nsectors);
+ fprintf(f, "tracks/cylinder: %ld\n", (long) lp->d_ntracks);
+ fprintf(f, "sectors/cylinder: %ld\n", (long) lp->d_secpercyl);
+ fprintf(f, "cylinders: %ld\n", (long) lp->d_ncylinders);
+ fprintf(f, "total sectors: %ld\n", (long) lp->d_secperunit);
+ fprintf(f, "rpm: %ld\n", (long) lp->d_rpm);
+ fprintf(f, "interleave: %ld\n", (long) lp->d_interleave);
+ fprintf(f, "trackskew: %ld\n", (long) lp->d_trackskew);
+ fprintf(f, "cylinderskew: %ld\n", (long) lp->d_cylskew);
+ fprintf(f, "headswitch: %ld\t\t# milliseconds\n",
+ (long) lp->d_headswitch);
+ fprintf(f, "track-to-track seek: %ld\t# milliseconds\n",
+ (long) lp->d_trkseek);
fprintf(f, "drivedata: ");
for (i = NDDATA - 1; i >= 0; i--)
if (lp->d_drivedata[i])
lp->d_ncylinders = v;
continue;
}
+ if (!strcmp(cp, "total sectors")) {
+ v = atoi(tp);
+ if (v <= 0) {
+ warnx("line %d: bad %s: %s", lineno, cp, tp);
+ errors++;
+ } else
+ lp->d_secperunit = v;
+ continue;
+ }
if (!strcmp(cp, "rpm")) {
v = atoi(tp);
if (v <= 0) {
-/* $NetBSD: dumprmt.c,v 1.9 1995/03/18 14:54:59 cgd Exp $ */
+/* $OpenBSD: dumprmt.c,v 1.2 1996/03/21 00:15:35 niklas Exp $ */
+/* $NetBSD: dumprmt.c,v 1.10 1996/03/15 22:39:26 scottr Exp $ */
/*-
* Copyright (c) 1980, 1993
#if 0
static char sccsid[] = "@(#)dumprmt.c 8.1 (Berkeley) 6/5/93";
#else
-static char rcsid[] = "$NetBSD: dumprmt.c,v 1.9 1995/03/18 14:54:59 cgd Exp $";
+static char rcsid[] = "$NetBSD: dumprmt.c,v 1.10 1996/03/15 22:39:26 scottr Exp $";
#endif
#endif /* not lint */
static int rmtreply __P((char *));
extern int ntrec; /* blocking factor on tape */
+extern uid_t uid; /* real uid */
+extern uid_t euid; /* effective uid */
int
rmthost(host)
rmtpeer = ++cp;
} else
tuser = pwd->pw_name;
+
+ (void) seteuid(euid);
rmtape = rcmd(&rmtpeer, (u_short)sp->s_port, pwd->pw_name, tuser,
_PATH_RMT, (int *)0);
+ (void) setuid(uid); /* Just to be Really Really safe */
+
size = ntrec * TP_BSIZE;
if (size > 60 * 1024) /* XXX */
size = 60 * 1024;
-/* $NetBSD: main.c,v 1.7 1996/02/05 23:59:40 mrg Exp $ */
+/* $OpenBSD: main.c,v 1.4 1996/03/21 00:15:37 niklas Exp $ */
+/* $NetBSD: main.c,v 1.8 1996/03/15 22:39:32 scottr Exp $ */
/*-
* Copyright (c) 1980, 1991, 1993, 1994
#if 0
static char sccsid[] = "@(#)main.c 8.4 (Berkeley) 4/15/94";
#else
-static char rcsid[] = "$NetBSD: main.c,v 1.7 1996/02/05 23:59:40 mrg Exp $";
+static char rcsid[] = "$NetBSD: main.c,v 1.8 1996/03/15 22:39:32 scottr Exp $";
#endif
#endif /* not lint */
long dev_bsize = 1; /* recalculated below */
long blocksperfile; /* output blocks per file */
char *host = NULL; /* remote host (if any) */
+uid_t uid; /* real uid */
+uid_t euid; /* effective uid */
static long numarg __P((char *, long, long));
static void obsolete __P((int *, char **[]));
int i, anydirskipped, bflag = 0, Tflag = 0, honorlevel = 1;
ino_t maxino;
+ uid = getuid();
+ euid = geteuid();
+ (void) seteuid(uid);
+
spcl.c_date = 0;
(void)time((time_t *)&spcl.c_date);
exit(X_ABORT);
#endif
}
- (void)setuid(getuid()); /* rmthost() is the only reason to be setuid */
+ (void) setuid(uid); /* rmthost() is the only reason to be setuid */
if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
signal(SIGHUP, sig);
-.\" $NetBSD: fsdb.8,v 1.3 1996/02/06 02:25:04 jtc Exp $
+.\" $OpenBSD: fsdb.8,v 1.3 1996/03/21 00:15:42 niklas Exp $
+.\" $NetBSD: fsdb.8,v 1.4 1996/02/27 22:28:09 jtc Exp $
.\"
-.\" Copyright (c) 1995 John T. Kohl
+.\" Copyright (c) 1996 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by John T. Kohl.
+.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
-.\" 3. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the NetBSD
+.\" Foundation, Inc. and its contributors.
+.\" 4. Neither the name of The NetBSD Foundation nor the names of its
+.\" contributors may be used to endorse or promote products derived
+.\" from this software without specific prior written permission.
.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-.\" DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
-.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-.\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd September 14, 1995
-/* $NetBSD: fsdb.c,v 1.2 1995/10/08 23:18:10 thorpej Exp $ */
+/* $OpenBSD: fsdb.c,v 1.2 1996/03/21 00:15:46 niklas Exp $ */
+/* $NetBSD: fsdb.c,v 1.3 1996/02/27 22:28:12 jtc Exp $ */
-/*
- * Copyright (c) 1995 John T. Kohl
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by John T. Kohl.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef lint
-static char rcsid[] = "$NetBSD: fsdb.c,v 1.2 1995/10/08 23:18:10 thorpej Exp $";
+static char rcsid[] = "$NetBSD: fsdb.c,v 1.3 1996/02/27 22:28:12 jtc Exp $";
#endif /* not lint */
#include <sys/types.h>
-/* $NetBSD: fsdb.h,v 1.2 1995/10/08 23:18:11 thorpej Exp $ */
+/* $OpenBSD: fsdb.h,v 1.2 1996/03/21 00:15:48 niklas Exp $ */
+/* $NetBSD: fsdb.h,v 1.3 1996/02/27 22:28:13 jtc Exp $ */
-/*
- * Copyright (c) 1995 John T. Kohl
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by John T. Kohl.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-/* $NetBSD: fsdbutil.c,v 1.3 1995/12/14 22:30:45 thorpej Exp $ */
+/* $OpenBSD: fsdbutil.c,v 1.4 1996/03/21 00:15:50 niklas Exp $ */
+/* $NetBSD: fsdbutil.c,v 1.4 1996/02/27 22:28:16 jtc Exp $ */
-/*
- * Copyright (c) 1995 John T. Kohl
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by John T. Kohl.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef lint
-static char rcsid[] = "$NetBSD: fsdbutil.c,v 1.3 1995/12/14 22:30:45 thorpej Exp $";
+static char rcsid[] = "$NetBSD: fsdbutil.c,v 1.4 1996/02/27 22:28:16 jtc Exp $";
#endif /* not lint */
#include <sys/types.h>
-# $NetBSD: Makefile,v 1.4 1995/03/18 14:57:40 cgd Exp $
+# $OpenBSD: Makefile,v 1.3 1996/03/21 00:15:56 niklas Exp $
+# $NetBSD: Makefile,v 1.5 1996/02/18 11:59:09 fvdl Exp $
# @(#)Makefile 8.2 (Berkeley) 3/27/94
PROG= mount_nfs
SRCS= mount_nfs.c getmntopts.c
MAN= mount_nfs.8
-MOUNT= ${.CURDIR}/../mount
-CFLAGS+= -DNFS -I${MOUNT}
-.PATH: ${MOUNT}
+# Temporarily removed to use own getmntops.c - fvdl
+#
+#MOUNT= ${.CURDIR}/../mount
+#CFLAGS+= -DNFS -I${MOUNT}
+#.PATH: ${MOUNT}
+CFLAGS+=-DNFS
.include <bsd.own.mk> # For KERBEROS
.if defined(KERBEROS)
-CFLAGS+=-DKERBEROS
+CFLAGS+=-DNFSKERB
DPADD+= ${LIBKRB} ${LIBDES}
LDADD+= -lkrb -ldes
.endif
--- /dev/null
+/* $OpenBSD: getmntopts.c,v 1.1 1996/03/21 00:15:58 niklas Exp $ */
+
+/*-
+ * Copyright (c) 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)getmntopts.c 8.3 (Berkeley) 3/29/95";
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/mount.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fstab.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "mntopts.h"
+
+int getmnt_silent = 0;
+
+void
+getmntopts(options, m0, flagp, altflagp)
+ const char *options;
+ const struct mntopt *m0;
+ int *flagp;
+ int *altflagp;
+{
+ const struct mntopt *m;
+ int negative;
+ char *opt, *optbuf, *p;
+ int *thisflagp;
+
+ /* Copy option string, since it is about to be torn asunder... */
+ if ((optbuf = strdup(options)) == NULL)
+ err(1, NULL);
+
+ for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) {
+ /* Check for "no" prefix. */
+ if (opt[0] == 'n' && opt[1] == 'o') {
+ negative = 1;
+ opt += 2;
+ } else
+ negative = 0;
+
+ /*
+ * for options with assignments in them (ie. quotas)
+ * ignore the assignment as it's handled elsewhere
+ */
+ p = strchr(opt, '=');
+ if (p)
+ *p = '\0';
+
+ /* Scan option table. */
+ for (m = m0; m->m_option != NULL; ++m)
+ if (strcasecmp(opt, m->m_option) == 0)
+ break;
+
+ /* Save flag, or fail if option is not recognised. */
+ if (m->m_option) {
+ thisflagp = m->m_altloc ? altflagp : flagp;
+ if (negative == m->m_inverse)
+ *thisflagp |= m->m_flag;
+ else
+ *thisflagp &= ~m->m_flag;
+ } else if (!getmnt_silent) {
+ errx(1, "-o %s: option not supported", opt);
+ }
+ }
+
+ free(optbuf);
+}
--- /dev/null
+/* $OpenBSD: mntopts.h,v 1.1 1996/03/21 00:16:00 niklas Exp $ */
+
+/*-
+ * Copyright (c) 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)mntopts.h 8.7 (Berkeley) 3/29/95
+ */
+
+struct mntopt {
+ const char *m_option; /* option name */
+ int m_inverse; /* if a negative option, eg "dev" */
+ int m_flag; /* bit to set, eg. MNT_RDONLY */
+ int m_altloc; /* 1 => set bit in altflags */
+};
+
+/* User-visible MNT_ flags. */
+#define MOPT_ASYNC { "async", 0, MNT_ASYNC, 0 }
+#define MOPT_NODEV { "dev", 1, MNT_NODEV, 0 }
+#define MOPT_NOEXEC { "exec", 1, MNT_NOEXEC, 0 }
+#define MOPT_NOSUID { "suid", 1, MNT_NOSUID, 0 }
+#define MOPT_RDONLY { "rdonly", 0, MNT_RDONLY, 0 }
+#define MOPT_SYNC { "sync", 0, MNT_SYNCHRONOUS, 0 }
+#define MOPT_UNION { "union", 0, MNT_UNION, 0 }
+#define MOPT_USERQUOTA { "userquota", 0, 0, 0 }
+#define MOPT_GROUPQUOTA { "groupquota", 0, 0, 0 }
+
+/* Control flags. */
+#define MOPT_FORCE { "force", 0, MNT_FORCE, 0 }
+#define MOPT_UPDATE { "update", 0, MNT_UPDATE, 0 }
+#define MOPT_RO { "ro", 0, MNT_RDONLY, 0 }
+#define MOPT_RW { "rw", 1, MNT_RDONLY, 0 }
+
+/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */
+#define MOPT_AUTO { "auto", 0, 0, 0 }
+
+#define MOPT_FSTAB_COMPAT \
+ MOPT_RO, \
+ MOPT_RW, \
+ MOPT_AUTO
+
+/* Standard options which all mounts can understand. */
+#define MOPT_STDOPTS \
+ MOPT_USERQUOTA, \
+ MOPT_GROUPQUOTA, \
+ MOPT_FSTAB_COMPAT, \
+ MOPT_NODEV, \
+ MOPT_NOEXEC, \
+ MOPT_NOSUID, \
+ MOPT_RDONLY, \
+ MOPT_UNION
+
+void getmntopts __P((const char *, const struct mntopt *, int *, int *));
+extern int getmnt_silent;
-.\" $NetBSD: mount_nfs.8,v 1.2 1995/03/18 14:57:41 cgd Exp $
+.\" $OpenBSD: mount_nfs.8,v 1.2 1996/03/21 00:16:02 niklas Exp $
+.\" $NetBSD: mount_nfs.8,v 1.3 1996/02/18 11:59:10 fvdl Exp $
.\"
-.\" Copyright (c) 1992, 1993, 1994
+.\" Copyright (c) 1992, 1993, 1994, 1995
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)mount_nfs.8 8.2 (Berkeley) 3/27/94
+.\" @(#)mount_nfs.8 8.3 (Berkeley) 3/29/95
.\"
-.Dd March 27, 1994
+.Dd March 29, 1995
.Dt MOUNT_NFS 8
.Os BSD 4.4
.Sh NAME
.Nd mount nfs file systems
.Sh SYNOPSIS
.Nm mount_nfs
-.Op Fl KMPTbcdiklqs
+.Op Fl 23KPTUbcdilqs
.Op Fl D Ar deadthresh
+.Op Fl I Ar readdirsize
.Op Fl L Ar leaseterm
.Op Fl R Ar retrycnt
.Op Fl a Ar maxreadahead
.Ar node.
This command is normally executed by
.Xr mount 8 .
-It implements the mount protocol as described in RFC 1094, Appendix A.
+It implements the mount protocol as described in RFC 1094, Appendix A and
+.%T "NFS: Network File System Version 3 Protocol Specification" ,
+Appendix I.
.Pp
The options are:
.Bl -tag -width indent
+.It Fl 2
+Use the NFS Version 2 protocol.
+.It Fl 3
+Use the NFS Version 3 protocol. The default is to try version 3 first, and
+fall back to version 2 if the mount fails.
.It Fl D
Used with NQNFS to set the
.Dq "dead server threshold"
(i.e. never assume cached data still valid).
This option is not generally recommended and is really an experimental
feature.
+.It Fl I
+Set the readdir read size to the specified value. The value should normally
+be a multiple of DIRBLKSIZ that is <= the read size for the mount.
.It Fl K
Pass Kerberos authenticators to the server for client-to-server
user-credential mapping.
-This may only be used over TCP mounts between 4.4BSD clients and servers.
+This requires that the kernel be built with the NFSKERB option.
+(Refer to the INTERNET-DRAFT titled
+.%T "Authentication Mechanisms for ONC RPC" ,
+for more information.)
.It Fl L
Used with NQNFS to set the lease term to the specified number of seconds.
Only use this argument for mounts with a large round trip delay.
Values are normally in the 10-30 second range.
-.It Fl M
-Assume that other clients are not writing a file concurrently with this client.
-This implements a slightly less strict consistency criteria than 4.3BSD-Reno
-did, that is more in line with most commercial client implementations.
-This is recommended for servers that do not support leasing.
.It Fl P
Use a reserved socket port number.
This is useful for mounting servers that require clients to use a
-reserved port number.
+reserved port number on the mistaken belief that this makes NFS
+more secure. (For the rare case where the client has a trusted root account
+but untrusworthy users and the network cables are in secure areas this does
+help, but for normal desktop clients this does not apply.)
.It Fl R
Set the retry count for doing the mount to the specified value.
.It Fl T
This is recommended for servers that are not on the same LAN cable as
the client.
(NB: This is NOT supported by most non-BSD servers.)
+.It Fl U
+Force the mount protocol to use UDP transport, even for TCP NFS mounts.
+(Necessary for some old BSD servers.)
.It Fl a
Set the read-ahead count to the specified value.
This may be in the range of 0 - 4, and determines how many blocks
will be read ahead when a large file is being read sequentially.
-This is recommended for mounts with a large bandwidth * delay product.
+Trying a value greater than 1 for this is suggested for
+mounts with a large bandwidth * delay product.
.It Fl b
If an initial attempt to contact the server fails, fork off a child to keep
trying the mount in the background.
For UDP mount points, do not do a
.Xr connect 2 .
This must be used for servers that do not reply to requests from the
-standard port number.
+standard NFS port number 2049.
.It Fl d
-Do not estimate retransmit timeout dynamically.
-This may be useful for UDP mounts that exhibit high retry rates.
+Turn off the dynamic retransmit timeout estimator.
+This may be useful for UDP mounts that exhibit high retry rates,
+since it is possible that the dynamically estimated timeout interval is too
+short.
.It Fl g
Set the maximum size of the group list for the credentials to the
specified value.
Make the mount interruptible, which implies that file system calls that
are delayed due to an unresponsive server will fail with EINTR when a
termination signal is posted for the process.
-.It Fl k
-Used with NQNFS to specify
-.Dq get a lease
-for the file name being looked up.
-This is recommended unless the server is complaining about excessive
-lease load.
.It Fl l
-Used with NQNFS to specify that the \fBReaddir_and_Lookup\fR RPC should
+Used with NQNFS and NFSV3 to specify that the \fBReaddirPlus\fR RPC should
be used.
This option reduces RPC traffic for cases such as
.Dq "ls -l" ,
-but increases the lease load on the server.
-This is recommended unless the server is complaining about excessive
-lease load.
+but tends to flood the attribute and name caches with prefetched entries.
+Try this option and see whether performance improves or degrades. Probably
+most useful for client to server network interconnects with a large bandwidth
+times delay product.
.It Fl m
Set the Kerberos realm to the string argument.
Used with the
.Xr mount 8
man page for possible options and their meanings.
.It Fl q
-Use the leasing extensions to the protocol to maintain cache consistency.
-This protocol, referred to as Not Quite Nfs (NQNFS),
-is only supported by 4.4BSD servers.
+Use the leasing extensions to the NFS Version 3 protocol
+to maintain cache consistency.
+This protocol version 2 revision to Not Quite Nfs (NQNFS)
+is only supported by this updated release of NFS code.
+It is not backwards compatible with the version 1 NQNFS protocol
+that was part of the first release of 4.4BSD-Lite.
+To interoperate with a first release 4.4BSD-Lite NFS system you will have to
+avoid this option until you have had an oppurtunity to upgrade the NFS code
+to release 2 of 4.4BSD-Lite on all your systems.
.It Fl r
Set the read data size to the specified value.
-It should be a power of 2 greater than or equal to 1024.
+It should normally be a power of 2 greater than or equal to 1024.
This should be used for UDP mounts when the
.Dq "fragments dropped due to timeout"
value is getting large while actively using a mount point.
.Xr nfsstat 1
shows high retransmit rates while the file system is active or reducing the
value if there is a low retransmit rate but long response delay observed.
+(Normally, the -d option should be specified when using this option to manually
+tune the timeout
+interval.)
.It Fl w
Set the write data size to the specified value.
Ditto the comments w.r.t. the
-/* $NetBSD: mount_nfs.c,v 1.10 1995/05/21 15:17:13 mycroft Exp $ */
+/* $OpenBSD: mount_nfs.c,v 1.3 1996/03/21 00:16:03 niklas Exp $ */
+/* $NetBSD: mount_nfs.c,v 1.11 1996/02/18 11:59:11 fvdl Exp $ */
/*
* Copyright (c) 1992, 1993, 1994
#ifndef lint
#if 0
-static char sccsid[] = "@(#)mount_nfs.c 8.3 (Berkeley) 3/27/94";
+static char sccsid[] = "@(#)mount_nfs.c 8.11 (Berkeley) 5/4/95";
#else
-static char rcsid[] = "$NetBSD: mount_nfs.c,v 1.10 1995/05/21 15:17:13 mycroft Exp $";
+static char rcsid[] = "$NetBSD: mount_nfs.c,v 1.11 1996/02/18 11:59:11 fvdl Exp $";
#endif
#endif /* not lint */
#include <netiso/iso.h>
#endif
-#ifdef KERBEROS
+#ifdef NFSKERB
#include <kerberosIV/des.h>
#include <kerberosIV/krb.h>
#endif
#include <nfs/rpcv2.h>
-#include <nfs/nfsv2.h>
+#include <nfs/nfsproto.h>
#define _KERNEL
#include <nfs/nfs.h>
#undef _KERNEL
#include "mntopts.h"
+#define ALTF_BG 0x1
+#define ALTF_NOCONN 0x2
+#define ALTF_DUMBTIMR 0x4
+#define ALTF_INTR 0x8
+#define ALTF_KERB 0x10
+#define ALTF_NFSV3 0x20
+#define ALTF_RDIRPLUS 0x40
+#define ALTF_MNTUDP 0x80
+#define ALTF_RESVPORT 0x100
+#define ALTF_SEQPACKET 0x200
+#define ALTF_NQNFS 0x400
+#define ALTF_SOFT 0x800
+#define ALTF_TCP 0x1000
+
struct mntopt mopts[] = {
MOPT_STDOPTS,
MOPT_FORCE,
MOPT_UPDATE,
+ { "bg", 0, ALTF_BG, 1 },
+ { "conn", 1, ALTF_NOCONN, 1 },
+ { "dumbtimer", 0, ALTF_DUMBTIMR, 1 },
+ { "intr", 0, ALTF_INTR, 1 },
+#ifdef NFSKERB
+ { "kerb", 0, ALTF_KERB, 1 },
+#endif
+ { "nfsv3", 0, ALTF_NFSV3, 1 },
+ { "rdirplus", 0, ALTF_RDIRPLUS, 1 },
+ { "mntudp", 0, ALTF_MNTUDP, 1 },
+ { "resvport", 0, ALTF_RESVPORT, 1 },
+#ifdef ISO
+ { "seqpacket", 0, ALTF_SEQPACKET, 1 },
+#endif
+ { "nqnfs", 0, ALTF_NQNFS, 1 },
+ { "soft", 0, ALTF_SOFT, 1 },
+ { "tcp", 0, ALTF_TCP, 1 },
{ NULL }
};
struct nfs_args nfsdefargs = {
+ NFS_ARGSVERSION,
(struct sockaddr *)0,
sizeof (struct sockaddr_in),
SOCK_DGRAM,
0,
- (nfsv2fh_t *)0,
+ (u_char *)0,
0,
+ NFSMNT_NFSV3,
NFS_WSIZE,
NFS_RSIZE,
- NFS_TIMEO,
+ NFS_READDIRSIZE,
+ 10,
NFS_RETRANS,
NFS_MAXGRPS,
NFS_DEFRAHEAD,
};
struct nfhret {
- u_long stat;
- nfsv2fh_t nfh;
+ u_long stat;
+ long vers;
+ long auth;
+ long fhsize;
+ u_char nfh[NFSX_V3FHMAX];
};
#define DEF_RETRY 10000
#define BGRND 1
#define ISBGRND 2
-int retrycnt = DEF_RETRY;
+int retrycnt;
int opflags = 0;
+int nfsproto = IPPROTO_UDP;
+int mnttcp_ok = 1;
+int force2 = 0;
+int force3 = 0;
-#ifdef KERBEROS
+#ifdef NFSKERB
char inst[INST_SZ];
char realm[REALM_SZ];
-KTEXT_ST kt;
+struct {
+ u_long kind;
+ KTEXT_ST kt;
+} ktick;
+struct nfsrpc_nickverf kverf;
+struct nfsrpc_fullblock kin, kout;
+NFSKERBKEY_T kivec;
+CREDENTIALS kcr;
+struct timeval ktv;
+NFSKERBKEYSCHED_T kerb_keysched;
#endif
int getnfsargs __P((char *, struct nfs_args *));
register struct nfs_args *nfsargsp;
struct nfs_args nfsargs;
struct nfsd_cargs ncd;
- int mntflags, i, nfssvc_flag, num;
+ int mntflags, altflags, i, nfssvc_flag, num;
char *name, *p, *spec;
int error = 0;
-#ifdef KERBEROS
+#ifdef NFSKERB
uid_t last_ruid;
#endif
-#ifdef KERBEROS
+#ifdef NFSKERB
last_ruid = -1;
if (krb_get_lrealm(realm, 0) != KSUCCESS)
(void)strcpy(realm, "[not set]");
+ if (sizeof (struct nfsrpc_nickverf) != RPCX_NICKVERF ||
+ sizeof (struct nfsrpc_fullblock) != RPCX_FULLBLOCK ||
+ ((char *)&ktick.kt) - ((char *)&ktick) != NFSX_UNSIGNED ||
+ ((char *)ktick.kt.dat) - ((char *)&ktick) != 2 * NFSX_UNSIGNED)
+ fprintf(stderr, "Yikes! NFSKERB structs not packed!!\n");
+
#endif
retrycnt = DEF_RETRY;
mntflags = 0;
+ altflags = 0;
nfsargs = nfsdefargs;
nfsargsp = &nfsargs;
while ((c = getopt(argc, argv,
- "a:bcdD:g:iKklL:Mm:o:PpqR:r:sTt:w:x:")) != EOF)
+ "23a:bcdD:g:I:iKL:lm:o:PpqR:r:sTt:w:x:U")) != EOF)
switch (c) {
+ case '3':
+ if (force2)
+ errx(1, "-2 and -3 are mutually exclusive");
+ force3 = 1;
+ break;
+ case '2':
+ if (force3)
+ errx(1, "-2 and -3 are mutually exclusive");
+ force2 = 1;
+ nfsargsp->flags &= ~NFSMNT_NFSV3;
+ break;
case 'a':
num = strtol(optarg, &p, 10);
if (*p || num < 0)
nfsargsp->flags |= NFSMNT_MAXGRPS;
break;
#endif
+ case 'I':
+ num = strtol(optarg, &p, 10);
+ if (*p || num <= 0)
+ errx(1, "illegal -I value -- %s", optarg);
+ nfsargsp->readdirsize = num;
+ nfsargsp->flags |= NFSMNT_READDIRSIZE;
+ break;
case 'i':
nfsargsp->flags |= NFSMNT_INT;
break;
-#ifdef KERBEROS
+#ifdef NFSKERB
case 'K':
nfsargsp->flags |= NFSMNT_KERB;
break;
#endif
- case 'k':
- nfsargsp->flags |= NFSMNT_NQLOOKLEASE;
- break;
case 'L':
num = strtol(optarg, &p, 10);
if (*p || num < 2)
nfsargsp->flags |= NFSMNT_LEASETERM;
break;
case 'l':
- nfsargsp->flags |= NFSMNT_RDIRALOOK;
+ nfsargsp->flags |= NFSMNT_RDIRPLUS;
break;
- case 'M':
- nfsargsp->flags |= NFSMNT_MYWRITE;
- break;
-#ifdef KERBEROS
+#ifdef NFSKERB
case 'm':
(void)strncpy(realm, optarg, REALM_SZ - 1);
realm[REALM_SZ - 1] = '\0';
break;
#endif
case 'o':
- getmntopts(optarg, mopts, &mntflags);
+ getmntopts(optarg, mopts, &mntflags, &altflags);
+ if(altflags & ALTF_BG)
+ opflags |= BGRND;
+ if(altflags & ALTF_NOCONN)
+ nfsargsp->flags |= NFSMNT_NOCONN;
+ if(altflags & ALTF_DUMBTIMR)
+ nfsargsp->flags |= NFSMNT_DUMBTIMR;
+ if(altflags & ALTF_INTR)
+ nfsargsp->flags |= NFSMNT_INT;
+#ifdef NFSKERB
+ if(altflags & ALTF_KERB)
+ nfsargsp->flags |= NFSMNT_KERB;
+#endif
+ if(altflags & ALTF_NFSV3)
+ nfsargsp->flags |= NFSMNT_NFSV3;
+ if(altflags & ALTF_RDIRPLUS)
+ nfsargsp->flags |= NFSMNT_RDIRPLUS;
+ if(altflags & ALTF_MNTUDP)
+ mnttcp_ok = 0;
+ if(altflags & ALTF_RESVPORT)
+ nfsargsp->flags |= NFSMNT_RESVPORT;
+#ifdef ISO
+ if(altflags & ALTF_SEQPACKET)
+ nfsargsp->sotype = SOCK_SEQPACKET;
+#endif
+ if(altflags & ALTF_NQNFS)
+ nfsargsp->flags |= (NFSMNT_NQNFS|NFSMNT_NFSV3);
+ if(altflags & ALTF_SOFT)
+ nfsargsp->flags |= NFSMNT_SOFT;
+ if(altflags & ALTF_TCP) {
+ nfsargsp->sotype = SOCK_STREAM;
+ nfsproto = IPPROTO_TCP;
+ }
+ altflags = 0;
break;
case 'P':
nfsargsp->flags |= NFSMNT_RESVPORT;
break;
#endif
case 'q':
- nfsargsp->flags |= NFSMNT_NQNFS;
+ nfsargsp->flags |= (NFSMNT_NQNFS | NFSMNT_NFSV3);
break;
case 'R':
num = strtol(optarg, &p, 10);
break;
case 'T':
nfsargsp->sotype = SOCK_STREAM;
+ nfsproto = IPPROTO_TCP;
break;
case 't':
num = strtol(optarg, &p, 10);
nfsargsp->retrans = num;
nfsargsp->flags |= NFSMNT_RETRANS;
break;
+ case 'U':
+ mnttcp_ok = 0;
+ break;
default:
usage();
break;
}
nfssvc_flag =
NFSSVC_MNTD | NFSSVC_GOTAUTH | NFSSVC_AUTHINFAIL;
-#ifdef KERBEROS
+#ifdef NFSKERB
/*
* Set up as ncd_authuid for the kerberos call.
* Must set ruid to ncd_authuid and reset the
* ticket name iff ncd_authuid is not the same
* as last time, so that the right ticket file
* is found.
+ * Get the Kerberos credential structure so that
+ * we have the seesion key and get a ticket for
+ * this uid.
+ * For more info see the IETF Draft "Authentication
+ * in ONC RPC".
*/
if (ncd.ncd_authuid != last_ruid) {
krb_set_tkt_string("");
last_ruid = ncd.ncd_authuid;
}
setreuid(ncd.ncd_authuid, 0);
- if (krb_mk_req(&kt, "rcmd", inst, realm, 0) ==
- KSUCCESS &&
- kt.length <= (RPCAUTH_MAXSIZ - 2 * NFSX_UNSIGNED)) {
- ncd.ncd_authtype = RPCAUTH_NQNFS;
- ncd.ncd_authlen = kt.length;
- ncd.ncd_authstr = (char *)kt.dat;
- nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
+ kret = krb_get_cred(NFS_KERBSRV, inst, realm, &kcr);
+ if (kret == RET_NOTKT) {
+ kret = get_ad_tkt(NFS_KERBSRV, inst, realm,
+ DEFAULT_TKT_LIFE);
+ if (kret == KSUCCESS)
+ kret = krb_get_cred(NFS_KERBSRV, inst, realm,
+ &kcr);
+ }
+ if (kret == KSUCCESS)
+ kret = krb_mk_req(&ktick.kt, NFS_KERBSRV, inst,
+ realm, 0);
+
+ /*
+ * Fill in the AKN_FULLNAME authenticator and verfier.
+ * Along with the Kerberos ticket, we need to build
+ * the timestamp verifier and encrypt it in CBC mode.
+ */
+ if (kret == KSUCCESS &&
+ ktick.kt.length <= (RPCAUTH_MAXSIZ-3*NFSX_UNSIGNED)
+ && gettimeofday(&ktv, (struct timezone *)0) == 0) {
+ ncd.ncd_authtype = RPCAUTH_KERB4;
+ ncd.ncd_authstr = (u_char *)&ktick;
+ ncd.ncd_authlen = nfsm_rndup(ktick.kt.length) +
+ 3 * NFSX_UNSIGNED;
+ ncd.ncd_verfstr = (u_char *)&kverf;
+ ncd.ncd_verflen = sizeof (kverf);
+ memmove(ncd.ncd_key, kcr.session,
+ sizeof (kcr.session));
+ kin.t1 = htonl(ktv.tv_sec);
+ kin.t2 = htonl(ktv.tv_usec);
+ kin.w1 = htonl(NFS_KERBTTL);
+ kin.w2 = htonl(NFS_KERBTTL - 1);
+ bzero((caddr_t)kivec, sizeof (kivec));
+
+ /*
+ * Encrypt kin in CBC mode using the session
+ * key in kcr.
+ */
+ XXX
+
+ /*
+ * Finally, fill the timestamp verifier into the
+ * authenticator and verifier.
+ */
+ ktick.kind = htonl(RPCAKN_FULLNAME);
+ kverf.kind = htonl(RPCAKN_FULLNAME);
+ NFS_KERBW1(ktick.kt) = kout.w1;
+ ktick.kt.length = htonl(ktick.kt.length);
+ kverf.verf.t1 = kout.t1;
+ kverf.verf.t2 = kout.t2;
+ kverf.verf.w2 = kout.w2;
+ nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
}
setreuid(0, 0);
-#endif /* KERBEROS */
+#endif /* NFSKERB */
}
}
exit(0);
#endif
struct timeval pertry, try;
enum clnt_stat clnt_stat;
- int so = RPC_ANYSOCK, i;
+ int so = RPC_ANYSOCK, i, nfsvers, mntvers, orgcnt;
char *hostp, *delimp;
-#ifdef KERBEROS
+#ifdef NFSKERB
char *cp;
#endif
u_short tport;
}
memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length);
}
-#ifdef KERBEROS
+#ifdef NFSKERB
if (nfsargsp->flags & NFSMNT_KERB) {
strncpy(inst, hp->h_name, INST_SZ);
inst[INST_SZ - 1] = '\0';
if (cp = strchr(inst, '.'))
*cp = '\0';
}
-#endif /* KERBEROS */
+#endif /* NFSKERB */
+ if (force2) {
+ nfsvers = NFS_VER2;
+ mntvers = RPCMNT_VER1;
+ } else {
+ nfsvers = NFS_VER3;
+ mntvers = RPCMNT_VER3;
+ }
+ orgcnt = retrycnt;
+tryagain:
nfhret.stat = EACCES; /* Mark not yet successful */
while (retrycnt > 0) {
saddr.sin_family = AF_INET;
saddr.sin_port = htons(PMAPPORT);
if ((tport = pmap_getport(&saddr, RPCPROG_NFS,
- NFS_VER2, nfsargsp->sotype == SOCK_STREAM ? IPPROTO_TCP :
+ nfsvers, nfsargsp->sotype == SOCK_STREAM ? IPPROTO_TCP :
IPPROTO_UDP)) == 0) {
if ((opflags & ISBGRND) == 0)
clnt_pcreateerror("NFS Portmap");
saddr.sin_port = 0;
pertry.tv_sec = 10;
pertry.tv_usec = 0;
- if ((clp = (nfsargsp->sotype == SOCK_STREAM ?
- clnttcp_create(&saddr, RPCPROG_MNT, RPCMNT_VER1,
- &so, 0, 0) :
- clntudp_create(&saddr, RPCPROG_MNT, RPCMNT_VER1,
- pertry, &so))) == NULL) {
+ if (mnttcp_ok && nfsargsp->sotype == SOCK_STREAM)
+ clp = clnttcp_create(&saddr, RPCPROG_MNT, mntvers,
+ &so, 0, 0);
+ else
+ clp = clntudp_create(&saddr, RPCPROG_MNT, mntvers,
+ pertry, &so);
+ if (clp == NULL) {
if ((opflags & ISBGRND) == 0)
clnt_pcreateerror("Cannot MNT PRC");
} else {
clp->cl_auth = authunix_create_default();
try.tv_sec = 10;
try.tv_usec = 0;
+ if (nfsargsp->flags & NFSMNT_KERB)
+ nfhret.auth = RPCAUTH_KERB4;
+ else
+ nfhret.auth = RPCAUTH_UNIX;
+ nfhret.vers = mntvers;
clnt_stat = clnt_call(clp, RPCMNT_MOUNT,
xdr_dir, spec, xdr_fh, &nfhret, try);
if (clnt_stat != RPC_SUCCESS) {
+ if (clnt_stat == RPC_PROGVERSMISMATCH) {
+ if (nfsvers == NFS_VER3 &&
+ !force3) {
+ retrycnt = orgcnt;
+ nfsvers = NFS_VER2;
+ mntvers = RPCMNT_VER1;
+ nfsargsp->flags &=
+ ~NFSMNT_NFSV3;
+ goto tryagain;
+ } else {
+ errx(1, "%s",
+ clnt_sperror(clp,
+ "MNT RPC"));
+ }
+ }
if ((opflags & ISBGRND) == 0)
warnx("%s", clnt_sperror(clp,
"bad MNT RPC"));
if (opflags & ISBGRND)
exit(1);
errno = nfhret.stat;
- warn("can't access %s", spec);
+ warnx("can't access %s: %s", spec, strerror(nfhret.stat));
return (0);
}
saddr.sin_port = htons(tport);
nfsargsp->addr = (struct sockaddr *) &saddr;
nfsargsp->addrlen = sizeof (saddr);
}
- nfsargsp->fh = &nfhret.nfh;
+ nfsargsp->fh = nfhret.nfh;
+ nfsargsp->fhsize = nfhret.fhsize;
nfsargsp->hostname = nam;
return (1);
}
int
xdr_fh(xdrsp, np)
XDR *xdrsp;
- struct nfhret *np;
+ register struct nfhret *np;
{
- if (!xdr_u_long(xdrsp, &(np->stat)))
+ register int i;
+ long auth, authcnt, authfnd = 0;
+
+ if (!xdr_u_long(xdrsp, &np->stat))
return (0);
if (np->stat)
return (1);
- return (xdr_opaque(xdrsp, (caddr_t)&(np->nfh), NFSX_FH));
+ switch (np->vers) {
+ case 1:
+ np->fhsize = NFSX_V2FH;
+ return (xdr_opaque(xdrsp, (caddr_t)np->nfh, NFSX_V2FH));
+ case 3:
+ if (!xdr_long(xdrsp, &np->fhsize))
+ return (0);
+ if (np->fhsize <= 0 || np->fhsize > NFSX_V3FHMAX)
+ return (0);
+ if (!xdr_opaque(xdrsp, (caddr_t)np->nfh, np->fhsize))
+ return (0);
+ if (!xdr_long(xdrsp, &authcnt))
+ return (0);
+ for (i = 0; i < authcnt; i++) {
+ if (!xdr_long(xdrsp, &auth))
+ return (0);
+ if (auth == np->auth)
+ authfnd++;
+ }
+ /*
+ * Some servers, such as DEC's OSF/1 return a nil authenticator
+ * list to indicate RPCAUTH_UNIX.
+ */
+ if (!authfnd && (authcnt > 0 || np->auth != RPCAUTH_UNIX))
+ np->stat = EAUTH;
+ return (1);
+ };
+ return (0);
}
__dead void
-.\" $NetBSD: mount_umap.8,v 1.2 1995/03/18 14:58:16 cgd Exp $
+.\" $OpenBSD: mount_umap.8,v 1.3 1996/03/21 00:16:06 niklas Exp $
+.\" $NetBSD: mount_umap.8,v 1.4 1996/03/05 02:36:42 thorpej Exp $
.\"
.\" Copyright (c) 1992, 1993, 1994
.\" The Regents of the University of California. All rights reserved.
.Sh SYNOPSIS
.Nm mount_umap
.Op Fl o Ar options
-.Ar target
-.Ar mount-point
+-u
.Ar uid-mapfile
+-g
.Ar gid-mapfile
+.Ar target
+.Ar mount-point
.Sh DESCRIPTION
The
.Nm mount_umap
-.\" $NetBSD: exports.5,v 1.8 1995/03/18 14:58:28 cgd Exp $
+.\" $OpenBSD: exports.5,v 1.2 1996/03/21 00:16:10 niklas Exp $
+.\" $NetBSD: exports.5,v 1.9 1996/02/18 11:57:50 fvdl Exp $
.\"
.\" Copyright (c) 1989, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)exports.5 8.2 (Berkeley) 1/28/94
+.\" @(#)exports.5 8.3 (Berkeley) 3/29/95
.\"
-.Dd January 28, 1994
+.Dd March 29, 1995
.Dt EXPORTS 5
.Os
.Sh NAME
mount protocol per the
.Tn NFS
server specification; see
-.%T "Network File System Protocol Specification \\*(tNRFC\\*(sP 1094, Appendix A" .
+.%T "Network File System Protocol Specification \\*(tNRFC\\*(sP 1094, Appendix A"
+and
+.%T "NFS: Network File System Version 3 Specification, Appendix I" .
.Pp
Each line in the file
(other than comment lines that begin with a #)
followed by the
.Fl alldirs
flag;
-this form allows the host(s) to mount any directory within the filesystem.
+this form allows the host(s) to mount at any point within the filesystem,
+including regular files if the
+.Fl r
+option is used on mountd.
The pathnames must not have any symbolic links in them and should not have
any "." or ".." components.
Mount points for a filesystem may appear on multiple lines each with
.Fl kerb
option specifies that the Kerberos authentication server should be
used to authenticate and map client credentials.
-(Note that this is NOT Sun NFS compatible and
-is supported for TCP transport only.)
+This option requires that the kernel be built with the NFSKERB option.
.Pp
The
.Fl ro
-.\" $NetBSD: mountd.8,v 1.10 1995/11/06 07:00:14 thorpej Exp $
+.\" $OpenBSD: mountd.8,v 1.3 1996/03/21 00:16:12 niklas Exp $
+.\" $NetBSD: mountd.8,v 1.11 1996/02/18 11:57:51 fvdl Exp $
.\"
.\" Copyright (c) 1989, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)mountd.8 8.1 (Berkeley) 6/9/93
+.\" @(#)mountd.8 8.4 (Berkeley) 4/28/95
.\"
-.Dd June 9, 1993
+.Dd April 28, 1995
.Dt MOUNTD 8
.Os
.Sh NAME
.Tn NFS
server specification; see
.%T "Network File System Protocol Specification" ,
-RFC1094.
+RFC1094, Appendix A and
+.%T "NFS: Network File System Version 3 Protocol Specification" ,
+Appendix I.
.Pp
Options and operands available for
.Nm mountd :
-/* $NetBSD: mountd.c,v 1.30 1995/11/28 05:25:47 jtc Exp $ */
+/* $OpenBSD: mountd.c,v 1.6 1996/03/21 00:16:16 niklas Exp $ */
+/* $NetBSD: mountd.c,v 1.31 1996/02/18 11:57:53 fvdl Exp $ */
/*
* Copyright (c) 1989, 1993
#ifndef lint
#if 0
-static char sccsid[] = "@(#)mountd.c 8.8 (Berkeley) 2/20/94";
+static char sccsid[] = "@(#)mountd.c 8.15 (Berkeley) 5/1/95";
#else
-static char rcsid[] = "$NetBSD: mountd.c,v 1.30 1995/11/28 05:25:47 jtc Exp $";
+static char rcsid[] = "$NetBSD: mountd.c,v 1.31 1996/02/18 11:57:53 fvdl Exp $";
#endif
#endif /* not lint */
#include <netiso/iso.h>
#endif
#include <nfs/rpcv2.h>
-#include <nfs/nfsv2.h>
+#include <nfs/nfsproto.h>
#include <arpa/inet.h>
};
/* dp_flag bits */
#define DP_DEFSET 0x1
+#define DP_HOSTSET 0x2
+#define DP_KERB 0x4
struct exportlist {
struct exportlist *ex_next;
#define GT_ISO 0x4
struct hostlist {
+ int ht_flag; /* Uses DP_xx bits */
struct grouplist *ht_grp;
struct hostlist *ht_next;
};
+struct fhreturn {
+ int fhr_flag;
+ int fhr_vers;
+ nfsfh_t fhr_fh;
+};
+
/* Global defs */
char *add_expdir __P((struct dirlist **, char *, int));
void add_dlist __P((struct dirlist **, struct dirlist *,
- struct grouplist *));
+ struct grouplist *, int));
void add_mlist __P((char *, char *));
int check_dirpath __P((char *));
int check_options __P((struct dirlist *));
-int chk_host __P((struct dirlist *, u_long, int *));
+int chk_host __P((struct dirlist *, u_long, int *, int *));
void del_mlist __P((char *, char *));
struct dirlist *dirp_search __P((struct dirlist *, char *));
int do_mount __P((struct exportlist *, struct grouplist *, int,
- struct ucred *, char *, int, struct statfs *));
+ struct ucred *, char *, int, struct statfs *));
int do_opt __P((char **, char **, struct exportlist *, struct grouplist *,
int *, int *, struct ucred *));
struct exportlist *ex_search __P((fsid_t *));
void free_host __P((struct hostlist *));
void get_exportlist __P((void));
int get_host __P((char *, struct grouplist *));
+int get_num __P((char *));
struct hostlist *get_ht __P((void));
int get_line __P((void));
void get_mountlist __P((void));
int umntall_each __P((caddr_t, struct sockaddr_in *));
int xdr_dir __P((XDR *, char *));
int xdr_explist __P((XDR *, caddr_t));
-int xdr_fhs __P((XDR *, nfsv2fh_t *));
+int xdr_fhs __P((XDR *, caddr_t));
int xdr_mlist __P((XDR *, caddr_t));
/* C library */
SVCXPRT *udptransp, *tcptransp;
int c;
- while ((c = getopt(argc, argv, "dn")) != EOF)
+ while ((c = getopt(argc, argv, "dnr")) != EOF)
switch (c) {
case 'd':
debug = 1;
case 'n':
resvport_only = 0;
break;
+ case 'r':
+ /* Compatibility */
+ break;
default:
fprintf(stderr, "Usage: mountd [-dn] [export_file]\n");
exit(1);
exit(1);
}
pmap_unset(RPCPROG_MNT, RPCMNT_VER1);
+ pmap_unset(RPCPROG_MNT, RPCMNT_VER3);
if (!svc_register(udptransp, RPCPROG_MNT, RPCMNT_VER1, mntsrv,
- IPPROTO_UDP) ||
+ IPPROTO_UDP) ||
+ !svc_register(udptransp, RPCPROG_MNT, RPCMNT_VER3, mntsrv,
+ IPPROTO_UDP) ||
!svc_register(tcptransp, RPCPROG_MNT, RPCMNT_VER1, mntsrv,
- IPPROTO_TCP)) {
+ IPPROTO_TCP) ||
+ !svc_register(tcptransp, RPCPROG_MNT, RPCMNT_VER3, mntsrv,
+ IPPROTO_TCP)) {
syslog(LOG_ERR, "Can't register mount");
exit(1);
}
{
struct exportlist *ep;
struct dirlist *dp;
- nfsv2fh_t nfh;
+ struct fhreturn fhr;
struct stat stb;
struct statfs fsb;
struct hostent *hp;
u_long saddr;
u_short sport;
char rpcpath[RPCMNT_PATHLEN+1], dirpath[MAXPATHLEN];
- int bad = ENOENT, defset;
- sigset_t sigset, osigset;
+ int bad = ENOENT, defset, hostset;
+ sigset_t sighup_mask;
+ sigemptyset(&sighup_mask);
+ sigaddset(&sighup_mask, SIGHUP);
saddr = transp->xp_raddr.sin_addr.s_addr;
sport = ntohs(transp->xp_raddr.sin_port);
hp = (struct hostent *)NULL;
}
/* Check in the exports list */
- sigemptyset(&sigset);
- sigaddset(&sigset, SIGHUP);
- sigprocmask(SIG_BLOCK, &sigset, &osigset);
+ sigprocmask(SIG_BLOCK, &sighup_mask, NULL);
ep = ex_search(&fsb.f_fsid);
- defset = 0;
- if (ep && (chk_host(ep->ex_defdir, saddr, &defset) ||
+ hostset = defset = 0;
+ if (ep && (chk_host(ep->ex_defdir, saddr, &defset, &hostset) ||
((dp = dirp_search(ep->ex_dirl, dirpath)) &&
- chk_host(dp, saddr, &defset)) ||
+ chk_host(dp, saddr, &defset, &hostset)) ||
(defset && scan_tree(ep->ex_defdir, saddr) == 0 &&
scan_tree(ep->ex_dirl, saddr) == 0))) {
+ if (hostset & DP_HOSTSET)
+ fhr.fhr_flag = hostset;
+ else
+ fhr.fhr_flag = defset;
+ fhr.fhr_vers = rqstp->rq_vers;
/* Get the file handle */
- memset(&nfh, 0, sizeof(nfh));
- if (getfh(dirpath, (fhandle_t *)&nfh) < 0) {
+ memset(&fhr.fhr_fh, 0, sizeof(nfsfh_t));
+ if (getfh(dirpath, (fhandle_t *)&fhr.fhr_fh) < 0) {
bad = errno;
syslog(LOG_ERR, "Can't get fh for %s", dirpath);
if (!svc_sendreply(transp, xdr_long,
(caddr_t)&bad))
syslog(LOG_ERR, "Can't send reply");
- sigprocmask(SIG_SETMASK, &osigset, NULL);
+ sigprocmask(SIG_UNBLOCK, &sighup_mask, NULL);
return;
}
- if (!svc_sendreply(transp, xdr_fhs, (caddr_t)&nfh))
+ if (!svc_sendreply(transp, xdr_fhs, (caddr_t)&fhr))
syslog(LOG_ERR, "Can't send reply");
if (hp == NULL)
hp = gethostbyaddr((caddr_t)&saddr,
if (!svc_sendreply(transp, xdr_long, (caddr_t)&bad))
syslog(LOG_ERR, "Can't send reply");
}
- sigprocmask(SIG_SETMASK, &osigset, NULL);
+ sigprocmask(SIG_UNBLOCK, &sighup_mask, NULL);
return;
case RPCMNT_DUMP:
if (!svc_sendreply(transp, xdr_mlist, (caddr_t)NULL))
}
/*
- * Xdr routine to generate fhstatus
+ * Xdr routine to generate file handle reply
*/
int
-xdr_fhs(xdrsp, nfh)
+xdr_fhs(xdrsp, cp)
XDR *xdrsp;
- nfsv2fh_t *nfh;
+ caddr_t cp;
{
- long ok = 0;
+ register struct fhreturn *fhrp = (struct fhreturn *)cp;
+ long ok = 0, len, auth;
if (!xdr_long(xdrsp, &ok))
return (0);
- return (xdr_opaque(xdrsp, (caddr_t)nfh, NFSX_FH));
+ switch (fhrp->fhr_vers) {
+ case 1:
+ return (xdr_opaque(xdrsp, (caddr_t)&fhrp->fhr_fh, NFSX_V2FH));
+ case 3:
+ len = NFSX_V3FH;
+ if (!xdr_long(xdrsp, &len))
+ return (0);
+ if (!xdr_opaque(xdrsp, (caddr_t)&fhrp->fhr_fh, len))
+ return (0);
+ if (fhrp->fhr_flag & DP_KERB)
+ auth = RPCAUTH_KERB4;
+ else
+ auth = RPCAUTH_UNIX;
+ len = 1;
+ if (!xdr_long(xdrsp, &len))
+ return (0);
+ return (xdr_long(xdrsp, &auth));
+ };
+ return (0);
}
int
struct exportlist *ep;
int false = 0;
int putdef;
- sigset_t sigset, osigset;
+ sigset_t sighup_mask;
- sigemptyset(&sigset);
- sigaddset(&sigset, SIGHUP);
- sigprocmask(SIG_BLOCK, &sigset, &osigset);
+ sigemptyset(&sighup_mask);
+ sigaddset(&sighup_mask, SIGHUP);
+ sigprocmask(SIG_BLOCK, &sighup_mask, NULL);
ep = exphead;
while (ep) {
putdef = 0;
goto errout;
ep = ep->ex_next;
}
- sigprocmask(SIG_SETMASK, &osigset, NULL);
+ sigprocmask(SIG_UNBLOCK, &sighup_mask, NULL);
if (!xdr_bool(xdrsp, &false))
return (0);
return (1);
errout:
- sigprocmask(SIG_SETMASK, &osigset, NULL);
+ sigprocmask(SIG_UNBLOCK, &sighup_mask, NULL);
return (0);
}
if (get_host(hst, grp)) {
syslog(LOG_ERR, "Bad netgroup %s", cp);
getexp_err(ep, tgrp);
+ endnetgrent();
goto nextline;
}
} else if (get_host(cp, grp)) {
* Success. Update the data structures.
*/
if (has_host) {
- hang_dirp(dirhead, tgrp, ep, (opt_flags & OP_ALLDIRS));
+ hang_dirp(dirhead, tgrp, ep, opt_flags);
grp->gr_next = grphead;
grphead = tgrp;
} else {
hang_dirp(dirhead, (struct grouplist *)NULL, ep,
- (opt_flags & OP_ALLDIRS));
+ opt_flags);
free_grp(grp);
}
dirhead = (struct dirlist *)NULL;
* and update the entry for host.
*/
void
-hang_dirp(dp, grp, ep, alldirs)
+hang_dirp(dp, grp, ep, flags)
struct dirlist *dp;
struct grouplist *grp;
struct exportlist *ep;
- int alldirs;
+ int flags;
{
struct hostlist *hp;
struct dirlist *dp2;
- if (alldirs) {
+ if (flags & OP_ALLDIRS) {
if (ep->ex_defdir)
free((caddr_t)dp);
else
ep->ex_defdir = dp;
- if (grp == (struct grouplist *)NULL)
+ if (grp == (struct grouplist *)NULL) {
ep->ex_defdir->dp_flag |= DP_DEFSET;
- else while (grp) {
+ if (flags & OP_KERB)
+ ep->ex_defdir->dp_flag |= DP_KERB;
+ } else while (grp) {
hp = get_ht();
+ if (flags & OP_KERB)
+ hp->ht_flag |= DP_KERB;
hp->ht_grp = grp;
hp->ht_next = ep->ex_defdir->dp_hosts;
ep->ex_defdir->dp_hosts = hp;
*/
while (dp) {
dp2 = dp->dp_left;
- add_dlist(&ep->ex_dirl, dp, grp);
+ add_dlist(&ep->ex_dirl, dp, grp, flags);
dp = dp2;
}
}
* for the new directory or adding the new node.
*/
void
-add_dlist(dpp, newdp, grp)
+add_dlist(dpp, newdp, grp, flags)
struct dirlist **dpp;
struct dirlist *newdp;
struct grouplist *grp;
+ int flags;
{
struct dirlist *dp;
struct hostlist *hp;
if (dp) {
cmp = strcmp(dp->dp_dirp, newdp->dp_dirp);
if (cmp > 0) {
- add_dlist(&dp->dp_left, newdp, grp);
+ add_dlist(&dp->dp_left, newdp, grp, flags);
return;
} else if (cmp < 0) {
- add_dlist(&dp->dp_right, newdp, grp);
+ add_dlist(&dp->dp_right, newdp, grp, flags);
return;
} else
free((caddr_t)newdp);
*/
do {
hp = get_ht();
+ if (flags & OP_KERB)
+ hp->ht_flag |= DP_KERB;
hp->ht_grp = grp;
hp->ht_next = dp->dp_hosts;
dp->dp_hosts = hp;
grp = grp->gr_next;
} while (grp);
- } else
+ } else {
dp->dp_flag |= DP_DEFSET;
+ if (flags & OP_KERB)
+ dp->dp_flag |= DP_KERB;
+ }
}
/*
* Scan for a host match in a directory tree.
*/
int
-chk_host(dp, saddr, defsetp)
+chk_host(dp, saddr, defsetp, hostsetp)
struct dirlist *dp;
u_long saddr;
int *defsetp;
+ int *hostsetp;
{
struct hostlist *hp;
struct grouplist *grp;
if (dp) {
if (dp->dp_flag & DP_DEFSET)
- *defsetp = 1;
+ *defsetp = dp->dp_flag;
hp = dp->dp_hosts;
while (hp) {
grp = hp->ht_grp;
addrp = (u_long **)
grp->gr_ptr.gt_hostent->h_addr_list;
while (*addrp) {
- if (**addrp == saddr)
+ if (**addrp == saddr) {
+ *hostsetp = (hp->ht_flag | DP_HOSTSET);
return (1);
+ }
addrp++;
}
break;
case GT_NET:
if ((saddr & grp->gr_ptr.gt_net.nt_mask) ==
- grp->gr_ptr.gt_net.nt_net)
+ grp->gr_ptr.gt_net.nt_net) {
+ *hostsetp = (hp->ht_flag | DP_HOSTSET);
return (1);
+ }
break;
};
hp = hp->ht_next;
struct dirlist *dp;
u_long saddr;
{
- int defset;
+ int defset, hostset;
if (dp) {
if (scan_tree(dp->dp_left, saddr))
return (1);
- if (chk_host(dp, saddr, &defset))
+ if (chk_host(dp, saddr, &defset, &hostset))
return (1);
if (scan_tree(dp->dp_right, saddr))
return (1);
if (hp == (struct hostlist *)NULL)
out_of_mem();
hp->ht_next = (struct hostlist *)NULL;
+ hp->ht_flag = 0;
return (hp);
}
return (1);
}
if (opt_flags & OP_ALLDIRS) {
- syslog(LOG_ERR, "Not root dir");
+ syslog(LOG_ERR, "Could not remount %s: %m",
+ dirp);
return (1);
}
/* back up over the last component */
-.\" $NetBSD: nfsd.8,v 1.6 1995/03/18 14:58:59 cgd Exp $
+.\" $OpenBSD: nfsd.8,v 1.2 1996/03/21 00:16:20 niklas Exp $
+.\" $NetBSD: nfsd.8,v 1.7 1996/02/18 11:58:24 fvdl Exp $
.\"
.\" Copyright (c) 1989, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)nfsd.8 8.3 (Berkeley) 2/22/94
+.\" @(#)nfsd.8 8.4 (Berkeley) 3/29/95
.\"
-.Dd February 22, 1994
+.Dd March 29, 1995
.Dt NFSD 8
.Os
.Sh NAME
.Tn NFS
server specification; see
.%T "Network File System Protocol Specification" ,
-RFC1094.
+RFC1094 and
+.%T "NFS: Network File System Version 3 Protocol Specification" .
.Pp
The
.Nm nfsd
-/* $NetBSD: nfsd.c,v 1.17 1995/05/28 05:31:45 jtc Exp $ */
+/* $OpenBSD: nfsd.c,v 1.2 1996/03/21 00:16:22 niklas Exp $ */
+/* $NetBSD: nfsd.c,v 1.19 1996/02/18 23:18:56 mycroft Exp $ */
/*
* Copyright (c) 1989, 1993, 1994
#ifndef lint
#if 0
-static char sccsid[] = "@(#)nfsd.c 8.7 (Berkeley) 2/22/94";
+static char sccsid[] = "@(#)nfsd.c 8.9 (Berkeley) 3/29/95";
#else
-static char rcsid[] = "$NetBSD: nfsd.c,v 1.17 1995/05/28 05:31:45 jtc Exp $";
+static char rcsid[] = "$NetBSD: nfsd.c,v 1.19 1996/02/18 23:18:56 mycroft Exp $";
#endif
-#endif not lint
+#endif /* not lint */
#include <sys/param.h>
-#include <syslog.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <netiso/iso.h>
#endif
#include <nfs/rpcv2.h>
-#include <nfs/nfsv2.h>
+#include <nfs/nfsproto.h>
#include <nfs/nfs.h>
-#ifdef KERBEROS
+#ifdef NFSKERB
#include <kerberosIV/des.h>
#include <kerberosIV/krb.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
+#include <syslog.h>
#include <unistd.h>
/* Global defs */
struct nfsd_srvargs nsd;
-#ifdef KERBEROS
+#ifdef NFSKERB
char lnam[ANAME_SZ];
KTEXT_ST kt;
-AUTH_DAT auth;
+AUTH_DAT kauth;
char inst[INST_SZ];
+struct nfsrpc_fullblock kin, kout;
+struct nfsrpc_fullverf kverf;
+NFSKERBKEY_T kivec;
+struct timeval ktv;
+NFSKERBKEYSCHED_T kerb_keysched;
#endif
void nonfs __P((int));
#ifdef ISO
struct sockaddr_iso isoaddr, isopeer;
#endif
+ struct timeval ktv;
fd_set ready, sockbits;
int ch, cltpflag, connect_type_cnt, i, len, maxsock, msgsock;
int nfsdcnt, nfssvc_flag, on, reregister, sock, tcpflag, tcpsock;
if (reregister) {
if (udpflag &&
- !pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_UDP, NFS_PORT))
+ (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) ||
+ !pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)))
err(1, "can't register with portmap for UDP.");
if (tcpflag &&
- !pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_TCP, NFS_PORT))
+ (!pmap_set(RPCPROG_NFS, 2, IPPROTO_TCP, NFS_PORT) ||
+ !pmap_set(RPCPROG_NFS, 3, IPPROTO_TCP, NFS_PORT)))
err(1, "can't register with portmap for TCP.");
exit(0);
}
setproctitle("server");
nfssvc_flag = NFSSVC_NFSD;
nsd.nsd_nfsd = NULL;
-#ifdef KERBEROS
- nsd.nsd_authstr = (char *)kt.dat;
+#ifdef NFSKERB
+ if (sizeof (struct nfsrpc_fullverf) != RPCX_FULLVERF ||
+ sizeof (struct nfsrpc_fullblock) != RPCX_FULLBLOCK)
+ syslog(LOG_ERR, "Yikes NFSKERB structs not packed!");
+ nsd.nsd_authstr = (u_char *)&kt;
+ nsd.nsd_authlen = sizeof (kt);
+ nsd.nsd_verfstr = (u_char *)&kverf;
+ nsd.nsd_verflen = sizeof (kverf);
#endif
while (nfssvc(nfssvc_flag, &nsd) < 0) {
if (errno != ENEEDAUTH) {
exit(1);
}
nfssvc_flag = NFSSVC_NFSD | NFSSVC_AUTHINFAIL;
-#ifdef KERBEROS
- kt.length = nsd.nsd_authlen;
- kt.mbz = 0;
- (void)strcpy(inst, "*");
- if (krb_rd_req(&kt, "rcmd",
- inst, nsd.nsd_haddr, &auth, "") == RD_AP_OK &&
- krb_kntoln(&auth, lnam) == KSUCCESS &&
- (pwd = getpwnam(lnam)) != NULL) {
+#ifdef NFSKERB
+ /*
+ * Get the Kerberos ticket out of the authenticator
+ * verify it and convert the principal name to a user
+ * name. The user name is then converted to a set of
+ * user credentials via the password and group file.
+ * Finally, decrypt the timestamp and validate it.
+ * For more info see the IETF Draft "Authentication
+ * in ONC RPC".
+ */
+ kt.length = ntohl(kt.length);
+ if (gettimeofday(&ktv, (struct timezone *)0) == 0 &&
+ kt.length > 0 && kt.length <=
+ (RPCAUTH_MAXSIZ - 3 * NFSX_UNSIGNED)) {
+ kin.w1 = NFS_KERBW1(kt);
+ kt.mbz = 0;
+ (void)strcpy(inst, "*");
+ if (krb_rd_req(&kt, NFS_KERBSRV,
+ inst, nsd.nsd_haddr, &kauth, "") == RD_AP_OK &&
+ krb_kntoln(&kauth, lnam) == KSUCCESS &&
+ (pwd = getpwnam(lnam)) != NULL) {
cr = &nsd.nsd_cr;
cr->cr_uid = pwd->pw_uid;
cr->cr_groups[0] = pwd->pw_gid;
break;
}
endgrent();
- nfssvc_flag = NFSSVC_NFSD | NFSSVC_AUTHIN;
+
+ /*
+ * Get the timestamp verifier out of the
+ * authenticator and verifier strings.
+ */
+ kin.t1 = kverf.t1;
+ kin.t2 = kverf.t2;
+ kin.w2 = kverf.w2;
+ bzero((caddr_t)kivec, sizeof (kivec));
+ bcopy((caddr_t)kauth.session,
+ (caddr_t)nsd.nsd_key,sizeof(kauth.session));
+
+ /*
+ * Decrypt the timestamp verifier in CBC mode.
+ */
+ XXX
+
+ /*
+ * Validate the timestamp verifier, to
+ * check that the session key is ok.
+ */
+ nsd.nsd_timestamp.tv_sec = ntohl(kout.t1);
+ nsd.nsd_timestamp.tv_usec = ntohl(kout.t2);
+ nsd.nsd_ttl = ntohl(kout.w1);
+ if ((nsd.nsd_ttl - 1) == ntohl(kout.w2))
+ nfssvc_flag = NFSSVC_NFSD | NFSSVC_AUTHIN;
}
-#endif /* KERBEROS */
+#endif /* NFSKERB */
}
exit(0);
}
syslog(LOG_ERR, "can't bind udp addr");
exit(1);
}
- if (!pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_UDP, NFS_PORT)) {
+ if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_UDP, NFS_PORT) ||
+ !pmap_set(RPCPROG_NFS, 3, IPPROTO_UDP, NFS_PORT)) {
syslog(LOG_ERR, "can't register with udp portmap");
exit(1);
}
syslog(LOG_ERR, "listen failed");
exit(1);
}
- if (!pmap_set(RPCPROG_NFS, NFS_VER2, IPPROTO_TCP, NFS_PORT)) {
+ if (!pmap_set(RPCPROG_NFS, 2, IPPROTO_TCP, NFS_PORT) ||
+ !pmap_set(RPCPROG_NFS, 3, IPPROTO_TCP, NFS_PORT)) {
syslog(LOG_ERR, "can't register tcp with portmap");
exit(1);
}
void
usage()
{
-
(void)fprintf(stderr, "usage: nfsd %s\n", USAGE);
exit(1);
}
int signo;
{
- while (wait3((int *)0, WNOHANG, (struct rusage *)0) > 0);
+ while (wait3(NULL, WNOHANG, NULL) > 0);
}
-/* $NetBSD: nfsiod.c,v 1.10 1995/09/30 11:39:53 pk Exp $ */
+/* $OpenBSD: nfsiod.c,v 1.2 1996/03/21 00:16:26 niklas Exp $ */
+/* $NetBSD: nfsiod.c,v 1.12 1996/02/20 16:06:55 fvdl Exp $ */
/*
* Copyright (c) 1989, 1993
#ifndef lint
#if 0
-static char sccsid[] = "@(#)nfsiod.c 8.3 (Berkeley) 2/22/94";
+static char sccsid[] = "@(#)nfsiod.c 8.4 (Berkeley) 5/3/95"
#else
-static char rcsid[] = "$NetBSD: nfsiod.c,v 1.10 1995/09/30 11:39:53 pk Exp $";
+static char rcsid[] = "$NetBSD: nfsiod.c,v 1.12 1996/02/20 16:06:55 fvdl Exp $";
#endif
#endif not lint
#include <sys/param.h>
#include <sys/ioctl.h>
-#include <syslog.h>
#include <sys/ucred.h>
#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/mount.h>
-#include <nfs/nfsv2.h>
+#include <nfs/rpcv2.h>
+#include <nfs/nfsproto.h>
#include <nfs/nfs.h>
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <syslog.h>
#include <unistd.h>
/* Global defs */
-/* $NetBSD: main.c,v 1.10 1996/02/06 00:00:22 mrg Exp $ */
+/* $OpenBSD: main.c,v 1.3 1996/03/21 00:16:29 niklas Exp $ */
+/* $NetBSD: main.c,v 1.11 1996/03/15 22:39:39 scottr Exp $ */
/*
* Copyright (c) 1983, 1993
#if 0
static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 9/13/94";
#else
-static char rcsid[] = "$NetBSD: main.c,v 1.10 1996/02/06 00:00:22 mrg Exp $";
+static char rcsid[] = "$NetBSD: main.c,v 1.11 1996/03/15 22:39:39 scottr Exp $";
#endif
#endif /* not lint */
time_t dumptime;
time_t dumpdate;
FILE *terminal;
+uid_t uid; /* real uid */
+uid_t euid; /* effective uid */
static void obsolete __P((int *, char **[]));
static void usage __P((void));
char *symtbl = "./restoresymtable";
char *p, name[MAXPATHLEN];
+ uid = getuid();
+ euid = geteuid();
+ (void) seteuid(uid);
+
if (argc < 2)
usage();
-/* $NetBSD: tape.c,v 1.19 1995/06/19 00:20:32 cgd Exp $ */
+/* $OpenBSD: tape.c,v 1.2 1996/03/21 00:16:32 niklas Exp $ */
+/* $NetBSD: tape.c,v 1.20 1996/03/15 22:39:41 scottr Exp $ */
/*
* Copyright (c) 1983, 1993
#if 0
static char sccsid[] = "@(#)tape.c 8.6 (Berkeley) 9/13/94";
#else
-static char rcsid[] = "$NetBSD: tape.c,v 1.19 1995/06/19 00:20:32 cgd Exp $";
+static char rcsid[] = "$NetBSD: tape.c,v 1.20 1996/03/15 22:39:41 scottr Exp $";
#endif
#endif /* not lint */
int Bcvt; /* Swap Bytes (for CCI or sun) */
static int Qcvt; /* Swap quads (for sun) */
+extern uid_t uid; /* real uid */
+extern uid_t euid; /* effective uid */
+
#define FLUSHTAPEBUF() blkcnt = ntrec + 1
static void accthdr __P((struct s_spcl *));
}
pipein++;
}
- setuid(getuid()); /* no longer need or want root privileges */
+ (void) setuid(uid); /* rmthost() is the only reason to be setuid */
(void) strcpy(magtape, source);
}
--- /dev/null
+# $OpenBSD: Makefile,v 1.1 1996/03/21 00:16:39 niklas Exp $
+# $NetBSD: Makefile,v 1.1.1.1 1996/03/16 10:25:12 leo Exp $
+# @(#)Makefile 8.2 (Berkeley) 4/17/94
+
+PROG= savecore
+SRCS= savecore.c zopen.c
+MAN= savecore.8
+.PATH: ${.CURDIR}/../../usr.bin/compress
+
+.include <bsd.prog.mk>
--- /dev/null
+.\" $OpenBSD: savecore.8,v 1.1 1996/03/21 00:16:41 niklas Exp $
+.\" $NetBSD: savecore.8,v 1.1.1.1 1996/03/16 10:25:12 leo Exp $
+.\"
+.\" Copyright (c) 1980, 1991, 1993
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by the University of
+.\" California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)savecore.8 8.1 (Berkeley) 6/5/93
+.\"
+.Dd June 5, 1993
+.Dt SAVECORE 8
+.Os BSD 4
+.Sh NAME
+.Nm savecore
+.Nd "save a core dump of the operating system"
+.Sh SYNOPSIS
+.Nm savecore
+.Fl c
+.Nm savecore
+.Op Fl fvz
+.Op Fl N Ar system
+.Ar directory
+.Sh DESCRIPTION
+.Nm Savecore
+copies the currently running kernel and its associated core dump into
+.Fa directory ,
+and enters a reboot message and information about the core dump into
+the system log.
+.Pp
+The options are as follows:
+.Bl -tag -width directory
+.It Fl c
+Clears the dump, so that future invocations of
+.Nm savecore
+will ignore it.
+.It Fl f
+Forces a dump to be taken even if the dump doesn't appear correct or there
+is insufficient disk space.
+.It Fl N
+Use
+.Ar system
+as the kernel instead of the default ``/netbsd''.
+.It Fl v
+Prints out some additional debugging information.
+.It Fl z
+Compresses the core dump and kernel (see
+.Xr compress 1 ).
+.El
+.Pp
+.Nm Savecore
+checks the core dump in various ways to make sure that it is current and
+that it corresponds to the currently running system.
+If it passes these checks, it saves the core image in
+.Ar directory Ns Pa /netbsd.#.core
+and the system in
+.Ar directory Ns Pa /netbsd.#
+(or in
+.Ar directory Ns Pa /netbsd.#.Z.core
+and
+.Ar directory Ns Pa /netbsd.#.Z ,
+respectively, if the
+.Fl z
+option is used).
+The ``#'' is the number from the first line of the file
+.Ar directory Ns Pa /bounds ,
+and it is incremented and stored back into the file each time
+.Nm savecore
+successfully runs.
+.Pp
+.Nm Savecore
+also checks the available disk space before attempting to make the copies.
+If there is insufficient disk space in the filesystem containing
+.Ar directory ,
+or if the file
+.Ar directory Ns Pa /minfree
+exists and the number of free kilobytes (for non-superusers) in the
+filesystem after the copies were made would be less than the number
+in the first line of this file, the copies are not attempted.
+.Pp
+If
+.Nm savecore
+successfully copies the kernel and the core dump, the core dump is cleared
+so that future invocations of
+.Nm savecore
+will ignore it.
+.Pp
+.Nm Savecore
+is meant to be called near the end of the initialization file
+.Pa /etc/rc
+(see
+.Xr rc 8 ) .
+.Sh FILES
+.Bl -tag -width /netbsdxx -compact
+.It Pa /netbsd
+current kernel
+.El
+.Sh BUGS
+The minfree code does not consider the effect of compression.
+.Sh SEE ALSO
+.Xr compress 1 ,
+.Xr syslogd 8
+.Sh HISTORY
+The
+.Nm
+command appeared in
+.Bx 4.1 .
--- /dev/null
+/* $OpenBSD: savecore.c,v 1.1 1996/03/21 00:16:43 niklas Exp $ */
+/* $NetBSD: savecore.c,v 1.1.1.1 1996/03/16 10:25:11 leo Exp $ */
+
+/*-
+ * Copyright (c) 1986, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1986, 1992, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)savecore.c 8.3 (Berkeley) 1/2/94";
+#else
+static char rcsid[] = "$NetBSD: savecore.c,v 1.1.1.1 1996/03/16 10:25:11 leo Exp $";
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <sys/syslog.h>
+#include <sys/time.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <nlist.h>
+#include <paths.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <tzfile.h>
+#include <unistd.h>
+
+extern FILE *zopen __P((const char *fname, const char *mode, int bits));
+
+#define ok(number) ((number) - KERNBASE)
+
+struct nlist current_nl[] = { /* Namelist for currently running system. */
+#define X_DUMPDEV 0
+ { "_dumpdev" },
+#define X_DUMPLO 1
+ { "_dumplo" },
+#define X_TIME 2
+ { "_time" },
+#define X_DUMPSIZE 3
+ { "_dumpsize" },
+#define X_VERSION 4
+ { "_version" },
+#define X_PANICSTR 5
+ { "_panicstr" },
+#define X_DUMPMAG 6
+ { "_dumpmag" },
+ { "" },
+};
+int cursyms[] = { X_DUMPDEV, X_DUMPLO, X_VERSION, X_DUMPMAG, -1 };
+int dumpsyms[] = { X_TIME, X_DUMPSIZE, X_VERSION, X_PANICSTR, X_DUMPMAG, -1 };
+
+struct nlist dump_nl[] = { /* Name list for dumped system. */
+ { "_dumpdev" }, /* Entries MUST be the same as */
+ { "_dumplo" }, /* those in current_nl[]. */
+ { "_time" },
+ { "_dumpsize" },
+ { "_version" },
+ { "_panicstr" },
+ { "_dumpmag" },
+ { "" },
+};
+
+/* Types match kernel declarations. */
+long dumplo; /* where dump starts on dumpdev */
+int dumpmag; /* magic number in dump */
+int dumpsize; /* amount of memory dumped */
+
+char *kernel;
+char *dirname; /* directory to save dumps in */
+char *ddname; /* name of dump device */
+dev_t dumpdev; /* dump device */
+int dumpfd; /* read/write descriptor on block dev */
+time_t now; /* current date */
+char panic_mesg[1024];
+int panicstr;
+char vers[1024];
+
+int clear, compress, force, verbose; /* flags */
+
+void check_kmem __P((void));
+int check_space __P((void));
+void clear_dump __P((void));
+int Create __P((char *, int));
+int dump_exists __P((void));
+char *find_dev __P((dev_t, int));
+int get_crashtime __P((void));
+void kmem_setup __P((void));
+void log __P((int, char *, ...));
+void Lseek __P((int, off_t, int));
+int Open __P((char *, int rw));
+int Read __P((int, void *, int));
+char *rawname __P((char *s));
+void save_core __P((void));
+void usage __P((void));
+void Write __P((int, void *, int));
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int ch;
+
+ openlog("savecore", LOG_PERROR, LOG_DAEMON);
+
+ while ((ch = getopt(argc, argv, "cdfN:vz")) != -1)
+ switch(ch) {
+ case 'c':
+ clear = 1;
+ break;
+ case 'd': /* Not documented. */
+ case 'v':
+ verbose = 1;
+ break;
+ case 'f':
+ force = 1;
+ break;
+ case 'N':
+ kernel = optarg;
+ break;
+ case 'z':
+ compress = 1;
+ break;
+ case '?':
+ default:
+ usage();
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (!clear) {
+ if (argc != 1 && argc != 2)
+ usage();
+ dirname = argv[0];
+ }
+ if (argc == 2)
+ kernel = argv[1];
+
+ (void)time(&now);
+ kmem_setup();
+
+ if (clear) {
+ clear_dump();
+ exit(0);
+ }
+
+ if (!dump_exists() && !force)
+ exit(1);
+
+ check_kmem();
+
+ if (panicstr)
+ syslog(LOG_ALERT, "reboot after panic: %s", panic_mesg);
+ else
+ syslog(LOG_ALERT, "reboot");
+
+ if ((!get_crashtime() || !check_space()) && !force)
+ exit(1);
+
+ save_core();
+
+ clear_dump();
+ exit(0);
+}
+
+void
+kmem_setup()
+{
+ FILE *fp;
+ int kmem, i;
+ char *dump_sys;
+
+ /*
+ * Some names we need for the currently running system, others for
+ * the system that was running when the dump was made. The values
+ * obtained from the current system are used to look for things in
+ * /dev/kmem that cannot be found in the dump_sys namelist, but are
+ * presumed to be the same (since the disk partitions are probably
+ * the same!)
+ */
+ if ((nlist(_PATH_UNIX, current_nl)) == -1)
+ syslog(LOG_ERR, "%s: nlist: %s", _PATH_UNIX, strerror(errno));
+ for (i = 0; cursyms[i] != -1; i++)
+ if (current_nl[cursyms[i]].n_value == 0) {
+ syslog(LOG_ERR, "%s: %s not in namelist",
+ _PATH_UNIX, current_nl[cursyms[i]].n_name);
+ exit(1);
+ }
+
+ dump_sys = kernel ? kernel : _PATH_UNIX;
+ if ((nlist(dump_sys, dump_nl)) == -1)
+ syslog(LOG_ERR, "%s: nlist: %s", dump_sys, strerror(errno));
+ for (i = 0; dumpsyms[i] != -1; i++)
+ if (dump_nl[dumpsyms[i]].n_value == 0) {
+ syslog(LOG_ERR, "%s: %s not in namelist",
+ dump_sys, dump_nl[dumpsyms[i]].n_name);
+ exit(1);
+ }
+
+ kmem = Open(_PATH_KMEM, O_RDONLY);
+ Lseek(kmem, (off_t)current_nl[X_DUMPDEV].n_value, L_SET);
+ (void)Read(kmem, &dumpdev, sizeof(dumpdev));
+ if (dumpdev == NODEV) {
+ syslog(LOG_WARNING, "no core dump (no dumpdev)");
+ exit(1);
+ }
+ Lseek(kmem, (off_t)current_nl[X_DUMPLO].n_value, L_SET);
+ (void)Read(kmem, &dumplo, sizeof(dumplo));
+ dumplo *= DEV_BSIZE;
+ if (verbose)
+ (void)printf("dumplo = %d (%d * %d)\n",
+ dumplo, dumplo / DEV_BSIZE, DEV_BSIZE);
+ Lseek(kmem, (off_t)current_nl[X_DUMPMAG].n_value, L_SET);
+ (void)Read(kmem, &dumpmag, sizeof(dumpmag));
+ ddname = find_dev(dumpdev, S_IFBLK);
+ dumpfd = Open(ddname, O_RDWR);
+ fp = fdopen(kmem, "r");
+ if (fp == NULL) {
+ syslog(LOG_ERR, "%s: fdopen: %m", _PATH_KMEM);
+ exit(1);
+ }
+ if (kernel)
+ return;
+ (void)fseek(fp, (off_t)current_nl[X_VERSION].n_value, L_SET);
+ (void)fgets(vers, sizeof(vers), fp);
+
+ /* Don't fclose(fp), we use dumpfd later. */
+}
+
+void
+check_kmem()
+{
+ register char *cp;
+ FILE *fp;
+ char core_vers[1024];
+
+ fp = fdopen(dumpfd, "r");
+ if (fp == NULL) {
+ syslog(LOG_ERR, "%s: fdopen: %m", ddname);
+ exit(1);
+ }
+ fseek(fp, (off_t)(dumplo + ok(dump_nl[X_VERSION].n_value)), L_SET);
+ fgets(core_vers, sizeof(core_vers), fp);
+ if (strcmp(vers, core_vers) && kernel == 0)
+ syslog(LOG_WARNING,
+ "warning: %s version mismatch:\n\t%s\nand\t%s\n",
+ _PATH_UNIX, vers, core_vers);
+ (void)fseek(fp,
+ (off_t)(dumplo + ok(dump_nl[X_PANICSTR].n_value)), L_SET);
+ (void)fread(&panicstr, sizeof(panicstr), 1, fp);
+ if (panicstr) {
+ (void)fseek(fp, dumplo + ok(panicstr), L_SET);
+ cp = panic_mesg;
+ do
+ *cp = getc(fp);
+ while (*cp++ && cp < &panic_mesg[sizeof(panic_mesg)]);
+ }
+ /* Don't fclose(fp), we use dumpfd later. */
+}
+
+void
+clear_dump()
+{
+ long newdumplo;
+
+ newdumplo = 0;
+ Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPMAG].n_value)), L_SET);
+ Write(dumpfd, &newdumplo, sizeof(newdumplo));
+}
+
+int
+dump_exists()
+{
+ int newdumpmag;
+
+ Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPMAG].n_value)), L_SET);
+ (void)Read(dumpfd, &newdumpmag, sizeof(newdumpmag));
+
+ /* Read the dump size. */
+ Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPSIZE].n_value)), L_SET);
+ (void)Read(dumpfd, &dumpsize, sizeof(dumpsize));
+ dumpsize *= getpagesize();
+
+ /*
+ * Return zero if core dump doesn't seem to be there, and note
+ * it for syslog. This check and return happens after the dump size
+ * is read, so dumpsize is whether or not the core is valid (for -f).
+ */
+ if (newdumpmag != dumpmag) {
+ if (verbose)
+ syslog(LOG_WARNING, "magic number mismatch (%x != %x)",
+ newdumpmag, dumpmag);
+ syslog(LOG_WARNING, "no core dump");
+ return (0);
+ }
+ return (1);
+}
+
+char buf[1024 * 1024];
+
+void
+save_core()
+{
+ register FILE *fp;
+ register int bounds, ifd, nr, nw, ofd;
+ char *rawp, path[MAXPATHLEN];
+
+ /*
+ * Get the current number and update the bounds file. Do the update
+ * now, because may fail later and don't want to overwrite anything.
+ */
+ (void)snprintf(path, sizeof(path), "%s/bounds", dirname);
+ if ((fp = fopen(path, "r")) == NULL)
+ goto err1;
+ if (fgets(buf, sizeof(buf), fp) == NULL) {
+ if (ferror(fp))
+err1: syslog(LOG_WARNING, "%s: %s", path, strerror(errno));
+ bounds = 0;
+ } else
+ bounds = atoi(buf);
+ if (fp != NULL)
+ (void)fclose(fp);
+ if ((fp = fopen(path, "w")) == NULL)
+ syslog(LOG_ERR, "%s: %m", path);
+ else {
+ (void)fprintf(fp, "%d\n", bounds + 1);
+ (void)fclose(fp);
+ }
+ (void)fclose(fp);
+
+ /* Create the core file. */
+ (void)snprintf(path, sizeof(path), "%s/netbsd.%d.core%s",
+ dirname, bounds, compress ? ".Z" : "");
+ if (compress) {
+ if ((fp = zopen(path, "w", 0)) == NULL) {
+ syslog(LOG_ERR, "%s: %s", path, strerror(errno));
+ exit(1);
+ }
+ } else
+ ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+
+ /* Open the raw device. */
+ rawp = rawname(ddname);
+ if ((ifd = open(rawp, O_RDONLY)) == -1) {
+ syslog(LOG_WARNING, "%s: %m; using block device", rawp);
+ ifd = dumpfd;
+ }
+
+ /* Seek to the start of the core. */
+ Lseek(ifd, (off_t)dumplo, L_SET);
+
+ /* Copy the core file. */
+ syslog(LOG_NOTICE, "writing %score to %s",
+ compress ? "compressed " : "", path);
+ for (; dumpsize > 0; dumpsize -= nr) {
+ (void)printf("%6dK\r", dumpsize / 1024);
+ (void)fflush(stdout);
+ nr = read(ifd, buf, MIN(dumpsize, sizeof(buf)));
+ if (nr <= 0) {
+ if (nr == 0)
+ syslog(LOG_WARNING,
+ "WARNING: EOF on dump device");
+ else
+ syslog(LOG_ERR, "%s: %m", rawp);
+ goto err2;
+ }
+ if (compress)
+ nw = fwrite(buf, 1, nr, fp);
+ else
+ nw = write(ofd, buf, nr);
+ if (nw != nr) {
+ syslog(LOG_ERR, "%s: %s",
+ path, strerror(nw == 0 ? EIO : errno));
+err2: syslog(LOG_WARNING,
+ "WARNING: core may be incomplete");
+ (void)printf("\n");
+ exit(1);
+ }
+ }
+ (void)close(ifd);
+ if (compress)
+ (void)fclose(fp);
+ else
+ (void)close(ofd);
+
+ /* Copy the kernel. */
+ ifd = Open(kernel ? kernel : _PATH_UNIX, O_RDONLY);
+ (void)snprintf(path, sizeof(path), "%s/netbsd.%d%s",
+ dirname, bounds, compress ? ".Z" : "");
+ if (compress) {
+ if ((fp = zopen(path, "w", 0)) == NULL) {
+ syslog(LOG_ERR, "%s: %s", path, strerror(errno));
+ exit(1);
+ }
+ } else
+ ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ syslog(LOG_NOTICE, "writing %skernel to %s",
+ compress ? "compressed " : "", path);
+ while ((nr = read(ifd, buf, sizeof(buf))) > 0) {
+ if (compress)
+ nw = fwrite(buf, 1, nr, fp);
+ else
+ nw = write(ofd, buf, nr);
+ if (nw != nr) {
+ syslog(LOG_ERR, "%s: %s",
+ path, strerror(nw == 0 ? EIO : errno));
+ syslog(LOG_WARNING,
+ "WARNING: kernel may be incomplete");
+ exit(1);
+ }
+ }
+ if (nr < 0) {
+ syslog(LOG_ERR, "%s: %s",
+ kernel ? kernel : _PATH_UNIX, strerror(errno));
+ syslog(LOG_WARNING,
+ "WARNING: kernel may be incomplete");
+ exit(1);
+ }
+ if (compress)
+ (void)fclose(fp);
+ else
+ (void)close(ofd);
+}
+
+char *
+find_dev(dev, type)
+ register dev_t dev;
+ register int type;
+{
+ register DIR *dfd;
+ struct dirent *dir;
+ struct stat sb;
+ char *dp, devname[MAXPATHLEN + 1];
+
+ if ((dfd = opendir(_PATH_DEV)) == NULL) {
+ syslog(LOG_ERR, "%s: %s", _PATH_DEV, strerror(errno));
+ exit(1);
+ }
+ (void)strcpy(devname, _PATH_DEV);
+ while ((dir = readdir(dfd))) {
+ (void)strcpy(devname + sizeof(_PATH_DEV) - 1, dir->d_name);
+ if (lstat(devname, &sb)) {
+ syslog(LOG_ERR, "%s: %s", devname, strerror(errno));
+ continue;
+ }
+ if ((sb.st_mode & S_IFMT) != type)
+ continue;
+ if (dev == sb.st_rdev) {
+ closedir(dfd);
+ if ((dp = strdup(devname)) == NULL) {
+ syslog(LOG_ERR, "%s", strerror(errno));
+ exit(1);
+ }
+ return (dp);
+ }
+ }
+ closedir(dfd);
+ syslog(LOG_ERR, "can't find device %d/%d", major(dev), minor(dev));
+ exit(1);
+}
+
+char *
+rawname(s)
+ char *s;
+{
+ char *sl, name[MAXPATHLEN];
+
+ if ((sl = strrchr(s, '/')) == NULL || sl[1] == '0') {
+ syslog(LOG_ERR,
+ "can't make raw dump device name from %s", s);
+ return (s);
+ }
+ (void)snprintf(name, sizeof(name), "%.*s/r%s", sl - s, s, sl + 1);
+ if ((sl = strdup(name)) == NULL) {
+ syslog(LOG_ERR, "%s", strerror(errno));
+ exit(1);
+ }
+ return (sl);
+}
+
+int
+get_crashtime()
+{
+ time_t dumptime; /* Time the dump was taken. */
+
+ Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_TIME].n_value)), L_SET);
+ (void)Read(dumpfd, &dumptime, sizeof(dumptime));
+ if (dumptime == 0) {
+ if (verbose)
+ syslog(LOG_ERR, "dump time is zero");
+ return (0);
+ }
+ (void)printf("savecore: system went down at %s", ctime(&dumptime));
+#define LEEWAY (7 * SECSPERDAY)
+ if (dumptime < now - LEEWAY || dumptime > now + LEEWAY) {
+ (void)printf("dump time is unreasonable\n");
+ return (0);
+ }
+ return (1);
+}
+
+int
+check_space()
+{
+ register FILE *fp;
+ char *tkernel;
+ off_t minfree, spacefree, kernelsize, needed;
+ struct stat st;
+ struct statfs fsbuf;
+ char buf[100], path[MAXPATHLEN];
+
+ tkernel = kernel ? kernel : _PATH_UNIX;
+ if (stat(tkernel, &st) < 0) {
+ syslog(LOG_ERR, "%s: %m", tkernel);
+ exit(1);
+ }
+ kernelsize = st.st_blocks * S_BLKSIZE;
+ if (statfs(dirname, &fsbuf) < 0) {
+ syslog(LOG_ERR, "%s: %m", dirname);
+ exit(1);
+ }
+ spacefree = (fsbuf.f_bavail * fsbuf.f_bsize) / 1024;
+
+ (void)snprintf(path, sizeof(path), "%s/minfree", dirname);
+ if ((fp = fopen(path, "r")) == NULL)
+ minfree = 0;
+ else {
+ if (fgets(buf, sizeof(buf), fp) == NULL)
+ minfree = 0;
+ else
+ minfree = atoi(buf);
+ (void)fclose(fp);
+ }
+
+ needed = (dumpsize + kernelsize) / 1024;
+ if (minfree > 0 && spacefree - needed < minfree) {
+ syslog(LOG_WARNING,
+ "no dump, not enough free space on device");
+ return (0);
+ }
+ if (spacefree - needed < minfree)
+ syslog(LOG_WARNING,
+ "dump performed, but free space threshold crossed");
+ return (1);
+}
+
+int
+Open(name, rw)
+ char *name;
+ int rw;
+{
+ int fd;
+
+ if ((fd = open(name, rw, 0)) < 0) {
+ syslog(LOG_ERR, "%s: %m", name);
+ exit(1);
+ }
+ return (fd);
+}
+
+int
+Read(fd, bp, size)
+ int fd, size;
+ void *bp;
+{
+ int nr;
+
+ nr = read(fd, bp, size);
+ if (nr != size) {
+ syslog(LOG_ERR, "read: %m");
+ exit(1);
+ }
+ return (nr);
+}
+
+void
+Lseek(fd, off, flag)
+ int fd, flag;
+ off_t off;
+{
+ off_t ret;
+
+ ret = lseek(fd, off, flag);
+ if (ret == -1) {
+ syslog(LOG_ERR, "lseek: %m");
+ exit(1);
+ }
+}
+
+int
+Create(file, mode)
+ char *file;
+ int mode;
+{
+ register int fd;
+
+ fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);
+ if (fd < 0) {
+ syslog(LOG_ERR, "%s: %m", file);
+ exit(1);
+ }
+ return (fd);
+}
+
+void
+Write(fd, bp, size)
+ int fd, size;
+ void *bp;
+{
+ int n;
+
+ if ((n = write(fd, bp, size)) < size) {
+ syslog(LOG_ERR, "write: %s", strerror(n == -1 ? errno : EIO));
+ exit(1);
+ }
+}
+
+void
+usage()
+{
+ (void)syslog(LOG_ERR, "usage: savecore [-cfvz] [-N system] directory");
+ exit(1);
+}
-/* $NetBSD: savecore.c,v 1.23 1995/07/24 20:35:02 cgd Exp $ */
+/* $OpenBSD: savecore.c,v 1.3 1996/03/21 00:16:36 niklas Exp $ */
+/* $NetBSD: savecore.c,v 1.25 1996/03/16 10:29:46 leo Exp $ */
/*-
* Copyright (c) 1986, 1992, 1993
#if 0
static char sccsid[] = "@(#)savecore.c 8.3 (Berkeley) 1/2/94";
#else
-static char rcsid[] = "$NetBSD: savecore.c,v 1.23 1995/07/24 20:35:02 cgd Exp $";
+static char rcsid[] = "$NetBSD: savecore.c,v 1.25 1996/03/16 10:29:46 leo Exp $";
#endif
#endif /* not lint */
#include <string.h>
#include <tzfile.h>
#include <unistd.h>
+#include <limits.h>
+#include <kvm.h>
extern FILE *zopen __P((const char *fname, const char *mode, int bits));
-#define ok(number) ((number) - KERNBASE)
+#define KREAD(kd, addr, p)\
+ (kvm_read(kd, addr, (char *)(p), sizeof(*(p))) != sizeof(*(p)))
struct nlist current_nl[] = { /* Namelist for currently running system. */
#define X_DUMPDEV 0
{ "_panicstr" },
#define X_DUMPMAG 6
{ "_dumpmag" },
- { "" },
+ { NULL },
};
int cursyms[] = { X_DUMPDEV, X_DUMPLO, X_VERSION, X_DUMPMAG, -1 };
int dumpsyms[] = { X_TIME, X_DUMPSIZE, X_VERSION, X_PANICSTR, X_DUMPMAG, -1 };
{ "_version" },
{ "_panicstr" },
{ "_dumpmag" },
- { "" },
+ { NULL },
};
/* Types match kernel declarations. */
char *ddname; /* name of dump device */
dev_t dumpdev; /* dump device */
int dumpfd; /* read/write descriptor on block dev */
+kvm_t *kd_dump; /* kvm descriptor on block dev */
time_t now; /* current date */
char panic_mesg[1024];
int panicstr;
void log __P((int, char *, ...));
void Lseek __P((int, off_t, int));
int Open __P((char *, int rw));
-int Read __P((int, void *, int));
char *rawname __P((char *s));
void save_core __P((void));
void usage __P((void));
void
kmem_setup()
{
- FILE *fp;
- int kmem, i;
- char *dump_sys;
+ kvm_t *kd_kern;
+ char errbuf[_POSIX2_LINE_MAX];
+ int i, hdrsz;
+ char *dump_sys;
/*
* Some names we need for the currently running system, others for
* presumed to be the same (since the disk partitions are probably
* the same!)
*/
- if ((nlist(_PATH_UNIX, current_nl)) == -1)
- syslog(LOG_ERR, "%s: nlist: %s", _PATH_UNIX, strerror(errno));
+ kd_kern = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
+ if (kd_kern == NULL) {
+ syslog(LOG_ERR, "%s: kvm_openfiles: %s", _PATH_UNIX, errbuf);
+ exit(1);
+ }
+ if (kvm_nlist(kd_kern, current_nl) == -1)
+ syslog(LOG_ERR, "%s: kvm_nlist: %s", _PATH_UNIX,
+ kvm_geterr(kd_kern));
+
for (i = 0; cursyms[i] != -1; i++)
if (current_nl[cursyms[i]].n_value == 0) {
syslog(LOG_ERR, "%s: %s not in namelist",
exit(1);
}
- dump_sys = kernel ? kernel : _PATH_UNIX;
- if ((nlist(dump_sys, dump_nl)) == -1)
- syslog(LOG_ERR, "%s: nlist: %s", dump_sys, strerror(errno));
- for (i = 0; dumpsyms[i] != -1; i++)
- if (dump_nl[dumpsyms[i]].n_value == 0) {
- syslog(LOG_ERR, "%s: %s not in namelist",
- dump_sys, dump_nl[dumpsyms[i]].n_name);
- exit(1);
- }
-
- kmem = Open(_PATH_KMEM, O_RDONLY);
- Lseek(kmem, (off_t)current_nl[X_DUMPDEV].n_value, L_SET);
- (void)Read(kmem, &dumpdev, sizeof(dumpdev));
+ KREAD(kd_kern, current_nl[X_DUMPDEV].n_value, &dumpdev);
if (dumpdev == NODEV) {
syslog(LOG_WARNING, "no core dump (no dumpdev)");
exit(1);
}
- Lseek(kmem, (off_t)current_nl[X_DUMPLO].n_value, L_SET);
- (void)Read(kmem, &dumplo, sizeof(dumplo));
+ KREAD(kd_kern, current_nl[X_DUMPLO].n_value, &dumplo);
dumplo *= DEV_BSIZE;
if (verbose)
(void)printf("dumplo = %d (%d * %d)\n",
dumplo, dumplo / DEV_BSIZE, DEV_BSIZE);
- Lseek(kmem, (off_t)current_nl[X_DUMPMAG].n_value, L_SET);
- (void)Read(kmem, &dumpmag, sizeof(dumpmag));
+ KREAD(kd_kern, current_nl[X_DUMPMAG].n_value, &dumpmag);
+
+ if (kernel == NULL) {
+ (void)kvm_read(kd_kern, current_nl[X_VERSION].n_value,
+ vers, sizeof(vers));
+ vers[sizeof(vers) - 1] = '\0';
+ }
+
ddname = find_dev(dumpdev, S_IFBLK);
dumpfd = Open(ddname, O_RDWR);
- fp = fdopen(kmem, "r");
- if (fp == NULL) {
- syslog(LOG_ERR, "%s: fdopen: %m", _PATH_KMEM);
+
+ dump_sys = kernel ? kernel : _PATH_UNIX;
+
+ kd_dump = kvm_openfiles(dump_sys, ddname, NULL, O_RDWR, errbuf);
+ if (kd_dump == NULL) {
+ syslog(LOG_ERR, "%s: kvm_openfiles: %s", dump_sys, errbuf);
exit(1);
}
- if (kernel)
- return;
- (void)fseek(fp, (off_t)current_nl[X_VERSION].n_value, L_SET);
- (void)fgets(vers, sizeof(vers), fp);
- /* Don't fclose(fp), we use dumpfd later. */
+ if (kvm_nlist(kd_dump, dump_nl) == -1)
+ syslog(LOG_ERR, "%s: kvm_nlist: %s", dump_sys,
+ kvm_geterr(kd_dump));
+
+ for (i = 0; dumpsyms[i] != -1; i++)
+ if (dump_nl[dumpsyms[i]].n_value == 0) {
+ syslog(LOG_ERR, "%s: %s not in namelist",
+ dump_sys, dump_nl[dumpsyms[i]].n_name);
+ exit(1);
+ }
+ hdrsz = kvm_dump_mkheader(kd_kern, kd_dump, (off_t)dumplo);
+ if (hdrsz == -1) {
+ syslog(LOG_ERR, "%s: kvm_dump_mkheader: %s", dump_sys,
+ kvm_geterr(kd_kern));
+ exit(1);
+ }
+ dumplo += hdrsz;
+ kvm_close(kd_kern);
}
void
check_kmem()
{
- register char *cp;
- FILE *fp;
+ register char *cp;
+ register int panicloc;
char core_vers[1024];
- fp = fdopen(dumpfd, "r");
- if (fp == NULL) {
- syslog(LOG_ERR, "%s: fdopen: %m", ddname);
- exit(1);
- }
- fseek(fp, (off_t)(dumplo + ok(dump_nl[X_VERSION].n_value)), L_SET);
- fgets(core_vers, sizeof(core_vers), fp);
+ (void)kvm_read(kd_dump, dump_nl[X_VERSION].n_value, core_vers,
+ sizeof(core_vers));
+ core_vers[sizeof(core_vers) - 1] = '\0';
+
if (strcmp(vers, core_vers) && kernel == 0)
syslog(LOG_WARNING,
"warning: %s version mismatch:\n\t%s\nand\t%s\n",
_PATH_UNIX, vers, core_vers);
- (void)fseek(fp,
- (off_t)(dumplo + ok(dump_nl[X_PANICSTR].n_value)), L_SET);
- (void)fread(&panicstr, sizeof(panicstr), 1, fp);
+
+ KREAD(kd_dump, dump_nl[X_PANICSTR].n_value, &panicstr);
if (panicstr) {
- (void)fseek(fp, dumplo + ok(panicstr), L_SET);
- cp = panic_mesg;
- do
- *cp = getc(fp);
- while (*cp++ && cp < &panic_mesg[sizeof(panic_mesg)]);
+ cp = panic_mesg;
+ panicloc = panicstr;
+ do {
+ KREAD(kd_dump, panicloc, cp);
+ panicloc++;
+ } while (*cp++ && cp < &panic_mesg[sizeof(panic_mesg)]);
}
- /* Don't fclose(fp), we use dumpfd later. */
-}
-
-void
-clear_dump()
-{
- long newdumplo;
-
- newdumplo = 0;
- Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPMAG].n_value)), L_SET);
- Write(dumpfd, &newdumplo, sizeof(newdumplo));
}
int
{
int newdumpmag;
- Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPMAG].n_value)), L_SET);
- (void)Read(dumpfd, &newdumpmag, sizeof(newdumpmag));
+ KREAD(kd_dump, dump_nl[X_DUMPMAG].n_value, &newdumpmag);
/* Read the dump size. */
- Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPSIZE].n_value)), L_SET);
- (void)Read(dumpfd, &dumpsize, sizeof(dumpsize));
+ KREAD(kd_dump, dump_nl[X_DUMPSIZE].n_value, &dumpsize);
dumpsize *= getpagesize();
/*
return (1);
}
+void
+clear_dump()
+{
+ if (kvm_dump_inval(kd_dump) == -1)
+ syslog(LOG_ERR, "%s: kvm_clear_dump: %s", ddname,
+ kvm_geterr(kd_dump));
+
+}
+
char buf[1024 * 1024];
void
(void)fclose(fp);
/* Create the core file. */
- (void)snprintf(path, sizeof(path), "%s/bsd.%d%s.core",
+ (void)snprintf(path, sizeof(path), "%s/bsd.%d.core%s",
dirname, bounds, compress ? ".Z" : "");
if (compress) {
if ((fp = zopen(path, "w", 0)) == NULL) {
syslog(LOG_ERR, "%s: %s", path, strerror(errno));
exit(1);
}
- } else
+ } else {
ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ fp = fdopen(ofd, "w");
+ if (fp == NULL) {
+ syslog(LOG_ERR, "%s: fdopen: %s", path);
+ exit(1);
+ }
+ }
/* Open the raw device. */
rawp = rawname(ddname);
/* Seek to the start of the core. */
Lseek(ifd, (off_t)dumplo, L_SET);
+ if (kvm_dump_wrtheader(kd_dump, fp, dumpsize) == -1) {
+ syslog(LOG_ERR, "kvm_dump_wrtheader: %s : %s", path,
+ kvm_geterr(kd_dump));
+ exit(1);
+ }
+
/* Copy the core file. */
syslog(LOG_NOTICE, "writing %score to %s",
compress ? "compressed " : "", path);
syslog(LOG_ERR, "%s: %m", rawp);
goto err2;
}
- if (compress)
- nw = fwrite(buf, 1, nr, fp);
- else
- nw = write(ofd, buf, nr);
+ nw = fwrite(buf, 1, nr, fp);
if (nw != nr) {
syslog(LOG_ERR, "%s: %s",
path, strerror(nw == 0 ? EIO : errno));
}
}
(void)close(ifd);
- if (compress)
- (void)fclose(fp);
- else
- (void)close(ofd);
+ (void)fclose(fp);
/* Copy the kernel. */
ifd = Open(kernel ? kernel : _PATH_UNIX, O_RDONLY);
{
time_t dumptime; /* Time the dump was taken. */
- Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_TIME].n_value)), L_SET);
- (void)Read(dumpfd, &dumptime, sizeof(dumptime));
+ KREAD(kd_dump, dump_nl[X_TIME].n_value, &dumptime);
if (dumptime == 0) {
if (verbose)
syslog(LOG_ERR, "dump time is zero");
return (fd);
}
-int
-Read(fd, bp, size)
- int fd, size;
- void *bp;
-{
- int nr;
-
- nr = read(fd, bp, size);
- if (nr != size) {
- syslog(LOG_ERR, "read: %m");
- exit(1);
- }
- return (nr);
-}
-
void
Lseek(fd, off, flag)
int fd, flag;