Home | History | Annotate | Download | only in tcpdump
      1 /*
      2  * Copyright (c) 1996, 1997
      3  *	The Regents of the University of California.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that: (1) source code distributions
      7  * retain the above copyright notice and this paragraph in its entirety, (2)
      8  * distributions including binary code include the above copyright notice and
      9  * this paragraph in its entirety in the documentation or other materials
     10  * provided with the distribution, and (3) all advertising materials mentioning
     11  * features or use of this software display the following acknowledgement:
     12  * ``This product includes software developed by the University of California,
     13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
     14  * the University nor the names of its contributors may be used to endorse
     15  * or promote products derived from this software without specific prior
     16  * written permission.
     17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     20  */
     21 
     22 #ifdef HAVE_CONFIG_H
     23 #include "config.h"
     24 #endif
     25 
     26 /*
     27  * XXX - all we need, on platforms other than DEC OSF/1 (a/k/a Digital UNIX,
     28  * a/k/a Tru64 UNIX), is "size_t", which is a standard C type; what do we
     29  * need to do to get it defined?  This is clearly wrong, as we shouldn't
     30  * have to include UNIX or Windows system header files to get it.
     31  */
     32 #include <netdissect-stdinc.h>
     33 
     34 #ifndef HAVE___ATTRIBUTE__
     35 #define __attribute__(x)
     36 #endif /* HAVE___ATTRIBUTE__ */
     37 
     38 #ifdef __osf__
     39 #include <sys/sysinfo.h>
     40 #include <sys/proc.h>
     41 
     42 #if !defined(HAVE_SNPRINTF)
     43 int snprintf(char *, size_t, const char *, ...)
     44 #ifdef __ATTRIBUTE___FORMAT_OK
     45      __attribute__((format(printf, 3, 4)))
     46 #endif /* __ATTRIBUTE___FORMAT_OK */
     47      ;
     48 #endif /* !defined(HAVE_SNPRINTF) */
     49 #endif /* __osf__ */
     50 
     51 #include "machdep.h"
     52 
     53 /*
     54  * On platforms where the CPU doesn't support unaligned loads, force
     55  * unaligned accesses to abort with SIGBUS, rather than being fixed
     56  * up (slowly) by the OS kernel; on those platforms, misaligned accesses
     57  * are bugs, and we want tcpdump to crash so that the bugs are reported.
     58  *
     59  * The only OS on which this is necessary is DEC OSF/1^W^WDigital
     60  * UNIX^W^WTru64 UNIX.
     61  */
     62 int
     63 abort_on_misalignment(char *ebuf _U_, size_t ebufsiz _U_)
     64 {
     65 #ifdef __osf__
     66 	static int buf[2] = { SSIN_UACPROC, UAC_SIGBUS };
     67 
     68 	if (setsysinfo(SSI_NVPAIRS, (caddr_t)buf, 1, 0, 0) < 0) {
     69 		(void)snprintf(ebuf, ebufsiz, "setsysinfo: errno %d", errno);
     70 		return (-1);
     71 	}
     72 #endif
     73 	return (0);
     74 }
     75