unix网络编程(第三版)中的unp.h

 

/* Our own header. Tabs are set for 4 spaces,not 8 */
#ifndef __unp_h
#define __unp_h
#include "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/CORE/config.h"    /* configuration options for current OS */
                /* "../config.h" is generated by configure */
/* If anything changes in the following list of #includes,must change
 acsite.m4 also,for configure's tests */
#include<sys/types.h>        /* basic system data types */
#include<sys/socket.h>       /* basic socket definations */
#include<sys/time.h>         /* timeval{} for select() */
#include<time.h>             /* timespec{} for pselect() */
#include<netinet/in.h>       /* sockaddr_in{} and other Internet defns */
#include<arpa/inet.h>        /* inet(3) functions */
#include<errno.h>
#include<fcntl.h>            /* for nonblocking */
#include<netdb.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>         /* for S_xxx file mode constants */
#include<sys/uio.h>          /* for iovec{} and readv /writev */
#include<unistd.h>
#include<sys/wait.h>
#include<sys/un.h>           /* for Unix domain sockets */
#ifdef HAVE_SYS_SELECT_H
#include<sys/select.h>       /* for convenience */
#endif
#ifdef HAVE_SYS_SYSCTL_H
#include<sys/sysctl.h>
#endif
#ifdef HAVE_POLL_H
#include<poll.h>             /* for convenience */
#endif
#ifdef HAVE_SYS_EVENT_H
#include<sys/event.h>      /* for kqueue */
#endif
#ifdef HAVE_STRINGS_H
#include<strings.h>           /* for convenience */
#endif
/* Three headers are normally needed for socket/file ioctl's;
 * <sys/ioctl.h>,<sys/fillo.h>,and <sys/sockio.h>.
 */
#ifdef HAVE_SYS_IOCTL_H
#include<sys/ioctl.h>
#endif
#ifdef HAVE_SYS_FILIO_H
#include<sys/filio.h>
#endif
#ifdef HAVE_SYS_SOCKIO_H
#include<sys/sockio.h>
#endif
#ifdef HAVE_PTHREAD_H
#include<pthread.h>
#endif
#ifdef HAVE_NET_IF_DL_H
#include<net/if_dl.h>
#endif
#ifdef HAVE_NETINET_SCTP_H
#include<netinet/sctp.h>
#endif
/* OSF/1 actually disables recv() and send() in <sys/socket.h> */
#ifdef  __osf__
#undef recv
#undef send
#define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)
#define send(a,b,c,d) sendto(a,b,c,d,0,0)
#endif
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff    /* should have been in <netinet/in.h> */
#endif
#ifndef SHUT_RD                   /* these three POSIX names are quite new */
#define SHUT_RD     0             /* shutdown for reading */
#define SHUT_WR     1             /* shutdown for writing */
#define SHUT_RDWR   2             /* shutdown for reading and writing */
#endif
#ifndef INET_ADDRSTRLEN
#define INET_ADDRSTRLEN   16      /* "ddd.ddd.ddd.ddd\0"
                                      1234567890123456 */
#endif
/* Define following even if IPv6 not supported,so we can always allocate
 an adequately sized buffer,without #ifdefs in the code. */
#ifndef INET6_ADDRSRLEN
#define INET6_ADDRSTRLEN  46      /* max size of IPv6 address string;
            "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or
            "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0"
             1234567890123456789012345678901234567890123456 */
#endif
/* Define bzero() as a macro if it's not in standard C library. */
#ifndef HAVE_BZERO
#define bzero(ptr,n)      memset(ptr,0,n)
#endif
/* Older resolves do not have gethostbyname2() */
#ifndef HAVE_GETHOSTBYNAME2
#define gethostbyname2(host,family)     gethostbyname((host))
#endif
/* The structure returned by recvform_flags() */
struct unp_in_pktinfo{
    struct in_addr ipi_addr;       /* dst IPv4 address */
    int ipi_ifindex;               /* received interface index */
};
/* We need the newer CMSG_LEN() and CMSG_SPACE() macros,but few
 implementations support them today.  These two macros really need
 an ALIGN() macro, but each implementation does this differently. */
#ifndef CMSG_LEN
#define CMSG_LEN(size)   (sizeof(struct cmsghdr)+(size))
#endif
#ifndef CMSG_SPACE
#define CMSG_SPACE(size)   (sizeof(struct cmsghdr)+(size))
#endif
/* POSIX requires the SUN_LEN() macro, but not all implementations define
  it(yet). Note that this 4.4BSD macro works regardless whether there is
  a length field or not. */
#ifndef SUN_LEN
#define SUN_LEN(su) \
   (sizeof(*(su)-sizeof((su)->sun_path)+strlen((su)->sun_path))
#endif
/* POSIX renames "Unix domain" as "local IPC".
  But not all systems define AF_LCOAL and PF_LOCAL(yet). */
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
/* POSIX requires that an #include of<poll.h> define INFTIM,but many
 systems still define it in <sys/stropts.h>. We don't want to include
 all the streams stuff if it's not needed,so we just define INFTIME here.
 This is the standard value,but there's no guarantee it is -1. */
#ifndef INFTIM
#define INFTIM     (-1)  /* infinite poll timeout */
#ifdef HAVE_POLL_H
#define INFTIM_UNPH      /* tell unpxti.h we defined it */
#endif
#endif
/* Following could be derived from SOMAXCONN in <sys/socket.h>,but many
 kernels still #define it as 5,while actually supporting many more */
#define LISTENQ 1024     /* 2nd argument to listen() */
/* Miscellaneous constants */
#define MAXLINE 4096     /* max text line length */
#define BUFFSIZE 8192    /* buffer size for reads and writes */
/* Define some port number that can be used for our examples */
#define SERV_PORT  9877  /* TCP and UDP */
#define SERV_PORT_STR  "9877"   /* TCP and UDP */
#define UNIXSTR_PATH  "/tmp/unix.str"  /* Unix domain stream */
#define UNIXDG_PATH  "/tmp/unix.dg" /* Unix domain datagram */
/* Following shortens all the type casts of pointer arguments */
#define SA struct sockaddr
#define HAVE_STRUCT_SOCKADDR_STORAGE
#ifndef HAVE_STRUCT_SOCKADDR_STORAGE
/*
 * RFC 3493: protocol-independent placeholder for socket addresses
 */
#define __ss_MAXSIZE 128
#define __ss_ALIGNSIZE (sizeof(int64_t))
#ifdef HAVE_SOCKADDR_SA_LEN
#define __SS_PADlSIZE (__SS_ALIGNSIZE-sizeof(u_char)-sizeof(sa_family_t))
#else
#define __SS_PADlSIZE (__SS_ALIGNSIZE-sizeof(sa_family_t))
#endif
#define __SS_PAD2SIZE (__SS_MAXSIZE-2*__SS_ALIGNSIZE)
struct sockaddr_storage{
#ifdef HAVE_SOCKADDR_SA_LEN
 u_char ss_len;
#endif
 sa_family_t ss_family;
 char __ss_pad1[__SS_PAD1SIZE];
 int64_t __ss_align;
 char __ss_pad2[__SS_PAD2SIZE];
};
#endif
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
                  /* default file access permissions for new files */
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
   /* default permissions for new directories */
typedef void Sigfunc(int);   /* for signal handlers */
#define min(a,b)    ((a)<(b)?(a):(b))
#define max(a,b)    ((a)>(b)?(a):(b))
#ifndef HAVE_ADDRINFO_STRUCT
#include "../lib/addrinfo.h"
#endif
#ifndef HAVE_IF_NAMEINDEX_STRUCT
struct if_nameindex{
    unsigned int if_index;    /* 1,2,... */
    char    *if_name;            /* null teminated name:""le0",...*/
};
#endif
#ifndef HAVE_TIMESPEC_STRUCT
struct timespec{
    time_t tv_sec;           /* seconds */
    long   tv_nsec;          /* and nanoseconds */
};
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值