00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "defs.h"
00022 #ifdef SOLARIS
00023 #define __EXTENSIONS__
00024 #endif
00025 #include <sys/socket.h>
00026 #undef __EXTENSIONS__
00027 #include <netinet/in.h>
00028 #include <netinet/tcp.h>
00029
00030 typedef enum {OT_INT, OT_LINGER, OT_TIMEVAL} OPT_TYPE;
00031
00032 static void show(int skt, int level, int option, const char *name,
00033 OPT_TYPE type)
00034 {
00035 socklen_t len;
00036 int n;
00037 struct linger lng;
00038 struct timeval tv;
00039
00040 switch (type) {
00041 case OT_INT:
00042 len = sizeof(n);
00043 if (getsockopt(skt, level, option, &n, &len) == -1)
00044 printf("%s FAILED (%s)\n", name, strerror(errno));
00045 else
00046 printf("%s = %d\n", name, n);
00047 break;
00048 case OT_LINGER:
00049 len = sizeof(lng);
00050 if (getsockopt(skt, level, option, &lng, &len) == -1)
00051 printf("%s FAILED (%s)\n", name, strerror(errno));
00052 else
00053 printf("%s = l_onoff: %d; l_linger: %d secs.\n", name,
00054 lng.l_onoff, lng.l_linger);
00055 break;
00056 case OT_TIMEVAL:
00057 len = sizeof(tv);
00058 if (getsockopt(skt, level, option, &tv, &len) == -1)
00059 printf("%s FAILED (%s)\n", name, strerror(errno));
00060 else
00061 printf("%s = %ld secs.; %ld usecs.\n", name,
00062 (long)tv.tv_sec, (long)tv.tv_usec);
00063 }
00064 }
00065
00066 static void showall(int skt, const char *caption)
00067 {
00068 printf("\n%s\n", caption);
00069 show(skt, SOL_SOCKET, SO_ACCEPTCONN, "SO_ACCEPTCONN", OT_INT);
00070 show(skt, SOL_SOCKET, SO_BROADCAST, "SO_BROADCAST", OT_INT);
00071 show(skt, SOL_SOCKET, SO_DEBUG, "SO_DEBUG", OT_INT);
00072 show(skt, SOL_SOCKET, SO_DONTROUTE, "SO_DONTROUTE", OT_INT);
00073 show(skt, SOL_SOCKET, SO_ERROR, "SO_ERROR", OT_INT);
00074 show(skt, SOL_SOCKET, SO_KEEPALIVE, "SO_KEEPALIVE", OT_INT);
00075 show(skt, SOL_SOCKET, SO_LINGER, "SO_LINGER", OT_LINGER);
00076 show(skt, SOL_SOCKET, SO_OOBINLINE, "SO_OOBINLINE", OT_INT);
00077 show(skt, SOL_SOCKET, SO_RCVBUF, "SO_RCVBUF", OT_INT);
00078 show(skt, SOL_SOCKET, SO_RCVLOWAT, "SO_RCVLOWAT", OT_INT);
00079 show(skt, SOL_SOCKET, SO_RCVTIMEO, "SO_RCVTIMEO", OT_TIMEVAL);
00080 show(skt, SOL_SOCKET, SO_REUSEADDR, "SO_REUSEADDR", OT_INT);
00081 show(skt, SOL_SOCKET, SO_SNDBUF, "SO_SNDBUF", OT_INT);
00082 show(skt, SOL_SOCKET, SO_SNDLOWAT, "SO_SNDLOWAT", OT_INT);
00083 show(skt, SOL_SOCKET, SO_SNDTIMEO, "SO_SNDTIMEO", OT_TIMEVAL);
00084 show(skt, SOL_SOCKET, SO_TYPE, "SO_TYPE", OT_INT);
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 }
00097
00098 int main(void)
00099 {
00100 int skt;
00101
00102 ec_neg1( skt = socket(AF_INET, SOCK_STREAM, 0) )
00103 showall(skt, "AF_INET SOCK_STREAM");
00104 ec_neg1( close(skt) )
00105 ec_neg1( skt = socket(AF_INET, SOCK_DGRAM, 0) )
00106 showall(skt, "AF_INET SOCK_DGRAM");
00107 ec_neg1( close(skt) )
00108
00109
00110
00111
00112
00113 exit(EXIT_SUCCESS);
00114
00115 EC_CLEANUP_BGN
00116 exit(EXIT_FAILURE);
00117 EC_CLEANUP_END
00118 }
00119