systable.c revision a237e38e9161f0acd6451439d4a7dd597e66291d
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <libproc.h>
#include <sys/port_impl.h>
#include "ramdata.h"
#include "systable.h"
#include "print.h"
#include "proto.h"
/*
* Tables of information about system calls - read-only data.
*/
const char *const errcode[] = { /* error code names */
NULL, /* 0 */
"EPERM", /* 1 */
"ENOENT", /* 2 */
"ESRCH", /* 3 */
"EINTR", /* 4 */
"EIO", /* 5 */
"ENXIO", /* 6 */
"E2BIG", /* 7 */
"ENOEXEC", /* 8 */
"EBADF", /* 9 */
"ECHILD", /* 10 */
"EAGAIN", /* 11 */
"ENOMEM", /* 12 */
"EACCES", /* 13 */
"EFAULT", /* 14 */
"ENOTBLK", /* 15 */
"EBUSY", /* 16 */
"EEXIST", /* 17 */
"EXDEV", /* 18 */
"ENODEV", /* 19 */
"ENOTDIR", /* 20 */
"EISDIR", /* 21 */
"EINVAL", /* 22 */
"ENFILE", /* 23 */
"EMFILE", /* 24 */
"ENOTTY", /* 25 */
"ETXTBSY", /* 26 */
"EFBIG", /* 27 */
"ENOSPC", /* 28 */
"ESPIPE", /* 29 */
"EROFS", /* 30 */
"EMLINK", /* 31 */
"EPIPE", /* 32 */
"EDOM", /* 33 */
"ERANGE", /* 34 */
"ENOMSG", /* 35 */
"EIDRM", /* 36 */
"ECHRNG", /* 37 */
"EL2NSYNC", /* 38 */
"EL3HLT", /* 39 */
"EL3RST", /* 40 */
"ELNRNG", /* 41 */
"EUNATCH", /* 42 */
"ENOCSI", /* 43 */
"EL2HLT", /* 44 */
"EDEADLK", /* 45 */
"ENOLCK", /* 46 */
"ECANCELED", /* 47 */
"ENOTSUP", /* 48 */
"EDQUOT", /* 49 */
"EBADE", /* 50 */
"EBADR", /* 51 */
"EXFULL", /* 52 */
"ENOANO", /* 53 */
"EBADRQC", /* 54 */
"EBADSLT", /* 55 */
"EDEADLOCK", /* 56 */
"EBFONT", /* 57 */
"EOWNERDEAD", /* 58 */
"ENOTRECOVERABLE", /* 59 */
"ENOSTR", /* 60 */
"ENODATA", /* 61 */
"ETIME", /* 62 */
"ENOSR", /* 63 */
"ENONET", /* 64 */
"ENOPKG", /* 65 */
"EREMOTE", /* 66 */
"ENOLINK", /* 67 */
"EADV", /* 68 */
"ESRMNT", /* 69 */
"ECOMM", /* 70 */
"EPROTO", /* 71 */
"ELOCKUNMAPPED", /* 72 */
"ENOTACTIVE", /* 73 */
"EMULTIHOP", /* 74 */
NULL, /* 75 */
NULL, /* 76 */
"EBADMSG", /* 77 */
"ENAMETOOLONG", /* 78 */
"EOVERFLOW", /* 79 */
"ENOTUNIQ", /* 80 */
"EBADFD", /* 81 */
"EREMCHG", /* 82 */
"ELIBACC", /* 83 */
"ELIBBAD", /* 84 */
"ELIBSCN", /* 85 */
"ELIBMAX", /* 86 */
"ELIBEXEC", /* 87 */
"EILSEQ", /* 88 */
"ENOSYS", /* 89 */
"ELOOP", /* 90 */
"ERESTART", /* 91 */
"ESTRPIPE", /* 92 */
"ENOTEMPTY", /* 93 */
"EUSERS", /* 94 */
"ENOTSOCK", /* 95 */
"EDESTADDRREQ", /* 96 */
"EMSGSIZE", /* 97 */
"EPROTOTYPE", /* 98 */
"ENOPROTOOPT", /* 99 */
NULL, /* 100 */
NULL, /* 101 */
NULL, /* 102 */
NULL, /* 103 */
NULL, /* 104 */
NULL, /* 105 */
NULL, /* 106 */
NULL, /* 107 */
NULL, /* 108 */
NULL, /* 109 */
NULL, /* 110 */
NULL, /* 111 */
NULL, /* 112 */
NULL, /* 113 */
NULL, /* 114 */
NULL, /* 115 */
NULL, /* 116 */
NULL, /* 117 */
NULL, /* 118 */
NULL, /* 119 */
"EPROTONOSUPPORT", /* 120 */
"ESOCKTNOSUPPORT", /* 121 */
"EOPNOTSUPP", /* 122 */
"EPFNOSUPPORT", /* 123 */
"EAFNOSUPPORT", /* 124 */
"EADDRINUSE", /* 125 */
"EADDRNOTAVAIL", /* 126 */
"ENETDOWN", /* 127 */
"ENETUNREACH", /* 128 */
"ENETRESET", /* 129 */
"ECONNABORTED", /* 130 */
"ECONNRESET", /* 131 */
"ENOBUFS", /* 132 */
"EISCONN", /* 133 */
"ENOTCONN", /* 134 */
NULL, /* 135 */
NULL, /* 136 */
NULL, /* 137 */
NULL, /* 138 */
NULL, /* 139 */
NULL, /* 140 */
NULL, /* 141 */
NULL, /* 142 */
"ESHUTDOWN", /* 143 */
"ETOOMANYREFS", /* 144 */
"ETIMEDOUT", /* 145 */
"ECONNREFUSED", /* 146 */
"EHOSTDOWN", /* 147 */
"EHOSTUNREACH", /* 148 */
"EALREADY", /* 149 */
"EINPROGRESS", /* 150 */
"ESTALE" /* 151 */
};
const char *
{
return (ename);
}
/* The following 6 entries were reserved for the UNIX PC */
};
/* SYSEND == max syscall number + 1 */
/*
* The following are for interpreting syscalls with sub-codes.
*/
};
const struct systable open64table[] = {
};
const struct systable fcntltable[] = {
};
};
};
};
};
};
};
};
};
};
};
};
};
};
};
};
const struct systable lwpcreatetable[] = {
};
static const struct systable tasksystable[] = {
};
static const struct systable privsystable[] = {
};
static const struct systable exacctsystable[] = {
};
static const struct systable fsatsystable[] = {
};
static const struct systable lwpparktable[] = {
};
static const struct systable lwprwlocktable[] = {
};
static const struct systable sendfilevsystable[] = {
};
#define NSENDFILESYSCODE \
(sizeof (sendfilevsystable) / sizeof (struct systable))
static const struct systable lgrpsystable[] = {
};
static const struct systable rusagesystable[] = {
};
#define NRUSAGESYSCODE \
(sizeof (rusagesystable) / sizeof (struct systable))
static const struct systable ucredsystable[] = {
};
#define NUCREDSYSCODE \
(sizeof (ucredsystable) / sizeof (struct systable))
const struct systable portfstable[] = {
};
};
static const struct systable labeltable[] = {
};
/* parent codes */
/* child codes */
};
{ "exit", SYS_exit },
{ "fork", SYS_forksys },
{ "forkx", SYS_forksys },
{ "forkallx", SYS_forksys },
{ "vforkx", SYS_forksys },
{ "sbrk", SYS_brk },
{ "getppid", SYS_getpid },
{ "geteuid", SYS_getuid },
{ "getpgrp", SYS_pgrpsys },
{ "setpgrp", SYS_pgrpsys },
{ "getsid", SYS_pgrpsys },
{ "setsid", SYS_pgrpsys },
{ "getpgid", SYS_pgrpsys },
{ "setpgid", SYS_pgrpsys },
{ "getegid", SYS_getgid },
{ "sigset", SYS_signal },
{ "sighold", SYS_signal },
{ "sigrelse", SYS_signal },
{ "sigignore", SYS_signal },
{ "sigpause", SYS_signal },
{ "msgget", SYS_msgsys },
{ "msgctl", SYS_msgsys },
{ "msgctl64", SYS_msgsys },
{ "msgrcv", SYS_msgsys },
{ "msgsnd", SYS_msgsys },
{ "msgids", SYS_msgsys },
{ "msgsnap", SYS_msgsys },
{ "msgop", SYS_msgsys },
{ "shmat", SYS_shmsys },
{ "shmctl", SYS_shmsys },
{ "shmctl64", SYS_shmsys },
{ "shmdt", SYS_shmsys },
{ "shmget", SYS_shmsys },
{ "shmids", SYS_shmsys },
{ "shmop", SYS_shmsys },
{ "semctl", SYS_semsys },
{ "semctl64", SYS_semsys },
{ "semget", SYS_semsys },
{ "semids", SYS_semsys },
{ "semop", SYS_semsys },
{ "semtimedop", SYS_semsys },
{ "uname", SYS_utssys },
{ "ustat", SYS_utssys },
{ "fusers", SYS_utssys },
{ "exec", SYS_execve },
{ "execl", SYS_execve },
{ "execv", SYS_execve },
{ "execle", SYS_execve },
{ "execlp", SYS_execve },
{ "execvp", SYS_execve },
{ "sigfillset", SYS_sigpending },
{ "getcontext", SYS_context },
{ "setcontext", SYS_context },
{ "getustack", SYS_context },
{ "setustack", SYS_context },
{ "hrtcntl", SYS_hrtsys },
{ "hrtalarm", SYS_hrtsys },
{ "hrtsleep", SYS_hrtsys },
{ "hrtcancel", SYS_hrtsys },
{ "aioread", SYS_kaio },
{ "aiowrite", SYS_kaio },
{ "aiowait", SYS_kaio },
{ "aiocancel", SYS_kaio },
{ "aionotify", SYS_kaio },
{ "audit", SYS_auditsys },
{ "door_create", SYS_door },
{ "door_revoke", SYS_door },
{ "door_info", SYS_door },
{ "door_call", SYS_door },
{ "door_return", SYS_door },
{ "door_bind", SYS_door },
{ "door_unbind", SYS_door },
{ "door_unref", SYS_door },
{ "door_ucred", SYS_door },
{ "door_getparam", SYS_door },
{ "door_setparam", SYS_door },
{ "pset_create", SYS_pset },
{ "pset_destroy", SYS_pset },
{ "pset_assign", SYS_pset },
{ "pset_info", SYS_pset },
{ "pset_bind", SYS_pset },
{ "pset_getloadavg", SYS_pset },
{ "pset_list", SYS_pset },
{ "pset_setattr", SYS_pset },
{ "pset_getattr", SYS_pset },
{ "pset_assign_forced", SYS_pset },
{ "settaskid", SYS_tasksys },
{ "gettaskid", SYS_tasksys },
{ "getprojid", SYS_tasksys },
{ "setppriv", SYS_privsys },
{ "getppriv", SYS_privsys },
{ "getprivimplinfo", SYS_privsys },
{ "setpflags", SYS_privsys },
{ "getpflags", SYS_privsys },
{ "getacct", SYS_exacctsys },
{ "putacct", SYS_exacctsys },
{ "wracct", SYS_exacctsys },
{ "lwp_cond_timedwait", SYS_lwp_cond_wait },
{ "lwp_park", SYS_lwp_park },
{ "lwp_unpark", SYS_lwp_park },
{ "lwp_unpark_all", SYS_lwp_park },
{ "lwp_rwlock_rdlock", SYS_lwp_rwlock_sys },
{ "lwp_rwlock_wrlock", SYS_lwp_rwlock_sys },
{ "lwp_rwlock_tryrdlock", SYS_lwp_rwlock_sys },
{ "lwp_rwlock_trywrlock", SYS_lwp_rwlock_sys },
{ "lwp_rwlock_unlock", SYS_lwp_rwlock_sys },
{ "sendfilev64", SYS_sendfilev },
{ "openat", SYS_fsat },
{ "openat64", SYS_fsat },
{ "fstatat64", SYS_fsat },
{ "fstatat", SYS_fsat },
{ "fchownat", SYS_fsat },
{ "unlinkat", SYS_fsat },
{ "futimesat", SYS_fsat },
{ "renameat", SYS_fsat },
{ "__accessat", SYS_fsat },
{ "lgrpsys", SYS_lgrpsys },
{ "getrusage", SYS_rusagesys },
{ "getrusage_chld", SYS_rusagesys },
{ "getrusage_lwp", SYS_rusagesys },
{ "getvmusage", SYS_rusagesys },
{ "getpeerucred", SYS_ucredsys },
{ "ucred_get", SYS_ucredsys },
{ "port_create", SYS_port },
{ "port_associate", SYS_port },
{ "port_dissociate", SYS_port },
{ "port_send", SYS_port },
{ "port_sendn", SYS_port },
{ "port_get", SYS_port },
{ "port_getn", SYS_port },
{ "port_alert", SYS_port },
{ "port_dispatch", SYS_port },
{ "zone_create", SYS_zone },
{ "zone_destroy", SYS_zone },
{ "zone_getattr", SYS_zone },
{ "zone_setattr", SYS_zone },
{ "zone_enter", SYS_zone },
{ "getzoneid", SYS_zone },
{ "zone_list", SYS_zone },
{ "zone_shutdown", SYS_zone },
{ "zone_add_datalink", SYS_zone },
{ "zone_remove_datalink", SYS_zone },
{ "zone_check_datalink", SYS_zone },
{ "zone_list_datalink", SYS_zone },
{ "is_system_labeled", SYS_labelsys },
{ "tnrh", SYS_labelsys },
{ "tnrhtp", SYS_labelsys },
{ "tnmlp", SYS_labelsys },
{ "getlabel", SYS_labelsys },
{ "fgetlabel", SYS_labelsys },
{ "getrctl", SYS_rctlsys },
{ "setrctl", SYS_rctlsys },
{ "rctlsys_lst", SYS_rctlsys },
{ "rctlsys_ctl", SYS_rctlsys },
{ NULL, 0 } /* end-of-list */
};
/*
* Return structure to interpret system call with sub-codes.
*/
const struct systable *
{
if (subcode != -1) {
switch (syscall) {
case SYS_open:
break;
case SYS_open64:
if ((unsigned)subcode < NOPEN64CODE)
break;
case SYS_signal: /* signal() + sigset() family */
break;
case SYS_msgsys: /* msgsys() */
break;
case SYS_semsys: /* semsys() */
break;
case SYS_shmsys: /* shmsys() */
break;
case SYS_pgrpsys: /* pgrpsys() */
break;
case SYS_utssys: /* utssys() */
break;
case SYS_sysfs: /* sysfs() */
break;
case SYS_sigpending: /* sigpending()/sigfillset() */
break;
case SYS_context: /* [get|set]context() */
break;
case SYS_hrtsys: /* hrtsys() */
break;
case SYS_corectl: /* corectl() */
break;
case SYS_kaio: /* kaio() */
break;
case SYS_door: /* doors */
break;
case SYS_pset: /* pset() */
break;
case SYS_lwp_create: /* lwp_create() */
if ((unsigned)subcode < NLWPCREATECODE)
break;
case SYS_tasksys: /* tasks */
if ((unsigned)subcode < NTASKSYSCODE)
break;
case SYS_exacctsys: /* exacct */
if ((unsigned)subcode < NEXACCTSYSCODE)
break;
case SYS_fsat:
if ((unsigned)subcode < NFSATSYSCODE)
break;
case SYS_privsys: /* privileges */
if ((unsigned)subcode < NPRIVSYSCODE)
break;
case SYS_lwp_park: /* lwp_park */
if ((unsigned)subcode < NLWPPARKCODE)
break;
case SYS_lwp_rwlock_sys:
if ((unsigned)subcode < NLWPRWLOCKCODE)
break;
case SYS_sendfilev: /* sendfilev */
if ((unsigned)subcode < NSENDFILESYSCODE)
break;
case SYS_lgrpsys: /* lgrpsys */
if ((unsigned)subcode < NLGRPSYSCODE)
break;
case SYS_rusagesys: /* rusagesys */
if ((unsigned)subcode < NRUSAGESYSCODE)
break;
case SYS_fcntl: /* fcntl */
if ((unsigned)subcode < NFCNTLCODE)
break;
case SYS_ucredsys:
if ((unsigned)subcode < NUCREDSYSCODE)
break;
case SYS_port: /* portfs */
break;
case SYS_zone: /* zone family */
break;
case SYS_labelsys: /* label family */
if ((unsigned)subcode < NLABELCODE)
break;
case SYS_rctlsys: /* rctl family */
break;
case SYS_forksys: /* fork family */
break;
}
}
return (stp);
}
/*
* Return the name of the system call.
*/
const char *
{
}
return (name);
}
/*
* Return the name of the signal.
* Return NULL if unknown signal.
*/
const char *
{
/*
* The C library function sig2str() omits the leading "SIG".
*/
return (pri->raw_sig_name);
return (NULL);
}
/*
* Return the name of the signal.
* Manufacture a name for unknown signal.
*/
const char *
{
}
return (name);
}
/*
* Determine the subcode for this syscall, if any.
*/
int
{
int subcode = -1;
int arg0;
switch (syscall) {
case SYS_utssys: /* utssys() */
if (nsysarg > 2)
break;
case SYS_open: /* open() w/ and w/o O_CREAT */
case SYS_open64:
if (nsysarg > 1)
break;
case SYS_fsat:
switch (arg0) {
case 0: /* openat */
if (nsysarg > 3)
subcode =
0 : NFSATSYSCODE - 2;
break;
case 1: /* openat64 */
if (nsysarg > 3)
subcode =
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
}
break;
case SYS_signal: /* signal() + sigset() family */
switch (arg0 & ~SIGNO_MASK) {
default: subcode = 0; break;
}
break;
case SYS_kaio: /* kaio() */
break;
case SYS_door: /* doors */
if (nsysarg > 5)
break;
case SYS_lwp_create: /* lwp_create() */
subcode = /* 0 for parent, 1 for child */
break;
case SYS_forksys: /* forksys */
subcode += 3;
break;
case SYS_msgsys: /* msgsys() */
case SYS_semsys: /* semsys() */
case SYS_shmsys: /* shmsys() */
case SYS_pgrpsys: /* pgrpsys() */
case SYS_sysfs: /* sysfs() */
case SYS_sigpending: /* sigpending()/sigfillset() */
case SYS_context: /* [get|set]context() */
case SYS_hrtsys: /* hrtsys() */
case SYS_corectl: /* corectl() */
case SYS_pset: /* pset() */
case SYS_tasksys: /* tasks */
case SYS_privsys: /* privileges */
case SYS_exacctsys: /* exacct */
case SYS_lwp_park: /* lwp_park */
case SYS_lwp_rwlock_sys: /* lwp_rwlock_*() */
case SYS_sendfilev: /* sendfilev */
case SYS_lgrpsys: /* lgrpsys */
case SYS_rusagesys: /* rusagesys */
case SYS_ucredsys: /* ucredsys */
case SYS_zone: /* zone */
case SYS_labelsys: /* labelsys */
case SYS_rctlsys: /* rctlsys */
break;
case SYS_fcntl: /* fcntl() */
if (nsysarg > 2) {
default: subcode = 0; break;
case F_GETFL:
case F_GETOWN:
}
}
break;
case SYS_port: /* portfs */
break;
}
}
return (subcode);
}
/*
* Return the maximum number of system calls, counting
* all system calls with subcodes as separate calls.
*/
int
{
return (PRMAXSYS + 1
+ NOPENCODE - 1
+ NOPEN64CODE - 1
+ NSIGCODE - 1
+ NMSGCODE - 1
+ NSEMCODE - 1
+ NSHMCODE - 1
+ NPIDCODE - 1
+ NSFSCODE - 1
+ NUTSCODE - 1
+ NSGPCODE - 1
+ NCTXCODE - 1
+ NHRTCODE - 1
+ NCORCODE - 1
+ NAIOCODE - 1
+ NDOORCODE - 1
+ NPSETCODE - 1
+ NLWPCREATECODE - 1
+ NTASKSYSCODE - 1
+ NEXACCTSYSCODE - 1
+ NFSATSYSCODE - 1
+ NLWPPARKCODE - 1
+ NLWPRWLOCKCODE - 1
+ NSENDFILESYSCODE - 1
+ NLGRPSYSCODE - 1
+ NRUSAGESYSCODE - 1
+ NFCNTLCODE - 1
+ NPRIVSYSCODE - 1
+ NUCREDSYSCODE - 1
+ NPORTCODE - 1
+ NZONECODE - 1
+ NLABELCODE - 1
+ NRCTLCODE - 1
+ NFORKCODE - 1);
}
/*
* Return the number of subcodes for the specified system call number.
*/
int
{
switch (syscall) {
case SYS_open:
return (NOPENCODE);
case SYS_open64:
return (NOPEN64CODE);
case SYS_signal: /* signal() + sigset() family */
return (NSIGCODE);
case SYS_msgsys: /* msgsys() */
return (NMSGCODE);
case SYS_semsys: /* semsys() */
return (NSEMCODE);
case SYS_shmsys: /* shmsys() */
return (NSHMCODE);
case SYS_pgrpsys: /* pgrpsys() */
return (NPIDCODE);
case SYS_utssys: /* utssys() */
return (NUTSCODE);
case SYS_sysfs: /* sysfs() */
return (NSFSCODE);
case SYS_sigpending: /* sigpending()/sigfillset() */
return (NSGPCODE);
case SYS_context: /* [get|set]context() */
return (NCTXCODE);
case SYS_hrtsys: /* hrtsys() */
return (NHRTCODE);
case SYS_corectl: /* corectl() */
return (NCORCODE);
case SYS_kaio: /* kaio() */
return (NAIOCODE);
case SYS_door: /* doors */
return (NDOORCODE);
case SYS_pset: /* pset() */
return (NPSETCODE);
case SYS_lwp_create: /* lwp_create() */
return (NLWPCREATECODE);
case SYS_tasksys: /* tasks */
return (NTASKSYSCODE);
case SYS_exacctsys: /* exacct */
return (NEXACCTSYSCODE);
case SYS_fsat:
return (NFSATSYSCODE);
case SYS_privsys: /* privileges */
return (NPRIVSYSCODE);
case SYS_lwp_park: /* lwp_park */
return (NLWPPARKCODE);
case SYS_lwp_rwlock_sys:
return (NLWPRWLOCKCODE);
case SYS_sendfilev: /* sendfilev */
return (NSENDFILESYSCODE);
case SYS_lgrpsys: /* lgrpsys */
return (NLGRPSYSCODE);
case SYS_rusagesys:
return (NRUSAGESYSCODE);
case SYS_fcntl:
return (NFCNTLCODE);
case SYS_ucredsys:
return (NUCREDSYSCODE);
case SYS_port:
return (NPORTCODE);
case SYS_zone: /* zone */
return (NZONECODE);
case SYS_labelsys:
return (NLABELCODE);
case SYS_rctlsys:
return (NRCTLCODE);
case SYS_forksys:
return (NFORKCODE);
default:
return (1);
}
}
/* Socket address families (and protocol families) */
const char * const afcodes[] = {
"UNSPEC", /* 0 */
"UNIX", /* 1 */
"INET", /* 2 */
"IMPLINK", /* 3 */
"PUP", /* 4 */
"CHAOS", /* 5 */
"NS", /* 6 */
"NBS", /* 7 */
"ECMA", /* 8 */
"DATAKIT", /* 9 */
"CCITT", /* 10 */
"SNA", /* 11 */
"DECnet", /* 12 */
"DLI", /* 13 */
"LAT", /* 14 */
"HYLINK", /* 15 */
"APPLETALK", /* 16 */
"NIT", /* 17 */
"802", /* 18 */
"OSI", /* 19 */
"X25", /* 20 */
"OSINET", /* 21 */
"GOSIP", /* 22 */
"IPX", /* 23 */
"ROUTE", /* 24 */
"LINK", /* 25 */
"INET6", /* 26 */
"KEY", /* 27 */
"NCA", /* 28 */
"POLICY", /* 29 */
"RDS" /* 30 */
};
#if MAX_AFCODES != 31
#endif
const char * const socktype_codes[] = { /* cf socket.h */
NULL,
"SOCK_DGRAM", /* 1 */
"SOCK_STREAM", /* 2 */
NULL,
"SOCK_RAW", /* 4 */
"SOCK_RDM", /* 5 */
"SOCK_SEQPACKET" /* 6 */
};
#if MAX_SOCKTYPES != 7
#endif