unp.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /* include unph */
  2. /* Our own header. Tabs are set for 4 spaces, not 8 */
  3. #ifndef __unp_h
  4. #define __unp_h
  5. #include "../config.h" /* configuration options for current OS */
  6. /* "../config.h" is generated by configure */
  7. /* If anything changes in the following list of #includes, must change
  8. acsite.m4 also, for configure's tests. */
  9. #include <sys/types.h> /* basic system data types */
  10. #include <sys/socket.h> /* basic socket definitions */
  11. #if TIME_WITH_SYS_TIME
  12. #include <sys/time.h> /* timeval{} for select() */
  13. #include <time.h> /* timespec{} for pselect() */
  14. #else
  15. #if HAVE_SYS_TIME_H
  16. #include <sys/time.h> /* includes <time.h> unsafely */
  17. #else
  18. #include <time.h> /* old system? */
  19. #endif
  20. #endif
  21. #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
  22. #include <arpa/inet.h> /* inet(3) functions */
  23. #include <errno.h>
  24. #include <fcntl.h> /* for nonblocking */
  25. #include <netdb.h>
  26. #include <signal.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <sys/stat.h> /* for S_xxx file mode constants */
  31. #include <sys/uio.h> /* for iovec{} and readv/writev */
  32. #include <unistd.h>
  33. #include <sys/wait.h>
  34. #include <sys/un.h> /* for Unix domain sockets */
  35. #ifdef HAVE_SYS_SELECT_H
  36. # include <sys/select.h> /* for convenience */
  37. #endif
  38. #ifdef HAVE_SYS_SYSCTL_H
  39. #ifdef HAVE_SYS_PARAM_H
  40. # include <sys/param.h> /* OpenBSD prereq for sysctl.h */
  41. #endif
  42. # include <sys/sysctl.h>
  43. #endif
  44. #ifdef HAVE_POLL_H
  45. # include <poll.h> /* for convenience */
  46. #endif
  47. #ifdef HAVE_SYS_EVENT_H
  48. # include <sys/event.h> /* for kqueue */
  49. #endif
  50. #ifdef HAVE_STRINGS_H
  51. # include <strings.h> /* for convenience */
  52. #endif
  53. /* Three headers are normally needed for socket/file ioctl's:
  54. * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
  55. */
  56. #ifdef HAVE_SYS_IOCTL_H
  57. # include <sys/ioctl.h>
  58. #endif
  59. #ifdef HAVE_SYS_FILIO_H
  60. # include <sys/filio.h>
  61. #endif
  62. #ifdef HAVE_SYS_SOCKIO_H
  63. # include <sys/sockio.h>
  64. #endif
  65. #ifdef HAVE_PTHREAD_H
  66. # include <pthread.h>
  67. #endif
  68. #ifdef HAVE_NET_IF_DL_H
  69. # include <net/if_dl.h>
  70. #endif
  71. #ifdef HAVE_NETINET_SCTP_H
  72. #include <netinet/sctp.h>
  73. #endif
  74. /* OSF/1 actually disables recv() and send() in <sys/socket.h> */
  75. #ifdef __osf__
  76. #undef recv
  77. #undef send
  78. #define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)
  79. #define send(a,b,c,d) sendto(a,b,c,d,0,0)
  80. #endif
  81. #ifndef INADDR_NONE
  82. /* $$.Ic INADDR_NONE$$ */
  83. #define INADDR_NONE 0xffffffff /* should have been in <netinet/in.h> */
  84. #endif
  85. #ifndef SHUT_RD /* these three POSIX names are new */
  86. #define SHUT_RD 0 /* shutdown for reading */
  87. #define SHUT_WR 1 /* shutdown for writing */
  88. #define SHUT_RDWR 2 /* shutdown for reading and writing */
  89. /* $$.Ic SHUT_RD$$ */
  90. /* $$.Ic SHUT_WR$$ */
  91. /* $$.Ic SHUT_RDWR$$ */
  92. #endif
  93. /* *INDENT-OFF* */
  94. #ifndef INET_ADDRSTRLEN
  95. /* $$.Ic INET_ADDRSTRLEN$$ */
  96. #define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0"
  97. 1234567890123456 */
  98. #endif
  99. /* Define following even if IPv6 not supported, so we can always allocate
  100. an adequately sized buffer without #ifdefs in the code. */
  101. #ifndef INET6_ADDRSTRLEN
  102. /* $$.Ic INET6_ADDRSTRLEN$$ */
  103. #define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string:
  104. "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or
  105. "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0"
  106. 1234567890123456789012345678901234567890123456 */
  107. #endif
  108. /* *INDENT-ON* */
  109. /* Define bzero() as a macro if it's not in standard C library. */
  110. #ifndef HAVE_BZERO
  111. #define bzero(ptr,n) memset(ptr, 0, n)
  112. /* $$.If bzero$$ */
  113. /* $$.If memset$$ */
  114. #endif
  115. /* Older resolvers do not have gethostbyname2() */
  116. #ifndef HAVE_GETHOSTBYNAME2
  117. #define gethostbyname2(host,family) gethostbyname((host))
  118. #endif
  119. /* The structure returned by recvfrom_flags() */
  120. struct unp_in_pktinfo {
  121. struct in_addr ipi_addr; /* dst IPv4 address */
  122. int ipi_ifindex;/* received interface index */
  123. };
  124. /* $$.It unp_in_pktinfo$$ */
  125. /* $$.Ib ipi_addr$$ */
  126. /* $$.Ib ipi_ifindex$$ */
  127. /* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few
  128. implementations support them today. These two macros really need
  129. an ALIGN() macro, but each implementation does this differently. */
  130. #ifndef CMSG_LEN
  131. /* $$.Im CMSG_LEN$$ */
  132. #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size))
  133. #endif
  134. #ifndef CMSG_SPACE
  135. /* $$.Im CMSG_SPACE$$ */
  136. #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size))
  137. #endif
  138. /* POSIX requires the SUN_LEN() macro, but not all implementations DefinE
  139. it (yet). Note that this 4.4BSD macro works regardless whether there is
  140. a length field or not. */
  141. #ifndef SUN_LEN
  142. /* $$.Im SUN_LEN$$ */
  143. # define SUN_LEN(su) \
  144. (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
  145. #endif
  146. /* POSIX renames "Unix domain" as "local IPC."
  147. Not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */
  148. #ifndef AF_LOCAL
  149. #define AF_LOCAL AF_UNIX
  150. #endif
  151. #ifndef PF_LOCAL
  152. #define PF_LOCAL PF_UNIX
  153. #endif
  154. /* POSIX requires that an #include of <poll.h> DefinE INFTIM, but many
  155. systems still DefinE it in <sys/stropts.h>. We don't want to include
  156. all the STREAMS stuff if it's not needed, so we just DefinE INFTIM here.
  157. This is the standard value, but there's no guarantee it is -1. */
  158. #ifndef INFTIM
  159. #define INFTIM (-1) /* infinite poll timeout */
  160. /* $$.Ic INFTIM$$ */
  161. #ifdef HAVE_POLL_H
  162. #define INFTIM_UNPH /* tell unpxti.h we defined it */
  163. #endif
  164. #endif
  165. /* Following could be derived from SOMAXCONN in <sys/socket.h>, but many
  166. kernels still #define it as 5, while actually supporting many more */
  167. #define LISTENQ 1024 /* 2nd argument to listen() */
  168. /* Miscellaneous constants */
  169. #define MAXLINE 4096 /* max text line length */
  170. #define BUFFSIZE 8192 /* buffer size for reads and writes */
  171. /* Define some port number that can be used for our examples */
  172. #define SERV_PORT 9877 /* TCP and UDP */
  173. #define SERV_PORT_STR "9877" /* TCP and UDP */
  174. #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */
  175. #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */
  176. /* $$.ix [LISTENQ]~constant,~definition~of$$ */
  177. /* $$.ix [MAXLINE]~constant,~definition~of$$ */
  178. /* $$.ix [BUFFSIZE]~constant,~definition~of$$ */
  179. /* $$.ix [SERV_PORT]~constant,~definition~of$$ */
  180. /* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */
  181. /* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */
  182. /* Following shortens all the typecasts of pointer arguments: */
  183. #define SA struct sockaddr
  184. #ifndef HAVE_STRUCT_SOCKADDR_STORAGE
  185. /*
  186. * RFC 3493: protocol-independent placeholder for socket addresses
  187. */
  188. #define __SS_MAXSIZE 128
  189. #define __SS_ALIGNSIZE (sizeof(int64_t))
  190. #ifdef HAVE_SOCKADDR_SA_LEN
  191. #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t))
  192. #else
  193. #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t))
  194. #endif
  195. #define __SS_PAD2SIZE (__SS_MAXSIZE - 2*__SS_ALIGNSIZE)
  196. struct sockaddr_storage {
  197. #ifdef HAVE_SOCKADDR_SA_LEN
  198. u_char ss_len;
  199. #endif
  200. sa_family_t ss_family;
  201. char __ss_pad1[__SS_PAD1SIZE];
  202. int64_t __ss_align;
  203. char __ss_pad2[__SS_PAD2SIZE];
  204. };
  205. #endif
  206. #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
  207. /* default file access permissions for new files */
  208. #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
  209. /* default permissions for new directories */
  210. typedef void Sigfunc(int); /* for signal handlers */
  211. #define min(a,b) ((a) < (b) ? (a) : (b))
  212. #define max(a,b) ((a) > (b) ? (a) : (b))
  213. #ifndef HAVE_ADDRINFO_STRUCT
  214. # include "../lib/addrinfo.h"
  215. #endif
  216. #ifndef HAVE_IF_NAMEINDEX_STRUCT
  217. struct if_nameindex {
  218. unsigned int if_index; /* 1, 2, ... */
  219. char *if_name; /* null-terminated name: "le0", ... */
  220. };
  221. /* $$.It if_nameindex$$ */
  222. /* $$.Ib if_index$$ */
  223. /* $$.Ib if_name$$ */
  224. #endif
  225. #ifndef HAVE_TIMESPEC_STRUCT
  226. struct timespec {
  227. time_t tv_sec; /* seconds */
  228. long tv_nsec; /* and nanoseconds */
  229. };
  230. /* $$.It timespec$$ */
  231. /* $$.Ib tv_sec$$ */
  232. /* $$.Ib tv_nsec$$ */
  233. #endif
  234. /* end unph */
  235. /* prototypes for our own library functions */
  236. int connect_nonb(int, const SA *, socklen_t, int);
  237. int connect_timeo(int, const SA *, socklen_t, int);
  238. int daemon_init(const char *, int);
  239. void daemon_inetd(const char *, int);
  240. void dg_cli(FILE *, int, const SA *, socklen_t);
  241. void dg_echo(int, SA *, socklen_t);
  242. int family_to_level(int);
  243. char *gf_time(void);
  244. void heartbeat_cli(int, int, int);
  245. void heartbeat_serv(int, int, int);
  246. struct addrinfo *host_serv(const char *, const char *, int, int);
  247. int inet_srcrt_add(char *);
  248. u_char *inet_srcrt_init(int);
  249. void inet_srcrt_print(u_char *, int);
  250. void inet6_srcrt_print(void *);
  251. char **my_addrs(int *);
  252. int readable_timeo(int, int);
  253. ssize_t readline(int, void *, size_t);
  254. ssize_t readn(int, void *, size_t);
  255. ssize_t read_fd(int, void *, size_t, int *);
  256. ssize_t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
  257. struct unp_in_pktinfo *);
  258. Sigfunc *signal_intr(int, Sigfunc *);
  259. int sock_bind_wild(int, int);
  260. int sock_cmp_addr(const SA *, const SA *, socklen_t);
  261. int sock_cmp_port(const SA *, const SA *, socklen_t);
  262. int sock_get_port(const SA *, socklen_t);
  263. void sock_set_addr(SA *, socklen_t, const void *);
  264. void sock_set_port(SA *, socklen_t, int);
  265. void sock_set_wild(SA *, socklen_t);
  266. char *sock_ntop(const SA *, socklen_t);
  267. char *sock_ntop_host(const SA *, socklen_t);
  268. int sockfd_to_family(int);
  269. void str_echo(int);
  270. void str_cli(FILE *, int);
  271. int tcp_connect(const char *, const char *);
  272. int tcp_listen(const char *, const char *, socklen_t *);
  273. void tv_sub(struct timeval *, struct timeval *);
  274. int udp_client(const char *, const char *, SA **, socklen_t *);
  275. int udp_connect(const char *, const char *);
  276. int udp_server(const char *, const char *, socklen_t *);
  277. int writable_timeo(int, int);
  278. ssize_t writen(int, const void *, size_t);
  279. ssize_t write_fd(int, void *, size_t, int);
  280. #ifdef MCAST
  281. int mcast_leave(int, const SA *, socklen_t);
  282. int mcast_join(int, const SA *, socklen_t, const char *, u_int);
  283. int mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,
  284. const SA *grp, socklen_t grplen);
  285. int mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,
  286. const SA *grp, socklen_t grplen,
  287. const char *ifname, u_int ifindex);
  288. int mcast_block_source(int sockfd, const SA *src, socklen_t srclen,
  289. const SA *grp, socklen_t grplen);
  290. int mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,
  291. const SA *grp, socklen_t grplen);
  292. int mcast_get_if(int);
  293. int mcast_get_loop(int);
  294. int mcast_get_ttl(int);
  295. int mcast_set_if(int, const char *, u_int);
  296. int mcast_set_loop(int, int);
  297. int mcast_set_ttl(int, int);
  298. void Mcast_leave(int, const SA *, socklen_t);
  299. void Mcast_join(int, const SA *, socklen_t, const char *, u_int);
  300. void Mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,
  301. const SA *grp, socklen_t grplen);
  302. void Mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,
  303. const SA *grp, socklen_t grplen,
  304. const char *ifname, u_int ifindex);
  305. void Mcast_block_source(int sockfd, const SA *src, socklen_t srclen,
  306. const SA *grp, socklen_t grplen);
  307. void Mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,
  308. const SA *grp, socklen_t grplen);
  309. int Mcast_get_if(int);
  310. int Mcast_get_loop(int);
  311. int Mcast_get_ttl(int);
  312. void Mcast_set_if(int, const char *, u_int);
  313. void Mcast_set_loop(int, int);
  314. void Mcast_set_ttl(int, int);
  315. #endif
  316. uint16_t in_cksum(uint16_t *, int);
  317. #ifndef HAVE_GETADDRINFO_PROTO
  318. int getaddrinfo(const char *, const char *, const struct addrinfo *,
  319. struct addrinfo **);
  320. void freeaddrinfo(struct addrinfo *);
  321. char *gai_strerror(int);
  322. #endif
  323. #ifndef HAVE_GETNAMEINFO_PROTO
  324. int getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);
  325. #endif
  326. #ifndef HAVE_GETHOSTNAME_PROTO
  327. int gethostname(char *, int);
  328. #endif
  329. #ifndef HAVE_HSTRERROR_PROTO
  330. const char *hstrerror(int);
  331. #endif
  332. #ifndef HAVE_IF_NAMETOINDEX_PROTO
  333. unsigned int if_nametoindex(const char *);
  334. char *if_indextoname(unsigned int, char *);
  335. void if_freenameindex(struct if_nameindex *);
  336. struct if_nameindex *if_nameindex(void);
  337. #endif
  338. #ifndef HAVE_INET_PTON_PROTO
  339. int inet_pton(int, const char *, void *);
  340. const char *inet_ntop(int, const void *, char *, size_t);
  341. #endif
  342. #ifndef HAVE_INET_ATON_PROTO
  343. int inet_aton(const char *, struct in_addr *);
  344. #endif
  345. #ifndef HAVE_PSELECT_PROTO
  346. int pselect(int, fd_set *, fd_set *, fd_set *,
  347. const struct timespec *, const sigset_t *);
  348. #endif
  349. #ifndef HAVE_SOCKATMARK_PROTO
  350. int sockatmark(int);
  351. #endif
  352. #ifndef HAVE_SNPRINTF_PROTO
  353. int snprintf(char *, size_t, const char *, ...);
  354. #endif
  355. /* prototypes for our own library wrapper functions */
  356. void Connect_timeo(int, const SA *, socklen_t, int);
  357. int Family_to_level(int);
  358. struct addrinfo *Host_serv(const char *, const char *, int, int);
  359. const char *Inet_ntop(int, const void *, char *, size_t);
  360. void Inet_pton(int, const char *, void *);
  361. char *If_indextoname(unsigned int, char *);
  362. unsigned int If_nametoindex(const char *);
  363. struct if_nameindex *If_nameindex(void);
  364. char **My_addrs(int *);
  365. ssize_t Read_fd(int, void *, size_t, int *);
  366. int Readable_timeo(int, int);
  367. ssize_t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
  368. struct unp_in_pktinfo *);
  369. Sigfunc *Signal(int, Sigfunc *);
  370. Sigfunc *Signal_intr(int, Sigfunc *);
  371. int Sock_bind_wild(int, int);
  372. char *Sock_ntop(const SA *, socklen_t);
  373. char *Sock_ntop_host(const SA *, socklen_t);
  374. int Sockfd_to_family(int);
  375. int Tcp_connect(const char *, const char *);
  376. int Tcp_listen(const char *, const char *, socklen_t *);
  377. int Udp_client(const char *, const char *, SA **, socklen_t *);
  378. int Udp_connect(const char *, const char *);
  379. int Udp_server(const char *, const char *, socklen_t *);
  380. ssize_t Write_fd(int, void *, size_t, int);
  381. int Writable_timeo(int, int);
  382. /* prototypes for our Unix wrapper functions: see {Sec errors} */
  383. void *Calloc(size_t, size_t);
  384. void Close(int);
  385. void Dup2(int, int);
  386. int Fcntl(int, int, int);
  387. void Gettimeofday(struct timeval *, void *);
  388. int Ioctl(int, int, void *);
  389. pid_t Fork(void);
  390. void *Malloc(size_t);
  391. int Mkstemp(char *);
  392. void *Mmap(void *, size_t, int, int, int, off_t);
  393. int Open(const char *, int, mode_t);
  394. void Pipe(int *fds);
  395. ssize_t Read(int, void *, size_t);
  396. void Sigaddset(sigset_t *, int);
  397. void Sigdelset(sigset_t *, int);
  398. void Sigemptyset(sigset_t *);
  399. void Sigfillset(sigset_t *);
  400. int Sigismember(const sigset_t *, int);
  401. void Sigpending(sigset_t *);
  402. void Sigprocmask(int, const sigset_t *, sigset_t *);
  403. char *Strdup(const char *);
  404. long Sysconf(int);
  405. void Sysctl(int *, u_int, void *, size_t *, void *, size_t);
  406. void Unlink(const char *);
  407. pid_t Wait(int *);
  408. pid_t Waitpid(pid_t, int *, int);
  409. void Write(int, void *, size_t);
  410. /* prototypes for our stdio wrapper functions: see {Sec errors} */
  411. void Fclose(FILE *);
  412. FILE *Fdopen(int, const char *);
  413. char *Fgets(char *, int, FILE *);
  414. FILE *Fopen(const char *, const char *);
  415. void Fputs(const char *, FILE *);
  416. /* prototypes for our socket wrapper functions: see {Sec errors} */
  417. int Accept(int, SA *, socklen_t *);
  418. void Bind(int, const SA *, socklen_t);
  419. void Connect(int, const SA *, socklen_t);
  420. void Getpeername(int, SA *, socklen_t *);
  421. void Getsockname(int, SA *, socklen_t *);
  422. void Getsockopt(int, int, int, void *, socklen_t *);
  423. #ifdef HAVE_INET6_RTH_INIT
  424. int Inet6_rth_space(int, int);
  425. void *Inet6_rth_init(void *, socklen_t, int, int);
  426. void Inet6_rth_add(void *, const struct in6_addr *);
  427. void Inet6_rth_reverse(const void *, void *);
  428. int Inet6_rth_segments(const void *);
  429. struct in6_addr *Inet6_rth_getaddr(const void *, int);
  430. #endif
  431. #ifdef HAVE_KQUEUE
  432. int Kqueue(void);
  433. int Kevent(int, const struct kevent *, int,
  434. struct kevent *, int, const struct timespec *);
  435. #endif
  436. void Listen(int, int);
  437. #ifdef HAVE_POLL
  438. int Poll(struct pollfd *, unsigned long, int);
  439. #endif
  440. ssize_t Readline(int, void *, size_t);
  441. ssize_t Readn(int, void *, size_t);
  442. ssize_t Recv(int, void *, size_t, int);
  443. ssize_t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);
  444. ssize_t Recvmsg(int, struct msghdr *, int);
  445. int Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
  446. void Send(int, const void *, size_t, int);
  447. void Sendto(int, const void *, size_t, int, const SA *, socklen_t);
  448. void Sendmsg(int, const struct msghdr *, int);
  449. void Setsockopt(int, int, int, const void *, socklen_t);
  450. void Shutdown(int, int);
  451. int Sockatmark(int);
  452. int Socket(int, int, int);
  453. void Socketpair(int, int, int, int *);
  454. void Writen(int, void *, size_t);
  455. void err_dump(const char *, ...);
  456. void err_msg(const char *, ...);
  457. void err_quit(const char *, ...);
  458. void err_ret(const char *, ...);
  459. void err_sys(const char *, ...);
  460. #endif /* __unp_h */