1: /* The <sys/types.h> header contains important data type definitions.
   2:  * It is considered good programming practice to use these definitions, 
   3:  * instead of the underlying base type.  By convention, all type names end 
   4:  * with _t.
   5:  */
   6: 
   7: #ifndef _TYPES_H
   8: #define _TYPES_H
   9: 
  10: #ifndef _ANSI_H
  11: #include <ansi.h>
  12: #endif
  13: 
  14: /* The type size_t holds all results of the sizeof operator.  At first glance,
  15:  * it seems obvious that it should be an unsigned int, but this is not always 
  16:  * the case. For example, MINIX-ST (68000) has 32-bit pointers and 16-bit
  17:  * integers. When one asks for the size of a 70K struct or array, the result 
  18:  * requires 17 bits to express, so size_t must be a long type.  The type 
  19:  * ssize_t is the signed version of size_t.
  20:  */
  21: #ifndef _SIZE_T
  22: #define _SIZE_T
  23: typedef unsigned int size_t;
  24: #endif
  25: 
  26: #ifndef _SSIZE_T
  27: #define _SSIZE_T
  28: typedef int ssize_t;
  29: #endif
  30: 
  31: #ifndef _TIME_T
  32: #define _TIME_T
  33: typedef long time_t;               /* time in sec since 1 Jan 1970 0000 GMT */
  34: #endif
  35: 
  36: #ifndef _CLOCK_T
  37: #define _CLOCK_T
  38: typedef long clock_t;              /* unit for system accounting */
  39: #endif
  40: 
  41: #ifndef _SIGSET_T
  42: #define _SIGSET_T
  43: typedef unsigned long sigset_t;
  44: #endif
  45: 
  46: /* Open Group Base Specifications Issue 6 (not complete) */
  47: typedef long useconds_t;        /* Time in microseconds */
  48: 
  49: /* Types used in disk, inode, etc. data structures. */
  50: typedef short          dev_t;      /* holds (major|minor) device pair */
  51: typedef char           gid_t;      /* group id */
  52: typedef unsigned long  ino_t;      /* i-node number (V3 filesystem) */
  53: typedef unsigned short mode_t;     /* file type and permissions bits */
  54: typedef short        nlink_t;      /* number of links to a file */
  55: typedef unsigned long  off_t;      /* offset within a file */
  56: typedef int            pid_t;      /* process id (must be signed) */
  57: typedef short          uid_t;      /* user id */
  58: typedef unsigned long zone_t;      /* zone number */
  59: typedef unsigned long block_t;     /* block number */
  60: typedef unsigned long  bit_t;      /* bit number in a bit map */
  61: typedef unsigned short zone1_t;    /* zone number for V1 file systems */
  62: typedef unsigned short bitchunk_t; /* collection of bits in a bitmap */
  63: 
  64: typedef unsigned char   u8_t;      /* 8 bit type */
  65: typedef unsigned short u16_t;      /* 16 bit type */
  66: typedef unsigned long  u32_t;      /* 32 bit type */
  67: 
  68: typedef char            i8_t;      /* 8 bit signed type */
  69: typedef short          i16_t;      /* 16 bit signed type */
  70: typedef long           i32_t;      /* 32 bit signed type */
  71: 
  72: typedef struct { u32_t _[2]; } u64_t;
  73: 
  74: /* The following types are needed because MINIX uses K&R style function
  75:  * definitions (for maximum portability).  When a short, such as dev_t, is
  76:  * passed to a function with a K&R definition, the compiler automatically
  77:  * promotes it to an int.  The prototype must contain an int as the parameter,
  78:  * not a short, because an int is what an old-style function definition
  79:  * expects.  Thus using dev_t in a prototype would be incorrect.  It would be
  80:  * sufficient to just use int instead of dev_t in the prototypes, but Dev_t
  81:  * is clearer.
  82:  */
  83: typedef int            Dev_t;
  84: typedef int       _mnx_Gid_t;
  85: typedef int          Nlink_t;
  86: typedef int       _mnx_Uid_t;
  87: typedef int             U8_t;
  88: typedef unsigned long  U32_t;
  89: typedef int             I8_t;
  90: typedef int            I16_t;
  91: typedef long           I32_t;
  92: 
  93: /* ANSI C makes writing down the promotion of unsigned types very messy.  When
  94:  * sizeof(short) == sizeof(int), there is no promotion, so the type stays
  95:  * unsigned.  When the compiler is not ANSI, there is usually no loss of
  96:  * unsignedness, and there are usually no prototypes so the promoted type
  97:  * doesn't matter.  The use of types like Ino_t is an attempt to use ints
  98:  * (which are not promoted) while providing information to the reader.
  99:  */
 100: 
 101: typedef unsigned long  Ino_t;
 102: 
 103: #if _EM_WSIZE == 2
 104: /*typedef unsigned int      Ino_t; Ino_t is now 32 bits */
 105: typedef unsigned int    Zone1_t;
 106: typedef unsigned int Bitchunk_t;
 107: typedef unsigned int      U16_t;
 108: typedef unsigned int  _mnx_Mode_t;
 109: 
 110: #else /* _EM_WSIZE == 4, or _EM_WSIZE undefined */
 111: /*typedef int             Ino_t; Ino_t is now 32 bits */
 112: typedef int             Zone1_t;
 113: typedef int          Bitchunk_t;
 114: typedef int               U16_t;
 115: typedef int         _mnx_Mode_t;
 116: 
 117: #endif /* _EM_WSIZE == 2, etc */
 118:  
 119: /* Signal handler type, e.g. SIG_IGN */
 120: typedef void _PROTOTYPE( (*sighandler_t), (int) );
 121: 
 122: /* Compatibility with other systems */
 123: typedef unsigned char   u_char;
 124: typedef unsigned short  u_short;
 125: typedef unsigned int    u_int;
 126: typedef unsigned long   u_long;
 127: typedef char            *caddr_t;
 128: 
 129: #endif /* _TYPES_H */