home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume16 / deliver / part03 / sysdep.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-11-14  |  5.1 KB  |  296 lines

  1. /* $Header: sysdep.c,v 1.3 88/09/14 20:00:24 network Exp $
  2.  *
  3.  * Routines which are (or might well be) system-dependant.
  4.  * I've put the message routines here since you may need to use
  5.  * the ANSI <stdarg.h> instead of <varargs.h>.
  6.  *
  7.  * $Log:    sysdep.c,v $
  8.  * Revision 1.3  88/09/14  20:00:24  network
  9.  * Fix type of gethostname() for BSD.
  10.  * 
  11.  * Revision 1.2  88/09/14  19:42:37  network
  12.  * Portability to System V and BSD.
  13.  * General fixup.
  14.  * 
  15.  * Revision 1.1  88/06/06  09:39:29  chip
  16.  * Initial revision
  17.  * 
  18.  */
  19.  
  20. #include "deliver.h"
  21. #include <errno.h>
  22. #include <varargs.h>
  23.  
  24. #ifdef UNAME
  25. #include <sys/utsname.h>
  26. #endif
  27.  
  28. /*
  29.  * External functions.
  30.  */
  31.  
  32. #ifdef M_XENIX
  33. extern  long    nap();
  34. #else
  35. extern  unsigned sleep();
  36. #endif
  37.  
  38. /*
  39.  * External data.
  40.  */
  41.  
  42. extern  int     errno;
  43. extern  int     sys_nerr;
  44. extern  char    *sys_errlist[];
  45.  
  46. /*----------------------------------------------------------------------
  47.  * Print a message.
  48.  */
  49.  
  50. /* VARARGS1 */
  51. message(fmt, va_alist)
  52. char    *fmt;
  53. va_dcl
  54. {
  55.     va_list args;
  56.     va_start(args);
  57.  
  58.     (void) vfprintf(stderr, fmt, args);
  59. }
  60.  
  61. /*----------------------------------------------------------------------
  62.  * Print an error message.
  63.  */
  64.  
  65. /* VARARGS1 */
  66. error(fmt, va_alist)
  67. char    *fmt;
  68. va_dcl
  69. {
  70.     va_list args;
  71.     va_start(args);
  72.  
  73.     (void) fprintf(stderr, "%s: ", progname);
  74.     (void) vfprintf(stderr, fmt, args);
  75. }
  76.  
  77. /*----------------------------------------------------------------------
  78.  * Report an error returned from a system call.
  79.  */
  80.  
  81. /* VARARGS1 */
  82. syserr(fmt, va_alist)
  83. char    *fmt;
  84. va_dcl
  85. {
  86.     int     e = errno;
  87.     va_list args;
  88.     va_start(args);
  89.  
  90.     (void) fprintf(stderr, "%s: ", progname);
  91.     (void) vfprintf(stderr, fmt, args);
  92.     if (e <= sys_nerr)
  93.         (void) fprintf(stderr, ": %s\n", sys_errlist[e]);
  94.     else
  95.         (void) fprintf(stderr, ": unknown system error %d\n", e);
  96. }
  97.  
  98. /*----------------------------------------------------------------------
  99.  * Sleep for the given number of seconds.
  100.  */
  101.  
  102. snooze(n)
  103. int     n;
  104. {
  105. #ifdef M_XENIX
  106.     (void) nap(n * 1000L);
  107. #else
  108.     (void) sleep(n);
  109. #endif
  110. }
  111.  
  112. /*----------------------------------------------------------------------
  113.  * Get the host name from HOSTFILE.
  114.  */
  115.  
  116. #ifdef HOSTFILE
  117.  
  118. char *
  119. gethost()
  120. {
  121.     int     fd, rd;
  122.     char    *p;
  123.     static char name[32];
  124.  
  125.     if ((fd = open(HOSTFILE, O_RDONLY)) == -1)
  126.         return NULL;
  127.     rd = read(fd, name, sizeof(name) - 1);
  128.     (void) close(fd);
  129.  
  130.     if (rd < 1)
  131.         return NULL;
  132.     name[rd] = 0;
  133.     if ((p = strchr(name, '\n')) != NULL)
  134.         *p = 0;
  135.  
  136.     return (name[0] ? name : NULL);
  137. }
  138.  
  139. #endif /* HOSTFILE */
  140.  
  141. /*----------------------------------------------------------------------
  142.  * Get the host name via the uname() system call.
  143.  */
  144.  
  145. #ifdef UNAME
  146.  
  147. char *
  148. gethost()
  149. {
  150.     static struct utsname u;
  151.  
  152.     uname(&u);
  153.     return (u.nodename[0] ? u.nodename : NULL);
  154. }
  155.  
  156. #endif /* UNAME */
  157.  
  158. /*----------------------------------------------------------------------
  159.  * Get the host name via the gethostname() system call.
  160.  */
  161.  
  162. #ifdef GETHOSTNAME
  163.  
  164. char *
  165. gethost()
  166. {
  167.     static char hostname[64];
  168.  
  169.     if (gethostname(hostname, sizeof(hostname)) == -1)
  170.         return NULL;
  171.  
  172.     return hostname;
  173. }
  174.  
  175. #endif /* GETHOSTNAME */
  176.  
  177. /*----------------------------------------------------------------------
  178.  * Variable-argument-list output, System V style.
  179.  */
  180.  
  181. #ifndef HAS_VPRINTF
  182.  
  183. vprintf(fmt, ap)
  184. char    *fmt;
  185. va_list ap;
  186. {
  187.     int     a,b,c,d,e,f,g,h;
  188.  
  189.     a = va_arg(ap, int);
  190.     b = va_arg(ap, int);
  191.     c = va_arg(ap, int);
  192.     d = va_arg(ap, int);
  193.     e = va_arg(ap, int);
  194.     f = va_arg(ap, int);
  195.     g = va_arg(ap, int);
  196.     h = va_arg(ap, int);
  197.  
  198.     printf(fmt, a,b,c,d,e,f,g,h);
  199. }
  200.  
  201. vfprintf(fp, fmt, ap)
  202. FILE    *fp;
  203. char    *fmt;
  204. va_list ap;
  205. {
  206.     int     a,b,c,d,e,f,g,h;
  207.  
  208.     a = va_arg(ap, int);
  209.     b = va_arg(ap, int);
  210.     c = va_arg(ap, int);
  211.     d = va_arg(ap, int);
  212.     e = va_arg(ap, int);
  213.     f = va_arg(ap, int);
  214.     g = va_arg(ap, int);
  215.     h = va_arg(ap, int);
  216.  
  217.     fprintf(fp, fmt, a,b,c,d,e,f,g,h);
  218. }
  219.  
  220. vsprintf(s, fmt, ap)
  221. char    *s;
  222. char    *fmt;
  223. va_list ap;
  224. {
  225.     int     a,b,c,d,e,f,g,h;
  226.  
  227.     a = va_arg(ap, int);
  228.     b = va_arg(ap, int);
  229.     c = va_arg(ap, int);
  230.     d = va_arg(ap, int);
  231.     e = va_arg(ap, int);
  232.     f = va_arg(ap, int);
  233.     g = va_arg(ap, int);
  234.     h = va_arg(ap, int);
  235.  
  236.     sprintf(s, fmt, a,b,c,d,e,f,g,h);
  237. }
  238.  
  239. #endif  /* HAS_VPRINTF */
  240.  
  241. /*----------------------------------------------------------------------
  242.  * Add a new environment variable.
  243.  */
  244.  
  245. #ifndef HAS_PUTENV
  246.  
  247. int
  248. putenv(s)
  249. char *s;
  250. {
  251.     static  char    **env_array;
  252.     static  int     env_size;
  253.     char    *e;
  254.     int     i, j;
  255.  
  256.     if (env_array == NULL)
  257.     {
  258.         for (i = 0; environ[i]; ++i)
  259.             {}
  260.         env_size = i + 10;      /* arbitrary */
  261.         env_array = (char **) zalloc(env_size * sizeof(char *));
  262.         (void) memcpy((char *)env_array, (char *)environ,
  263.                 (int) ((i + 1) * sizeof(char *)));
  264.         environ = env_array;
  265.     }
  266.     else if (environ != env_array)
  267.         message("putenv: warning: someone moved environ!\n");
  268.  
  269.     if ((e = strchr(s, '=')) != NULL)
  270.         ++e;
  271.     else
  272.         e = s + strlen(s);
  273.  
  274.     j = 0;
  275.     for (i = 0; env_array[i]; ++i)
  276.     {
  277.         if (strncmp(env_array[i], s, e - s) != 0)
  278.             env_array[j++] = env_array[i];
  279.     }
  280.  
  281.     if ((j + 1) >= env_size)
  282.     {
  283.         env_size += 10;                 /* arbitrary */
  284.         env_array = (char **) srealloc((char *)env_array,
  285.                     env_size * sizeof(char **));
  286.     }
  287.  
  288.     env_array[j++] = s;
  289.     env_array[j] = NULL;
  290.  
  291.     environ = env_array;
  292.     return 0;
  293. }
  294.  
  295. #endif  /* HAS_PUTENV */
  296.