]> The Tcpdump Group git mirrors - tcpdump/blobdiff - parsenfsfh.c
Address Michael's comments.
[tcpdump] / parsenfsfh.c
index 57c1e8ac6155215e9eac558cc3befabc96c46a53..d5f877d82235cff4527a98d328a325c56b1b26f1 100644 (file)
@@ -1,3 +1,36 @@
+/*
+ * Copyright (c) 1993, 1994 Jeffrey C. Mogul, Digital Equipment Corporation,
+ * Western Research Laboratory. All rights reserved.
+ * Copyright (c) 2001 Compaq Computer Corporation. All rights reserved.
+ *
+ *  Permission to use, copy, and modify this software and its
+ *  documentation is hereby granted only under the following terms and
+ *  conditions.  Both the above copyright notice and this permission
+ *  notice must appear in all copies of the software, derivative works
+ *  or modified versions, and any portions thereof, and both notices
+ *  must appear in supporting documentation.
+ *
+ *  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.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS" AND COMPAQ COMPUTER CORPORATION
+ *  DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ *  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.   IN NO
+ *  EVENT SHALL COMPAQ COMPUTER CORPORATION BE LIABLE FOR ANY
+ *  SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ *  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ *  OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ *  SOFTWARE.
+ */
+
 /*
  * parsenfsfh.c - portable parser for NFS file handles
  *                     uses all sorts of heuristics
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/parsenfsfh.c,v 1.18 2000-07-01 03:39:00 assar Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/parsenfsfh.c,v 1.29 2006-06-13 22:21:38 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <sys/types.h>
-#include <sys/time.h>
+#include <tcpdump-stdinc.h>
 
-#include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -48,6 +79,7 @@ static const char rcsid[] =
 #define        FHT_SUNOS5      9
 #define        FHT_AIX32       10
 #define        FHT_HPUX9       11
+#define        FHT_BSD44       12
 
 #ifdef ultrix
 /* Nasty hack to keep the Ultrix C compiler from emitting bogus warnings */
@@ -75,19 +107,19 @@ static const char rcsid[] =
        ((lsb) + ((e)<<8) + ((d)<<16) + ((c)<<24))
 #endif
 
-static int is_UCX(unsigned char *);
+static int is_UCX(const unsigned char *);
 
 void
 Parse_fh(fh, len, fsidp, inop, osnamep, fsnamep, ourself)
-register caddr_t *fh;
-int len;
+register const unsigned char *fh;
+int len _U_;
 my_fsid *fsidp;
 ino_t *inop;
-char **osnamep;                /* if non-NULL, return OS name here */
-char **fsnamep;                /* if non-NULL, return server fs name here (for VMS) */
+const char **osnamep;          /* if non-NULL, return OS name here */
+const char **fsnamep;          /* if non-NULL, return server fs name here (for VMS) */
 int ourself;           /* true if file handle was generated on this host */
 {
-       register unsigned char *fhp = (unsigned char *)fh;
+       register const unsigned char *fhp = fh;
        u_int32_t temp;
        int fhtype = FHT_UNKNOWN;
        int i;
@@ -114,6 +146,10 @@ int ourself;               /* true if file handle was generated on this host */
 #endif
 #if    defined(__osf__)
            fhtype = FHT_DECOSF;
+#endif
+#if    defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) \
+     || defined(__OpenBSD__)
+           fhtype = FHT_BSD44;
 #endif
        }
        /*
@@ -165,8 +201,11 @@ int ourself;               /* true if file handle was generated on this host */
                 * could be Ultrix, IRIX5, AIX, or SUNOS5
                 * might be HP-UX (depends on their values for minor devs)
                 */
+               if ((fhp[6] == 0) && (fhp[7] == 0)) {
+                   fhtype = FHT_BSD44;
+               }
                /*XXX we probably only need to test of these two bytes */
-               if ((fhp[21] == 0) && (fhp[23] == 0)) {
+               else if ((fhp[21] == 0) && (fhp[23] == 0)) {
                    fhtype = FHT_ULTRIX;
                }
                else {
@@ -232,6 +271,18 @@ int ourself;               /* true if file handle was generated on this host */
                *osnamep = "Auspex";
            break;
 
+       case FHT_BSD44:
+           fsidp->Fsid_dev.Minor = fhp[0];
+           fsidp->Fsid_dev.Major = fhp[1];
+           fsidp->fsid_code = 0;
+
+           temp = make_uint32(fhp[15], fhp[14], fhp[13], fhp[12]);
+           *inop = temp;
+
+           if (osnamep)
+               *osnamep = "BSD 4.4";
+           break;
+
        case FHT_DECOSF:
            fsidp->fsid_code = make_uint32(fhp[7], fhp[6], fhp[5], fhp[4]);
                        /* XXX could ignore 3 high-order bytes */
@@ -270,10 +321,16 @@ int ourself;              /* true if file handle was generated on this host */
                *osnamep = "IRIX5";
            break;
 
+#ifdef notdef
        case FHT_SUNOS3:
+           /*
+            * XXX - none of the heuristics above return this.
+            * Are there any SunOS 3.x systems around to care about?
+            */
            if (osnamep)
                *osnamep = "SUNOS3";
            break;
+#endif
 
        case FHT_SUNOS4:
            fsidp->Fsid_dev.Minor = fhp[3];
@@ -369,17 +426,15 @@ int ourself;              /* true if file handle was generated on this host */
        case FHT_UNKNOWN:
 #ifdef DEBUG
            /* XXX debugging */
-           int i;
            for (i = 0; i < 32; i++)
                (void)fprintf(stderr, "%x.", fhp[i]);
            (void)fprintf(stderr, "\n");
 #endif
-           /* XXX for now, give "bogus" values to aid debugging */
-
            /* Save the actual handle, so it can be display with -u */
            for (i = 0; i < 32; i++)
-               (void)sprintf(&(fsidp->Opaque_Handle[i*2]), "%.2X", fhp[i]);
+               (void)snprintf(&(fsidp->Opaque_Handle[i*2]), 3, "%.2X", fhp[i]);
 
+           /* XXX for now, give "bogus" values to aid debugging */
            fsidp->fsid_code = 0;
            fsidp->Fsid_dev.Minor = 257;
            fsidp->Fsid_dev.Major = 257;
@@ -405,7 +460,7 @@ int ourself;                /* true if file handle was generated on this host */
  */
 static int
 is_UCX(fhp)
-unsigned char *fhp;
+const unsigned char *fhp;
 {
        register int i;
        int seen_null = 0;