[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n*.sln    merge=union\n*.csproj merge=union\n*.vbproj merge=union\n*.fsproj merge=union\n*.dbproj merge=union\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n\n# External tool builders\n.externalToolBuilders/\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n\n#################\n## Visual Studio\n#################\n\n## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n\n# Build results\n[Dd]ebug/\n[Rr]elease/\n*_i.c\n*_p.c\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.vspscc\n.builds\n*.dotCover\n\n## TODO: If you have NuGet Package Restore enabled, uncomment this\n#packages/\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n\n# Visual Studio profiler\n*.psess\n*.vsp\n\n# ReSharper is a .NET coding add-in\n_ReSharper*\n\n# Installshield output folder\n[Ee]xpress\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish\n\n# Others\n[Bb]in\n[Oo]bj\nsql\nTestResults\n*.Cache\nClientBin\nstylecop.*\n~$*\n*.dbmdl\nGenerated_Code #added for RIA/Silverlight projects\n\n# Backup & report files from converting an old project file to a newer\n# Visual Studio version. Backup files are not needed, because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\n\n\n\n############\n## Windows\n############\n\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n\n#############\n## Python\n#############\n\n*.py[co]\n\n# Packages\n*.egg\n*.egg-info\ndist\nbuild\neggs\nparts\nbin\nvar\nsdist\ndevelop-eggs\n.installed.cfg\n\n# Installer logs\npip-log.txt\n\n# Unit test / coverage reports\n.coverage\n.tox\n\n#Translations\n*.mo\n\n#Mr Developer\n.mr.developer.cfg\n\n# Mac crap\n.DS_Store\n"
  },
  {
    "path": "DISCLAIMER",
    "content": "\tLIMITS OF LIABILITY AND DISCLAIMER OF WARRANTY\n\nThe authors and publisher of the book \"UNIX Network Programming\" have\nused their best efforts in preparing this software.  These efforts\ninclude the development, research, and testing of the theories and\nprograms to determine their effectiveness.  The authors and publisher\nmake no warranty of any kind, express or implied, with regard to\nthese programs or the documentation contained in the book.  The authors\nand publisher shall not be liable in any event for incidental or\nconsequential damages in connection with, or arising out of, the\nfurnishing, performance, or use of these programs.\n"
  },
  {
    "path": "Make.defines.in",
    "content": "#\n# This file is generated by autoconf from \"Make.defines.in\".\n#\n# This is the \"Make.defines\" file that almost every \"Makefile\" in the\n# source directories below this directory include.\n# The \"../\" in the pathnames actually refer to this directory, since\n# \"make\" is executed in all the subdirectories of this directory.\n#\n# System = @host@\n\nCC = @CC@\nCFLAGS = -I../lib @CFLAGS@\nLIBS = @LIBUNP@ @LIBS@\nLIBS_XTI = @LIBUNPXTI@ @LIBUNP@ @LIBS_XTI@\nRANLIB = @RANLIB@\n\n# Following is the main library, built from all the object files\n# in the lib/ and libfree/ directories.\nLIBUNP_NAME = @LIBUNP_NAME@\n\n# Following is the XTI library, built from all the object files\n# in the libxti/ directory.\nLIBUNPXTI_NAME = @LIBUNPXTI_NAME@\n\n# Following are all the object files to create in the lib/ directory.\nLIB_OBJS = @LIB_OBJS@\n\n# Following are all the object files to create in the libfree/ directory.\nLIBFREE_OBJS = @LIBFREE_OBJS@\n\n# Following are all the object files to create in the libgai/ directory.\nLIBGAI_OBJS = @LIBGAI_OBJS@\n\n# Following are all the object files to create in the libroute/ directory.\nLIBROUTE_OBJS = @LIBROUTE_OBJS@\n\n# Following are all the object files to create in the libxti/ directory.\nLIBXTI_OBJS = @LIBXTI_OBJS@\n\nCLEANFILES = core core.* *.core *.o temp.* *.out typescript* \\\n\t\t*.lc *.lh *.bsdi *.sparc *.uw\n"
  },
  {
    "path": "Makefile.in",
    "content": "include ./Make.defines\n\nall:\n\t@echo \"Nothing to make in this directory\"\n\t@echo \"Please read the README file\"\n\nclean:\n\trm -f $(CLEANFILES)\n \ndistclean:\n\trm -f $(CLEANFILES) config.cache config.log config.status config.h Make.defines Makefile\n"
  },
  {
    "path": "README",
    "content": "QUICK AND DIRTY\n===============\n\nExecute the following from the src/ directory:\n\n    ./configure    # try to figure out all implementation differences\n\n    cd lib         # build the basic library that all programs need\n    make           # use \"gmake\" everywhere on BSD/OS systems\n\n    cd ../libfree  # continue building the basic library\n    make\n\n    cd ../libroute # only if your system supports 4.4BSD style routing sockets\n    make           # only if your system supports 4.4BSD style routing sockets\n\n    cd ../libxti   # only if your system supports XTI\n    make           # only if your system supports XTI\n\n    cd ../intro    # build and test a basic client program\n    make daytimetcpcli\n    ./daytimetcpcli 127.0.0.1\n\nIf all that works, you're all set to start compiling individual programs.\n\nNotice that all the source code assumes tabs every 4 columns, not 8.\n\nMORE DETAILS\n============\n\n5.  If you need to make any changes to the \"unp.h\" header, notice that it\n    is a hard link in each directory, so you only need to change it once.\n\n6.  Go into the \"lib/\" directory and type \"make\".  This builds the library\n    \"libunp.a\" that is required by almost all of the programs.  There may\n    be compiler warnings (see NOTES below).  This step is where you'll find\n    all of your system's dependencies, and you must just update your cf/\n    files from step 1, rerun \"config\" and do this step again.\n\n6.  Go into the \"libfree/\" directory and type \"make\".  This adds to the\n    \"libunp.a\" library.  The files in this directory do not #include\n    the \"unp.h\" header, as people may want to use these functions\n    independent of the book's examples.\n\n8.  Once the library is made from steps 5 and 6, you can then go into any\n    of the source code directories and make whatever program you are\n    interested in.  Note that the horizontal rules at the beginning and\n    end of each program listing in the book contain the directory name and\n    filename.\n\n    BEWARE: Not all programs in each directory will compile on all systems\n    (e.g., the file src/advio/recvfromflags.c will not compile unless your\n    system supports the IP_RECVDSTADDR socket option).  Also, not all files\n    in each directory are included in the book.  Beware of any files with\n    \"test\" in the filename: they are probably a quick test program that I\n    wrote to check something, and may or may not work.\n\nNOTES\n-----\n\n- Many systems do not have correct function prototypes for the socket\n  functions, and this can cause many warnings during compilation.\n  For example, Solaris 2.5 omits the \"const\" from the 2nd argument\n  to connect().  Lots of systems use \"int\" for the length of socket\n  address structures, while Posix.1g specifies \"size_t\".  Lots of\n  systems still have the pointer argument to [sg]etsockopt() as a\n  \"char *\" instead of a \"void *\", and this also causes warnings.\n\n- SunOS 4.1.x: If you are using Sun's acc compiler, you need to run\n  the configure program as\n\n        CC=acc CFLAGS=-w CPPFLAGS=-w ./configure\n\n  Failure to do this results in numerous system headers (<sys/sockio.h>)\n  not being found during configuration, causing compile errors later.\n\n- If your system supports IPv6 and you want to run the examples in the\n  book using hostnames, you must install the latest BIND release.  You\n  can get it from ftp://ftp.vix.com/pub/bind/release.  All you need from\n  this release is a resolver library that you should then add to the\n  LDLIBS and LDLIBS_THREADS lines.\n\n- IPv6 support is still in its infancy.  There may be differences\n  between the IPv6 sockets API specifications and what the vendor\n  provides.  This may require hand tweaking, but should get better\n  over time.\n\n- If your system supports an older draft of the Posix pthreads standard,\n  but configure detects the support of pthreads, you will have to disable\n  this by hand.  Digital Unix V3.2C has this problem, for example, as it\n  supports draft 4, not the final draft.\n\n  To fix this, remove wrappthread.o from LIB_OBJS in \"Make.defines\" and\n  don't try to build and run any of the threads programs.\n\nCOMMON DIFFERENCES\n------------------\n\nThese are the common differences that I see in various headers that are\nnot \"yet\" at the level of Posix.1g or X/Open XNS Issue 5.\n\n- getsockopt() and setsockopt(): 5th argument is not correct type.\n\n- t_bind(): second argument is missing \"const\".\n\n- t_connect(): second argument is missing \"const\".\n\n- t_open(): first argument is missing \"const\".\n\n- t_optmsmg(): second argument is missing \"const\".\n\n- If your <xti.h> defines the members of the t_opthdr{} as longs,\n  instead of t_uscalar_t, some of the printf formats of these value\n  might generate warnings from your compiler, since you are printing\n  a long without a corresponding long format specifier.\n"
  },
  {
    "path": "VERSION",
    "content": "2004/12/12\n"
  },
  {
    "path": "aclocal.m4",
    "content": "dnl ##################################################################\ndnl Our macro to check for a function prototype in a given header.\ndnl\nAC_DEFUN(AC_CHECK_FUNC_PROTO,\n\t[AC_CACHE_CHECK(for $1 function prototype in $2, ac_cv_have_$1_proto,\n\t\tAC_EGREP_HEADER($1, $2,\n\t\t\tac_cv_have_$1_proto=yes,\n\t\t\tac_cv_have_$1_proto=no))\n\tif test $ac_cv_have_$1_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tAC_DEFINE_UNQUOTED($ac_tr_func)\n\tfi\n])\n\ndnl ##################################################################\ndnl We cannot use the AC_CHECK_TYPE macros because AC_CHECK_TYPE\ndnl #includes only <sys/types.h>, <stdlib.h>, and <stddef.h>.\ndnl Unfortunately, many implementations today hide typedefs in wierd\ndnl locations: Solaris 2.5.1 has uint8_t and uint32_t in <pthread.h>.\ndnl SunOS 4.1.x has int8_t in <sys/bitypes.h>.\ndnl So we define our own macro AC_UNP_CHECK_TYPE that does the same\ndnl #includes as \"unp.h\", and then looks for the typedef.\ndnl\ndnl This macro should be invoked after all the header checks have been\ndnl performed, since we #include \"confdefs.h\" below, and then use the\ndnl HAVE_foo_H values that it can #define.\ndnl\nAC_DEFUN(AC_UNP_CHECK_TYPE,\n\t[AC_MSG_CHECKING(if $1 defined)\n\tAC_CACHE_VAL(ac_cv_type_$1,\n\t\tAC_TRY_COMPILE(\n[\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif],\n\t\t[ $1 foo ],\n\t\tac_cv_type_$1=yes,\n\t\tac_cv_type_$1=no))\n\tAC_MSG_RESULT($ac_cv_type_$1)\n\tif test $ac_cv_type_$1 = no ; then\n\t\tAC_DEFINE($1, $2, $3)\n\tfi\n])\n\ndnl ##################################################################\ndnl The following checks for any typedefs for XTI programs.\ndnl We perform all the #includes that \"libxti/unpxti.h\" performs.\ndnl\nAC_DEFUN(AC_UNPXTI_CHECK_TYPE,\n\t[AC_MSG_CHECKING(if $1 defined)\n\tAC_CACHE_VAL(ac_cv_type_$1,\n\t\tAC_TRY_COMPILE(\n[\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\n#ifdef\tHAVE_POLL_H\n#  include\t<poll.h>\n#endif\n#ifdef\tHAVE_XTI_H\n#  include\t<xti.h>\n#endif\n#ifdef\tHAVE_NETCONFIG_H\n#  include\t<netconfig.h>\n#endif\n#ifdef\tHAVE_NETDIR_H\n#  include\t<netdir.h>\n#endif\n#ifdef\tHAVE_STROPTS_H\n#  include\t<stropts.h>\n#endif],\n\t\t[ $1 foo ],\n\t\tac_cv_type_$1=yes,\n\t\tac_cv_type_$1=no))\n\tAC_MSG_RESULT($ac_cv_type_$1)\n\tif test $ac_cv_type_$1 = no ; then\n\t\tAC_DEFINE($1, $2, $3)\n\tfi\n])\n"
  },
  {
    "path": "advio/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\ttcpcli01 tcpcli02 tcpserv02 \\\n\t\tudpcli01 udpcli02 udpcli03 \\\n\t\tudpserv01 udpserv03 udpserv04 \\\n\t\tdaytimetcpcli daytimeudpcli3 daytimeudpcli4\n\nall:\t${PROGS}\n\ntcpcli01:\ttcpcli01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli01.o ${LIBS}\n\ntcpcli02:\ttcpcli02.o str_cli_select02.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli02.o str_cli_select02.o ${LIBS}\n\ntcpcli03:\ttcpcli03.o str_cli_poll03.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli03.o str_cli_poll03.o ${LIBS}\n\ntcpcli04:\ttcpcli04.o str_cli_kqueue04.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli04.o str_cli_kqueue04.o ${LIBS}\n\ntcpserv02:\ttcpserv02.o str_echo_stdio02.o sig_chld_waitpid.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv02.o str_echo_stdio02.o \\\n\t\t\tsig_chld_waitpid.o ${LIBS}\n\nudpcli01:\tudpcli01.o dgclitimeo1.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o dgclitimeo1.o ${LIBS}\n\nudpcli02:\tudpcli02.o dgclitimeo2.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli02.o dgclitimeo2.o ${LIBS}\n\nudpcli03:\tudpcli03.o dgclitimeo3.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli03.o dgclitimeo3.o ${LIBS}\n\nudpserv01:\tudpserv01.o dgechoaddr.o recvfromflags.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv01.o dgechoaddr.o recvfromflags.o ${LIBS}\n\nudpserv03:\tudpserv03.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv03.o ${LIBS}\n\nudpserv04:\tudpserv04.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv04.o ${LIBS}\n\ndaytimetcpcli:\tdaytimetcpcli.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}\n\ndaytimeudpcli3:\tdaytimeudpcli3.o\n\t\t${CC} ${CFLAGS} -o $@ daytimeudpcli3.o ${LIBS}\n\ndaytimeudpcli4:\tdaytimeudpcli4.o\n\t\t${CC} ${CFLAGS} -o $@ daytimeudpcli4.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "advio/daytimetcpcli.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd, n, npend;\n\tchar\trecvline[MAXLINE + 1];\n\tsocklen_t\tlen;\n\tstruct sockaddr_storage\tss;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: a.out <hostname or IPaddress> <service or port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tlen = sizeof(ss);\n\tGetpeername(sockfd, (SA *)&ss, &len);\n\tprintf(\"connected to %s\\n\", Sock_ntop_host((SA *)&ss, len));\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Recv(sockfd, recvline, MAXLINE, MSG_PEEK)) == 0)\n\t\t\tbreak;\t\t/* server closed connection */\n\n\t\tIoctl(sockfd, FIONREAD, &npend);\t/* check FIONREAD support */\n\t\tprintf(\"%d bytes from PEEK, %d bytes pending\\n\", n, npend);\n\n\t\tn = Read(sockfd, recvline, MAXLINE);\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "advio/daytimeudpcli3.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd, n, nq;\n\tchar\trecvline[MAXLINE + 1];\n\tsocklen_t\tsalen;\n\tstruct sockaddr\t*sa;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: a.out <hostname or IPaddress> <service or port#>\");\n\n\tsockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);\n\n\tprintf(\"sending to %s\\n\", Sock_ntop_host(sa, salen));\n\n\tSendto(sockfd, \"\", 1, 0, sa, salen);\t/* send 1-byte datagram */\n\n\tn = Recvfrom(sockfd, recvline, MAXLINE, MSG_PEEK, NULL, NULL);\n\n\tIoctl(sockfd, FIONREAD, &nq);\t/* check FIONREAD support */\n\tprintf(\"%d bytes from PEEK, %d bytes pending\\n\", n, nq);\n\n\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\trecvline[n] = 0;\t/* null terminate */\n\tFputs(recvline, stdout);\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/daytimeudpcli4.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd, n, nq;\n\tchar\trecvline[MAXLINE + 1];\n\tsocklen_t\tlen;\n\tstruct sockaddr_storage\tss;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: a.out <hostname or IPaddress> <service or port#>\");\n\n\tsockfd = Udp_connect(argv[1], argv[2]);\n\n\tlen = sizeof(ss);\n\tGetpeername(sockfd, (SA *)&ss, &len);\n\tprintf(\"connected to %s\\n\", Sock_ntop_host((SA *)&ss, len));\n\n\tWrite(sockfd, \"\", 2);\t/* send 1-byte datagram */\n\n\tn = Recv(sockfd, recvline, MAXLINE, MSG_PEEK);\n\n\tIoctl(sockfd, FIONREAD, &nq);\t/* check FIONREAD support */\n\tprintf(\"%d bytes from PEEK, %d bytes pending\\n\", n, nq);\n\n\tn = Read(sockfd, recvline, MAXLINE);\n\trecvline[n] = 0;\t/* null terminate */\n\tFputs(recvline, stdout);\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/dgclitimeo.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tif (Readable_timeo(sockfd, 5) == 0) {\n\t\t\tfprintf(stderr, \"socket timeout\\n\");\n\t\t\tcontinue;\n\t\t}\n\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "advio/dgclitimeo1.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tif (Readable_timeo(sockfd, 5) == 0) {\n\t\t\tfprintf(stderr, \"socket timeout\\n\");\n\t\t} else {\n\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tFputs(recvline, stdout);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "advio/dgclitimeo2.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tstruct timeval\ttv;\n\n\ttv.tv_sec = 5;\n\ttv.tv_usec = 0;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tn = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\t\tif (n < 0) {\n\t\t\tif (errno == EWOULDBLOCK) {\n\t\t\t\tfprintf(stderr, \"socket timeout\\n\");\n\t\t\t\tcontinue;\n\t\t\t} else\n\t\t\t\terr_sys(\"recvfrom error\");\n\t\t}\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "advio/dgclitimeo2.lc",
    "content": "#include    \"unp.h\"##  1 ##src/advio/dgclitimeo2.c##\n\nvoid##  2 ##src/advio/dgclitimeo2.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  3 ##src/advio/dgclitimeo2.c##\n{##  4 ##src/advio/dgclitimeo2.c##\n    int     n;##  5 ##src/advio/dgclitimeo2.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  6 ##src/advio/dgclitimeo2.c##\n    struct timeval tv;##  7 ##src/advio/dgclitimeo2.c##\n\n    tv.tv_sec = 5;##  8 ##src/advio/dgclitimeo2.c##\n    tv.tv_usec = 0;##  9 ##src/advio/dgclitimeo2.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));## 10 ##src/advio/dgclitimeo2.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 11 ##src/advio/dgclitimeo2.c##\n\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 12 ##src/advio/dgclitimeo2.c##\n\n        n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);## 13 ##src/advio/dgclitimeo2.c##\n        if (n < 0) {## 14 ##src/advio/dgclitimeo2.c##\n            if (errno == EWOULDBLOCK) {## 15 ##src/advio/dgclitimeo2.c##\n                fprintf(stderr, \"socket timeout\\n\");## 16 ##src/advio/dgclitimeo2.c##\n                continue;## 17 ##src/advio/dgclitimeo2.c##\n            } else## 18 ##src/advio/dgclitimeo2.c##\n                err_sys(\"recvfrom error\");## 19 ##src/advio/dgclitimeo2.c##\n        }## 20 ##src/advio/dgclitimeo2.c##\n\n        recvline[n] = 0;        /* null terminate */## 21 ##src/advio/dgclitimeo2.c##\n        Fputs(recvline, stdout);## 22 ##src/advio/dgclitimeo2.c##\n    }## 23 ##src/advio/dgclitimeo2.c##\n}## 24 ##src/advio/dgclitimeo2.c##\n"
  },
  {
    "path": "advio/dgclitimeo3.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\tsig_alrm(int);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\tSignal(SIGALRM, sig_alrm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tif ( (n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tfprintf(stderr, \"socket timeout\\n\");\n\t\t\telse\n\t\t\t\terr_sys(\"recvfrom error\");\n\t\t} else {\n\t\t\talarm(0);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tFputs(recvline, stdout);\n\t\t}\n\t}\n}\n\nstatic void\nsig_alrm(int signo)\n{\n\treturn;\t\t\t/* just interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "advio/dgclitimeo3.lc",
    "content": "#include    \"unp.h\"##  1 ##src/advio/dgclitimeo3.c##\n\nstatic void sig_alrm(int);##  2 ##src/advio/dgclitimeo3.c##\n\nvoid##  3 ##src/advio/dgclitimeo3.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  4 ##src/advio/dgclitimeo3.c##\n{##  5 ##src/advio/dgclitimeo3.c##\n    int     n;##  6 ##src/advio/dgclitimeo3.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  7 ##src/advio/dgclitimeo3.c##\n\n    Signal(SIGALRM, sig_alrm);##  8 ##src/advio/dgclitimeo3.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {##  9 ##src/advio/dgclitimeo3.c##\n\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 10 ##src/advio/dgclitimeo3.c##\n\n        alarm(5);## 11 ##src/advio/dgclitimeo3.c##\n        if ((n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {## 12 ##src/advio/dgclitimeo3.c##\n            if (errno == EINTR)## 13 ##src/advio/dgclitimeo3.c##\n                fprintf(stderr, \"socket timeout\\n\");## 14 ##src/advio/dgclitimeo3.c##\n            else## 15 ##src/advio/dgclitimeo3.c##\n                err_sys(\"recvfrom error\");## 16 ##src/advio/dgclitimeo3.c##\n        } else {## 17 ##src/advio/dgclitimeo3.c##\n            alarm(0);## 18 ##src/advio/dgclitimeo3.c##\n            recvline[n] = 0;    /* null terminate */## 19 ##src/advio/dgclitimeo3.c##\n            Fputs(recvline, stdout);## 20 ##src/advio/dgclitimeo3.c##\n        }## 21 ##src/advio/dgclitimeo3.c##\n    }## 22 ##src/advio/dgclitimeo3.c##\n}## 23 ##src/advio/dgclitimeo3.c##\n\nstatic void## 24 ##src/advio/dgclitimeo3.c##\nsig_alrm(int signo)## 25 ##src/advio/dgclitimeo3.c##\n{## 26 ##src/advio/dgclitimeo3.c##\n    return;                     /* just interrupt the recvfrom() */## 27 ##src/advio/dgclitimeo3.c##\n}## 28 ##src/advio/dgclitimeo3.c##\n"
  },
  {
    "path": "advio/dgechoaddr.c",
    "content": "#include\t\"unpifi.h\"\n\n#undef\tMAXLINE\n#define\tMAXLINE\t20\t\t/* to see datagram truncation */\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tint\t\t\t\t\t\tflags;\n\tconst int\t\t\t\ton = 1;\n\tsocklen_t\t\t\t\tlen;\n\tssize_t\t\t\t\t\tn;\n\tchar\t\t\t\t\tmesg[MAXLINE], str[INET6_ADDRSTRLEN],\n\t\t\t\t\t\t\tifname[IFNAMSIZ];\n\tstruct in_addr\t\t\tin_zero;\n\tstruct unp_in_pktinfo\tpktinfo;\n\n#ifdef\tIP_RECVDSTADDR\n\tif (setsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on)) < 0)\n\t\terr_ret(\"setsockopt of IP_RECVDSTADDR\");\n#endif\n#ifdef\tIP_RECVIF\n\tif (setsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &on, sizeof(on)) < 0)\n\t\terr_ret(\"setsockopt of IP_RECVIF\");\n#endif\n\tbzero(&in_zero, sizeof(struct in_addr));\t/* all 0 IPv4 address */\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tflags = 0;\n\t\tn = Recvfrom_flags(sockfd, mesg, MAXLINE, &flags,\n\t\t\t\t\t\t   pcliaddr, &len, &pktinfo);\n\t\tprintf(\"%d-byte datagram from %s\", n, Sock_ntop(pcliaddr, len));\n\t\tif (memcmp(&pktinfo.ipi_addr, &in_zero, sizeof(in_zero)) != 0)\n\t\t\tprintf(\", to %s\", Inet_ntop(AF_INET, &pktinfo.ipi_addr,\n\t\t\t\t\t\t\t\t\t\tstr, sizeof(str)));\n\t\tif (pktinfo.ipi_ifindex > 0)\n\t\t\tprintf(\", recv i/f = %s\",\n\t\t\t\t   If_indextoname(pktinfo.ipi_ifindex, ifname));\n#ifdef\tMSG_TRUNC\n\t\tif (flags & MSG_TRUNC)\tprintf(\" (datagram truncated)\");\n#endif\n#ifdef\tMSG_CTRUNC\n\t\tif (flags & MSG_CTRUNC)\tprintf(\" (control info truncated)\");\n#endif\n#ifdef\tMSG_BCAST\n\t\tif (flags & MSG_BCAST)\tprintf(\" (broadcast)\");\n#endif\n#ifdef\tMSG_MCAST\n\t\tif (flags & MSG_MCAST)\tprintf(\" (multicast)\");\n#endif\n\t\tprintf(\"\\n\");\n\n\t\tSendto(sockfd, mesg, n, 0, pcliaddr, len);\n\t}\n}\n"
  },
  {
    "path": "advio/dgechoaddr.lc",
    "content": "#include    \"unpifi.h\"##  1 ##src/advio/dgechoaddr.c##\n\n#undef  MAXLINE##  2 ##src/advio/dgechoaddr.c##\n#define MAXLINE 20              /* to see datagram truncation */##  3 ##src/advio/dgechoaddr.c##\n\nvoid##  4 ##src/advio/dgechoaddr.c##\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)##  5 ##src/advio/dgechoaddr.c##\n{##  6 ##src/advio/dgechoaddr.c##\n    int     flags;##  7 ##src/advio/dgechoaddr.c##\n    const int on = 1;##  8 ##src/advio/dgechoaddr.c##\n    socklen_t len;##  9 ##src/advio/dgechoaddr.c##\n    ssize_t n;## 10 ##src/advio/dgechoaddr.c##\n    char    mesg[MAXLINE], str[INET6_ADDRSTRLEN], ifname[IFNAMSIZ];## 11 ##src/advio/dgechoaddr.c##\n    struct in_addr in_zero;## 12 ##src/advio/dgechoaddr.c##\n    struct in_pktinfo pktinfo;## 13 ##src/advio/dgechoaddr.c##\n\n#ifdef  IP_RECVDSTADDR## 14 ##src/advio/dgechoaddr.c##\n    if (setsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on)) < 0)## 15 ##src/advio/dgechoaddr.c##\n        err_ret(\"setsockopt of IP_RECVDSTADDR\");## 16 ##src/advio/dgechoaddr.c##\n#endif## 17 ##src/advio/dgechoaddr.c##\n#ifdef  IP_RECVIF## 18 ##src/advio/dgechoaddr.c##\n    if (setsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &on, sizeof(on)) < 0)## 19 ##src/advio/dgechoaddr.c##\n        err_ret(\"setsockopt of IP_RECVIF\");## 20 ##src/advio/dgechoaddr.c##\n#endif## 21 ##src/advio/dgechoaddr.c##\n    bzero(&in_zero, sizeof(struct in_addr));    /* all 0 IPv4 address */## 22 ##src/advio/dgechoaddr.c##\n\n    for (;;) {## 23 ##src/advio/dgechoaddr.c##\n        len = clilen;## 24 ##src/advio/dgechoaddr.c##\n        flags = 0;## 25 ##src/advio/dgechoaddr.c##\n        n = Recvfrom_flags(sockfd, mesg, MAXLINE, &flags,## 26 ##src/advio/dgechoaddr.c##\n                           pcliaddr, &len, &pktinfo);## 27 ##src/advio/dgechoaddr.c##\n        printf(\"%d-byte datagram from %s\", n, Sock_ntop(pcliaddr, len));## 28 ##src/advio/dgechoaddr.c##\n        if (memcmp(&pktinfo.ipi_addr, &in_zero, sizeof(in_zero)) != 0)## 29 ##src/advio/dgechoaddr.c##\n            printf(\", to %s\", Inet_ntop(AF_INET, &pktinfo.ipi_addr,## 30 ##src/advio/dgechoaddr.c##\n                                        str, sizeof(str)));## 31 ##src/advio/dgechoaddr.c##\n        if (pktinfo.ipi_ifindex > 0)## 32 ##src/advio/dgechoaddr.c##\n            printf(\", recv i/f = %s\",## 33 ##src/advio/dgechoaddr.c##\n                   If_indextoname(pktinfo.ipi_ifindex, ifname));## 34 ##src/advio/dgechoaddr.c##\n#ifdef  MSG_TRUNC## 35 ##src/advio/dgechoaddr.c##\n        if (flags & MSG_TRUNC)## 36 ##src/advio/dgechoaddr.c##\n            printf(\" (datagram truncated)\");## 37 ##src/advio/dgechoaddr.c##\n#endif## 38 ##src/advio/dgechoaddr.c##\n#ifdef  MSG_CTRUNC## 39 ##src/advio/dgechoaddr.c##\n        if (flags & MSG_CTRUNC)## 40 ##src/advio/dgechoaddr.c##\n            printf(\" (control info truncated)\");## 41 ##src/advio/dgechoaddr.c##\n#endif## 42 ##src/advio/dgechoaddr.c##\n#ifdef  MSG_BCAST## 43 ##src/advio/dgechoaddr.c##\n        if (flags & MSG_BCAST)## 44 ##src/advio/dgechoaddr.c##\n            printf(\" (broadcast)\");## 45 ##src/advio/dgechoaddr.c##\n#endif## 46 ##src/advio/dgechoaddr.c##\n#ifdef  MSG_MCAST## 47 ##src/advio/dgechoaddr.c##\n        if (flags & MSG_MCAST)## 48 ##src/advio/dgechoaddr.c##\n            printf(\" (multicast)\");## 49 ##src/advio/dgechoaddr.c##\n#endif## 50 ##src/advio/dgechoaddr.c##\n        printf(\"\\n\");## 51 ##src/advio/dgechoaddr.c##\n\n        Sendto(sockfd, mesg, n, 0, pcliaddr, len);## 52 ##src/advio/dgechoaddr.c##\n    }## 53 ##src/advio/dgechoaddr.c##\n}## 54 ##src/advio/dgechoaddr.c##\n"
  },
  {
    "path": "advio/old/dgechoaddr.c",
    "content": "#include\t\"unp.h\"\n\n#undef\tMAXLINE\n#define\tMAXLINE\t20\t\t/* to see datagram truncation */\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tint\t\t\t\tflags;\n\tconst int\t\ton = 1;\n\tsocklen_t\t\tlen;\n\tssize_t\t\t\tn;\n\tchar\t\t\tmesg[MAXLINE], str[INET6_ADDRSTRLEN];\n\tstruct in_addr\tdstaddr;\n\n#ifdef\tIP_RECVDSTADDR\n\tSetsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on));\n#endif\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tflags = 0;\n\t\tn = Recvfrom_flags(sockfd, mesg, MAXLINE, &flags,\n\t\t\t\t\t\t   pcliaddr, &len, &dstaddr);\n\t\tprintf(\"%d-byte datagram from %s\", n, Sock_ntop(pcliaddr, len));\n\t\tif ((flags & MSG_CTRUNC) == 0)\n\t\t\tprintf(\", to %s\", Inet_ntop(AF_INET, &dstaddr, str, sizeof(str)));\n#ifdef\tMSG_TRUNC\n\t\tif (flags & MSG_TRUNC)\tprintf(\" (datagram truncated)\");\n#endif\n#ifdef\tMSG_BCAST\n\t\tif (flags & MSG_BCAST)\tprintf(\" (broadcast)\");\n#endif\n#ifdef\tMSG_MCAST\n\t\tif (flags & MSG_MCAST)\tprintf(\" (multicast)\");\n#endif\n\t\tprintf(\"\\n\");\n\n\t\tSendto(sockfd, mesg, n, 0, pcliaddr, clilen);\n\t}\n}\n"
  },
  {
    "path": "advio/old/recvfromflags.c",
    "content": "#include\t\"unp.h\"\n\nssize_t\nrecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,\n\t\t\t   SA *sa, socklen_t *salenptr, void *dstaddrp)\n{\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov[1];\n\tssize_t\t\t\tn;\n\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n#define\tCONTROL_LEN\t(sizeof(struct cmsghdr) + sizeof(struct in_addr))\n\tchar\t\tcontrol[CONTROL_LEN];\n\n\tmsg.msg_control = control;\n\tmsg.msg_controllen = sizeof(control);\n\tmsg.msg_flags = 0;\n#else\n\tbzero(&msg, sizeof(msg));\t/* make certain msg_accrightslen = 0 */\n#endif\n\n\tmsg.msg_name = sa;\n\tmsg.msg_namelen = *salenptr;\n\tiov[0].iov_base = ptr;\n\tiov[0].iov_len = nbytes;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\n\tif ( (n = recvmsg(fd, &msg, *flagsp)) < 0)\n\t\treturn(n);\n\n\t*salenptr = msg.msg_namelen;\t/* pass back results */\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n\t*flagsp = msg.msg_flags;\t\t/* pass back results */\n\n\t/*\n\t * We need someway to indicate to the caller that nothing was\n\t * returned through dstaddrp (since all 32-bit values are valid\n\t * IP destination addresses).  To avoid having to add yet another\n\t * pointer argument, we return MSG_CTRUNC (which unp.h always\n\t * defines, even if the implementation does not).\n\t */\n\n#ifdef\tIP_RECVDSTADDR\n\tif (dstaddrp && msg.msg_controllen > 0 &&\n\t\t(msg.msg_flags & MSG_CTRUNC) == 0) {\n\t\tstruct cmsghdr\t*cmptr = CMSG_FIRSTHDR(&msg);\n\n\t\tif (cmptr->cmsg_len != CONTROL_LEN)\n\t\t\terr_quit(\"control length = %d\", cmptr->cmsg_len);\n\t\tif (cmptr->cmsg_level != IPPROTO_IP)\n\t\t\terr_quit(\"control level != IPPROTO_IP\");\n\t\tif (cmptr->cmsg_type != IP_RECVDSTADDR)\n\t\t\terr_quit(\"control type != IP_RECVDSTADDR\");\n\t\tmemcpy(dstaddrp, CMSG_DATA(cmptr), sizeof(struct in_addr));\n\t} else\n#endif\n\t\t*flagsp |= MSG_CTRUNC;\t\t/* dest IP addr not returned */\n#else\n\t*flagsp |= MSG_CTRUNC;\t\t\t/* dest IP addr not returned */\n#endif\t/* HAVE_MSGHDR_MSG_CONTROL */\n\n\treturn(n);\n}\n\nssize_t\nRecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,\n\t\t\t   SA *sa, socklen_t *salenptr, void *dstaddrp)\n{\n\tssize_t\t\tn;\n\n\tn = recvfrom_flags(fd, ptr, nbytes, flagsp, sa, salenptr, dstaddrp);\n\tif (n < 0)\n\t\terr_quit(\"recvfrom_flags error\");\n\n\treturn(n);\n}\n"
  },
  {
    "path": "advio/old/test01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd, flag;\n\tssize_t\t\t\tn;\n\tchar\t\t\tbuff[MAXLINE];\n\tconst int\t\ton = 1;\n\tsocklen_t\t\taddrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\n\tif (argc == 2)\n\t\tsockfd = Udp_server(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tsockfd = Udp_server(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: test01 <hostname> <service>\");\n\n\tcliaddr = Malloc(addrlen);\n\n#ifdef\tIP_RECVDSTADDR\n\tSetsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &on, sizeof(on));\n\n\tlen = sizeof(flag);\n\tGetsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR, &flag, &len);\n\tprintf(\"IP_RECVDSTADDR option = %d, size = %d\\n\", flag, len);\n#else\n\tprintf(\"IP_RECVDSTADDR not defined\\n\");\n#endif\n\n#ifdef\tIP_RECVIF\n\tSetsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &on, sizeof(on));\n\n\tlen = sizeof(flag);\n\tGetsockopt(sockfd, IPPROTO_IP, IP_RECVIF, &flag, &len);\n\tprintf(\"IP_RECVIF option = %d, size = %d\\n\", flag, len);\n#else\n\tprintf(\"IP_RECVIF not defined\\n\");\n#endif\n\n\tfor ( ; ; ) {\n#define\tCONTROL_LEN\t(sizeof(struct cmsghdr) + sizeof(struct in_addr))\n\t\tchar\t\tcontrol[CONTROL_LEN];\n\n\t\tmsg.msg_control = control;\n\t\tmsg.msg_controllen = sizeof(control);\n\t\tmsg.msg_flags = 0;\n#else\n\t\tbzero(&msg, sizeof(msg));\t/* make certain msg_accrightslen = 0 */\n#endif\n\n\t\tmsg.msg_name = sa;\n\t\tmsg.msg_namelen = *salenptr;\n\t\tiov[0].iov_base = ptr;\n\t\tiov[0].iov_len = nbytes;\n\t\tmsg.msg_iov = iov;\n\t\tmsg.msg_iovlen = 1;\n\n\t\tif ( (n = recvmsg(fd, &msg, *flagsp)) < 0)\n\t\t\treturn(n);\n\n\t\tlen = addrlen;\n\t\tn = Recvfrom(sockfd, buff, MAXLINE, 0, cliaddr, &len);\n\t\tprintf(\"datagram from %s\\n\", Sock_ntop(cliaddr, len));\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Sendto(sockfd, buff, strlen(buff), 0, cliaddr, len);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "advio/recvfromflags.c",
    "content": "/* include recvfrom_flags1 */\n#include\t\"unp.h\"\n#include\t<sys/param.h>\t\t/* ALIGN macro for CMSG_NXTHDR() macro */\n\nssize_t\nrecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,\n\t\t\t   SA *sa, socklen_t *salenptr, struct unp_in_pktinfo *pktp)\n{\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov[1];\n\tssize_t\t\t\tn;\n\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n\tstruct cmsghdr\t*cmptr;\n\tunion {\n\t  struct cmsghdr\tcm;\n\t  char\t\t\t\tcontrol[CMSG_SPACE(sizeof(struct in_addr)) +\n\t\t\t\t\t\t\t\tCMSG_SPACE(sizeof(struct unp_in_pktinfo))];\n\t} control_un;\n\n\tmsg.msg_control = control_un.control;\n\tmsg.msg_controllen = sizeof(control_un.control);\n\tmsg.msg_flags = 0;\n#else\n\tbzero(&msg, sizeof(msg));\t/* make certain msg_accrightslen = 0 */\n#endif\n\n\tmsg.msg_name = sa;\n\tmsg.msg_namelen = *salenptr;\n\tiov[0].iov_base = ptr;\n\tiov[0].iov_len = nbytes;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\n\tif ( (n = recvmsg(fd, &msg, *flagsp)) < 0)\n\t\treturn(n);\n\n\t*salenptr = msg.msg_namelen;\t/* pass back results */\n\tif (pktp)\n\t\tbzero(pktp, sizeof(struct unp_in_pktinfo));\t/* 0.0.0.0, i/f = 0 */\n/* end recvfrom_flags1 */\n\n/* include recvfrom_flags2 */\n#ifndef\tHAVE_MSGHDR_MSG_CONTROL\n\t*flagsp = 0;\t\t\t\t\t/* pass back results */\n\treturn(n);\n#else\n\n\t*flagsp = msg.msg_flags;\t\t/* pass back results */\n\tif (msg.msg_controllen < sizeof(struct cmsghdr) ||\n\t\t(msg.msg_flags & MSG_CTRUNC) || pktp == NULL)\n\t\treturn(n);\n\n\tfor (cmptr = CMSG_FIRSTHDR(&msg); cmptr != NULL;\n\t\t cmptr = CMSG_NXTHDR(&msg, cmptr)) {\n\n#ifdef\tIP_RECVDSTADDR\n\t\tif (cmptr->cmsg_level == IPPROTO_IP &&\n\t\t\tcmptr->cmsg_type == IP_RECVDSTADDR) {\n\n\t\t\tmemcpy(&pktp->ipi_addr, CMSG_DATA(cmptr),\n\t\t\t\t   sizeof(struct in_addr));\n\t\t\tcontinue;\n\t\t}\n#endif\n\n#ifdef\tIP_RECVIF\n\t\tif (cmptr->cmsg_level == IPPROTO_IP &&\n\t\t\tcmptr->cmsg_type == IP_RECVIF) {\n\t\t\tstruct sockaddr_dl\t*sdl;\n\n\t\t\tsdl = (struct sockaddr_dl *) CMSG_DATA(cmptr);\n\t\t\tpktp->ipi_ifindex = sdl->sdl_index;\n\t\t\tcontinue;\n\t\t}\n#endif\n\t\terr_quit(\"unknown ancillary data, len = %d, level = %d, type = %d\",\n\t\t\t\t cmptr->cmsg_len, cmptr->cmsg_level, cmptr->cmsg_type);\n\t}\n\treturn(n);\n#endif\t/* HAVE_MSGHDR_MSG_CONTROL */\n}\n/* end recvfrom_flags2 */\n\nssize_t\nRecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,\n\t\t\t   SA *sa, socklen_t *salenptr, struct unp_in_pktinfo *pktp)\n{\n\tssize_t\t\tn;\n\n\tn = recvfrom_flags(fd, ptr, nbytes, flagsp, sa, salenptr, pktp);\n\tif (n < 0)\n\t\terr_quit(\"recvfrom_flags error\");\n\n\treturn(n);\n}\n"
  },
  {
    "path": "advio/recvfromflags.lc",
    "content": "/* include recvfrom_flags1 */\n#include    \"unp.h\"##  1 ##src/advio/recvfromflags.c##\n#include    <sys/param.h>       /* ALIGN macro for CMSG_NXTHDR() macro */##  2 ##src/advio/recvfromflags.c##\n\n#ifdef  HAVE_SOCKADDR_DL_STRUCT##  3 ##src/advio/recvfromflags.c##\n# include   <net/if_dl.h>##  4 ##src/advio/recvfromflags.c##\n#endif##  5 ##src/advio/recvfromflags.c##\n\nssize_t##  6 ##src/advio/recvfromflags.c##\nrecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,##  7 ##src/advio/recvfromflags.c##\n               SA *sa, socklen_t *salenptr, struct in_pktinfo *pktp)##  8 ##src/advio/recvfromflags.c##\n{##  9 ##src/advio/recvfromflags.c##\n    struct msghdr msg;## 10 ##src/advio/recvfromflags.c##\n    struct iovec iov[1];## 11 ##src/advio/recvfromflags.c##\n    ssize_t n;## 12 ##src/advio/recvfromflags.c##\n\n#ifdef  HAVE_MSGHDR_MSG_CONTROL## 13 ##src/advio/recvfromflags.c##\n    struct cmsghdr *cmptr;## 14 ##src/advio/recvfromflags.c##\n    union {## 15 ##src/advio/recvfromflags.c##\n        struct cmsghdr cm;## 16 ##src/advio/recvfromflags.c##\n        char    control[CMSG_SPACE(sizeof(struct in_addr)) +## 17 ##src/advio/recvfromflags.c##\n                        CMSG_SPACE(sizeof(struct in_pktinfo))];## 18 ##src/advio/recvfromflags.c##\n    } control_un;## 19 ##src/advio/recvfromflags.c##\n\n    msg.msg_control = control_un.control;## 20 ##src/advio/recvfromflags.c##\n    msg.msg_controllen = sizeof(control_un.control);## 21 ##src/advio/recvfromflags.c##\n    msg.msg_flags = 0;## 22 ##src/advio/recvfromflags.c##\n#else## 23 ##src/advio/recvfromflags.c##\n    bzero(&msg, sizeof(msg));   /* make certain msg_accrightslen = 0 */## 24 ##src/advio/recvfromflags.c##\n#endif## 25 ##src/advio/recvfromflags.c##\n\n    msg.msg_name = sa;## 26 ##src/advio/recvfromflags.c##\n    msg.msg_namelen = *salenptr;## 27 ##src/advio/recvfromflags.c##\n    iov[0].iov_base = ptr;## 28 ##src/advio/recvfromflags.c##\n    iov[0].iov_len = nbytes;## 29 ##src/advio/recvfromflags.c##\n    msg.msg_iov = iov;## 30 ##src/advio/recvfromflags.c##\n    msg.msg_iovlen = 1;## 31 ##src/advio/recvfromflags.c##\n\n    if ((n = recvmsg(fd, &msg, *flagsp)) < 0)## 32 ##src/advio/recvfromflags.c##\n        return (n);## 33 ##src/advio/recvfromflags.c##\n\n    *salenptr = msg.msg_namelen;    /* pass back results */## 34 ##src/advio/recvfromflags.c##\n    if (pktp)## 35 ##src/advio/recvfromflags.c##\n        bzero(pktp, sizeof(struct in_pktinfo)); /* 0.0.0.0, i/f = 0 */## 36 ##src/advio/recvfromflags.c##\n/* end recvfrom_flags1 */\n\n/* include recvfrom_flags2 */\n#ifndef HAVE_MSGHDR_MSG_CONTROL## 37 ##src/advio/recvfromflags.c##\n    *flagsp = 0;                /* pass back results */## 38 ##src/advio/recvfromflags.c##\n    return (n);## 39 ##src/advio/recvfromflags.c##\n#else## 40 ##src/advio/recvfromflags.c##\n\n    *flagsp = msg.msg_flags;    /* pass back results */## 41 ##src/advio/recvfromflags.c##\n    if (msg.msg_controllen < sizeof(struct cmsghdr) ||## 42 ##src/advio/recvfromflags.c##\n        (msg.msg_flags & MSG_CTRUNC) || pktp == NULL)## 43 ##src/advio/recvfromflags.c##\n        return (n);## 44 ##src/advio/recvfromflags.c##\n\n    for (cmptr = CMSG_FIRSTHDR(&msg); cmptr != NULL;## 45 ##src/advio/recvfromflags.c##\n         cmptr = CMSG_NXTHDR(&msg, cmptr)) {## 46 ##src/advio/recvfromflags.c##\n\n#ifdef  IP_RECVDSTADDR## 47 ##src/advio/recvfromflags.c##\n        if (cmptr->cmsg_level == IPPROTO_IP &&## 48 ##src/advio/recvfromflags.c##\n            cmptr->cmsg_type == IP_RECVDSTADDR) {## 49 ##src/advio/recvfromflags.c##\n\n            memcpy(&pktp->ipi_addr, CMSG_DATA(cmptr),## 50 ##src/advio/recvfromflags.c##\n                   sizeof(struct in_addr));## 51 ##src/advio/recvfromflags.c##\n            continue;## 52 ##src/advio/recvfromflags.c##\n        }## 53 ##src/advio/recvfromflags.c##\n#endif## 54 ##src/advio/recvfromflags.c##\n\n#ifdef  IP_RECVIF## 55 ##src/advio/recvfromflags.c##\n        if (cmptr->cmsg_level == IPPROTO_IP && cmptr->cmsg_type == IP_RECVIF) {## 56 ##src/advio/recvfromflags.c##\n            struct sockaddr_dl *sdl;## 57 ##src/advio/recvfromflags.c##\n\n            sdl = (struct sockaddr_dl *) CMSG_DATA(cmptr);## 58 ##src/advio/recvfromflags.c##\n            pktp->ipi_ifindex = sdl->sdl_index;## 59 ##src/advio/recvfromflags.c##\n            continue;## 60 ##src/advio/recvfromflags.c##\n        }## 61 ##src/advio/recvfromflags.c##\n#endif## 62 ##src/advio/recvfromflags.c##\n        err_quit(\"unknown ancillary data, len = %d, level = %d, type = %d\",## 63 ##src/advio/recvfromflags.c##\n                 cmptr->cmsg_len, cmptr->cmsg_level, cmptr->cmsg_type);## 64 ##src/advio/recvfromflags.c##\n    }## 65 ##src/advio/recvfromflags.c##\n    return (n);## 66 ##src/advio/recvfromflags.c##\n#endif  /* HAVE_MSGHDR_MSG_CONTROL */## 67 ##src/advio/recvfromflags.c##\n}## 68 ##src/advio/recvfromflags.c##\n/* end recvfrom_flags2 */\n\nssize_t## 69 ##src/advio/recvfromflags.c##\nRecvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,## 70 ##src/advio/recvfromflags.c##\n               SA *sa, socklen_t *salenptr, struct in_pktinfo *pktp)## 71 ##src/advio/recvfromflags.c##\n{## 72 ##src/advio/recvfromflags.c##\n    ssize_t n;## 73 ##src/advio/recvfromflags.c##\n\n    n = recvfrom_flags(fd, ptr, nbytes, flagsp, sa, salenptr, pktp);## 74 ##src/advio/recvfromflags.c##\n    if (n < 0)## 75 ##src/advio/recvfromflags.c##\n        err_quit(\"recvfrom_flags error\");## 76 ##src/advio/recvfromflags.c##\n\n    return (n);## 77 ##src/advio/recvfromflags.c##\n}## 78 ##src/advio/recvfromflags.c##\n"
  },
  {
    "path": "advio/script.1",
    "content": "kalae % ./udpserv01\n9-byte datagram from 206.62.226.33.41164, to 206.62.226.35, recv i/f = ef0\n13-byte datagram from 206.62.226.65.1057, to 206.62.226.95, recv i/f = we0 (broadcast)\n4-byte datagram from 206.62.226.33.41176, to 224.0.0.1, recv i/f = ef0 (multicast)\n20-byte datagram from 127.0.0.1.4632, to 127.0.0.1, recv i/f = lo0 (datagram truncated)\n9-byte datagram from 206.62.226.33.41178, to 206.62.226.66, recv i/f = ef0\n"
  },
  {
    "path": "advio/sig_chld_waitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {\n\t\tprintf(\"child %d terminated\\n\", pid);\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "advio/str_cli_kqueue04.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\t\t\tkq, i, n, nev, stdineof = 0, isfile;\n\tchar\t\t\tbuf[MAXLINE];\n\tstruct kevent\tkev[2];\n\tstruct timespec\tts;\n\tstruct stat\t\tst;\n\n\tisfile = ((fstat(fileno(fp), &st) == 0) &&\n\t\t\t  (st.st_mode & S_IFMT) == S_IFREG);\n\n\tEV_SET(&kev[0], fileno(fp), EVFILT_READ, EV_ADD, 0, 0, NULL);\n\tEV_SET(&kev[1], sockfd, EVFILT_READ, EV_ADD, 0, 0, NULL);\n\n\tkq = Kqueue();\n\tts.tv_sec = ts.tv_nsec = 0;\n\tKevent(kq, kev, 2, NULL, 0, &ts);\n\n\tfor ( ; ; ) {\n\t\tnev = Kevent(kq, NULL, 0, kev, 2, NULL);\n\n\t\tfor (i = 0; i < nev; i++) {\n\t\t\tif (kev[i].ident == sockfd) {\t/* socket is readable */\n\t\t\t\tif ( (n = Read(sockfd, buf, MAXLINE)) == 0) {\n\t\t\t\t\tif (stdineof == 1)\n\t\t\t\t\t\treturn;\t\t/* normal termination */\n\t\t\t\t\telse\n\t\t\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\t\t\t\t}\n\n\t\t\t\tWrite(fileno(stdout), buf, n);\n\t\t\t}\n\n\t\t\tif (kev[i].ident == fileno(fp)) {  /* input is readable */\n\t\t\t\tn = Read(fileno(fp), buf, MAXLINE);\n\t\t\t\tif (n > 0)\n\t\t\t\t\tWriten(sockfd, buf, n);\n\n\t\t\t\tif (n == 0 || (isfile && n == kev[i].data)) {\n\t\t\t\t\tstdineof = 1;\n\t\t\t\t\tShutdown(sockfd, SHUT_WR);\t/* send FIN */\n\t\t\t\t\tkev[i].flags = EV_DELETE;\n\t\t\t\t\tKevent(kq, &kev[i], 1, NULL, 0, &ts);\t/* remove kevent */\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "advio/str_cli_poll03.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/devpoll.h>\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\tstdineof;\n\tchar\t\tbuf[MAXLINE];\n\tint\t\tn;\n\tint\t\twfd;\n\tstruct pollfd\tpollfd[2];\n\tstruct dvpoll\tdopoll;\n\tint\t\ti;\n\tint\t\tresult;\n\n\twfd = Open(\"/dev/poll\", O_RDWR, 0);\n\n\tpollfd[0].fd = fileno(fp);\n\tpollfd[0].events = POLLIN;\n\tpollfd[0].revents = 0;\n\n\tpollfd[1].fd = sockfd;\n\tpollfd[1].events = POLLIN;\n\tpollfd[1].revents = 0;\n\n\tWrite(wfd, pollfd, sizeof(struct pollfd) * 2);\n\n\tstdineof = 0;\n\tfor ( ; ; ) {\n\t\t/* block until /dev/poll says something is ready */\n\t\tdopoll.dp_timeout = -1;\n\t\tdopoll.dp_nfds = 2;\n\t\tdopoll.dp_fds = pollfd;\n\t\tresult = Ioctl(wfd, DP_POLL, &dopoll);\n\n\t\t/* loop through ready file descriptors */\n\t\tfor (i = 0; i < result; i++) {\n\t\t\tif (dopoll.dp_fds[i].fd == sockfd) {\n\t\t\t\t/* socket is readable */\n\t\t\t\tif ( (n = Read(sockfd, buf, MAXLINE)) == 0) {\n\t\t\t\t\tif (stdineof == 1)\n\t\t\t\t\t\treturn;\t\t/* normal termination */\n\t\t\t\t\telse\n\t\t\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\t\t\t\t}\n\n\t\t\t\tWrite(fileno(stdout), buf, n);\n\t\t\t} else {\n\t\t\t\t/* input is readable */\n\t\t\t\tif ( (n = Read(fileno(fp), buf, MAXLINE)) == 0) {\n\t\t\t\t\tstdineof = 1;\n\t\t\t\t\tShutdown(sockfd, SHUT_WR);\t/* send FIN */\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tWriten(sockfd, buf, n);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "advio/str_cli_select02.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\t\tmaxfdp1, stdineof = 0;\n\tfd_set\t\trset;\n\tchar\t\tsendline[MAXLINE], recvline[MAXLINE];\n\n\tFD_ZERO(&rset);\n\tfor ( ; ; ) {\n\t\tif (stdineof == 0)\n\t\t\tFD_SET(fileno(fp), &rset);\n\t\tFD_SET(sockfd, &rset);\n\t\tmaxfdp1 = max(fileno(fp), sockfd) + 1;\n\t\tSelect(maxfdp1, &rset, NULL, NULL, NULL);\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* socket is readable */\n\t\t\tif (Readline(sockfd, recvline, MAXLINE) == 0) {\n\t\t\t\tif (stdineof == 1)\n\t\t\t\t\treturn;\t\t/* normal termination */\n\t\t\t\telse\n\t\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\t\t\t}\n\n\t\t\tFputs(recvline, stdout);\n\t\t}\n\n\t\tif (FD_ISSET(fileno(fp), &rset)) {  /* input is readable */\n\t\t\tif (Fgets(sendline, MAXLINE, fp) == NULL) {\n\t\t\t\tstdineof = 1;\n\t\t\t\tShutdown(sockfd, SHUT_WR);\t/* send FIN */\n\t\t\t\tFD_CLR(fileno(fp), &rset);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tWriten(sockfd, sendline, strlen(sendline));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "advio/str_echo_stdio02.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_echo(int sockfd)\n{\n\tchar\t\tline[MAXLINE];\n\tFILE\t\t*fpin, *fpout;\n\n\tfpin = Fdopen(sockfd, \"r\");\n\tfpout = Fdopen(sockfd, \"w\");\n\n\twhile (Fgets(line, MAXLINE, fpin) != NULL)\n\t\tFputs(line, fpout);\n}\n"
  },
  {
    "path": "advio/str_echo_stdio02.lc",
    "content": "#include    \"unp.h\"##  1 ##src/advio/str_echo_stdio02.c##\n\nvoid##  2 ##src/advio/str_echo_stdio02.c##\nstr_echo(int sockfd)##  3 ##src/advio/str_echo_stdio02.c##\n{##  4 ##src/advio/str_echo_stdio02.c##\n    char    line[MAXLINE];##  5 ##src/advio/str_echo_stdio02.c##\n    FILE   *fpin, *fpout;##  6 ##src/advio/str_echo_stdio02.c##\n\n    fpin = Fdopen(sockfd, \"r\");##  7 ##src/advio/str_echo_stdio02.c##\n    fpout = Fdopen(sockfd, \"w\");##  8 ##src/advio/str_echo_stdio02.c##\n\n    while (Fgets(line, MAXLINE, fpin) != NULL)##  9 ##src/advio/str_echo_stdio02.c##\n        Fputs(line, fpout);## 10 ##src/advio/str_echo_stdio02.c##\n}## 11 ##src/advio/str_echo_stdio02.c##\n"
  },
  {
    "path": "advio/tcpcli01.c",
    "content": "/* Use standard echo server; baseline measurements for nonblocking version */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect_timeo(sockfd, (SA *) &servaddr, sizeof(servaddr), 10);\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/tcpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/tcpcli03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/tcpcli04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/tcpserv02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "advio/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/udpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/udpcli03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "advio/udpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "advio/udpserv03.c",
    "content": "/* include udpserv1 */\n#include\t\"unpifi.h\"\n\nvoid\tmydg_echo(int, SA *, socklen_t, SA *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tconst int\t\t\ton = 1;\n\tpid_t\t\t\t\tpid;\n\tstruct ifi_info\t\t*ifi, *ifihead;\n\tstruct sockaddr_in\t*sa, cliaddr, wildaddr;\n\n\tfor (ifihead = ifi = Get_ifi_info(AF_INET, 1);\n\t\t ifi != NULL; ifi = ifi->ifi_next) {\n\n\t\t\t/*4bind unicast address */\n\t\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\t\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\t\tsa = (struct sockaddr_in *) ifi->ifi_addr;\n\t\tsa->sin_family = AF_INET;\n\t\tsa->sin_port = htons(SERV_PORT);\n\t\tBind(sockfd, (SA *) sa, sizeof(*sa));\n\t\tprintf(\"bound %s\\n\", Sock_ntop((SA *) sa, sizeof(*sa)));\n\n\t\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\t\tmydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), (SA *) sa);\n\t\t\texit(0);\t\t/* never executed */\n\t\t}\n/* end udpserv1 */\n/* include udpserv2 */\n\t\tif (ifi->ifi_flags & IFF_BROADCAST) {\n\t\t\t\t/* 4try to bind broadcast address */\n\t\t\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\t\t\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\t\t\tsa = (struct sockaddr_in *) ifi->ifi_brdaddr;\n\t\t\tsa->sin_family = AF_INET;\n\t\t\tsa->sin_port = htons(SERV_PORT);\n\t\t\tif (bind(sockfd, (SA *) sa, sizeof(*sa)) < 0) {\n\t\t\t\tif (errno == EADDRINUSE) {\n\t\t\t\t\tprintf(\"EADDRINUSE: %s\\n\",\n\t\t\t\t\t\t   Sock_ntop((SA *) sa, sizeof(*sa)));\n\t\t\t\t\tClose(sockfd);\n\t\t\t\t\tcontinue;\n\t\t\t\t} else\n\t\t\t\t\terr_sys(\"bind error for %s\",\n\t\t\t\t\t\t\tSock_ntop((SA *) sa, sizeof(*sa)));\n\t\t\t}\n\t\t\tprintf(\"bound %s\\n\", Sock_ntop((SA *) sa, sizeof(*sa)));\n\n\t\t\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\t\t\tmydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr),\n\t\t\t\t\t\t  (SA *) sa);\n\t\t\t\texit(0);\t\t/* never executed */\n\t\t\t}\n\t\t}\n\t}\n/* end udpserv2 */\n/* include udpserv3 */\n\t\t/* 4bind wildcard address */\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\tbzero(&wildaddr, sizeof(wildaddr));\n\twildaddr.sin_family = AF_INET;\n\twildaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\twildaddr.sin_port = htons(SERV_PORT);\n\tBind(sockfd, (SA *) &wildaddr, sizeof(wildaddr));\n\tprintf(\"bound %s\\n\", Sock_ntop((SA *) &wildaddr, sizeof(wildaddr)));\n\n\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\tmydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), (SA *) sa);\n\t\texit(0);\t\t/* never executed */\n\t}\n\texit(0);\n}\n/* end udpserv3 */\n\n/* include mydg_echo */\nvoid\nmydg_echo(int sockfd, SA *pcliaddr, socklen_t clilen, SA *myaddr)\n{\n\tint\t\t\tn;\n\tchar\t\tmesg[MAXLINE];\n\tsocklen_t\tlen;\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tn = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);\n\t\tprintf(\"child %d, datagram from %s\", getpid(),\n\t\t\t   Sock_ntop(pcliaddr, len));\n\t\tprintf(\", to %s\\n\", Sock_ntop(myaddr, clilen));\n\n\t\tSendto(sockfd, mesg, n, 0, pcliaddr, len);\n\t}\n}\n/* end mydg_echo */\n"
  },
  {
    "path": "advio/udpserv03.lc",
    "content": "/* include udpserv1 */\n#include    \"unpifi.h\"##  1 ##src/advio/udpserv03.c##\n\nvoid    mydg_echo(int, SA *, socklen_t, SA *);##  2 ##src/advio/udpserv03.c##\n\nint##  3 ##src/advio/udpserv03.c##\nmain(int argc, char **argv)##  4 ##src/advio/udpserv03.c##\n{##  5 ##src/advio/udpserv03.c##\n    int     sockfd;##  6 ##src/advio/udpserv03.c##\n    const int on = 1;##  7 ##src/advio/udpserv03.c##\n    pid_t   pid;##  8 ##src/advio/udpserv03.c##\n    struct ifi_info *ifi, *ifihead;##  9 ##src/advio/udpserv03.c##\n    struct sockaddr_in *sa, cliaddr, wildaddr;## 10 ##src/advio/udpserv03.c##\n\n    for (ifihead = ifi = Get_ifi_info(AF_INET, 1);## 11 ##src/advio/udpserv03.c##\n         ifi != NULL; ifi = ifi->ifi_next) {## 12 ##src/advio/udpserv03.c##\n\n        /* 4bind unicast address */## 13 ##src/advio/udpserv03.c##\n        sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 14 ##src/advio/udpserv03.c##\n\n        Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 15 ##src/advio/udpserv03.c##\n\n        sa = (struct sockaddr_in *) ifi->ifi_addr;## 16 ##src/advio/udpserv03.c##\n        sa->sin_family = AF_INET;## 17 ##src/advio/udpserv03.c##\n        sa->sin_port = htons(SERV_PORT);## 18 ##src/advio/udpserv03.c##\n        Bind(sockfd, (SA *) sa, sizeof(*sa));## 19 ##src/advio/udpserv03.c##\n        printf(\"bound %s\\n\", Sock_ntop((SA *) sa, sizeof(*sa)));## 20 ##src/advio/udpserv03.c##\n\n        if ((pid = Fork()) == 0) {  /* child */## 21 ##src/advio/udpserv03.c##\n            mydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), (SA *) sa);## 22 ##src/advio/udpserv03.c##\n            exit(0);            /* never executed */## 23 ##src/advio/udpserv03.c##\n        }## 24 ##src/advio/udpserv03.c##\n/* end udpserv1 */\n/* include udpserv2 */\n        if (ifi->ifi_flags & IFF_BROADCAST) {## 25 ##src/advio/udpserv03.c##\n            /* 4try to bind broadcast address */## 26 ##src/advio/udpserv03.c##\n            sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 27 ##src/advio/udpserv03.c##\n            Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 28 ##src/advio/udpserv03.c##\n\n            sa = (struct sockaddr_in *) ifi->ifi_brdaddr;## 29 ##src/advio/udpserv03.c##\n            sa->sin_family = AF_INET;## 30 ##src/advio/udpserv03.c##\n            sa->sin_port = htons(SERV_PORT);## 31 ##src/advio/udpserv03.c##\n            if (bind(sockfd, (SA *) sa, sizeof(*sa)) < 0) {## 32 ##src/advio/udpserv03.c##\n                if (errno == EADDRINUSE) {## 33 ##src/advio/udpserv03.c##\n                    printf(\"EADDRINUSE: %s\\n\",## 34 ##src/advio/udpserv03.c##\n                           Sock_ntop((SA *) sa, sizeof(*sa)));## 35 ##src/advio/udpserv03.c##\n                    Close(sockfd);## 36 ##src/advio/udpserv03.c##\n                    continue;## 37 ##src/advio/udpserv03.c##\n                } else## 38 ##src/advio/udpserv03.c##\n                    err_sys(\"bind error for %s\",## 39 ##src/advio/udpserv03.c##\n                            Sock_ntop((SA *) sa, sizeof(*sa)));## 40 ##src/advio/udpserv03.c##\n            }## 41 ##src/advio/udpserv03.c##\n            printf(\"bound %s\\n\", Sock_ntop((SA *) sa, sizeof(*sa)));## 42 ##src/advio/udpserv03.c##\n\n            if ((pid = Fork()) == 0) {  /* child */## 43 ##src/advio/udpserv03.c##\n                mydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr),## 44 ##src/advio/udpserv03.c##\n                          (SA *) sa);## 45 ##src/advio/udpserv03.c##\n                exit(0);        /* never executed */## 46 ##src/advio/udpserv03.c##\n            }## 47 ##src/advio/udpserv03.c##\n        }## 48 ##src/advio/udpserv03.c##\n    }## 49 ##src/advio/udpserv03.c##\n/* end udpserv2 */\n/* include udpserv3 */\n    /* 4bind wildcard address */## 50 ##src/advio/udpserv03.c##\n    sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 51 ##src/advio/udpserv03.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 52 ##src/advio/udpserv03.c##\n\n    bzero(&wildaddr, sizeof(wildaddr));## 53 ##src/advio/udpserv03.c##\n    wildaddr.sin_family = AF_INET;## 54 ##src/advio/udpserv03.c##\n    wildaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 55 ##src/advio/udpserv03.c##\n    wildaddr.sin_port = htons(SERV_PORT);## 56 ##src/advio/udpserv03.c##\n    Bind(sockfd, (SA *) &wildaddr, sizeof(wildaddr));## 57 ##src/advio/udpserv03.c##\n    printf(\"bound %s\\n\", Sock_ntop((SA *) &wildaddr, sizeof(wildaddr)));## 58 ##src/advio/udpserv03.c##\n\n    if ((pid = Fork()) == 0) {  /* child */## 59 ##src/advio/udpserv03.c##\n        mydg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr), (SA *) sa);## 60 ##src/advio/udpserv03.c##\n        exit(0);                /* never executed */## 61 ##src/advio/udpserv03.c##\n    }## 62 ##src/advio/udpserv03.c##\n    exit(0);## 63 ##src/advio/udpserv03.c##\n}## 64 ##src/advio/udpserv03.c##\n/* end udpserv3 */\n\n/* include mydg_echo */\nvoid## 65 ##src/advio/udpserv03.c##\nmydg_echo(int sockfd, SA *pcliaddr, socklen_t clilen, SA *myaddr)## 66 ##src/advio/udpserv03.c##\n{## 67 ##src/advio/udpserv03.c##\n    int     n;## 68 ##src/advio/udpserv03.c##\n    char    mesg[MAXLINE];## 69 ##src/advio/udpserv03.c##\n    socklen_t len;## 70 ##src/advio/udpserv03.c##\n\n    for (;;) {## 71 ##src/advio/udpserv03.c##\n        len = clilen;## 72 ##src/advio/udpserv03.c##\n        n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);## 73 ##src/advio/udpserv03.c##\n        printf(\"child %d, datagram from %s\", getpid(),## 74 ##src/advio/udpserv03.c##\n               Sock_ntop(pcliaddr, len));## 75 ##src/advio/udpserv03.c##\n        printf(\", to %s\\n\", Sock_ntop(myaddr, clilen));## 76 ##src/advio/udpserv03.c##\n\n        Sendto(sockfd, mesg, n, 0, pcliaddr, len);## 77 ##src/advio/udpserv03.c##\n    }## 78 ##src/advio/udpserv03.c##\n}## 79 ##src/advio/udpserv03.c##\n/* end mydg_echo */\n"
  },
  {
    "path": "advio/udpserv04.c",
    "content": "#include\t\"unpifi.h\"\n\nvoid\tmydg_echo(int, SA *, socklen_t);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, family, port;\n\tconst int\t\t\ton = 1;\n\tpid_t\t\t\t\tpid;\n\tsocklen_t\t\t\tsalen;\n\tstruct sockaddr\t\t*sa, *wild;\n\tstruct ifi_info\t\t*ifi, *ifihead;\n\n\tif (argc == 2)\n\t\tsockfd = Udp_client(NULL, argv[1], (void **) &sa, &salen);\n\telse if (argc == 3)\n\t\tsockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);\n\telse\n\t\terr_quit(\"usage: udpserv04 [ <host> ] <service or port>\");\n\tfamily = sa->sa_family;\n\tport = sock_get_port(sa, salen);\n\tClose(sockfd);\t\t/* we just want family, port, salen */\n\n\tfor (ifihead = ifi = Get_ifi_info(family, 1);\n\t\t ifi != NULL; ifi = ifi->ifi_next) {\n\n\t\t\t/*4bind unicast address */\n\t\tsockfd = Socket(family, SOCK_DGRAM, 0);\n\t\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\t\tsock_set_port(ifi->ifi_addr, salen, port);\n\t\tBind(sockfd, ifi->ifi_addr, salen);\n\t\tprintf(\"bound %s\\n\", Sock_ntop(ifi->ifi_addr, salen));\n\n\t\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\t\tmydg_echo(sockfd, ifi->ifi_addr, salen);\n\t\t\texit(0);\t\t/* never executed */\n\t\t}\n\n\t\tif (ifi->ifi_flags & IFF_BROADCAST) {\n\t\t\t\t/* 4try to bind broadcast address */\n\t\t\tsockfd = Socket(family, SOCK_DGRAM, 0);\n\t\t\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\t\t\tsock_set_port(ifi->ifi_brdaddr, salen, port);\n\t\t\tif (bind(sockfd, ifi->ifi_brdaddr, salen) < 0) {\n\t\t\t\tif (errno == EADDRINUSE) {\n\t\t\t\t\tprintf(\"EADDRINUSE: %s\\n\",\n\t\t\t\t\t\t   Sock_ntop(ifi->ifi_brdaddr, salen));\n\t\t\t\t\tClose(sockfd);\n\t\t\t\t\tcontinue;\n\t\t\t\t} else\n\t\t\t\t\terr_sys(\"bind error for %s\",\n\t\t\t\t\t\t\tSock_ntop(ifi->ifi_brdaddr, salen));\n\t\t\t}\n\t\t\tprintf(\"bound %s\\n\", Sock_ntop(ifi->ifi_brdaddr, salen));\n\n\t\t\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\t\t\tmydg_echo(sockfd, ifi->ifi_brdaddr, salen);\n\t\t\t\texit(0);\t\t/* never executed */\n\t\t\t}\n\t\t}\n\t}\n\n\t\t/* 4bind wildcard address */\n\tsockfd = Socket(family, SOCK_DGRAM, 0);\n\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\twild = Malloc(salen);\n\tmemcpy(wild, sa, salen);\t/* copy family and port */\n\tsock_set_wild(wild, salen);\n\n\tBind(sockfd, wild, salen);\n\tprintf(\"bound %s\\n\", Sock_ntop(wild, salen));\n\n\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\tmydg_echo(sockfd, wild, salen);\n\t\texit(0);\t\t/* never executed */\n\t}\n\texit(0);\n}\n\nvoid\nmydg_echo(int sockfd, SA *myaddr, socklen_t salen)\n{\n\tint\t\t\tn;\n\tchar\t\tmesg[MAXLINE];\n\tsocklen_t\tlen;\n\tstruct sockaddr *cli;\n\n\tcli = Malloc(salen);\n\n\tfor ( ; ; ) {\n\t\tlen = salen;\n\t\tn = Recvfrom(sockfd, mesg, MAXLINE, 0, cli, &len);\n\t\tprintf(\"child %d, datagram from %s\",\n\t\t\t   getpid(), Sock_ntop(cli, len));\n\t\tprintf(\", to %s\\n\", Sock_ntop(myaddr, salen));\n\n\t\tSendto(sockfd, mesg, n, 0, cli, len);\n\t}\n}\n"
  },
  {
    "path": "advio/udpserv04.lc",
    "content": "#include    \"unpifi.h\"##  1 ##src/advio/udpserv04.c##\n\nvoid    mydg_echo(int, SA *, socklen_t);##  2 ##src/advio/udpserv04.c##\n\nint##  3 ##src/advio/udpserv04.c##\nmain(int argc, char **argv)##  4 ##src/advio/udpserv04.c##\n{##  5 ##src/advio/udpserv04.c##\n    int     sockfd, family, port;##  6 ##src/advio/udpserv04.c##\n    const int on = 1;##  7 ##src/advio/udpserv04.c##\n    pid_t   pid;##  8 ##src/advio/udpserv04.c##\n    socklen_t salen;##  9 ##src/advio/udpserv04.c##\n    struct sockaddr *sa, *wild;## 10 ##src/advio/udpserv04.c##\n    struct ifi_info *ifi, *ifihead;## 11 ##src/advio/udpserv04.c##\n\n    if (argc == 2)## 12 ##src/advio/udpserv04.c##\n        sockfd = Udp_client(NULL, argv[1], (void **) &sa, &salen);## 13 ##src/advio/udpserv04.c##\n    else if (argc == 3)## 14 ##src/advio/udpserv04.c##\n        sockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);## 15 ##src/advio/udpserv04.c##\n    else## 16 ##src/advio/udpserv04.c##\n        err_quit(\"usage: udpserv04 [ <host> ] <service or port>\");## 17 ##src/advio/udpserv04.c##\n    family = sa->sa_family;## 18 ##src/advio/udpserv04.c##\n    port = sock_get_port(sa, salen);## 19 ##src/advio/udpserv04.c##\n    Close(sockfd);              /* we just want family, port, salen */## 20 ##src/advio/udpserv04.c##\n\n    for (ifihead = ifi = Get_ifi_info(family, 1);## 21 ##src/advio/udpserv04.c##\n         ifi != NULL; ifi = ifi->ifi_next) {## 22 ##src/advio/udpserv04.c##\n\n        /* 4bind unicast address */## 23 ##src/advio/udpserv04.c##\n        sockfd = Socket(family, SOCK_DGRAM, 0);## 24 ##src/advio/udpserv04.c##\n        Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 25 ##src/advio/udpserv04.c##\n\n        sock_set_port(ifi->ifi_addr, salen, port);## 26 ##src/advio/udpserv04.c##\n        Bind(sockfd, ifi->ifi_addr, salen);## 27 ##src/advio/udpserv04.c##\n        printf(\"bound %s\\n\", Sock_ntop(ifi->ifi_addr, salen));## 28 ##src/advio/udpserv04.c##\n\n        if ((pid = Fork()) == 0) {  /* child */## 29 ##src/advio/udpserv04.c##\n            mydg_echo(sockfd, ifi->ifi_addr, salen);## 30 ##src/advio/udpserv04.c##\n            exit(0);            /* never executed */## 31 ##src/advio/udpserv04.c##\n        }## 32 ##src/advio/udpserv04.c##\n\n        if (ifi->ifi_flags & IFF_BROADCAST) {## 33 ##src/advio/udpserv04.c##\n            /* 4try to bind broadcast address */## 34 ##src/advio/udpserv04.c##\n            sockfd = Socket(family, SOCK_DGRAM, 0);## 35 ##src/advio/udpserv04.c##\n            Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 36 ##src/advio/udpserv04.c##\n\n            sock_set_port(ifi->ifi_brdaddr, salen, port);## 37 ##src/advio/udpserv04.c##\n            if (bind(sockfd, ifi->ifi_brdaddr, salen) < 0) {## 38 ##src/advio/udpserv04.c##\n                if (errno == EADDRINUSE) {## 39 ##src/advio/udpserv04.c##\n                    printf(\"EADDRINUSE: %s\\n\",## 40 ##src/advio/udpserv04.c##\n                           Sock_ntop(ifi->ifi_brdaddr, salen));## 41 ##src/advio/udpserv04.c##\n                    Close(sockfd);## 42 ##src/advio/udpserv04.c##\n                    continue;## 43 ##src/advio/udpserv04.c##\n                } else## 44 ##src/advio/udpserv04.c##\n                    err_sys(\"bind error for %s\",## 45 ##src/advio/udpserv04.c##\n                            Sock_ntop(ifi->ifi_brdaddr, salen));## 46 ##src/advio/udpserv04.c##\n            }## 47 ##src/advio/udpserv04.c##\n            printf(\"bound %s\\n\", Sock_ntop(ifi->ifi_brdaddr, salen));## 48 ##src/advio/udpserv04.c##\n\n            if ((pid = Fork()) == 0) {  /* child */## 49 ##src/advio/udpserv04.c##\n                mydg_echo(sockfd, ifi->ifi_brdaddr, salen);## 50 ##src/advio/udpserv04.c##\n                exit(0);        /* never executed */## 51 ##src/advio/udpserv04.c##\n            }## 52 ##src/advio/udpserv04.c##\n        }## 53 ##src/advio/udpserv04.c##\n    }## 54 ##src/advio/udpserv04.c##\n\n    /* 4bind wildcard address */## 55 ##src/advio/udpserv04.c##\n    sockfd = Socket(family, SOCK_DGRAM, 0);## 56 ##src/advio/udpserv04.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 57 ##src/advio/udpserv04.c##\n\n    wild = Malloc(salen);## 58 ##src/advio/udpserv04.c##\n    memcpy(wild, sa, salen);    /* copy family and port */## 59 ##src/advio/udpserv04.c##\n    sock_set_wild(wild, salen);## 60 ##src/advio/udpserv04.c##\n\n    Bind(sockfd, wild, salen);## 61 ##src/advio/udpserv04.c##\n    printf(\"bound %s\\n\", Sock_ntop(wild, salen));## 62 ##src/advio/udpserv04.c##\n\n    if ((pid = Fork()) == 0) {  /* child */## 63 ##src/advio/udpserv04.c##\n        mydg_echo(sockfd, wild, salen);## 64 ##src/advio/udpserv04.c##\n        exit(0);                /* never executed */## 65 ##src/advio/udpserv04.c##\n    }## 66 ##src/advio/udpserv04.c##\n    exit(0);## 67 ##src/advio/udpserv04.c##\n}## 68 ##src/advio/udpserv04.c##\n\nvoid## 69 ##src/advio/udpserv04.c##\nmydg_echo(int sockfd, SA *myaddr, socklen_t salen)## 70 ##src/advio/udpserv04.c##\n{## 71 ##src/advio/udpserv04.c##\n    int     n;## 72 ##src/advio/udpserv04.c##\n    char    mesg[MAXLINE];## 73 ##src/advio/udpserv04.c##\n    socklen_t len;## 74 ##src/advio/udpserv04.c##\n    struct sockaddr *cli;## 75 ##src/advio/udpserv04.c##\n\n    cli = Malloc(salen);## 76 ##src/advio/udpserv04.c##\n\n    for (;;) {## 77 ##src/advio/udpserv04.c##\n        len = salen;## 78 ##src/advio/udpserv04.c##\n        n = Recvfrom(sockfd, mesg, MAXLINE, 0, cli, &len);## 79 ##src/advio/udpserv04.c##\n        printf(\"child %d, datagram from %s\", getpid(), Sock_ntop(cli, len));## 80 ##src/advio/udpserv04.c##\n        printf(\", to %s\\n\", Sock_ntop(myaddr, salen));## 81 ##src/advio/udpserv04.c##\n\n        Sendto(sockfd, mesg, n, 0, cli, len);## 82 ##src/advio/udpserv04.c##\n    }## 83 ##src/advio/udpserv04.c##\n}## 84 ##src/advio/udpserv04.c##\n"
  },
  {
    "path": "bcast/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tudpcli01 udpcli02 udpcli03 udpcli04 udpcli05 udpcli06\n\nall:\t${PROGS}\n\n# Version in book.\nudpcli01:\tudpcli01.o dgclibcast1.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o dgclibcast1.o ${LIBS}\n\n# Incorrect version with alarm(1) and sleep(1) to tickle race condition.\nudpcli02:\tudpcli02.o dgclibcast2.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli02.o dgclibcast2.o ${LIBS}\n\n# Incorrect version that blocks signals, but still has a race condition.\nudpcli03:\tudpcli03.o dgclibcast3.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli03.o dgclibcast3.o ${LIBS}\n\n# Correct version using pselect().\nudpcli04:\tudpcli04.o dgclibcast4.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli04.o dgclibcast4.o ${LIBS}\n\n# Correct version using sigsetjmp()/siglongjmp().\nudpcli05:\tudpcli05.o dgclibcast5.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli05.o dgclibcast5.o ${LIBS}\n\n# Correct version using a pipe from signal handler to select().\nudpcli06:\tudpcli06.o dgclibcast6.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli06.o dgclibcast6.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "bcast/dgclibcast1.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_alarm(int);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tconst int\t\ton = 1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tlen = servlen;\n\t\t\tn = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\tif (n < 0) {\n\t\t\t\tif (errno == EINTR)\n\t\t\t\t\tbreak;\t\t/* waited long enough for replies */\n\t\t\t\telse\n\t\t\t\t\terr_sys(\"recvfrom error\");\n\t\t\t} else {\n\t\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\t\tSock_ntop_host(preply_addr, len), recvline);\n\t\t\t}\n\t\t}\n\t}\n\tfree(preply_addr);\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\treturn;\t\t/* just interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "bcast/dgclibcast1.lc",
    "content": "#include    \"unp.h\"##  1 ##src/bcast/dgclibcast1.c##\n\nstatic void recvfrom_alarm(int);##  2 ##src/bcast/dgclibcast1.c##\n\nvoid##  3 ##src/bcast/dgclibcast1.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  4 ##src/bcast/dgclibcast1.c##\n{##  5 ##src/bcast/dgclibcast1.c##\n    int     n;##  6 ##src/bcast/dgclibcast1.c##\n    const int on = 1;##  7 ##src/bcast/dgclibcast1.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  8 ##src/bcast/dgclibcast1.c##\n    socklen_t len;##  9 ##src/bcast/dgclibcast1.c##\n    struct sockaddr *preply_addr;## 10 ##src/bcast/dgclibcast1.c##\n\n    preply_addr = Malloc(servlen);## 11 ##src/bcast/dgclibcast1.c##\n\n    Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));## 12 ##src/bcast/dgclibcast1.c##\n\n    Signal(SIGALRM, recvfrom_alarm);## 13 ##src/bcast/dgclibcast1.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 14 ##src/bcast/dgclibcast1.c##\n\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 15 ##src/bcast/dgclibcast1.c##\n\n        alarm(5);## 16 ##src/bcast/dgclibcast1.c##\n        for (;;) {## 17 ##src/bcast/dgclibcast1.c##\n            len = servlen;## 18 ##src/bcast/dgclibcast1.c##\n            n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);## 19 ##src/bcast/dgclibcast1.c##\n            if (n < 0) {## 20 ##src/bcast/dgclibcast1.c##\n                if (errno == EINTR)## 21 ##src/bcast/dgclibcast1.c##\n                    break;      /* waited long enough for replies */## 22 ##src/bcast/dgclibcast1.c##\n                else## 23 ##src/bcast/dgclibcast1.c##\n                    err_sys(\"recvfrom error\");## 24 ##src/bcast/dgclibcast1.c##\n            } else {## 25 ##src/bcast/dgclibcast1.c##\n                recvline[n] = 0;    /* null terminate */## 26 ##src/bcast/dgclibcast1.c##\n                printf(\"from %s: %s\",## 27 ##src/bcast/dgclibcast1.c##\n                       Sock_ntop_host(preply_addr, len), recvline);## 28 ##src/bcast/dgclibcast1.c##\n            }## 29 ##src/bcast/dgclibcast1.c##\n        }## 30 ##src/bcast/dgclibcast1.c##\n    }## 31 ##src/bcast/dgclibcast1.c##\n}## 32 ##src/bcast/dgclibcast1.c##\n\nstatic void## 33 ##src/bcast/dgclibcast1.c##\nrecvfrom_alarm(int signo)## 34 ##src/bcast/dgclibcast1.c##\n{## 35 ##src/bcast/dgclibcast1.c##\n    return;                     /* just interrupt the recvfrom() */## 36 ##src/bcast/dgclibcast1.c##\n}## 37 ##src/bcast/dgclibcast1.c##\n"
  },
  {
    "path": "bcast/dgclibcast2.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_alarm(int);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tconst int\t\ton = 1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(1);\n\t\tfor ( ; ; ) {\n\t\t\tlen = servlen;\n\t\t\tn = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\tif (n == -1) {\n\t\t\t\tif (errno == EINTR)\n\t\t\t\t\tbreak;\t\t/* waited long enough for replies */\n\t\t\t\telse\n\t\t\t\t\terr_sys(\"recvfrom error\");\n\t\t\t} else {\n\t\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\t\tsleep(1);\n\t\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\t\tSock_ntop_host(preply_addr, len), recvline);\n\t\t\t}\n\t\t}\n\t}\n\tfree(preply_addr);\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\treturn;\t\t/* just interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "bcast/dgclibcast3.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_alarm(int);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tconst int\t\ton = 1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsigset_t\t\tsigset_alrm;\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));\n\n\tSigemptyset(&sigset_alrm);\n\tSigaddset(&sigset_alrm, SIGALRM);\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tlen = servlen;\n\t\t\tSigprocmask(SIG_UNBLOCK, &sigset_alrm, NULL);\n\t\t\tn = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\tSigprocmask(SIG_BLOCK, &sigset_alrm, NULL);\n\t\t\tif (n < 0) {\n\t\t\t\tif (errno == EINTR)\n\t\t\t\t\tbreak;\t\t/* waited long enough for replies */\n\t\t\t\telse\n\t\t\t\t\terr_sys(\"recvfrom error\");\n\t\t\t} else {\n\t\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\t\tSock_ntop_host(preply_addr, len), recvline);\n\t\t\t}\n\t\t}\n\t}\n\tfree(preply_addr);\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\treturn;\t\t/* just interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "bcast/dgclibcast3.lc",
    "content": "#include    \"unp.h\"##  1 ##src/bcast/dgclibcast3.c##\n\nstatic void recvfrom_alarm(int);##  2 ##src/bcast/dgclibcast3.c##\n\nvoid##  3 ##src/bcast/dgclibcast3.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  4 ##src/bcast/dgclibcast3.c##\n{##  5 ##src/bcast/dgclibcast3.c##\n    int     n;##  6 ##src/bcast/dgclibcast3.c##\n    const int on = 1;##  7 ##src/bcast/dgclibcast3.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  8 ##src/bcast/dgclibcast3.c##\n    sigset_t sigset_alrm;##  9 ##src/bcast/dgclibcast3.c##\n    socklen_t len;## 10 ##src/bcast/dgclibcast3.c##\n    struct sockaddr *preply_addr;## 11 ##src/bcast/dgclibcast3.c##\n\n    preply_addr = Malloc(servlen);## 12 ##src/bcast/dgclibcast3.c##\n\n    Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));## 13 ##src/bcast/dgclibcast3.c##\n\n    Sigemptyset(&sigset_alrm);## 14 ##src/bcast/dgclibcast3.c##\n    Sigaddset(&sigset_alrm, SIGALRM);## 15 ##src/bcast/dgclibcast3.c##\n\n    Signal(SIGALRM, recvfrom_alarm);## 16 ##src/bcast/dgclibcast3.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 17 ##src/bcast/dgclibcast3.c##\n\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 18 ##src/bcast/dgclibcast3.c##\n\n        alarm(5);## 19 ##src/bcast/dgclibcast3.c##\n        for (;;) {## 20 ##src/bcast/dgclibcast3.c##\n            len = servlen;## 21 ##src/bcast/dgclibcast3.c##\n            Sigprocmask(SIG_UNBLOCK, &sigset_alrm, NULL);## 22 ##src/bcast/dgclibcast3.c##\n            n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);## 23 ##src/bcast/dgclibcast3.c##\n            Sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);## 24 ##src/bcast/dgclibcast3.c##\n            if (n < 0) {## 25 ##src/bcast/dgclibcast3.c##\n                if (errno == EINTR)## 26 ##src/bcast/dgclibcast3.c##\n                    break;      /* waited long enough for replies */## 27 ##src/bcast/dgclibcast3.c##\n                else## 28 ##src/bcast/dgclibcast3.c##\n                    err_sys(\"recvfrom error\");## 29 ##src/bcast/dgclibcast3.c##\n            } else {## 30 ##src/bcast/dgclibcast3.c##\n                recvline[n] = 0;    /* null terminate */## 31 ##src/bcast/dgclibcast3.c##\n                printf(\"from %s: %s\",## 32 ##src/bcast/dgclibcast3.c##\n                       Sock_ntop_host(preply_addr, len), recvline);## 33 ##src/bcast/dgclibcast3.c##\n            }## 34 ##src/bcast/dgclibcast3.c##\n        }## 35 ##src/bcast/dgclibcast3.c##\n    }## 36 ##src/bcast/dgclibcast3.c##\n}## 37 ##src/bcast/dgclibcast3.c##\n\nstatic void## 38 ##src/bcast/dgclibcast3.c##\nrecvfrom_alarm(int signo)## 39 ##src/bcast/dgclibcast3.c##\n{## 40 ##src/bcast/dgclibcast3.c##\n    return;                     /* just interrupt the recvfrom() */## 41 ##src/bcast/dgclibcast3.c##\n}## 42 ##src/bcast/dgclibcast3.c##\n"
  },
  {
    "path": "bcast/dgclibcast4.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_alarm(int);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tconst int\t\ton = 1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tfd_set\t\t\trset;\n\tsigset_t\t\tsigset_alrm, sigset_empty;\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));\n\n\tFD_ZERO(&rset);\n\n\tSigemptyset(&sigset_empty);\n\tSigemptyset(&sigset_alrm);\n\tSigaddset(&sigset_alrm, SIGALRM);\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tSigprocmask(SIG_BLOCK, &sigset_alrm, NULL);\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tFD_SET(sockfd, &rset);\n\t\t\tn = pselect(sockfd+1, &rset, NULL, NULL, NULL, &sigset_empty);\n\t\t\tif (n < 0) {\n\t\t\t\tif (errno == EINTR)\n\t\t\t\t\tbreak;\n\t\t\t\telse\n\t\t\t\t\terr_sys(\"pselect error\");\n\t\t\t} else if (n != 1)\n\t\t\t\terr_sys(\"pselect error: returned %d\", n);\n\n\t\t\tlen = servlen;\n\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\tSock_ntop_host(preply_addr, len), recvline);\n\t\t}\n\t}\n\tfree(preply_addr);\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\treturn;\t\t/* just interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "bcast/dgclibcast4.lc",
    "content": "#include    \"unp.h\"##  1 ##src/bcast/dgclibcast4.c##\n\nstatic void recvfrom_alarm(int);##  2 ##src/bcast/dgclibcast4.c##\n\nvoid##  3 ##src/bcast/dgclibcast4.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  4 ##src/bcast/dgclibcast4.c##\n{##  5 ##src/bcast/dgclibcast4.c##\n    int     n;##  6 ##src/bcast/dgclibcast4.c##\n    const int on = 1;##  7 ##src/bcast/dgclibcast4.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  8 ##src/bcast/dgclibcast4.c##\n    fd_set  rset;##  9 ##src/bcast/dgclibcast4.c##\n    sigset_t sigset_alrm, sigset_empty;## 10 ##src/bcast/dgclibcast4.c##\n    socklen_t len;## 11 ##src/bcast/dgclibcast4.c##\n    struct sockaddr *preply_addr;## 12 ##src/bcast/dgclibcast4.c##\n\n    preply_addr = Malloc(servlen);## 13 ##src/bcast/dgclibcast4.c##\n\n    Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));## 14 ##src/bcast/dgclibcast4.c##\n\n    FD_ZERO(&rset);## 15 ##src/bcast/dgclibcast4.c##\n\n    Sigemptyset(&sigset_empty);## 16 ##src/bcast/dgclibcast4.c##\n    Sigemptyset(&sigset_alrm);## 17 ##src/bcast/dgclibcast4.c##\n    Sigaddset(&sigset_alrm, SIGALRM);## 18 ##src/bcast/dgclibcast4.c##\n\n    Signal(SIGALRM, recvfrom_alarm);## 19 ##src/bcast/dgclibcast4.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 20 ##src/bcast/dgclibcast4.c##\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 21 ##src/bcast/dgclibcast4.c##\n\n        Sigprocmask(SIG_BLOCK, &sigset_alrm, NULL);## 22 ##src/bcast/dgclibcast4.c##\n        alarm(5);## 23 ##src/bcast/dgclibcast4.c##\n        for (;;) {## 24 ##src/bcast/dgclibcast4.c##\n            FD_SET(sockfd, &rset);## 25 ##src/bcast/dgclibcast4.c##\n            n = pselect(sockfd + 1, &rset, NULL, NULL, NULL, &sigset_empty);## 26 ##src/bcast/dgclibcast4.c##\n            if (n < 0) {## 27 ##src/bcast/dgclibcast4.c##\n                if (errno == EINTR)## 28 ##src/bcast/dgclibcast4.c##\n                    break;## 29 ##src/bcast/dgclibcast4.c##\n                else## 30 ##src/bcast/dgclibcast4.c##\n                    err_sys(\"pselect error\");## 31 ##src/bcast/dgclibcast4.c##\n            } else if (n != 1)## 32 ##src/bcast/dgclibcast4.c##\n                err_sys(\"pselect error: returned %d\", n);## 33 ##src/bcast/dgclibcast4.c##\n\n            len = servlen;## 34 ##src/bcast/dgclibcast4.c##\n            n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);## 35 ##src/bcast/dgclibcast4.c##\n            recvline[n] = 0;    /* null terminate */## 36 ##src/bcast/dgclibcast4.c##\n            printf(\"from %s: %s\",## 37 ##src/bcast/dgclibcast4.c##\n                   Sock_ntop_host(preply_addr, len), recvline);## 38 ##src/bcast/dgclibcast4.c##\n        }## 39 ##src/bcast/dgclibcast4.c##\n    }## 40 ##src/bcast/dgclibcast4.c##\n}## 41 ##src/bcast/dgclibcast4.c##\n\nstatic void## 42 ##src/bcast/dgclibcast4.c##\nrecvfrom_alarm(int signo)## 43 ##src/bcast/dgclibcast4.c##\n{## 44 ##src/bcast/dgclibcast4.c##\n    return;                     /* just interrupt the recvfrom() */## 45 ##src/bcast/dgclibcast4.c##\n}## 46 ##src/bcast/dgclibcast4.c##\n"
  },
  {
    "path": "bcast/dgclibcast5.c",
    "content": "#include\t\"unp.h\"\n#include\t<setjmp.h>\n\nstatic void\t\t\trecvfrom_alarm(int);\nstatic sigjmp_buf\tjmpbuf;\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tconst int\t\ton = 1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tif (sigsetjmp(jmpbuf, 1) != 0)\n\t\t\t\tbreak;\n\t\t\tlen = servlen;\n\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\tSock_ntop_host(preply_addr, len), recvline);\n\t\t}\n\t}\n\tfree(preply_addr);\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\tsiglongjmp(jmpbuf, 1);\n}\n"
  },
  {
    "path": "bcast/dgclibcast5.lc",
    "content": "#include    \"unp.h\"##  1 ##src/bcast/dgclibcast5.c##\n#include    <setjmp.h>##  2 ##src/bcast/dgclibcast5.c##\n\nstatic void recvfrom_alarm(int);##  3 ##src/bcast/dgclibcast5.c##\nstatic sigjmp_buf jmpbuf;##  4 ##src/bcast/dgclibcast5.c##\n\nvoid##  5 ##src/bcast/dgclibcast5.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  6 ##src/bcast/dgclibcast5.c##\n{##  7 ##src/bcast/dgclibcast5.c##\n    int     n;##  8 ##src/bcast/dgclibcast5.c##\n    const int on = 1;##  9 ##src/bcast/dgclibcast5.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];## 10 ##src/bcast/dgclibcast5.c##\n    socklen_t len;## 11 ##src/bcast/dgclibcast5.c##\n    struct sockaddr *preply_addr;## 12 ##src/bcast/dgclibcast5.c##\n\n    preply_addr = Malloc(servlen);## 13 ##src/bcast/dgclibcast5.c##\n\n    Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));## 14 ##src/bcast/dgclibcast5.c##\n\n    Signal(SIGALRM, recvfrom_alarm);## 15 ##src/bcast/dgclibcast5.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 16 ##src/bcast/dgclibcast5.c##\n\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 17 ##src/bcast/dgclibcast5.c##\n\n        alarm(5);## 18 ##src/bcast/dgclibcast5.c##\n        for (;;) {## 19 ##src/bcast/dgclibcast5.c##\n            if (sigsetjmp(jmpbuf, 1) != 0)## 20 ##src/bcast/dgclibcast5.c##\n                break;## 21 ##src/bcast/dgclibcast5.c##\n            len = servlen;## 22 ##src/bcast/dgclibcast5.c##\n            n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);## 23 ##src/bcast/dgclibcast5.c##\n            recvline[n] = 0;    /* null terminate */## 24 ##src/bcast/dgclibcast5.c##\n            printf(\"from %s: %s\",## 25 ##src/bcast/dgclibcast5.c##\n                   Sock_ntop_host(preply_addr, len), recvline);## 26 ##src/bcast/dgclibcast5.c##\n        }## 27 ##src/bcast/dgclibcast5.c##\n    }## 28 ##src/bcast/dgclibcast5.c##\n}## 29 ##src/bcast/dgclibcast5.c##\n\nstatic void## 30 ##src/bcast/dgclibcast5.c##\nrecvfrom_alarm(int signo)## 31 ##src/bcast/dgclibcast5.c##\n{## 32 ##src/bcast/dgclibcast5.c##\n    siglongjmp(jmpbuf, 1);## 33 ##src/bcast/dgclibcast5.c##\n}## 34 ##src/bcast/dgclibcast5.c##\n"
  },
  {
    "path": "bcast/dgclibcast6.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_alarm(int);\nstatic int\tpipefd[2];\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn, maxfdp1;\n\tconst int\t\ton = 1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tfd_set\t\t\trset;\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));\n\n\tPipe(pipefd);\n\tmaxfdp1 = max(sockfd, pipefd[0]) + 1;\n\n\tFD_ZERO(&rset);\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tFD_SET(sockfd, &rset);\n\t\t\tFD_SET(pipefd[0], &rset);\n\t\t\tif ( (n = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {\n\t\t\t\tif (errno == EINTR)\n\t\t\t\t\tcontinue;\n\t\t\t\telse\n\t\t\t\t\terr_sys(\"select error\");\n\t\t\t}\n\n\t\t\tif (FD_ISSET(sockfd, &rset)) {\n\t\t\t\tlen = servlen;\n\t\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\t\tSock_ntop_host(preply_addr, len), recvline);\n\t\t\t}\n\n\t\t\tif (FD_ISSET(pipefd[0], &rset)) {\n\t\t\t\tRead(pipefd[0], &n, 1);\t\t/* timer expired */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tfree(preply_addr);\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\tWrite(pipefd[1], \"\", 1);\t/* write one null byte to pipe */\n\treturn;\n}\n"
  },
  {
    "path": "bcast/dgclibcast6.lc",
    "content": "#include    \"unp.h\"##  1 ##src/bcast/dgclibcast6.c##\n\nstatic void recvfrom_alarm(int);##  2 ##src/bcast/dgclibcast6.c##\nstatic int pipefd[2];##  3 ##src/bcast/dgclibcast6.c##\n\nvoid##  4 ##src/bcast/dgclibcast6.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  5 ##src/bcast/dgclibcast6.c##\n{##  6 ##src/bcast/dgclibcast6.c##\n    int     n, maxfdp1;##  7 ##src/bcast/dgclibcast6.c##\n    const int on = 1;##  8 ##src/bcast/dgclibcast6.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  9 ##src/bcast/dgclibcast6.c##\n    fd_set  rset;## 10 ##src/bcast/dgclibcast6.c##\n    socklen_t len;## 11 ##src/bcast/dgclibcast6.c##\n    struct sockaddr *preply_addr;## 12 ##src/bcast/dgclibcast6.c##\n\n    preply_addr = Malloc(servlen);## 13 ##src/bcast/dgclibcast6.c##\n\n    Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));## 14 ##src/bcast/dgclibcast6.c##\n\n    Pipe(pipefd);## 15 ##src/bcast/dgclibcast6.c##\n    maxfdp1 = max(sockfd, pipefd[0]) + 1;## 16 ##src/bcast/dgclibcast6.c##\n\n    FD_ZERO(&rset);## 17 ##src/bcast/dgclibcast6.c##\n\n    Signal(SIGALRM, recvfrom_alarm);## 18 ##src/bcast/dgclibcast6.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 19 ##src/bcast/dgclibcast6.c##\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 20 ##src/bcast/dgclibcast6.c##\n\n        alarm(5);## 21 ##src/bcast/dgclibcast6.c##\n        for (;;) {## 22 ##src/bcast/dgclibcast6.c##\n            FD_SET(sockfd, &rset);## 23 ##src/bcast/dgclibcast6.c##\n            FD_SET(pipefd[0], &rset);## 24 ##src/bcast/dgclibcast6.c##\n            if ((n = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {## 25 ##src/bcast/dgclibcast6.c##\n                if (errno == EINTR)## 26 ##src/bcast/dgclibcast6.c##\n                    continue;## 27 ##src/bcast/dgclibcast6.c##\n                else## 28 ##src/bcast/dgclibcast6.c##\n                    err_sys(\"select error\");## 29 ##src/bcast/dgclibcast6.c##\n            }## 30 ##src/bcast/dgclibcast6.c##\n\n            if (FD_ISSET(sockfd, &rset)) {## 31 ##src/bcast/dgclibcast6.c##\n                len = servlen;## 32 ##src/bcast/dgclibcast6.c##\n                n = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr,## 33 ##src/bcast/dgclibcast6.c##\n                             &len);## 34 ##src/bcast/dgclibcast6.c##\n                recvline[n] = 0;    /* null terminate */## 35 ##src/bcast/dgclibcast6.c##\n                printf(\"from %s: %s\",## 36 ##src/bcast/dgclibcast6.c##\n                       Sock_ntop_host(preply_addr, len), recvline);## 37 ##src/bcast/dgclibcast6.c##\n            }## 38 ##src/bcast/dgclibcast6.c##\n\n            if (FD_ISSET(pipefd[0], &rset)) {## 39 ##src/bcast/dgclibcast6.c##\n                Read(pipefd[0], &n, 1); /* timer expired */## 40 ##src/bcast/dgclibcast6.c##\n                break;## 41 ##src/bcast/dgclibcast6.c##\n            }## 42 ##src/bcast/dgclibcast6.c##\n        }## 43 ##src/bcast/dgclibcast6.c##\n    }## 44 ##src/bcast/dgclibcast6.c##\n}## 45 ##src/bcast/dgclibcast6.c##\n\nstatic void## 46 ##src/bcast/dgclibcast6.c##\nrecvfrom_alarm(int signo)## 47 ##src/bcast/dgclibcast6.c##\n{## 48 ##src/bcast/dgclibcast6.c##\n    Write(pipefd[1], \"\", 1);    /* write 1 null byte to pipe */## 49 ##src/bcast/dgclibcast6.c##\n    return;## 50 ##src/bcast/dgclibcast6.c##\n}## 51 ##src/bcast/dgclibcast6.c##\n"
  },
  {
    "path": "bcast/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli01 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "bcast/udpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli02 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "bcast/udpcli03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli03 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "bcast/udpcli04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli04 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "bcast/udpcli05.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli05 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "bcast/udpcli06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli02 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002 Free Software Foundation, Inc.\n\ntimestamp='2002-03-20'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Per Bothner <per@bothner.com>.\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# The plan is that this can be called by configure scripts if you\n# don't specify an explicit build system type.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit 0 ;;\n    --version | -v )\n       echo \"$version\" ; exit 0 ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit 0 ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\n\ndummy=dummy-$$\ntrap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script.\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\nset_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int dummy(){}\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;\n\t  if test $? = 0 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\trm -f $dummy.c $dummy.o $dummy.rel ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep __ELF__ >/dev/null\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t        os=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit 0 ;;\n    amiga:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    arc:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    hp300:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mac68k:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    macppc:OpenBSD:*:*)\n\techo powerpc-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvme68k:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvme88k:OpenBSD:*:*)\n\techo m88k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvmeppc:OpenBSD:*:*)\n\techo powerpc-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    pmax:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    sgi:OpenBSD:*:*)\n\techo mipseb-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    sun3:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    wgrisc:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    *:OpenBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    alpha:OSF1:*:*)\n\tif test $UNAME_RELEASE = \"V4.0\"; then\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\tfi\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\tcat <<EOF >$dummy.s\n\t.data\n\\$Lformat:\n\t.byte 37,100,45,37,120,10,0\t# \"%d-%x\\n\"\n\n\t.text\n\t.globl main\n\t.align 4\n\t.ent main\nmain:\n\t.frame \\$30,16,\\$26,0\n\tldgp \\$29,0(\\$27)\n\t.prologue 1\n\t.long 0x47e03d80 # implver \\$0\n\tlda \\$2,-1\n\t.long 0x47e20c21 # amask \\$2,\\$1\n\tlda \\$16,\\$Lformat\n\tmov \\$0,\\$17\n\tnot \\$1,\\$18\n\tjsr \\$26,printf\n\tldgp \\$29,0(\\$26)\n\tmov 0,\\$16\n\tjsr \\$26,exit\n\t.end main\nEOF\n\teval $set_cc_for_build\n\t$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null\n\tif test \"$?\" = 0 ; then\n\t\tcase `./$dummy` in\n\t\t\t0-0)\n\t\t\t\tUNAME_MACHINE=\"alpha\"\n\t\t\t\t;;\n\t\t\t1-0)\n\t\t\t\tUNAME_MACHINE=\"alphaev5\"\n\t\t\t\t;;\n\t\t\t1-1)\n\t\t\t\tUNAME_MACHINE=\"alphaev56\"\n\t\t\t\t;;\n\t\t\t1-101)\n\t\t\t\tUNAME_MACHINE=\"alphapca56\"\n\t\t\t\t;;\n\t\t\t2-303)\n\t\t\t\tUNAME_MACHINE=\"alphaev6\"\n\t\t\t\t;;\n\t\t\t2-307)\n\t\t\t\tUNAME_MACHINE=\"alphaev67\"\n\t\t\t\t;;\n\t\t\t2-1307)\n\t\t\t\tUNAME_MACHINE=\"alphaev68\"\n\t\t\t\t;;\n\t\tesac\n\tfi\n\trm -f $dummy.s $dummy\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\texit 0 ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit 0 ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit 0 ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit 0;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit 0 ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit 0 ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit 0 ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit 0;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit 0;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit 0 ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit 0 ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    i86pc:SunOS:5.*:*)\n\techo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit 0 ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit 0 ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit 0 ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit 0 ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit 0 ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n        exit 0 ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit 0 ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n        echo m68k-milan-mint${UNAME_RELEASE}\n        exit 0 ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n        echo m68k-hades-mint${UNAME_RELEASE}\n        exit 0 ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n        echo m68k-unknown-mint${UNAME_RELEASE}\n        exit 0 ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit 0 ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit 0 ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit 0 ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit 0 ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit 0 ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD $dummy.c -o $dummy \\\n\t  && ./$dummy `echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` \\\n\t  && rm -f $dummy.c $dummy && exit 0\n\trm -f $dummy.c $dummy\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit 0 ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit 0 ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit 0 ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit 0 ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit 0 ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit 0 ;;\n    AViiON:dgux:*:*)\n        # DG/UX returns AViiON for all architectures\n        UNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n \texit 0 ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit 0 ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit 0 ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit 0 ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit 0 ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit 0 ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id\n\texit 0 ;;              # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit 0 ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit 0 ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\t$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0\n\t\trm -f $dummy.c $dummy\n\t\techo rs6000-ibm-aix3.2.5\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit 0 ;;\n    *:AIX:*:[45])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit 0 ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit 0 ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit 0 ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit 0 ;;                           # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit 0 ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit 0 ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit 0 ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit 0 ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n                    case \"${sc_cpu_version}\" in\n                      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n                      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n                      532)                      # CPU_PA_RISC2_0\n                        case \"${sc_kernel_bits}\" in\n                          32) HP_ARCH=\"hppa2.0n\" ;;\n                          64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n                        esac ;;\n                    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^              //' << EOF >$dummy.c\n\n              #define _HPUX_SOURCE\n              #include <stdlib.h>\n              #include <unistd.h>\n\n              int main ()\n              {\n              #if defined(_SC_KERNEL_BITS)\n                  long bits = sysconf(_SC_KERNEL_BITS);\n              #endif\n                  long cpu  = sysconf (_SC_CPU_VERSION);\n\n                  switch (cpu)\n              \t{\n              \tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n              \tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n              \tcase CPU_PA_RISC2_0:\n              #if defined(_SC_KERNEL_BITS)\n              \t    switch (bits)\n              \t\t{\n              \t\tcase 64: puts (\"hppa2.0w\"); break;\n              \t\tcase 32: puts (\"hppa2.0n\"); break;\n              \t\tdefault: puts (\"hppa2.0\"); break;\n              \t\t} break;\n              #else  /* !defined(_SC_KERNEL_BITS) */\n              \t    puts (\"hppa2.0\"); break;\n              #endif\n              \tdefault: puts (\"hppa1.0\"); break;\n              \t}\n                  exit (0);\n              }\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`\n\t\t    if test -z \"$HP_ARCH\"; then HP_ARCH=hppa; fi\n\t\t    rm -f $dummy.c $dummy\n\t\tfi ;;\n\tesac\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit 0 ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit 0 ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0\n\trm -f $dummy.c $dummy\n\techo unknown-hitachi-hiuxwe2\n\texit 0 ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit 0 ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit 0 ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit 0 ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit 0 ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit 0 ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit 0 ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit 0 ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n        exit 0 ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n        exit 0 ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n        exit 0 ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n        exit 0 ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n        exit 0 ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*T3D:*:*:*)\n\techo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n        echo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n        exit 0 ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    *:FreeBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit 0 ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit 0 ;;\n    i*:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit 0 ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit 0 ;;\n    x86:Interix*:3*)\n\techo i386-pc-interix3\n\texit 0 ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i386-pc-interix\n\texit 0 ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit 0 ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit 0 ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    *:GNU:*:*)\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit 0 ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit 0 ;;\n    arm*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    mips:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef mips\n\t#undef mipsel\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=mipsel\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=mips\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`\n\trm -f $dummy.c\n\ttest x\"${CPU}\" != x && echo \"${CPU}-pc-linux-gnu\" && exit 0\n\t;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit 0 ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit 0 ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n        esac\n\tobjdump --private-headers /bin/sh | grep ld.so.1 >/dev/null\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit 0 ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit 0 ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit 0 ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit 0 ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    x86_64:Linux:*:*)\n\techo x86_64-unknown-linux-gnu\n\texit 0 ;;\n    i*86:Linux:*:*)\n\t# The BFD linker knows what the default object file format is, so\n\t# first see if it will tell us. cd to the root directory to prevent\n\t# problems with other programs or directories called `ld' in the path.\n\t# Set LC_ALL=C to ensure ld outputs messages in English.\n\tld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \\\n\t\t\t | sed -ne '/supported targets:/!d\n\t\t\t\t    s/[ \t][ \t]*/ /g\n\t\t\t\t    s/.*supported targets: *//\n\t\t\t\t    s/ .*//\n\t\t\t\t    p'`\n        case \"$ld_supported_targets\" in\n\t  elf32-i386)\n\t\tTENTATIVE=\"${UNAME_MACHINE}-pc-linux-gnu\"\n\t\t;;\n\t  a.out-i386-linux)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuaout\"\n\t\texit 0 ;;\t\t\n\t  coff-i386)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnucoff\"\n\t\texit 0 ;;\n\t  \"\")\n\t\t# Either a pre-BFD a.out linker (linux-gnuoldld) or\n\t\t# one that does not give us useful --help.\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuoldld\"\n\t\texit 0 ;;\n\tesac\n\t# Determine whether the default compiler is a.out or elf\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <features.h>\n\t#ifdef __ELF__\n\t# ifdef __GLIBC__\n\t#  if __GLIBC__ >= 2\n\tLIBC=gnu\n\t#  else\n\tLIBC=gnulibc1\n\t#  endif\n\t# else\n\tLIBC=gnulibc1\n\t# endif\n\t#else\n\t#ifdef __INTEL_COMPILER\n\tLIBC=gnu\n\t#else\n\tLIBC=gnuaout\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`\n\trm -f $dummy.c\n\ttest x\"${LIBC}\" != x && echo \"${UNAME_MACHINE}-pc-linux-${LIBC}\" && exit 0\n\ttest x\"${TENTATIVE}\" != x && echo \"${TENTATIVE}\" && exit 0\n\t;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit 0 ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n        # Unixware is an offshoot of SVR4, but it has its own version\n        # number series starting with 2...\n        # I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n        # Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit 0 ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit 0 ;;\n    i*86:*:5:[78]*)\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit 0 ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit 0 ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit 0 ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n        # uname -m prints for DJGPP always 'pc', but it prints nothing about\n        # the processor, so we play safe by assuming i386.\n\techo i386-pc-msdosdjgpp\n        exit 0 ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit 0 ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit 0 ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit 0 ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit 0 ;;\n    M68*:*:R3V[567]*:*)\n\ttest -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;\n    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && echo i486-ncr-sysv4.3${OS_REL} && exit 0\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n          && echo i486-ncr-sysv4 && exit 0 ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit 0 ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit 0 ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit 0 ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit 0 ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit 0 ;;\n    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n                      # says <Richard.M.Bartel@ccMail.Census.GOV>\n        echo i586-unisys-sysv4\n        exit 0 ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit 0 ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit 0 ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit 0 ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit 0 ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit 0 ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t        echo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t        echo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n        exit 0 ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit 0 ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit 0 ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit 0 ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit 0 ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit 0 ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit 0 ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit 0 ;;\n    *:Darwin:*:*)\n\techo `uname -p`-apple-darwin${UNAME_RELEASE}\n\texit 0 ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit 0 ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit 0 ;;\n    NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit 0 ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit 0 ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit 0 ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit 0 ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit 0 ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit 0 ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit 0 ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit 0 ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit 0 ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit 0 ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit 0 ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit 0 ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit 0 ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit 0 ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n          \"4\"\n#else\n\t  \"\"\n#endif\n         ); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0\nrm -f $dummy.c $dummy\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit 0 ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit 0 ;;\n    c34*)\n\techo c34-convex-bsd\n\texit 0 ;;\n    c38*)\n\techo c38-convex-bsd\n\texit 0 ;;\n    c4*)\n\techo c4-convex-bsd\n\texit 0 ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n    ftp://ftp.gnu.org/pub/gnu/config/\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "config.h.in",
    "content": "/* config.h.in.  Generated from configure.in by autoheader.  */\n\n/* CPU, vendor, and operating system */\n#undef CPU_VENDOR_OS\n\n/* Define to 1 if <netdb.h> defines struct addrinfo */\n#undef HAVE_ADDRINFO_STRUCT\n\n/* Define to 1 if you have the <arpa/inet.h> header file. */\n#undef HAVE_ARPA_INET_H\n\n/* Define to 1 if you have the `bzero' function. */\n#undef HAVE_BZERO\n\n/* Define to 1 if the /dev/streams/xtiso/tcp device exists */\n#undef HAVE_DEV_STREAMS_XTISO_TCP\n\n/* Define to 1 if the /dev/tcp device exists */\n#undef HAVE_DEV_TCP\n\n/* Define to 1 if the /dev/xti/tcp device exists */\n#undef HAVE_DEV_XTI_TCP\n\n/* Define to 1 if you have the <errno.h> header file. */\n#undef HAVE_ERRNO_H\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#undef HAVE_FCNTL_H\n\n/* Define to 1 if you have the `getaddrinfo' function. */\n#undef HAVE_GETADDRINFO\n\n/* define if getaddrinfo prototype is in <netdb.h> */\n#undef HAVE_GETADDRINFO_PROTO\n\n/* Define to 1 if you have the `gethostbyname2' function. */\n#undef HAVE_GETHOSTBYNAME2\n\n/* Define to 1 if you have the `gethostbyname_r' function. */\n#undef HAVE_GETHOSTBYNAME_R\n\n/* Define to 1 if you have the `gethostname' function. */\n#undef HAVE_GETHOSTNAME\n\n/* define if gethostname prototype is in <unistd.h> */\n#undef HAVE_GETHOSTNAME_PROTO\n\n/* Define to 1 if you have the `getnameinfo' function. */\n#undef HAVE_GETNAMEINFO\n\n/* define if getnameinfo prototype is in <netdb.h> */\n#undef HAVE_GETNAMEINFO_PROTO\n\n/* define if getrusage prototype is in <sys/resource.h> */\n#undef HAVE_GETRUSAGE_PROTO\n\n/* Define to 1 if you have the `hstrerror' function. */\n#undef HAVE_HSTRERROR\n\n/* define if hstrerror prototype is in <netdb.h> */\n#undef HAVE_HSTRERROR_PROTO\n\n/* Define to 1 if <net/if.h> defines struct if_nameindex */\n#undef HAVE_IF_NAMEINDEX_STRUCT\n\n/* Define to 1 if you have the `if_nametoindex' function. */\n#undef HAVE_IF_NAMETOINDEX\n\n/* define if if_nametoindex prototype is in <net/if.h> */\n#undef HAVE_IF_NAMETOINDEX_PROTO\n\n/* Define to 1 if you have the `inet6_rth_init' function. */\n#undef HAVE_INET6_RTH_INIT\n\n/* Define to 1 if you have the `inet_aton' function. */\n#undef HAVE_INET_ATON\n\n/* define if inet_aton prototype is in <arpa/inet.h> */\n#undef HAVE_INET_ATON_PROTO\n\n/* Define to 1 if you have the `inet_pton' function. */\n#undef HAVE_INET_PTON\n\n/* define if inet_pton prototype is in <arpa/inet.h> */\n#undef HAVE_INET_PTON_PROTO\n\n/* Define to 1 if you have the `kevent' function. */\n#undef HAVE_KEVENT\n\n/* Define to 1 if you have the `kqueue' function. */\n#undef HAVE_KQUEUE\n\n/* Define to 1 if you have the `nsl' library (-lnsl). */\n#undef HAVE_LIBNSL\n\n/* Define to 1 if you have the `pthread' library (-lpthread). */\n#undef HAVE_LIBPTHREAD\n\n/* Define to 1 if you have the `pthreads' library (-lpthreads). */\n#undef HAVE_LIBPTHREADS\n\n/* Define to 1 if you have the `resolv' library (-lresolv). */\n#undef HAVE_LIBRESOLV\n\n/* Define to 1 if you have the `xti' library (-lxti). */\n#undef HAVE_LIBXTI\n\n/* Define to 1 if you have the `mkstemp' function. */\n#undef HAVE_MKSTEMP\n\n/* define if struct msghdr contains the msg_control member */\n#undef HAVE_MSGHDR_MSG_CONTROL\n\n/* Define to 1 if you have the <netconfig.h> header file. */\n#undef HAVE_NETCONFIG_H\n\n/* Define to 1 if you have the <netdb.h> header file. */\n#undef HAVE_NETDB_H\n\n/* Define to 1 if you have the <netdir.h> header file. */\n#undef HAVE_NETDIR_H\n\n/* Define to 1 if you have the <netinet/in.h> header file. */\n#undef HAVE_NETINET_IN_H\n\n/* Define to 1 if you have the <net/if_dl.h> header file. */\n#undef HAVE_NET_IF_DL_H\n\n/* Define to 1 if you have the `poll' function. */\n#undef HAVE_POLL\n\n/* Define to 1 if you have the <poll.h> header file. */\n#undef HAVE_POLL_H\n\n/* Define to 1 if you have the `pselect' function. */\n#undef HAVE_PSELECT\n\n/* define if pselect prototype is in <sys/stat.h> */\n#undef HAVE_PSELECT_PROTO\n\n/* Define to 1 if you have the <pthread.h> header file. */\n#undef HAVE_PTHREAD_H\n\n/* Define to 1 if you have the <signal.h> header file. */\n#undef HAVE_SIGNAL_H\n\n/* Define to 1 if you have the `snprintf' function. */\n#undef HAVE_SNPRINTF\n\n/* define if snprintf prototype is in <stdio.h> */\n#undef HAVE_SNPRINTF_PROTO\n\n/* Define to 1 if <net/if_dl.h> defines struct sockaddr_dl */\n#undef HAVE_SOCKADDR_DL_STRUCT\n\n/* define if socket address structures have length fields */\n#undef HAVE_SOCKADDR_SA_LEN\n\n/* Define to 1 if you have the `sockatmark' function. */\n#undef HAVE_SOCKATMARK\n\n/* define if sockatmark prototype is in <sys/socket.h> */\n#undef HAVE_SOCKATMARK_PROTO\n\n/* Define to 1 if you have the <stdio.h> header file. */\n#undef HAVE_STDIO_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <stropts.h> header file. */\n#undef HAVE_STROPTS_H\n\n/* Define to 1 if `ifr_mtu' is member of `struct ifreq'. */\n#undef HAVE_STRUCT_IFREQ_IFR_MTU\n\n/* Define to 1 if the system has the type `struct sockaddr_storage'. */\n#undef HAVE_STRUCT_SOCKADDR_STORAGE\n\n/* Define to 1 if you have the <sys/event.h> header file. */\n#undef HAVE_SYS_EVENT_H\n\n/* Define to 1 if you have the <sys/filio.h> header file. */\n#undef HAVE_SYS_FILIO_H\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#undef HAVE_SYS_IOCTL_H\n\n/* Define to 1 if you have the <sys/param.h> header file. */\n#undef HAVE_SYS_PARAM_H\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#undef HAVE_SYS_SELECT_H\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#undef HAVE_SYS_SOCKET_H\n\n/* Define to 1 if you have the <sys/sockio.h> header file. */\n#undef HAVE_SYS_SOCKIO_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/sysctl.h> header file. */\n#undef HAVE_SYS_SYSCTL_H\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#undef HAVE_SYS_TIME_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <sys/uio.h> header file. */\n#undef HAVE_SYS_UIO_H\n\n/* Define to 1 if you have the <sys/un.h> header file. */\n#undef HAVE_SYS_UN_H\n\n/* Define to 1 if you have the <sys/wait.h> header file. */\n#undef HAVE_SYS_WAIT_H\n\n/* Define to 1 if <time.h> or <sys/time.h> defines struct timespec */\n#undef HAVE_TIMESPEC_STRUCT\n\n/* Define to 1 if you have the <time.h> header file. */\n#undef HAVE_TIME_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if you have the `vsnprintf' function. */\n#undef HAVE_VSNPRINTF\n\n/* Define to 1 if you have the <xti.h> header file. */\n#undef HAVE_XTI_H\n\n/* Define to 1 if you have the <xti_inet.h> header file. */\n#undef HAVE_XTI_INET_H\n\n/* Define to 1 if the system supports IPv4 */\n#undef IPV4\n\n/* Define to 1 if the system supports IPv6 */\n#undef IPV6\n\n/* Define to 1 if the system supports IPv4 */\n#undef IPv4\n\n/* Define to 1 if the system supports IPv6 */\n#undef IPv6\n\n/* Define to 1 if the system supports IP Multicast */\n#undef MCAST\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* the size of the sa_family field in a socket address structure */\n#undef SA_FAMILY_T\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */\n#undef TIME_WITH_SYS_TIME\n\n/* Define to 1 if the system supports UNIX domain sockets */\n#undef UNIXDOMAIN\n\n/* Define to 1 if the system supports UNIX domain sockets */\n#undef UNIXdomain\n\n/* 16 bit signed type */\n#undef int16_t\n\n/* 32 bit signed type */\n#undef int32_t\n\n/* the type of the sa_family struct member */\n#undef sa_family_t\n\n/* unsigned integer type of the result of the sizeof operator */\n#undef size_t\n\n/* a type appropriate for address */\n#undef socklen_t\n\n/* define to __ss_family if sockaddr_storage has that instead of ss_family */\n#undef ss_family\n\n/* a signed type appropriate for a count of bytes or an error indication */\n#undef ssize_t\n\n/* scalar type */\n#undef t_scalar_t\n\n/* unsigned scalar type */\n#undef t_uscalar_t\n\n/* 16 bit unsigned type */\n#undef uint16_t\n\n/* 32 bit unsigned type */\n#undef uint32_t\n\n/* 8-bit unsigned type */\n#undef uint8_t\n"
  },
  {
    "path": "config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002 Free Software Foundation, Inc.\n\ntimestamp='2002-03-07'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330,\n# Boston, MA 02111-1307, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit 0 ;;\n    --version | -v )\n       echo \"$version\" ; exit 0 ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit 0 ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit 0;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n \t-chorusrdb)\n \t\tos=-chorusrdb\n\t\tbasic_machine=$1\n \t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dsp16xx \\\n\t| fr30 \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| m32r | m68000 | m68k | m88k | mcore \\\n\t| mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \\\n\t| mips64vr4100 | mips64vr4100el | mips64vr4300 \\\n\t| mips64vr4300el | mips64vr5000 | mips64vr5000el \\\n\t| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \\\n\t| mipsisa32 | mipsisa64 \\\n\t| mn10200 | mn10300 \\\n\t| ns16k | ns32k \\\n\t| openrisc | or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \\\n\t| pyramid \\\n\t| sh | sh[34] | sh[34]eb | shbe | shle | sh64 \\\n\t| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \\\n\t| strongarm \\\n\t| tahoe | thumb | tic80 | tron \\\n\t| v850 | v850e \\\n\t| we32k \\\n\t| x86 | xscale | xstormy16 | xtensa \\\n\t| z8k)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12)\n\t\t# Motorola 68HC11/12.\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armv*-* \\\n\t| avr-* \\\n\t| bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c54x-* \\\n\t| clipper-* | cydra-* \\\n\t| d10v-* | d30v-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fr30-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| m32r-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | mcore-* \\\n\t| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \\\n\t| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \\\n\t| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \\\n\t| pyramid-* \\\n\t| romp-* | rs6000-* \\\n\t| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \\\n\t| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \\\n\t| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \\\n\t| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \\\n\t| v850-* | v850e-* | vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \\\n\t| xtensa-* \\\n\t| ymp-* \\\n\t| z8k-*)\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n# I'm not sure what \"Sysv32\" means.  Should this be sysv3.2?\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmmix*)\n\t\tbasic_machine=mmix-knuth\n\t\tos=-mmixware\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\tor32 | or32-*)\n\t\tbasic_machine=or32-unknown\n\t\tos=-coff\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n        pc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc)\tbasic_machine=powerpc-unknown\n\t        ;;\n\tppc-*)\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t        ;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t        ;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t        ;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n        sv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3d)\n\t\tbasic_machine=alpha-cray\n\t\tos=-unicos\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttic54x | c54x*)\n\t\tbasic_machine=tic54x-unknown\n\t\tos=-coff\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n               basic_machine=f301-fujitsu\n               ;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\twindows32)\n\t\tbasic_machine=i386-pc\n\t\tos=-windows32-msvcrt\n\t\t;;\n        xps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh3 | sh4 | sh3eb | sh4eb)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparc | sparcv9 | sparcv9b)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n        cydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\tc4x*)\n\t\tbasic_machine=c4x-none\n\t\tos=-coff\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n        # First match some system type aliases\n        # that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \\\n\t      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* \\\n\t      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto*)\n\t\tos=-nto-qnx\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t        os=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t        os=-mint\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n        pdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t# This also exists in the configure program, but was not the\n\t\t# default.\n\t\t# os=-sunos4\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n        *-gould)\n\t\tos=-sysv\n\t\t;;\n        *-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n        *-sgi)\n\t\tos=-irix\n\t\t;;\n        *-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "configure",
    "content": "#! /bin/sh\n# From configure.in Revision: 1.13 .\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.57.\n#\n# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002\n# Free Software Foundation, Inc.\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## --------------------- ##\n## M4sh Initialization.  ##\n## --------------------- ##\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\nelif test -n \"${BASH_VERSION+set}\" && (set -o posix) >/dev/null 2>&1; then\n  set -o posix\nfi\n\n# Support unset when possible.\nif (FOO=FOO; unset FOO) >/dev/null 2>&1; then\n  as_unset=unset\nelse\n  as_unset=false\nfi\n\n\n# Work around bugs in pre-3.0 UWIN ksh.\n$as_unset ENV MAIL MAILPATH\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nfor as_var in \\\n  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \\\n  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \\\n  LC_TELEPHONE LC_TIME\ndo\n  if (set +x; test -n \"`(eval $as_var=C; export $as_var) 2>&1`\"); then\n    eval $as_var=C; export $as_var\n  else\n    $as_unset $as_var\n  fi\ndone\n\n# Required to use basename.\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename /) >/dev/null 2>&1 && test \"X`basename / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\n\n# Name of the executable.\nas_me=`$as_basename \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)$' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n\n\n# PATH needs CR, and LINENO needs CR and PATH.\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  echo \"#! /bin/sh\" >conf$$.sh\n  echo  \"exit 0\"   >>conf$$.sh\n  chmod +x conf$$.sh\n  if (PATH=\"/nonexistent;.\"; conf$$.sh) >/dev/null 2>&1; then\n    PATH_SEPARATOR=';'\n  else\n    PATH_SEPARATOR=:\n  fi\n  rm -f conf$$.sh\nfi\n\n\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\"  || {\n  # Find who we are.  Look in the path if we contain no path at all\n  # relative or not.\n  case $0 in\n    *[\\\\/]* ) as_myself=$0 ;;\n    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\ndone\n\n       ;;\n  esac\n  # We did not find ourselves, most probably we were run as `sh COMMAND'\n  # in which case we are not to be found in the path.\n  if test \"x$as_myself\" = x; then\n    as_myself=$0\n  fi\n  if test ! -f \"$as_myself\"; then\n    { echo \"$as_me: error: cannot find myself; rerun with an absolute path\" >&2\n   { (exit 1); exit 1; }; }\n  fi\n  case $CONFIG_SHELL in\n  '')\n    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for as_base in sh bash ksh sh5; do\n\t case $as_dir in\n\t /*)\n\t   if (\"$as_dir/$as_base\" -c '\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\" ') 2>/dev/null; then\n\t     $as_unset BASH_ENV || test \"${BASH_ENV+set}\" != set || { BASH_ENV=; export BASH_ENV; }\n\t     $as_unset ENV || test \"${ENV+set}\" != set || { ENV=; export ENV; }\n\t     CONFIG_SHELL=$as_dir/$as_base\n\t     export CONFIG_SHELL\n\t     exec \"$CONFIG_SHELL\" \"$0\" ${1+\"$@\"}\n\t   fi;;\n\t esac\n       done\ndone\n;;\n  esac\n\n  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO\n  # uniformly replaced by the line number.  The first 'sed' inserts a\n  # line-number line before each line; the second 'sed' does the real\n  # work.  The second script uses 'N' to pair each line-number line\n  # with the numbered line, and appends trailing '-' during\n  # substitution so that $LINENO is not a special case at line end.\n  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the\n  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)\n  sed '=' <$as_myself |\n    sed '\n      N\n      s,$,-,\n      : loop\n      s,^\\(['$as_cr_digits']*\\)\\(.*\\)[$]LINENO\\([^'$as_cr_alnum'_]\\),\\1\\2\\1\\3,\n      t loop\n      s,-$,,\n      s,^['$as_cr_digits']*\\n,,\n    ' >$as_me.lineno &&\n  chmod +x $as_me.lineno ||\n    { echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2\n   { (exit 1); exit 1; }; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensible to this).\n  . ./$as_me.lineno\n  # Exit status is that of the last command.\n  exit\n}\n\n\ncase `echo \"testing\\c\"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in\n  *c*,-n*) ECHO_N= ECHO_C='\n' ECHO_T='\t' ;;\n  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;\n  *)       ECHO_N= ECHO_C='\\c' ECHO_T= ;;\nesac\n\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nrm -f conf$$ conf$$.exe conf$$.file\necho >conf$$.file\nif ln -s conf$$.file conf$$ 2>/dev/null; then\n  # We could just check for DJGPP; but this test a) works b) is more generic\n  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).\n  if test -f conf$$.exe; then\n    # Don't use ln at all; we don't have any links\n    as_ln_s='cp -p'\n  else\n    as_ln_s='ln -s'\n  fi\nelif ln conf$$.file conf$$ 2>/dev/null; then\n  as_ln_s=ln\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.file\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p=:\nelse\n  as_mkdir_p=false\nfi\n\nas_executable_p=\"test -f\"\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g\"\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.\nas_nl='\n'\nIFS=\" \t$as_nl\"\n\n# CDPATH.\n$as_unset CDPATH\n\n\n# Name of the host.\n# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\nexec 6>&1\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_config_libobj_dir=.\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n# Maximum number of lines to put in a shell here document.\n# This variable seems obsolete.  It should probably be removed, and\n# only ac_max_sed_lines should be used.\n: ${ac_max_here_lines=38}\n\n# Identity of this package.\nPACKAGE_NAME=\nPACKAGE_TARNAME=\nPACKAGE_VERSION=\nPACKAGE_STRING=\nPACKAGE_BUGREPORT=\n\nac_unique_file=\"lib/unp.h\"\nac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB CPP EGREP LIB_OBJS LIBFREE_OBJS LIBGAI_OBJS LIBROUTE_OBJS LIBXTI_OBJS LIBS_XTI LIBUNP LIBUNPXTI LIBUNP_NAME LIBUNPXTI_NAME LIBOBJS LTLIBOBJS'\nac_subst_files=''\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatadir='${prefix}/share'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nlibdir='${exec_prefix}/lib'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ninfodir='${prefix}/info'\nmandir='${prefix}/man'\n\nac_prev=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval \"$ac_prev=\\$ac_option\"\n    ac_prev=\n    continue\n  fi\n\n  ac_optarg=`expr \"x$ac_option\" : 'x[^=]*=\\(.*\\)'`\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_option in\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \\\n  | --da=*)\n    datadir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_feature=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_feature\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid feature name: $ac_feature\" >&2\n   { (exit 1); exit 1; }; }\n    ac_feature=`echo $ac_feature | sed 's/-/_/g'`\n    eval \"enable_$ac_feature=no\" ;;\n\n  -enable-* | --enable-*)\n    ac_feature=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_feature\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid feature name: $ac_feature\" >&2\n   { (exit 1); exit 1; }; }\n    ac_feature=`echo $ac_feature | sed 's/-/_/g'`\n    case $ac_option in\n      *=*) ac_optarg=`echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n      *) ac_optarg=yes ;;\n    esac\n    eval \"enable_$ac_feature='$ac_optarg'\" ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst \\\n  | --locals | --local | --loca | --loc | --lo)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* \\\n  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_package=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_package\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid package name: $ac_package\" >&2\n   { (exit 1); exit 1; }; }\n    ac_package=`echo $ac_package| sed 's/-/_/g'`\n    case $ac_option in\n      *=*) ac_optarg=`echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n      *) ac_optarg=yes ;;\n    esac\n    eval \"with_$ac_package='$ac_optarg'\" ;;\n\n  -without-* | --without-*)\n    ac_package=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_package\" : \".*[^-_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid package name: $ac_package\" >&2\n   { (exit 1); exit 1; }; }\n    ac_package=`echo $ac_package | sed 's/-/_/g'`\n    eval \"with_$ac_package=no\" ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) { echo \"$as_me: error: unrecognized option: $ac_option\nTry \\`$0 --help' for more information.\" >&2\n   { (exit 1); exit 1; }; }\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_envvar\" : \".*[^_$as_cr_alnum]\" >/dev/null &&\n      { echo \"$as_me: error: invalid variable name: $ac_envvar\" >&2\n   { (exit 1); exit 1; }; }\n    ac_optarg=`echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`\n    eval \"$ac_envvar='$ac_optarg'\"\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  { echo \"$as_me: error: missing argument to $ac_option\" >&2\n   { (exit 1); exit 1; }; }\nfi\n\n# Be sure to have absolute paths.\nfor ac_var in exec_prefix prefix\ndo\n  eval ac_val=$`echo $ac_var`\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* | NONE | '' ) ;;\n    *)  { echo \"$as_me: error: expected an absolute directory name for --$ac_var: $ac_val\" >&2\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n# Be sure to have absolute paths.\nfor ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \\\n              localstatedir libdir includedir oldincludedir infodir mandir\ndo\n  eval ac_val=$`echo $ac_var`\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* ) ;;\n    *)  { echo \"$as_me: error: expected an absolute directory name for --$ac_var: $ac_val\" >&2\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    echo \"$as_me: WARNING: If you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used.\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then its parent.\n  ac_confdir=`(dirname \"$0\") 2>/dev/null ||\n$as_expr X\"$0\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n         X\"$0\" : 'X\\(//\\)[^/]' \\| \\\n         X\"$0\" : 'X\\(//\\)$' \\| \\\n         X\"$0\" : 'X\\(/\\)' \\| \\\n         .     : '\\(.\\)' 2>/dev/null ||\necho X\"$0\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r $srcdir/$ac_unique_file; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r $srcdir/$ac_unique_file; then\n  if test \"$ac_srcdir_defaulted\" = yes; then\n    { echo \"$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or ..\" >&2\n   { (exit 1); exit 1; }; }\n  else\n    { echo \"$as_me: error: cannot find sources ($ac_unique_file) in $srcdir\" >&2\n   { (exit 1); exit 1; }; }\n  fi\nfi\n(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||\n  { echo \"$as_me: error: sources are in $srcdir, but \\`cd $srcdir' does not work\" >&2\n   { (exit 1); exit 1; }; }\nsrcdir=`echo \"$srcdir\" | sed 's%\\([^\\\\/]\\)[\\\\/]*$%\\1%'`\nac_env_build_alias_set=${build_alias+set}\nac_env_build_alias_value=$build_alias\nac_cv_env_build_alias_set=${build_alias+set}\nac_cv_env_build_alias_value=$build_alias\nac_env_host_alias_set=${host_alias+set}\nac_env_host_alias_value=$host_alias\nac_cv_env_host_alias_set=${host_alias+set}\nac_cv_env_host_alias_value=$host_alias\nac_env_target_alias_set=${target_alias+set}\nac_env_target_alias_value=$target_alias\nac_cv_env_target_alias_set=${target_alias+set}\nac_cv_env_target_alias_value=$target_alias\nac_env_CC_set=${CC+set}\nac_env_CC_value=$CC\nac_cv_env_CC_set=${CC+set}\nac_cv_env_CC_value=$CC\nac_env_CFLAGS_set=${CFLAGS+set}\nac_env_CFLAGS_value=$CFLAGS\nac_cv_env_CFLAGS_set=${CFLAGS+set}\nac_cv_env_CFLAGS_value=$CFLAGS\nac_env_LDFLAGS_set=${LDFLAGS+set}\nac_env_LDFLAGS_value=$LDFLAGS\nac_cv_env_LDFLAGS_set=${LDFLAGS+set}\nac_cv_env_LDFLAGS_value=$LDFLAGS\nac_env_CPPFLAGS_set=${CPPFLAGS+set}\nac_env_CPPFLAGS_value=$CPPFLAGS\nac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}\nac_cv_env_CPPFLAGS_value=$CPPFLAGS\nac_env_CPP_set=${CPP+set}\nac_env_CPP_value=$CPP\nac_cv_env_CPP_set=${CPP+set}\nac_cv_env_CPP_value=$CPP\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures this package to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\n_ACEOF\n\n  cat <<_ACEOF\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR           user executables [EPREFIX/bin]\n  --sbindir=DIR          system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR       program executables [EPREFIX/libexec]\n  --datadir=DIR          read-only architecture-independent data [PREFIX/share]\n  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]\n  --libdir=DIR           object code libraries [EPREFIX/lib]\n  --includedir=DIR       C header files [PREFIX/include]\n  --oldincludedir=DIR    C header files for non-gcc [/usr/include]\n  --infodir=DIR          info documentation [PREFIX/info]\n  --mandir=DIR           man documentation [PREFIX/man]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n\n  cat <<\\_ACEOF\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have\n              headers in a nonstandard directory <include dir>\n  CPP         C preprocessor\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\n_ACEOF\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  ac_popdir=`pwd`\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d $ac_dir || continue\n    ac_builddir=.\n\nif test \"$ac_dir\" != .; then\n  ac_dir_suffix=/`echo \"$ac_dir\" | sed 's,^\\.[\\\\/],,'`\n  # A \"../\" for each directory in $ac_dir_suffix.\n  ac_top_builddir=`echo \"$ac_dir_suffix\" | sed 's,/[^\\\\/]*,../,g'`\nelse\n  ac_dir_suffix= ac_top_builddir=\nfi\n\ncase $srcdir in\n  .)  # No --srcdir option.  We are building in place.\n    ac_srcdir=.\n    if test -z \"$ac_top_builddir\"; then\n       ac_top_srcdir=.\n    else\n       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`\n    fi ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute path.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir ;;\n  *) # Relative path.\n    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_builddir$srcdir ;;\nesac\n# Don't blindly perform a `cd \"$ac_dir\"/$ac_foo && pwd` since $ac_foo can be\n# absolute.\nac_abs_builddir=`cd \"$ac_dir\" && cd $ac_builddir && pwd`\nac_abs_top_builddir=`cd \"$ac_dir\" && cd ${ac_top_builddir}. && pwd`\nac_abs_srcdir=`cd \"$ac_dir\" && cd $ac_srcdir && pwd`\nac_abs_top_srcdir=`cd \"$ac_dir\" && cd $ac_top_srcdir && pwd`\n\n    cd $ac_dir\n    # Check for guested configure; otherwise get Cygnus style configure.\n    if test -f $ac_srcdir/configure.gnu; then\n      echo\n      $SHELL $ac_srcdir/configure.gnu  --help=recursive\n    elif test -f $ac_srcdir/configure; then\n      echo\n      $SHELL $ac_srcdir/configure  --help=recursive\n    elif test -f $ac_srcdir/configure.ac ||\n           test -f $ac_srcdir/configure.in; then\n      echo\n      $ac_configure --help\n    else\n      echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi\n    cd $ac_popdir\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit 0\nif $ac_init_version; then\n  cat <<\\_ACEOF\n\nCopyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002\nFree Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit 0\nfi\nexec 5>config.log\ncat >&5 <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by $as_me, which was\ngenerated by GNU Autoconf 2.57.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\nhostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  echo \"PATH: $as_dir\"\ndone\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_sep=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\" \"*|*\"\t\"*|*[\\[\\]\\~\\#\\$\\^\\&\\*\\(\\)\\{\\}\\\\\\|\\;\\<\\>\\?\\\"\\']*)\n      ac_arg=`echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) ac_configure_args0=\"$ac_configure_args0 '$ac_arg'\" ;;\n    2)\n      ac_configure_args1=\"$ac_configure_args1 '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n        ac_must_keep_next=false # Got value, back to normal.\n      else\n        case $ac_arg in\n          *=* | --config-cache | -C | -disable-* | --disable-* \\\n          | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n          | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n          | -with-* | --with-* | -without-* | --without-* | --x)\n            case \"$ac_configure_args0 \" in\n              \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n            esac\n            ;;\n          -* ) ac_must_keep_next=true ;;\n        esac\n      fi\n      ac_configure_args=\"$ac_configure_args$ac_sep'$ac_arg'\"\n      # Get rid of the leading space.\n      ac_sep=\" \"\n      ;;\n    esac\n  done\ndone\n$as_unset ac_configure_args0 || test \"${ac_configure_args0+set}\" != set || { ac_configure_args0=; export ac_configure_args0; }\n$as_unset ac_configure_args1 || test \"${ac_configure_args1+set}\" != set || { ac_configure_args1=; export ac_configure_args1; }\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Be sure not to use single quotes in there, as some shells,\n# such as our DU 5.0 friend, will then `close' the trap.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    cat <<\\_ASBOX\n## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\n_ASBOX\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n{\n  (set) 2>&1 |\n    case `(ac_space='\"'\"' '\"'\"'; set | grep ac_space) 2>&1` in\n    *ac_space=\\ *)\n      sed -n \\\n        \"s/'\"'\"'/'\"'\"'\\\\\\\\'\"'\"''\"'\"'/g;\n    \t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\"'\"'\\\\2'\"'\"'/p\"\n      ;;\n    *)\n      sed -n \\\n        \"s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1=\\\\2/p\"\n      ;;\n    esac;\n}\n    echo\n\n    cat <<\\_ASBOX\n## ----------------- ##\n## Output variables. ##\n## ----------------- ##\n_ASBOX\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=$`echo $ac_var`\n      echo \"$ac_var='\"'\"'$ac_val'\"'\"'\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      cat <<\\_ASBOX\n## ------------- ##\n## Output files. ##\n## ------------- ##\n_ASBOX\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=$`echo $ac_var`\n        echo \"$ac_var='\"'\"'$ac_val'\"'\"'\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      cat <<\\_ASBOX\n## ----------- ##\n## confdefs.h. ##\n## ----------- ##\n_ASBOX\n      echo\n      sed \"/^$/d\" confdefs.h | sort\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      echo \"$as_me: caught signal $ac_signal\"\n    echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core core.* *.core &&\n  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n     ' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -rf conftest* confdefs.h\n# AIX cpp loses on an empty file, so make sure it contains at least a newline.\necho >confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer explicitly selected file to automatically selected ones.\nif test -z \"$CONFIG_SITE\"; then\n  if test \"x$prefix\" != xNONE; then\n    CONFIG_SITE=\"$prefix/share/config.site $prefix/etc/config.site\"\n  else\n    CONFIG_SITE=\"$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site\"\n  fi\nfi\nfor ac_site_file in $CONFIG_SITE; do\n  if test -r \"$ac_site_file\"; then\n    { echo \"$as_me:$LINENO: loading site script $ac_site_file\" >&5\necho \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\"\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special\n  # files actually), so we avoid doing that.\n  if test -f \"$cache_file\"; then\n    { echo \"$as_me:$LINENO: loading cache $cache_file\" >&5\necho \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . $cache_file;;\n      *)                      . ./$cache_file;;\n    esac\n  fi\nelse\n  { echo \"$as_me:$LINENO: creating cache $cache_file\" >&5\necho \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in `(set) 2>&1 |\n               sed -n 's/^ac_env_\\([a-zA-Z_0-9]*\\)_set=.*/\\1/p'`; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\"\\$ac_cv_env_${ac_var}_value\"\n  eval ac_new_val=\"\\$ac_env_${ac_var}_value\"\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { echo \"$as_me:$LINENO: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\necho \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { echo \"$as_me:$LINENO: error: \\`$ac_var' was not set in the previous run\" >&5\necho \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n        { echo \"$as_me:$LINENO: error: \\`$ac_var' has changed since the previous run:\" >&5\necho \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n        { echo \"$as_me:$LINENO:   former value:  $ac_old_val\" >&5\necho \"$as_me:   former value:  $ac_old_val\" >&2;}\n        { echo \"$as_me:$LINENO:   current value: $ac_new_val\" >&5\necho \"$as_me:   current value: $ac_new_val\" >&2;}\n        ac_cache_corrupted=:\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\" \"*|*\"\t\"*|*[\\[\\]\\~\\#\\$\\^\\&\\*\\(\\)\\{\\}\\\\\\|\\;\\<\\>\\?\\\"\\']*)\n      ac_arg=$ac_var=`echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) ac_configure_args=\"$ac_configure_args '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { echo \"$as_me:$LINENO: error: changes in the environment can compromise the build\" >&5\necho \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  { { echo \"$as_me:$LINENO: error: run \\`make distclean' and/or \\`rm $cache_file' and start over\" >&5\necho \"$as_me: error: run \\`make distclean' and/or \\`rm $cache_file' and start over\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nac_aux_dir=\nfor ac_dir in $srcdir $srcdir/.. $srcdir/../..; do\n  if test -f $ac_dir/install-sh; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f $ac_dir/install.sh; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f $ac_dir/shtool; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  { { echo \"$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../..\" >&5\necho \"$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../..\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"\nac_configure=\"$SHELL $ac_aux_dir/configure\" # This should be Cygnus configure.\n\n# Make sure we can run config.sub.\n$ac_config_sub sun4 >/dev/null 2>&1 ||\n  { { echo \"$as_me:$LINENO: error: cannot run $ac_config_sub\" >&5\necho \"$as_me: error: cannot run $ac_config_sub\" >&2;}\n   { (exit 1); exit 1; }; }\n\necho \"$as_me:$LINENO: checking build system type\" >&5\necho $ECHO_N \"checking build system type... $ECHO_C\" >&6\nif test \"${ac_cv_build+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_cv_build_alias=$build_alias\ntest -z \"$ac_cv_build_alias\" &&\n  ac_cv_build_alias=`$ac_config_guess`\ntest -z \"$ac_cv_build_alias\" &&\n  { { echo \"$as_me:$LINENO: error: cannot guess build type; you must specify one\" >&5\necho \"$as_me: error: cannot guess build type; you must specify one\" >&2;}\n   { (exit 1); exit 1; }; }\nac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||\n  { { echo \"$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed\" >&5\necho \"$as_me: error: $ac_config_sub $ac_cv_build_alias failed\" >&2;}\n   { (exit 1); exit 1; }; }\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_build\" >&5\necho \"${ECHO_T}$ac_cv_build\" >&6\nbuild=$ac_cv_build\nbuild_cpu=`echo $ac_cv_build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nbuild_vendor=`echo $ac_cv_build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nbuild_os=`echo $ac_cv_build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\n\necho \"$as_me:$LINENO: checking host system type\" >&5\necho $ECHO_N \"checking host system type... $ECHO_C\" >&6\nif test \"${ac_cv_host+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_cv_host_alias=$host_alias\ntest -z \"$ac_cv_host_alias\" &&\n  ac_cv_host_alias=$ac_cv_build_alias\nac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||\n  { { echo \"$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed\" >&5\necho \"$as_me: error: $ac_config_sub $ac_cv_host_alias failed\" >&2;}\n   { (exit 1); exit 1; }; }\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_host\" >&5\necho \"${ECHO_T}$ac_cv_host\" >&6\nhost=$ac_cv_host\nhost_cpu=`echo $ac_cv_host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nhost_vendor=`echo $ac_cv_host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nhost_os=`echo $ac_cv_host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\n\n          ac_config_headers=\"$ac_config_headers config.h\"\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define CPU_VENDOR_OS \"$host\"\n_ACEOF\n\n\n\ncase \"$host_os\" in\n*aix*)\t\tCPPFLAGS=\"$CPPFLAGS -D_ALL_SOURCE\" ;;\n*osf*)\t\tCPPFLAGS=\"$CPPFLAGS -D_SOCKADDR_LEN\" ;;\nesac\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\necho \"${ECHO_T}$ac_ct_CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  CC=$ac_ct_CC\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"cc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\necho \"${ECHO_T}$ac_ct_CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  CC=$ac_ct_CC\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  echo \"$as_me:$LINENO: result: $CC\" >&5\necho \"${ECHO_T}$CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_CC\" >&5\necho \"${ECHO_T}$ac_ct_CC\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  CC=$ac_ct_CC\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { echo \"$as_me:$LINENO: error: no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\n\n# Provide some information about the compiler.\necho \"$as_me:$LINENO:\" \\\n     \"checking for C compiler version\" >&5\nac_compiler=`set X $ac_compile; echo $2`\n{ (eval echo \"$as_me:$LINENO: \\\"$ac_compiler --version </dev/null >&5\\\"\") >&5\n  (eval $ac_compiler --version </dev/null >&5) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (eval echo \"$as_me:$LINENO: \\\"$ac_compiler -v </dev/null >&5\\\"\") >&5\n  (eval $ac_compiler -v </dev/null >&5) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n{ (eval echo \"$as_me:$LINENO: \\\"$ac_compiler -V </dev/null >&5\\\"\") >&5\n  (eval $ac_compiler -V </dev/null >&5) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }\n\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\necho \"$as_me:$LINENO: checking for C compiler default output\" >&5\necho $ECHO_N \"checking for C compiler default output... $ECHO_C\" >&6\nac_link_default=`echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link_default\\\"\") >&5\n  (eval $ac_link_default) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  # Find the output, starting from the most likely.  This scheme is\n# not robust to junk in `.', hence go to wildcards (a.*) only as a last\n# resort.\n\n# Be careful to initialize this variable, since it used to be cached.\n# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.\nac_cv_exeext=\n# b.out is created by i960 compilers.\nfor ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )\n        ;;\n    conftest.$ac_ext )\n        # This is the source file.\n        ;;\n    [ab].out )\n        # We found the default executable, but exeext='' is most\n        # certainly right.\n        break;;\n    *.* )\n        ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n        # FIXME: I believe we export ac_cv_exeext for Libtool,\n        # but it would be cool to find out if it's true.  Does anybody\n        # maintain Libtool? --akim.\n        export ac_cv_exeext\n        break;;\n    * )\n        break;;\n  esac\ndone\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { echo \"$as_me:$LINENO: error: C compiler cannot create executables\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: C compiler cannot create executables\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 77); exit 77; }; }\nfi\n\nac_exeext=$ac_cv_exeext\necho \"$as_me:$LINENO: result: $ac_file\" >&5\necho \"${ECHO_T}$ac_file\" >&6\n\n# Check the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\necho \"$as_me:$LINENO: checking whether the C compiler works\" >&5\necho $ECHO_N \"checking whether the C compiler works... $ECHO_C\" >&6\n# FIXME: These cross compiler hacks should be removed for Autoconf 3.0\n# If not cross compiling, check that we can run a simple program.\nif test \"$cross_compiling\" != yes; then\n  if { ac_try='./$ac_file'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { echo \"$as_me:$LINENO: error: cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\n    fi\n  fi\nfi\necho \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\nrm -f a.out a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n# Check the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\necho \"$as_me:$LINENO: checking whether we are cross compiling\" >&5\necho $ECHO_N \"checking whether we are cross compiling... $ECHO_C\" >&6\necho \"$as_me:$LINENO: result: $cross_compiling\" >&5\necho \"${ECHO_T}$cross_compiling\" >&6\n\necho \"$as_me:$LINENO: checking for suffix of executables\" >&5\necho $ECHO_N \"checking for suffix of executables... $ECHO_C\" >&6\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n          export ac_cv_exeext\n          break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { echo \"$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nrm -f conftest$ac_cv_exeext\necho \"$as_me:$LINENO: result: $ac_cv_exeext\" >&5\necho \"${ECHO_T}$ac_cv_exeext\" >&6\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\necho \"$as_me:$LINENO: checking for suffix of object files\" >&5\necho $ECHO_N \"checking for suffix of object files... $ECHO_C\" >&6\nif test \"${ac_cv_objext+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; then\n  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { echo \"$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_objext\" >&5\necho \"${ECHO_T}$ac_cv_objext\" >&6\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\necho \"$as_me:$LINENO: checking whether we are using the GNU C compiler\" >&5\necho $ECHO_N \"checking whether we are using the GNU C compiler... $ECHO_C\" >&6\nif test \"${ac_cv_c_compiler_gnu+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_compiler_gnu=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_compiler_gnu=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_c_compiler_gnu\" >&5\necho \"${ECHO_T}$ac_cv_c_compiler_gnu\" >&6\nGCC=`test $ac_compiler_gnu = yes && echo yes`\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\nCFLAGS=\"-g\"\necho \"$as_me:$LINENO: checking whether $CC accepts -g\" >&5\necho $ECHO_N \"checking whether $CC accepts -g... $ECHO_C\" >&6\nif test \"${ac_cv_prog_cc_g+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_prog_cc_g=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_prog_cc_g=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_prog_cc_g\" >&5\necho \"${ECHO_T}$ac_cv_prog_cc_g\" >&6\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\necho \"$as_me:$LINENO: checking for $CC option to accept ANSI C\" >&5\necho $ECHO_N \"checking for $CC option to accept ANSI C... $ECHO_C\" >&6\nif test \"${ac_cv_prog_cc_stdc+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_cv_prog_cc_stdc=no\nac_save_CC=$CC\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\n# Don't try gcc -ansi; that turns off useful extensions and\n# breaks some systems' header files.\n# AIX\t\t\t-qlanglvl=ansi\n# Ultrix and OSF/1\t-std1\n# HP-UX 10.20 and later\t-Ae\n# HP-UX older versions\t-Aa -D_HPUX_SOURCE\n# SVR4\t\t\t-Xc -D__EXTENSIONS__\nfor ac_arg in \"\" -qlanglvl=ansi -std1 -Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  rm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_prog_cc_stdc=$ac_arg\nbreak\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.$ac_objext\ndone\nrm -f conftest.$ac_ext conftest.$ac_objext\nCC=$ac_save_CC\n\nfi\n\ncase \"x$ac_cv_prog_cc_stdc\" in\n  x|xno)\n    echo \"$as_me:$LINENO: result: none needed\" >&5\necho \"${ECHO_T}none needed\" >&6 ;;\n  *)\n    echo \"$as_me:$LINENO: result: $ac_cv_prog_cc_stdc\" >&5\necho \"${ECHO_T}$ac_cv_prog_cc_stdc\" >&6\n    CC=\"$CC $ac_cv_prog_cc_stdc\" ;;\nesac\n\n# Some people use a C++ compiler to compile C.  Since we use `exit',\n# in C++ we need to declare it.  In case someone uses the same compiler\n# for both compiling C and C++ we need to have the C++ compiler decide\n# the declaration of exit, since it's the most demanding environment.\ncat >conftest.$ac_ext <<_ACEOF\n#ifndef __cplusplus\n  choke me\n#endif\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  for ac_declaration in \\\n   ''\\\n   '#include <stdlib.h>' \\\n   'extern \"C\" void std::exit (int) throw (); using std::exit;' \\\n   'extern \"C\" void std::exit (int); using std::exit;' \\\n   'extern \"C\" void exit (int) throw ();' \\\n   'extern \"C\" void exit (int);' \\\n   'void exit (int);'\ndo\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdlib.h>\n$ac_declaration\nint\nmain ()\n{\nexit (42);\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  :\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncontinue\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n$ac_declaration\nint\nmain ()\n{\nexit (42);\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  break\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\ndone\nrm -f conftest*\nif test -n \"$ac_declaration\"; then\n  echo '#ifdef __cplusplus' >>confdefs.h\n  echo $ac_declaration      >>confdefs.h\n  echo '#endif'             >>confdefs.h\nfi\n\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_RANLIB+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  echo \"$as_me:$LINENO: result: $RANLIB\" >&5\necho \"${ECHO_T}$RANLIB\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\necho \"$as_me:$LINENO: checking for $ac_word\" >&5\necho $ECHO_N \"checking for $ac_word... $ECHO_C\" >&6\nif test \"${ac_cv_prog_ac_ct_RANLIB+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for ac_exec_ext in '' $ac_executable_extensions; do\n  if $as_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    echo \"$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\ndone\n\n  test -z \"$ac_cv_prog_ac_ct_RANLIB\" && ac_cv_prog_ac_ct_RANLIB=\":\"\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  echo \"$as_me:$LINENO: result: $ac_ct_RANLIB\" >&5\necho \"${ECHO_T}$ac_ct_RANLIB\" >&6\nelse\n  echo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\n  RANLIB=$ac_ct_RANLIB\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\n\n\n\necho \"$as_me:$LINENO: checking for pthread_create in -lpthread\" >&5\necho $ECHO_N \"checking for pthread_create in -lpthread... $ECHO_C\" >&6\nif test \"${ac_cv_lib_pthread_pthread_create+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lpthread  $LIBS\"\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar pthread_create ();\nint\nmain ()\n{\npthread_create ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_lib_pthread_pthread_create=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_lib_pthread_pthread_create=no\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\necho \"$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create\" >&5\necho \"${ECHO_T}$ac_cv_lib_pthread_pthread_create\" >&6\nif test $ac_cv_lib_pthread_pthread_create = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBPTHREAD 1\n_ACEOF\n\n  LIBS=\"-lpthread $LIBS\"\n\nfi\n\nif test \"$ac_cv_lib_pthread_pthread_create\" = yes ; then\n   CFLAGS=\"$CFLAGS -D_REENTRANT\"\nelse\n\necho \"$as_me:$LINENO: checking for pthread_create in -lpthreads\" >&5\necho $ECHO_N \"checking for pthread_create in -lpthreads... $ECHO_C\" >&6\nif test \"${ac_cv_lib_pthreads_pthread_create+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lpthreads  $LIBS\"\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar pthread_create ();\nint\nmain ()\n{\npthread_create ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_lib_pthreads_pthread_create=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_lib_pthreads_pthread_create=no\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\necho \"$as_me:$LINENO: result: $ac_cv_lib_pthreads_pthread_create\" >&5\necho \"${ECHO_T}$ac_cv_lib_pthreads_pthread_create\" >&6\nif test $ac_cv_lib_pthreads_pthread_create = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBPTHREADS 1\n_ACEOF\n\n  LIBS=\"-lpthreads $LIBS\"\n\nfi\n\n   if test \"$ac_cv_lib_pthreads_pthread_create\" = yes ; then\n      CFLAGS=\"$CFLAGS -D_REENTRANT\"\n   fi\nfi\n\n\necho \"$as_me:$LINENO: checking for t_open in -lnsl\" >&5\necho $ECHO_N \"checking for t_open in -lnsl... $ECHO_C\" >&6\nif test \"${ac_cv_lib_nsl_t_open+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lnsl  $LIBS\"\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar t_open ();\nint\nmain ()\n{\nt_open ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_lib_nsl_t_open=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_lib_nsl_t_open=no\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\necho \"$as_me:$LINENO: result: $ac_cv_lib_nsl_t_open\" >&5\necho \"${ECHO_T}$ac_cv_lib_nsl_t_open\" >&6\nif test $ac_cv_lib_nsl_t_open = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBNSL 1\n_ACEOF\n\n  LIBS=\"-lnsl $LIBS\"\n\nfi\n\necho \"$as_me:$LINENO: checking for library containing socket\" >&5\necho $ECHO_N \"checking for library containing socket... $ECHO_C\" >&6\nif test \"${ac_cv_search_socket+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\nac_cv_search_socket=no\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar socket ();\nint\nmain ()\n{\nsocket ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_search_socket=\"none required\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nif test \"$ac_cv_search_socket\" = no; then\n  for ac_lib in socket; do\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n    cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar socket ();\nint\nmain ()\n{\nsocket ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_search_socket=\"-l$ac_lib\"\nbreak\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\n  done\nfi\nLIBS=$ac_func_search_save_LIBS\nfi\necho \"$as_me:$LINENO: result: $ac_cv_search_socket\" >&5\necho \"${ECHO_T}$ac_cv_search_socket\" >&6\nif test \"$ac_cv_search_socket\" != no; then\n  test \"$ac_cv_search_socket\" = \"none required\" || LIBS=\"$ac_cv_search_socket $LIBS\"\n\nfi\n\n\necho \"$as_me:$LINENO: checking for /usr/local/bind/lib/libbind.a\" >&5\necho $ECHO_N \"checking for /usr/local/bind/lib/libbind.a... $ECHO_C\" >&6\nif test -f /usr/local/bind/lib/libbind.a ; then\n\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\tLIBS=\"/usr/local/bind/lib/libbind.a  $LIBS\"\nelse\n\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\techo \"$as_me:$LINENO: checking for $HOME/libbind.a\" >&5\necho $ECHO_N \"checking for $HOME/libbind.a... $ECHO_C\" >&6\n\tif test -f $HOME/libbind.a ; then\n\t\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\t\tLIBS=\"$HOME/libbind.a  $LIBS\"\n\telse\n\t\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\t\techo \"$as_me:$LINENO: checking for $HOME/libresolv.a\" >&5\necho $ECHO_N \"checking for $HOME/libresolv.a... $ECHO_C\" >&6\n\t\tif test -f $HOME/libresolv.a ; then\n\t\t\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\t\t\tLIBS=\"$HOME/libresolv.a  $LIBS\"\n\t\telse\n\t\t\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\necho \"$as_me:$LINENO: checking for res_init in -lresolv\" >&5\necho $ECHO_N \"checking for res_init in -lresolv... $ECHO_C\" >&6\nif test \"${ac_cv_lib_resolv_res_init+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lresolv  $LIBS\"\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar res_init ();\nint\nmain ()\n{\nres_init ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_lib_resolv_res_init=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_lib_resolv_res_init=no\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\necho \"$as_me:$LINENO: result: $ac_cv_lib_resolv_res_init\" >&5\necho \"${ECHO_T}$ac_cv_lib_resolv_res_init\" >&6\nif test $ac_cv_lib_resolv_res_init = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBRESOLV 1\n_ACEOF\n\n  LIBS=\"-lresolv $LIBS\"\n\nfi\n\n\t\tfi\n\tfi\nfi\n\n\necho \"$as_me:$LINENO: checking for t_open in -lxti\" >&5\necho $ECHO_N \"checking for t_open in -lxti... $ECHO_C\" >&6\nif test \"${ac_cv_lib_xti_t_open+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lxti  $LIBS\"\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar t_open ();\nint\nmain ()\n{\nt_open ();\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_lib_xti_t_open=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_lib_xti_t_open=no\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\necho \"$as_me:$LINENO: result: $ac_cv_lib_xti_t_open\" >&5\necho \"${ECHO_T}$ac_cv_lib_xti_t_open\" >&6\nif test $ac_cv_lib_xti_t_open = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBXTI 1\n_ACEOF\n\n  LIBS=\"-lxti $LIBS\"\n\nfi\n\n\necho \"$as_me:$LINENO: checking for $HOME/libunp.a\" >&5\necho $ECHO_N \"checking for $HOME/libunp.a... $ECHO_C\" >&6\nif test -f $HOME/libunp.a ; then\n\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\tLIBUNP=\"$HOME/libunp.a\"\n\tLIBUNP_NAME=$HOME/libunp.a\nelse\n\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\tLIBUNP=\"../libunp.a\"\n\tLIBUNP_NAME=../libunp.a\nfi\n\necho \"$as_me:$LINENO: checking for $HOME/libunpxti.a\" >&5\necho $ECHO_N \"checking for $HOME/libunpxti.a... $ECHO_C\" >&6\nif test -f $HOME/libunpxti.a ; then\n\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\tLIBUNPXTI=\"$HOME/libunpxti.a\"\n\tLIBUNPXTI_NAME=$HOME/libunpxti.a\nelse\n\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\tLIBUNPXTI=\"../libunpxti.a\"\n\tLIBUNPXTI_NAME=../libunpxti.a\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\necho \"$as_me:$LINENO: checking how to run the C preprocessor\" >&5\necho $ECHO_N \"checking how to run the C preprocessor... $ECHO_C\" >&6\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if test \"${ac_cv_prog_CPP+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n                     Syntax error\n_ACEOF\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_cpp conftest.$ac_ext\\\"\") >&5\n  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null; then\n  if test -s conftest.err; then\n    ac_cpp_err=$ac_c_preproc_warn_flag\n  else\n    ac_cpp_err=\n  fi\nelse\n  ac_cpp_err=yes\nfi\nif test -z \"$ac_cpp_err\"; then\n  :\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether non-existent headers\n  # can be detected and how.\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_cpp conftest.$ac_ext\\\"\") >&5\n  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null; then\n  if test -s conftest.err; then\n    ac_cpp_err=$ac_c_preproc_warn_flag\n  else\n    ac_cpp_err=\n  fi\nelse\n  ac_cpp_err=yes\nfi\nif test -z \"$ac_cpp_err\"; then\n  # Broken: success on invalid input.\ncontinue\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\necho \"$as_me:$LINENO: result: $CPP\" >&5\necho \"${ECHO_T}$CPP\" >&6\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n                     Syntax error\n_ACEOF\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_cpp conftest.$ac_ext\\\"\") >&5\n  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null; then\n  if test -s conftest.err; then\n    ac_cpp_err=$ac_c_preproc_warn_flag\n  else\n    ac_cpp_err=\n  fi\nelse\n  ac_cpp_err=yes\nfi\nif test -z \"$ac_cpp_err\"; then\n  :\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether non-existent headers\n  # can be detected and how.\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_cpp conftest.$ac_ext\\\"\") >&5\n  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1\n  ac_status=$?\n  grep -v '^ *+' conftest.er1 >conftest.err\n  rm -f conftest.er1\n  cat conftest.err >&5\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } >/dev/null; then\n  if test -s conftest.err; then\n    ac_cpp_err=$ac_c_preproc_warn_flag\n  else\n    ac_cpp_err=\n  fi\nelse\n  ac_cpp_err=yes\nfi\nif test -z \"$ac_cpp_err\"; then\n  # Broken: success on invalid input.\ncontinue\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then\n  :\nelse\n  { { echo \"$as_me:$LINENO: error: C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details.\" >&5\necho \"$as_me: error: C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details.\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\necho \"$as_me:$LINENO: checking for egrep\" >&5\necho $ECHO_N \"checking for egrep... $ECHO_C\" >&6\nif test \"${ac_cv_prog_egrep+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if echo a | (grep -E '(a|b)') >/dev/null 2>&1\n    then ac_cv_prog_egrep='grep -E'\n    else ac_cv_prog_egrep='egrep'\n    fi\nfi\necho \"$as_me:$LINENO: result: $ac_cv_prog_egrep\" >&5\necho \"${ECHO_T}$ac_cv_prog_egrep\" >&6\n EGREP=$ac_cv_prog_egrep\n\n\necho \"$as_me:$LINENO: checking for ANSI C header files\" >&5\necho $ECHO_N \"checking for ANSI C header files... $ECHO_C\" >&6\nif test \"${ac_cv_header_stdc+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_header_stdc=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_header_stdc=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then\n  :\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then\n  :\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then\n  :\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <ctype.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n                   (('a' <= (c) && (c) <= 'i') \\\n                     || ('j' <= (c) && (c) <= 'r') \\\n                     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n        || toupper (i) != TOUPPER (i))\n      exit(2);\n  exit (0);\n}\n_ACEOF\nrm -f conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  :\nelse\n  echo \"$as_me: program exited with status $ac_status\" >&5\necho \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n( exit $ac_status )\nac_cv_header_stdc=no\nfi\nrm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext\nfi\nfi\nfi\necho \"$as_me:$LINENO: result: $ac_cv_header_stdc\" >&5\necho \"${ECHO_T}$ac_cv_header_stdc\" >&6\nif test $ac_cv_header_stdc = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define STDC_HEADERS 1\n_ACEOF\n\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfor ac_header in sys/types.h sys/socket.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h fcntl.h netdb.h signal.h stdio.h stdlib.h string.h sys/stat.h sys/uio.h unistd.h sys/wait.h sys/un.h sys/param.h sys/select.h sys/sysctl.h poll.h sys/event.h strings.h sys/ioctl.h sys/filio.h sys/sockio.h pthread.h net/if_dl.h xti.h xti_inet.h netconfig.h netdir.h stropts.h\ndo\nas_ac_Header=`echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_header\" >&5\necho $ECHO_N \"checking for $ac_header... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_Header+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <stdio.h>\n#if HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#if HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#if STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# if HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#if HAVE_STRING_H\n# if !STDC_HEADERS && HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#if HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#if HAVE_INTTYPES_H\n# include <inttypes.h>\n#else\n# if HAVE_STDINT_H\n#  include <stdint.h>\n# endif\n#endif\n#if HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n#if HAVE_SYS_PARAM_H\n# include <sys/param.h>\n#endif\n\n#include <$ac_header>\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_Header=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_Header=no\"\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_Header'}'`\" >&6\nif test `eval echo '${'$as_ac_Header'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\necho \"$as_me:$LINENO: checking whether time.h and sys/time.h may both be included\" >&5\necho $ECHO_N \"checking whether time.h and sys/time.h may both be included... $ECHO_C\" >&6\nif test \"${ac_cv_header_time+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/time.h>\n#include <time.h>\n\nint\nmain ()\n{\nif ((struct tm *) 0)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_header_time=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_header_time=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_header_time\" >&5\necho \"${ECHO_T}$ac_cv_header_time\" >&6\nif test $ac_cv_header_time = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define TIME_WITH_SYS_TIME 1\n_ACEOF\n\nfi\n\necho \"$as_me:$LINENO: checking if uint8_t defined\" >&5\necho $ECHO_N \"checking if uint8_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_uint8_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n uint8_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_uint8_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_uint8_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_uint8_t\" >&5\necho \"${ECHO_T}$ac_cv_type_uint8_t\" >&6\n\tif test $ac_cv_type_uint8_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define uint8_t unsigned char\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if int16_t defined\" >&5\necho $ECHO_N \"checking if int16_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_int16_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n int16_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_int16_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_int16_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_int16_t\" >&5\necho \"${ECHO_T}$ac_cv_type_int16_t\" >&6\n\tif test $ac_cv_type_int16_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define int16_t short\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if uint16_t defined\" >&5\necho $ECHO_N \"checking if uint16_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_uint16_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n uint16_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_uint16_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_uint16_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_uint16_t\" >&5\necho \"${ECHO_T}$ac_cv_type_uint16_t\" >&6\n\tif test $ac_cv_type_uint16_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define uint16_t unsigned short\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if int32_t defined\" >&5\necho $ECHO_N \"checking if int32_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_int32_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n int32_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_int32_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_int32_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_int32_t\" >&5\necho \"${ECHO_T}$ac_cv_type_int32_t\" >&6\n\tif test $ac_cv_type_int32_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define int32_t int\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if uint32_t defined\" >&5\necho $ECHO_N \"checking if uint32_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_uint32_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n uint32_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_uint32_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_uint32_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_uint32_t\" >&5\necho \"${ECHO_T}$ac_cv_type_uint32_t\" >&6\n\tif test $ac_cv_type_uint32_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define uint32_t unsigned int\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if size_t defined\" >&5\necho $ECHO_N \"checking if size_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_size_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n size_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_size_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_size_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_size_t\" >&5\necho \"${ECHO_T}$ac_cv_type_size_t\" >&6\n\tif test $ac_cv_type_size_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define size_t unsigned int\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if ssize_t defined\" >&5\necho $ECHO_N \"checking if ssize_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_ssize_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n ssize_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_ssize_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_ssize_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_ssize_t\" >&5\necho \"${ECHO_T}$ac_cv_type_ssize_t\" >&6\n\tif test $ac_cv_type_ssize_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define ssize_t int\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if socklen_t defined\" >&5\necho $ECHO_N \"checking if socklen_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_socklen_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n socklen_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_socklen_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_socklen_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_socklen_t\" >&5\necho \"${ECHO_T}$ac_cv_type_socklen_t\" >&6\n\tif test $ac_cv_type_socklen_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define socklen_t unsigned int\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if sa_family_t defined\" >&5\necho $ECHO_N \"checking if sa_family_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_sa_family_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\nint\nmain ()\n{\n sa_family_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_sa_family_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_sa_family_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_sa_family_t\" >&5\necho \"${ECHO_T}$ac_cv_type_sa_family_t\" >&6\n\tif test $ac_cv_type_sa_family_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define sa_family_t SA_FAMILY_T\n_ACEOF\n\n\tfi\n\n\necho \"$as_me:$LINENO: checking if t_scalar_t defined\" >&5\necho $ECHO_N \"checking if t_scalar_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_t_scalar_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\n#ifdef\tHAVE_POLL_H\n#  include\t<poll.h>\n#endif\n#ifdef\tHAVE_XTI_H\n#  include\t<xti.h>\n#endif\n#ifdef\tHAVE_NETCONFIG_H\n#  include\t<netconfig.h>\n#endif\n#ifdef\tHAVE_NETDIR_H\n#  include\t<netdir.h>\n#endif\n#ifdef\tHAVE_STROPTS_H\n#  include\t<stropts.h>\n#endif\nint\nmain ()\n{\n t_scalar_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_t_scalar_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_t_scalar_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_t_scalar_t\" >&5\necho \"${ECHO_T}$ac_cv_type_t_scalar_t\" >&6\n\tif test $ac_cv_type_t_scalar_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define t_scalar_t int32_t\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking if t_uscalar_t defined\" >&5\necho $ECHO_N \"checking if t_uscalar_t defined... $ECHO_C\" >&6\n\tif test \"${ac_cv_type_t_uscalar_t+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include\t\"confdefs.h\"\t/* the header built by configure so far */\n#ifdef\tHAVE_SYS_TYPES_H\n#  include\t<sys/types.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKET_H\n#  include\t<sys/socket.h>\n#endif\n#ifdef\tHAVE_SYS_TIME_H\n#  include    <sys/time.h>\n#endif\n#ifdef\tHAVE_NETINET_IN_H\n#  include    <netinet/in.h>\n#endif\n#ifdef\tHAVE_ARPA_INET_H\n#  include    <arpa/inet.h>\n#endif\n#ifdef\tHAVE_ERRNO_H\n#  include    <errno.h>\n#endif\n#ifdef\tHAVE_FCNTL_H\n#  include    <fcntl.h>\n#endif\n#ifdef\tHAVE_NETDB_H\n#  include\t<netdb.h>\n#endif\n#ifdef\tHAVE_SIGNAL_H\n#  include\t<signal.h>\n#endif\n#ifdef\tHAVE_STDIO_H\n#  include\t<stdio.h>\n#endif\n#ifdef\tHAVE_STDLIB_H\n#  include\t<stdlib.h>\n#endif\n#ifdef\tHAVE_STRING_H\n#  include\t<string.h>\n#endif\n#ifdef\tHAVE_SYS_STAT_H\n#  include\t<sys/stat.h>\n#endif\n#ifdef\tHAVE_SYS_UIO_H\n#  include\t<sys/uio.h>\n#endif\n#ifdef\tHAVE_UNISTD_H\n#  include\t<unistd.h>\n#endif\n#ifdef\tHAVE_SYS_WAIT_H\n#  include\t<sys/wait.h>\n#endif\n#ifdef\tHAVE_SYS_UN_H\n#  include\t<sys/un.h>\n#endif\n#ifdef\tHAVE_SYS_SELECT_H\n# include   <sys/select.h>\n#endif\n#ifdef\tHAVE_STRINGS_H\n# include   <strings.h>\n#endif\n#ifdef\tHAVE_SYS_IOCTL_H\n# include   <sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include   <sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include   <sys/sockio.h>\n#endif\n#ifdef\tHAVE_PTHREAD_H\n#  include\t<pthread.h>\n#endif\n#ifdef\tHAVE_POLL_H\n#  include\t<poll.h>\n#endif\n#ifdef\tHAVE_XTI_H\n#  include\t<xti.h>\n#endif\n#ifdef\tHAVE_NETCONFIG_H\n#  include\t<netconfig.h>\n#endif\n#ifdef\tHAVE_NETDIR_H\n#  include\t<netdir.h>\n#endif\n#ifdef\tHAVE_STROPTS_H\n#  include\t<stropts.h>\n#endif\nint\nmain ()\n{\n t_uscalar_t foo\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_t_uscalar_t=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_t_uscalar_t=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\n\n\techo \"$as_me:$LINENO: result: $ac_cv_type_t_uscalar_t\" >&5\necho \"${ECHO_T}$ac_cv_type_t_uscalar_t\" >&6\n\tif test $ac_cv_type_t_uscalar_t = no ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define t_uscalar_t uint32_t\n_ACEOF\n\n\tfi\n\n\necho \"$as_me:$LINENO: checking for struct sockaddr.sa_len\" >&5\necho $ECHO_N \"checking for struct sockaddr.sa_len... $ECHO_C\" >&6\nif test \"${ac_cv_member_struct_sockaddr_sa_len+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct sockaddr ac_aggr;\nif (ac_aggr.sa_len)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_sockaddr_sa_len=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct sockaddr ac_aggr;\nif (sizeof ac_aggr.sa_len)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_sockaddr_sa_len=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_member_struct_sockaddr_sa_len=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_sa_len\" >&5\necho \"${ECHO_T}$ac_cv_member_struct_sockaddr_sa_len\" >&6\nif test $ac_cv_member_struct_sockaddr_sa_len = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_SOCKADDR_SA_LEN 1\n_ACEOF\n\nfi\n\n\nif test $ac_cv_type_sa_family_t = no ; then\n   if test $ac_cv_member_struct_sockaddr_sa_len = yes ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define SA_FAMILY_T uint8_t\n_ACEOF\n\n   else\n      cat >>confdefs.h <<\\_ACEOF\n#define SA_FAMILY_T uint16_t\n_ACEOF\n\n   fi\nfi\n\necho \"$as_me:$LINENO: checking for struct sockaddr_storage\" >&5\necho $ECHO_N \"checking for struct sockaddr_storage... $ECHO_C\" >&6\nif test \"${ac_cv_type_struct_sockaddr_storage+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nif ((struct sockaddr_storage *) 0)\n  return 0;\nif (sizeof (struct sockaddr_storage))\n  return 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_struct_sockaddr_storage=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_struct_sockaddr_storage=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_type_struct_sockaddr_storage\" >&5\necho \"${ECHO_T}$ac_cv_type_struct_sockaddr_storage\" >&6\nif test $ac_cv_type_struct_sockaddr_storage = yes; then\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_STRUCT_SOCKADDR_STORAGE 1\n_ACEOF\n\necho \"$as_me:$LINENO: checking for struct sockaddr_storage.ss_family\" >&5\necho $ECHO_N \"checking for struct sockaddr_storage.ss_family... $ECHO_C\" >&6\nif test \"${ac_cv_member_struct_sockaddr_storage_ss_family+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct sockaddr_storage ac_aggr;\nif (ac_aggr.ss_family)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_sockaddr_storage_ss_family=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct sockaddr_storage ac_aggr;\nif (sizeof ac_aggr.ss_family)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_sockaddr_storage_ss_family=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_member_struct_sockaddr_storage_ss_family=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_storage_ss_family\" >&5\necho \"${ECHO_T}$ac_cv_member_struct_sockaddr_storage_ss_family\" >&6\nif test $ac_cv_member_struct_sockaddr_storage_ss_family = yes; then\n  :\nelse\n  echo \"$as_me:$LINENO: checking for struct sockaddr_storage.__ss_family\" >&5\necho $ECHO_N \"checking for struct sockaddr_storage.__ss_family... $ECHO_C\" >&6\nif test \"${ac_cv_member_struct_sockaddr_storage___ss_family+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct sockaddr_storage ac_aggr;\nif (ac_aggr.__ss_family)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_sockaddr_storage___ss_family=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct sockaddr_storage ac_aggr;\nif (sizeof ac_aggr.__ss_family)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_sockaddr_storage___ss_family=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_member_struct_sockaddr_storage___ss_family=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_storage___ss_family\" >&5\necho \"${ECHO_T}$ac_cv_member_struct_sockaddr_storage___ss_family\" >&6\nif test $ac_cv_member_struct_sockaddr_storage___ss_family = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define ss_family __ss_family\n_ACEOF\n\nelse\n  { { echo \"$as_me:$LINENO: error: cannot find ss_family in sockaddr_storage\" >&5\necho \"$as_me: error: cannot find ss_family in sockaddr_storage\" >&2;}\n   { (exit 1); exit 1; }; }\nfi\n\nfi\n\nfi\n\n\necho \"$as_me:$LINENO: checking for struct msghdr.msg_control\" >&5\necho $ECHO_N \"checking for struct msghdr.msg_control... $ECHO_C\" >&6\nif test \"${ac_cv_member_struct_msghdr_msg_control+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct msghdr ac_aggr;\nif (ac_aggr.msg_control)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_msghdr_msg_control=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n\nint\nmain ()\n{\nstatic struct msghdr ac_aggr;\nif (sizeof ac_aggr.msg_control)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_msghdr_msg_control=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_member_struct_msghdr_msg_control=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_member_struct_msghdr_msg_control\" >&5\necho \"${ECHO_T}$ac_cv_member_struct_msghdr_msg_control\" >&6\nif test $ac_cv_member_struct_msghdr_msg_control = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_MSGHDR_MSG_CONTROL 1\n_ACEOF\n\nfi\n\n\necho \"$as_me:$LINENO: checking for struct ifreq.ifr_mtu\" >&5\necho $ECHO_N \"checking for struct ifreq.ifr_mtu... $ECHO_C\" >&6\nif test \"${ac_cv_member_struct_ifreq_ifr_mtu+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if.h>\n\nint\nmain ()\n{\nstatic struct ifreq ac_aggr;\nif (ac_aggr.ifr_mtu)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_ifreq_ifr_mtu=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\ncat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if.h>\n\nint\nmain ()\n{\nstatic struct ifreq ac_aggr;\nif (sizeof ac_aggr.ifr_mtu)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_member_struct_ifreq_ifr_mtu=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_member_struct_ifreq_ifr_mtu=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_member_struct_ifreq_ifr_mtu\" >&5\necho \"${ECHO_T}$ac_cv_member_struct_ifreq_ifr_mtu\" >&6\nif test $ac_cv_member_struct_ifreq_ifr_mtu = yes; then\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_STRUCT_IFREQ_IFR_MTU 1\n_ACEOF\n\n\nfi\n\n\necho \"$as_me:$LINENO: checking for getaddrinfo function prototype in netdb.h\" >&5\necho $ECHO_N \"checking for getaddrinfo function prototype in netdb.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_getaddrinfo_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <netdb.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"getaddrinfo\" >/dev/null 2>&1; then\n  ac_cv_have_getaddrinfo_proto=yes\nelse\n  ac_cv_have_getaddrinfo_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_getaddrinfo_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_getaddrinfo_proto\" >&6\n\tif test $ac_cv_have_getaddrinfo_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo getaddrinfo | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for getnameinfo function prototype in netdb.h\" >&5\necho $ECHO_N \"checking for getnameinfo function prototype in netdb.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_getnameinfo_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <netdb.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"getnameinfo\" >/dev/null 2>&1; then\n  ac_cv_have_getnameinfo_proto=yes\nelse\n  ac_cv_have_getnameinfo_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_getnameinfo_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_getnameinfo_proto\" >&6\n\tif test $ac_cv_have_getnameinfo_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo getnameinfo | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for gethostname function prototype in unistd.h\" >&5\necho $ECHO_N \"checking for gethostname function prototype in unistd.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_gethostname_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <unistd.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"gethostname\" >/dev/null 2>&1; then\n  ac_cv_have_gethostname_proto=yes\nelse\n  ac_cv_have_gethostname_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_gethostname_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_gethostname_proto\" >&6\n\tif test $ac_cv_have_gethostname_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo gethostname | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for getrusage function prototype in sys/resource.h\" >&5\necho $ECHO_N \"checking for getrusage function prototype in sys/resource.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_getrusage_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <sys/resource.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"getrusage\" >/dev/null 2>&1; then\n  ac_cv_have_getrusage_proto=yes\nelse\n  ac_cv_have_getrusage_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_getrusage_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_getrusage_proto\" >&6\n\tif test $ac_cv_have_getrusage_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo getrusage | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for hstrerror function prototype in netdb.h\" >&5\necho $ECHO_N \"checking for hstrerror function prototype in netdb.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_hstrerror_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <netdb.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"hstrerror\" >/dev/null 2>&1; then\n  ac_cv_have_hstrerror_proto=yes\nelse\n  ac_cv_have_hstrerror_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_hstrerror_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_hstrerror_proto\" >&6\n\tif test $ac_cv_have_hstrerror_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo hstrerror | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for if_nametoindex function prototype in net/if.h\" >&5\necho $ECHO_N \"checking for if_nametoindex function prototype in net/if.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_if_nametoindex_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <net/if.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"if_nametoindex\" >/dev/null 2>&1; then\n  ac_cv_have_if_nametoindex_proto=yes\nelse\n  ac_cv_have_if_nametoindex_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_if_nametoindex_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_if_nametoindex_proto\" >&6\n\tif test $ac_cv_have_if_nametoindex_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo if_nametoindex | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for inet_aton function prototype in arpa/inet.h\" >&5\necho $ECHO_N \"checking for inet_aton function prototype in arpa/inet.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_inet_aton_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <arpa/inet.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"inet_aton\" >/dev/null 2>&1; then\n  ac_cv_have_inet_aton_proto=yes\nelse\n  ac_cv_have_inet_aton_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_inet_aton_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_inet_aton_proto\" >&6\n\tif test $ac_cv_have_inet_aton_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo inet_aton | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for inet_pton function prototype in arpa/inet.h\" >&5\necho $ECHO_N \"checking for inet_pton function prototype in arpa/inet.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_inet_pton_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <arpa/inet.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"inet_pton\" >/dev/null 2>&1; then\n  ac_cv_have_inet_pton_proto=yes\nelse\n  ac_cv_have_inet_pton_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_inet_pton_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_inet_pton_proto\" >&6\n\tif test $ac_cv_have_inet_pton_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo inet_pton | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for pselect function prototype in sys/select.h\" >&5\necho $ECHO_N \"checking for pselect function prototype in sys/select.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_pselect_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <sys/select.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"pselect\" >/dev/null 2>&1; then\n  ac_cv_have_pselect_proto=yes\nelse\n  ac_cv_have_pselect_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_pselect_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_pselect_proto\" >&6\n\tif test $ac_cv_have_pselect_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo pselect | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for snprintf function prototype in stdio.h\" >&5\necho $ECHO_N \"checking for snprintf function prototype in stdio.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_snprintf_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <stdio.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"snprintf\" >/dev/null 2>&1; then\n  ac_cv_have_snprintf_proto=yes\nelse\n  ac_cv_have_snprintf_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_snprintf_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_snprintf_proto\" >&6\n\tif test $ac_cv_have_snprintf_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo snprintf | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\necho \"$as_me:$LINENO: checking for sockatmark function prototype in sys/socket.h\" >&5\necho $ECHO_N \"checking for sockatmark function prototype in sys/socket.h... $ECHO_C\" >&6\nif test \"${ac_cv_have_sockatmark_proto+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n#include <sys/socket.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"sockatmark\" >/dev/null 2>&1; then\n  ac_cv_have_sockatmark_proto=yes\nelse\n  ac_cv_have_sockatmark_proto=no\nfi\nrm -f conftest*\n\nfi\necho \"$as_me:$LINENO: result: $ac_cv_have_sockatmark_proto\" >&5\necho \"${ECHO_T}$ac_cv_have_sockatmark_proto\" >&6\n\tif test $ac_cv_have_sockatmark_proto = yes ; then\n    \t\tac_tr_func=HAVE_`echo sockatmark | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO\n\t\tcat >>confdefs.h <<_ACEOF\n#define $ac_tr_func 1\n_ACEOF\n\n\tfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\necho \"$as_me:$LINENO: checking for struct addrinfo\" >&5\necho $ECHO_N \"checking for struct addrinfo... $ECHO_C\" >&6\nif test \"${ac_cv_type_struct_addrinfo+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <netdb.h>\n\nint\nmain ()\n{\nif ((struct addrinfo *) 0)\n  return 0;\nif (sizeof (struct addrinfo))\n  return 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_struct_addrinfo=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_struct_addrinfo=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_type_struct_addrinfo\" >&5\necho \"${ECHO_T}$ac_cv_type_struct_addrinfo\" >&6\nif test $ac_cv_type_struct_addrinfo = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_ADDRINFO_STRUCT 1\n_ACEOF\n\nfi\n\n\necho \"$as_me:$LINENO: checking for struct if_nameindex\" >&5\necho $ECHO_N \"checking for struct if_nameindex... $ECHO_C\" >&6\nif test \"${ac_cv_type_struct_if_nameindex+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if.h>\n\nint\nmain ()\n{\nif ((struct if_nameindex *) 0)\n  return 0;\nif (sizeof (struct if_nameindex))\n  return 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_struct_if_nameindex=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_struct_if_nameindex=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_type_struct_if_nameindex\" >&5\necho \"${ECHO_T}$ac_cv_type_struct_if_nameindex\" >&6\nif test $ac_cv_type_struct_if_nameindex = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_IF_NAMEINDEX_STRUCT 1\n_ACEOF\n\nfi\n\n\necho \"$as_me:$LINENO: checking for struct sockaddr_dl\" >&5\necho $ECHO_N \"checking for struct sockaddr_dl... $ECHO_C\" >&6\nif test \"${ac_cv_type_struct_sockaddr_dl+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if_dl.h>\n\nint\nmain ()\n{\nif ((struct sockaddr_dl *) 0)\n  return 0;\nif (sizeof (struct sockaddr_dl))\n  return 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_struct_sockaddr_dl=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_struct_sockaddr_dl=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_type_struct_sockaddr_dl\" >&5\necho \"${ECHO_T}$ac_cv_type_struct_sockaddr_dl\" >&6\nif test $ac_cv_type_struct_sockaddr_dl = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_SOCKADDR_DL_STRUCT 1\n_ACEOF\n\nfi\n\n\necho \"$as_me:$LINENO: checking for struct timespec\" >&5\necho $ECHO_N \"checking for struct timespec... $ECHO_C\" >&6\nif test \"${ac_cv_type_struct_timespec+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#if TIME_WITH_SYS_TIME\n#include <sys/time.h>\n#include <time.h>\n#else\n#if HAVE_SYS_TIME_H\n#include <sys/time.h>\n#else\n#include <time.h>\n#endif\n#endif\n\n\nint\nmain ()\n{\nif ((struct timespec *) 0)\n  return 0;\nif (sizeof (struct timespec))\n  return 0;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_compile\\\"\") >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest.$ac_objext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_type_struct_timespec=yes\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\nac_cv_type_struct_timespec=no\nfi\nrm -f conftest.$ac_objext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: $ac_cv_type_struct_timespec\" >&5\necho \"${ECHO_T}$ac_cv_type_struct_timespec\" >&6\nif test $ac_cv_type_struct_timespec = yes; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_TIMESPEC_STRUCT 1\n_ACEOF\n\nfi\n\n\necho \"$as_me:$LINENO: checking for /dev/tcp\" >&5\necho $ECHO_N \"checking for /dev/tcp... $ECHO_C\" >&6\nif test -r /dev/tcp ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_DEV_TCP 1\n_ACEOF\n\n\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\nelse\n\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\n\techo \"$as_me:$LINENO: checking for /dev/xti/tcp\" >&5\necho $ECHO_N \"checking for /dev/xti/tcp... $ECHO_C\" >&6\n\tif test -r /dev/xti/tcp ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_DEV_XTI_TCP 1\n_ACEOF\n\n\t\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\telse\n\t\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\n\t\techo \"$as_me:$LINENO: checking for /dev/streams/xtiso/tcp\" >&5\necho $ECHO_N \"checking for /dev/streams/xtiso/tcp... $ECHO_C\" >&6\n\t\tif test -r /dev/streams/xtiso/tcp ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define HAVE_DEV_STREAMS_XTISO_TCP 1\n_ACEOF\n\n\t\t\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\n\t\telse\n\t\t\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\n\t\tfi\n\tfi\nfi\n\n\nfor ac_func in bzero\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in getaddrinfo\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in gethostname\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in gethostbyname2\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in gethostbyname_r\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in getnameinfo\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in hstrerror\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in if_nametoindex\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in inet_aton\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in inet_pton\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in inet6_rth_init\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\n\nfor ac_func in kqueue kevent\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in mkstemp\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in poll\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in pselect\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in snprintf\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in sockatmark\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in vsnprintf\ndo\nas_ac_var=`echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\necho \"$as_me:$LINENO: checking for $ac_func\" >&5\necho $ECHO_N \"checking for $ac_func... $ECHO_C\" >&6\nif eval \"test \\\"\\${$as_ac_var+set}\\\" = set\"; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $ac_func (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n/* Override any gcc2 internal prototype to avoid an error.  */\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n/* We use char because int might match the return type of a gcc2\n   builtin and then its argument prototype would still apply.  */\nchar $ac_func ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_$ac_func) || defined (__stub___$ac_func)\nchoke me\n#else\nchar (*f) () = $ac_func;\n#endif\n#ifdef __cplusplus\n}\n#endif\n\nint\nmain ()\n{\nreturn f != $ac_func;\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.$ac_objext conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } &&\n         { ac_try='test -s conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  eval \"$as_ac_var=yes\"\nelse\n  echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\neval \"$as_ac_var=no\"\nfi\nrm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext\nfi\necho \"$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`\" >&5\necho \"${ECHO_T}`eval echo '${'$as_ac_var'}'`\" >&6\nif test `eval echo '${'$as_ac_var'}'` = yes; then\n  cat >>confdefs.h <<_ACEOF\n#define `echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\n\necho \"$as_me:$LINENO: checking for IPv4 support\" >&5\necho $ECHO_N \"checking for IPv4 support... $ECHO_C\" >&6\nif test \"${ac_cv_ipv4+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test \"$cross_compiling\" = yes; then\n  ac_cv_ipv4=no\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <netinet/in.h>\n\t/* Make sure the definitions for AF_INET and struct sockaddr_in\n\t * are defined, and that we can actually create an IPv4 TCP socket.\n\t */\n\tmain()\n\t{\n\t\tint fd;\n\t\tstruct sockaddr_in foo;\n\t\tfd = socket(AF_INET, SOCK_STREAM, 0);\n\t\texit(fd >= 0 ? 0 : 1);\n\t}\n_ACEOF\nrm -f conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_ipv4=yes\nelse\n  echo \"$as_me: program exited with status $ac_status\" >&5\necho \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n(exit $ac_status )\nac_cv_ipv4=no\nfi\nrm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext\nfi\nfi\n\necho \"$as_me:$LINENO: result: $ac_cv_ipv4\" >&5\necho \"${ECHO_T}$ac_cv_ipv4\" >&6\nif test $ac_cv_ipv4 = yes ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define IPV4 1\n_ACEOF\n\n\ncat >>confdefs.h <<\\_ACEOF\n#define IPv4 1\n_ACEOF\n\nfi\n\necho \"$as_me:$LINENO: checking for IPv6 support\" >&5\necho $ECHO_N \"checking for IPv6 support... $ECHO_C\" >&6\nif test \"${ac_cv_ipv6+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test \"$cross_compiling\" = yes; then\n  ac_cv_ipv6=no\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <netinet/in.h>\n\t/* Make sure the definitions for AF_INET6 and struct sockaddr_in6\n\t * are defined, and that we can actually create an IPv6 TCP socket.\n\t */\n\tmain()\n\t{\n\t\tint fd;\n\t\tstruct sockaddr_in6 foo;\n\t\tfd = socket(AF_INET6, SOCK_STREAM, 0);\n\t\texit(fd >= 0 ? 0 : 1);\n\t}\n_ACEOF\nrm -f conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_ipv6=yes\nelse\n  echo \"$as_me: program exited with status $ac_status\" >&5\necho \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n(exit $ac_status )\nac_cv_ipv6=no\nfi\nrm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext\nfi\nfi\n\necho \"$as_me:$LINENO: result: $ac_cv_ipv6\" >&5\necho \"${ECHO_T}$ac_cv_ipv6\" >&6\nif test $ac_cv_ipv6 = yes ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define IPV6 1\n_ACEOF\n\n\ncat >>confdefs.h <<\\_ACEOF\n#define IPv6 1\n_ACEOF\n\nfi\n\necho \"$as_me:$LINENO: checking for Unix domain sockets\" >&5\necho $ECHO_N \"checking for Unix domain sockets... $ECHO_C\" >&6\nif test \"${ac_cv_unixdomain+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test \"$cross_compiling\" = yes; then\n  ac_cv_unixdomain=no\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <sys/un.h>\n\t/* Make sure the definitions for AF_UNIX and struct sockaddr_un\n\t * are defined, and that we can actually create an IPv4 TCP socket.\n\t */\n\tmain()\n\t{\n\t\tint fd;\n\t\tstruct sockaddr_un foo;\n\t\tfd = socket(AF_UNIX, SOCK_STREAM, 0);\n\t\texit(fd >= 0 ? 0 : 1);\n\t}\n_ACEOF\nrm -f conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_unixdomain=yes\nelse\n  echo \"$as_me: program exited with status $ac_status\" >&5\necho \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n(exit $ac_status )\nac_cv_unixdomain=no\nfi\nrm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext\nfi\nfi\n\necho \"$as_me:$LINENO: result: $ac_cv_unixdomain\" >&5\necho \"${ECHO_T}$ac_cv_unixdomain\" >&6\nif test $ac_cv_unixdomain = yes ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define UNIXDOMAIN 1\n_ACEOF\n\n\ncat >>confdefs.h <<\\_ACEOF\n#define UNIXdomain 1\n_ACEOF\n\nfi\n\necho \"$as_me:$LINENO: checking for multicast support\" >&5\necho $ECHO_N \"checking for multicast support... $ECHO_C\" >&6\nif test \"${ac_cv_multicast+set}\" = set; then\n  echo $ECHO_N \"(cached) $ECHO_C\" >&6\nelse\n  if test \"$cross_compiling\" = yes; then\n  ac_cv_multicast=no\nelse\n  cat >conftest.$ac_ext <<_ACEOF\n#line $LINENO \"configure\"\n/* confdefs.h.  */\n_ACEOF\ncat confdefs.h >>conftest.$ac_ext\ncat >>conftest.$ac_ext <<_ACEOF\n/* end confdefs.h.  */\n\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <netinet/in.h>\n\tmain()\n\t{\n\t\tint fd;\n\t\tunsigned char flag = 1;\n\t\tstruct sockaddr_in foo;\n\t\tstruct ip_mreq mreq;\n\t\tfd = socket(AF_INET, SOCK_DGRAM, 0);\n\t\tif (fd < 0) exit(1);\n\t\tif (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,\n\t\t\t       (void*)&flag, sizeof(flag)) < 0)\n\t\t\texit(1);\n\t\texit(0);\n\t}\n_ACEOF\nrm -f conftest$ac_exeext\nif { (eval echo \"$as_me:$LINENO: \\\"$ac_link\\\"\") >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'\n  { (eval echo \"$as_me:$LINENO: \\\"$ac_try\\\"\") >&5\n  (eval $ac_try) 2>&5\n  ac_status=$?\n  echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n  (exit $ac_status); }; }; then\n  ac_cv_multicast=yes\nelse\n  echo \"$as_me: program exited with status $ac_status\" >&5\necho \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n(exit $ac_status )\nac_cv_multicast=no\nfi\nrm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext\nfi\nfi\n\necho \"$as_me:$LINENO: result: $ac_cv_multicast\" >&5\necho \"${ECHO_T}$ac_cv_multicast\" >&6\nif test $ac_cv_multicast = yes ; then\n\ncat >>confdefs.h <<\\_ACEOF\n#define MCAST 1\n_ACEOF\n\nfi\n\nLIB_OBJS=\nLIB_OBJS=\"$LIB_OBJS connect_nonb.o\"\nLIB_OBJS=\"$LIB_OBJS connect_timeo.o\"\nLIB_OBJS=\"$LIB_OBJS daemon_inetd.o\"\nLIB_OBJS=\"$LIB_OBJS daemon_init.o\"\nLIB_OBJS=\"$LIB_OBJS dg_cli.o\"\nLIB_OBJS=\"$LIB_OBJS dg_echo.o\"\nLIB_OBJS=\"$LIB_OBJS error.o\"\nLIB_OBJS=\"$LIB_OBJS get_ifi_info.o\"\nLIB_OBJS=\"$LIB_OBJS gf_time.o\"\nLIB_OBJS=\"$LIB_OBJS host_serv.o\"\nif test \"$ac_cv_func_hstrerror\" = no ; then\n   LIBFREE_OBJS=\"$LIBFREE_OBJS hstrerror.o\"\nfi\nif test \"$ac_cv_func_if_nametoindex\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS if_nametoindex.o if_indextoname.o if_nameindex.o\"\nfi\nif test \"$ac_cv_multicast\" = yes ; then\n   LIB_OBJS=\"$LIB_OBJS family_to_level.o\"\n   LIB_OBJS=\"$LIB_OBJS mcast_leave.o mcast_join.o\"\n   LIB_OBJS=\"$LIB_OBJS mcast_get_if.o mcast_get_loop.o mcast_get_ttl.o\"\n   LIB_OBJS=\"$LIB_OBJS mcast_set_if.o mcast_set_loop.o mcast_set_ttl.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS my_addrs.o\"\nif test \"$ac_cv_func_pselect\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS pselect.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS read_fd.o\"\nLIB_OBJS=\"$LIB_OBJS readline.o\"\nLIB_OBJS=\"$LIB_OBJS readn.o\"\nLIB_OBJS=\"$LIB_OBJS readable_timeo.o\"\nLIB_OBJS=\"$LIB_OBJS rtt.o\"\nLIB_OBJS=\"$LIB_OBJS signal.o\"\nLIB_OBJS=\"$LIB_OBJS signal_intr.o\"\nif test \"$ac_cv_func_snprintf\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS snprintf.o\"\nfi\nif test \"$ac_cv_func_sockatmark\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS sockatmark.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS sock_bind_wild.o\"\nLIB_OBJS=\"$LIB_OBJS sock_cmp_addr.o\"\nLIB_OBJS=\"$LIB_OBJS sock_cmp_port.o\"\nLIB_OBJS=\"$LIB_OBJS sock_ntop.o\"\nLIB_OBJS=\"$LIB_OBJS sock_ntop_host.o\"\nLIB_OBJS=\"$LIB_OBJS sock_get_port.o\"\nLIB_OBJS=\"$LIB_OBJS sock_set_addr.o\"\nLIB_OBJS=\"$LIB_OBJS sock_set_port.o\"\nLIB_OBJS=\"$LIB_OBJS sock_set_wild.o\"\nLIB_OBJS=\"$LIB_OBJS sockfd_to_family.o\"\nLIB_OBJS=\"$LIB_OBJS str_cli.o\"\nLIB_OBJS=\"$LIB_OBJS str_echo.o\"\nLIB_OBJS=\"$LIB_OBJS tcp_connect.o\"\nLIB_OBJS=\"$LIB_OBJS tcp_listen.o\"\nLIB_OBJS=\"$LIB_OBJS tv_sub.o\"\nLIB_OBJS=\"$LIB_OBJS udp_client.o\"\nLIB_OBJS=\"$LIB_OBJS udp_connect.o\"\nLIB_OBJS=\"$LIB_OBJS udp_server.o\"\nLIB_OBJS=\"$LIB_OBJS wraplib.o\"\nLIB_OBJS=\"$LIB_OBJS wrapsock.o\"\nLIB_OBJS=\"$LIB_OBJS wrapstdio.o\"\nif test \"$ac_cv_header_pthread_h\" = yes ; then\n   LIB_OBJS=\"$LIB_OBJS wrappthread.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS wrapunix.o\"\nLIB_OBJS=\"$LIB_OBJS write_fd.o\"\nLIB_OBJS=\"$LIB_OBJS writen.o\"\nLIB_OBJS=\"$LIB_OBJS writable_timeo.o\"\n\nLIBFREE_OBJS=\n\nLIBFREE_OBJS=\"$LIBFREE_OBJS in_cksum.o\"\nif test \"$ac_cv_func_inet_aton\" = no ; then\n   LIBFREE_OBJS=\"$LIBFREE_OBJS inet_aton.o\"\nfi\n\nLIBFREE_OBJS=\"$LIBFREE_OBJS inet_ntop.o inet_pton.o\"\n\nif test \"$ac_cv_func_getaddrinfo\" = no ; then\nLIBGAI_OBJS=\"getaddrinfo.o getnameinfo.o freeaddrinfo.o gai_strerror.o\"\nLIBGAI_OBJS=\"$LIBGAI_OBJS ga_aistruct.o ga_clone.o ga_echeck.o ga_nsearch.o\"\nLIBGAI_OBJS=\"$LIBGAI_OBJS ga_port.o ga_serv.o ga_unix.o gn_ipv46.o\"\nelse\nLIBGAI_OBJS=\"\"\nfi\n\nLIBROUTE_OBJS=\"get_rtaddrs.o\"\nLIBROUTE_OBJS=\"$LIBROUTE_OBJS if_indextoname.o if_nameindex.o if_nametoindex.o\"\nLIBROUTE_OBJS=\"$LIBROUTE_OBJS net_rt_iflist.o net_rt_dump.o\"\nLIBROUTE_OBJS=\"$LIBROUTE_OBJS sock_masktop.o\"\n\nLIBXTI_OBJS=\nif test \"$ac_cv_header_netdir_h\" = yes ; then\n   LIBXTI_OBJS=\"$LIBXTI_OBJS tcp_connect.o\"\n   LIBXTI_OBJS=\"$LIBXTI_OBJS tcp_listen.o\"\n   LIBXTI_OBJS=\"$LIBXTI_OBJS udp_server.o\"\n   LIBXTI_OBJS=\"$LIBXTI_OBJS udp_client.o\"\nfi\nLIBXTI_OBJS=\"$LIBXTI_OBJS wrapxti.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_accept.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_flags_str.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_getopt.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_ntop.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_ntop_host.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_rdwr.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_setopt.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_str_opts.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_tlook_str.o\"\n\n\n\n\n\n\n\nLIBS_XTI=`echo $LIBS | sed 's/-lsocket//'`\nLIBS=`echo $LIBS | sed 's/-lxti//'`\n\n\n\n\n\n\n\n\n\necho \"$as_me:$LINENO: checking for -I$HOME/doc/unp2ev1/src/include\" >&5\necho $ECHO_N \"checking for -I$HOME/doc/unp2ev1/src/include... $ECHO_C\" >&6\nif test -d $HOME/doc/unp2ev1/src/include ; then\n\tCFLAGS=\"$CFLAGS -I$HOME/doc/unp2ev1/src/include\"\n\techo \"$as_me:$LINENO: result: yes\" >&5\necho \"${ECHO_T}yes\" >&6\nelse\n\techo \"$as_me:$LINENO: result: no\" >&5\necho \"${ECHO_T}no\" >&6\nfi\n\nif test \"$ac_cv_c_compiler_gnu\" = yes; then\n   CFLAGS=\"$CFLAGS -Wall\"\n         fi\n\ncase \"$host_os\" in\n*aix*)\t\tCFLAGS=\"$CFLAGS -D_ALL_SOURCE\" ;;\n*osf*)\t\tCFLAGS=\"$CFLAGS -D_SOCKADDR_LEN\" ;;\n*solaris*)\tif test \"$ac_cv_c_compiler_gnu\" = yes; then\n\t\t   CFLAGS=\"$CFLAGS -D__EXTENSIONS__\"\n\t\telse\n\t\t   CFLAGS=\"$CFLAGS -D__STDC__\"\n\t\tfi ;;\nesac\n\n                    ac_config_files=\"$ac_config_files Makefile Make.defines\"\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, don't put newlines in cache variables' values.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n{\n  (set) 2>&1 |\n    case `(ac_space=' '; set | grep ac_space) 2>&1` in\n    *ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes (double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\).\n      sed -n \\\n        \"s/'/'\\\\\\\\''/g;\n    \t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;;\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \\\n        \"s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1=\\\\2/p\"\n      ;;\n    esac;\n} |\n  sed '\n     t clear\n     : clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     /^ac_cv_env/!s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     : end' >>confcache\nif diff $cache_file confcache >/dev/null 2>&1; then :; else\n  if test -w $cache_file; then\n    test \"x$cache_file\" != \"x/dev/null\" && echo \"updating cache $cache_file\"\n    cat confcache >$cache_file\n  else\n    echo \"not updating unwritable cache $cache_file\"\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\n# VPATH may cause trouble with some makes, so we remove $(srcdir),\n# ${srcdir} and @srcdir@ from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[ \t]*VPATH[ \t]*=/{\ns/:*\\$(srcdir):*/:/;\ns/:*\\${srcdir}:*/:/;\ns/:*@srcdir@:*/:/;\ns/^\\([^=]*=[ \t]*\\):*/\\1/;\ns/:*$//;\ns/^[^=]*=[ \t]*$//;\n}'\nfi\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_i=`echo \"$ac_i\" |\n         sed 's/\\$U\\././;s/\\.o$//;s/\\.obj$//'`\n  # 2. Add them.\n  ac_libobjs=\"$ac_libobjs $ac_i\\$U.$ac_objext\"\n  ac_ltlibobjs=\"$ac_ltlibobjs $ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n\n: ${CONFIG_STATUS=./config.status}\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ echo \"$as_me:$LINENO: creating $CONFIG_STATUS\" >&5\necho \"$as_me: creating $CONFIG_STATUS\" >&6;}\ncat >$CONFIG_STATUS <<_ACEOF\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\nSHELL=\\${CONFIG_SHELL-$SHELL}\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n## --------------------- ##\n## M4sh Initialization.  ##\n## --------------------- ##\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\nelif test -n \"${BASH_VERSION+set}\" && (set -o posix) >/dev/null 2>&1; then\n  set -o posix\nfi\n\n# Support unset when possible.\nif (FOO=FOO; unset FOO) >/dev/null 2>&1; then\n  as_unset=unset\nelse\n  as_unset=false\nfi\n\n\n# Work around bugs in pre-3.0 UWIN ksh.\n$as_unset ENV MAIL MAILPATH\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nfor as_var in \\\n  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \\\n  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \\\n  LC_TELEPHONE LC_TIME\ndo\n  if (set +x; test -n \"`(eval $as_var=C; export $as_var) 2>&1`\"); then\n    eval $as_var=C; export $as_var\n  else\n    $as_unset $as_var\n  fi\ndone\n\n# Required to use basename.\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename /) >/dev/null 2>&1 && test \"X`basename / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\n\n# Name of the executable.\nas_me=`$as_basename \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)$' \\| \\\n\t .     : '\\(.\\)' 2>/dev/null ||\necho X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\/\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n\n\n# PATH needs CR, and LINENO needs CR and PATH.\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  echo \"#! /bin/sh\" >conf$$.sh\n  echo  \"exit 0\"   >>conf$$.sh\n  chmod +x conf$$.sh\n  if (PATH=\"/nonexistent;.\"; conf$$.sh) >/dev/null 2>&1; then\n    PATH_SEPARATOR=';'\n  else\n    PATH_SEPARATOR=:\n  fi\n  rm -f conf$$.sh\nfi\n\n\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\"  || {\n  # Find who we are.  Look in the path if we contain no path at all\n  # relative or not.\n  case $0 in\n    *[\\\\/]* ) as_myself=$0 ;;\n    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\ndone\n\n       ;;\n  esac\n  # We did not find ourselves, most probably we were run as `sh COMMAND'\n  # in which case we are not to be found in the path.\n  if test \"x$as_myself\" = x; then\n    as_myself=$0\n  fi\n  if test ! -f \"$as_myself\"; then\n    { { echo \"$as_me:$LINENO: error: cannot find myself; rerun with an absolute path\" >&5\necho \"$as_me: error: cannot find myself; rerun with an absolute path\" >&2;}\n   { (exit 1); exit 1; }; }\n  fi\n  case $CONFIG_SHELL in\n  '')\n    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for as_base in sh bash ksh sh5; do\n\t case $as_dir in\n\t /*)\n\t   if (\"$as_dir/$as_base\" -c '\n  as_lineno_1=$LINENO\n  as_lineno_2=$LINENO\n  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`\n  test \"x$as_lineno_1\" != \"x$as_lineno_2\" &&\n  test \"x$as_lineno_3\"  = \"x$as_lineno_2\" ') 2>/dev/null; then\n\t     $as_unset BASH_ENV || test \"${BASH_ENV+set}\" != set || { BASH_ENV=; export BASH_ENV; }\n\t     $as_unset ENV || test \"${ENV+set}\" != set || { ENV=; export ENV; }\n\t     CONFIG_SHELL=$as_dir/$as_base\n\t     export CONFIG_SHELL\n\t     exec \"$CONFIG_SHELL\" \"$0\" ${1+\"$@\"}\n\t   fi;;\n\t esac\n       done\ndone\n;;\n  esac\n\n  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO\n  # uniformly replaced by the line number.  The first 'sed' inserts a\n  # line-number line before each line; the second 'sed' does the real\n  # work.  The second script uses 'N' to pair each line-number line\n  # with the numbered line, and appends trailing '-' during\n  # substitution so that $LINENO is not a special case at line end.\n  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the\n  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)\n  sed '=' <$as_myself |\n    sed '\n      N\n      s,$,-,\n      : loop\n      s,^\\(['$as_cr_digits']*\\)\\(.*\\)[$]LINENO\\([^'$as_cr_alnum'_]\\),\\1\\2\\1\\3,\n      t loop\n      s,-$,,\n      s,^['$as_cr_digits']*\\n,,\n    ' >$as_me.lineno &&\n  chmod +x $as_me.lineno ||\n    { { echo \"$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&5\necho \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2;}\n   { (exit 1); exit 1; }; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensible to this).\n  . ./$as_me.lineno\n  # Exit status is that of the last command.\n  exit\n}\n\n\ncase `echo \"testing\\c\"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in\n  *c*,-n*) ECHO_N= ECHO_C='\n' ECHO_T='\t' ;;\n  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;\n  *)       ECHO_N= ECHO_C='\\c' ECHO_T= ;;\nesac\n\nif expr a : '\\(a\\)' >/dev/null 2>&1; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nrm -f conf$$ conf$$.exe conf$$.file\necho >conf$$.file\nif ln -s conf$$.file conf$$ 2>/dev/null; then\n  # We could just check for DJGPP; but this test a) works b) is more generic\n  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).\n  if test -f conf$$.exe; then\n    # Don't use ln at all; we don't have any links\n    as_ln_s='cp -p'\n  else\n    as_ln_s='ln -s'\n  fi\nelif ln conf$$.file conf$$ 2>/dev/null; then\n  as_ln_s=ln\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.file\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p=:\nelse\n  as_mkdir_p=false\nfi\n\nas_executable_p=\"test -f\"\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g\"\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.\nas_nl='\n'\nIFS=\" \t$as_nl\"\n\n# CDPATH.\n$as_unset CDPATH\n\nexec 6>&1\n\n# Open the log real soon, to keep \\$[0] and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.  Logging --version etc. is OK.\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n} >&5\ncat >&5 <<_CSEOF\n\nThis file was extended by $as_me, which was\ngenerated by GNU Autoconf 2.57.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\n_CSEOF\necho \"on `(hostname || uname -n) 2>/dev/null | sed 1q`\" >&5\necho >&5\n_ACEOF\n\n# Files that config.status was made for.\nif test -n \"$ac_config_files\"; then\n  echo \"config_files=\\\"$ac_config_files\\\"\" >>$CONFIG_STATUS\nfi\n\nif test -n \"$ac_config_headers\"; then\n  echo \"config_headers=\\\"$ac_config_headers\\\"\" >>$CONFIG_STATUS\nfi\n\nif test -n \"$ac_config_links\"; then\n  echo \"config_links=\\\"$ac_config_links\\\"\" >>$CONFIG_STATUS\nfi\n\nif test -n \"$ac_config_commands\"; then\n  echo \"config_commands=\\\"$ac_config_commands\\\"\" >>$CONFIG_STATUS\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n\nac_cs_usage=\"\\\n\\`$as_me' instantiates files from templates according to the\ncurrent configuration.\n\nUsage: $0 [OPTIONS] [FILE]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number, then exit\n  -q, --quiet      do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n  --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n  --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nReport bugs to <bug-autoconf@gnu.org>.\"\n_ACEOF\n\ncat >>$CONFIG_STATUS <<_ACEOF\nac_cs_version=\"\\\\\nconfig.status\nconfigured by $0, generated by GNU Autoconf 2.57,\n  with options \\\\\"`echo \"$ac_configure_args\" | sed 's/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\\\\\"\n\nCopyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\nsrcdir=$srcdir\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n# If no file are specified by the user, then we need to provide default\n# value.  By we need to know if files were specified by the user.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=*)\n    ac_option=`expr \"x$1\" : 'x\\([^=]*\\)='`\n    ac_optarg=`expr \"x$1\" : 'x[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  -*)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  *) # This is not an option, so the user has probably given explicit\n     # arguments.\n     ac_option=$1\n     ac_need_defaults=false;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --vers* | -V )\n    echo \"$ac_cs_version\"; exit 0 ;;\n  --he | --h)\n    # Conflict between --help and --header\n    { { echo \"$as_me:$LINENO: error: ambiguous option: $1\nTry \\`$0 --help' for more information.\" >&5\necho \"$as_me: error: ambiguous option: $1\nTry \\`$0 --help' for more information.\" >&2;}\n   { (exit 1); exit 1; }; };;\n  --help | --hel | -h )\n    echo \"$ac_cs_usage\"; exit 0 ;;\n  --debug | --d* | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    CONFIG_FILES=\"$CONFIG_FILES $ac_optarg\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    CONFIG_HEADERS=\"$CONFIG_HEADERS $ac_optarg\"\n    ac_need_defaults=false;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) { { echo \"$as_me:$LINENO: error: unrecognized option: $1\nTry \\`$0 --help' for more information.\" >&5\necho \"$as_me: error: unrecognized option: $1\nTry \\`$0 --help' for more information.\" >&2;}\n   { (exit 1); exit 1; }; } ;;\n\n  *) ac_config_targets=\"$ac_config_targets $1\" ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF\nif \\$ac_cs_recheck; then\n  echo \"running $SHELL $0 \" $ac_configure_args \\$ac_configure_extra_args \" --no-create --no-recursion\" >&6\n  exec $SHELL $0 $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\nfi\n\n_ACEOF\n\n\n\n\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\nfor ac_config_target in $ac_config_targets\ndo\n  case \"$ac_config_target\" in\n  # Handling of arguments.\n  \"Makefile\" ) CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n  \"Make.defines\" ) CONFIG_FILES=\"$CONFIG_FILES Make.defines\" ;;\n  \"config.h\" ) CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n  *) { { echo \"$as_me:$LINENO: error: invalid argument: $ac_config_target\" >&5\necho \"$as_me: error: invalid argument: $ac_config_target\" >&2;}\n   { (exit 1); exit 1; }; };;\n  esac\ndone\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason to put it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Create a temporary directory, and hook for its removal unless debugging.\n$debug ||\n{\n  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0\n  trap '{ (exit 1); exit 1; }' 1 2 13 15\n}\n\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d -q \"./confstatXXXXXX\") 2>/dev/null` &&\n  test -n \"$tmp\" && test -d \"$tmp\"\n}  ||\n{\n  tmp=./confstat$$-$RANDOM\n  (umask 077 && mkdir $tmp)\n} ||\n{\n   echo \"$me: cannot create a temporary directory in .\" >&2\n   { (exit 1); exit 1; }\n}\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<_ACEOF\n\n#\n# CONFIG_FILES section.\n#\n\n# No need to generate the scripts if there are no CONFIG_FILES.\n# This happens for instance when ./config.status config.h\nif test -n \"\\$CONFIG_FILES\"; then\n  # Protect against being on the right side of a sed subst in config.status.\n  sed 's/,@/@@/; s/@,/@@/; s/,;t t\\$/@;t t/; /@;t t\\$/s/[\\\\\\\\&,]/\\\\\\\\&/g;\n   s/@@/,@/; s/@@/@,/; s/@;t t\\$/,;t t/' >\\$tmp/subs.sed <<\\\\CEOF\ns,@SHELL@,$SHELL,;t t\ns,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t\ns,@PACKAGE_NAME@,$PACKAGE_NAME,;t t\ns,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t\ns,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t\ns,@PACKAGE_STRING@,$PACKAGE_STRING,;t t\ns,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t\ns,@exec_prefix@,$exec_prefix,;t t\ns,@prefix@,$prefix,;t t\ns,@program_transform_name@,$program_transform_name,;t t\ns,@bindir@,$bindir,;t t\ns,@sbindir@,$sbindir,;t t\ns,@libexecdir@,$libexecdir,;t t\ns,@datadir@,$datadir,;t t\ns,@sysconfdir@,$sysconfdir,;t t\ns,@sharedstatedir@,$sharedstatedir,;t t\ns,@localstatedir@,$localstatedir,;t t\ns,@libdir@,$libdir,;t t\ns,@includedir@,$includedir,;t t\ns,@oldincludedir@,$oldincludedir,;t t\ns,@infodir@,$infodir,;t t\ns,@mandir@,$mandir,;t t\ns,@build_alias@,$build_alias,;t t\ns,@host_alias@,$host_alias,;t t\ns,@target_alias@,$target_alias,;t t\ns,@DEFS@,$DEFS,;t t\ns,@ECHO_C@,$ECHO_C,;t t\ns,@ECHO_N@,$ECHO_N,;t t\ns,@ECHO_T@,$ECHO_T,;t t\ns,@LIBS@,$LIBS,;t t\ns,@build@,$build,;t t\ns,@build_cpu@,$build_cpu,;t t\ns,@build_vendor@,$build_vendor,;t t\ns,@build_os@,$build_os,;t t\ns,@host@,$host,;t t\ns,@host_cpu@,$host_cpu,;t t\ns,@host_vendor@,$host_vendor,;t t\ns,@host_os@,$host_os,;t t\ns,@CC@,$CC,;t t\ns,@CFLAGS@,$CFLAGS,;t t\ns,@LDFLAGS@,$LDFLAGS,;t t\ns,@CPPFLAGS@,$CPPFLAGS,;t t\ns,@ac_ct_CC@,$ac_ct_CC,;t t\ns,@EXEEXT@,$EXEEXT,;t t\ns,@OBJEXT@,$OBJEXT,;t t\ns,@RANLIB@,$RANLIB,;t t\ns,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t\ns,@CPP@,$CPP,;t t\ns,@EGREP@,$EGREP,;t t\ns,@LIB_OBJS@,$LIB_OBJS,;t t\ns,@LIBFREE_OBJS@,$LIBFREE_OBJS,;t t\ns,@LIBGAI_OBJS@,$LIBGAI_OBJS,;t t\ns,@LIBROUTE_OBJS@,$LIBROUTE_OBJS,;t t\ns,@LIBXTI_OBJS@,$LIBXTI_OBJS,;t t\ns,@LIBS_XTI@,$LIBS_XTI,;t t\ns,@LIBUNP@,$LIBUNP,;t t\ns,@LIBUNPXTI@,$LIBUNPXTI,;t t\ns,@LIBUNP_NAME@,$LIBUNP_NAME,;t t\ns,@LIBUNPXTI_NAME@,$LIBUNPXTI_NAME,;t t\ns,@LIBOBJS@,$LIBOBJS,;t t\ns,@LTLIBOBJS@,$LTLIBOBJS,;t t\nCEOF\n\n_ACEOF\n\n  cat >>$CONFIG_STATUS <<\\_ACEOF\n  # Split the substitutions into bite-sized pieces for seds with\n  # small command number limits, like on Digital OSF/1 and HP-UX.\n  ac_max_sed_lines=48\n  ac_sed_frag=1 # Number of current file.\n  ac_beg=1 # First line for current file.\n  ac_end=$ac_max_sed_lines # Line after last line for current file.\n  ac_more_lines=:\n  ac_sed_cmds=\n  while $ac_more_lines; do\n    if test $ac_beg -gt 1; then\n      sed \"1,${ac_beg}d; ${ac_end}q\" $tmp/subs.sed >$tmp/subs.frag\n    else\n      sed \"${ac_end}q\" $tmp/subs.sed >$tmp/subs.frag\n    fi\n    if test ! -s $tmp/subs.frag; then\n      ac_more_lines=false\n    else\n      # The purpose of the label and of the branching condition is to\n      # speed up the sed processing (if there are no `@' at all, there\n      # is no need to browse any of the substitutions).\n      # These are the two extra sed commands mentioned above.\n      (echo ':t\n  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed\n      if test -z \"$ac_sed_cmds\"; then\n  \tac_sed_cmds=\"sed -f $tmp/subs-$ac_sed_frag.sed\"\n      else\n  \tac_sed_cmds=\"$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed\"\n      fi\n      ac_sed_frag=`expr $ac_sed_frag + 1`\n      ac_beg=$ac_end\n      ac_end=`expr $ac_end + $ac_max_sed_lines`\n    fi\n  done\n  if test -z \"$ac_sed_cmds\"; then\n    ac_sed_cmds=cat\n  fi\nfi # test -n \"$CONFIG_FILES\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\nfor ac_file in : $CONFIG_FILES; do test \"x$ac_file\" = x: && continue\n  # Support \"outfile[:infile[:infile...]]\", defaulting infile=\"outfile.in\".\n  case $ac_file in\n  - | *:- | *:-:* ) # input from stdin\n        cat >$tmp/stdin\n        ac_file_in=`echo \"$ac_file\" | sed 's,[^:]*:,,'`\n        ac_file=`echo \"$ac_file\" | sed 's,:.*,,'` ;;\n  *:* ) ac_file_in=`echo \"$ac_file\" | sed 's,[^:]*:,,'`\n        ac_file=`echo \"$ac_file\" | sed 's,:.*,,'` ;;\n  * )   ac_file_in=$ac_file.in ;;\n  esac\n\n  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.\n  ac_dir=`(dirname \"$ac_file\") 2>/dev/null ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n         X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n         X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n         X\"$ac_file\" : 'X\\(/\\)' \\| \\\n         .     : '\\(.\\)' 2>/dev/null ||\necho X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n  { if $as_mkdir_p; then\n    mkdir -p \"$ac_dir\"\n  else\n    as_dir=\"$ac_dir\"\n    as_dirs=\n    while test ! -d \"$as_dir\"; do\n      as_dirs=\"$as_dir $as_dirs\"\n      as_dir=`(dirname \"$as_dir\") 2>/dev/null ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n         X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n         X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n         X\"$as_dir\" : 'X\\(/\\)' \\| \\\n         .     : '\\(.\\)' 2>/dev/null ||\necho X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n    done\n    test ! -n \"$as_dirs\" || mkdir $as_dirs\n  fi || { { echo \"$as_me:$LINENO: error: cannot create directory \\\"$ac_dir\\\"\" >&5\necho \"$as_me: error: cannot create directory \\\"$ac_dir\\\"\" >&2;}\n   { (exit 1); exit 1; }; }; }\n\n  ac_builddir=.\n\nif test \"$ac_dir\" != .; then\n  ac_dir_suffix=/`echo \"$ac_dir\" | sed 's,^\\.[\\\\/],,'`\n  # A \"../\" for each directory in $ac_dir_suffix.\n  ac_top_builddir=`echo \"$ac_dir_suffix\" | sed 's,/[^\\\\/]*,../,g'`\nelse\n  ac_dir_suffix= ac_top_builddir=\nfi\n\ncase $srcdir in\n  .)  # No --srcdir option.  We are building in place.\n    ac_srcdir=.\n    if test -z \"$ac_top_builddir\"; then\n       ac_top_srcdir=.\n    else\n       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`\n    fi ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute path.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir ;;\n  *) # Relative path.\n    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_builddir$srcdir ;;\nesac\n# Don't blindly perform a `cd \"$ac_dir\"/$ac_foo && pwd` since $ac_foo can be\n# absolute.\nac_abs_builddir=`cd \"$ac_dir\" && cd $ac_builddir && pwd`\nac_abs_top_builddir=`cd \"$ac_dir\" && cd ${ac_top_builddir}. && pwd`\nac_abs_srcdir=`cd \"$ac_dir\" && cd $ac_srcdir && pwd`\nac_abs_top_srcdir=`cd \"$ac_dir\" && cd $ac_top_srcdir && pwd`\n\n\n\n  if test x\"$ac_file\" != x-; then\n    { echo \"$as_me:$LINENO: creating $ac_file\" >&5\necho \"$as_me: creating $ac_file\" >&6;}\n    rm -f \"$ac_file\"\n  fi\n  # Let's still pretend it is `configure' which instantiates (i.e., don't\n  # use $as_me), people would be surprised to read:\n  #    /* config.h.  Generated by config.status.  */\n  if test x\"$ac_file\" = x-; then\n    configure_input=\n  else\n    configure_input=\"$ac_file.  \"\n  fi\n  configure_input=$configure_input\"Generated from `echo $ac_file_in |\n                                     sed 's,.*/,,'` by configure.\"\n\n  # First look for the input files in the build tree, otherwise in the\n  # src tree.\n  ac_file_inputs=`IFS=:\n    for f in $ac_file_in; do\n      case $f in\n      -) echo $tmp/stdin ;;\n      [\\\\/$]*)\n         # Absolute (can't be DOS-style, as IFS=:)\n         test -f \"$f\" || { { echo \"$as_me:$LINENO: error: cannot find input file: $f\" >&5\necho \"$as_me: error: cannot find input file: $f\" >&2;}\n   { (exit 1); exit 1; }; }\n         echo $f;;\n      *) # Relative\n         if test -f \"$f\"; then\n           # Build tree\n           echo $f\n         elif test -f \"$srcdir/$f\"; then\n           # Source tree\n           echo $srcdir/$f\n         else\n           # /dev/null tree\n           { { echo \"$as_me:$LINENO: error: cannot find input file: $f\" >&5\necho \"$as_me: error: cannot find input file: $f\" >&2;}\n   { (exit 1); exit 1; }; }\n         fi;;\n      esac\n    done` || { (exit 1); exit 1; }\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF\n  sed \"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns,@configure_input@,$configure_input,;t t\ns,@srcdir@,$ac_srcdir,;t t\ns,@abs_srcdir@,$ac_abs_srcdir,;t t\ns,@top_srcdir@,$ac_top_srcdir,;t t\ns,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t\ns,@builddir@,$ac_builddir,;t t\ns,@abs_builddir@,$ac_abs_builddir,;t t\ns,@top_builddir@,$ac_top_builddir,;t t\ns,@abs_top_builddir@,$ac_abs_top_builddir,;t t\n\" $ac_file_inputs | (eval \"$ac_sed_cmds\") >$tmp/out\n  rm -f $tmp/stdin\n  if test x\"$ac_file\" != x-; then\n    mv $tmp/out $ac_file\n  else\n    cat $tmp/out\n    rm -f $tmp/out\n  fi\n\ndone\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF\n\n#\n# CONFIG_HEADER section.\n#\n\n# These sed commands are passed to sed as \"A NAME B NAME C VALUE D\", where\n# NAME is the cpp macro being defined and VALUE is the value it is being given.\n#\n# ac_d sets the value in \"#define NAME VALUE\" lines.\nac_dA='s,^\\([ \t]*\\)#\\([ \t]*define[ \t][ \t]*\\)'\nac_dB='[ \t].*$,\\1#\\2'\nac_dC=' '\nac_dD=',;t'\n# ac_u turns \"#undef NAME\" without trailing blanks into \"#define NAME VALUE\".\nac_uA='s,^\\([ \t]*\\)#\\([ \t]*\\)undef\\([ \t][ \t]*\\)'\nac_uB='$,\\1#\\2define\\3'\nac_uC=' '\nac_uD=',;t'\n\nfor ac_file in : $CONFIG_HEADERS; do test \"x$ac_file\" = x: && continue\n  # Support \"outfile[:infile[:infile...]]\", defaulting infile=\"outfile.in\".\n  case $ac_file in\n  - | *:- | *:-:* ) # input from stdin\n        cat >$tmp/stdin\n        ac_file_in=`echo \"$ac_file\" | sed 's,[^:]*:,,'`\n        ac_file=`echo \"$ac_file\" | sed 's,:.*,,'` ;;\n  *:* ) ac_file_in=`echo \"$ac_file\" | sed 's,[^:]*:,,'`\n        ac_file=`echo \"$ac_file\" | sed 's,:.*,,'` ;;\n  * )   ac_file_in=$ac_file.in ;;\n  esac\n\n  test x\"$ac_file\" != x- && { echo \"$as_me:$LINENO: creating $ac_file\" >&5\necho \"$as_me: creating $ac_file\" >&6;}\n\n  # First look for the input files in the build tree, otherwise in the\n  # src tree.\n  ac_file_inputs=`IFS=:\n    for f in $ac_file_in; do\n      case $f in\n      -) echo $tmp/stdin ;;\n      [\\\\/$]*)\n         # Absolute (can't be DOS-style, as IFS=:)\n         test -f \"$f\" || { { echo \"$as_me:$LINENO: error: cannot find input file: $f\" >&5\necho \"$as_me: error: cannot find input file: $f\" >&2;}\n   { (exit 1); exit 1; }; }\n         echo $f;;\n      *) # Relative\n         if test -f \"$f\"; then\n           # Build tree\n           echo $f\n         elif test -f \"$srcdir/$f\"; then\n           # Source tree\n           echo $srcdir/$f\n         else\n           # /dev/null tree\n           { { echo \"$as_me:$LINENO: error: cannot find input file: $f\" >&5\necho \"$as_me: error: cannot find input file: $f\" >&2;}\n   { (exit 1); exit 1; }; }\n         fi;;\n      esac\n    done` || { (exit 1); exit 1; }\n  # Remove the trailing spaces.\n  sed 's/[ \t]*$//' $ac_file_inputs >$tmp/in\n\n_ACEOF\n\n# Transform confdefs.h into two sed scripts, `conftest.defines' and\n# `conftest.undefs', that substitutes the proper values into\n# config.h.in to produce config.h.  The first handles `#define'\n# templates, and the second `#undef' templates.\n# And first: Protect against being on the right side of a sed subst in\n# config.status.  Protect against being in an unquoted here document\n# in config.status.\nrm -f conftest.defines conftest.undefs\n# Using a here document instead of a string reduces the quoting nightmare.\n# Putting comments in sed scripts is not portable.\n#\n# `end' is used to avoid that the second main sed command (meant for\n# 0-ary CPP macros) applies to n-ary macro definitions.\n# See the Autoconf documentation for `clear'.\ncat >confdef2sed.sed <<\\_ACEOF\ns/[\\\\&,]/\\\\&/g\ns,[\\\\$`],\\\\&,g\nt clear\n: clear\ns,^[ \t]*#[ \t]*define[ \t][ \t]*\\([^ \t(][^ \t(]*\\)\\(([^)]*)\\)[ \t]*\\(.*\\)$,${ac_dA}\\1${ac_dB}\\1\\2${ac_dC}\\3${ac_dD},gp\nt end\ns,^[ \t]*#[ \t]*define[ \t][ \t]*\\([^ \t][^ \t]*\\)[ \t]*\\(.*\\)$,${ac_dA}\\1${ac_dB}\\1${ac_dC}\\2${ac_dD},gp\n: end\n_ACEOF\n# If some macros were called several times there might be several times\n# the same #defines, which is useless.  Nevertheless, we may not want to\n# sort them, since we want the *last* AC-DEFINE to be honored.\nuniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines\nsed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs\nrm -f confdef2sed.sed\n\n# This sed command replaces #undef with comments.  This is necessary, for\n# example, in the case of _POSIX_SOURCE, which is predefined and required\n# on some systems where configure will not decide to define it.\ncat >>conftest.undefs <<\\_ACEOF\ns,^[ \t]*#[ \t]*undef[ \t][ \t]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,\n_ACEOF\n\n# Break up conftest.defines because some shells have a limit on the size\n# of here documents, and old seds have small limits too (100 cmds).\necho '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS\necho '  if grep \"^[ \t]*#[ \t]*define\" $tmp/in >/dev/null; then' >>$CONFIG_STATUS\necho '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS\necho '  :' >>$CONFIG_STATUS\nrm -f conftest.tail\nwhile grep . conftest.defines >/dev/null\ndo\n  # Write a limited-size here document to $tmp/defines.sed.\n  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS\n  # Speed up: don't consider the non `#define' lines.\n  echo '/^[ \t]*#[ \t]*define/!b' >>$CONFIG_STATUS\n  # Work around the forget-to-reset-the-flag bug.\n  echo 't clr' >>$CONFIG_STATUS\n  echo ': clr' >>$CONFIG_STATUS\n  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS\n  echo 'CEOF\n  sed -f $tmp/defines.sed $tmp/in >$tmp/out\n  rm -f $tmp/in\n  mv $tmp/out $tmp/in\n' >>$CONFIG_STATUS\n  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail\n  rm -f conftest.defines\n  mv conftest.tail conftest.defines\ndone\nrm -f conftest.defines\necho '  fi # grep' >>$CONFIG_STATUS\necho >>$CONFIG_STATUS\n\n# Break up conftest.undefs because some shells have a limit on the size\n# of here documents, and old seds have small limits too (100 cmds).\necho '  # Handle all the #undef templates' >>$CONFIG_STATUS\nrm -f conftest.tail\nwhile grep . conftest.undefs >/dev/null\ndo\n  # Write a limited-size here document to $tmp/undefs.sed.\n  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS\n  # Speed up: don't consider the non `#undef'\n  echo '/^[ \t]*#[ \t]*undef/!b' >>$CONFIG_STATUS\n  # Work around the forget-to-reset-the-flag bug.\n  echo 't clr' >>$CONFIG_STATUS\n  echo ': clr' >>$CONFIG_STATUS\n  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS\n  echo 'CEOF\n  sed -f $tmp/undefs.sed $tmp/in >$tmp/out\n  rm -f $tmp/in\n  mv $tmp/out $tmp/in\n' >>$CONFIG_STATUS\n  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail\n  rm -f conftest.undefs\n  mv conftest.tail conftest.undefs\ndone\nrm -f conftest.undefs\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n  # Let's still pretend it is `configure' which instantiates (i.e., don't\n  # use $as_me), people would be surprised to read:\n  #    /* config.h.  Generated by config.status.  */\n  if test x\"$ac_file\" = x-; then\n    echo \"/* Generated by configure.  */\" >$tmp/config.h\n  else\n    echo \"/* $ac_file.  Generated by configure.  */\" >$tmp/config.h\n  fi\n  cat $tmp/in >>$tmp/config.h\n  rm -f $tmp/in\n  if test x\"$ac_file\" != x-; then\n    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then\n      { echo \"$as_me:$LINENO: $ac_file is unchanged\" >&5\necho \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      ac_dir=`(dirname \"$ac_file\") 2>/dev/null ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n         X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n         X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n         X\"$ac_file\" : 'X\\(/\\)' \\| \\\n         .     : '\\(.\\)' 2>/dev/null ||\necho X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n      { if $as_mkdir_p; then\n    mkdir -p \"$ac_dir\"\n  else\n    as_dir=\"$ac_dir\"\n    as_dirs=\n    while test ! -d \"$as_dir\"; do\n      as_dirs=\"$as_dir $as_dirs\"\n      as_dir=`(dirname \"$as_dir\") 2>/dev/null ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n         X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n         X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n         X\"$as_dir\" : 'X\\(/\\)' \\| \\\n         .     : '\\(.\\)' 2>/dev/null ||\necho X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)[^/].*/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\/\\)$/{ s//\\1/; q; }\n  \t  /^X\\(\\/\\).*/{ s//\\1/; q; }\n  \t  s/.*/./; q'`\n    done\n    test ! -n \"$as_dirs\" || mkdir $as_dirs\n  fi || { { echo \"$as_me:$LINENO: error: cannot create directory \\\"$ac_dir\\\"\" >&5\necho \"$as_me: error: cannot create directory \\\"$ac_dir\\\"\" >&2;}\n   { (exit 1); exit 1; }; }; }\n\n      rm -f $ac_file\n      mv $tmp/config.h $ac_file\n    fi\n  else\n    cat $tmp/config.h\n    rm -f $tmp/config.h\n  fi\ndone\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF\n\n{ (exit 0); exit 0; }\n_ACEOF\nchmod +x $CONFIG_STATUS\nac_clean_files=$ac_clean_files_save\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || { (exit 1); exit 1; }\nfi\n\n\nif test -d \"$host\" ; then\n   cp -p config.h config.cache config.status Makefile Make.defines $host\n   echo \"saving copies in $host/\"\nfi\n"
  },
  {
    "path": "configure.in",
    "content": "dnl\ndnl autoconf script for UNP 3/e Volume 1 source code.\ndnl Process this file with autoconf to produce a configure script.\ndnl\ndnl The end result of running configure is the \"config.h\" file and the\ndnl \"Make.defines\" file in the current directory.  These two files are\ndnl created from the \"config.h.in\" and \"Make.defines.in\" files in the\ndnl current directory.\ndnl\ndnl The header \"unp.h\" that is in every source directory then does a\ndnl #include \"../config.h\" and the Makefile in each source directory\ndnl then does a include of ../Make.defines.\ndnl\nAC_REVISION($Revision: 1.13 $)\nAC_INIT(lib/unp.h)\nAC_CANONICAL_HOST\nAC_CONFIG_HEADER(config.h)\n\ndnl The following cpu_vendor_os string goes into config.h.\ndnl\nAC_DEFINE_UNQUOTED(CPU_VENDOR_OS, \"$host\", [CPU, vendor, and operating system])\n\ndnl ##################################################################\ndnl Checks for programs.\ndnl\n\ndnl Some system-specific stuff ...\ndnl Some operating systems require additional flags in order to get all\ndnl the definitions that we're looking for in some system headers.\ndnl The configure script uses both CFLAGS and CPPFLAGS when compiling.\ncase \"$host_os\" in\n*aix*)\t\tCPPFLAGS=\"$CPPFLAGS -D_ALL_SOURCE\" ;;\n*osf*)\t\tCPPFLAGS=\"$CPPFLAGS -D_SOCKADDR_LEN\" ;;\nesac\n\nAC_PROG_CC\nAC_PROG_RANLIB\n\ndnl ##################################################################\ndnl Checks for libraries.\ndnl The order of these tests is the *reverse* order of the libraries in\ndnl the LIBS variable that is constructed: each new one gets prepended,\ndnl not appended.\ndnl\ndnl We are building three strings here; something like:\ndnl\tLIBS=\"-lresolv -lsocket -lnsl -lpthread\"\ndnl\tLIBS_XTI=\"-lxti -lresolv -lnsl -lpthread\"\ndnl\tLIBUNP=\"./libunp.a\"\ndnl\tLIBUNPXTI=\"./libunpxti.a\"\ndnl\ndnl If a threads library is found, need to update CFLAGS too.\ndnl\nAC_CHECK_LIB(pthread, pthread_create)\nif test \"$ac_cv_lib_pthread_pthread_create\" = yes ; then\n   CFLAGS=\"$CFLAGS -D_REENTRANT\"\nelse\n   AC_CHECK_LIB(pthreads, pthread_create)\n   if test \"$ac_cv_lib_pthreads_pthread_create\" = yes ; then\n      CFLAGS=\"$CFLAGS -D_REENTRANT\"\n   fi\nfi\n\nAC_CHECK_LIB(nsl, t_open)\nAC_SEARCH_LIBS(socket, socket)\n\ndnl Bind 8.1.1 places its library in /usr/local/bind/lib/libbind.a; we check\ndnl for it first.  Also check for libbind.a in user's home directory.\ndnl If there is a libresolv.a in the user's HOME directory, we will use\ndnl that instead of -lresolv.  Need this for people interested in building\ndnl an IPv6-knowledgable resolver, instead of using the system provided\ndnl resolver (which is often way out of date).\ndnl\nAC_MSG_CHECKING(for /usr/local/bind/lib/libbind.a)\nif test -f /usr/local/bind/lib/libbind.a ; then\n\tAC_MSG_RESULT(yes)\n\tLIBS=\"/usr/local/bind/lib/libbind.a  $LIBS\"\nelse\n\tAC_MSG_RESULT(no)\n\tAC_MSG_CHECKING(for $HOME/libbind.a)\n\tif test -f $HOME/libbind.a ; then\n\t\tAC_MSG_RESULT(yes)\n\t\tLIBS=\"$HOME/libbind.a  $LIBS\"\n\telse\n\t\tAC_MSG_RESULT(no)\n\t\tAC_MSG_CHECKING(for $HOME/libresolv.a)\n\t\tif test -f $HOME/libresolv.a ; then\n\t\t\tAC_MSG_RESULT(yes)\n\t\t\tLIBS=\"$HOME/libresolv.a  $LIBS\"\n\t\telse\n\t\t\tAC_MSG_RESULT(no)\n\t\t\tAC_CHECK_LIB(resolv, res_init)\n\t\tfi\n\tfi\nfi\n\ndnl Now check for XTI library.\ndnl\nAC_CHECK_LIB(xti, t_open)\n\ndnl We now need to check for our own libraries, but we cannot prepend\ndnl them to the LIBS variable, as that variable is used when compiling\ndnl programs later in this script, and that would mess things up.\ndnl\ndnl If the user has a file named $HOME/libunp.a, then use it.\ndnl Else store our library in current directory.\ndnl I use this because my source directory is NFS mounted from my various\ndnl systems, but I have a unique home directory on each system.\ndnl\nAC_MSG_CHECKING(for $HOME/libunp.a)\nif test -f $HOME/libunp.a ; then\n\tAC_MSG_RESULT(yes)\n\tLIBUNP=\"$HOME/libunp.a\"\n\tLIBUNP_NAME=$HOME/libunp.a\nelse\n\tAC_MSG_RESULT(no, using ./libunp.a)\n\tLIBUNP=\"../libunp.a\"\n\tLIBUNP_NAME=../libunp.a\nfi\n\ndnl If the user has a file named $HOME/libunpxti.a, then use it.\ndnl Else store our library in current directory.\ndnl Same reasoning as above.\ndnl\nAC_MSG_CHECKING(for $HOME/libunpxti.a)\nif test -f $HOME/libunpxti.a ; then\n\tAC_MSG_RESULT(yes)\n\tLIBUNPXTI=\"$HOME/libunpxti.a\"\n\tLIBUNPXTI_NAME=$HOME/libunpxti.a\nelse\n\tAC_MSG_RESULT(no, using ./libunpxti.a)\n\tLIBUNPXTI=\"../libunpxti.a\"\n\tLIBUNPXTI_NAME=../libunpxti.a\nfi\n\ndnl ##################################################################\ndnl Checks for header files.\ndnl\ndnl The list of headers in the AC_CHECK_HEADERS macro is the same as in\ndnl our \"unp.h\" header, followed by our \"unpxti.h\" header.\ndnl\nAC_HEADER_STDC\ndnl\ndnl The includes (the 4th argument to AC_CHECK_HEADERS) here are\ndnl the defeault set ($ac_includes_default) plus <sys/param.h>\ndnl for <sys/sysctl.h> on NetBSD and OpenBSD.\nAC_CHECK_HEADERS(sys/types.h sys/socket.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h fcntl.h netdb.h signal.h stdio.h stdlib.h string.h sys/stat.h sys/uio.h unistd.h sys/wait.h sys/un.h sys/param.h sys/select.h sys/sysctl.h poll.h sys/event.h strings.h sys/ioctl.h sys/filio.h sys/sockio.h pthread.h net/if_dl.h xti.h xti_inet.h netconfig.h netdir.h stropts.h, [], [], [\n#include <stdio.h>\n#if HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#if HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#if STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# if HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#if HAVE_STRING_H\n# if !STDC_HEADERS && HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#if HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#if HAVE_INTTYPES_H\n# include <inttypes.h>\n#else\n# if HAVE_STDINT_H\n#  include <stdint.h>\n# endif\n#endif\n#if HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n#if HAVE_SYS_PARAM_H\n# include <sys/param.h>\n#endif])\n\ndnl ##################################################################\ndnl Checks for typedefs.\ndnl\ndnl We use our own AC_UNP_CHECK_TYPE macro, instead of AC_CHECK_TYPE,\ndnl to #include more headers.  Our macro is defined in \"aclocal.m4\".\ndnl\nAC_HEADER_TIME\nAC_UNP_CHECK_TYPE(uint8_t, unsigned char, 8-bit unsigned type)\nAC_UNP_CHECK_TYPE(int16_t, short, 16 bit signed type)\nAC_UNP_CHECK_TYPE(uint16_t, unsigned short, 16 bit unsigned type)\nAC_UNP_CHECK_TYPE(int32_t, int, 32 bit signed type)\nAC_UNP_CHECK_TYPE(uint32_t, unsigned int, 32 bit unsigned type)\nAC_UNP_CHECK_TYPE(size_t, unsigned int, unsigned integer type of the result of the sizeof operator)\nAC_UNP_CHECK_TYPE(ssize_t, int, a signed type appropriate for a count of bytes or an error indication)\nAC_UNP_CHECK_TYPE(socklen_t, unsigned int, a type appropriate for address, hostname, buffer, etc. lengths)\ndnl\ndnl The SA_FAMILY_T in the following is #defined later, as its definition\ndnl depends on whether socket address structures have a length field or not.\ndnl\nAC_UNP_CHECK_TYPE(sa_family_t, SA_FAMILY_T, the type of the sa_family struct member)\n\ndnl We also have our own macro to check for XTI definitions, that can\ndnl be defined after #include of our \"unpxti.h\" header.\ndnl\nAC_UNPXTI_CHECK_TYPE(t_scalar_t, int32_t, scalar type)\nAC_UNPXTI_CHECK_TYPE(t_uscalar_t, uint32_t, unsigned scalar type)\n\ndnl ##################################################################\ndnl Check if sockaddr{} has sa_len member.\ndnl\nAC_CHECK_MEMBER([struct sockaddr.sa_len],\n AC_DEFINE(HAVE_SOCKADDR_SA_LEN, 1, define if socket address structures have length fields),,[\n#include <sys/types.h>\n#include <sys/socket.h>])\n\ndnl Now we can complete the definition for sa_family_t, if needed.\ndnl The size of this datatype depends whether socket address structures\ndnl have a length field or not.\ndnl\nif test $ac_cv_type_sa_family_t = no ; then\n   if test $ac_cv_member_struct_sockaddr_sa_len = yes ; then\n      AC_DEFINE(SA_FAMILY_T, uint8_t, the size of the sa_family field in a socket address structure)\n   else\n      AC_DEFINE(SA_FAMILY_T, uint16_t)\n   fi\nfi\n\ndnl\ndnl Check for sockaddr_storage.\ndnl If it's present, check for ss_family.\ndnl If ss_family isn't there, check for __ss_family and\ndnl  #define ss_family __ss_family if so.\ndnl If neither is there, I don't know what to do.\ndnl\nAC_CHECK_TYPES([struct sockaddr_storage],\n  AC_CHECK_MEMBER([struct sockaddr_storage.ss_family],,\n   AC_CHECK_MEMBER([struct sockaddr_storage.__ss_family],\n    AC_DEFINE([ss_family],[__ss_family],[define to __ss_family if sockaddr_storage has that instead of ss_family]),\n    AC_MSG_ERROR([cannot find ss_family in sockaddr_storage]),[\n#include <sys/types.h>\n#include <sys/socket.h>]),[\n#include <sys/types.h>\n#include <sys/socket.h>]),,[\n#include <sys/types.h>\n#include <sys/socket.h>])\n\ndnl Check if msghdr{} has msg_control member.\ndnl\nAC_CHECK_MEMBER([struct msghdr.msg_control],\n AC_DEFINE(HAVE_MSGHDR_MSG_CONTROL, 1, define if struct msghdr contains the msg_control member),,[\n#include <sys/types.h>\n#include <sys/socket.h>])\n\ndnl\ndnl Check for ifr_mtu in ifreq - some systems have SIOCGIFMTU\ndnl but don't have ifr_mtu!!\nAC_CHECK_MEMBERS([struct ifreq.ifr_mtu],,,\n[#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if.h>])\n\ndnl ##################################################################\ndnl Check for function prototypes in headers.\ndnl AC_CHECK_FUNC_PROTO is our own macro in \"aclocal.m4\".\ndnl\nAC_CHECK_FUNC_PROTO(getaddrinfo, netdb.h)\nAC_CHECK_FUNC_PROTO(getnameinfo, netdb.h)\nAC_CHECK_FUNC_PROTO(gethostname, unistd.h)\nAC_CHECK_FUNC_PROTO(getrusage, sys/resource.h)\nAC_CHECK_FUNC_PROTO(hstrerror, netdb.h)\nAC_CHECK_FUNC_PROTO(if_nametoindex, net/if.h)\nAC_CHECK_FUNC_PROTO(inet_aton, arpa/inet.h)\nAC_CHECK_FUNC_PROTO(inet_pton, arpa/inet.h)\nAC_CHECK_FUNC_PROTO(pselect, sys/select.h)\nAC_CHECK_FUNC_PROTO(snprintf, stdio.h)\nAC_CHECK_FUNC_PROTO(sockatmark, sys/socket.h)\ndnl\ndnl autoheader doesn't know how to handle the above, so we have\ndnl to help it out.\nAH_TEMPLATE(HAVE_GETADDRINFO_PROTO, define if getaddrinfo prototype is in <netdb.h>)\nAH_TEMPLATE(HAVE_GETNAMEINFO_PROTO, define if getnameinfo prototype is in <netdb.h>)\nAH_TEMPLATE(HAVE_GETHOSTNAME_PROTO, define if gethostname prototype is in <unistd.h>)\nAH_TEMPLATE(HAVE_GETRUSAGE_PROTO, define if getrusage prototype is in <sys/resource.h>)\nAH_TEMPLATE(HAVE_HSTRERROR_PROTO, define if hstrerror prototype is in <netdb.h>)\nAH_TEMPLATE(HAVE_IF_NAMETOINDEX_PROTO, define if if_nametoindex prototype is in <net/if.h>)\nAH_TEMPLATE(HAVE_INET_ATON_PROTO, define if inet_aton prototype is in <arpa/inet.h>)\nAH_TEMPLATE(HAVE_INET_PTON_PROTO, define if inet_pton prototype is in <arpa/inet.h>)\nAH_TEMPLATE(HAVE_PSELECT_PROTO, define if pselect prototype is in <sys/stat.h>)\nAH_TEMPLATE(HAVE_SNPRINTF_PROTO, define if snprintf prototype is in <stdio.h>)\nAH_TEMPLATE(HAVE_SOCKATMARK_PROTO, define if sockatmark prototype is in <sys/socket.h>)\n\ndnl ##################################################################\ndnl Check for structure definitions.\ndnl\nAC_CHECK_TYPE(struct addrinfo,\n AC_DEFINE(HAVE_ADDRINFO_STRUCT, 1, Define to 1 if <netdb.h> defines struct addrinfo),,[\n#include <netdb.h>])\n\ndnl\nAC_CHECK_TYPE(struct if_nameindex,\n AC_DEFINE(HAVE_IF_NAMEINDEX_STRUCT, 1, Define to 1 if <net/if.h> defines struct if_nameindex),,[\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if.h>])\n\ndnl\nAC_CHECK_TYPE([struct sockaddr_dl],\n AC_DEFINE(HAVE_SOCKADDR_DL_STRUCT, 1, Define to 1 if <net/if_dl.h> defines struct sockaddr_dl),,[\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <net/if_dl.h>])\n\ndnl  OpenBSD puts struct timespec in <sys/time.h> instead of <time.h>,\ndnl  thus this complex test.\nAC_CHECK_TYPE([struct timespec],\n AC_DEFINE(HAVE_TIMESPEC_STRUCT, 1, Define to 1 if <time.h> or <sys/time.h> defines struct timespec),,[\n#if TIME_WITH_SYS_TIME\n#include <sys/time.h>\n#include <time.h>\n#else\n#if HAVE_SYS_TIME_H\n#include <sys/time.h>\n#else\n#include <time.h>\n#endif\n#endif\n])\n\ndnl ##################################################################\ndnl Check for XTI devices.\ndnl\nAC_MSG_CHECKING(for /dev/tcp)\nif test -r /dev/tcp ; then\n\tAC_DEFINE(HAVE_DEV_TCP, 1, Define to 1 if the /dev/tcp device exists)\n\tAC_MSG_RESULT(yes)\nelse\n\tAC_MSG_RESULT(no)\n\n\tAC_MSG_CHECKING(for /dev/xti/tcp)\n\tif test -r /dev/xti/tcp ; then\n\t\tAC_DEFINE(HAVE_DEV_XTI_TCP, 1, Define to 1 if the /dev/xti/tcp device exists)\n\t\tAC_MSG_RESULT(yes)\n\telse\n\t\tAC_MSG_RESULT(no)\n\n\t\tAC_MSG_CHECKING(for /dev/streams/xtiso/tcp)\n\t\tif test -r /dev/streams/xtiso/tcp ; then\n\t\t\tAC_DEFINE(HAVE_DEV_STREAMS_XTISO_TCP, 1, Define to 1 if the /dev/streams/xtiso/tcp device exists)\n\t\t\tAC_MSG_RESULT(yes)\n\t\telse\n\t\t\tAC_MSG_RESULT(no)\n\t\tfi\n\tfi\nfi\n\ndnl ##################################################################\ndnl Checks for library functions.\ndnl\nAC_CHECK_FUNCS(bzero)\nAC_CHECK_FUNCS(getaddrinfo)\nAC_CHECK_FUNCS(gethostname)\nAC_CHECK_FUNCS(gethostbyname2)\nAC_CHECK_FUNCS(gethostbyname_r)\nAC_CHECK_FUNCS(getnameinfo)\nAC_CHECK_FUNCS(hstrerror)\nAC_CHECK_FUNCS(if_nametoindex)\nAC_CHECK_FUNCS(inet_aton)\nAC_CHECK_FUNCS(inet_pton)\nAC_CHECK_FUNCS(inet6_rth_init)\nAC_CHECK_FUNCS(kqueue kevent)\nAC_CHECK_FUNCS(mkstemp)\nAC_CHECK_FUNCS(poll)\nAC_CHECK_FUNCS(pselect)\nAC_CHECK_FUNCS(snprintf)\nAC_CHECK_FUNCS(sockatmark)\nAC_CHECK_FUNCS(vsnprintf)\n\ndnl ##################################################################\ndnl Check for system services.\n\ndnl Let's see if the system really supports IPv4.\ndnl\nAC_MSG_CHECKING(for IPv4 support)\nAC_CACHE_VAL(ac_cv_ipv4,\n\tAC_TRY_RUN([\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <netinet/in.h>\n\t/* Make sure the definitions for AF_INET and struct sockaddr_in\n\t * are defined, and that we can actually create an IPv4 TCP socket.\n\t */\n\tmain()\n\t{\n\t\tint fd;\n\t\tstruct sockaddr_in foo;\n\t\tfd = socket(AF_INET, SOCK_STREAM, 0);\n\t\texit(fd >= 0 ? 0 : 1);\n\t}],\n\tac_cv_ipv4=yes,\n\tac_cv_ipv4=no,\n\tac_cv_ipv4=no))\nAC_MSG_RESULT($ac_cv_ipv4)\nif test $ac_cv_ipv4 = yes ; then\n\tAC_DEFINE(IPV4, 1, Define to 1 if the system supports IPv4)\n\tAC_DEFINE(IPv4, 1, Define to 1 if the system supports IPv4)\nfi\n\ndnl Let's see if the system really supports IPv6.\ndnl\nAC_MSG_CHECKING(for IPv6 support)\nAC_CACHE_VAL(ac_cv_ipv6,\n\tAC_TRY_RUN([\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <netinet/in.h>\n\t/* Make sure the definitions for AF_INET6 and struct sockaddr_in6\n\t * are defined, and that we can actually create an IPv6 TCP socket.\n\t */\n\tmain()\n\t{\n\t\tint fd;\n\t\tstruct sockaddr_in6 foo;\n\t\tfd = socket(AF_INET6, SOCK_STREAM, 0);\n\t\texit(fd >= 0 ? 0 : 1);\n\t}],\n\tac_cv_ipv6=yes,\n\tac_cv_ipv6=no,\n\tac_cv_ipv6=no))\nAC_MSG_RESULT($ac_cv_ipv6)\nif test $ac_cv_ipv6 = yes ; then\n\tAC_DEFINE(IPV6, 1, Define to 1 if the system supports IPv6)\n\tAC_DEFINE(IPv6, 1, Define to 1 if the system supports IPv6)\nfi\n\ndnl Let's see if the system really supports Unix domain sockets.\ndnl\nAC_MSG_CHECKING(for Unix domain sockets)\nAC_CACHE_VAL(ac_cv_unixdomain,\n\tAC_TRY_RUN([\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <sys/un.h>\n\t/* Make sure the definitions for AF_UNIX and struct sockaddr_un\n\t * are defined, and that we can actually create an IPv4 TCP socket.\n\t */\n\tmain()\n\t{\n\t\tint fd;\n\t\tstruct sockaddr_un foo;\n\t\tfd = socket(AF_UNIX, SOCK_STREAM, 0);\n\t\texit(fd >= 0 ? 0 : 1);\n\t}],\n\tac_cv_unixdomain=yes,\n\tac_cv_unixdomain=no,\n\tac_cv_unixdomain=no))\nAC_MSG_RESULT($ac_cv_unixdomain)\nif test $ac_cv_unixdomain = yes ; then\n\tAC_DEFINE(UNIXDOMAIN, 1, Define to 1 if the system supports UNIX domain sockets)\n\tAC_DEFINE(UNIXdomain, 1, Define to 1 if the system supports UNIX domain sockets)\nfi\n\ndnl Let's see if the system really supports multicasting.\ndnl\nAC_MSG_CHECKING(for multicast support)\nAC_CACHE_VAL(ac_cv_multicast,\n\tAC_TRY_RUN([\n#\tinclude <sys/types.h>\n#\tinclude <sys/socket.h>\n#\tinclude <netinet/in.h>\n\tmain()\n\t{\n\t\tint fd;\n\t\tunsigned char flag = 1;\n\t\tstruct sockaddr_in foo;\n\t\tstruct ip_mreq mreq;\n\t\tfd = socket(AF_INET, SOCK_DGRAM, 0);\n\t\tif (fd < 0) exit(1);\n\t\tif (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,\n\t\t\t       (void*)&flag, sizeof(flag)) < 0)\n\t\t\texit(1);\n\t\texit(0);\n\t}],\n\tac_cv_multicast=yes,\n\tac_cv_multicast=no,\n\tac_cv_multicast=no))\nAC_MSG_RESULT($ac_cv_multicast)\nif test $ac_cv_multicast = yes ; then\n\tAC_DEFINE(MCAST, 1, Define to 1 if the system supports IP Multicast)\nfi\n\ndnl ##################################################################\ndnl Build the list of object files to build from the source files in\ndnl the lib/ directory.\ndnl\nLIB_OBJS=\nLIB_OBJS=\"$LIB_OBJS connect_nonb.o\"\nLIB_OBJS=\"$LIB_OBJS connect_timeo.o\"\nLIB_OBJS=\"$LIB_OBJS daemon_inetd.o\"\nLIB_OBJS=\"$LIB_OBJS daemon_init.o\"\nLIB_OBJS=\"$LIB_OBJS dg_cli.o\"\nLIB_OBJS=\"$LIB_OBJS dg_echo.o\"\nLIB_OBJS=\"$LIB_OBJS error.o\"\nLIB_OBJS=\"$LIB_OBJS get_ifi_info.o\"\nLIB_OBJS=\"$LIB_OBJS gf_time.o\"\nLIB_OBJS=\"$LIB_OBJS host_serv.o\"\nif test \"$ac_cv_func_hstrerror\" = no ; then\n   LIBFREE_OBJS=\"$LIBFREE_OBJS hstrerror.o\"\nfi\nif test \"$ac_cv_func_if_nametoindex\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS if_nametoindex.o if_indextoname.o if_nameindex.o\"\nfi\nif test \"$ac_cv_multicast\" = yes ; then\n   LIB_OBJS=\"$LIB_OBJS family_to_level.o\"\n   LIB_OBJS=\"$LIB_OBJS mcast_leave.o mcast_join.o\"\n   LIB_OBJS=\"$LIB_OBJS mcast_get_if.o mcast_get_loop.o mcast_get_ttl.o\"\n   LIB_OBJS=\"$LIB_OBJS mcast_set_if.o mcast_set_loop.o mcast_set_ttl.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS my_addrs.o\"\nif test \"$ac_cv_func_pselect\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS pselect.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS read_fd.o\"\nLIB_OBJS=\"$LIB_OBJS readline.o\"\nLIB_OBJS=\"$LIB_OBJS readn.o\"\nLIB_OBJS=\"$LIB_OBJS readable_timeo.o\"\nLIB_OBJS=\"$LIB_OBJS rtt.o\"\nLIB_OBJS=\"$LIB_OBJS signal.o\"\nLIB_OBJS=\"$LIB_OBJS signal_intr.o\"\nif test \"$ac_cv_func_snprintf\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS snprintf.o\"\nfi\nif test \"$ac_cv_func_sockatmark\" = no ; then\n   LIB_OBJS=\"$LIB_OBJS sockatmark.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS sock_bind_wild.o\"\nLIB_OBJS=\"$LIB_OBJS sock_cmp_addr.o\"\nLIB_OBJS=\"$LIB_OBJS sock_cmp_port.o\"\nLIB_OBJS=\"$LIB_OBJS sock_ntop.o\"\nLIB_OBJS=\"$LIB_OBJS sock_ntop_host.o\"\nLIB_OBJS=\"$LIB_OBJS sock_get_port.o\"\nLIB_OBJS=\"$LIB_OBJS sock_set_addr.o\"\nLIB_OBJS=\"$LIB_OBJS sock_set_port.o\"\nLIB_OBJS=\"$LIB_OBJS sock_set_wild.o\"\nLIB_OBJS=\"$LIB_OBJS sockfd_to_family.o\"\nLIB_OBJS=\"$LIB_OBJS str_cli.o\"\nLIB_OBJS=\"$LIB_OBJS str_echo.o\"\nLIB_OBJS=\"$LIB_OBJS tcp_connect.o\"\nLIB_OBJS=\"$LIB_OBJS tcp_listen.o\"\nLIB_OBJS=\"$LIB_OBJS tv_sub.o\"\nLIB_OBJS=\"$LIB_OBJS udp_client.o\"\nLIB_OBJS=\"$LIB_OBJS udp_connect.o\"\nLIB_OBJS=\"$LIB_OBJS udp_server.o\"\nLIB_OBJS=\"$LIB_OBJS wraplib.o\"\nLIB_OBJS=\"$LIB_OBJS wrapsock.o\"\nLIB_OBJS=\"$LIB_OBJS wrapstdio.o\"\nif test \"$ac_cv_header_pthread_h\" = yes ; then\n   LIB_OBJS=\"$LIB_OBJS wrappthread.o\"\nfi\nLIB_OBJS=\"$LIB_OBJS wrapunix.o\"\nLIB_OBJS=\"$LIB_OBJS write_fd.o\"\nLIB_OBJS=\"$LIB_OBJS writen.o\"\nLIB_OBJS=\"$LIB_OBJS writable_timeo.o\"\n\ndnl ##################################################################\ndnl Build the list of object files to build from the source files in\ndnl the libfree/ directory.\ndnl\nLIBFREE_OBJS=\n\nLIBFREE_OBJS=\"$LIBFREE_OBJS in_cksum.o\"\nif test \"$ac_cv_func_inet_aton\" = no ; then\n   LIBFREE_OBJS=\"$LIBFREE_OBJS inet_aton.o\"\nfi\n\ndnl We always include both inet_ntop() and inet_pton() because some\ndnl vendor's implementations are from the Internet Drafts leading to\ndnl RFC 1323, and are wrong.\nLIBFREE_OBJS=\"$LIBFREE_OBJS inet_ntop.o inet_pton.o\"\ndnl if test \"$ac_cv_func_inet_pton\" = no ; then\ndnl    LIBFREE_OBJS=\"$LIBFREE_OBJS inet_pton.o\"\ndnl fi\n\ndnl ##################################################################\ndnl Build the list of object files to build from the source files in\ndnl the libgai/ directory (getaddrinfo() and friends).\ndnl\ndnl If the system has a getaddrinfo implementation, then\ndnl there should be nothing here.\nif test \"$ac_cv_func_getaddrinfo\" = no ; then\nLIBGAI_OBJS=\"getaddrinfo.o getnameinfo.o freeaddrinfo.o gai_strerror.o\"\nLIBGAI_OBJS=\"$LIBGAI_OBJS ga_aistruct.o ga_clone.o ga_echeck.o ga_nsearch.o\"\nLIBGAI_OBJS=\"$LIBGAI_OBJS ga_port.o ga_serv.o ga_unix.o gn_ipv46.o\"\nelse\nLIBGAI_OBJS=\"\"\nfi\n\ndnl ##################################################################\ndnl Build the list of object files to build from the source files in\ndnl the libroute/ directory (routing socket functions).\ndnl\nLIBROUTE_OBJS=\"get_rtaddrs.o\"\nLIBROUTE_OBJS=\"$LIBROUTE_OBJS if_indextoname.o if_nameindex.o if_nametoindex.o\"\nLIBROUTE_OBJS=\"$LIBROUTE_OBJS net_rt_iflist.o net_rt_dump.o\"\nLIBROUTE_OBJS=\"$LIBROUTE_OBJS sock_masktop.o\"\n\ndnl ##################################################################\ndnl Build the list of object files to build from the source files in\ndnl the libxti/ directory.\ndnl Systems that do not provide <netdir.h> and <netconfig.h> do not\ndnl support our tcp_XXX and udp_XXX functions.\ndnl\nLIBXTI_OBJS=\nif test \"$ac_cv_header_netdir_h\" = yes ; then\n   LIBXTI_OBJS=\"$LIBXTI_OBJS tcp_connect.o\"\n   LIBXTI_OBJS=\"$LIBXTI_OBJS tcp_listen.o\"\n   LIBXTI_OBJS=\"$LIBXTI_OBJS udp_server.o\"\n   LIBXTI_OBJS=\"$LIBXTI_OBJS udp_client.o\"\nfi\nLIBXTI_OBJS=\"$LIBXTI_OBJS wrapxti.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_accept.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_flags_str.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_getopt.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_ntop.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_ntop_host.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_rdwr.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_setopt.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_str_opts.o\"\nLIBXTI_OBJS=\"$LIBXTI_OBJS xti_tlook_str.o\"\n\ndnl Now make certain that when configure is run, AC_OUTPUT replaces these\ndnl strings that we built in shell variables in the output files that\ndnl it generates.\ndnl\nAC_SUBST(LIB_OBJS)\nAC_SUBST(LIBFREE_OBJS)\nAC_SUBST(LIBGAI_OBJS)\nAC_SUBST(LIBROUTE_OBJS)\nAC_SUBST(LIBXTI_OBJS)\n\ndnl We need our own variable LIBS_XTI for linking XTI programs,\ndnl but do not want -lsocket in there.\ndnl Ditto for -lxti in LIBS.\ndnl\nLIBS_XTI=`echo $LIBS | sed 's/-lsocket//'`\nLIBS=`echo $LIBS | sed 's/-lxti//'`\n\nAC_SUBST(LIBS_XTI)\n\nAC_SUBST(LIBUNP)\nAC_SUBST(LIBUNPXTI)\n\nAC_SUBST(LIBUNP_NAME)\nAC_SUBST(LIBUNPXTI_NAME)\n\ndnl ##################################################################\ndnl Now that we're doing compiling, modify CFLAGS.\ndnl\ndnl If the directory $HOME/doc/unp2ev1/src/include exists, the user can\ndnl place modified copies of the system's headers in there, with the\ndnl function prototypes corrected, as per Posix and X/Open.  Lots of\ndnl system headers today are missing const qualifiers, they have char*\ndnl instead of void*, and so on.\ndnl\nAC_MSG_CHECKING(for -I$HOME/doc/unp2ev1/src/include)\nif test -d $HOME/doc/unp2ev1/src/include ; then\n\tCFLAGS=\"$CFLAGS -I$HOME/doc/unp2ev1/src/include\"\n\tAC_MSG_RESULT(yes)\nelse\n\tAC_MSG_RESULT(no)\nfi\n\ndnl If the compiler is gcc, enable all warnings.  Main purpose is to\ndnl catch any function call where the function has not been prototyped.\ndnl\nif test \"$ac_cv_prog_gcc\" = yes; then\n   CFLAGS=\"$CFLAGS -Wall\"\n   dnl\n   dnl These warnings are useful during development, but not to deploy.\n   dnl CFLAGS=\"$CFLAGS -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wno-format-extra-args\"\nfi\n\ndnl Some system-specific stuff ...\ndnl Some operating systems require additional flags in order to get all\ndnl the definitions that we're looking for in some system headers.\ncase \"$host_os\" in\n*aix*)\t\tCFLAGS=\"$CFLAGS -D_ALL_SOURCE\" ;;\n*osf*)\t\tCFLAGS=\"$CFLAGS -D_SOCKADDR_LEN\" ;;\n*solaris*)\tif test \"$ac_cv_prog_gcc\" = yes; then\n\t\t   CFLAGS=\"$CFLAGS -D__EXTENSIONS__\"\n\t\telse\n\t\t   CFLAGS=\"$CFLAGS -D__STDC__\"\n\t\tfi ;;\nesac\n\ndnl ##################################################################\ndnl We also create a \"Makefile\" but it is not used for much.\ndnl\nAC_OUTPUT(Makefile Make.defines)\n\ndnl\ndnl If a directory exists whose name equals the host\ndnl (e.g., sparc-sun-solaris2.5.1), then save the five files that we\ndnl create in that directory also.\ndnl Quick and dirty to be able to NFS mount this directory on different\ndnl systems and move quickly between the systems, without having to\ndnl rerun configure each time.\ndnl The \"myconfig\" script in this directory does the move.\ndnl\nif test -d \"$host\" ; then\n   cp -p config.h config.cache config.status Makefile Make.defines $host\n   echo \"saving copies in $host/\"\nfi\n"
  },
  {
    "path": "icmpd/Makefile",
    "content": "include ../Make.defines\n\nOBJS = icmpd.o readable_listen.o readable_conn.o readable_v4.o readable_v6.o\n\nPROGS =\ticmpd udpcli01\n\nall:\t${PROGS}\n\nicmpd:\t${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ ${OBJS} ${LIBS}\n\nudpcli01:\tudpcli01.o dgcli01.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o dgcli01.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "icmpd/dgcli01.c",
    "content": "/* include dgcli011 */\n#include\t\"unpicmpd.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\ticmpfd, maxfdp1;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tfd_set\t\t\trset;\n\tssize_t\t\t\tn;\n\tstruct timeval\ttv;\n\tstruct icmpd_err icmpd_err;\n\tstruct sockaddr_un sun;\n\n\tSock_bind_wild(sockfd, pservaddr->sa_family);\n\n\ticmpfd = Socket(AF_LOCAL, SOCK_STREAM, 0);\n\tsun.sun_family = AF_LOCAL;\n\tstrcpy(sun.sun_path, ICMPD_PATH);\n\tConnect(icmpfd, (SA *)&sun, sizeof(sun));\n\tWrite_fd(icmpfd, \"1\", 1, sockfd);\n\tn = Read(icmpfd, recvline, 1);\n\tif (n != 1 || recvline[0] != '1')\n\t\terr_quit(\"error creating icmp socket, n = %d, char = %c\",\n\t\t\t\t n, recvline[0]);\n\n\tFD_ZERO(&rset);\n\tmaxfdp1 = max(sockfd, icmpfd) + 1;\n/* end dgcli011 */\n\n/* include dgcli012 */\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\ttv.tv_sec = 5;\n\t\ttv.tv_usec = 0;\n\t\tFD_SET(sockfd, &rset);\n\t\tFD_SET(icmpfd, &rset);\n\t\tif ( (n = Select(maxfdp1, &rset, NULL, NULL, &tv)) == 0) {\n\t\t\tfprintf(stderr, \"socket timeout\\n\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\n\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tFputs(recvline, stdout);\n\t\t}\n\n\t\tif (FD_ISSET(icmpfd, &rset)) {\n\t\t\tif ( (n = Read(icmpfd, &icmpd_err, sizeof(icmpd_err))) == 0)\n\t\t\t\terr_quit(\"ICMP daemon terminated\");\n\t\t\telse if (n != sizeof(icmpd_err))\n\t\t\t\terr_quit(\"n = %d, expected %d\", n, sizeof(icmpd_err));\n\t\t\tprintf(\"ICMP error: dest = %s, %s, type = %d, code = %d\\n\",\n\t\t\t\t   Sock_ntop(&icmpd_err.icmpd_dest, icmpd_err.icmpd_len),\n\t\t\t\t   strerror(icmpd_err.icmpd_errno),\n\t\t\t\t   icmpd_err.icmpd_type, icmpd_err.icmpd_code);\n\t\t}\n\t}\n}\n/* end dgcli012 */\n"
  },
  {
    "path": "icmpd/dgcli01.lc",
    "content": "/* include dgcli011 */\n#include    \"unpicmpd.h\"##  1 ##src/icmpd/dgcli01.c##\n\nvoid##  2 ##src/icmpd/dgcli01.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  3 ##src/icmpd/dgcli01.c##\n{##  4 ##src/icmpd/dgcli01.c##\n    int     icmpfd, maxfdp1;##  5 ##src/icmpd/dgcli01.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  6 ##src/icmpd/dgcli01.c##\n    fd_set  rset;##  7 ##src/icmpd/dgcli01.c##\n    ssize_t n;##  8 ##src/icmpd/dgcli01.c##\n    struct timeval tv;##  9 ##src/icmpd/dgcli01.c##\n    struct icmpd_err icmpd_err;## 10 ##src/icmpd/dgcli01.c##\n\n    Sock_bind_wild(sockfd, pservaddr->sa_family);## 11 ##src/icmpd/dgcli01.c##\n\n    icmpfd = Tcp_connect(\"/unix\", ICMPD_PATH);## 12 ##src/icmpd/dgcli01.c##\n    Write_fd(icmpfd, \"1\", 1, sockfd);## 13 ##src/icmpd/dgcli01.c##\n    n = Read(icmpfd, recvline, 1);## 14 ##src/icmpd/dgcli01.c##\n    if (n != 1 || recvline[0] != '1')## 15 ##src/icmpd/dgcli01.c##\n        err_quit(\"error creating icmp socket, n = %d, char = %c\",## 16 ##src/icmpd/dgcli01.c##\n                 n, recvline[0]);## 17 ##src/icmpd/dgcli01.c##\n\n    FD_ZERO(&rset);## 18 ##src/icmpd/dgcli01.c##\n    maxfdp1 = max(sockfd, icmpfd) + 1;## 19 ##src/icmpd/dgcli01.c##\n/* end dgcli011 */\n\n/* include dgcli012 */\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {## 20 ##src/icmpd/dgcli01.c##\n        Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);## 21 ##src/icmpd/dgcli01.c##\n\n        tv.tv_sec = 5;## 22 ##src/icmpd/dgcli01.c##\n        tv.tv_usec = 0;## 23 ##src/icmpd/dgcli01.c##\n        FD_SET(sockfd, &rset);## 24 ##src/icmpd/dgcli01.c##\n        FD_SET(icmpfd, &rset);## 25 ##src/icmpd/dgcli01.c##\n        if ((n = Select(maxfdp1, &rset, NULL, NULL, &tv)) == 0) {## 26 ##src/icmpd/dgcli01.c##\n            fprintf(stderr, \"socket timeout\\n\");## 27 ##src/icmpd/dgcli01.c##\n            continue;## 28 ##src/icmpd/dgcli01.c##\n        }## 29 ##src/icmpd/dgcli01.c##\n\n        if (FD_ISSET(sockfd, &rset)) {## 30 ##src/icmpd/dgcli01.c##\n            n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);## 31 ##src/icmpd/dgcli01.c##\n            recvline[n] = 0;    /* null terminate */## 32 ##src/icmpd/dgcli01.c##\n            Fputs(recvline, stdout);## 33 ##src/icmpd/dgcli01.c##\n        }## 34 ##src/icmpd/dgcli01.c##\n\n        if (FD_ISSET(icmpfd, &rset)) {## 35 ##src/icmpd/dgcli01.c##\n            if ((n = Read(icmpfd, &icmpd_err, sizeof(icmpd_err))) == 0)## 36 ##src/icmpd/dgcli01.c##\n                err_quit(\"ICMP daemon terminated\");## 37 ##src/icmpd/dgcli01.c##\n            else if (n != sizeof(icmpd_err))## 38 ##src/icmpd/dgcli01.c##\n                err_quit(\"n = %d, expected %d\", n, sizeof(icmpd_err));## 39 ##src/icmpd/dgcli01.c##\n            printf(\"ICMP error: dest = %s, %s, type = %d, code = %d\\n\",## 40 ##src/icmpd/dgcli01.c##\n                   Sock_ntop(&icmpd_err.icmpd_dest, icmpd_err.icmpd_len),## 41 ##src/icmpd/dgcli01.c##\n                   strerror(icmpd_err.icmpd_errno),## 42 ##src/icmpd/dgcli01.c##\n                   icmpd_err.icmpd_type, icmpd_err.icmpd_code);## 43 ##src/icmpd/dgcli01.c##\n        }## 44 ##src/icmpd/dgcli01.c##\n    }## 45 ##src/icmpd/dgcli01.c##\n}## 46 ##src/icmpd/dgcli01.c##\n/* end dgcli012 */\n"
  },
  {
    "path": "icmpd/icmpd.c",
    "content": "/* include icmpd1 */\n#include\t\"icmpd.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti, sockfd;\n\tstruct sockaddr_un sun;\n\n\tif (argc != 1)\n\t\terr_quit(\"usage: icmpd\");\n\n\tmaxi = -1;\t\t\t\t\t/* index into client[] array */\n\tfor (i = 0; i < FD_SETSIZE; i++)\n\t\tclient[i].connfd = -1;\t/* -1 indicates available entry */\n\tFD_ZERO(&allset);\n\n\tfd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);\n\tFD_SET(fd4, &allset);\n\tmaxfd = fd4;\n\n#ifdef\tIPV6\n\tfd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);\n\tFD_SET(fd6, &allset);\n\tmaxfd = max(maxfd, fd6);\n#endif\n\n\tlistenfd = Socket(AF_UNIX, SOCK_STREAM, 0);\n\tsun.sun_family = AF_LOCAL;\n\tstrcpy(sun.sun_path, ICMPD_PATH);\n\tunlink(ICMPD_PATH);\n\tBind(listenfd, (SA *)&sun, sizeof(sun));\n\tListen(listenfd, LISTENQ);\n\tFD_SET(listenfd, &allset);\n\tmaxfd = max(maxfd, listenfd);\n/* end icmpd1 */\n\n/* include icmpd2 */\n\tfor ( ; ; ) {\n\t\trset = allset;\n\t\tnready = Select(maxfd+1, &rset, NULL, NULL, NULL);\n\n\t\tif (FD_ISSET(listenfd, &rset))\n\t\t\tif (readable_listen() <= 0)\n\t\t\t\tcontinue;\n\n\t\tif (FD_ISSET(fd4, &rset))\n\t\t\tif (readable_v4() <= 0)\n\t\t\t\tcontinue;\n\n#ifdef\tIPV6\n\t\tif (FD_ISSET(fd6, &rset))\n\t\t\tif (readable_v6() <= 0)\n\t\t\t\tcontinue;\n#endif\n\n\t\tfor (i = 0; i <= maxi; i++) {\t/* check all clients for data */\n\t\t\tif ( (sockfd = client[i].connfd) < 0)\n\t\t\t\tcontinue;\n\t\t\tif (FD_ISSET(sockfd, &rset))\n\t\t\t\tif (readable_conn(i) <= 0)\n\t\t\t\t\tbreak;\t\t\t\t/* no more readable descriptors */\n\t\t}\n\t}\n\texit(0);\n}\n/* end icmpd2 */\n"
  },
  {
    "path": "icmpd/icmpd.h",
    "content": "#include\t\"unpicmpd.h\"\n\nstruct client {\n  int\tconnfd;\t\t\t/* Unix domain stream socket to client */\n  int\tfamily;\t\t\t/* AF_INET or AF_INET6 */\n  int\tlport;\t\t\t/* local port bound to client's UDP socket */\n\t\t\t\t\t\t/* network byte ordered */\n} client[FD_SETSIZE];\n\n\t\t\t\t\t/* 4globals */\nint\t\t\t\tfd4, fd6, listenfd, maxi, maxfd, nready;\nfd_set\t\t\trset, allset;\nstruct sockaddr_un\tcliaddr;\n\n\t\t\t/* 4function prototypes */\nint\t\t readable_conn(int);\nint\t\t readable_listen(void);\nint\t\t readable_v4(void);\nint\t\t readable_v6(void);\n"
  },
  {
    "path": "icmpd/icmpd.lc",
    "content": "/* include icmpd1 */\n#include    \"icmpd.h\"##  1 ##src/icmpd/icmpd.c##\n\nint##  2 ##src/icmpd/icmpd.c##\nmain(int argc, char **argv)##  3 ##src/icmpd/icmpd.c##\n{##  4 ##src/icmpd/icmpd.c##\n    int     i, sockfd;##  5 ##src/icmpd/icmpd.c##\n\n    if (argc != 1)##  6 ##src/icmpd/icmpd.c##\n        err_quit(\"usage: icmpd\");##  7 ##src/icmpd/icmpd.c##\n\n    maxi = -1;                  /* index into client[] array */##  8 ##src/icmpd/icmpd.c##\n    for (i = 0; i < FD_SETSIZE; i++)##  9 ##src/icmpd/icmpd.c##\n        client[i].connfd = -1;  /* -1 indicates available entry */## 10 ##src/icmpd/icmpd.c##\n    FD_ZERO(&allset);## 11 ##src/icmpd/icmpd.c##\n\n    fd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);## 12 ##src/icmpd/icmpd.c##\n    FD_SET(fd4, &allset);## 13 ##src/icmpd/icmpd.c##\n    maxfd = fd4;## 14 ##src/icmpd/icmpd.c##\n\n#ifdef  IPV6## 15 ##src/icmpd/icmpd.c##\n    fd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);## 16 ##src/icmpd/icmpd.c##\n    FD_SET(fd6, &allset);## 17 ##src/icmpd/icmpd.c##\n    maxfd = max(maxfd, fd6);## 18 ##src/icmpd/icmpd.c##\n#endif## 19 ##src/icmpd/icmpd.c##\n\n    listenfd = Tcp_listen(\"/unix\", ICMPD_PATH, &addrlen);## 20 ##src/icmpd/icmpd.c##\n    FD_SET(listenfd, &allset);## 21 ##src/icmpd/icmpd.c##\n    maxfd = max(maxfd, listenfd);## 22 ##src/icmpd/icmpd.c##\n    cliaddr = Malloc(addrlen);## 23 ##src/icmpd/icmpd.c##\n/* end icmpd1 */\n\n/* include icmpd2 */\n    for (;;) {## 24 ##src/icmpd/icmpd.c##\n        rset = allset;## 25 ##src/icmpd/icmpd.c##\n        nready = Select(maxfd + 1, &rset, NULL, NULL, NULL);## 26 ##src/icmpd/icmpd.c##\n\n        if (FD_ISSET(listenfd, &rset))## 27 ##src/icmpd/icmpd.c##\n            if (readable_listen() <= 0)## 28 ##src/icmpd/icmpd.c##\n                continue;## 29 ##src/icmpd/icmpd.c##\n\n        if (FD_ISSET(fd4, &rset))## 30 ##src/icmpd/icmpd.c##\n            if (readable_v4() <= 0)## 31 ##src/icmpd/icmpd.c##\n                continue;## 32 ##src/icmpd/icmpd.c##\n\n#ifdef  IPV6## 33 ##src/icmpd/icmpd.c##\n        if (FD_ISSET(fd6, &rset))## 34 ##src/icmpd/icmpd.c##\n            if (readable_v6() <= 0)## 35 ##src/icmpd/icmpd.c##\n                continue;## 36 ##src/icmpd/icmpd.c##\n#endif## 37 ##src/icmpd/icmpd.c##\n\n        for (i = 0; i <= maxi; i++) {   /* check all clients for data */## 38 ##src/icmpd/icmpd.c##\n            if ((sockfd = client[i].connfd) < 0)## 39 ##src/icmpd/icmpd.c##\n                continue;## 40 ##src/icmpd/icmpd.c##\n            if (FD_ISSET(sockfd, &rset))## 41 ##src/icmpd/icmpd.c##\n                if (readable_conn(i) <= 0)## 42 ##src/icmpd/icmpd.c##\n                    break;      /* no more readable descriptors */## 43 ##src/icmpd/icmpd.c##\n        }## 44 ##src/icmpd/icmpd.c##\n    }## 45 ##src/icmpd/icmpd.c##\n    exit(0);## 46 ##src/icmpd/icmpd.c##\n}## 47 ##src/icmpd/icmpd.c##\n/* end icmpd2 */\n"
  },
  {
    "path": "icmpd/readable_conn.c",
    "content": "/* include readable_conn1 */\n#include\t\"icmpd.h\"\n\nint\nreadable_conn(int i)\n{\n\tint\t\t\t\tunixfd, recvfd;\n\tchar\t\t\tc;\n\tssize_t\t\t\tn;\n\tsocklen_t\t\tlen;\n\tstruct sockaddr_storage\tss;\n\n\tunixfd = client[i].connfd;\n\trecvfd = -1;\n\tif ( (n = Read_fd(unixfd, &c, 1, &recvfd)) == 0) {\n\t\terr_msg(\"client %d terminated, recvfd = %d\", i, recvfd);\n\t\tgoto clientdone;\t/* client probably terminated */\n\t}\n\n\t\t/* 4data from client; should be descriptor */\n\tif (recvfd < 0) {\n\t\terr_msg(\"read_fd did not return descriptor\");\n\t\tgoto clienterr;\n\t}\n/* end readable_conn1 */\n\n/* include readable_conn2 */\n\tlen = sizeof(ss);\n\tif (getsockname(recvfd, (SA *) &ss, &len) < 0) {\n\t\terr_ret(\"getsockname error\");\n\t\tgoto clienterr;\n\t}\n\n\tclient[i].family = ss.ss_family;\n\tif ( (client[i].lport = sock_get_port((SA *)&ss, len)) == 0) {\n\t\tclient[i].lport = sock_bind_wild(recvfd, client[i].family);\n\t\tif (client[i].lport <= 0) {\n\t\t\terr_ret(\"error binding ephemeral port\");\n\t\t\tgoto clienterr;\n\t\t}\n\t}\n\tWrite(unixfd, \"1\", 1);\t/* tell client all OK */\n\tClose(recvfd);\t\t\t/* all done with client's UDP socket */\n\treturn(--nready);\n\nclienterr:\n\tWrite(unixfd, \"0\", 1);\t/* tell client error occurred */\nclientdone:\n\tClose(unixfd);\n\tif (recvfd >= 0)\n\t\tClose(recvfd);\n\tFD_CLR(unixfd, &allset);\n\tclient[i].connfd = -1;\n\treturn(--nready);\n}\n/* end readable_conn2 */\n"
  },
  {
    "path": "icmpd/readable_conn.lc",
    "content": "/* include readable_conn1 */\n#include    \"icmpd.h\"##  1 ##src/icmpd/readable_conn.c##\n\nint##  2 ##src/icmpd/readable_conn.c##\nreadable_conn(int i)##  3 ##src/icmpd/readable_conn.c##\n{##  4 ##src/icmpd/readable_conn.c##\n    int     unixfd, recvfd;##  5 ##src/icmpd/readable_conn.c##\n    char    c;##  6 ##src/icmpd/readable_conn.c##\n    ssize_t n;##  7 ##src/icmpd/readable_conn.c##\n    socklen_t len;##  8 ##src/icmpd/readable_conn.c##\n    union {##  9 ##src/icmpd/readable_conn.c##\n        char    buf[MAXSOCKADDR];## 10 ##src/icmpd/readable_conn.c##\n        struct sockaddr sock;## 11 ##src/icmpd/readable_conn.c##\n    } un;## 12 ##src/icmpd/readable_conn.c##\n\n    unixfd = client[i].connfd;## 13 ##src/icmpd/readable_conn.c##\n    recvfd = -1;## 14 ##src/icmpd/readable_conn.c##\n    if ((n = Read_fd(unixfd, &c, 1, &recvfd)) == 0) {## 15 ##src/icmpd/readable_conn.c##\n        err_msg(\"client %d terminated, recvfd = %d\", i, recvfd);## 16 ##src/icmpd/readable_conn.c##\n        goto clientdone;        /* client probably terminated */## 17 ##src/icmpd/readable_conn.c##\n    }## 18 ##src/icmpd/readable_conn.c##\n\n    /* 4data from client; should be descriptor */## 19 ##src/icmpd/readable_conn.c##\n    if (recvfd < 0) {## 20 ##src/icmpd/readable_conn.c##\n        err_msg(\"read_fd did not return descriptor\");## 21 ##src/icmpd/readable_conn.c##\n        goto clienterr;## 22 ##src/icmpd/readable_conn.c##\n    }## 23 ##src/icmpd/readable_conn.c##\n/* end readable_conn1 */\n\n/* include readable_conn2 */\n    len = sizeof(un.buf);## 24 ##src/icmpd/readable_conn.c##\n    if (getsockname(recvfd, (SA *) un.buf, &len) < 0) {## 25 ##src/icmpd/readable_conn.c##\n        err_ret(\"getsockname error\");## 26 ##src/icmpd/readable_conn.c##\n        goto clienterr;## 27 ##src/icmpd/readable_conn.c##\n    }## 28 ##src/icmpd/readable_conn.c##\n\n    client[i].family = un.sock.sa_family;## 29 ##src/icmpd/readable_conn.c##\n    if ((client[i].lport = sock_get_port(&un.sock, len)) == 0) {## 30 ##src/icmpd/readable_conn.c##\n        client[i].lport = sock_bind_wild(recvfd, client[i].family);## 31 ##src/icmpd/readable_conn.c##\n        if (client[i].lport <= 0) {## 32 ##src/icmpd/readable_conn.c##\n            err_ret(\"error binding ephemeral port\");## 33 ##src/icmpd/readable_conn.c##\n            goto clienterr;## 34 ##src/icmpd/readable_conn.c##\n        }## 35 ##src/icmpd/readable_conn.c##\n    }## 36 ##src/icmpd/readable_conn.c##\n    Write(unixfd, \"1\", 1);      /* tell client all OK */## 37 ##src/icmpd/readable_conn.c##\n    FD_SET(unixfd, &allset);## 38 ##src/icmpd/readable_conn.c##\n    if (unixfd > maxfd)## 39 ##src/icmpd/readable_conn.c##\n        maxfd = unixfd;## 40 ##src/icmpd/readable_conn.c##\n    if (i > maxi)## 41 ##src/icmpd/readable_conn.c##\n        maxi = i;## 42 ##src/icmpd/readable_conn.c##\n    Close(recvfd);              /* all done with client's UDP socket */## 43 ##src/icmpd/readable_conn.c##\n    return (--nready);## 44 ##src/icmpd/readable_conn.c##\n\n  clienterr:## 45 ##src/icmpd/readable_conn.c##\n    Write(unixfd, \"0\", 1);      /* tell client error occurred */## 46 ##src/icmpd/readable_conn.c##\n  clientdone:## 47 ##src/icmpd/readable_conn.c##\n    Close(unixfd);## 48 ##src/icmpd/readable_conn.c##\n    if (recvfd >= 0)## 49 ##src/icmpd/readable_conn.c##\n        Close(recvfd);## 50 ##src/icmpd/readable_conn.c##\n    FD_CLR(unixfd, &allset);## 51 ##src/icmpd/readable_conn.c##\n    client[i].connfd = -1;## 52 ##src/icmpd/readable_conn.c##\n    return (--nready);## 53 ##src/icmpd/readable_conn.c##\n}## 54 ##src/icmpd/readable_conn.c##\n/* end readable_conn2 */\n"
  },
  {
    "path": "icmpd/readable_listen.c",
    "content": "#include\t\"icmpd.h\"\n\nint\nreadable_listen(void)\n{\n\tint\t\t\ti, connfd;\n\tsocklen_t\tclilen;\n\n\tclilen = sizeof(cliaddr);\n\tconnfd = Accept(listenfd, (SA *)&cliaddr, &clilen);\n\n\t\t/* 4find first available client[] structure */\n\tfor (i = 0; i < FD_SETSIZE; i++)\n\t\tif (client[i].connfd < 0) {\n\t\t\tclient[i].connfd = connfd;\t/* save descriptor */\n\t\t\tbreak;\n\t\t}\n\tif (i == FD_SETSIZE) {\n\t\tclose(connfd);\t\t/* can't handle new client, */\n\t\treturn(--nready);\t/* rudely close the new connection */\n\t}\n\tprintf(\"new connection, i = %d, connfd = %d\\n\", i, connfd);\n\n\tFD_SET(connfd, &allset);\t/* add new descriptor to set */\n\tif (connfd > maxfd)\n\t\tmaxfd = connfd;\t\t\t/* for select() */\n\tif (i > maxi)\n\t\tmaxi = i;\t\t\t\t/* max index in client[] array */\n\n\treturn(--nready);\n}\n"
  },
  {
    "path": "icmpd/readable_listen.lc",
    "content": "#include    \"icmpd.h\"##  1 ##src/icmpd/readable_listen.c##\n\nint##  2 ##src/icmpd/readable_listen.c##\nreadable_listen(void)##  3 ##src/icmpd/readable_listen.c##\n{##  4 ##src/icmpd/readable_listen.c##\n    int     i, connfd;##  5 ##src/icmpd/readable_listen.c##\n    socklen_t clilen;##  6 ##src/icmpd/readable_listen.c##\n\n    clilen = addrlen;##  7 ##src/icmpd/readable_listen.c##\n    connfd = Accept(listenfd, cliaddr, &clilen);##  8 ##src/icmpd/readable_listen.c##\n\n    /* 4find first available client[] structure */##  9 ##src/icmpd/readable_listen.c##\n    for (i = 0; i < FD_SETSIZE; i++)## 10 ##src/icmpd/readable_listen.c##\n        if (client[i].connfd < 0) {## 11 ##src/icmpd/readable_listen.c##\n            client[i].connfd = connfd;  /* save descriptor */## 12 ##src/icmpd/readable_listen.c##\n            break;## 13 ##src/icmpd/readable_listen.c##\n        }## 14 ##src/icmpd/readable_listen.c##\n    if (i == FD_SETSIZE)## 15 ##src/icmpd/readable_listen.c##\n        err_quit(\"too many clients\");## 16 ##src/icmpd/readable_listen.c##\n    printf(\"new connection, i = %d, connfd = %d\\n\", i, connfd);## 17 ##src/icmpd/readable_listen.c##\n\n    FD_SET(connfd, &allset);    /* add new descriptor to set */## 18 ##src/icmpd/readable_listen.c##\n    if (connfd > maxfd)## 19 ##src/icmpd/readable_listen.c##\n        maxfd = connfd;         /* for select() */## 20 ##src/icmpd/readable_listen.c##\n    if (i > maxi)## 21 ##src/icmpd/readable_listen.c##\n        maxi = i;               /* max index in client[] array */## 22 ##src/icmpd/readable_listen.c##\n\n    return (--nready);## 23 ##src/icmpd/readable_listen.c##\n}## 24 ##src/icmpd/readable_listen.c##\n"
  },
  {
    "path": "icmpd/readable_v4.c",
    "content": "/* include readable_v41 */\n#include\t\"icmpd.h\"\n#include\t<netinet/in_systm.h>\n#include\t<netinet/ip.h>\n#include\t<netinet/ip_icmp.h>\n#include\t<netinet/udp.h>\n\nint\nreadable_v4(void)\n{\n\tint\t\t\t\t\ti, hlen1, hlen2, icmplen, sport;\n\tchar\t\t\t\tbuf[MAXLINE];\n\tchar\t\t\t\tsrcstr[INET_ADDRSTRLEN], dststr[INET_ADDRSTRLEN];\n\tssize_t\t\t\t\tn;\n\tsocklen_t\t\t\tlen;\n\tstruct ip\t\t\t*ip, *hip;\n\tstruct icmp\t\t\t*icmp;\n\tstruct udphdr\t\t*udp;\n\tstruct sockaddr_in\tfrom, dest;\n\tstruct icmpd_err\ticmpd_err;\n\n\tlen = sizeof(from);\n\tn = Recvfrom(fd4, buf, MAXLINE, 0, (SA *) &from, &len);\n\n\tprintf(\"%d bytes ICMPv4 from %s:\",\n\t\t   n, Sock_ntop_host((SA *) &from, len));\n\n\tip = (struct ip *) buf;\t\t/* start of IP header */\n\thlen1 = ip->ip_hl << 2;\t\t/* length of IP header */\n\n\ticmp = (struct icmp *) (buf + hlen1);\t/* start of ICMP header */\n\tif ( (icmplen = n - hlen1) < 8)\n\t\terr_quit(\"icmplen (%d) < 8\", icmplen);\n\n\tprintf(\" type = %d, code = %d\\n\", icmp->icmp_type, icmp->icmp_code);\n/* end readable_v41 */\n\n/* include readable_v42 */\n\tif (icmp->icmp_type == ICMP_UNREACH ||\n\t\ticmp->icmp_type == ICMP_TIMXCEED ||\n\t\ticmp->icmp_type == ICMP_SOURCEQUENCH) {\n\t\tif (icmplen < 8 + 20 + 8)\n\t\t\terr_quit(\"icmplen (%d) < 8 + 20 + 8\", icmplen);\n\n\t\thip = (struct ip *) (buf + hlen1 + 8);\n\t\thlen2 = hip->ip_hl << 2;\n\t\tprintf(\"\\tsrcip = %s, dstip = %s, proto = %d\\n\",\n\t\t\t   Inet_ntop(AF_INET, &hip->ip_src, srcstr, sizeof(srcstr)),\n\t\t\t   Inet_ntop(AF_INET, &hip->ip_dst, dststr, sizeof(dststr)),\n\t\t\t   hip->ip_p);\n \t\tif (hip->ip_p == IPPROTO_UDP) {\n\t\t\tudp = (struct udphdr *) (buf + hlen1 + 8 + hlen2);\n\t\t\tsport = udp->uh_sport;\n\n\t\t\t\t/* 4find client's Unix domain socket, send headers */\n\t\t\tfor (i = 0; i <= maxi; i++) {\n\t\t\t\tif (client[i].connfd >= 0 &&\n\t\t\t\t\tclient[i].family == AF_INET &&\n\t\t\t\t\tclient[i].lport == sport) {\n\n\t\t\t\t\tbzero(&dest, sizeof(dest));\n\t\t\t\t\tdest.sin_family = AF_INET;\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\t\t\tdest.sin_len = sizeof(dest);\n#endif\n\t\t\t\t\tmemcpy(&dest.sin_addr, &hip->ip_dst,\n\t\t\t\t\t\t   sizeof(struct in_addr));\n\t\t\t\t\tdest.sin_port = udp->uh_dport;\n\n\t\t\t\t\ticmpd_err.icmpd_type = icmp->icmp_type;\n\t\t\t\t\ticmpd_err.icmpd_code = icmp->icmp_code;\n\t\t\t\t\ticmpd_err.icmpd_len = sizeof(struct sockaddr_in);\n\t\t\t\t\tmemcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));\n\n\t\t\t\t\t\t/* 4convert type & code to reasonable errno value */\n\t\t\t\t\ticmpd_err.icmpd_errno = EHOSTUNREACH;\t/* default */\n\t\t\t\t\tif (icmp->icmp_type == ICMP_UNREACH) {\n\t\t\t\t\t\tif (icmp->icmp_code == ICMP_UNREACH_PORT)\n\t\t\t\t\t\t\ticmpd_err.icmpd_errno = ECONNREFUSED;\n\t\t\t\t\t\telse if (icmp->icmp_code == ICMP_UNREACH_NEEDFRAG)\n\t\t\t\t\t\t\ticmpd_err.icmpd_errno = EMSGSIZE;\n\t\t\t\t\t}\n\t\t\t\t\tWrite(client[i].connfd, &icmpd_err, sizeof(icmpd_err));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn(--nready);\n}\n/* end readable_v42 */\n"
  },
  {
    "path": "icmpd/readable_v4.lc",
    "content": "/* include readable_v41 */\n#include    \"icmpd.h\"##  1 ##src/icmpd/readable_v4.c##\n#include    <netinet/in_systm.h>##  2 ##src/icmpd/readable_v4.c##\n#include    <netinet/ip.h>##  3 ##src/icmpd/readable_v4.c##\n#include    <netinet/ip_icmp.h>##  4 ##src/icmpd/readable_v4.c##\n#include    <netinet/udp.h>##  5 ##src/icmpd/readable_v4.c##\n\nint##  6 ##src/icmpd/readable_v4.c##\nreadable_v4(void)##  7 ##src/icmpd/readable_v4.c##\n{##  8 ##src/icmpd/readable_v4.c##\n    int     i, hlen1, hlen2, icmplen, sport;##  9 ##src/icmpd/readable_v4.c##\n    char    buf[MAXLINE];## 10 ##src/icmpd/readable_v4.c##\n    char    srcstr[INET_ADDRSTRLEN], dststr[INET_ADDRSTRLEN];## 11 ##src/icmpd/readable_v4.c##\n    ssize_t n;## 12 ##src/icmpd/readable_v4.c##\n    socklen_t len;## 13 ##src/icmpd/readable_v4.c##\n    struct ip *ip, *hip;## 14 ##src/icmpd/readable_v4.c##\n    struct icmp *icmp;## 15 ##src/icmpd/readable_v4.c##\n    struct udphdr *udp;## 16 ##src/icmpd/readable_v4.c##\n    struct sockaddr_in from, dest;## 17 ##src/icmpd/readable_v4.c##\n    struct icmpd_err icmpd_err;## 18 ##src/icmpd/readable_v4.c##\n\n    len = sizeof(from);## 19 ##src/icmpd/readable_v4.c##\n    n = Recvfrom(fd4, buf, MAXLINE, 0, (SA *) &from, &len);## 20 ##src/icmpd/readable_v4.c##\n\n    printf(\"%d bytes ICMPv4 from %s:\", n, Sock_ntop_host((SA *) &from, len));## 21 ##src/icmpd/readable_v4.c##\n\n    ip = (struct ip *) buf;     /* start of IP header */## 22 ##src/icmpd/readable_v4.c##\n    hlen1 = ip->ip_hl << 2;     /* length of IP header */## 23 ##src/icmpd/readable_v4.c##\n\n    icmp = (struct icmp *) (buf + hlen1);   /* start of ICMP header */## 24 ##src/icmpd/readable_v4.c##\n    if ((icmplen = n - hlen1) < 8)## 25 ##src/icmpd/readable_v4.c##\n        err_quit(\"icmplen (%d) < 8\", icmplen);## 26 ##src/icmpd/readable_v4.c##\n\n    printf(\" type = %d, code = %d\\n\", icmp->icmp_type, icmp->icmp_code);## 27 ##src/icmpd/readable_v4.c##\n/* end readable_v41 */\n\n/* include readable_v42 */\n    if (icmp->icmp_type == ICMP_UNREACH ||## 28 ##src/icmpd/readable_v4.c##\n        icmp->icmp_type == ICMP_TIMXCEED ||## 29 ##src/icmpd/readable_v4.c##\n        icmp->icmp_type == ICMP_SOURCEQUENCH) {## 30 ##src/icmpd/readable_v4.c##\n        if (icmplen < 8 + 20 + 8)## 31 ##src/icmpd/readable_v4.c##\n            err_quit(\"icmplen (%d) < 8 + 20 + 8\", icmplen);## 32 ##src/icmpd/readable_v4.c##\n\n        hip = (struct ip *) (buf + hlen1 + 8);## 33 ##src/icmpd/readable_v4.c##\n        hlen2 = hip->ip_hl << 2;## 34 ##src/icmpd/readable_v4.c##\n        printf(\"\\tsrcip = %s, dstip = %s, proto = %d\\n\",## 35 ##src/icmpd/readable_v4.c##\n               Inet_ntop(AF_INET, &hip->ip_src, srcstr, sizeof(srcstr)),## 36 ##src/icmpd/readable_v4.c##\n               Inet_ntop(AF_INET, &hip->ip_dst, dststr, sizeof(dststr)),## 37 ##src/icmpd/readable_v4.c##\n               hip->ip_p);## 38 ##src/icmpd/readable_v4.c##\n        if (hip->ip_p == IPPROTO_UDP) {## 39 ##src/icmpd/readable_v4.c##\n            udp = (struct udphdr *) (buf + hlen1 + 8 + hlen2);## 40 ##src/icmpd/readable_v4.c##\n            sport = udp->uh_sport;## 41 ##src/icmpd/readable_v4.c##\n\n            /* 4find client's Unix domain socket, send headers */## 42 ##src/icmpd/readable_v4.c##\n            for (i = 0; i <= maxi; i++) {## 43 ##src/icmpd/readable_v4.c##\n                if (client[i].connfd >= 0 &&## 44 ##src/icmpd/readable_v4.c##\n                    client[i].family == AF_INET &&## 45 ##src/icmpd/readable_v4.c##\n                    client[i].lport == sport) {## 46 ##src/icmpd/readable_v4.c##\n\n                    bzero(&dest, sizeof(dest));## 47 ##src/icmpd/readable_v4.c##\n                    dest.sin_family = AF_INET;## 48 ##src/icmpd/readable_v4.c##\n#ifdef  HAVE_SOCKADDR_SA_LEN## 49 ##src/icmpd/readable_v4.c##\n                    dest.sin_len = sizeof(dest);## 50 ##src/icmpd/readable_v4.c##\n#endif## 51 ##src/icmpd/readable_v4.c##\n                    memcpy(&dest.sin_addr, &hip->ip_dst,## 52 ##src/icmpd/readable_v4.c##\n                           sizeof(struct in_addr));## 53 ##src/icmpd/readable_v4.c##\n                    dest.sin_port = udp->uh_dport;## 54 ##src/icmpd/readable_v4.c##\n\n                    icmpd_err.icmpd_type = icmp->icmp_type;## 55 ##src/icmpd/readable_v4.c##\n                    icmpd_err.icmpd_code = icmp->icmp_code;## 56 ##src/icmpd/readable_v4.c##\n                    icmpd_err.icmpd_len = sizeof(struct sockaddr_in);## 57 ##src/icmpd/readable_v4.c##\n                    memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));## 58 ##src/icmpd/readable_v4.c##\n\n                    /* 4convert type & code to reasonable errno value */## 59 ##src/icmpd/readable_v4.c##\n                    icmpd_err.icmpd_errno = EHOSTUNREACH;   /* default */## 60 ##src/icmpd/readable_v4.c##\n                    if (icmp->icmp_type == ICMP_UNREACH) {## 61 ##src/icmpd/readable_v4.c##\n                        if (icmp->icmp_code == ICMP_UNREACH_PORT)## 62 ##src/icmpd/readable_v4.c##\n                            icmpd_err.icmpd_errno = ECONNREFUSED;## 63 ##src/icmpd/readable_v4.c##\n                        else if (icmp->icmp_code == ICMP_UNREACH_NEEDFRAG)## 64 ##src/icmpd/readable_v4.c##\n                            icmpd_err.icmpd_errno = EMSGSIZE;## 65 ##src/icmpd/readable_v4.c##\n                    }## 66 ##src/icmpd/readable_v4.c##\n                    Write(client[i].connfd, &icmpd_err, sizeof(icmpd_err));## 67 ##src/icmpd/readable_v4.c##\n                }## 68 ##src/icmpd/readable_v4.c##\n            }## 69 ##src/icmpd/readable_v4.c##\n        }## 70 ##src/icmpd/readable_v4.c##\n    }## 71 ##src/icmpd/readable_v4.c##\n    return (--nready);## 72 ##src/icmpd/readable_v4.c##\n}## 73 ##src/icmpd/readable_v4.c##\n/* end readable_v42 */\n"
  },
  {
    "path": "icmpd/readable_v6.c",
    "content": "/* include readable_v61 */\n#include\t\"icmpd.h\"\n#include\t<netinet/in_systm.h>\n#include\t<netinet/ip.h>\n#include\t<netinet/ip_icmp.h>\n#include\t<netinet/udp.h>\n\n#ifdef\tIPV6\n#include\t<netinet/ip6.h>\n#include\t<netinet/icmp6.h>\n#endif\n\nint\nreadable_v6(void)\n{\n#ifdef\tIPV6\n\tint\t\t\t\t\ti, hlen2, icmp6len, sport;\n\tchar\t\t\t\tbuf[MAXLINE];\n\tchar\t\t\t\tsrcstr[INET6_ADDRSTRLEN], dststr[INET6_ADDRSTRLEN];\n\tssize_t\t\t\t\tn;\n\tsocklen_t\t\t\tlen;\n\tstruct ip6_hdr\t\t*ip6, *hip6;\n\tstruct icmp6_hdr\t*icmp6;\n\tstruct udphdr\t\t*udp;\n\tstruct sockaddr_in6\tfrom, dest;\n\tstruct icmpd_err\ticmpd_err;\n\n\tlen = sizeof(from);\n\tn = Recvfrom(fd6, buf, MAXLINE, 0, (SA *) &from, &len);\n\n\tprintf(\"%d bytes ICMPv6 from %s:\",\n\t\t   n, Sock_ntop_host((SA *) &from, len));\n\n\ticmp6 = (struct icmp6_hdr *) buf;\t\t/* start of ICMPv6 header */\n\tif ( (icmp6len = n) < 8)\n\t\terr_quit(\"icmp6len (%d) < 8\", icmp6len);\n\n\tprintf(\" type = %d, code = %d\\n\", icmp6->icmp6_type, icmp6->icmp6_code);\n/* end readable_v61 */\n\n/* include readable_v62 */\n\tif (icmp6->icmp6_type == ICMP6_DST_UNREACH ||\n\t\ticmp6->icmp6_type == ICMP6_PACKET_TOO_BIG ||\n\t\ticmp6->icmp6_type == ICMP6_TIME_EXCEEDED) {\n\t\tif (icmp6len < 8 + 8)\n\t\t\terr_quit(\"icmp6len (%d) < 8 + 8\", icmp6len);\n\n\t\thip6 = (struct ip6_hdr *) (buf + 8);\n\t\thlen2 = sizeof(struct ip6_hdr);\n\t\tprintf(\"\\tsrcip = %s, dstip = %s, next hdr = %d\\n\",\n\t\t\t   Inet_ntop(AF_INET6, &hip6->ip6_src, srcstr, sizeof(srcstr)),\n\t\t\t   Inet_ntop(AF_INET6, &hip6->ip6_dst, dststr, sizeof(dststr)),\n\t\t\t   hip6->ip6_nxt);\n \t\tif (hip6->ip6_nxt == IPPROTO_UDP) {\n\t\t\tudp = (struct udphdr *) (buf + 8 + hlen2);\n\t\t\tsport = udp->uh_sport;\n\n\t\t\t\t/* 4find client's Unix domain socket, send headers */\n\t\t\tfor (i = 0; i <= maxi; i++) {\n\t\t\t\tif (client[i].connfd >= 0 &&\n\t\t\t\t\tclient[i].family == AF_INET6 &&\n\t\t\t\t\tclient[i].lport == sport) {\n\n\t\t\t\t\tbzero(&dest, sizeof(dest));\n\t\t\t\t\tdest.sin6_family = AF_INET6;\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\t\t\tdest.sin6_len = sizeof(dest);\n#endif\n\t\t\t\t\tmemcpy(&dest.sin6_addr, &hip6->ip6_dst,\n\t\t\t\t\t\t   sizeof(struct in6_addr));\n\t\t\t\t\tdest.sin6_port = udp->uh_dport;\n\n\t\t\t\t\ticmpd_err.icmpd_type = icmp6->icmp6_type;\n\t\t\t\t\ticmpd_err.icmpd_code = icmp6->icmp6_code;\n\t\t\t\t\ticmpd_err.icmpd_len = sizeof(struct sockaddr_in6);\n\t\t\t\t\tmemcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));\n\n\t\t\t\t\t\t/* 4convert type & code to reasonable errno value */\n\t\t\t\t\ticmpd_err.icmpd_errno = EHOSTUNREACH;\t/* default */\n\t\t\t\t\tif (icmp6->icmp6_type == ICMP6_DST_UNREACH &&\n\t\t\t\t\t\ticmp6->icmp6_code == ICMP6_DST_UNREACH_NOPORT)\n\t\t\t\t\t\ticmpd_err.icmpd_errno = ECONNREFUSED;\n\t\t\t\t\tif (icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG)\n\t\t\t\t\t\t\ticmpd_err.icmpd_errno = EMSGSIZE;\n\t\t\t\t\tWrite(client[i].connfd, &icmpd_err, sizeof(icmpd_err));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn(--nready);\n#endif\n}\n/* end readable_v62 */\n"
  },
  {
    "path": "icmpd/readable_v6.lc",
    "content": "/* include readable_v61 */\n#include    \"icmpd.h\"##  1 ##src/icmpd/readable_v6.c##\n#include    <netinet/in_systm.h>##  2 ##src/icmpd/readable_v6.c##\n#include    <netinet/ip.h>##  3 ##src/icmpd/readable_v6.c##\n#include    <netinet/ip_icmp.h>##  4 ##src/icmpd/readable_v6.c##\n#include    <netinet/udp.h>##  5 ##src/icmpd/readable_v6.c##\n\n#ifdef  IPV6##  6 ##src/icmpd/readable_v6.c##\n#include    <netinet/ip6.h>##  7 ##src/icmpd/readable_v6.c##\n#include    <netinet/icmp6.h>##  8 ##src/icmpd/readable_v6.c##\n#endif##  9 ##src/icmpd/readable_v6.c##\n\nint## 10 ##src/icmpd/readable_v6.c##\nreadable_v6(void)## 11 ##src/icmpd/readable_v6.c##\n{## 12 ##src/icmpd/readable_v6.c##\n#ifdef  IPV6## 13 ##src/icmpd/readable_v6.c##\n    int     i, hlen1, hlen2, icmp6len, sport;## 14 ##src/icmpd/readable_v6.c##\n    char    buf[MAXLINE];## 15 ##src/icmpd/readable_v6.c##\n    char    srcstr[INET6_ADDRSTRLEN], dststr[INET6_ADDRSTRLEN];## 16 ##src/icmpd/readable_v6.c##\n    ssize_t n;## 17 ##src/icmpd/readable_v6.c##\n    socklen_t len;## 18 ##src/icmpd/readable_v6.c##\n    struct ip6_hdr *ip6, *hip6;## 19 ##src/icmpd/readable_v6.c##\n    struct icmp6_hdr *icmp6;## 20 ##src/icmpd/readable_v6.c##\n    struct udphdr *udp;## 21 ##src/icmpd/readable_v6.c##\n    struct sockaddr_in6 from, dest;## 22 ##src/icmpd/readable_v6.c##\n    struct icmpd_err icmpd_err;## 23 ##src/icmpd/readable_v6.c##\n\n    len = sizeof(from);## 24 ##src/icmpd/readable_v6.c##\n    n = Recvfrom(fd6, buf, MAXLINE, 0, (SA *) &from, &len);## 25 ##src/icmpd/readable_v6.c##\n\n    printf(\"%d bytes ICMPv6 from %s:\", n, Sock_ntop_host((SA *) &from, len));## 26 ##src/icmpd/readable_v6.c##\n\n    ip6 = (struct ip6_hdr *) buf;   /* start of IPv6 header */## 27 ##src/icmpd/readable_v6.c##\n    hlen1 = sizeof(struct ip6_hdr);## 28 ##src/icmpd/readable_v6.c##\n    if (ip6->ip6_nxt != IPPROTO_ICMPV6)## 29 ##src/icmpd/readable_v6.c##\n        err_quit(\"next header not IPPROTO_ICMPV6\");## 30 ##src/icmpd/readable_v6.c##\n\n    icmp6 = (struct icmp6_hdr *) (buf + hlen1);## 31 ##src/icmpd/readable_v6.c##\n    if ((icmp6len = n - hlen1) < 8)## 32 ##src/icmpd/readable_v6.c##\n        err_quit(\"icmp6len (%d) < 8\", icmp6len);## 33 ##src/icmpd/readable_v6.c##\n\n    printf(\" type = %d, code = %d\\n\", icmp6->icmp6_type, icmp6->icmp6_code);## 34 ##src/icmpd/readable_v6.c##\n/* end readable_v61 */\n\n/* include readable_v62 */\n    if (icmp6->icmp6_type == ICMP6_DST_UNREACH ||## 35 ##src/icmpd/readable_v6.c##\n        icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG ||## 36 ##src/icmpd/readable_v6.c##\n        icmp6->icmp6_type == ICMP6_TIME_EXCEEDED) {## 37 ##src/icmpd/readable_v6.c##\n        if (icmp6len < 8 + 40 + 8)## 38 ##src/icmpd/readable_v6.c##\n            err_quit(\"icmp6len (%d) < 8 + 40 + 8\", icmp6len);## 39 ##src/icmpd/readable_v6.c##\n\n        hip6 = (struct ip6_hdr *) (buf + hlen1 + 8);## 40 ##src/icmpd/readable_v6.c##\n        hlen2 = sizeof(struct ip6_hdr);## 41 ##src/icmpd/readable_v6.c##\n        printf(\"\\tsrcip = %s, dstip = %s, next hdr = %d\\n\",## 42 ##src/icmpd/readable_v6.c##\n               Inet_ntop(AF_INET6, &hip6->ip6_src, srcstr, sizeof(srcstr)),## 43 ##src/icmpd/readable_v6.c##\n               Inet_ntop(AF_INET6, &hip6->ip6_dst, dststr, sizeof(dststr)),## 44 ##src/icmpd/readable_v6.c##\n               hip6->ip6_nxt);## 45 ##src/icmpd/readable_v6.c##\n        if (hip6->ip6_nxt == IPPROTO_UDP) {## 46 ##src/icmpd/readable_v6.c##\n            udp = (struct udphdr *) (buf + hlen1 + 8 + hlen2);## 47 ##src/icmpd/readable_v6.c##\n            sport = udp->uh_sport;## 48 ##src/icmpd/readable_v6.c##\n\n            /* 4find client's Unix domain socket, send headers */## 49 ##src/icmpd/readable_v6.c##\n            for (i = 0; i <= maxi; i++) {## 50 ##src/icmpd/readable_v6.c##\n                if (client[i].connfd >= 0 &&## 51 ##src/icmpd/readable_v6.c##\n                    client[i].family == AF_INET6 &&## 52 ##src/icmpd/readable_v6.c##\n                    client[i].lport == sport) {## 53 ##src/icmpd/readable_v6.c##\n\n                    bzero(&dest, sizeof(dest));## 54 ##src/icmpd/readable_v6.c##\n                    dest.sin6_family = AF_INET6;## 55 ##src/icmpd/readable_v6.c##\n#ifdef  HAVE_SOCKADDR_SA_LEN## 56 ##src/icmpd/readable_v6.c##\n                    dest.sin6_len = sizeof(dest);## 57 ##src/icmpd/readable_v6.c##\n#endif## 58 ##src/icmpd/readable_v6.c##\n                    memcpy(&dest.sin6_addr, &hip6->ip6_dst,## 59 ##src/icmpd/readable_v6.c##\n                           sizeof(struct in6_addr));## 60 ##src/icmpd/readable_v6.c##\n                    dest.sin6_port = udp->uh_dport;## 61 ##src/icmpd/readable_v6.c##\n\n                    icmpd_err.icmpd_type = icmp6->icmp6_type;## 62 ##src/icmpd/readable_v6.c##\n                    icmpd_err.icmpd_code = icmp6->icmp6_code;## 63 ##src/icmpd/readable_v6.c##\n                    icmpd_err.icmpd_len = sizeof(struct sockaddr_in6);## 64 ##src/icmpd/readable_v6.c##\n                    memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));## 65 ##src/icmpd/readable_v6.c##\n\n                    /* 4convert type & code to reasonable errno value */## 66 ##src/icmpd/readable_v6.c##\n                    icmpd_err.icmpd_errno = EHOSTUNREACH;   /* default */## 67 ##src/icmpd/readable_v6.c##\n                    if (icmp6->icmp6_type == ICMP6_DST_UNREACH) {## 68 ##src/icmpd/readable_v6.c##\n                        if (icmp6->icmp6_code == ICMP_UNREACH_PORT)## 69 ##src/icmpd/readable_v6.c##\n                            icmpd_err.icmpd_errno = ECONNREFUSED;## 70 ##src/icmpd/readable_v6.c##\n                        else if (icmp6->icmp6_code == ICMP_UNREACH_NEEDFRAG)## 71 ##src/icmpd/readable_v6.c##\n                            icmpd_err.icmpd_errno = EMSGSIZE;## 72 ##src/icmpd/readable_v6.c##\n                    }## 73 ##src/icmpd/readable_v6.c##\n                    Write(client[i].connfd, &icmpd_err, sizeof(icmpd_err));## 74 ##src/icmpd/readable_v6.c##\n                }## 75 ##src/icmpd/readable_v6.c##\n            }## 76 ##src/icmpd/readable_v6.c##\n        }## 77 ##src/icmpd/readable_v6.c##\n    }## 78 ##src/icmpd/readable_v6.c##\n    return (--nready);## 79 ##src/icmpd/readable_v6.c##\n#endif## 80 ##src/icmpd/readable_v6.c##\n}## 81 ##src/icmpd/readable_v6.c##\n/* end readable_v62 */\n"
  },
  {
    "path": "icmpd/script.1",
    "content": "kalae % ./udpcli01 198.82.204.99 echo\nhello, world\nICMP error: type = 11, code = 0\ntesting\nICMP error: type = 11, code = 0\n\nkalae % ./udpcli01 gemini.tuc.noao.edu echo\nhi there\nICMP error: type = 3, code = 3\nhello\nsocket timeout\ntesting\nICMP error: type = 3, code = 3\n\n"
  },
  {
    "path": "icmpd/script.2",
    "content": "kalae % ./udpcli01 gemini.tuc.noao.edu echo\nhi there\nICMPv4 error: dest = 140.252.8.54.1792, type = 3, code = 3\n\n\nkalae % ./udpcli01 198.82.204.99 echo\nhello, world\nICMPv4 error: dest = 198.82.204.99.1792, type = 11, code = 0\ntesting\nICMPv4 error: dest = 198.82.204.99.1792, type = 11, code = 0\n\n\n"
  },
  {
    "path": "icmpd/script.3",
    "content": "kohala % ./udpcli01 gemini.tuc.noao.edu  echo\nhello, world\nICMP error: dest = 140.252.1.11.7, type = 3, code = 3\nkohala % \nkohala % ./udpcli 198.82.204.99 echo\nksh: ./udpcli:  not found\nkohala % ./udpcli01 198.82.204.99 echo\nhello, world\nICMP error: dest = 198.82.204.99.7, type = 3, code = 3\nkohala % ./udpcli01 192.3.4.5.82.204.99 echo\nudp_client error for 192.3.4.5.82.204.99, echo: host nor service provided, or not known\nkohala % ./udpcli01 192.3.4.5 echo          \nhello\nICMP error: dest = 192.3.4.5.7, type = 3, code = 1\n\n\n"
  },
  {
    "path": "icmpd/script.4",
    "content": "kohala % ./udpcli01 192.3.4.5 echo\nhi there\nsocket timeout\nand hello\nsocket timeout\nkohala % ./udpcli01  gemini.tuc.noao.edu echo\nhello, world\nICMP error: dest = 140.252.4.54.7, Connection refused, type = 3, code = 3\nkohala % ./udpcli01 192.3.4.5 echo           \nhello\nICMP error: dest = 192.3.4.5.7, No route to host, type = 3, code = 1\n\n"
  },
  {
    "path": "icmpd/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tsocklen_t\t\t\tsalen;\n\tstruct sockaddr\t\t*sa;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: udpcli01 <hostname> <service>\");\n\n\tsockfd = Udp_client(argv[1], argv[2], &sa, &salen);\n\n\tdg_cli(stdin, sockfd, sa, salen);\n\n\texit(0);\n}\n"
  },
  {
    "path": "icmpd/unpicmpd.h",
    "content": "#ifndef\t__unpicmp_h\n#define\t__unpicmp_h\n\n#include\t\"unp.h\"\n\n#define\tICMPD_PATH\t\t\"/tmp/icmpd\"\t/* server's well-known pathname */\n\nstruct icmpd_err {\n  int\t\t\t\ticmpd_errno;/* EHOSTUNREACH, EMSGSIZE, ECONNREFUSED */\n  char\t\t\t\ticmpd_type;\t/* actual ICMPv[46] type */\n  char\t\t\t\ticmpd_code;\t/* actual ICMPv[46] code */\n  socklen_t\t\t\ticmpd_len;\t/* length of sockaddr{} that follows */\n  struct sockaddr_storage\ticmpd_dest;\t/* sockaddr_storage handles any size */\n};\n\n#endif\t/* __unpicmp_h */\n"
  },
  {
    "path": "inetd/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tdaytimetcpsrv2 daytimetcpsrv3\n\nall:\t${PROGS}\n\ndaytimetcpsrv2:\tdaytimetcpsrv2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}\n\ndaytimetcpsrv3:\tdaytimetcpsrv3.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "inetd/daytimetcpsrv2.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint listenfd, connfd;\n\tsocklen_t addrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\tchar buff[MAXLINE];\n\ttime_t ticks;\n\n\tif (argc < 2 || argc > 3)\n\t\terr_quit(\"usage: daytimetcpsrv2 [ <host> ] <service or port>\");\n\n\tdaemon_init(argv[0], 0);\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\n\tcliaddr = Malloc(addrlen);\n\n\tfor ( ; ; ) {\n\t\tlen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &len);\n\t\terr_msg(\"connection from %s\", Sock_ntop(cliaddr, len));\n\n\t\tticks = time(NULL);\n\t\tsnprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tWrite(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "inetd/daytimetcpsrv3.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*cliaddr;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\n\tdaemon_inetd(argv[0], 0);\n\n\tcliaddr = Malloc(sizeof(struct sockaddr_storage));\n\tlen = sizeof(struct sockaddr_storage);\n\tGetpeername(0, cliaddr, &len);\n\terr_msg(\"connection from %s\", Sock_ntop(cliaddr, len));\n\n    ticks = time(NULL);\n    snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n    Write(0, buff, strlen(buff));\n\n\tClose(0);\t/* close TCP connection */\n\texit(0);\n}\n"
  },
  {
    "path": "inetd/daytimetcpsrv3.lc",
    "content": "#include    \"unp.h\"##  1 ##src/inetd/daytimetcpsrv3.c##\n#include    <time.h>##  2 ##src/inetd/daytimetcpsrv3.c##\n\nint##  3 ##src/inetd/daytimetcpsrv3.c##\nmain(int argc, char **argv)##  4 ##src/inetd/daytimetcpsrv3.c##\n{##  5 ##src/inetd/daytimetcpsrv3.c##\n    socklen_t len;##  6 ##src/inetd/daytimetcpsrv3.c##\n    struct sockaddr *cliaddr;##  7 ##src/inetd/daytimetcpsrv3.c##\n    char    buff[MAXLINE];##  8 ##src/inetd/daytimetcpsrv3.c##\n    time_t  ticks;##  9 ##src/inetd/daytimetcpsrv3.c##\n\n    daemon_inetd(argv[0], 0);## 10 ##src/inetd/daytimetcpsrv3.c##\n\n    cliaddr = Malloc(MAXSOCKADDR);## 11 ##src/inetd/daytimetcpsrv3.c##\n    len = MAXSOCKADDR;## 12 ##src/inetd/daytimetcpsrv3.c##\n    Getpeername(0, cliaddr, &len);## 13 ##src/inetd/daytimetcpsrv3.c##\n    err_msg(\"connection from %s\", Sock_ntop(cliaddr, len));## 14 ##src/inetd/daytimetcpsrv3.c##\n\n    ticks = time(NULL);## 15 ##src/inetd/daytimetcpsrv3.c##\n    snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));## 16 ##src/inetd/daytimetcpsrv3.c##\n    Write(0, buff, strlen(buff));## 17 ##src/inetd/daytimetcpsrv3.c##\n\n    Close(0);                   /* close TCP connection */## 18 ##src/inetd/daytimetcpsrv3.c##\n    exit(0);## 19 ##src/inetd/daytimetcpsrv3.c##\n}## 20 ##src/inetd/daytimetcpsrv3.c##\n"
  },
  {
    "path": "install-sh",
    "content": "#! /bin/sh\n#\n# install - install a program, script, or datafile\n# This comes from X11R5 (mit/util/scripts/install.sh).\n#\n# Copyright 1991 by the Massachusetts Institute of Technology\n#\n# Permission to use, copy, modify, distribute, and sell this software and its\n# documentation for any purpose is hereby granted without fee, provided that\n# the above copyright notice appear in all copies and that both that\n# copyright notice and this permission notice appear in supporting\n# documentation, and that the name of M.I.T. not be used in advertising or\n# publicity pertaining to distribution of the software without specific,\n# written prior permission.  M.I.T. makes no representations about the\n# suitability of this software for any purpose.  It is provided \"as is\"\n# without express or implied warranty.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.  It can only install one file at a time, a restriction\n# shared with many OS's install programs.\n\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=\"${DOITPROG-}\"\n\n\n# put in absolute paths if you don't have them in your path; or use env. vars.\n\nmvprog=\"${MVPROG-mv}\"\ncpprog=\"${CPPROG-cp}\"\nchmodprog=\"${CHMODPROG-chmod}\"\nchownprog=\"${CHOWNPROG-chown}\"\nchgrpprog=\"${CHGRPPROG-chgrp}\"\nstripprog=\"${STRIPPROG-strip}\"\nrmprog=\"${RMPROG-rm}\"\nmkdirprog=\"${MKDIRPROG-mkdir}\"\n\ntransformbasename=\"\"\ntransform_arg=\"\"\ninstcmd=\"$mvprog\"\nchmodcmd=\"$chmodprog 0755\"\nchowncmd=\"\"\nchgrpcmd=\"\"\nstripcmd=\"\"\nrmcmd=\"$rmprog -f\"\nmvcmd=\"$mvprog\"\nsrc=\"\"\ndst=\"\"\ndir_arg=\"\"\n\nwhile [ x\"$1\" != x ]; do\n    case $1 in\n\t-c) instcmd=\"$cpprog\"\n\t    shift\n\t    continue;;\n\n\t-d) dir_arg=true\n\t    shift\n\t    continue;;\n\n\t-m) chmodcmd=\"$chmodprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-o) chowncmd=\"$chownprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-g) chgrpcmd=\"$chgrpprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-s) stripcmd=\"$stripprog\"\n\t    shift\n\t    continue;;\n\n\t-t=*) transformarg=`echo $1 | sed 's/-t=//'`\n\t    shift\n\t    continue;;\n\n\t-b=*) transformbasename=`echo $1 | sed 's/-b=//'`\n\t    shift\n\t    continue;;\n\n\t*)  if [ x\"$src\" = x ]\n\t    then\n\t\tsrc=$1\n\t    else\n\t\t# this colon is to work around a 386BSD /bin/sh bug\n\t\t:\n\t\tdst=$1\n\t    fi\n\t    shift\n\t    continue;;\n    esac\ndone\n\nif [ x\"$src\" = x ]\nthen\n\techo \"install:\tno input file specified\"\n\texit 1\nelse\n\ttrue\nfi\n\nif [ x\"$dir_arg\" != x ]; then\n\tdst=$src\n\tsrc=\"\"\n\t\n\tif [ -d $dst ]; then\n\t\tinstcmd=:\n\telse\n\t\tinstcmd=mkdir\n\tfi\nelse\n\n# Waiting for this to be detected by the \"$instcmd $src $dsttmp\" command\n# might cause directories to be created, which would be especially bad \n# if $src (and thus $dsttmp) contains '*'.\n\n\tif [ -f $src -o -d $src ]\n\tthen\n\t\ttrue\n\telse\n\t\techo \"install:  $src does not exist\"\n\t\texit 1\n\tfi\n\t\n\tif [ x\"$dst\" = x ]\n\tthen\n\t\techo \"install:\tno destination specified\"\n\t\texit 1\n\telse\n\t\ttrue\n\tfi\n\n# If destination is a directory, append the input filename; if your system\n# does not like double slashes in filenames, you may need to add some logic\n\n\tif [ -d $dst ]\n\tthen\n\t\tdst=\"$dst\"/`basename $src`\n\telse\n\t\ttrue\n\tfi\nfi\n\n## this sed command emulates the dirname command\ndstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`\n\n# Make sure that the destination directory exists.\n#  this part is taken from Noah Friedman's mkinstalldirs script\n\n# Skip lots of stat calls in the usual case.\nif [ ! -d \"$dstdir\" ]; then\ndefaultIFS='\t\n'\nIFS=\"${IFS-${defaultIFS}}\"\n\noIFS=\"${IFS}\"\n# Some sh's can't handle IFS=/ for some reason.\nIFS='%'\nset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`\nIFS=\"${oIFS}\"\n\npathcomp=''\n\nwhile [ $# -ne 0 ] ; do\n\tpathcomp=\"${pathcomp}${1}\"\n\tshift\n\n\tif [ ! -d \"${pathcomp}\" ] ;\n        then\n\t\t$mkdirprog \"${pathcomp}\"\n\telse\n\t\ttrue\n\tfi\n\n\tpathcomp=\"${pathcomp}/\"\ndone\nfi\n\nif [ x\"$dir_arg\" != x ]\nthen\n\t$doit $instcmd $dst &&\n\n\tif [ x\"$chowncmd\" != x ]; then $doit $chowncmd $dst; else true ; fi &&\n\tif [ x\"$chgrpcmd\" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&\n\tif [ x\"$stripcmd\" != x ]; then $doit $stripcmd $dst; else true ; fi &&\n\tif [ x\"$chmodcmd\" != x ]; then $doit $chmodcmd $dst; else true ; fi\nelse\n\n# If we're going to rename the final executable, determine the name now.\n\n\tif [ x\"$transformarg\" = x ] \n\tthen\n\t\tdstfile=`basename $dst`\n\telse\n\t\tdstfile=`basename $dst $transformbasename | \n\t\t\tsed $transformarg`$transformbasename\n\tfi\n\n# don't allow the sed command to completely eliminate the filename\n\n\tif [ x\"$dstfile\" = x ] \n\tthen\n\t\tdstfile=`basename $dst`\n\telse\n\t\ttrue\n\tfi\n\n# Make a temp file name in the proper directory.\n\n\tdsttmp=$dstdir/#inst.$$#\n\n# Move or copy the file name to the temp name\n\n\t$doit $instcmd $src $dsttmp &&\n\n\ttrap \"rm -f ${dsttmp}\" 0 &&\n\n# and set any options; do chmod last to preserve setuid bits\n\n# If any of these fail, we abort the whole thing.  If we want to\n# ignore errors from any of these, just make sure not to ignore\n# errors from the above \"$doit $instcmd $src $dsttmp\" command.\n\n\tif [ x\"$chowncmd\" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&\n\tif [ x\"$chgrpcmd\" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&\n\tif [ x\"$stripcmd\" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&\n\tif [ x\"$chmodcmd\" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&\n\n# Now rename the file to the real destination.\n\n\t$doit $rmcmd -f $dstdir/$dstfile &&\n\t$doit $mvcmd $dsttmp $dstdir/$dstfile \n\nfi &&\n\n\nexit 0\n"
  },
  {
    "path": "intro/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tdaytimetcpcli daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \\\n\t\tdaytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \\\n\t\tdaytimetcpcliv6 daytimetcpsrvv6 \\\n\t\tbyteorder\n\nall:\t${PROGS}\n\ndaytimetcpcli:\tdaytimetcpcli.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}\n\ndaytimetcpcli1:\tdaytimetcpcli1.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli1.o ${LIBS}\n\ndaytimetcpcli2:\tdaytimetcpcli2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli2.o ${LIBS}\n\ndaytimetcpcli3:\tdaytimetcpcli3.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli3.o ${LIBS}\n\ndaytimetcpsrv:\tdaytimetcpsrv.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv.o ${LIBS}\n\ndaytimetcpsrv1:\tdaytimetcpsrv1.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv1.o ${LIBS}\n\ndaytimetcpsrv2:\tdaytimetcpsrv2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}\n\ndaytimetcpsrv3:\tdaytimetcpsrv3.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS}\n\ndaytimetcpcliv6:\tdaytimetcpcliv6.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcliv6.o ${LIBS}\n\ndaytimetcpsrvv6:\tdaytimetcpsrvv6.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrvv6.o ${LIBS}\n\nbyteorder:\tbyteorder.o\n\t\t${CC} ${CFLAGS} -o $@ byteorder.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "intro/byteorder.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tunion {\n\t  short  s;\n      char   c[sizeof(short)];\n    } un;\n\n\tun.s = 0x0102;\n\tprintf(\"%s: \", CPU_VENDOR_OS);\n\tif (sizeof(short) == 2) {\n\t\tif (un.c[0] == 1 && un.c[1] == 2)\n\t\t\tprintf(\"big-endian\\n\");\n\t\telse if (un.c[0] == 2 && un.c[1] == 1)\n\t\t\tprintf(\"little-endian\\n\");\n\t\telse\n\t\t\tprintf(\"unknown\\n\");\n\t} else\n\t\tprintf(\"sizeof(short) = %d\\n\", sizeof(short));\n\n\texit(0);\n}\n"
  },
  {
    "path": "intro/daytimetcpcli.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out <IPaddress>\");\n\n\tif ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port   = htons(13);\t/* daytime server */\n\tif (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)\n\t\terr_quit(\"inet_pton error for %s\", argv[1]);\n\n\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"connect error\");\n\n\twhile ( (n = read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tif (fputs(recvline, stdout) == EOF)\n\t\t\terr_sys(\"fputs error\");\n\t}\n\tif (n < 0)\n\t\terr_sys(\"read error\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "intro/daytimetcpcli1.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n, counter = 0;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out <IPaddress>\");\n\n\tif ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port   = htons(13);\t/* daytime server */\n\tif (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)\n\t\terr_quit(\"inet_pton error for %s\", argv[1]);\n\n\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"connect error\");\n\n\twhile ( (n = read(sockfd, recvline, MAXLINE)) > 0) {\n\t\tcounter++;\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tif (fputs(recvline, stdout) == EOF)\n\t\t\terr_sys(\"fputs error\");\n\t}\n\tif (n < 0)\n\t\terr_sys(\"read error\");\n\n\tprintf(\"counter = %d\\n\", counter);\n\texit(0);\n}\n"
  },
  {
    "path": "intro/daytimetcpcli2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n, counter = 0;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out <IPaddress>\");\n\n\tif ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port   = htons(9999);\t/* daytime server */\n\tif (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)\n\t\terr_quit(\"inet_pton error for %s\", argv[1]);\n\n\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"connect error\");\n\n\twhile ( (n = read(sockfd, recvline, MAXLINE)) > 0) {\n\t\tcounter++;\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tif (fputs(recvline, stdout) == EOF)\n\t\t\terr_sys(\"fputs error\");\n\t}\n\tif (n < 0)\n\t\terr_sys(\"read error\");\n\n\tprintf(\"counter = %d\\n\", counter);\n\texit(0);\n}\n"
  },
  {
    "path": "intro/daytimetcpcli3.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tsocklen_t\t\t\tlen;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out <IPaddress>\");\n\n\tif ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port   = htons(13);\t/* daytime server */\n\tif (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)\n\t\terr_quit(\"inet_pton error for %s\", argv[1]);\n\n\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"connect error\");\n\n\tlen = sizeof(cliaddr);\n\tGetsockname(sockfd, (SA *) &cliaddr, &len);\n\tprintf(\"local addr: %s\\n\",\n\t\t   Sock_ntop((SA *) &cliaddr, sizeof(cliaddr)));\n\n\twhile ( (n = read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tif (fputs(recvline, stdout) == EOF)\n\t\t\terr_sys(\"fputs error\");\n\t}\n\tif (n < 0)\n\t\terr_sys(\"read error\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "intro/daytimetcpcliv6.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tstruct sockaddr_in6\tservaddr;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out <IPaddress>\");\n\n\tif ( (sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin6_family = AF_INET6;\n\tservaddr.sin6_port   = htons(13);\t/* daytime server */\n\tif (inet_pton(AF_INET6, argv[1], &servaddr.sin6_addr) <= 0)\n\t\terr_quit(\"inet_pton error for %s\", argv[1]);\n\n\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"connect error\");\n\n\twhile ( (n = read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tif (fputs(recvline, stdout) == EOF)\n\t\t\terr_sys(\"fputs error\");\n\t}\n\tif (n < 0)\n\t\terr_sys(\"read error\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "intro/daytimetcpsrv.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tstruct sockaddr_in\tservaddr;\n\tchar\t\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\t\tticks;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(13);\t/* daytime server */\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tconnfd = Accept(listenfd, (SA *) NULL, NULL);\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Write(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "intro/daytimetcpsrv.lc",
    "content": "#include    \"unp.h\"##  1 ##src/intro/daytimetcpsrv.c##\n#include    <time.h>##  2 ##src/intro/daytimetcpsrv.c##\n\nint##  3 ##src/intro/daytimetcpsrv.c##\nmain(int argc, char **argv)##  4 ##src/intro/daytimetcpsrv.c##\n{##  5 ##src/intro/daytimetcpsrv.c##\n    int     listenfd, connfd;##  6 ##src/intro/daytimetcpsrv.c##\n    struct sockaddr_in servaddr;##  7 ##src/intro/daytimetcpsrv.c##\n    char    buff[MAXLINE];##  8 ##src/intro/daytimetcpsrv.c##\n    time_t  ticks;##  9 ##src/intro/daytimetcpsrv.c##\n\n    listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 10 ##src/intro/daytimetcpsrv.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 11 ##src/intro/daytimetcpsrv.c##\n    servaddr.sin_family = AF_INET;## 12 ##src/intro/daytimetcpsrv.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 13 ##src/intro/daytimetcpsrv.c##\n    servaddr.sin_port = htons(13);  /* daytime server */## 14 ##src/intro/daytimetcpsrv.c##\n\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 15 ##src/intro/daytimetcpsrv.c##\n\n    Listen(listenfd, LISTENQ);## 16 ##src/intro/daytimetcpsrv.c##\n\n    for (;;) {## 17 ##src/intro/daytimetcpsrv.c##\n        connfd = Accept(listenfd, (SA *) NULL, NULL);## 18 ##src/intro/daytimetcpsrv.c##\n\n        ticks = time(NULL);## 19 ##src/intro/daytimetcpsrv.c##\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));## 20 ##src/intro/daytimetcpsrv.c##\n        Write(connfd, buff, strlen(buff));## 21 ##src/intro/daytimetcpsrv.c##\n\n        Close(connfd);## 22 ##src/intro/daytimetcpsrv.c##\n    }## 23 ##src/intro/daytimetcpsrv.c##\n}## 24 ##src/intro/daytimetcpsrv.c##\n"
  },
  {
    "path": "intro/daytimetcpsrv1.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\tchar\t\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\t\tticks;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(13);\t/* daytime server */\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &len);\n\t\tprintf(\"connection from %s, port %d\\n\",\n\t\t\t   Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),\n\t\t\t   ntohs(cliaddr.sin_port));\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Write(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "intro/daytimetcpsrv2.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd, i;\n\tstruct sockaddr_in\tservaddr;\n\tchar\t\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\t\tticks;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(9999);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tconnfd = Accept(listenfd, (SA *) NULL, NULL);\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tfor (i = 0; i < strlen(buff); i++)\n        \tWrite(connfd, &buff[i], 1);\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "intro/daytimetcpsrv3.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\tchar\t\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\t\tticks;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(9999);\t/* daytime server */\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &len);\n\t\tprintf(\"connection from %s, port %d\\n\",\n\t\t\t   Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),\n\t\t\t   ntohs(cliaddr.sin_port));\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Write(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "intro/daytimetcpsrvv6.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\t\tlen;\n\tchar\t\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\t\tticks;\n\tstruct sockaddr_in6\tservaddr, cliaddr;\n\n\tlistenfd = Socket(AF_INET6, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin6_family = AF_INET6;\n\tservaddr.sin6_addr   = in6addr_any;\n\tservaddr.sin6_port   = htons(13);\t/* daytime server */\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &len);\n\t\tprintf(\"connection from %s\\n\",\n\t\t\t   Sock_ntop((SA *) &cliaddr, len));\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Write(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "intro/truss.solaris.2.6",
    "content": "so_socket(2, 2, 0, \"\", 1)                       = 3\nconnect(3, 0xEFFFE8C8, 16)                      = 0\nread(3, \" F r i   A p r     4   1\".., 4096)     = 26\nioctl(1, TCGETA, 0xEFFFE69C)                    = 0\nwrite(1, \" F r i   A p r     4   1\".., 26)      = 26\nread(3, 0xEFFFE8D8, 4096)                       = 0\nllseek(0, 0, SEEK_CUR)                          = 179866\n_exit(0)\n"
  },
  {
    "path": "intro/truss.unixware.2.1",
    "content": "execve(\"./daytimetcpcli\", 0x08047BA8, 0x08047BB4)  argc = 2\nopen(\"/usr/lib/libsocket.so.2\", O_RDONLY, 0)\t= 3\nfxstat(2, 3, 0x0804794C)\t\t\t= 0\nmmap(0x00000000, 4096, PROT_READ, MAP_SHARED, 3, 0) = 0xBFF9E000\nmmap(0x00000000, 98280, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xBFF85000\nmmap(0xBFF9A000, 6888, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 81920) = 0xBFF9A000\nopen(\"/dev/zero\", O_RDONLY, 027777756064)\t= 4\nmmap(0xBFF9C000, 4072, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xBFF9C000\nclose(3)\t\t\t\t\t= 0\nmunmap(0xBFF9E000, 4096)\t\t\t= 0\nopen(\"/usr/lib/libresolv.so.1\", O_RDONLY, 0)\t= 3\nfxstat(2, 3, 0x0804794C)\t\t\t= 0\nmmap(0x00000000, 4096, PROT_READ, MAP_SHARED, 3, 0) = 0xBFF9E000\nmmap(0x00000000, 31060, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xBFF7C000\nmmap(0xBFF82000, 3604, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 20480) = 0xBFF82000\nmmap(0xBFF83000, 2388, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xBFF83000\nclose(3)\t\t\t\t\t= 0\nmunmap(0xBFF9E000, 4096)\t\t\t= 0\nopen(\"/usr/lib/libnsl.so.1\", O_RDONLY, 0)\t= 3\nfxstat(2, 3, 0x0804794C)\t\t\t= 0\nmmap(0x00000000, 4096, PROT_READ, MAP_SHARED, 3, 0) = 0xBFF9E000\nmmap(0x00000000, 248004, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xBFF3E000\nmmap(0xBFF77000, 6456, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 229376) = 0xBFF77000\nmmap(0xBFF79000, 6340, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 4, 0) = 0xBFF79000\nclose(3)\t\t\t\t\t= 0\nmunmap(0xBFF9E000, 4096)\t\t\t= 0\nmmap(0x00000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE, 4, 0) = 0xBFF9E000\nopen(\"/usr/lib/libnsl.so.1\", O_RDONLY, 0)\t= 3\nfxstat(2, 3, 0x0804794C)\t\t\t= 0\nclose(3)\t\t\t\t\t= 0\nopen(\"/usr/lib/libsocket.so.2\", O_RDONLY, 0)\t= 3\nfxstat(2, 3, 0x0804794C)\t\t\t= 0\nclose(3)\t\t\t\t\t= 0\nopen(\"/usr/lib/libnsl.so.1\", O_RDONLY, 0)\t= 3\nfxstat(2, 3, 0x0804794C)\t\t\t= 0\nclose(3)\t\t\t\t\t= 0\nclose(4)\t\t\t\t\t= 0\nbrk(0x0804B52C)\t\t\t\t\t= 0\nopen(\"/etc/netconfig\", O_RDONLY, 0666)\t\t= 3\nioctl(3, TCGETA, 0x080465E6)\t\t\tErr#25 ENOTTY\nioctl(3, I_GETTP, 0x00000000)\t\t\tErr#25 ENOTTY\nfxstat(2, 3, 0x08046614)\t\t\t= 0\nbrk(0x0804E52C)\t\t\t\t\t= 0\nread(3, \" t c p\\t t p i _ c o t s\".., 8192)\t= 806\nread(3, 0x0804A6B8, 8192)\t\t\t= 0\nlseek(3, 0, 0)\t\t\t\t\t= 0\nread(3, \" t c p\\t t p i _ c o t s\".., 8192)\t= 806\nbrk(0x0804F52C)\t\t\t\t\t= 0\nbrk(0x0805052C)\t\t\t\t\t= 0\nread(3, 0x0804A6B8, 8192)\t\t\t= 0\nclose(3)\t\t\t\t\t= 0\nopen(\"/dev/tcp\", O_RDWR, 027776333624)\t\t= 3\nioctl(3, I_FIND, \"sockmod\")\t\t\t= 0\nioctl(3, I_PUSH, \"sockmod\")\t\t\t= 0\nioctl(3, I_SETCLTIME, 0x08046B50)\t\t= 0\nioctl(3, I_SWROPT, 0x00000002)\t\t\t= 0\nsigfillset(0xBFFFEBE4)\t\t\t\t= 0\nsigprocmask(SIG_BLOCK, 0x08046AD8, 0x08046AE8)\t= 0\nioctl(3, I_STR, 0x08046AA0)\t\t\t= 0\n\tcmd=(('I'<<8)|101) timout=-1 len=28 dp=0x08046AF8\n  \\0 @\\0\\010\\0\\0\\0 h01\\0\\080\\0\\0\\002\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\nsigprocmask(SIG_SETMASK, 0x08046AE8, 0x00000000) = 0\nioctl(3, I_GETSIG, 0x08046B18)\t\t\tErr#22 EINVAL\nsigprocmask(SIG_BLOCK, 0x08046B20, 0x08046B30)\t= 0\nioctl(3, I_STR, 0x08046AE0)\t\t\t= 0\n\tcmd=TI_OPTMGMT timout=-1 len=32 dp=0x0804ABA8\n  16\\0\\0\\010\\0\\0\\010\\0\\0\\004\\0\\0\\0FFFF\\0\\00110\\0\\004\\0\\0\\0\\0 `\\0\\0\nsigprocmask(SIG_SETMASK, 0x08046B30, 0x00000000) = 0\nsigprocmask(SIG_BLOCK, 0x08046B0C, 0x08046B1C)\t= 0\nioctl(3, I_STR, 0x08046ACC)\t\t\t= 0\n\tcmd=TI_OPTMGMT timout=-1 len=32 dp=0x0804ABA8\n  16\\0\\0\\010\\0\\0\\010\\0\\0\\004\\0\\0\\0FFFF\\0\\00210\\0\\004\\0\\0\\0\\0 `\\0\\0\nsigprocmask(SIG_SETMASK, 0x08046B1C, 0x00000000) = 0\nfcntl(3, F_GETFL, 0x00000000)\t\t\t= 2\nsigprocmask(SIG_BLOCK, 0x08046828, 0x08046838)\t= 0\nioctl(3, I_STR, 0x080467E4)\t\t\t= 0\n\tcmd=TI_BIND timout=-1 len=32 dp=0x0804ABA8\n  11\\0\\0\\010\\0\\0\\010\\0\\0\\0\\0\\0\\0\\002\\004 1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\nsigprocmask(SIG_SETMASK, 0x08046838, 0x00000000) = 0\nsigprocmask(SIG_BLOCK, 0x080469B0, 0x080469C0)\t= 0\nputmsg(3, 0x08046958, 0x00000000, 0)\t\t= 0\n\tctl:  maxlen=428  len=36   buf=0x0804ABA8\nfcntl(3, F_GETFL, 0x00000000)\t\t\t= 2\ngetmsg(3, 0x08046924, 0x08046918, 0x08046934)\t= 0\n\tctl:  maxlen=428  len=8    buf=0x0804ABA8\n\tdat:  maxlen=128  len=-1   buf=0x08046898\nfcntl(3, F_GETFL, 0x00000000)\t\t\t= 2\ngetmsg(3, 0x08046964, 0x08046958, 0x0804697C)\t= 0\n\tctl:  maxlen=428  len=56   buf=0x0804ABA8\n\tdat:  maxlen=128  len=-1   buf=0x080468D8\nsigprocmask(SIG_SETMASK, 0x080469C0, 0x00000000) = 0\ngetmsg(3, 0x08046AEC, 0x08046AE0, 0x08046B14)\t= 0\n\tctl:  maxlen=428  len=8    buf=0x0804ABA8\n\tdat:  maxlen=4096 len=26   buf=0x08046BB0\nioctl(1, TCGETA, 0x08046A9A)\t\t\t= 0\n\tiflag=0002406 oflag=0000005 cflag=0002275 lflag=0000053 line=0\n\t    cc:  177 034 010 025 004 000 000 000\nwrite(1, \" F r i   A p r     4   0\".., 26)\t= 26\ngetmsg(3, 0x08046AEC, 0x08046AE0, 0x08046B14)\t= 0\n\tctl:  maxlen=428  len=-1   buf=0x0804ABA8\n\tdat:  maxlen=4096 len=0    buf=0x08046BB0\n_exit(0)\n"
  },
  {
    "path": "ioctl/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tlsif01 lsif02 prifinfo prmac\n\nall:\t${PROGS}\n\nlsif01:\tlsif01.o\n\t\t${CC} ${CFLAGS} -o $@ lsif01.o ${LIBS}\n\nlsif02:\tlsif02.o\n\t\t${CC} ${CFLAGS} -o $@ lsif02.o ${LIBS}\n\nprifinfo:\tprifinfo.o\n\t\t${CC} ${CFLAGS} -o $@ prifinfo.o ${LIBS}\n\nprmac:\tprmac.o\n\t\t${CC} ${CFLAGS} -o $@ prmac.o ${LIBS}\n\ntest1:\ttest1.o\n\t\t${CC} ${CFLAGS} -o $@ test1.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "ioctl/Progs.siocgifconf",
    "content": "\tif (ioctl(s, SIOCGIFCONF, (char *) &ifc) < 0)\n./games/hunt/hunt/hunt.c\n\ti =  ioctl(sock, SIOCGIFCONF, (char *)&ifc);\n./lib/libc/net/getifaddrs.c\n\tif (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {\n./lib/librpc/rpc/get_myaddress.c\n        if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {\n./lib/librpc/rpc/pmap_rmt.c\n\t\tioc.ic_cmd = SIOCGIFCONF;\n\t\tm = ioctl(s, SIOCGIFCONF, (caddr_t) & ifconf);\n\t\t\treport(LOG_ERR, \"ioctl SIOCGIFCONF\");\n./libexec/bootpd/bootpd/getif.c\n\tif (ioctl(fd, SIOCGIFCONF, (char *) &ifc) < 0 ||\n\t\treport(LOG_ERR, \"getether: SIOCGIFCONF: %s\", get_errmsg);\n./libexec/bootpd/bootptest/getether.c\n#ifdef OSIOCGIFCONF\n\tif (ioctl(fd, OSIOCGIFCONF, (char *)&ifc) < 0 ||\n\t\t(void) strcpy(errbuf, \"bpf: ioctl(OSIOCGIFCONF): %m\");\n\tif (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 ||\n\t\t(void) strcpy(errbuf, \"bpf: ioctl(SIOCGIFCONF): %m\");\n./libexec/rbootd/bpf.c\n#define\tSCO_SIOCGIFCONF\t\t0xc0084911\n\tif ((r = ioctl(f, SIOCGIFCONF, &bifc)) == -1) {\n\tcase SCO_SIOCGIFCONF:\n./sco/emulator/sco_sockops.c\n\tcase SIOCGIFCONF:\n\tcase OSIOCGIFCONF:\n\t\t\tif (cmd == OSIOCGIFCONF) {\n./sys/net/if.c\n\tcase SIOCGIFCONF_X25:\n./sys/netccitt/pk_usrreq.c\n\tif (ioctl(sk, SIOCGIFCONF, (caddr_t) &ifc) < 0)\n./usr.sbin/amd/amd/wire.c\n\tif (ioctl(vs, SIOCGIFCONF, (char *)&ifc) < 0) {\n./usr.sbin/named/named/ns_main.c\n\tif (ioctl(fd, SIOCGIFCONF, (caddr_t)&ifc) < 0 ||\n\t\terr(FATAL, \"init_all: SIOCGIFCONF: %s\", strerror(errno));\n\t   We must instead get all the interfaces with SIOCGIFCONF\n\tif (ioctl(fd, SIOCGIFCONF, (caddr_t)&ifc) < 0 ||\n./usr.sbin/rarpd/rarpd.c\n#ifdef SIOCGIFCONF\n#ifdef SIOCGIFCONF\n\tif (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0)\n./usr.sbin/sendmail/src/conf.c\n\tif (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 ||\n\t\t(void)sprintf(errbuf, \"SIOCGIFCONF: %s\", pcap_strerror(errno));\n./usr.sbin/tcpdump/libpcap/inet.c\n\tif (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {\n./usr.sbin/timed/timed/timed.c\n\tioc.ic_cmd = SIOCGIFCONF;\n\tif (ioctl(vs, SIOCGIFCONF, (char *)&ifc) < 0) {\n#ifdef SIOCGIFCONF\n#endif /* SIOCGIFCONF */\n./usr.sbin/xntp/xntpd/ntp_io.c\n#if ((defined(SVR4) && !defined(sun)) || defined(ISC)) && defined(SIOCGIFCONF)\n#define SYSV_SIOCGIFCONF\n#ifdef SYSV_SIOCGIFCONF\n/* Deal with different SIOCGIFCONF ioctl semantics on SYSV, SVR4 */\n    if (cmd == SIOCGIFCONF)\n\t/* SIOCGIFCONF is somewhat brain damaged on ISC. The argument\n    if (ret >= 0 && cmd == SIOCGIFCONF)\n#else /* SYSV_SIOCGIFCONF */\n#endif /* SYSV_SIOCGIFCONF */\n#if defined(STREAMSCONN) && !defined(SYSV_SIOCGIFCONF) && !defined(NCR)\n#ifdef SIOCGIFCONF\n    if (ifioctl (fd, SIOCGIFCONF, (char *) &ifc) < 0)\n\t * this is ugly but SIOCGIFCONF returns decnet addresses in\n#else /* SIOCGIFCONF */\n#endif /* SIOCGIFCONF else */\n#endif /* STREAMSCONN && !SYSV_SIOCGIFCONF else */\n./X11/xc/programs/xdm/auth.c\n#if ((defined(SVR4) && !defined(sun) && !defined(NCR)) || defined(ISC)) && defined(SIOCGIFCONF)\n/* Deal with different SIOCGIFCONF ioctl semantics on these OSs */\n    if (cmd == SIOCGIFCONF)\n\t/* SIOCGIFCONF is somewhat brain damaged on ISC. The argument\n    if (ret >= 0 && cmd == SIOCGIFCONF)\n#else /* ((SVR4 && !sun && !NCR) || ISC) && SIOCGIFCONF */\n#endif /* ((SVR4 && !sun) || ISC) && SIOCGIFCONF */\n\tif (ifioctl (socketFD, (int) SIOCGIFCONF, (char *) &ifc) < 0)\n./X11/xc/programs/xdm/chooser.c\n#if ((defined(SVR4) && !defined(sun) && !defined(NCR)) || defined(ISC)) && defined(SIOCGIFCONF)\n/* Deal with different SIOCGIFCONF ioctl semantics on these OSs */\n    if (cmd == SIOCGIFCONF)\n\t/* SIOCGIFCONF is somewhat brain damaged on ISC. The argument\n    if (ret >= 0 && cmd == SIOCGIFCONF)\n#else /* ((SVR4 && !sun) || ISC) && SIOCGIFCONF */\n#endif /* ((SVR4 && !sun) || ISC) && SIOCGIFCONF */\n#if !defined(SIOCGIFCONF) || (defined (hpux) && ! defined (HAS_IFREQ))\n    if (ifioctl (fd, (int) SIOCGIFCONF, (pointer) &ifc) < 0)\n./X11/xc/programs/Xserver/os/access.c\n#if !defined(SIOCGIFCONF) || (defined (hpux) && ! defined (HAS_IFREQ))\n    if (ioctl (fd, (int) SIOCGIFCONF, (pointer) &ifc) < 0)\n./X11/xc/workInProgress/lbx/programs/lbxproxy/os/access.c\n"
  },
  {
    "path": "ioctl/Script.solaris",
    "content": "kohala % ./prifinfo 4 1\ntrying len = 64\nioctl error\ntrying len = 96\nioctl error\ntrying len = 128\nioctl error\ntrying len = 160\nioctl error\ntrying len = 192\nreturned len = 160\ntrying len = 224\nreturned len = 160\nsuccess, len = 160\nlo0: <UP MCAST LOOP >\n  IP addr: 127.0.0.1\nle0: <UP BCAST MCAST >\n  IP addr: 206.62.226.33\n  broadcast addr: 206.62.226.63\nle0:1: <UP BCAST MCAST >\n  IP addr: 140.252.13.47\n  broadcast addr: 140.252.13.63\nle0:2: <UP BCAST MCAST >\n  IP addr: 140.252.13.48\n  broadcast addr: 140.252.13.63\nle0:3: <UP BCAST MCAST >\n  IP addr: 140.252.13.49\n  broadcast addr: 140.252.13.63\n"
  },
  {
    "path": "ioctl/lsif01.c",
    "content": "#include\t\"unp.h\"\n\n#include\t<net/if.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, len;\n\tchar\t\t\t\t*ptr, buf[2048], addrstr[INET_ADDRSTRLEN];\n\tstruct ifconf\t\tifc;\n\tstruct ifreq\t\t*ifr;\n\tstruct sockaddr_in\t*sinptr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tifc.ifc_len = sizeof(buf);\n\tifc.ifc_req = (struct ifreq *) buf;\n\tIoctl(sockfd, SIOCGIFCONF, &ifc);\n\n\tfor (ptr = buf; ptr < buf + ifc.ifc_len; ) {\n\t\tifr = (struct ifreq *) ptr;\n\t\tlen = sizeof(struct sockaddr);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\tif (ifr->ifr_addr.sa_len > len)\n\t\t\tlen = ifr->ifr_addr.sa_len;\t\t/* length > 16 */\n#endif\n\t\tptr += sizeof(ifr->ifr_name) + len;\t/* for next one in buffer */\n\n\t\tswitch (ifr->ifr_addr.sa_family) {\n\t\tcase AF_INET:\n\t\t\tsinptr = (struct sockaddr_in *) &ifr->ifr_addr;\n\t\t\tprintf(\"%s\\t%s\\n\", ifr->ifr_name,\n\t\t\t\t   Inet_ntop(AF_INET, &sinptr->sin_addr, addrstr, sizeof(addrstr)));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tprintf(\"%s\\n\", ifr->ifr_name);\n\t\t\tbreak;\n\t\t}\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "ioctl/lsif02.c",
    "content": "#include\t\"unp.h\"\n\n#include\t<net/if.h>\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n#include\t<net/if_dl.h>\n#include\t<net/if_types.h>\n#endif\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, len;\n\tchar\t\t\t\t*ptr, buf[2048], addrstr[INET_ADDRSTRLEN];\n\tstruct ifconf\t\tifc;\n\tstruct ifreq\t\t*ifr;\n\tstruct sockaddr_in\t*sinptr;\n\n\tif ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tifc.ifc_len = sizeof(buf);\n\tifc.ifc_req = (struct ifreq *) buf;\n\tif (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)\n\t\terr_sys(\"ioctl SIOCGIFCONF error\");\n\n\tfor (ptr = buf; ptr < buf + ifc.ifc_len; ) {\n\t\tifr = (struct ifreq *) ptr;\n\t\tlen = sizeof(struct sockaddr);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\tif (ifr->ifr_addr.sa_len > len)\n\t\t\tlen = ifr->ifr_addr.sa_len;\t\t/* length > 16 */\n#endif\n\t\tptr += sizeof(ifr->ifr_name) + len;\t/* for next one in buffer */\n\n\t\tswitch (ifr->ifr_addr.sa_family) {\n\t\tcase AF_INET:\n\t\t\tsinptr = (struct sockaddr_in *) &ifr->ifr_addr;\n\t\t\tprintf(\"%s\\t%s\\n\", ifr->ifr_name,\n\t\t\t\t   Inet_ntop(AF_INET, &sinptr->sin_addr, addrstr, sizeof(addrstr)));\n\t\t\tbreak;\n\n#ifdef\tAF_INET6\n\t\tcase AF_INET6: {\n\t\t\tstruct sockaddr_in6\t*sin6ptr;\n\t\t\tchar addr6str[INET6_ADDRSTRLEN];\n\n\t\t\tsin6ptr = (struct sockaddr_in6 *) &ifr->ifr_addr;\n\t\t\tprintf(\"%s\\t%s\\n\", ifr->ifr_name,\n\t\t\t\t   Inet_ntop(AF_INET6, &sin6ptr->sin6_addr, addr6str, sizeof(addr6str)));\n\t\t\tbreak;\n\t\t}\n#endif\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n\t\tcase AF_LINK: {\n\t\t\tstruct sockaddr_dl\t*sdlptr;\n\t\t\tchar\t\t\t\tstr[18];\n\t\t\tchar\t\t\t\t*etherprint(const u_char *, char *);\n\n\t\t\tsdlptr = (struct sockaddr_dl *) &ifr->ifr_addr;\n\t\t\tprintf(\"%s\", ifr->ifr_name);\n\t\t\tif (sdlptr->sdl_index)\n\t\t\t\tprintf(\"\\t<link %d>\", sdlptr->sdl_index);\n\t\t\tif (sdlptr->sdl_type == IFT_ETHER && sdlptr->sdl_alen)\n\t\t\t\tprintf(\"\\t%s\", etherprint((u_char *) LLADDR(sdlptr), str));\n\t\t\tputchar('\\n');\n\t\t\tbreak;\n\t\t}\n#endif\n\n\t\tdefault:\n\t\t\tprintf(\"%s\\n\", ifr->ifr_name);\n\t\t\tbreak;\n\t\t}\n\t}\n\texit(0);\n}\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\nchar *\netherprint(const u_char eaddr[6], char string[18])\n{\n\tsnprintf(string, 18, \"%02x:%02x:%02x:%02x:%02x:%02x\",\n\t\t    eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5] );\n\tstring[17] = '\\0';\n\treturn(string);\n}\n#endif\n"
  },
  {
    "path": "ioctl/prifinfo.c",
    "content": "#include\t\"unpifi.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tstruct ifi_info\t*ifi, *ifihead;\n\tstruct sockaddr\t*sa;\n\tu_char\t\t\t*ptr;\n\tint\t\t\t\ti, family, doaliases;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: prifinfo <inet4|inet6> <doaliases>\");\n\n\tif (strcmp(argv[1], \"inet4\") == 0)\n\t\tfamily = AF_INET;\n#ifdef\tIPv6\n\telse if (strcmp(argv[1], \"inet6\") == 0)\n\t\tfamily = AF_INET6;\n#endif\n\telse\n\t\terr_quit(\"invalid <address-family>\");\n\tdoaliases = atoi(argv[2]);\n\n\tfor (ifihead = ifi = Get_ifi_info(family, doaliases);\n\t\t ifi != NULL; ifi = ifi->ifi_next) {\n\t\tprintf(\"%s: \", ifi->ifi_name);\n\t\tif (ifi->ifi_index != 0)\n\t\t\tprintf(\"(%d) \", ifi->ifi_index);\n\t\tprintf(\"<\");\n/* *INDENT-OFF* */\n\t\tif (ifi->ifi_flags & IFF_UP)\t\t\tprintf(\"UP \");\n\t\tif (ifi->ifi_flags & IFF_BROADCAST)\t\tprintf(\"BCAST \");\n\t\tif (ifi->ifi_flags & IFF_MULTICAST)\t\tprintf(\"MCAST \");\n\t\tif (ifi->ifi_flags & IFF_LOOPBACK)\t\tprintf(\"LOOP \");\n\t\tif (ifi->ifi_flags & IFF_POINTOPOINT)\tprintf(\"P2P \");\n\t\tprintf(\">\\n\");\n/* *INDENT-ON* */\n\n\t\tif ( (i = ifi->ifi_hlen) > 0) {\n\t\t\tptr = ifi->ifi_haddr;\n\t\t\tdo {\n\t\t\t\tprintf(\"%s%x\", (i == ifi->ifi_hlen) ? \"  \" : \":\", *ptr++);\n\t\t\t} while (--i > 0);\n\t\t\tprintf(\"\\n\");\n\t\t}\n\t\tif (ifi->ifi_mtu != 0)\n\t\t\tprintf(\"  MTU: %d\\n\", ifi->ifi_mtu);\n\n\t\tif ( (sa = ifi->ifi_addr) != NULL)\n\t\t\tprintf(\"  IP addr: %s\\n\",\n\t\t\t\t\t\tSock_ntop_host(sa, sizeof(*sa)));\n\t\tif ( (sa = ifi->ifi_brdaddr) != NULL)\n\t\t\tprintf(\"  broadcast addr: %s\\n\",\n\t\t\t\t\t\tSock_ntop_host(sa, sizeof(*sa)));\n\t\tif ( (sa = ifi->ifi_dstaddr) != NULL)\n\t\t\tprintf(\"  destination addr: %s\\n\",\n\t\t\t\t\t\tSock_ntop_host(sa, sizeof(*sa)));\n\t}\n\tfree_ifi_info(ifihead);\n\texit(0);\n}\n"
  },
  {
    "path": "ioctl/prifinfo.lc",
    "content": "#include    \"unpifi.h\"##  1 ##src/ioctl/prifinfo.c##\n\nint##  2 ##src/ioctl/prifinfo.c##\nmain(int argc, char **argv)##  3 ##src/ioctl/prifinfo.c##\n{##  4 ##src/ioctl/prifinfo.c##\n    struct ifi_info *ifi, *ifihead;##  5 ##src/ioctl/prifinfo.c##\n    struct sockaddr *sa;##  6 ##src/ioctl/prifinfo.c##\n    u_char *ptr;##  7 ##src/ioctl/prifinfo.c##\n    int     i, family, doaliases;##  8 ##src/ioctl/prifinfo.c##\n\n    if (argc != 3)##  9 ##src/ioctl/prifinfo.c##\n        err_quit(\"usage: prifinfo <inet4|inet6> <doaliases>\");## 10 ##src/ioctl/prifinfo.c##\n\n    if (strcmp(argv[1], \"inet4\") == 0)## 11 ##src/ioctl/prifinfo.c##\n        family = AF_INET;## 12 ##src/ioctl/prifinfo.c##\n#ifdef  IPV6## 13 ##src/ioctl/prifinfo.c##\n    else if (strcmp(argv[1], \"inet6\") == 0)## 14 ##src/ioctl/prifinfo.c##\n        family = AF_INET6;## 15 ##src/ioctl/prifinfo.c##\n#endif## 16 ##src/ioctl/prifinfo.c##\n    else## 17 ##src/ioctl/prifinfo.c##\n        err_quit(\"invalid <address-family>\");## 18 ##src/ioctl/prifinfo.c##\n    doaliases = atoi(argv[2]);## 19 ##src/ioctl/prifinfo.c##\n\n    for (ifihead = ifi = Get_ifi_info(family, doaliases);## 20 ##src/ioctl/prifinfo.c##\n         ifi != NULL; ifi = ifi->ifi_next) {## 21 ##src/ioctl/prifinfo.c##\n        printf(\"%s: (%d) <\", ifi->ifi_name, ifi->ifi_index);## 22 ##src/ioctl/prifinfo.c##\n        if (ifi->ifi_flags & IFF_UP)            printf(\"UP \");## 23 ##src/ioctl/prifinfo.c##\n        if (ifi->ifi_flags & IFF_BROADCAST)     printf(\"BCAST \");## 24 ##src/ioctl/prifinfo.c##\n        if (ifi->ifi_flags & IFF_MULTICAST)     printf(\"MCAST \");## 25 ##src/ioctl/prifinfo.c##\n        if (ifi->ifi_flags & IFF_LOOPBACK)      printf(\"LOOP \");## 26 ##src/ioctl/prifinfo.c##\n        if (ifi->ifi_flags & IFF_POINTOPOINT)   printf(\"P2P \");## 27 ##src/ioctl/prifinfo.c##\n        printf(\">\\n\");## 28 ##src/ioctl/prifinfo.c##\n\n        if ((i = ifi->ifi_hlen) > 0) {## 29 ##src/ioctl/prifinfo.c##\n            ptr = ifi->ifi_haddr;## 30 ##src/ioctl/prifinfo.c##\n            do {## 31 ##src/ioctl/prifinfo.c##\n                printf(\"%s%x\", (i == ifi->ifi_hlen) ? \"  \" : \":\", *ptr++);## 32 ##src/ioctl/prifinfo.c##\n            } while (--i > 0);## 33 ##src/ioctl/prifinfo.c##\n            printf(\"\\n\");## 34 ##src/ioctl/prifinfo.c##\n        }## 35 ##src/ioctl/prifinfo.c##\n\n        if ((sa = ifi->ifi_addr) != NULL)## 36 ##src/ioctl/prifinfo.c##\n            printf(\"  IP addr: %s\\n\", Sock_ntop_host(sa, sizeof(*sa)));## 37 ##src/ioctl/prifinfo.c##\n        if ((sa = ifi->ifi_brdaddr) != NULL)## 38 ##src/ioctl/prifinfo.c##\n            printf(\"  broadcast addr: %s\\n\",## 39 ##src/ioctl/prifinfo.c##\n                   Sock_ntop_host(sa, sizeof(*sa)));## 40 ##src/ioctl/prifinfo.c##\n        if ((sa = ifi->ifi_dstaddr) != NULL)## 41 ##src/ioctl/prifinfo.c##\n            printf(\"  destination addr: %s\\n\",## 42 ##src/ioctl/prifinfo.c##\n                   Sock_ntop_host(sa, sizeof(*sa)));## 43 ##src/ioctl/prifinfo.c##\n    }## 44 ##src/ioctl/prifinfo.c##\n    free_ifi_info(ifihead);## 45 ##src/ioctl/prifinfo.c##\n    exit(0);## 46 ##src/ioctl/prifinfo.c##\n}## 47 ##src/ioctl/prifinfo.c##\n"
  },
  {
    "path": "ioctl/prmac.c",
    "content": "#include\t\"unpifi.h\"\n#include\t<net/if_arp.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct ifi_info\t\t\t*ifi;\n\tunsigned char\t\t*ptr;\n\tstruct arpreq\t\tarpreq;\n\tstruct sockaddr_in\t*sin;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\tfor (ifi = get_ifi_info(AF_INET, 0); ifi != NULL; ifi = ifi->ifi_next) {\n\t\tprintf(\"%s: \", Sock_ntop(ifi->ifi_addr, sizeof(struct sockaddr_in)));\n\n\t\tsin = (struct sockaddr_in *) &arpreq.arp_pa;\n\t\tmemcpy(sin, ifi->ifi_addr, sizeof(struct sockaddr_in));\n\n\t\tif (ioctl(sockfd, SIOCGARP, &arpreq) < 0) {\n\t\t\terr_ret(\"ioctl SIOCGARP\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tptr = &arpreq.arp_ha.sa_data[0];\n\t\tprintf(\"%x:%x:%x:%x:%x:%x\\n\", *ptr, *(ptr+1),\n\t\t\t   *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "ioctl/test1.c",
    "content": "#include\t\"unp.h\"\n#include\t<net/if.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti, sockfd, numif;\n\tchar\tbuf[1024];\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tnumif = 999;\n\tIoctl(sockfd, SIOCGIFNUM, &numif);\n\tprintf(\"numif = %d\\n\", numif);\n\n\ti = ioctl(sockfd, SIOCGHIWAT, &buf);\n\tprintf(\"i = %d, errno = %d\\n\", i, errno);\n\texit(0);\n}\n"
  },
  {
    "path": "ipopts/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\ttcpcli01 tcpserv01\n\nall:\t${PROGS}\n\ntcpcli01:\ttcpcli01.o sourceroute.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli01.o sourceroute.o ${LIBS}\n\ntcpserv01:\ttcpserv01.o sourceroute.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv01.o sourceroute.o sigchldwaitpid.o \\\n\t\t\t\t${LIBS}\n\nudpcli01:\tudpcli01.o \n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o ${LIBS}\n\nudpserv01:\tudpserv01.o sourceroute6.o dgechoprintroute.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv01.o sourceroute6.o dgechoprintroute.o ${LIBS}\n\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "ipopts/dgechoprintroute.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tmesg[MAXLINE];\n\tint\t\t\t\ton;\n\tchar\t\t\tcontrol[MAXLINE];\n\tstruct msghdr\tmsg;\n\tstruct cmsghdr\t*cmsg;\n\tstruct iovec\tiov[1];\n\n\ton = 1;\n\tSetsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVRTHDR, &on, sizeof(on));\n\n\tbzero(&msg, sizeof(msg));\n\tiov[0].iov_base = mesg;\n\tmsg.msg_name = pcliaddr;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\tmsg.msg_control = control;\n\tfor ( ; ; ) {\n\t\tmsg.msg_namelen = clilen;\n\t\tmsg.msg_controllen = sizeof(control);\n\t\tiov[0].iov_len = MAXLINE;\n\t\tn = Recvmsg(sockfd, &msg, 0);\n\n\t\tfor (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;\n\t\t\t cmsg = CMSG_NXTHDR(&msg, cmsg)) {\n\t\t\tif (cmsg->cmsg_level == IPPROTO_IPV6 &&\n\t\t\t\tcmsg->cmsg_type == IPV6_RTHDR) {\n\t\t\t\tinet6_srcrt_print(CMSG_DATA(cmsg));\n\t\t\t\tInet6_rth_reverse(CMSG_DATA(cmsg), CMSG_DATA(cmsg));\n\t\t\t}\n\t\t}\n\n\t\tiov[0].iov_len = n;\n\t\tSendmsg(sockfd, &msg, 0);\n\t}\n}\n"
  },
  {
    "path": "ipopts/sigchldwaitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {\n\t\tprintf(\"child %d terminated\\n\", pid);\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "ipopts/sourceroute.c",
    "content": "/* include inet_srcrt_init */\n#include\t\"unp.h\"\n#include\t<netinet/in_systm.h>\n#include\t<netinet/ip.h>\n\nstatic u_char\t*optr;\t\t/* pointer into options being formed */\nstatic u_char\t*lenptr;\t/* pointer to length byte in SRR option */\nstatic int\t\tocnt;\t\t/* count of # addresses */\n\nu_char *\ninet_srcrt_init(int type)\n{\n\toptr = Malloc(44);\t\t/* NOP, code, len, ptr, up to 10 addresses */\n\tbzero(optr, 44);\t\t/* guarantees EOLs at end */\n\tocnt = 0;\n\t*optr++ = IPOPT_NOP;\t/* NOP for alignment */\n\t*optr++ = type ? IPOPT_SSRR : IPOPT_LSRR;\n\tlenptr = optr++;\t\t/* we fill in length later */\n\t*optr++ = 4;\t\t\t/* offset to first address */\n\n\treturn(optr - 4);\t\t/* pointer for setsockopt() */\n}\n/* end inet_srcrt_init */\n\n/* include inet_srcrt_add */\nint\ninet_srcrt_add(char *hostptr)\n{\n\tint\t\t\t\t\tlen;\n\tstruct addrinfo\t\t*ai;\n\tstruct sockaddr_in\t*sin;\n\n\tif (ocnt > 9)\n\t\terr_quit(\"too many source routes with: %s\", hostptr);\n\n\tai = Host_serv(hostptr, NULL, AF_INET, 0);\n\tsin = (struct sockaddr_in *) ai->ai_addr;\n\tmemcpy(optr, &sin->sin_addr, sizeof(struct in_addr));\n\tfreeaddrinfo(ai);\n\n\toptr += sizeof(struct in_addr);\n\tocnt++;\n\tlen = 3 + (ocnt * sizeof(struct in_addr));\n\t*lenptr = len;\n\treturn(len + 1);\t/* size for setsockopt() */\n}\n/* end inet_srcrt_add */\n\n/* include inet_srcrt_print */\nvoid\ninet_srcrt_print(u_char *ptr, int len)\n{\n\tu_char\t\t\tc;\n\tchar\t\t\tstr[INET_ADDRSTRLEN];\n\tstruct in_addr\thop1;\n\n\tmemcpy(&hop1, ptr, sizeof(struct in_addr));\n\tptr += sizeof(struct in_addr);\n\n\twhile ( (c = *ptr++) == IPOPT_NOP)\n\t\t;\t\t/* skip any leading NOPs */\n\n\tif (c == IPOPT_LSRR)\n\t\tprintf(\"received LSRR: \");\n\telse if (c == IPOPT_SSRR)\n\t\tprintf(\"received SSRR: \");\n\telse {\n\t\tprintf(\"received option type %d\\n\", c);\n\t\treturn;\n\t}\n\tprintf(\"%s \", Inet_ntop(AF_INET, &hop1, str, sizeof(str)));\n\n\tlen = *ptr++ - sizeof(struct in_addr);\t/* subtract dest IP addr */\n\tptr++;\t\t/* skip over pointer */\n\twhile (len > 0) {\n\t\tprintf(\"%s \", Inet_ntop(AF_INET, ptr, str, sizeof(str)));\n\t\tptr += sizeof(struct in_addr);\n\t\tlen -= sizeof(struct in_addr);\n\t}\n\tprintf(\"\\n\");\n}\n/* end inet_srcrt_print */\n"
  },
  {
    "path": "ipopts/sourceroute.lc",
    "content": "/* include inet_srcrt_init */\n#include    \"unp.h\"##  1 ##src/ipopts/sourceroute.c##\n#include    <netinet/in_systm.h>##  2 ##src/ipopts/sourceroute.c##\n#include    <netinet/ip.h>##  3 ##src/ipopts/sourceroute.c##\n\nstatic u_char *optr;            /* pointer into options being formed */##  4 ##src/ipopts/sourceroute.c##\nstatic u_char *lenptr;          /* pointer to length byte in SRR option */##  5 ##src/ipopts/sourceroute.c##\nstatic int ocnt;                /* count of # addresses */##  6 ##src/ipopts/sourceroute.c##\n\nu_char *##  7 ##src/ipopts/sourceroute.c##\ninet_srcrt_init(void)##  8 ##src/ipopts/sourceroute.c##\n{##  9 ##src/ipopts/sourceroute.c##\n    optr = Malloc(44);          /* NOP, code, len, ptr, up to 10 addresses */## 10 ##src/ipopts/sourceroute.c##\n    bzero(optr, 44);            /* guarantees EOLs at end */## 11 ##src/ipopts/sourceroute.c##\n    ocnt = 0;## 12 ##src/ipopts/sourceroute.c##\n    return (optr);              /* pointer for setsockopt() */## 13 ##src/ipopts/sourceroute.c##\n}## 14 ##src/ipopts/sourceroute.c##\n/* end inet_srcrt_init */\n\n/* include inet_srcrt_add */\nint## 15 ##src/ipopts/sourceroute.c##\ninet_srcrt_add(char *hostptr, int type)## 16 ##src/ipopts/sourceroute.c##\n{## 17 ##src/ipopts/sourceroute.c##\n    int     len;## 18 ##src/ipopts/sourceroute.c##\n    struct addrinfo *ai;## 19 ##src/ipopts/sourceroute.c##\n    struct sockaddr_in *sin;## 20 ##src/ipopts/sourceroute.c##\n\n    if (ocnt > 9)## 21 ##src/ipopts/sourceroute.c##\n        err_quit(\"too many source routes with: %s\", hostptr);## 22 ##src/ipopts/sourceroute.c##\n\n    if (ocnt == 0) {## 23 ##src/ipopts/sourceroute.c##\n        *optr++ = IPOPT_NOP;    /* NOP for alignment */## 24 ##src/ipopts/sourceroute.c##\n        *optr++ = type ? IPOPT_SSRR : IPOPT_LSRR;## 25 ##src/ipopts/sourceroute.c##\n        lenptr = optr++;        /* we fill in the length later */## 26 ##src/ipopts/sourceroute.c##\n        *optr++ = 4;            /* offset to first address */## 27 ##src/ipopts/sourceroute.c##\n    }## 28 ##src/ipopts/sourceroute.c##\n\n    ai = Host_serv(hostptr, \"\", AF_INET, 0);## 29 ##src/ipopts/sourceroute.c##\n    sin = (struct sockaddr_in *) ai->ai_addr;## 30 ##src/ipopts/sourceroute.c##\n    memcpy(optr, &sin->sin_addr, sizeof(struct in_addr));## 31 ##src/ipopts/sourceroute.c##\n    freeaddrinfo(ai);## 32 ##src/ipopts/sourceroute.c##\n\n    optr += sizeof(struct in_addr);## 33 ##src/ipopts/sourceroute.c##\n    ocnt++;## 34 ##src/ipopts/sourceroute.c##\n    len = 3 + (ocnt * sizeof(struct in_addr));## 35 ##src/ipopts/sourceroute.c##\n    *lenptr = len;## 36 ##src/ipopts/sourceroute.c##\n    return (len + 1);           /* size for setsockopt() */## 37 ##src/ipopts/sourceroute.c##\n}## 38 ##src/ipopts/sourceroute.c##\n/* end inet_srcrt_add */\n\n/* include inet_srcrt_print */\nvoid## 39 ##src/ipopts/sourceroute.c##\ninet_srcrt_print(u_char *ptr, int len)## 40 ##src/ipopts/sourceroute.c##\n{## 41 ##src/ipopts/sourceroute.c##\n    u_char  c;## 42 ##src/ipopts/sourceroute.c##\n    char    str[INET_ADDRSTRLEN];## 43 ##src/ipopts/sourceroute.c##\n    struct in_addr hop1;## 44 ##src/ipopts/sourceroute.c##\n\n    memcpy(&hop1, ptr, sizeof(struct in_addr));## 45 ##src/ipopts/sourceroute.c##\n    ptr += sizeof(struct in_addr);## 46 ##src/ipopts/sourceroute.c##\n\n    while ((c = *ptr++) == IPOPT_NOP) ; /* skip any leading NOPs */## 47 ##src/ipopts/sourceroute.c##\n\n    if (c == IPOPT_LSRR)## 48 ##src/ipopts/sourceroute.c##\n        printf(\"received LSRR: \");## 49 ##src/ipopts/sourceroute.c##\n    else if (c == IPOPT_SSRR)## 50 ##src/ipopts/sourceroute.c##\n        printf(\"received SSRR: \");## 51 ##src/ipopts/sourceroute.c##\n    else {## 52 ##src/ipopts/sourceroute.c##\n        printf(\"received option type %d\\n\", c);## 53 ##src/ipopts/sourceroute.c##\n        return;## 54 ##src/ipopts/sourceroute.c##\n    }## 55 ##src/ipopts/sourceroute.c##\n    printf(\"%s \", Inet_ntop(AF_INET, &hop1, str, sizeof(str)));## 56 ##src/ipopts/sourceroute.c##\n\n    len = *ptr++ - sizeof(struct in_addr);  /* subtract dest IP addr */## 57 ##src/ipopts/sourceroute.c##\n    ptr++;                      /* skip over pointer */## 58 ##src/ipopts/sourceroute.c##\n    while (len > 0) {## 59 ##src/ipopts/sourceroute.c##\n        printf(\"%s \", Inet_ntop(AF_INET, ptr, str, sizeof(str)));## 60 ##src/ipopts/sourceroute.c##\n        ptr += sizeof(struct in_addr);## 61 ##src/ipopts/sourceroute.c##\n        len -= sizeof(struct in_addr);## 62 ##src/ipopts/sourceroute.c##\n    }## 63 ##src/ipopts/sourceroute.c##\n    printf(\"\\n\");## 64 ##src/ipopts/sourceroute.c##\n}## 65 ##src/ipopts/sourceroute.c##\n/* end inet_srcrt_print */\n"
  },
  {
    "path": "ipopts/sourceroute6.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ninet6_srcrt_print(void *ptr)\n{\n\tint\t\t\ti, segments;\n\tchar\t\t\tstr[INET6_ADDRSTRLEN];\n\n\tsegments = Inet6_rth_segments(ptr);\n\tprintf(\"received source route: \");\n\tfor (i = 0; i < segments; i++)\n\t\tprintf(\"%s \", Inet_ntop(AF_INET6, Inet6_rth_getaddr(ptr, i),\n\t\t\t\t\t\t\t\tstr, sizeof(str)));\n\tprintf(\"\\n\");\n}\n"
  },
  {
    "path": "ipopts/tcpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tc, sockfd, len = 0;\n\tu_char\t\t\t\t*ptr = NULL;\n\tstruct addrinfo\t\t*ai;\n\n\tif (argc < 2)\n\t\terr_quit(\"usage: tcpcli01 [ -[gG] <hostname> ... ] <hostname>\");\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"gG\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 'g':\t\t\t/* loose source route */\n\t\t\tif (ptr)\n\t\t\t\terr_quit(\"can't use both -g and -G\");\n\t\t\tptr = inet_srcrt_init(0);\n\t\t\tbreak;\n\n\t\tcase 'G':\t\t\t/* strict source route */\n\t\t\tif (ptr)\n\t\t\t\terr_quit(\"can't use both -g and -G\");\n\t\t\tptr = inet_srcrt_init(1);\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\terr_quit(\"unrecognized option: %c\", c);\n\t\t}\n\t}\n\n\tif (ptr)\n\t\twhile (optind < argc-1)\n\t\t\tlen = inet_srcrt_add(argv[optind++]);\n\telse\n\t\tif (optind < argc-1)\n\t\t\terr_quit(\"need -g or -G to specify route\");\n\n\tif (optind != argc-1)\n\t\terr_quit(\"missing <hostname>\");\n\n\tai = Host_serv(argv[optind], SERV_PORT_STR, AF_INET, SOCK_STREAM);\n\n\tsockfd = Socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);\n\n\tif (ptr) {\n\t\tlen = inet_srcrt_add(argv[optind]);\t/* dest at end */\n\t\tSetsockopt(sockfd, IPPROTO_IP, IP_OPTIONS, ptr, len);\n\t\tfree(ptr);\n\t}\n\n\tConnect(sockfd, ai->ai_addr, ai->ai_addrlen);\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "ipopts/tcpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tu_char\t\t\t\t*opts;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen, len;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\topts = Malloc(44);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tlen = 44;\n\t\tGetsockopt(connfd, IPPROTO_IP, IP_OPTIONS, opts, &len);\n\t\tif (len > 0) {\n\t\t\tprintf(\"received IP options, len = %d\\n\", len);\n\t\t\tinet_srcrt_print(opts, len);\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "ipopts/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tc, sockfd, len = 0;\n\tu_char\t\t\t\t*ptr = NULL;\n\tvoid\t\t\t\t*rth;\n\tstruct addrinfo\t\t*ai;\n\n\tif (argc < 2)\n\t\terr_quit(\"usage: udpcli01 [ <hostname> ... ] <hostname>\");\n\n\tif (argc > 2) {\n\t\tint i;\n\n\t\tlen = Inet6_rth_space(IPV6_RTHDR_TYPE_0, argc-2);\n\t\tptr = Malloc(len);\n\t\tInet6_rth_init(ptr, len, IPV6_RTHDR_TYPE_0, argc-2);\n\t\tfor (i = 1; i < argc-1; i++) {\n\t\t\tai = Host_serv(argv[i], NULL, AF_INET6, 0);\n\t\t\tInet6_rth_add(ptr, &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr);\n\t\t}\n\t}\n\n\tai = Host_serv(argv[argc-1], SERV_PORT_STR, AF_INET6, SOCK_DGRAM);\n\n\tsockfd = Socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);\n\n\tif (ptr) {\n\t\tSetsockopt(sockfd, IPPROTO_IPV6, IPV6_RTHDR, ptr, len);\n\t\tfree(ptr);\n\t}\n\n\tdg_cli(stdin, sockfd, ai->ai_addr, ai->ai_addrlen);\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "ipopts/udpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in6\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET6, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin6_family     = AF_INET6;\n\tservaddr.sin6_addr       = in6addr_any;\n\tservaddr.sin6_port       = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "key/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tdump register add\nOBJS = printsadbmsg.o name.o\n\nall:\t${PROGS}\n\ndump:\tdump.o ${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ $@.o ${OBJS} ${LIBS}\n\nregister:\tregister.o ${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ $@.o ${OBJS} ${LIBS}\n\nadd:\tadd.o ${OBJS}\n\t${CC} ${CFLAGS} -o $@ $@.o ${OBJS} ${LIBS}\n"
  },
  {
    "path": "key/add.c",
    "content": "#include \"unp.h\"\n#include <net/pfkeyv2.h>\n\nint\nsalen(struct sockaddr *sa)\n{\n#ifdef HAVE_SOCKADDR_SA_LEN\n\treturn sa->sa_len;\n#else\n\tswitch (sa->sa_family) {\n\tcase AF_INET:\n\t\treturn sizeof(struct sockaddr_in);\n#ifdef IPV6\n\tcase AF_INET6:\n\t\treturn sizeof(struct sockaddr_in6);\n#endif\n\tdefault:\n\t\treturn 0;\t/* XXX */\n\t}\n#endif\n}\n\nint\nprefix_all(struct sockaddr *sa)\n{\n\tswitch (sa->sa_family) {\n\tcase AF_INET:\n\t\treturn 32;\n#ifdef IPV6\n\tcase AF_INET6:\n\t\treturn 128;\n#endif\n\tdefault:\n\t\treturn 0;\t/* XXX */\n\t}\n}\n\n/* include sadb_add */\nvoid\nsadb_add(struct sockaddr *src, struct sockaddr *dst, int type, int alg,\n\t\tint spi, int keybits, unsigned char *keydata)\n{\n\tint s;\n\tchar buf[4096], *p;\t/* XXX */\n\tstruct sadb_msg *msg;\n\tstruct sadb_sa *saext;\n\tstruct sadb_address *addrext;\n\tstruct sadb_key *keyext;\n\tint len;\n\tint mypid;\n\n\ts = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);\n\n\tmypid = getpid();\n\n\t/* Build and write SADB_ADD request */\n\tbzero(&buf, sizeof(buf));\n\tp = buf;\n\tmsg = (struct sadb_msg *)p;\n\tmsg->sadb_msg_version = PF_KEY_V2;\n\tmsg->sadb_msg_type = SADB_ADD;\n\tmsg->sadb_msg_satype = type;\n\tmsg->sadb_msg_pid = getpid();\n\tlen = sizeof(*msg);\n\tp += sizeof(*msg);\n\t \n\tsaext = (struct sadb_sa *)p;\n\tsaext->sadb_sa_len = sizeof(*saext) / 8;\n\tsaext->sadb_sa_exttype = SADB_EXT_SA;\n\tsaext->sadb_sa_spi = htonl(spi);\n\tsaext->sadb_sa_replay = 0;\t/* no replay protection with static keys */\n\tsaext->sadb_sa_state = SADB_SASTATE_MATURE;\n\tsaext->sadb_sa_auth = alg;\n\tsaext->sadb_sa_encrypt = SADB_EALG_NONE;\n\tsaext->sadb_sa_flags = 0;\n\tlen += saext->sadb_sa_len * 8;\n\tp += saext->sadb_sa_len * 8;\n\n\taddrext = (struct sadb_address *)p;\n\taddrext->sadb_address_len = (sizeof(*addrext) + salen(src) + 7) / 8;\n\taddrext->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;\n\taddrext->sadb_address_proto = 0;\t/* any protocol */\n\taddrext->sadb_address_prefixlen = prefix_all(src);\n\taddrext->sadb_address_reserved = 0;\n\tmemcpy(addrext + 1, src, salen(src));\n\tlen += addrext->sadb_address_len * 8;\n\tp += addrext->sadb_address_len * 8;\n\t \n\taddrext = (struct sadb_address *)p;\n\taddrext->sadb_address_len = (sizeof(*addrext) + salen(dst) + 7) / 8;\n\taddrext->sadb_address_exttype = SADB_EXT_ADDRESS_DST;\n\taddrext->sadb_address_proto = 0;\t/* any protocol */\n\taddrext->sadb_address_prefixlen = prefix_all(dst);\n\taddrext->sadb_address_reserved = 0;\n\tmemcpy(addrext + 1, dst, salen(dst));\n\tlen += addrext->sadb_address_len * 8;\n\tp += addrext->sadb_address_len * 8;\n\n\tkeyext = (struct sadb_key *)p;\n\t/* \"+7\" handles alignment requirements */\n\tkeyext->sadb_key_len = (sizeof(*keyext) + (keybits / 8) + 7) / 8;\n\tkeyext->sadb_key_exttype = SADB_EXT_KEY_AUTH;\n\tkeyext->sadb_key_bits = keybits;\n\tkeyext->sadb_key_reserved = 0;\n\tmemcpy(keyext + 1, keydata, keybits / 8);\n\tlen += keyext->sadb_key_len * 8;\n\tp += keyext->sadb_key_len * 8;\n\t \n\tmsg->sadb_msg_len = len / 8;\n\tprintf(\"Sending add message:\\n\");\n\tprint_sadb_msg(buf, len);\n\tWrite(s, buf, len);\n\n\tprintf(\"\\nReply returned:\\n\");\n\t/* Read and print SADB_ADD reply, discarding any others */\n\tfor (;;) {\n\t\tint msglen;\n\t\tstruct sadb_msg *msgp;\n\n\t\tmsglen = Read(s, &buf, sizeof(buf));\n\t\tmsgp = (struct sadb_msg *)&buf;\n\t\tif (msgp->sadb_msg_pid == mypid &&\n\t\t\tmsgp->sadb_msg_type == SADB_ADD) {\n\t\t\tprint_sadb_msg(msgp, msglen);\n\t\t\tbreak;\n\t\t}\n\t}\n\tclose(s);\n}\n/* end sadb_add */\n\nint\nmain(int argc, char **argv)\n{\n\tstruct addrinfo hints, *src, *dst;\n\tunsigned char *p, *keydata, *kp;\n\tchar *ep;\n\tint ret, len, i;\n\tint satype, alg, keybits;\n\n\tbzero(&hints, sizeof(hints));\n\tif ((ret = getaddrinfo(argv[1], NULL, &hints, &src)) != 0) {\n\t\terr_quit(\"%s: %s\\n\", argv[1], gai_strerror(ret));\n\t}\n\tif ((ret = getaddrinfo(argv[2], NULL, &hints, &dst)) != 0) {\n\t\terr_quit(\"%s: %s\\n\", argv[2], gai_strerror(ret));\n\t}\n\tif (src->ai_family != dst->ai_family) {\n\t\terr_quit(\"%s and %s not same addr family\\n\", argv[1], argv[2]);\n\t}\n\tsatype = SADB_SATYPE_AH;\n\tif ((alg = getsaalgbyname(satype, argv[3])) < 0) {\n\t\terr_quit(\"Unknown SA type / algorithm pair ah/%s\\n\", argv[3]);\n\t}\n\tkeybits = strtoul(argv[4], &ep, 0);\n\tif (ep == argv[4] || *ep != '\\0' || (keybits % 8) != 0) {\n\t\terr_quit(\"Invalid number of bits %s\\n\", argv[4]);\n\t}\n\tp = argv[5];\n\tif (p[0] == '0' && (p[1] == 'x' || p[1] == 'X'))\n\t\tp += 2;\n\tlen = strlen(p);\n\tkp = keydata = malloc(keybits / 8);\n\tfor (i = 0; i < keybits; i += 8) {\n\t\tint c;\n\n\t\tif (len < 2) {\n\t\t\terr_quit(\"%s: not enough bytes (expected %d)\\n\", argv[5], keybits / 8);\n\t\t}\n\t\tif (sscanf(p, \"%2x\", &c) != 1) {\n\t\t\terr_quit(\"%s contains invalid hex digit\\n\", argv[5]);\n\t\t}\n\t\t*kp++ = c;\n\t\tp += 2;\n\t\tlen -= 2;\n\t}\n\tif (len > 0) {\n\t\terr_quit(\"%s: too many bytes (expected %d)\\n\", argv[5], keybits / 8);\n\t}\n\tsadb_add(src->ai_addr, dst->ai_addr, satype, alg, 0x9876, keybits, keydata);\n}\n"
  },
  {
    "path": "key/dump.c",
    "content": "#include \"unp.h\"\n#include <net/pfkeyv2.h>\n\n/* include sadb_dump */\nvoid\nsadb_dump(int type)\n{\n\tint s;\n\tchar buf[4096];\n\tstruct sadb_msg msg;\n\tint goteof;\n\n\ts = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);\n\n\t/* Build and write SADB_DUMP request */\n\tbzero(&msg, sizeof(msg));\n\tmsg.sadb_msg_version = PF_KEY_V2;\n\tmsg.sadb_msg_type = SADB_DUMP;\n\tmsg.sadb_msg_satype = type;\n\tmsg.sadb_msg_len = sizeof(msg) / 8;\n\tmsg.sadb_msg_pid = getpid();\n\tprintf(\"Sending dump message:\\n\");\n\tprint_sadb_msg(&msg, sizeof(msg));\n\tWrite(s, &msg, sizeof(msg));\n\n\tprintf(\"\\nMessages returned:\\n\");\n\t/* Read and print SADB_DUMP replies until done */\n\tgoteof = 0;\n\twhile (goteof == 0) {\n\t\tint msglen;\n\t\tstruct sadb_msg *msgp;\n\n\t\tmsglen = Read(s, &buf, sizeof(buf));\n\t\tmsgp = (struct sadb_msg *)&buf;\n\t\tprint_sadb_msg(msgp, msglen);\n\t\tif (msgp->sadb_msg_seq == 0)\n\t\t\tgoteof = 1;\n\t}\n\tclose(s);\n}\n\nint\nmain(int argc, char **argv)\n{\n\tint satype = SADB_SATYPE_UNSPEC;\n\tint c;\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"t:\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 't':\n\t\t\tif ((satype = getsatypebyname(optarg)) == -1)\n\t\t\t\terr_quit(\"invalid -t option %s\", optarg);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\terr_quit(\"unrecognized option: %c\", c);\n\t\t}\n\t}\n\n\tsadb_dump(satype);\n}\n/* end sadb_dump */\n"
  },
  {
    "path": "key/name.c",
    "content": "#include \"unp.h\"\n#include <net/pfkeyv2.h>\n\nstruct idlist {\n\tint val;\n\tconst char *name;\n};\n\nstatic struct idlist satype[] = {\n\t{ SADB_SATYPE_UNSPEC,\t\"unspec\" },\n\t{ SADB_SATYPE_AH,\t\t\"ah\" },\n\t{ SADB_SATYPE_ESP,\t\t\"esp\" },\n\t{ SADB_SATYPE_RSVP,\t\t\"rsvp\" },\n\t{ SADB_SATYPE_OSPFV2,\t\"ospfv2\" },\n\t{ SADB_SATYPE_RIPV2,\t\"ripv2\" },\n\t{ SADB_SATYPE_MIP,\t\t\"mip\" },\n\t{ 0,\t\t\t\t\tNULL } };\n\nstatic struct idlist ahalg[] = {\n\t{ SADB_AALG_NONE,\t\t\"none\" },\n\t{ SADB_AALG_MD5HMAC,\t\"HMAC-MD5-96\" },\n\t{ SADB_AALG_SHA1HMAC,\t\"HMAC-SHA-1-96\" },\n\t{ 0,\t\t\t\t\tNULL } };\n\nstatic struct idlist espalg[] = {\n\t{ SADB_EALG_NONE,\t\t\"none\" },\n\t{ SADB_EALG_DESCBC,\t\t\"DES-CBC\" },\n\t{ SADB_EALG_3DESCBC,\t\"3DES-CBC\" },\n\t{ SADB_EALG_NULL,\t\t\"NULL\" },\n\t{ 0,\t\t\t\t\tNULL } };\n\nint\nidlistlookup(char *name, struct idlist *il)\n{\n\tfor (; il->name != NULL; il++) {\n\t\tif (strcmp(name, il->name) == 0)\n\t\t\treturn il->val;\n\t}\n\treturn -1;\n}\n\nint\ngetsatypebyname(char *name)\n{\n\treturn idlistlookup(name, satype);\n}\n\nint\ngetsaalgbyname(int type, char *name)\n{\n\tswitch (type) {\n\tcase SADB_SATYPE_AH:\n\t\treturn idlistlookup(name, ahalg);\n\tcase SADB_SATYPE_ESP:\n\t\treturn idlistlookup(name, espalg);\n\tdefault:\n\t\treturn -1;\n\t}\n}\n"
  },
  {
    "path": "key/printsadbmsg.c",
    "content": "#include \"unp.h\"\n#include <net/pfkeyv2.h>\n\nconst char *\nget_sadb_msg_type(int type)\n{\n\tstatic char buf[100];\n\tswitch (type) {\n\tcase SADB_RESERVED:\treturn \"Reserved\";\n\tcase SADB_GETSPI:\treturn \"Get SPI\";\n\tcase SADB_UPDATE:\treturn \"Update\";\n\tcase SADB_ADD:\t\treturn \"Add\";\n\tcase SADB_DELETE:\treturn \"Delete\";\n\tcase SADB_GET:\t\treturn \"Get\";\n\tcase SADB_ACQUIRE:\treturn \"Acquire\";\n\tcase SADB_REGISTER:\treturn \"Register\";\n\tcase SADB_EXPIRE:\treturn \"Expire\";\n\tcase SADB_FLUSH:\treturn \"Flush\";\n\tcase SADB_DUMP:\t\treturn \"Dump\";\n\tdefault:\t\t\tsprintf(buf, \"[Unknown type %d]\", type);\n\t\t\t\t\t\treturn buf;\n\t}\n}\n\nconst char *\nget_sadb_satype(int type)\n{\n\tstatic char buf[100];\n\tswitch (type) {\n\tcase SADB_SATYPE_UNSPEC:\treturn \"Unspecified\";\n\tcase SADB_SATYPE_AH:\t\treturn \"IPsec AH\";\n\tcase SADB_SATYPE_ESP:\t\treturn \"IPsec ESP\";\n\tcase SADB_SATYPE_RSVP:\t\treturn \"RSVP\";\n\tcase SADB_SATYPE_OSPFV2:\treturn \"OSPFv2\";\n\tcase SADB_SATYPE_RIPV2:\t\treturn \"RIPv2\";\n\tcase SADB_SATYPE_MIP:\t\treturn \"Mobile IP\";\n\tdefault:\t\t\t\t\tsprintf(buf, \"[Unknown satype %d]\", type);\n\t\t\t\t\t\t\t\treturn buf;\n\t}\n}\n\nconst char *\nget_auth_alg(int alg)\n{\n\tstatic char buf[100];\n\tswitch (alg) {\n\tcase SADB_AALG_NONE:\t\treturn \"None\";\n\tcase SADB_AALG_MD5HMAC:\t\treturn \"HMAC-MD5\";\n\tcase SADB_AALG_SHA1HMAC:\treturn \"HMAC-SHA-1\";\n#ifdef SADB_X_AALG_MD5\n\tcase SADB_X_AALG_MD5:\t\treturn \"Keyed MD5\";\n#endif\n#ifdef SADB_X_AALG_SHA\n\tcase SADB_X_AALG_SHA:\t\treturn \"Keyed SHA-1\";\n#endif\n#ifdef SADB_X_AALG_NULL\n\tcase SADB_X_AALG_NULL:\t\treturn \"Null\";\n#endif\n#ifdef SADB_X_AALG_SHA2_256\n\tcase SADB_X_AALG_SHA2_256:\treturn \"SHA2-256\";\n#endif\n#ifdef SADB_X_AALG_SHA2_384\n\tcase SADB_X_AALG_SHA2_384:\treturn \"SHA2-384\";\n#endif\n#ifdef SADB_X_AALG_SHA2_512\n\tcase SADB_X_AALG_SHA2_512:\treturn \"SHA2-512\";\n#endif\n\tdefault:\t\t\t\t\tsprintf(buf, \"[Unknown authentication algorithm %d]\", alg);\n\t\t\t\t\t\t\t\treturn buf;\n\t}\n}\n\nconst char *\nget_encrypt_alg(int alg)\n{\n\tstatic char buf[100];\n\tswitch (alg) {\n\tcase SADB_EALG_NONE:\t\treturn \"None\";\n\tcase SADB_EALG_DESCBC:\t\treturn \"DES-CBC\";\n\tcase SADB_EALG_3DESCBC:\t\treturn \"3DES-CBC\";\n\tcase SADB_EALG_NULL:\t\treturn \"Null\";\n#ifdef SADB_X_EALG_CAST128CBC\n\tcase SADB_X_EALG_CAST128CBC:\treturn \"CAST128-CBC\";\n#endif\n#ifdef SADB_X_EALG_BLOWFISHCBC\n\tcase SADB_X_EALG_BLOWFISHCBC:\treturn \"Blowfish-CBC\";\n#endif\n#ifdef SADB_X_EALG_AES\n\tcase SADB_X_EALG_AES:\t\t\treturn \"AES\";\n#endif\n\tdefault:\t\t\t\t\tsprintf(buf, \"[Unknown encryption algorithm %d]\", alg);\n\t\t\t\t\t\t\t\treturn buf;\n\t}\n}\n\nconst char *\nget_sa_state(int state)\n{\n\tstatic char buf[100];\n\tswitch (state) {\n\tcase SADB_SASTATE_LARVAL:\treturn \"Larval\";\n\tcase SADB_SASTATE_MATURE:\treturn \"Mature\";\n\tcase SADB_SASTATE_DYING:\treturn \"Dying\";\n\tcase SADB_SASTATE_DEAD:\t\treturn \"Dead\";\n\tdefault:\t\t\t\t\tsprintf(buf, \"[Unknown SA state %d]\", state);\n\t\t\t\t\t\t\t\treturn buf;\n\t}\n}\n\nconst char *\nget_sadb_alg_type(int alg, int authenc)\n{\n\tif (authenc == SADB_EXT_SUPPORTED_AUTH) {\n\t\treturn get_auth_alg(alg);\n\t} else {\n\t\treturn get_encrypt_alg(alg);\n\t}\n}\n\nvoid\nsa_print(struct sadb_ext *ext)\n{\n\tstruct sadb_sa *sa = (struct sadb_sa *)ext;\n\tprintf(\" SA: SPI=%d Replay Window=%d State=%s\\n\",\n\t\tsa->sadb_sa_spi, sa->sadb_sa_replay,\n\t\tget_sa_state(sa->sadb_sa_state));\n\tprintf(\"  Authentication Algorithm: %s\\n\",\n\t\tget_auth_alg(sa->sadb_sa_auth));\n\tprintf(\"  Encryption Algorithm: %s\\n\",\n\t\tget_encrypt_alg(sa->sadb_sa_encrypt));\n\tif (sa->sadb_sa_flags & SADB_SAFLAGS_PFS)\n\t\tprintf(\"  Perfect Forward Secrecy\\n\");\n}\n\nvoid\nsupported_print(struct sadb_ext *ext)\n{\n\tstruct sadb_supported *sup = (struct sadb_supported *)ext;\n\tstruct sadb_alg *alg;\n\tint len;\n\n\tprintf(\" Supported %s algorithms:\\n\",\n\t\tsup->sadb_supported_exttype == SADB_EXT_SUPPORTED_AUTH ?\n\t\t\"authentication\" :\n\t\t\"encryption\");\n\tlen = sup->sadb_supported_len * 8;\n\tlen -= sizeof(*sup);\n\tif (len == 0) {\n\t\tprintf(\"  None\\n\");\n\t\treturn;\n\t}\n\tfor (alg = (struct sadb_alg *)(sup + 1); len>0; len -= sizeof(*alg), alg++) {\n\t\tprintf(\"  %s ivlen %d bits %d-%d\\n\",\n\t\t\tget_sadb_alg_type(alg->sadb_alg_id, sup->sadb_supported_exttype),\n\t\t\talg->sadb_alg_ivlen, alg->sadb_alg_minbits, alg->sadb_alg_maxbits);\n\t}\n}\n\nvoid\nlifetime_print(struct sadb_ext *ext)\n{\n\tstruct sadb_lifetime *life = (struct sadb_lifetime *)ext;\n\n\tprintf(\" %s lifetime:\\n\",\n\t\tlife->sadb_lifetime_exttype == SADB_EXT_LIFETIME_CURRENT ?\n\t\t\"Current\" :\n\t\tlife->sadb_lifetime_exttype == SADB_EXT_LIFETIME_HARD ?\n\t\t\"Hard\" :\n\t\t\"Soft\");\n\tprintf(\"  %d allocations, %d bytes\", life->sadb_lifetime_allocations,\n\t\tlife->sadb_lifetime_bytes);\n\tif (life->sadb_lifetime_exttype == SADB_EXT_LIFETIME_CURRENT) {\n\t\ttime_t t;\n\t\tstruct tmp *tm;\n\t\tchar buf[100];\n\n\t\t/* absolute times */\n\t\tt = life->sadb_lifetime_addtime;\n\t\ttm = localtime(&t);\n\t\tstrftime(buf, sizeof(buf), \"%c\", tm);\n\t\tprintf(\"\\n  added at %s, \", buf);\n\t\tif (life->sadb_lifetime_usetime == 0) {\n\t\t\tprintf(\"never used\\n\");\n\t\t} else {\n\t\t\tt = life->sadb_lifetime_usetime;\n\t\t\ttm = localtime(&t);\n\t\t\tstrftime(buf, sizeof(buf), \"%c\", tm);\n\t\t\tprintf(\"first used at %s\\n\", buf);\n\t\t}\n\t} else {\n\t\tprintf(\"%d addtime, %d usetime\\n\", life->sadb_lifetime_addtime,\n\t\t\tlife->sadb_lifetime_usetime);\n\t}\n}\n\nvoid\naddress_print(struct sadb_ext *ext)\n{\n\tstruct sadb_address *addr = (struct sadb_address *)ext;\n\tstruct sockaddr *sa;\n\n\tprintf(\" %s address: \",\n\t\taddr->sadb_address_exttype == SADB_EXT_ADDRESS_SRC ?\n\t\t\"Source\" :\n\t\taddr->sadb_address_exttype == SADB_EXT_ADDRESS_DST ?\n\t\t\"Dest\" :\n\t\t\"Proxy\");\n\tsa = (struct sockaddr *)(addr + 1);\n\tprintf(\"  %s\", sock_ntop(sa, addr->sadb_address_len * 8 - sizeof(*addr)));\n\tif (addr->sadb_address_prefixlen == 0)\n\t\tprintf(\" \");\n\telse\n\t\tprintf(\"/%d \", addr->sadb_address_prefixlen);\n\tswitch (addr->sadb_address_proto) {\n\t\tcase IPPROTO_UDP:\tprintf(\"(UDP)\"); break;\n\t\tcase IPPROTO_TCP:\tprintf(\"(TCP)\"); break;\n\t\tcase 0:\t\t\t\tbreak;\n\t\tdefault:\t\t\tprintf(\"(IP proto %d)\", addr->sadb_address_proto);\n\t\t\t\t\t\t\tbreak;\n\t}\n\tprintf(\"\\n\");\n}\n\nvoid\nkey_print(struct sadb_ext *ext)\n{\n\tstruct sadb_key *key = (struct sadb_key *)ext;\n\tint bits;\n\tunsigned char *p;\n\n\tprintf(\" %s key, %d bits: 0x\",\n\t\tkey->sadb_key_exttype == SADB_EXT_KEY_AUTH ?\n\t\t\"Authentication\" : \"Encryption\",\n\t\tkey->sadb_key_bits);\n\tfor (p = (unsigned char *)(key + 1), bits = key->sadb_key_bits;\n\t\t\tbits > 0; p++, bits -= 8)\n\t\tprintf(\"%02x\", *p);\n\tprintf(\"\\n\");\n}\n\nvoid\nprint_sadb_msg(struct sadb_msg *msg, int msglen)\n{\n\tstruct sadb_ext *ext;\n\n\tif (msglen != msg->sadb_msg_len * 8) {\n\t\terr_msg(\"SADB Message length (%d) doesn't match msglen (%d)\\n\",\n\t\t\tmsg->sadb_msg_len * 8, msglen);\n\t\treturn;\n\t}\n\tif (msg->sadb_msg_version != PF_KEY_V2) {\n\t\terr_msg(\"SADB Message version not PF_KEY_V2\\n\");\n\t\treturn;\n\t}\n\tprintf(\"SADB Message %s, errno %d, satype %s, seq %d, pid %d\\n\",\n\t\tget_sadb_msg_type(msg->sadb_msg_type), msg->sadb_msg_errno,\n\t\tget_sadb_satype(msg->sadb_msg_satype), msg->sadb_msg_seq,\n\t\tmsg->sadb_msg_pid);\n\tif (msg->sadb_msg_errno != 0)\n\t\tprintf(\" errno %s\\n\", strerror(msg->sadb_msg_errno));\n\tif (msglen == sizeof(struct sadb_msg))\n\t\treturn;\t/* no extensions */\n\tmsglen -= sizeof(struct sadb_msg);\n\text = (struct sadb_ext *)(msg + 1);\n\twhile (msglen > 0) {\n\t\tswitch (ext->sadb_ext_type) {\n\t\tcase SADB_EXT_RESERVED:\tprintf(\" Reserved Extension\\n\"); break;\n\t\tcase SADB_EXT_SA:\tsa_print(ext); break;\n\t\tcase SADB_EXT_LIFETIME_CURRENT:\n\t\tcase SADB_EXT_LIFETIME_HARD:\n\t\tcase SADB_EXT_LIFETIME_SOFT:\n\t\t\t\t\tlifetime_print(ext); break;\n\t\tcase SADB_EXT_ADDRESS_SRC:\n\t\tcase SADB_EXT_ADDRESS_DST:\n\t\tcase SADB_EXT_ADDRESS_PROXY:\n\t\t\t\t\taddress_print(ext); break;\n\t\tcase SADB_EXT_KEY_AUTH:\n\t\tcase SADB_EXT_KEY_ENCRYPT:\n\t\t\t\t\tkey_print(ext); break;\n\t\tcase SADB_EXT_IDENTITY_SRC:\n\t\tcase SADB_EXT_IDENTITY_DST:\n\t\t\t\t\tprintf(\" [identity...]\\n\"); break;\n\t\tcase SADB_EXT_SENSITIVITY:\n\t\t\t\t\tprintf(\" [sensitivity...]\\n\"); break;\n\t\tcase SADB_EXT_PROPOSAL:\n\t\t\t\t\tprintf(\" [proposal...]\\n\"); break;\n\t\tcase SADB_EXT_SUPPORTED_AUTH:\n\t\tcase SADB_EXT_SUPPORTED_ENCRYPT:\n\t\t\t\t\tsupported_print(ext); break;\n\t\tcase SADB_EXT_SPIRANGE:\n\t\t\t\t\tprintf(\" [spirange...]\\n\"); break;\n\t\tdefault:\tprintf(\" [unknown extension %d]\\n\", ext->sadb_ext_type);\n\t\t}\n\t\tmsglen -= ext->sadb_ext_len << 3;\n\t\text = (char *)ext + (ext->sadb_ext_len << 3);\n\t}\n}\n"
  },
  {
    "path": "key/register.c",
    "content": "#include \"unp.h\"\n#include <net/pfkeyv2.h>\n\n/* include sadb_register */\nvoid\nsadb_register(int type)\n{\n\tint s;\n\tchar buf[4096];\t/* XXX */\n\tstruct sadb_msg msg;\n\tint goteof;\n\tint mypid;\n\n\ts = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);\n\n\tmypid = getpid();\n\n\t/* Build and write SADB_REGISTER request */\n\tbzero(&msg, sizeof(msg));\n\tmsg.sadb_msg_version = PF_KEY_V2;\n\tmsg.sadb_msg_type = SADB_REGISTER;\n\tmsg.sadb_msg_satype = type;\n\tmsg.sadb_msg_len = sizeof(msg) / 8;\n\tmsg.sadb_msg_pid = mypid;\n\tprintf(\"Sending register message:\\n\");\n\tprint_sadb_msg(&msg, sizeof(msg));\n\tWrite(s, &msg, sizeof(msg));\n\n\tprintf(\"\\nReply returned:\\n\");\n\t/* Read and print SADB_REGISTER reply, discarding any others */\n\tfor (;;) {\n\t\tint msglen;\n\t\tstruct sadb_msg *msgp;\n\n\t\tmsglen = Read(s, &buf, sizeof(buf));\n\t\tmsgp = (struct sadb_msg *)&buf;\n\t\tif (msgp->sadb_msg_pid == mypid &&\n\t\t\tmsgp->sadb_msg_type == SADB_REGISTER) {\n\t\t\tprint_sadb_msg(msgp, msglen);\n\t\t\tbreak;\n\t\t}\n\t}\n\tclose(s);\n}\n/* end sadb_register */\n\nint\nmain(int argc, char **argv)\n{\n\tint satype = SADB_SATYPE_UNSPEC;\n\tint c;\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"t:\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 't':\n\t\t\tif ((satype = getsatypebyname(optarg)) == -1)\n\t\t\t\terr_quit(\"invalid -t option %s\", optarg);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\terr_quit(\"unrecognized option: %c\", c);\n\t\t}\n\t}\n\n\tif (satype == SADB_SATYPE_UNSPEC) {\n\t\terr_quit(\"must specify SA type\");\n\t}\n\n\tsadb_register(satype);\n}\n"
  },
  {
    "path": "key/unp.h",
    "content": "/* include unph */\n/* Our own header.  Tabs are set for 4 spaces, not 8 */\n\n#ifndef\t__unp_h\n#define\t__unp_h\n\n#include\t\"../config.h\"\t/* configuration options for current OS */\n\t\t\t\t\t\t\t/* \"../config.h\" is generated by configure */\n\n/* If anything changes in the following list of #includes, must change\n   acsite.m4 also, for configure's tests. */\n\n#include\t<sys/types.h>\t/* basic system data types */\n#include\t<sys/socket.h>\t/* basic socket definitions */\n#include\t<sys/time.h>\t/* timeval{} for select() */\n#include\t<time.h>\t\t/* timespec{} for pselect() */\n#include\t<netinet/in.h>\t/* sockaddr_in{} and other Internet defns */\n#include\t<arpa/inet.h>\t/* inet(3) functions */\n#include\t<errno.h>\n#include\t<fcntl.h>\t\t/* for nonblocking */\n#include\t<netdb.h>\n#include\t<signal.h>\n#include\t<stdio.h>\n#include\t<stdlib.h>\n#include\t<string.h>\n#include\t<sys/stat.h>\t/* for S_xxx file mode constants */\n#include\t<sys/uio.h>\t\t/* for iovec{} and readv/writev */\n#include\t<unistd.h>\n#include\t<sys/wait.h>\n#include\t<sys/un.h>\t\t/* for Unix domain sockets */\n\n#ifdef\tHAVE_SYS_SELECT_H\n# include\t<sys/select.h>\t/* for convenience */\n#endif\n\n#ifdef\tHAVE_SYS_SYSCTL_H\n# include\t<sys/sysctl.h>\n#endif\n\n#ifdef\tHAVE_POLL_H\n# include\t<poll.h>\t\t/* for convenience */\n#endif\n\n#ifdef\tHAVE_STRINGS_H\n# include\t<strings.h>\t\t/* for convenience */\n#endif\n\n/* Three headers are normally needed for socket/file ioctl's:\n * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.\n */\n#ifdef\tHAVE_SYS_IOCTL_H\n# include\t<sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include\t<sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include\t<sys/sockio.h>\n#endif\n\n#ifdef\tHAVE_PTHREAD_H\n# include\t<pthread.h>\n#endif\n\n#ifdef HAVE_NET_IF_DL_H\n# include\t<net/if_dl.h>\n#endif\n\n/* OSF/1 actually disables recv() and send() in <sys/socket.h> */\n#ifdef\t__osf__\n#undef\trecv\n#undef\tsend\n#define\trecv(a,b,c,d)\trecvfrom(a,b,c,d,0,0)\n#define\tsend(a,b,c,d)\tsendto(a,b,c,d,0,0)\n#endif\n\n#ifndef\tINADDR_NONE\n/* $$.Ic INADDR_NONE$$ */\n#define\tINADDR_NONE\t0xffffffff\t/* should have been in <netinet/in.h> */\n#endif\n\n#ifndef\tSHUT_RD\t\t\t\t/* these three Posix.1g names are quite new */\n#define\tSHUT_RD\t\t0\t/* shutdown for reading */\n#define\tSHUT_WR\t\t1\t/* shutdown for writing */\n#define\tSHUT_RDWR\t2\t/* shutdown for reading and writing */\n/* $$.Ic SHUT_RD$$ */\n/* $$.Ic SHUT_WR$$ */\n/* $$.Ic SHUT_RDWR$$ */\n#endif\n\n/* *INDENT-OFF* */\n#ifndef INET_ADDRSTRLEN\n/* $$.Ic INET_ADDRSTRLEN$$ */\n#define\tINET_ADDRSTRLEN\t\t16\t/* \"ddd.ddd.ddd.ddd\\0\"\n\t\t\t\t\t\t\t\t    1234567890123456 */\n#endif\n\n/* Define following even if IPv6 not supported, so we can always allocate\n   an adequately-sized buffer, without #ifdefs in the code. */\n#ifndef INET6_ADDRSTRLEN\n/* $$.Ic INET6_ADDRSTRLEN$$ */\n#define\tINET6_ADDRSTRLEN\t46\t/* max size of IPv6 address string:\n\t\t\t\t   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx\" or\n\t\t\t\t   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\\0\"\n\t\t\t\t    1234567890123456789012345678901234567890123456 */\n#endif\n/* *INDENT-ON* */\n\n/* Define bzero() as a macro if it's not in standard C library. */\n#ifndef\tHAVE_BZERO\n#define\tbzero(ptr,n)\t\tmemset(ptr, 0, n)\n/* $$.If bzero$$ */\n/* $$.If memset$$ */\n#endif\n\n/* Older resolvers do not have gethostbyname2() */\n#ifndef\tHAVE_GETHOSTBYNAME2\n#define\tgethostbyname2(host,family)\t\tgethostbyname((host))\n#endif\n\n/* The structure returned by recvfrom_flags() */\nstruct in_pktinfo {\n  struct in_addr\tipi_addr;\t/* dst IPv4 address */\n  int\t\t\t\tipi_ifindex;/* received interface index */\n};\n/* $$.It in_pktinfo$$ */\n/* $$.Ib ipi_addr$$ */\n/* $$.Ib ipi_ifindex$$ */\n\n/* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few\n   implementations support them today.  These two macros really need\n    an ALIGN() macro, but each implementation does this differently. */\n#ifndef\tCMSG_LEN\n/* $$.Ic CMSG_LEN$$ */\n#define\tCMSG_LEN(size)\t\t(sizeof(struct cmsghdr) + (size))\n#endif\n#ifndef\tCMSG_SPACE\n/* $$.Ic CMSG_SPACE$$ */\n#define\tCMSG_SPACE(size)\t(sizeof(struct cmsghdr) + (size))\n#endif\n\n/* Posix.1g requires the SUN_LEN() macro but not all implementations DefinE\n   it (yet).  Note that this 4.4BSD macro works regardless whether there is\n   a length field or not. */\n#ifndef\tSUN_LEN\n/* $$.Im SUN_LEN$$ */\n# define\tSUN_LEN(su) \\\n\t(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))\n#endif\n\n/* Posix.1g renames \"Unix domain\" as \"local IPC\".\n   But not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */\n#ifndef\tAF_LOCAL\n#define AF_LOCAL\tAF_UNIX\n#endif\n#ifndef\tPF_LOCAL\n#define PF_LOCAL\tPF_UNIX\n#endif\n\n/* Posix.1g requires that an #include of <poll.h> DefinE INFTIM, but many\n   systems still DefinE it in <sys/stropts.h>.  We don't want to include\n   all the streams stuff if it's not needed, so we just DefinE INFTIM here.\n   This is the standard value, but there's no guarantee it is -1. */\n#ifndef INFTIM\n#define INFTIM          (-1)    /* infinite poll timeout */\n/* $$.Ic INFTIM$$ */\n#ifdef\tHAVE_POLL_H\n#define\tINFTIM_UNPH\t\t\t\t/* tell unpxti.h we defined it */\n#endif\n#endif\n\n/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many\n   kernels still #define it as 5, while actually supporting many more */\n#define\tLISTENQ\t\t1024\t/* 2nd argument to listen() */\n\n/* Miscellaneous constants */\n#define\tMAXLINE\t\t4096\t/* max text line length */\n#define\tMAXSOCKADDR  128\t/* max socket address structure size */\n#define\tBUFFSIZE\t8192\t/* buffer size for reads and writes */\n\n/* Define some port number that can be used for client-servers */\n#define\tSERV_PORT\t\t 9877\t\t\t/* TCP and UDP client-servers */\n#define\tSERV_PORT_STR\t\"9877\"\t\t\t/* TCP and UDP client-servers */\n#define\tUNIXSTR_PATH\t\"/tmp/unix.str\"\t/* Unix domain stream cli-serv */\n#define\tUNIXDG_PATH\t\t\"/tmp/unix.dg\"\t/* Unix domain datagram cli-serv */\n/* $$.ix [LISTENQ]~constant,~definition~of$$ */\n/* $$.ix [MAXLINE]~constant,~definition~of$$ */\n/* $$.ix [MAXSOCKADDR]~constant,~definition~of$$ */\n/* $$.ix [BUFFSIZE]~constant,~definition~of$$ */\n/* $$.ix [SERV_PORT]~constant,~definition~of$$ */\n/* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */\n/* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */\n\n/* Following shortens all the type casts of pointer arguments */\n#define\tSA\tstruct sockaddr\n\n#define\tFILE_MODE\t(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)\n\t\t\t\t\t/* default file access permissions for new files */\n#define\tDIR_MODE\t(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)\n\t\t\t\t\t/* default permissions for new directories */\n\ntypedef\tvoid\tSigfunc(int);\t/* for signal handlers */\n\n#define\tmin(a,b)\t((a) < (b) ? (a) : (b))\n#define\tmax(a,b)\t((a) > (b) ? (a) : (b))\n\n#ifndef\tHAVE_ADDRINFO_STRUCT\n# include\t\"../lib/addrinfo.h\"\n#endif\n\n#ifndef\tHAVE_IF_NAMEINDEX_STRUCT\nstruct if_nameindex {\n  unsigned int   if_index;  /* 1, 2, ... */\n  char          *if_name;   /* null terminated name: \"le0\", ... */\n};\n/* $$.It if_nameindex$$ */\n/* $$.Ib if_index$$ */\n/* $$.Ib if_name$$ */\n#endif\n\n#ifndef\tHAVE_TIMESPEC_STRUCT\nstruct timespec {\n  time_t\ttv_sec;\t\t/* seconds */\n  long\t\ttv_nsec;\t/* and nanoseconds */\n};\n/* $$.It timespec$$ */\n/* $$.Ib tv_sec$$ */\n/* $$.Ib tv_nsec$$ */\n#endif\n/* end unph */\n\n\t\t\t/* prototypes for our own library functions */\nint\t\t connect_nonb(int, const SA *, socklen_t, int);\nint\t\t connect_timeo(int, const SA *, socklen_t, int);\nvoid\t daemon_init(const char *, int);\nvoid\t daemon_inetd(const char *, int);\nvoid\t dg_cli(FILE *, int, const SA *, socklen_t);\nvoid\t dg_echo(int, SA *, socklen_t);\nint\t\t family_to_level(int);\nchar\t*gf_time(void);\nvoid\t heartbeat_cli(int, int, int);\nvoid\t heartbeat_serv(int, int, int);\nstruct addrinfo *host_serv(const char *, const char *, int, int);\nint\t\t inet_srcrt_add(char *, int);\nu_char  *inet_srcrt_init(void);\nvoid\t inet_srcrt_print(u_char *, int);\nchar   **my_addrs(int *);\nint\t\t readable_timeo(int, int);\nssize_t\t readline(int, void *, size_t);\nssize_t\t readn(int, void *, size_t);\nssize_t\t read_fd(int, void *, size_t, int *);\nssize_t\t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,\n\t\t struct in_pktinfo *);\nSigfunc *signal_intr(int, Sigfunc *);\nint\t\t sock_bind_wild(int, int);\nint\t\t sock_cmp_addr(const SA *, const SA *, socklen_t);\nint\t\t sock_cmp_port(const SA *, const SA *, socklen_t);\nint\t\t sock_get_port(const SA *, socklen_t);\nvoid\t sock_set_addr(SA *, socklen_t, const void *);\nvoid\t sock_set_port(SA *, socklen_t, int);\nvoid\t sock_set_wild(SA *, socklen_t);\nchar\t*sock_ntop(const SA *, socklen_t);\nchar\t*sock_ntop_host(const SA *, socklen_t);\nint\t\t sockfd_to_family(int);\nvoid\t str_echo(int);\nvoid\t str_cli(FILE *, int);\nint\t\t tcp_connect(const char *, const char *);\nint\t\t tcp_listen(const char *, const char *, socklen_t *);\nvoid\t tv_sub(struct timeval *, struct timeval *);\nint\t\t udp_client(const char *, const char *, void **, socklen_t *);\nint\t\t udp_connect(const char *, const char *);\nint\t\t udp_server(const char *, const char *, socklen_t *);\nint\t\t writable_timeo(int, int);\nssize_t\t writen(int, const void *, size_t);\nssize_t\t write_fd(int, void *, size_t, int);\n\n#ifdef\tMCAST\nint\t\t mcast_leave(int, const SA *, socklen_t);\nint\t\t mcast_join(int, const SA *, socklen_t, const char *, u_int);\nint\t\t mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nint\t\t mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t const SA *grp, socklen_t grplen,\n\t\t\t\t\t\t\t\t const char *ifname, u_int ifindex);\nint\t\t mcast_block_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\tconst SA *grp, socklen_t grplen);\nint\t\t mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nint\t\t mcast_get_if(int);\nint\t\t mcast_get_loop(int);\nint\t\t mcast_get_ttl(int);\nint\t\t mcast_set_if(int, const char *, u_int);\nint\t\t mcast_set_loop(int, int);\nint\t\t mcast_set_ttl(int, int);\n\nvoid\t Mcast_leave(int, const SA *, socklen_t);\nvoid\t Mcast_join(int, const SA *, socklen_t, const char *, u_int);\nvoid\t Mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nvoid\t Mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t const SA *grp, socklen_t grplen,\n\t\t\t\t\t\t\t\t const char *ifname, u_int ifindex);\nvoid\t Mcast_block_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\tconst SA *grp, socklen_t grplen);\nvoid\t Mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nint\t\t Mcast_get_if(int);\nint\t\t Mcast_get_loop(int);\nint\t\t Mcast_get_ttl(int);\nvoid\t Mcast_set_if(int, const char *, u_int);\nvoid\t Mcast_set_loop(int, int);\nvoid\t Mcast_set_ttl(int, int);\n#endif\n\nunsigned short\tin_cksum(unsigned short *, int);\n\n#ifndef\tHAVE_GETADDRINFO_PROTO\nint\t\t getaddrinfo(const char *, const char *, const struct addrinfo *,\n\t\t\t\t\t struct addrinfo **);\nvoid\t freeaddrinfo(struct addrinfo *);\nchar\t*gai_strerror(int);\n#endif\n\n#ifndef\tHAVE_GETNAMEINFO_PROTO\nint\t\t getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);\n#endif\n\n#ifndef\tHAVE_GETHOSTNAME_PROTO\nint\t\t gethostname(char *, int);\n#endif\n\n#ifndef\tHAVE_HSTRERROR_PROTO\nconst char\t*hstrerror(int);\n#endif\n\n#ifndef\tHAVE_IF_NAMETOINDEX_PROTO\nunsigned int\t if_nametoindex(const char *);\nchar\t\t\t*if_indextoname(unsigned int, char *);\nvoid\t\t\t if_freenameindex(struct if_nameindex *);\nstruct if_nameindex *if_nameindex(void);\n#endif\n\n#ifndef\tHAVE_INET_PTON_PROTO\nint\t\t\t inet_pton(int, const char *, void *);\nconst char\t*inet_ntop(int, const void *, char *, size_t);\n#endif\n\n#ifndef\tHAVE_INET_ATON_PROTO\nint\t\t inet_aton(const char *, struct in_addr *);\n#endif\n\n#ifndef\tHAVE_ISFDTYPE_PROTO\nint\t\t isfdtype(int, int);\n#endif\n\n#ifndef\tHAVE_PSELECT_PROTO\nint\t\t pselect(int, fd_set *, fd_set *, fd_set *,\n\t\t\t\t const struct timespec *, const sigset_t *);\n#endif\n\n#ifndef\tHAVE_SOCKATMARK_PROTO\nint\t\t sockatmark(int);\n#endif\n\n#ifndef\tHAVE_SNPRINTF_PROTO\nint\t\t snprintf(char *, size_t, const char *, ...);\n#endif\n\n\t\t\t/* prototypes for our own library wrapper functions */\nvoid\t Connect_timeo(int, const SA *, socklen_t, int);\nint\t\t Family_to_level(int);\nstruct addrinfo *Host_serv(const char *, const char *, int, int);\nconst char\t\t*Inet_ntop(int, const void *, char *, size_t);\nvoid\t\t\t Inet_pton(int, const char *, void *);\nchar\t\t\t*If_indextoname(unsigned int, char *);\nunsigned int\t\t If_nametoindex(const char *);\nstruct if_nameindex\t*If_nameindex(void);\nchar   **My_addrs(int *);\nssize_t\t Read_fd(int, void *, size_t, int *);\nint\t\t Readable_timeo(int, int);\nssize_t\t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,\n\t\t struct in_pktinfo *);\nSigfunc *Signal(int, Sigfunc *);\nSigfunc *Signal_intr(int, Sigfunc *);\nint\t\t Sock_bind_wild(int, int);\nchar\t*Sock_ntop(const SA *, socklen_t);\nchar\t*Sock_ntop_host(const SA *, socklen_t);\nint\t\t Sockfd_to_family(int);\nint\t\t Tcp_connect(const char *, const char *);\nint\t\t Tcp_listen(const char *, const char *, socklen_t *);\nint\t\t Udp_client(const char *, const char *, void **, socklen_t *);\nint\t\t Udp_connect(const char *, const char *);\nint\t\t Udp_server(const char *, const char *, socklen_t *);\nssize_t\t Write_fd(int, void *, size_t, int);\nint\t\t Writable_timeo(int, int);\n\n\t\t\t/* prototypes for our Unix wrapper functions: see {Sec errors} */\nvoid\t*Calloc(size_t, size_t);\nvoid\t Close(int);\nvoid\t Dup2(int, int);\nint\t\t Fcntl(int, int, int);\nvoid\t Gettimeofday(struct timeval *, void *);\nint\t\t Ioctl(int, int, void *);\npid_t\t Fork(void);\nvoid\t*Malloc(size_t);\nint\t Mkstemp(char *);\nvoid\t*Mmap(void *, size_t, int, int, int, off_t);\nint\t\t Open(const char *, int, mode_t);\nvoid\t Pipe(int *fds);\nssize_t\t Read(int, void *, size_t);\nvoid\t Sigaddset(sigset_t *, int);\nvoid\t Sigdelset(sigset_t *, int);\nvoid\t Sigemptyset(sigset_t *);\nvoid\t Sigfillset(sigset_t *);\nint\t\t Sigismember(const sigset_t *, int);\nvoid\t Sigpending(sigset_t *);\nvoid\t Sigprocmask(int, const sigset_t *, sigset_t *);\nchar\t*Strdup(const char *);\nlong\t Sysconf(int);\nvoid\t Sysctl(int *, u_int, void *, size_t *, void *, size_t);\nvoid\t Unlink(const char *);\npid_t\t Wait(int *);\npid_t\t Waitpid(pid_t, int *, int);\nvoid\t Write(int, void *, size_t);\n\n\t\t\t/* prototypes for our stdio wrapper functions: see {Sec errors} */\nvoid\t Fclose(FILE *);\nFILE\t*Fdopen(int, const char *);\nchar\t*Fgets(char *, int, FILE *);\nFILE\t*Fopen(const char *, const char *);\nvoid\t Fputs(const char *, FILE *);\n\n\t\t\t/* prototypes for our socket wrapper functions: see {Sec errors} */\nint\t\t Accept(int, SA *, socklen_t *);\nvoid\t Bind(int, const SA *, socklen_t);\nvoid\t Connect(int, const SA *, socklen_t);\nvoid\t Getpeername(int, SA *, socklen_t *);\nvoid\t Getsockname(int, SA *, socklen_t *);\nvoid\t Getsockopt(int, int, int, void *, socklen_t *);\nint\t\t Isfdtype(int, int);\nvoid\t Listen(int, int);\n#ifdef\tHAVE_POLL\nint\t\t Poll(struct pollfd *, unsigned long, int);\n#endif\nssize_t\t Readline(int, void *, size_t);\nssize_t\t Readn(int, void *, size_t);\nssize_t\t Recv(int, void *, size_t, int);\nssize_t\t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);\nssize_t\t Recvmsg(int, struct msghdr *, int);\nint\t\t Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);\nvoid\t Send(int, const void *, size_t, int);\nvoid\t Sendto(int, const void *, size_t, int, const SA *, socklen_t);\nvoid\t Sendmsg(int, const struct msghdr *, int);\nvoid\t Setsockopt(int, int, int, const void *, socklen_t);\nvoid\t Shutdown(int, int);\nint\t\t Sockatmark(int);\nint\t\t Socket(int, int, int);\nvoid\t Socketpair(int, int, int, int *);\nvoid\t Writen(int, void *, size_t);\n\nvoid\t err_dump(const char *, ...);\nvoid\t err_msg(const char *, ...);\nvoid\t err_quit(const char *, ...);\nvoid\t err_ret(const char *, ...);\nvoid\t err_sys(const char *, ...);\n\n#endif\t/* __unp_h */\n"
  },
  {
    "path": "lib/Makefile",
    "content": "include ../Make.defines\n\nall:\t${LIB_OBJS}\n\t\tar rv ${LIBUNP_NAME} $?\n\t\t${RANLIB} ${LIBUNP_NAME}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "lib/addrinfo.h",
    "content": "#ifndef\t__addrinfo_h\n#define\t__addrinfo_h\n\n/*\n * Everything here really belongs in <netdb.h>.\n * These defines are separate for now, to avoid having to modify the\n * system's header.\n */\n\nstruct addrinfo {\n  int\t\tai_flags;\t\t\t/* AI_PASSIVE, AI_CANONNAME */\n  int\t\tai_family;\t\t\t/* PF_xxx */\n  int\t\tai_socktype;\t\t/* SOCK_xxx */\n  int\t\tai_protocol;\t\t/* IPPROTO_xxx for IPv4 and IPv6 */\n  size_t\tai_addrlen;\t\t\t/* length of ai_addr */\n  char\t\t*ai_canonname;\t\t/* canonical name for host */\n  struct sockaddr\t*ai_addr;\t/* binary address */\n  struct addrinfo\t*ai_next;\t/* next structure in linked list */\n};\n\n\t\t\t/* following for getaddrinfo() */\n#define\tAI_PASSIVE\t\t 1\t/* socket is intended for bind() + listen() */\n#define\tAI_CANONNAME\t 2\t/* return canonical name */\n\n\t\t\t/* following for getnameinfo() */\n#define\tNI_MAXHOST\t  1025\t/* max hostname returned */\n#define\tNI_MAXSERV\t    32\t/* max service name returned */\n\n#define\tNI_NOFQDN\t     1\t/* do not return FQDN */\n#define\tNI_NUMERICHOST   2\t/* return numeric form of hostname */\n#define\tNI_NAMEREQD\t     4\t/* return error if hostname not found */\n#define\tNI_NUMERICSERV   8\t/* return numeric form of service name */\n#define\tNI_DGRAM\t    16\t/* datagram service for getservbyname() */\n\n\t\t\t/* error returns */\n#define\tEAI_ADDRFAMILY\t 1\t/* address family for host not supported */\n#define\tEAI_AGAIN\t\t 2\t/* temporary failure in name resolution */\n#define\tEAI_BADFLAGS\t 3\t/* invalid value for ai_flags */\n#define\tEAI_FAIL\t\t 4\t/* non-recoverable failure in name resolution */\n#define\tEAI_FAMILY\t\t 5\t/* ai_family not supported */\n#define\tEAI_MEMORY\t\t 6\t/* memory allocation failure */\n#define\tEAI_NODATA\t\t 7\t/* no address associated with host */\n#define\tEAI_NONAME\t\t 8\t/* host nor service provided, or not known */\n#define\tEAI_SERVICE\t\t 9\t/* service not supported for ai_socktype */\n#define\tEAI_SOCKTYPE\t10\t/* ai_socktype not supported */\n#define\tEAI_SYSTEM\t\t11\t/* system error returned in errno */\n\n#endif\t/* __addrinfo_h */\n"
  },
  {
    "path": "lib/connect_nonb.c",
    "content": "#include\t\"unp.h\"\n\nint\nconnect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec)\n{\n\tint\t\t\t\tflags, n, error;\n\tsocklen_t\t\tlen;\n\tfd_set\t\t\trset, wset;\n\tstruct timeval\ttval;\n\n\tflags = Fcntl(sockfd, F_GETFL, 0);\n\tFcntl(sockfd, F_SETFL, flags | O_NONBLOCK);\n\n\terror = 0;\n\tif ( (n = connect(sockfd, saptr, salen)) < 0)\n\t\tif (errno != EINPROGRESS)\n\t\t\treturn(-1);\n\n\t/* Do whatever we want while the connect is taking place. */\n\n\tif (n == 0)\n\t\tgoto done;\t/* connect completed immediately */\n\n\tFD_ZERO(&rset);\n\tFD_SET(sockfd, &rset);\n\twset = rset;\n\ttval.tv_sec = nsec;\n\ttval.tv_usec = 0;\n\n\tif ( (n = Select(sockfd+1, &rset, &wset, NULL,\n\t\t\t\t\t nsec ? &tval : NULL)) == 0) {\n\t\tclose(sockfd);\t\t/* timeout */\n\t\terrno = ETIMEDOUT;\n\t\treturn(-1);\n\t}\n\n\tif (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {\n\t\tlen = sizeof(error);\n\t\tif (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)\n\t\t\treturn(-1);\t\t\t/* Solaris pending error */\n\t} else\n\t\terr_quit(\"select error: sockfd not set\");\n\ndone:\n\tFcntl(sockfd, F_SETFL, flags);\t/* restore file status flags */\n\n\tif (error) {\n\t\tclose(sockfd);\t\t/* just in case */\n\t\terrno = error;\n\t\treturn(-1);\n\t}\n\treturn(0);\n}\n"
  },
  {
    "path": "lib/connect_nonb.lc",
    "content": "#include    \"unp.h\"##  1 ##src/lib/connect_nonb.c##\n\nint##  2 ##src/lib/connect_nonb.c##\nconnect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec)##  3 ##src/lib/connect_nonb.c##\n{##  4 ##src/lib/connect_nonb.c##\n    int     flags, n, error;##  5 ##src/lib/connect_nonb.c##\n    socklen_t len;##  6 ##src/lib/connect_nonb.c##\n    fd_set  rset, wset;##  7 ##src/lib/connect_nonb.c##\n    struct timeval tval;##  8 ##src/lib/connect_nonb.c##\n\n    flags = Fcntl(sockfd, F_GETFL, 0);##  9 ##src/lib/connect_nonb.c##\n    Fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);## 10 ##src/lib/connect_nonb.c##\n\n    error = 0;## 11 ##src/lib/connect_nonb.c##\n    if ((n = connect(sockfd, saptr, salen)) < 0)## 12 ##src/lib/connect_nonb.c##\n        if (errno != EINPROGRESS)## 13 ##src/lib/connect_nonb.c##\n            return (-1);## 14 ##src/lib/connect_nonb.c##\n\n    /* Do whatever we want while the connect is taking place. */## 15 ##src/lib/connect_nonb.c##\n\n    if (n == 0)## 16 ##src/lib/connect_nonb.c##\n        goto done;              /* connect completed immediately */## 17 ##src/lib/connect_nonb.c##\n\n    FD_ZERO(&rset);## 18 ##src/lib/connect_nonb.c##\n    FD_SET(sockfd, &rset);## 19 ##src/lib/connect_nonb.c##\n    wset = rset;## 20 ##src/lib/connect_nonb.c##\n    tval.tv_sec = nsec;## 21 ##src/lib/connect_nonb.c##\n    tval.tv_usec = 0;## 22 ##src/lib/connect_nonb.c##\n\n    if ((n = Select(sockfd + 1, &rset, &wset, NULL,## 23 ##src/lib/connect_nonb.c##\n                    nsec ? &tval : NULL)) == 0) {## 24 ##src/lib/connect_nonb.c##\n        close(sockfd);          /* timeout */## 25 ##src/lib/connect_nonb.c##\n        errno = ETIMEDOUT;## 26 ##src/lib/connect_nonb.c##\n        return (-1);## 27 ##src/lib/connect_nonb.c##\n    }## 28 ##src/lib/connect_nonb.c##\n\n    if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {## 29 ##src/lib/connect_nonb.c##\n        len = sizeof(error);## 30 ##src/lib/connect_nonb.c##\n        if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)## 31 ##src/lib/connect_nonb.c##\n            return (-1);        /* Solaris pending error */## 32 ##src/lib/connect_nonb.c##\n    } else## 33 ##src/lib/connect_nonb.c##\n        err_quit(\"select error: sockfd not set\");## 34 ##src/lib/connect_nonb.c##\n\n  done:## 35 ##src/lib/connect_nonb.c##\n    Fcntl(sockfd, F_SETFL, flags);  /* restore file status flags */## 36 ##src/lib/connect_nonb.c##\n\n    if (error) {## 37 ##src/lib/connect_nonb.c##\n        close(sockfd);          /* just in case */## 38 ##src/lib/connect_nonb.c##\n        errno = error;## 39 ##src/lib/connect_nonb.c##\n        return (-1);## 40 ##src/lib/connect_nonb.c##\n    }## 41 ##src/lib/connect_nonb.c##\n    return (0);## 42 ##src/lib/connect_nonb.c##\n}## 43 ##src/lib/connect_nonb.c##\n"
  },
  {
    "path": "lib/connect_timeo.c",
    "content": "/* include connect_timeo */\n#include\t\"unp.h\"\n\nstatic void\tconnect_alarm(int);\n\nint\nconnect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec)\n{\n\tSigfunc\t*sigfunc;\n\tint\t\tn;\n\n\tsigfunc = Signal(SIGALRM, connect_alarm);\n\tif (alarm(nsec) != 0)\n\t\terr_msg(\"connect_timeo: alarm was already set\");\n\n\tif ( (n = connect(sockfd, saptr, salen)) < 0) {\n\t\tclose(sockfd);\n\t\tif (errno == EINTR)\n\t\t\terrno = ETIMEDOUT;\n\t}\n\talarm(0);\t\t\t\t\t/* turn off the alarm */\n\tSignal(SIGALRM, sigfunc);\t/* restore previous signal handler */\n\n\treturn(n);\n}\n\nstatic void\nconnect_alarm(int signo)\n{\n\treturn;\t\t/* just interrupt the connect() */\n}\n/* end connect_timeo */\n\nvoid\nConnect_timeo(int fd, const SA *sa, socklen_t salen, int sec)\n{\n\tif (connect_timeo(fd, sa, salen, sec) < 0)\n\t\terr_sys(\"connect_timeo error\");\n}\n"
  },
  {
    "path": "lib/connect_timeo.lc",
    "content": "/* include connect_timeo */\n#include    \"unp.h\"##  1 ##src/lib/connect_timeo.c##\n\nstatic void connect_alarm(int);##  2 ##src/lib/connect_timeo.c##\n\nint##  3 ##src/lib/connect_timeo.c##\nconnect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec)##  4 ##src/lib/connect_timeo.c##\n{##  5 ##src/lib/connect_timeo.c##\n    Sigfunc *sigfunc;##  6 ##src/lib/connect_timeo.c##\n    int     n;##  7 ##src/lib/connect_timeo.c##\n\n    sigfunc = Signal(SIGALRM, connect_alarm);##  8 ##src/lib/connect_timeo.c##\n    if (alarm(nsec) != 0)##  9 ##src/lib/connect_timeo.c##\n        err_msg(\"connect_timeo: alarm was already set\");## 10 ##src/lib/connect_timeo.c##\n\n    if ((n = connect(sockfd, saptr, salen)) < 0) {## 11 ##src/lib/connect_timeo.c##\n        close(sockfd);## 12 ##src/lib/connect_timeo.c##\n        if (errno == EINTR)## 13 ##src/lib/connect_timeo.c##\n            errno = ETIMEDOUT;## 14 ##src/lib/connect_timeo.c##\n    }## 15 ##src/lib/connect_timeo.c##\n    alarm(0);                   /* turn off the alarm */## 16 ##src/lib/connect_timeo.c##\n    Signal(SIGALRM, sigfunc);   /* restore previous signal handler */## 17 ##src/lib/connect_timeo.c##\n\n    return (n);## 18 ##src/lib/connect_timeo.c##\n}## 19 ##src/lib/connect_timeo.c##\n\nstatic void## 20 ##src/lib/connect_timeo.c##\nconnect_alarm(int signo)## 21 ##src/lib/connect_timeo.c##\n{## 22 ##src/lib/connect_timeo.c##\n    return;                     /* just interrupt the connect() */## 23 ##src/lib/connect_timeo.c##\n}## 24 ##src/lib/connect_timeo.c##\n/* end connect_timeo */\n\nvoid## 25 ##src/lib/connect_timeo.c##\nConnect_timeo(int fd, const SA *sa, socklen_t salen, int sec)## 26 ##src/lib/connect_timeo.c##\n{## 27 ##src/lib/connect_timeo.c##\n    if (connect_timeo(fd, sa, salen, sec) < 0)## 28 ##src/lib/connect_timeo.c##\n        err_sys(\"connect_timeo error\");## 29 ##src/lib/connect_timeo.c##\n}## 30 ##src/lib/connect_timeo.c##\n"
  },
  {
    "path": "lib/daemon_inetd.c",
    "content": "#include\t\"unp.h\"\n#include\t<syslog.h>\n\nextern int\tdaemon_proc;\t/* defined in error.c */\n\nvoid\ndaemon_inetd(const char *pname, int facility)\n{\n\tdaemon_proc = 1;\t\t/* for our err_XXX() functions */\n\topenlog(pname, LOG_PID, facility);\n}\n"
  },
  {
    "path": "lib/daemon_inetd.lc",
    "content": "#include    \"unp.h\"##  1 ##src/lib/daemon_inetd.c##\n#include    <syslog.h>##  2 ##src/lib/daemon_inetd.c##\n\nextern int daemon_proc;         /* defined in error.c */##  3 ##src/lib/daemon_inetd.c##\n\nvoid##  4 ##src/lib/daemon_inetd.c##\ndaemon_inetd(const char *pname, int facility)##  5 ##src/lib/daemon_inetd.c##\n{##  6 ##src/lib/daemon_inetd.c##\n    daemon_proc = 1;            /* for our err_XXX() functions */##  7 ##src/lib/daemon_inetd.c##\n    openlog(pname, LOG_PID, facility);##  8 ##src/lib/daemon_inetd.c##\n}##  9 ##src/lib/daemon_inetd.c##\n"
  },
  {
    "path": "lib/daemon_init.c",
    "content": "#include\t\"unp.h\"\n#include\t<syslog.h>\n\n#define\tMAXFD\t64\n\nextern int\tdaemon_proc;\t/* defined in error.c */\n\nint\ndaemon_init(const char *pname, int facility)\n{\n\tint\t\ti;\n\tpid_t\tpid;\n\n\tif ( (pid = Fork()) < 0)\n\t\treturn (-1);\n\telse if (pid)\n\t\t_exit(0);\t\t\t/* parent terminates */\n\n\t/* child 1 continues... */\n\n\tif (setsid() < 0)\t\t\t/* become session leader */\n\t\treturn (-1);\n\n\tSignal(SIGHUP, SIG_IGN);\n\tif ( (pid = Fork()) < 0)\n\t\treturn (-1);\n\telse if (pid)\n\t\t_exit(0);\t\t\t/* child 1 terminates */\n\n\t/* child 2 continues... */\n\n\tdaemon_proc = 1;\t\t\t/* for err_XXX() functions */\n\n\tchdir(\"/\");\t\t\t\t/* change working directory */\n\n\t/* close off file descriptors */\n\tfor (i = 0; i < MAXFD; i++)\n\t\tclose(i);\n\n\t/* redirect stdin, stdout, and stderr to /dev/null */\n\topen(\"/dev/null\", O_RDONLY);\n\topen(\"/dev/null\", O_RDWR);\n\topen(\"/dev/null\", O_RDWR);\n\n\topenlog(pname, LOG_PID, facility);\n\n\treturn (0);\t\t\t\t/* success */\n}\n"
  },
  {
    "path": "lib/dg_cli.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "lib/dg_echo.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tint\t\t\tn;\n\tsocklen_t\tlen;\n\tchar\t\tmesg[MAXLINE];\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tn = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);\n\n\t\tSendto(sockfd, mesg, n, 0, pcliaddr, len);\n\t}\n}\n"
  },
  {
    "path": "lib/error.c",
    "content": "#include\t\"unp.h\"\n\n#include\t<stdarg.h>\t\t/* ANSI C header file */\n#include\t<syslog.h>\t\t/* for syslog() */\n\nint\t\tdaemon_proc;\t\t/* set nonzero by daemon_init() */\n\nstatic void\terr_doit(int, int, const char *, va_list);\n\n/* Nonfatal error related to system call\n * Print message and return */\n\nvoid\nerr_ret(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(1, LOG_INFO, fmt, ap);\n\tva_end(ap);\n\treturn;\n}\n\n/* Fatal error related to system call\n * Print message and terminate */\n\nvoid\nerr_sys(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(1, LOG_ERR, fmt, ap);\n\tva_end(ap);\n\texit(1);\n}\n\n/* Fatal error related to system call\n * Print message, dump core, and terminate */\n\nvoid\nerr_dump(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(1, LOG_ERR, fmt, ap);\n\tva_end(ap);\n\tabort();\t\t/* dump core and terminate */\n\texit(1);\t\t/* shouldn't get here */\n}\n\n/* Nonfatal error unrelated to system call\n * Print message and return */\n\nvoid\nerr_msg(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(0, LOG_INFO, fmt, ap);\n\tva_end(ap);\n\treturn;\n}\n\n/* Fatal error unrelated to system call\n * Print message and terminate */\n\nvoid\nerr_quit(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(0, LOG_ERR, fmt, ap);\n\tva_end(ap);\n\texit(1);\n}\n\n/* Print message and return to caller\n * Caller specifies \"errnoflag\" and \"level\" */\n\nstatic void\nerr_doit(int errnoflag, int level, const char *fmt, va_list ap)\n{\n\tint\t\terrno_save, n;\n\tchar\tbuf[MAXLINE + 1];\n\n\terrno_save = errno;\t\t/* value caller might want printed */\n#ifdef\tHAVE_VSNPRINTF\n\tvsnprintf(buf, MAXLINE, fmt, ap);\t/* safe */\n#else\n\tvsprintf(buf, fmt, ap);\t\t\t\t\t/* not safe */\n#endif\n\tn = strlen(buf);\n\tif (errnoflag)\n\t\tsnprintf(buf + n, MAXLINE - n, \": %s\", strerror(errno_save));\n\tstrcat(buf, \"\\n\");\n\n\tif (daemon_proc) {\n\t\tsyslog(level, buf);\n\t} else {\n\t\tfflush(stdout);\t\t/* in case stdout and stderr are the same */\n\t\tfputs(buf, stderr);\n\t\tfflush(stderr);\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "lib/family_to_level.c",
    "content": "#include \"unp.h\"\n\nint\nfamily_to_level(int family)\n{\n\tswitch (family) {\n\tcase AF_INET:\n\t\treturn IPPROTO_IP;\n#ifdef\tIPV6\n\tcase AF_INET6:\n\t\treturn IPPROTO_IPV6;\n#endif\n\tdefault:\n\t\treturn -1;\n\t}\n}\n\nint\nFamily_to_level(int family)\n{\n\tint\t\trc;\n\n\tif ( (rc = family_to_level(family)) < 0)\n\t\terr_sys(\"family_to_level error\");\n\n\treturn(rc);\n}\n"
  },
  {
    "path": "lib/get_ifi_info.c",
    "content": "/* include get_ifi_info1 */\n#include\t\"unpifi.h\"\n\nstruct ifi_info *\nget_ifi_info(int family, int doaliases)\n{\n\tstruct ifi_info\t\t*ifi, *ifihead, **ifipnext;\n\tint\t\t\t\t\tsockfd, len, lastlen, flags, myflags, idx = 0, hlen = 0;\n\tchar\t\t\t\t*ptr, *buf, lastname[IFNAMSIZ], *cptr, *haddr, *sdlname;\n\tstruct ifconf\t\tifc;\n\tstruct ifreq\t\t*ifr, ifrcopy;\n\tstruct sockaddr_in\t*sinptr;\n\tstruct sockaddr_in6\t*sin6ptr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tlastlen = 0;\n\tlen = 100 * sizeof(struct ifreq);\t/* initial buffer size guess */\n\tfor ( ; ; ) {\n\t\tbuf = Malloc(len);\n\t\tifc.ifc_len = len;\n\t\tifc.ifc_buf = buf;\n\t\tif (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {\n\t\t\tif (errno != EINVAL || lastlen != 0)\n\t\t\t\terr_sys(\"ioctl error\");\n\t\t} else {\n\t\t\tif (ifc.ifc_len == lastlen)\n\t\t\t\tbreak;\t\t/* success, len has not changed */\n\t\t\tlastlen = ifc.ifc_len;\n\t\t}\n\t\tlen += 10 * sizeof(struct ifreq);\t/* increment */\n\t\tfree(buf);\n\t}\n\tifihead = NULL;\n\tifipnext = &ifihead;\n\tlastname[0] = 0;\n\tsdlname = NULL;\n/* end get_ifi_info1 */\n\n/* include get_ifi_info2 */\n\tfor (ptr = buf; ptr < buf + ifc.ifc_len; ) {\n\t\tifr = (struct ifreq *) ptr;\n\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\tlen = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);\n#else\n\t\tswitch (ifr->ifr_addr.sa_family) {\n#ifdef\tIPV6\n\t\tcase AF_INET6:\t\n\t\t\tlen = sizeof(struct sockaddr_in6);\n\t\t\tbreak;\n#endif\n\t\tcase AF_INET:\t\n\t\tdefault:\t\n\t\t\tlen = sizeof(struct sockaddr);\n\t\t\tbreak;\n\t\t}\n#endif\t/* HAVE_SOCKADDR_SA_LEN */\n\t\tptr += sizeof(ifr->ifr_name) + len;\t/* for next one in buffer */\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n\t\t/* assumes that AF_LINK precedes AF_INET or AF_INET6 */\n\t\tif (ifr->ifr_addr.sa_family == AF_LINK) {\n\t\t\tstruct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;\n\t\t\tsdlname = ifr->ifr_name;\n\t\t\tidx = sdl->sdl_index;\n\t\t\thaddr = sdl->sdl_data + sdl->sdl_nlen;\n\t\t\thlen = sdl->sdl_alen;\n\t\t}\n#endif\n\n\t\tif (ifr->ifr_addr.sa_family != family)\n\t\t\tcontinue;\t/* ignore if not desired address family */\n\n\t\tmyflags = 0;\n\t\tif ( (cptr = strchr(ifr->ifr_name, ':')) != NULL)\n\t\t\t*cptr = 0;\t\t/* replace colon with null */\n\t\tif (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) {\n\t\t\tif (doaliases == 0)\n\t\t\t\tcontinue;\t/* already processed this interface */\n\t\t\tmyflags = IFI_ALIAS;\n\t\t}\n\t\tmemcpy(lastname, ifr->ifr_name, IFNAMSIZ);\n\n\t\tifrcopy = *ifr;\n\t\tIoctl(sockfd, SIOCGIFFLAGS, &ifrcopy);\n\t\tflags = ifrcopy.ifr_flags;\n\t\tif ((flags & IFF_UP) == 0)\n\t\t\tcontinue;\t/* ignore if interface not up */\n/* end get_ifi_info2 */\n\n/* include get_ifi_info3 */\n\t\tifi = Calloc(1, sizeof(struct ifi_info));\n\t\t*ifipnext = ifi;\t\t\t/* prev points to this new one */\n\t\tifipnext = &ifi->ifi_next;\t/* pointer to next one goes here */\n\n\t\tifi->ifi_flags = flags;\t\t/* IFF_xxx values */\n\t\tifi->ifi_myflags = myflags;\t/* IFI_xxx values */\n#if defined(SIOCGIFMTU) && defined(HAVE_STRUCT_IFREQ_IFR_MTU)\n\t\tIoctl(sockfd, SIOCGIFMTU, &ifrcopy);\n\t\tifi->ifi_mtu = ifrcopy.ifr_mtu;\n#else\n\t\tifi->ifi_mtu = 0;\n#endif\n\t\tmemcpy(ifi->ifi_name, ifr->ifr_name, IFI_NAME);\n\t\tifi->ifi_name[IFI_NAME-1] = '\\0';\n\t\t/* If the sockaddr_dl is from a different interface, ignore it */\n\t\tif (sdlname == NULL || strcmp(sdlname, ifr->ifr_name) != 0)\n\t\t\tidx = hlen = 0;\n\t\tifi->ifi_index = idx;\n\t\tifi->ifi_hlen = hlen;\n\t\tif (ifi->ifi_hlen > IFI_HADDR)\n\t\t\tifi->ifi_hlen = IFI_HADDR;\n\t\tif (hlen)\n\t\t\tmemcpy(ifi->ifi_haddr, haddr, ifi->ifi_hlen);\n/* end get_ifi_info3 */\n/* include get_ifi_info4 */\n\t\tswitch (ifr->ifr_addr.sa_family) {\n\t\tcase AF_INET:\n\t\t\tsinptr = (struct sockaddr_in *) &ifr->ifr_addr;\n\t\t\tifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in));\n\t\t\tmemcpy(ifi->ifi_addr, sinptr, sizeof(struct sockaddr_in));\n\n#ifdef\tSIOCGIFBRDADDR\n\t\t\tif (flags & IFF_BROADCAST) {\n\t\t\t\tIoctl(sockfd, SIOCGIFBRDADDR, &ifrcopy);\n\t\t\t\tsinptr = (struct sockaddr_in *) &ifrcopy.ifr_broadaddr;\n\t\t\t\tifi->ifi_brdaddr = Calloc(1, sizeof(struct sockaddr_in));\n\t\t\t\tmemcpy(ifi->ifi_brdaddr, sinptr, sizeof(struct sockaddr_in));\n\t\t\t}\n#endif\n\n#ifdef\tSIOCGIFDSTADDR\n\t\t\tif (flags & IFF_POINTOPOINT) {\n\t\t\t\tIoctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);\n\t\t\t\tsinptr = (struct sockaddr_in *) &ifrcopy.ifr_dstaddr;\n\t\t\t\tifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in));\n\t\t\t\tmemcpy(ifi->ifi_dstaddr, sinptr, sizeof(struct sockaddr_in));\n\t\t\t}\n#endif\n\t\t\tbreak;\n\n\t\tcase AF_INET6:\n\t\t\tsin6ptr = (struct sockaddr_in6 *) &ifr->ifr_addr;\n\t\t\tifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in6));\n\t\t\tmemcpy(ifi->ifi_addr, sin6ptr, sizeof(struct sockaddr_in6));\n\n#ifdef\tSIOCGIFDSTADDR\n\t\t\tif (flags & IFF_POINTOPOINT) {\n\t\t\t\tIoctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);\n\t\t\t\tsin6ptr = (struct sockaddr_in6 *) &ifrcopy.ifr_dstaddr;\n\t\t\t\tifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in6));\n\t\t\t\tmemcpy(ifi->ifi_dstaddr, sin6ptr, sizeof(struct sockaddr_in6));\n\t\t\t}\n#endif\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\tfree(buf);\n\treturn(ifihead);\t/* pointer to first structure in linked list */\n}\n/* end get_ifi_info4 */\n\n/* include free_ifi_info */\nvoid\nfree_ifi_info(struct ifi_info *ifihead)\n{\n\tstruct ifi_info\t*ifi, *ifinext;\n\n\tfor (ifi = ifihead; ifi != NULL; ifi = ifinext) {\n\t\tif (ifi->ifi_addr != NULL)\n\t\t\tfree(ifi->ifi_addr);\n\t\tif (ifi->ifi_brdaddr != NULL)\n\t\t\tfree(ifi->ifi_brdaddr);\n\t\tif (ifi->ifi_dstaddr != NULL)\n\t\t\tfree(ifi->ifi_dstaddr);\n\t\tifinext = ifi->ifi_next;\t/* can't fetch ifi_next after free() */\n\t\tfree(ifi);\t\t\t\t\t/* the ifi_info{} itself */\n\t}\n}\n/* end free_ifi_info */\n\nstruct ifi_info *\nGet_ifi_info(int family, int doaliases)\n{\n\tstruct ifi_info\t*ifi;\n\n\tif ( (ifi = get_ifi_info(family, doaliases)) == NULL)\n\t\terr_quit(\"get_ifi_info error\");\n\treturn(ifi);\n}\n"
  },
  {
    "path": "lib/get_ifi_info.lc",
    "content": "/* include get_ifi_info1 */\n#include    \"unpifi.h\"##  1 ##src/lib/get_ifi_info.c##\n\nstruct ifi_info *##  2 ##src/lib/get_ifi_info.c##\nget_ifi_info(int family, int doaliases)##  3 ##src/lib/get_ifi_info.c##\n{##  4 ##src/lib/get_ifi_info.c##\n    struct ifi_info *ifi, *ifihead, **ifipnext;##  5 ##src/lib/get_ifi_info.c##\n    int     sockfd, len, lastlen, flags, myflags, idx = 0, hlen = 0;##  6 ##src/lib/get_ifi_info.c##\n    char   *ptr, *buf, lastname[IFNAMSIZ], *cptr, *haddr;##  7 ##src/lib/get_ifi_info.c##\n    struct ifconf ifc;##  8 ##src/lib/get_ifi_info.c##\n    struct ifreq *ifr, ifrcopy;##  9 ##src/lib/get_ifi_info.c##\n    struct sockaddr_in *sinptr;## 10 ##src/lib/get_ifi_info.c##\n    struct sockaddr_in6 *sin6ptr;## 11 ##src/lib/get_ifi_info.c##\n\n    sockfd = Socket(AF_INET, SOCK_DGRAM, 0);## 12 ##src/lib/get_ifi_info.c##\n\n    lastlen = 0;## 13 ##src/lib/get_ifi_info.c##\n    len = 100 * sizeof(struct ifreq);   /* initial buffer size guess */## 14 ##src/lib/get_ifi_info.c##\n    for (;;) {## 15 ##src/lib/get_ifi_info.c##\n        buf = Malloc(len);## 16 ##src/lib/get_ifi_info.c##\n        ifc.ifc_len = len;## 17 ##src/lib/get_ifi_info.c##\n        ifc.ifc_buf = buf;## 18 ##src/lib/get_ifi_info.c##\n        if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {## 19 ##src/lib/get_ifi_info.c##\n            if (errno != EINVAL || lastlen != 0)## 20 ##src/lib/get_ifi_info.c##\n                err_sys(\"ioctl error\");## 21 ##src/lib/get_ifi_info.c##\n        } else {## 22 ##src/lib/get_ifi_info.c##\n            if (ifc.ifc_len == lastlen)## 23 ##src/lib/get_ifi_info.c##\n                break;          /* success, len has not changed */## 24 ##src/lib/get_ifi_info.c##\n            lastlen = ifc.ifc_len;## 25 ##src/lib/get_ifi_info.c##\n        }## 26 ##src/lib/get_ifi_info.c##\n        len += 10 * sizeof(struct ifreq);   /* increment */## 27 ##src/lib/get_ifi_info.c##\n        free(buf);## 28 ##src/lib/get_ifi_info.c##\n    }## 29 ##src/lib/get_ifi_info.c##\n    ifihead = NULL;## 30 ##src/lib/get_ifi_info.c##\n    ifipnext = &ifihead;## 31 ##src/lib/get_ifi_info.c##\n    lastname[0] = 0;## 32 ##src/lib/get_ifi_info.c##\n/* end get_ifi_info1 */\n\n/* include get_ifi_info2 */\n    for (ptr = buf; ptr < buf + ifc.ifc_len;) {## 33 ##src/lib/get_ifi_info.c##\n        ifr = (struct ifreq *) ptr;## 34 ##src/lib/get_ifi_info.c##\n\n#ifdef  HAVE_SOCKADDR_SA_LEN## 35 ##src/lib/get_ifi_info.c##\n        len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);## 36 ##src/lib/get_ifi_info.c##\n#else## 37 ##src/lib/get_ifi_info.c##\n        switch (ifr->ifr_addr.sa_family) {## 38 ##src/lib/get_ifi_info.c##\n#ifdef  IPV6## 39 ##src/lib/get_ifi_info.c##\n        case AF_INET6:## 40 ##src/lib/get_ifi_info.c##\n            len = sizeof(struct sockaddr_in6);## 41 ##src/lib/get_ifi_info.c##\n            break;## 42 ##src/lib/get_ifi_info.c##\n#endif## 43 ##src/lib/get_ifi_info.c##\n        case AF_INET:## 44 ##src/lib/get_ifi_info.c##\n        default:## 45 ##src/lib/get_ifi_info.c##\n            len = sizeof(struct sockaddr);## 46 ##src/lib/get_ifi_info.c##\n            break;## 47 ##src/lib/get_ifi_info.c##\n        }## 48 ##src/lib/get_ifi_info.c##\n#endif  /* HAVE_SOCKADDR_SA_LEN */## 49 ##src/lib/get_ifi_info.c##\n        ptr += sizeof(ifr->ifr_name) + len; /* for next one in buffer */## 50 ##src/lib/get_ifi_info.c##\n\n#ifdef  HAVE_SOCKADDR_DL## 51 ##src/lib/get_ifi_info.c##\n        /* assumes that AF_LINK precedes AF_INET or AF_INET6 */## 52 ##src/lib/get_ifi_info.c##\n        if (ifr->ifr_addr.sa_family == AF_LINK) {## 53 ##src/lib/get_ifi_info.c##\n            struct sockaddr_dl *sdl = (struct sockaddr_dl *) &ifr->ifr_addr;## 54 ##src/lib/get_ifi_info.c##\n            idx = sdl->sdl_index;## 55 ##src/lib/get_ifi_info.c##\n            haddr = sdl->sdl_data + sdl->sdl_nlen;## 56 ##src/lib/get_ifi_info.c##\n            hlen = sdl->sdl_alen;## 57 ##src/lib/get_ifi_info.c##\n        }## 58 ##src/lib/get_ifi_info.c##\n#endif## 59 ##src/lib/get_ifi_info.c##\n\n        if (ifr->ifr_addr.sa_family != family)## 60 ##src/lib/get_ifi_info.c##\n            continue;           /* ignore if not desired address family */## 61 ##src/lib/get_ifi_info.c##\n\n        myflags = 0;## 62 ##src/lib/get_ifi_info.c##\n        if ((cptr = strchr(ifr->ifr_name, ':')) != NULL)## 63 ##src/lib/get_ifi_info.c##\n            *cptr = 0;          /* replace colon with null */## 64 ##src/lib/get_ifi_info.c##\n        if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) {## 65 ##src/lib/get_ifi_info.c##\n            if (doaliases == 0)## 66 ##src/lib/get_ifi_info.c##\n                continue;       /* already processed this interface */## 67 ##src/lib/get_ifi_info.c##\n            myflags = IFI_ALIAS;## 68 ##src/lib/get_ifi_info.c##\n        }## 69 ##src/lib/get_ifi_info.c##\n        memcpy(lastname, ifr->ifr_name, IFNAMSIZ);## 70 ##src/lib/get_ifi_info.c##\n\n        ifrcopy = *ifr;## 71 ##src/lib/get_ifi_info.c##\n        Ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);## 72 ##src/lib/get_ifi_info.c##\n        flags = ifrcopy.ifr_flags;## 73 ##src/lib/get_ifi_info.c##\n        if ((flags & IFF_UP) == 0)## 74 ##src/lib/get_ifi_info.c##\n            continue;           /* ignore if interface not up */## 75 ##src/lib/get_ifi_info.c##\n\n        ifi = Calloc(1, sizeof(struct ifi_info));## 76 ##src/lib/get_ifi_info.c##\n        *ifipnext = ifi;        /* prev points to this new one */## 77 ##src/lib/get_ifi_info.c##\n        ifipnext = &ifi->ifi_next;  /* pointer to next one goes here */## 78 ##src/lib/get_ifi_info.c##\n\n        ifi->ifi_flags = flags; /* IFF_xxx values */## 79 ##src/lib/get_ifi_info.c##\n        ifi->ifi_myflags = myflags; /* IFI_xxx values */## 80 ##src/lib/get_ifi_info.c##\n        ifi->ifi_index = idx;## 81 ##src/lib/get_ifi_info.c##\n        memcpy(ifi->ifi_name, ifr->ifr_name, IFI_NAME);## 82 ##src/lib/get_ifi_info.c##\n        ifi->ifi_hlen = hlen;## 83 ##src/lib/get_ifi_info.c##\n        if (ifi->ifi_hlen > IFI_HADDR)## 84 ##src/lib/get_ifi_info.c##\n            ifi->ifi_hlen = IFI_HADDR;## 85 ##src/lib/get_ifi_info.c##\n        memcpy(ifi->ifi_haddr, haddr, ifi->ifi_hlen);## 86 ##src/lib/get_ifi_info.c##\n        ifi->ifi_name[IFI_NAME - 1] = '\\0';## 87 ##src/lib/get_ifi_info.c##\n        idx = hlen = 0;## 88 ##src/lib/get_ifi_info.c##\n/* end get_ifi_info2 */\n/* include get_ifi_info3 */\n        switch (ifr->ifr_addr.sa_family) {## 89 ##src/lib/get_ifi_info.c##\n        case AF_INET:## 90 ##src/lib/get_ifi_info.c##\n            sinptr = (struct sockaddr_in *) &ifr->ifr_addr;## 91 ##src/lib/get_ifi_info.c##\n            if (ifi->ifi_addr == NULL) {## 92 ##src/lib/get_ifi_info.c##\n                ifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in));## 93 ##src/lib/get_ifi_info.c##\n                memcpy(ifi->ifi_addr, sinptr, sizeof(struct sockaddr_in));## 94 ##src/lib/get_ifi_info.c##\n\n#ifdef  SIOCGIFBRDADDR## 95 ##src/lib/get_ifi_info.c##\n                if (flags & IFF_BROADCAST) {## 96 ##src/lib/get_ifi_info.c##\n                    Ioctl(sockfd, SIOCGIFBRDADDR, &ifrcopy);## 97 ##src/lib/get_ifi_info.c##\n                    sinptr = (struct sockaddr_in *) &ifrcopy.ifr_broadaddr;## 98 ##src/lib/get_ifi_info.c##\n                    ifi->ifi_brdaddr = Calloc(1, sizeof(struct sockaddr_in));## 99 ##src/lib/get_ifi_info.c##\n                    memcpy(ifi->ifi_brdaddr, sinptr,##100 ##src/lib/get_ifi_info.c##\n                           sizeof(struct sockaddr_in));##101 ##src/lib/get_ifi_info.c##\n                }##102 ##src/lib/get_ifi_info.c##\n#endif##103 ##src/lib/get_ifi_info.c##\n\n#ifdef  SIOCGIFDSTADDR##104 ##src/lib/get_ifi_info.c##\n                if (flags & IFF_POINTOPOINT) {##105 ##src/lib/get_ifi_info.c##\n                    Ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);##106 ##src/lib/get_ifi_info.c##\n                    sinptr = (struct sockaddr_in *) &ifrcopy.ifr_dstaddr;##107 ##src/lib/get_ifi_info.c##\n                    ifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in));##108 ##src/lib/get_ifi_info.c##\n                    memcpy(ifi->ifi_dstaddr, sinptr,##109 ##src/lib/get_ifi_info.c##\n                           sizeof(struct sockaddr_in));##110 ##src/lib/get_ifi_info.c##\n                }##111 ##src/lib/get_ifi_info.c##\n#endif##112 ##src/lib/get_ifi_info.c##\n            }##113 ##src/lib/get_ifi_info.c##\n            break;##114 ##src/lib/get_ifi_info.c##\n\n        case AF_INET6:##115 ##src/lib/get_ifi_info.c##\n            sin6ptr = (struct sockaddr_in6 *) &ifr->ifr_addr;##116 ##src/lib/get_ifi_info.c##\n            if (ifi->ifi_addr == NULL) {##117 ##src/lib/get_ifi_info.c##\n                ifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in6));##118 ##src/lib/get_ifi_info.c##\n                memcpy(ifi->ifi_addr, sin6ptr, sizeof(struct sockaddr_in6));##119 ##src/lib/get_ifi_info.c##\n\n#ifdef  SIOCGIFDSTADDR##120 ##src/lib/get_ifi_info.c##\n                if (flags & IFF_POINTOPOINT) {##121 ##src/lib/get_ifi_info.c##\n                    Ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);##122 ##src/lib/get_ifi_info.c##\n                    sin6ptr = (struct sockaddr_in6 *) &ifrcopy.ifr_dstaddr;##123 ##src/lib/get_ifi_info.c##\n                    ifi->ifi_dstaddr =##124 ##src/lib/get_ifi_info.c##\n                        Calloc(1, sizeof(struct sockaddr_in6));##125 ##src/lib/get_ifi_info.c##\n                    memcpy(ifi->ifi_dstaddr, sin6ptr,##126 ##src/lib/get_ifi_info.c##\n                           sizeof(struct sockaddr_in6));##127 ##src/lib/get_ifi_info.c##\n                }##128 ##src/lib/get_ifi_info.c##\n#endif##129 ##src/lib/get_ifi_info.c##\n            }##130 ##src/lib/get_ifi_info.c##\n            break;##131 ##src/lib/get_ifi_info.c##\n\n        default:##132 ##src/lib/get_ifi_info.c##\n            break;##133 ##src/lib/get_ifi_info.c##\n        }##134 ##src/lib/get_ifi_info.c##\n    }##135 ##src/lib/get_ifi_info.c##\n    free(buf);##136 ##src/lib/get_ifi_info.c##\n    return (ifihead);           /* pointer to first structure in linked list */##137 ##src/lib/get_ifi_info.c##\n}##138 ##src/lib/get_ifi_info.c##\n/* end get_ifi_info3 */\n\n/* include free_ifi_info */\nvoid##139 ##src/lib/get_ifi_info.c##\nfree_ifi_info(struct ifi_info *ifihead)##140 ##src/lib/get_ifi_info.c##\n{##141 ##src/lib/get_ifi_info.c##\n    struct ifi_info *ifi, *ifinext;##142 ##src/lib/get_ifi_info.c##\n\n    for (ifi = ifihead; ifi != NULL; ifi = ifinext) {##143 ##src/lib/get_ifi_info.c##\n        if (ifi->ifi_addr != NULL)##144 ##src/lib/get_ifi_info.c##\n            free(ifi->ifi_addr);##145 ##src/lib/get_ifi_info.c##\n        if (ifi->ifi_brdaddr != NULL)##146 ##src/lib/get_ifi_info.c##\n            free(ifi->ifi_brdaddr);##147 ##src/lib/get_ifi_info.c##\n        if (ifi->ifi_dstaddr != NULL)##148 ##src/lib/get_ifi_info.c##\n            free(ifi->ifi_dstaddr);##149 ##src/lib/get_ifi_info.c##\n        ifinext = ifi->ifi_next;    /* can't fetch ifi_next after free() */##150 ##src/lib/get_ifi_info.c##\n        free(ifi);              /* the ifi_info{} itself */##151 ##src/lib/get_ifi_info.c##\n    }##152 ##src/lib/get_ifi_info.c##\n}##153 ##src/lib/get_ifi_info.c##\n/* end free_ifi_info */\n\nstruct ifi_info *##154 ##src/lib/get_ifi_info.c##\nGet_ifi_info(int family, int doaliases)##155 ##src/lib/get_ifi_info.c##\n{##156 ##src/lib/get_ifi_info.c##\n    struct ifi_info *ifi;##157 ##src/lib/get_ifi_info.c##\n\n    if ((ifi = get_ifi_info(family, doaliases)) == NULL)##158 ##src/lib/get_ifi_info.c##\n        err_quit(\"get_ifi_info error\");##159 ##src/lib/get_ifi_info.c##\n    return (ifi);##160 ##src/lib/get_ifi_info.c##\n}##161 ##src/lib/get_ifi_info.c##\n"
  },
  {
    "path": "lib/gf_time.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nchar *\ngf_time(void)\n{\n\tstruct timeval\ttv;\n\ttime_t\t\t\tt;\n\tstatic char\t\tstr[30];\n\tchar\t\t\t*ptr;\n\n\tif (gettimeofday(&tv, NULL) < 0)\n\t\terr_sys(\"gettimeofday error\");\n\n\tt = tv.tv_sec;\t/* POSIX says tv.tv_sec is time_t; some BSDs don't agree. */\n\tptr = ctime(&t);\n\tstrcpy(str, &ptr[11]);\n\t\t/* Fri Sep 13 00:00:00 1986\\n\\0 */\n\t\t/* 0123456789012345678901234 5  */\n\tsnprintf(str+8, sizeof(str)-8, \".%06ld\", tv.tv_usec);\n\n\treturn(str);\n}\n"
  },
  {
    "path": "lib/host_serv.c",
    "content": "/* include host_serv */\n#include\t\"unp.h\"\n\nstruct addrinfo *\nhost_serv(const char *host, const char *serv, int family, int socktype)\n{\n\tint\t\t\t\tn;\n\tstruct addrinfo\thints, *res;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_flags = AI_CANONNAME;\t/* always return canonical name */\n\thints.ai_family = family;\t\t/* AF_UNSPEC, AF_INET, AF_INET6, etc. */\n\thints.ai_socktype = socktype;\t/* 0, SOCK_STREAM, SOCK_DGRAM, etc. */\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\treturn(NULL);\n\n\treturn(res);\t/* return pointer to first on linked list */\n}\n/* end host_serv */\n\n/*\n * There is no easy way to pass back the integer return code from\n * getaddrinfo() in the function above, short of adding another argument\n * that is a pointer, so the easiest way to provide the wrapper function\n * is just to duplicate the simple function as we do here.\n */\n\nstruct addrinfo *\nHost_serv(const char *host, const char *serv, int family, int socktype)\n{\n\tint\t\t\t\tn;\n\tstruct addrinfo\thints, *res;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_flags = AI_CANONNAME;\t/* always return canonical name */\n\thints.ai_family = family;\t\t/* 0, AF_INET, AF_INET6, etc. */\n\thints.ai_socktype = socktype;\t/* 0, SOCK_STREAM, SOCK_DGRAM, etc. */\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"host_serv error for %s, %s: %s\",\n\t\t\t\t (host == NULL) ? \"(no hostname)\" : host,\n\t\t\t\t (serv == NULL) ? \"(no service name)\" : serv,\n\t\t\t\t gai_strerror(n));\n\n\treturn(res);\t/* return pointer to first on linked list */\n}\n"
  },
  {
    "path": "lib/host_serv.lc",
    "content": "/* include host_serv */\n#include    \"unp.h\"##  1 ##src/lib/host_serv.c##\n\nstruct addrinfo *##  2 ##src/lib/host_serv.c##\nhost_serv(const char *host, const char *serv, int family, int socktype)##  3 ##src/lib/host_serv.c##\n{##  4 ##src/lib/host_serv.c##\n    int     n;##  5 ##src/lib/host_serv.c##\n    struct addrinfo hints, *res;##  6 ##src/lib/host_serv.c##\n\n    bzero(&hints, sizeof(struct addrinfo));##  7 ##src/lib/host_serv.c##\n    hints.ai_flags = AI_CANONNAME;  /* always return canonical name */##  8 ##src/lib/host_serv.c##\n    hints.ai_family = family;   /* AF_UNSPEC, AF_INET, AF_INET6, etc. */##  9 ##src/lib/host_serv.c##\n    hints.ai_socktype = socktype;   /* 0, SOCK_STREAM, SOCK_DGRAM, etc. */## 10 ##src/lib/host_serv.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 11 ##src/lib/host_serv.c##\n        return (NULL);## 12 ##src/lib/host_serv.c##\n\n    return (res);               /* return pointer to first on linked list */## 13 ##src/lib/host_serv.c##\n}## 14 ##src/lib/host_serv.c##\n/* end host_serv */\n\n/*## 15 ##src/lib/host_serv.c##\n * There is no easy way to pass back the integer return code from## 16 ##src/lib/host_serv.c##\n * getaddrinfo() in the function above, short of adding another argument## 17 ##src/lib/host_serv.c##\n * that is a pointer, so the easiest way to provide the wrapper function## 18 ##src/lib/host_serv.c##\n * is just to duplicate the simple function as we do here.## 19 ##src/lib/host_serv.c##\n */## 20 ##src/lib/host_serv.c##\n\nstruct addrinfo *## 21 ##src/lib/host_serv.c##\nHost_serv(const char *host, const char *serv, int family, int socktype)## 22 ##src/lib/host_serv.c##\n{## 23 ##src/lib/host_serv.c##\n    int     n;## 24 ##src/lib/host_serv.c##\n    struct addrinfo hints, *res;## 25 ##src/lib/host_serv.c##\n\n    bzero(&hints, sizeof(struct addrinfo));## 26 ##src/lib/host_serv.c##\n    hints.ai_flags = AI_CANONNAME;  /* always return canonical name */## 27 ##src/lib/host_serv.c##\n    hints.ai_family = family;   /* 0, AF_INET, AF_INET6, etc. */## 28 ##src/lib/host_serv.c##\n    hints.ai_socktype = socktype;   /* 0, SOCK_STREAM, SOCK_DGRAM, etc. */## 29 ##src/lib/host_serv.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 30 ##src/lib/host_serv.c##\n        err_quit(\"host_serv error for %s, %s: %s\",## 31 ##src/lib/host_serv.c##\n                 (host == NULL) ? \"(no hostname)\" : host,## 32 ##src/lib/host_serv.c##\n                 (serv == NULL) ? \"(no service name)\" : serv,## 33 ##src/lib/host_serv.c##\n                 gai_strerror(n));## 34 ##src/lib/host_serv.c##\n\n    return (res);               /* return pointer to first on linked list */## 35 ##src/lib/host_serv.c##\n}## 36 ##src/lib/host_serv.c##\n"
  },
  {
    "path": "lib/hstrerror.c",
    "content": "/*\n * Return a string containing some additional information after a\n * host name or address lookup error - gethostbyname() or gethostbyaddr().\n *\n * This is only compiled if the local host does not provide it--recent\n * versions of BIND supply this function.\n */\n\n#include\t\"unp.h\"\n\nconst char *\nhstrerror(int err)\n{\n\tif (err == 0)\n\t\treturn(\"no error\");\n\n\tif (err == HOST_NOT_FOUND)\n\t\treturn(\"Unknown host\");\n\n\tif (err == TRY_AGAIN)\n\t\treturn(\"Hostname lookup failure\");\n\n\tif (err == NO_RECOVERY)\n\t\treturn(\"Unknown server error\");\n\n\tif (err == NO_DATA)\n        return(\"No address associated with name\");\n\n\treturn(\"unknown error\");\n}\n"
  },
  {
    "path": "lib/if_indextoname.c",
    "content": "#include\t\"unp.h\"\n\n/*\n * This is a placeholder if the system does not provide this RFC 2133\n * function.  If routing sockets with sysctl() are provided, then the\n * if_XXX() functions in the libroute/ directory will replace these.\n */\n\nchar *\nif_indextoname(unsigned int index, char *name)\n{\n\treturn(NULL);\n}\n\nchar *\nIf_indextoname(unsigned int index, char *name)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = if_indextoname(index, name)) == NULL)\n\t\terr_quit(\"if_indextoname error for %d\", index);\n\treturn(ptr);\n}\n"
  },
  {
    "path": "lib/if_nameindex.c",
    "content": "#include\t\"unp.h\"\n\n/*\n * This is a placeholder if the system does not provide this RFC 2133\n * function.  If routing sockets with sysctl() are provided, then the\n * if_XXX() functions in the libroute/ directory will replace these.\n */\n\nstruct if_nameindex *\nif_nameindex(void)\n{\n\treturn(NULL);\n}\n\nvoid\nif_freenameindex(struct if_nameindex *ptr)\n{\n}\n\nstruct if_nameindex *\nIf_nameindex(void)\n{\n\tstruct if_nameindex\t*ifptr;\n\n\tif ( (ifptr = if_nameindex()) == NULL)\n\t\terr_quit(\"if_nameindex error\");\n\treturn(ifptr);\n}\n"
  },
  {
    "path": "lib/if_nametoindex.c",
    "content": "#include\t\"unp.h\"\n\n/*\n * This is a placeholder if the system does not provide this RFC 2133\n * function.  If routing sockets with sysctl() are provided, then the\n * if_XXX() functions in the libroute/ directory will replace these.\n */\n\nunsigned int\nif_nametoindex(const char *name)\n{\n\treturn(0);\n}\n\nunsigned int\nIf_nametoindex(const char *name)\n{\n\tint\t\tindex;\n\n\tif ( (index = if_nametoindex(name)) == 0)\n\t\terr_quit(\"if_nametoindex error for %s\", name);\n\treturn(index);\n}\n"
  },
  {
    "path": "lib/in6addr_any.c",
    "content": "#include\t\"unp.h\"\n\n#ifdef\tIPV6\nconst struct in6_addr in6addr_any;\n#endif\n"
  },
  {
    "path": "lib/mcast_get_if.c",
    "content": "#include\t\"unp.h\"\n\nint\nmcast_get_if(int sockfd)\n{\n\tswitch (sockfd_to_family(sockfd)) {\n\tcase AF_INET: {\n\t\t/* TODO: similar to mcast_set_if() */\n\t\treturn(-1);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tu_int\t\tidx;\n\t\tsocklen_t\tlen;\n\n\t\tlen = sizeof(idx);\n\t\tif (getsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_IF,\n\t\t\t\t\t   &idx, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(idx);\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n}\n\nint\nMcast_get_if(int sockfd)\n{\n\tint\t\trc;\n\n\tif ( (rc = mcast_get_if(sockfd)) < 0)\n\t\terr_sys(\"mcast_get_if error\");\n\treturn(rc);\n}\n"
  },
  {
    "path": "lib/mcast_get_loop.c",
    "content": "#include\t\"unp.h\"\n\nint\nmcast_get_loop(int sockfd)\n{\n\tswitch (sockfd_to_family(sockfd)) {\n\tcase AF_INET: {\n\t\tu_char\t\tflag;\n\t\tsocklen_t\tlen;\n\n\t\tlen = sizeof(flag);\n\t\tif (getsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP,\n\t\t\t\t\t   &flag, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(flag);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tu_int\t\tflag;\n\t\tsocklen_t\tlen;\n\n\t\tlen = sizeof(flag);\n\t\tif (getsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,\n\t\t\t\t\t   &flag, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(flag);\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n}\n\nint\nMcast_get_loop(int sockfd)\n{\n\tint\t\trc;\n\n\tif ( (rc = mcast_get_loop(sockfd)) < 0)\n\t\terr_sys(\"mcast_get_loop error\");\n\treturn(rc);\n}\n"
  },
  {
    "path": "lib/mcast_get_ttl.c",
    "content": "#include\t\"unp.h\"\n\nint\nmcast_get_ttl(int sockfd)\n{\n\tswitch (sockfd_to_family(sockfd)) {\n\tcase AF_INET: {\n\t\tu_char\t\tttl;\n\t\tsocklen_t\tlen;\n\n\t\tlen = sizeof(ttl);\n\t\tif (getsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL,\n\t\t\t\t\t   &ttl, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(ttl);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tint\t\t\thop;\n\t\tsocklen_t\tlen;\n\n\t\tlen = sizeof(hop);\n\t\tif (getsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,\n\t\t\t\t\t   &hop, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(hop);\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n}\n\nint\nMcast_get_ttl(int sockfd)\n{\n\tint\t\trc;\n\n\tif ( (rc = mcast_get_ttl(sockfd)) < 0)\n\t\terr_sys(\"mcast_get_ttl error\");\n\treturn(rc);\n}\n"
  },
  {
    "path": "lib/mcast_join.c",
    "content": "/* include mcast_join1 */\n#include\t\"unp.h\"\n#include\t<net/if.h>\n\nint\nmcast_join(int sockfd, const SA *grp, socklen_t grplen,\n\t\t   const char *ifname, u_int ifindex)\n{\n#ifdef MCAST_JOIN_GROUP\n\tstruct group_req req;\n\tif (ifindex > 0) {\n\t\treq.gr_interface = ifindex;\n\t} else if (ifname != NULL) {\n\t\tif ( (req.gr_interface = if_nametoindex(ifname)) == 0) {\n\t\t\terrno = ENXIO;\t/* i/f name not found */\n\t\t\treturn(-1);\n\t\t}\n\t} else\n\t\treq.gr_interface = 0;\n\tif (grplen > sizeof(req.gr_group)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tmemcpy(&req.gr_group, grp, grplen);\n\treturn (setsockopt(sockfd, family_to_level(grp->sa_family),\n\t\t\tMCAST_JOIN_GROUP, &req, sizeof(req)));\n#else\n/* end mcast_join1 */\n\n/* include mcast_join2 */\n\tswitch (grp->sa_family) {\n\tcase AF_INET: {\n\t\tstruct ip_mreq\t\tmreq;\n\t\tstruct ifreq\t\tifreq;\n\n\t\tmemcpy(&mreq.imr_multiaddr,\n\t\t\t   &((const struct sockaddr_in *) grp)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\n\t\tif (ifindex > 0) {\n\t\t\tif (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {\n\t\t\t\terrno = ENXIO;\t/* i/f index not found */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t\tgoto doioctl;\n\t\t} else if (ifname != NULL) {\n\t\t\tstrncpy(ifreq.ifr_name, ifname, IFNAMSIZ);\ndoioctl:\n\t\t\tif (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0)\n\t\t\t\treturn(-1);\n\t\t\tmemcpy(&mreq.imr_interface,\n\t\t\t\t   &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,\n\t\t\t\t   sizeof(struct in_addr));\n\t\t} else\n\t\t\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,\n\t\t\t\t\t\t  &mreq, sizeof(mreq)));\n\t}\n/* end mcast_join2 */\n\n/* include mcast_join3 */\n#ifdef\tIPV6\n#ifndef\tIPV6_JOIN_GROUP\t\t/* APIv0 compatibility */\n#define\tIPV6_JOIN_GROUP\t\tIPV6_ADD_MEMBERSHIP\n#endif\n\tcase AF_INET6: {\n\t\tstruct ipv6_mreq\tmreq6;\n\n\t\tmemcpy(&mreq6.ipv6mr_multiaddr,\n\t\t\t   &((const struct sockaddr_in6 *) grp)->sin6_addr,\n\t\t\t   sizeof(struct in6_addr));\n\n\t\tif (ifindex > 0) {\n\t\t\tmreq6.ipv6mr_interface = ifindex;\n\t\t} else if (ifname != NULL) {\n\t\t\tif ( (mreq6.ipv6mr_interface = if_nametoindex(ifname)) == 0) {\n\t\t\t\terrno = ENXIO;\t/* i/f name not found */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t} else\n\t\t\tmreq6.ipv6mr_interface = 0;\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP,\n\t\t\t\t\t\t  &mreq6, sizeof(mreq6)));\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n#endif\n}\n/* end mcast_join3 */\n\nvoid\nMcast_join(int sockfd, const SA *grp, socklen_t grplen,\n\t\t   const char *ifname, u_int ifindex)\n{\n\tif (mcast_join(sockfd, grp, grplen, ifname, ifindex) < 0)\n\t\terr_sys(\"mcast_join error\");\n}\n\nint\nmcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen,\n\t\t\t\t\t\tconst char *ifname, u_int ifindex)\n{\n#ifdef MCAST_JOIN_SOURCE_GROUP\n\tstruct group_source_req req;\n\tif (ifindex > 0) {\n\t\treq.gsr_interface = ifindex;\n\t} else if (ifname != NULL) {\n\t\tif ( (req.gsr_interface = if_nametoindex(ifname)) == 0) {\n\t\t\terrno = ENXIO;\t/* i/f name not found */\n\t\t\treturn(-1);\n\t\t}\n\t} else\n\t\treq.gsr_interface = 0;\n\tif (grplen > sizeof(req.gsr_group) || srclen > sizeof(req.gsr_source)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tmemcpy(&req.gsr_group, grp, grplen);\n\tmemcpy(&req.gsr_source, src, srclen);\n\treturn (setsockopt(sockfd, family_to_level(grp->sa_family),\n\t\t\tMCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)));\n#else\n\tswitch (grp->sa_family) {\n#ifdef IP_ADD_SOURCE_MEMBERSHIP\n\tcase AF_INET: {\n\t\tstruct ip_mreq_source\tmreq;\n\t\tstruct ifreq\t\t\tifreq;\n\n\t\tmemcpy(&mreq.imr_multiaddr,\n\t\t\t   &((struct sockaddr_in *) grp)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmemcpy(&mreq.imr_sourceaddr,\n\t\t\t   &((struct sockaddr_in *) src)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\n\t\tif (ifindex > 0) {\n\t\t\tif (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {\n\t\t\t\terrno = ENXIO;\t/* i/f index not found */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t\tgoto doioctl;\n\t\t} else if (ifname != NULL) {\n\t\t\tstrncpy(ifreq.ifr_name, ifname, IFNAMSIZ);\ndoioctl:\n\t\t\tif (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0)\n\t\t\t\treturn(-1);\n\t\t\tmemcpy(&mreq.imr_interface,\n\t\t\t\t   &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,\n\t\t\t\t   sizeof(struct in_addr));\n\t\t} else\n\t\t\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,\n\t\t\t\t\t\t  &mreq, sizeof(mreq)));\n\t}\n#endif\n\n#ifdef\tIPV6\n\tcase AF_INET6: /* IPv6 source-specific API is MCAST_JOIN_SOURCE_GROUP */\n#endif\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n#endif\n}\n\nvoid\nMcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen,\n\t\t\t\t\t\tconst char *ifname, u_int ifindex)\n{\n\tif (mcast_join_source_group(sockfd, src, srclen, grp, grplen,\n\t\t\t\t\t\t\t\tifname, ifindex) < 0)\n\t\terr_sys(\"mcast_join_source_group error\");\n}\n\nint\nmcast_block_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen)\n{\n#ifdef MCAST_BLOCK_SOURCE\n\tstruct group_source_req req;\n\treq.gsr_interface = 0;\n\tif (grplen > sizeof(req.gsr_group) || srclen > sizeof(req.gsr_source)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tmemcpy(&req.gsr_group, grp, grplen);\n\tmemcpy(&req.gsr_source, src, srclen);\n\treturn (setsockopt(sockfd, family_to_level(grp->sa_family),\n\t\t\tMCAST_BLOCK_SOURCE, &req, sizeof(req)));\n#else\n\tswitch (grp->sa_family) {\n#ifdef IP_BLOCK_SOURCE\n\tcase AF_INET: {\n\t\tstruct ip_mreq_source\tmreq;\n\n\t\tmemcpy(&mreq.imr_multiaddr,\n\t\t\t   &((struct sockaddr_in *) grp)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmemcpy(&mreq.imr_sourceaddr,\n\t\t\t   &((struct sockaddr_in *) src)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_BLOCK_SOURCE,\n\t\t\t\t\t\t  &mreq, sizeof(mreq)));\n\t}\n#endif\n\n#ifdef\tIPV6\n\tcase AF_INET6: /* IPv6 source-specific API is MCAST_BLOCK_SOURCE */\n#endif\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n#endif\n}\n\nvoid\nMcast_block_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen)\n{\n\tif (mcast_block_source(sockfd, src, srclen, grp, grplen) < 0)\n\t\terr_sys(\"mcast_block_source error\");\n}\n\nint\nmcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen)\n{\n#ifdef MCAST_UNBLOCK_SOURCE\n\tstruct group_source_req req;\n\treq.gsr_interface = 0;\n\tif (grplen > sizeof(req.gsr_group) || srclen > sizeof(req.gsr_source)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tmemcpy(&req.gsr_group, grp, grplen);\n\tmemcpy(&req.gsr_source, src, srclen);\n\treturn (setsockopt(sockfd, family_to_level(grp->sa_family),\n\t\t\tMCAST_UNBLOCK_SOURCE, &req, sizeof(req)));\n#else\n\tswitch (grp->sa_family) {\n#ifdef IP_UNBLOCK_SOURCE\n\tcase AF_INET: {\n\t\tstruct ip_mreq_source\tmreq;\n\n\t\tmemcpy(&mreq.imr_multiaddr,\n\t\t\t   &((struct sockaddr_in *) grp)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmemcpy(&mreq.imr_sourceaddr,\n\t\t\t   &((struct sockaddr_in *) src)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_UNBLOCK_SOURCE,\n\t\t\t\t\t\t  &mreq, sizeof(mreq)));\n\t}\n#endif\n\n#ifdef\tIPV6\n\tcase AF_INET6: /* IPv6 source-specific API is MCAST_UNBLOCK_SOURCE */\n#endif\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n#endif\n}\n\nvoid\nMcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen)\n{\n\tif (mcast_unblock_source(sockfd, src, srclen, grp, grplen) < 0)\n\t\terr_sys(\"mcast_unblock_source error\");\n}\n"
  },
  {
    "path": "lib/mcast_join.lc",
    "content": "/* include mcast_join1 */\n#include    \"unp.h\"##  1 ##src/lib/mcast_join.c##\n#include    <net/if.h>##  2 ##src/lib/mcast_join.c##\n\nint##  3 ##src/lib/mcast_join.c##\nmcast_join(int sockfd, const SA *grp, socklen_t grplen,##  4 ##src/lib/mcast_join.c##\n           const char *ifname, u_int ifindex)##  5 ##src/lib/mcast_join.c##\n{##  6 ##src/lib/mcast_join.c##\n#ifdef MCAST_JOIN_GROUP##  7 ##src/lib/mcast_join.c##\n    struct group_req req;##  8 ##src/lib/mcast_join.c##\n    if (ifindex > 0) {##  9 ##src/lib/mcast_join.c##\n        req.gr_interface = ifindex;## 10 ##src/lib/mcast_join.c##\n    } else if (ifname != NULL) {## 11 ##src/lib/mcast_join.c##\n        if ((req.gr_interface = if_nametoindex(ifname)) == 0) {## 12 ##src/lib/mcast_join.c##\n            errno = ENXIO;      /* i/f name not found */## 13 ##src/lib/mcast_join.c##\n            return (-1);## 14 ##src/lib/mcast_join.c##\n        }## 15 ##src/lib/mcast_join.c##\n    } else## 16 ##src/lib/mcast_join.c##\n        req.gr_interface = 0;## 17 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_group, grp, grplen);## 18 ##src/lib/mcast_join.c##\n    return (setsockopt(sockfd, family_to_level(grp->sa_family),## 19 ##src/lib/mcast_join.c##\n                       MCAST_JOIN_GROUP, &req, sizeof(req)));## 20 ##src/lib/mcast_join.c##\n/* end mcast_join1 */\n#else## 21 ##src/lib/mcast_join.c##\n\n/* include mcast_join2 */\n    switch (grp->sa_family) {## 22 ##src/lib/mcast_join.c##\n    case AF_INET:{## 23 ##src/lib/mcast_join.c##\n            struct ip_mreq mreq;## 24 ##src/lib/mcast_join.c##\n            struct ifreq ifreq;## 25 ##src/lib/mcast_join.c##\n\n            memcpy(&mreq.imr_multiaddr,## 26 ##src/lib/mcast_join.c##\n                   &((const struct sockaddr_in *) grp)->sin_addr,## 27 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));## 28 ##src/lib/mcast_join.c##\n\n            if (ifindex > 0) {## 29 ##src/lib/mcast_join.c##\n                if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {## 30 ##src/lib/mcast_join.c##\n                    errno = ENXIO;  /* i/f index not found */## 31 ##src/lib/mcast_join.c##\n                    return (-1);## 32 ##src/lib/mcast_join.c##\n                }## 33 ##src/lib/mcast_join.c##\n                goto doioctl;## 34 ##src/lib/mcast_join.c##\n            } else if (ifname != NULL) {## 35 ##src/lib/mcast_join.c##\n                strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);## 36 ##src/lib/mcast_join.c##\n              doioctl:## 37 ##src/lib/mcast_join.c##\n                if (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0)## 38 ##src/lib/mcast_join.c##\n                    return (-1);## 39 ##src/lib/mcast_join.c##\n                memcpy(&mreq.imr_interface,## 40 ##src/lib/mcast_join.c##\n                       &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,## 41 ##src/lib/mcast_join.c##\n                       sizeof(struct in_addr));## 42 ##src/lib/mcast_join.c##\n            } else## 43 ##src/lib/mcast_join.c##\n                mreq.imr_interface.s_addr = htonl(INADDR_ANY);## 44 ##src/lib/mcast_join.c##\n\n            return (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,## 45 ##src/lib/mcast_join.c##\n                               &mreq, sizeof(mreq)));## 46 ##src/lib/mcast_join.c##\n        }## 47 ##src/lib/mcast_join.c##\n/* end mcast_join2 */\n\n/* include mcast_join3 */\n#ifdef  IPV6## 48 ##src/lib/mcast_join.c##\n#ifndef IPV6_JOIN_GROUP         /* APIv0 compatibility */## 49 ##src/lib/mcast_join.c##\n#define IPV6_JOIN_GROUP     IPV6_ADD_MEMBERSHIP## 50 ##src/lib/mcast_join.c##\n#endif## 51 ##src/lib/mcast_join.c##\n    case AF_INET6:{## 52 ##src/lib/mcast_join.c##\n            struct ipv6_mreq mreq6;## 53 ##src/lib/mcast_join.c##\n\n            memcpy(&mreq6.ipv6mr_multiaddr,## 54 ##src/lib/mcast_join.c##\n                   &((const struct sockaddr_in6 *) grp)->sin6_addr,## 55 ##src/lib/mcast_join.c##\n                   sizeof(struct in6_addr));## 56 ##src/lib/mcast_join.c##\n\n            if (ifindex > 0) {## 57 ##src/lib/mcast_join.c##\n                mreq6.ipv6mr_interface = ifindex;## 58 ##src/lib/mcast_join.c##\n            } else if (ifname != NULL) {## 59 ##src/lib/mcast_join.c##\n                if ((mreq6.ipv6mr_interface = if_nametoindex(ifname)) == 0) {## 60 ##src/lib/mcast_join.c##\n                    errno = ENXIO;  /* i/f name not found */## 61 ##src/lib/mcast_join.c##\n                    return (-1);## 62 ##src/lib/mcast_join.c##\n                }## 63 ##src/lib/mcast_join.c##\n            } else## 64 ##src/lib/mcast_join.c##\n                mreq6.ipv6mr_interface = 0;## 65 ##src/lib/mcast_join.c##\n\n            return (setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP,## 66 ##src/lib/mcast_join.c##\n                               &mreq6, sizeof(mreq6)));## 67 ##src/lib/mcast_join.c##\n        }## 68 ##src/lib/mcast_join.c##\n#endif## 69 ##src/lib/mcast_join.c##\n\n    default:## 70 ##src/lib/mcast_join.c##\n        errno = EPROTONOSUPPORT;## 71 ##src/lib/mcast_join.c##\n        return (-1);## 72 ##src/lib/mcast_join.c##\n    }## 73 ##src/lib/mcast_join.c##\n#endif## 74 ##src/lib/mcast_join.c##\n}## 75 ##src/lib/mcast_join.c##\n/* end mcast_join3 */\n\nvoid## 76 ##src/lib/mcast_join.c##\nMcast_join(int sockfd, const SA *grp, socklen_t grplen,## 77 ##src/lib/mcast_join.c##\n           const char *ifname, u_int ifindex)## 78 ##src/lib/mcast_join.c##\n{## 79 ##src/lib/mcast_join.c##\n    if (mcast_join(sockfd, grp, grplen, ifname, ifindex) < 0)## 80 ##src/lib/mcast_join.c##\n        err_sys(\"mcast_join error\");## 81 ##src/lib/mcast_join.c##\n}## 82 ##src/lib/mcast_join.c##\n\nint## 83 ##src/lib/mcast_join.c##\nmcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,## 84 ##src/lib/mcast_join.c##\n                        const SA *grp, socklen_t grplen,## 85 ##src/lib/mcast_join.c##\n                        const char *ifname, u_int ifindex)## 86 ##src/lib/mcast_join.c##\n{## 87 ##src/lib/mcast_join.c##\n#ifdef MCAST_JOIN_SOURCE_GROUP## 88 ##src/lib/mcast_join.c##\n    struct group_source_req req;## 89 ##src/lib/mcast_join.c##\n    if (ifindex > 0) {## 90 ##src/lib/mcast_join.c##\n        req.gr_interface = ifindex;## 91 ##src/lib/mcast_join.c##\n    } else if (ifname != NULL) {## 92 ##src/lib/mcast_join.c##\n        if ((req.gr_interface = if_nametoindex(ifname)) == 0) {## 93 ##src/lib/mcast_join.c##\n            errno = ENXIO;      /* i/f name not found */## 94 ##src/lib/mcast_join.c##\n            return (-1);## 95 ##src/lib/mcast_join.c##\n        }## 96 ##src/lib/mcast_join.c##\n    } else## 97 ##src/lib/mcast_join.c##\n        req.gr_interface = 0;## 98 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_group, grp, grplen);## 99 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_src, src, srclen);##100 ##src/lib/mcast_join.c##\n    return (setsockopt(sockfd, family_to_level(grp->sa_family),##101 ##src/lib/mcast_join.c##\n                       MCAST_JOIN_SOURCE_GROUP, &req, sizeof(req)));##102 ##src/lib/mcast_join.c##\n#else##103 ##src/lib/mcast_join.c##\n    switch (grp->sa_family) {##104 ##src/lib/mcast_join.c##\n#ifdef IP_ADD_SOURCE_MEMBERSHIP##105 ##src/lib/mcast_join.c##\n    case AF_INET:{##106 ##src/lib/mcast_join.c##\n            struct ip_mreq_source mreq;##107 ##src/lib/mcast_join.c##\n            struct ifreq ifreq;##108 ##src/lib/mcast_join.c##\n\n            memcpy(&mreq.imr_multiaddr,##109 ##src/lib/mcast_join.c##\n                   &((struct sockaddr_in *) grp)->sin_addr,##110 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));##111 ##src/lib/mcast_join.c##\n            memcpy(&mreq.imr_sourceaddr,##112 ##src/lib/mcast_join.c##\n                   &((struct sockaddr_in *) src)->sin_addr,##113 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));##114 ##src/lib/mcast_join.c##\n\n            if (ifindex > 0) {##115 ##src/lib/mcast_join.c##\n                if (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {##116 ##src/lib/mcast_join.c##\n                    errno = ENXIO;  /* i/f index not found */##117 ##src/lib/mcast_join.c##\n                    return (-1);##118 ##src/lib/mcast_join.c##\n                }##119 ##src/lib/mcast_join.c##\n                goto doioctl;##120 ##src/lib/mcast_join.c##\n            } else if (ifname != NULL) {##121 ##src/lib/mcast_join.c##\n                strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);##122 ##src/lib/mcast_join.c##\n              doioctl:##123 ##src/lib/mcast_join.c##\n                if (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0)##124 ##src/lib/mcast_join.c##\n                    return (-1);##125 ##src/lib/mcast_join.c##\n                memcpy(&mreq.imr_interface,##126 ##src/lib/mcast_join.c##\n                       &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,##127 ##src/lib/mcast_join.c##\n                       sizeof(struct in_addr));##128 ##src/lib/mcast_join.c##\n            } else##129 ##src/lib/mcast_join.c##\n                mreq.imr_interface.s_addr = htonl(INADDR_ANY);##130 ##src/lib/mcast_join.c##\n\n            return (setsockopt(sockfd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,##131 ##src/lib/mcast_join.c##\n                               &mreq, sizeof(mreq)));##132 ##src/lib/mcast_join.c##\n        }##133 ##src/lib/mcast_join.c##\n#endif##134 ##src/lib/mcast_join.c##\n\n#ifdef  IPV6##135 ##src/lib/mcast_join.c##\n    case AF_INET6:              /* IPv6 source-specific API is MCAST_JOIN_SOURCE_GROUP */##136 ##src/lib/mcast_join.c##\n#endif##137 ##src/lib/mcast_join.c##\n    default:##138 ##src/lib/mcast_join.c##\n        errno = EPROTONOSUPPORT;##139 ##src/lib/mcast_join.c##\n        return (-1);##140 ##src/lib/mcast_join.c##\n    }##141 ##src/lib/mcast_join.c##\n#endif##142 ##src/lib/mcast_join.c##\n}##143 ##src/lib/mcast_join.c##\n\nvoid##144 ##src/lib/mcast_join.c##\nMcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,##145 ##src/lib/mcast_join.c##\n                        const SA *grp, socklen_t grplen,##146 ##src/lib/mcast_join.c##\n                        const char *ifname, u_int ifindex)##147 ##src/lib/mcast_join.c##\n{##148 ##src/lib/mcast_join.c##\n    if (mcast_join_source_group(sockfd, src, srclen, grp, grplen,##149 ##src/lib/mcast_join.c##\n                                ifname, ifindex) < 0)##150 ##src/lib/mcast_join.c##\n        err_sys(\"mcast_join_source_group error\");##151 ##src/lib/mcast_join.c##\n}##152 ##src/lib/mcast_join.c##\n\nint##153 ##src/lib/mcast_join.c##\nmcast_block_source(int sockfd, const SA *src, socklen_t srclen,##154 ##src/lib/mcast_join.c##\n                   const SA *grp, socklen_t grplen)##155 ##src/lib/mcast_join.c##\n{##156 ##src/lib/mcast_join.c##\n#ifdef MCAST_BLOCK_SOURCE##157 ##src/lib/mcast_join.c##\n    struct group_source_req req;##158 ##src/lib/mcast_join.c##\n    req.gr_interface = 0;##159 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_group, grp, grplen);##160 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_src, src, srclen);##161 ##src/lib/mcast_join.c##\n    return (setsockopt(sockfd, family_to_level(grp->sa_family),##162 ##src/lib/mcast_join.c##\n                       MCAST_BLOCK_SOURCE, &req, sizeof(req)));##163 ##src/lib/mcast_join.c##\n#else##164 ##src/lib/mcast_join.c##\n    switch (grp->sa_family) {##165 ##src/lib/mcast_join.c##\n#ifdef IP_BLOCK_SOURCE##166 ##src/lib/mcast_join.c##\n    case AF_INET:{##167 ##src/lib/mcast_join.c##\n            struct ip_mreq_source mreq;##168 ##src/lib/mcast_join.c##\n\n            memcpy(&mreq.imr_multiaddr,##169 ##src/lib/mcast_join.c##\n                   &((struct sockaddr_in *) grp)->sin_addr,##170 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));##171 ##src/lib/mcast_join.c##\n            memcpy(&mreq.imr_sourceaddr,##172 ##src/lib/mcast_join.c##\n                   &((struct sockaddr_in *) src)->sin_addr,##173 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));##174 ##src/lib/mcast_join.c##\n            mreq.imr_interface.s_addr = htonl(INADDR_ANY);##175 ##src/lib/mcast_join.c##\n\n            return (setsockopt(sockfd, IPPROTO_IP, IP_BLOCK_SOURCE,##176 ##src/lib/mcast_join.c##\n                               &mreq, sizeof(mreq)));##177 ##src/lib/mcast_join.c##\n        }##178 ##src/lib/mcast_join.c##\n#endif##179 ##src/lib/mcast_join.c##\n\n#ifdef  IPV6##180 ##src/lib/mcast_join.c##\n    case AF_INET6:              /* IPv6 source-specific API is MCAST_BLOCK_SOURCE */##181 ##src/lib/mcast_join.c##\n#endif##182 ##src/lib/mcast_join.c##\n    default:##183 ##src/lib/mcast_join.c##\n        errno = EPROTONOSUPPORT;##184 ##src/lib/mcast_join.c##\n        return (-1);##185 ##src/lib/mcast_join.c##\n    }##186 ##src/lib/mcast_join.c##\n#endif##187 ##src/lib/mcast_join.c##\n}##188 ##src/lib/mcast_join.c##\n\nvoid##189 ##src/lib/mcast_join.c##\nMcast_block_source(int sockfd, const SA *src, socklen_t srclen,##190 ##src/lib/mcast_join.c##\n                   const SA *grp, socklen_t grplen)##191 ##src/lib/mcast_join.c##\n{##192 ##src/lib/mcast_join.c##\n    if (mcast_block_source(sockfd, src, srclen, grp, grplen) < 0)##193 ##src/lib/mcast_join.c##\n        err_sys(\"mcast_block_source error\");##194 ##src/lib/mcast_join.c##\n}##195 ##src/lib/mcast_join.c##\n\nint##196 ##src/lib/mcast_join.c##\nmcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,##197 ##src/lib/mcast_join.c##\n                     const SA *grp, socklen_t grplen)##198 ##src/lib/mcast_join.c##\n{##199 ##src/lib/mcast_join.c##\n#ifdef MCAST_UNBLOCK_SOURCE##200 ##src/lib/mcast_join.c##\n    struct group_source_req req;##201 ##src/lib/mcast_join.c##\n    req.gr_interface = 0;##202 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_group, grp, grplen);##203 ##src/lib/mcast_join.c##\n    memcpy(&req.gr_src, src, srclen);##204 ##src/lib/mcast_join.c##\n    return (setsockopt(sockfd, family_to_level(grp->sa_family),##205 ##src/lib/mcast_join.c##\n                       MCAST_UNBLOCK_SOURCE, &req, sizeof(req)));##206 ##src/lib/mcast_join.c##\n#else##207 ##src/lib/mcast_join.c##\n    switch (grp->sa_family) {##208 ##src/lib/mcast_join.c##\n#ifdef IP_UNBLOCK_SOURCE##209 ##src/lib/mcast_join.c##\n    case AF_INET:{##210 ##src/lib/mcast_join.c##\n            struct ip_mreq_source mreq;##211 ##src/lib/mcast_join.c##\n\n            memcpy(&mreq.imr_multiaddr,##212 ##src/lib/mcast_join.c##\n                   &((struct sockaddr_in *) grp)->sin_addr,##213 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));##214 ##src/lib/mcast_join.c##\n            memcpy(&mreq.imr_sourceaddr,##215 ##src/lib/mcast_join.c##\n                   &((struct sockaddr_in *) src)->sin_addr,##216 ##src/lib/mcast_join.c##\n                   sizeof(struct in_addr));##217 ##src/lib/mcast_join.c##\n            mreq.imr_interface.s_addr = htonl(INADDR_ANY);##218 ##src/lib/mcast_join.c##\n\n            return (setsockopt(sockfd, IPPROTO_IP, IP_UNBLOCK_SOURCE,##219 ##src/lib/mcast_join.c##\n                               &mreq, sizeof(mreq)));##220 ##src/lib/mcast_join.c##\n        }##221 ##src/lib/mcast_join.c##\n#endif##222 ##src/lib/mcast_join.c##\n\n#ifdef  IPV6##223 ##src/lib/mcast_join.c##\n    case AF_INET6:              /* IPv6 source-specific API is MCAST_UNBLOCK_SOURCE */##224 ##src/lib/mcast_join.c##\n#endif##225 ##src/lib/mcast_join.c##\n    default:##226 ##src/lib/mcast_join.c##\n        errno = EPROTONOSUPPORT;##227 ##src/lib/mcast_join.c##\n        return (-1);##228 ##src/lib/mcast_join.c##\n    }##229 ##src/lib/mcast_join.c##\n#endif##230 ##src/lib/mcast_join.c##\n}##231 ##src/lib/mcast_join.c##\n\nvoid##232 ##src/lib/mcast_join.c##\nMcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,##233 ##src/lib/mcast_join.c##\n                     const SA *grp, socklen_t grplen)##234 ##src/lib/mcast_join.c##\n{##235 ##src/lib/mcast_join.c##\n    if (mcast_unblock_source(sockfd, src, srclen, grp, grplen) < 0)##236 ##src/lib/mcast_join.c##\n        err_sys(\"mcast_unblock_source error\");##237 ##src/lib/mcast_join.c##\n}##238 ##src/lib/mcast_join.c##\n"
  },
  {
    "path": "lib/mcast_leave.c",
    "content": "#include\t\"unp.h\"\n\nint\nmcast_leave(int sockfd, const SA *grp, socklen_t grplen)\n{\n#ifdef MCAST_JOIN_GROUP\n\tstruct group_req req;\n\treq.gr_interface = 0;\n\tif (grplen > sizeof(req.gr_group)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tmemcpy(&req.gr_group, grp, grplen);\n\treturn (setsockopt(sockfd, family_to_level(grp->sa_family),\n\t\t\tMCAST_LEAVE_GROUP, &req, sizeof(req)));\n#else\n\tswitch (grp->sa_family) {\n\tcase AF_INET: {\n\t\tstruct ip_mreq\t\tmreq;\n\n\t\tmemcpy(&mreq.imr_multiaddr,\n\t\t\t   &((const struct sockaddr_in *) grp)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP,\n\t\t\t\t\t\t  &mreq, sizeof(mreq)));\n\t}\n\n#ifdef\tIPV6\n#ifndef\tIPV6_LEAVE_GROUP\t/* APIv0 compatibility */\n#define\tIPV6_LEAVE_GROUP\tIPV6_DROP_MEMBERSHIP\n#endif\n\tcase AF_INET6: {\n\t\tstruct ipv6_mreq\tmreq6;\n\n\t\tmemcpy(&mreq6.ipv6mr_multiaddr,\n\t\t\t   &((const struct sockaddr_in6 *) grp)->sin6_addr,\n\t\t\t   sizeof(struct in6_addr));\n\t\tmreq6.ipv6mr_interface = 0;\n\t\treturn(setsockopt(sockfd, IPPROTO_IPV6, IPV6_LEAVE_GROUP,\n\t\t\t\t\t\t  &mreq6, sizeof(mreq6)));\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n#endif\n}\n\nvoid\nMcast_leave(int sockfd, const SA *grp, socklen_t grplen)\n{\n\tif (mcast_leave(sockfd, grp, grplen) < 0)\n\t\terr_sys(\"mcast_leave error\");\n}\n\nint\nmcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen)\n{\n#ifdef MCAST_LEAVE_SOURCE_GROUP\n\tstruct group_source_req req;\n\treq.gsr_interface = 0;\n\tif (grplen > sizeof(req.gsr_group) || srclen > sizeof(req.gsr_source)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tmemcpy(&req.gsr_group, grp, grplen);\n\tmemcpy(&req.gsr_source, src, srclen);\n\treturn (setsockopt(sockfd, family_to_level(grp->sa_family),\n\t\t\tMCAST_LEAVE_SOURCE_GROUP, &req, sizeof(req)));\n#else\n\tswitch (grp->sa_family) {\n#ifdef IP_DROP_SOURCE_MEMBERSHIP\n\tcase AF_INET: {\n\t\tstruct ip_mreq_source\tmreq;\n\n\t\tmemcpy(&mreq.imr_multiaddr,\n\t\t\t   &((struct sockaddr_in *) grp)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmemcpy(&mreq.imr_sourceaddr,\n\t\t\t   &((struct sockaddr_in *) src)->sin_addr,\n\t\t\t   sizeof(struct in_addr));\n\t\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP,\n\t\t\t\t\t\t  &mreq, sizeof(mreq)));\n\t}\n#endif\n\n#ifdef\tIPV6\n\tcase AF_INET6: /* IPv6 source-specific API is MCAST_LEAVE_SOURCE_GROUP */\n#endif\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n#endif\n}\n\nvoid\nMcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\tconst SA *grp, socklen_t grplen)\n{\n\tif (mcast_leave_source_group(sockfd, src, srclen, grp, grplen) < 0)\n\t\terr_sys(\"mcast_leave_source_group error\");\n}\n"
  },
  {
    "path": "lib/mcast_set_if.c",
    "content": "#include\t\"unp.h\"\n#include\t<net/if.h>\n\nint\nmcast_set_if(int sockfd, const char *ifname, u_int ifindex)\n{\n\tswitch (sockfd_to_family(sockfd)) {\n\tcase AF_INET: {\n\t\tstruct in_addr\t\tinaddr;\n\t\tstruct ifreq\t\tifreq;\n\n\t\tif (ifindex > 0) {\n\t\t\tif (if_indextoname(ifindex, ifreq.ifr_name) == NULL) {\n\t\t\t\terrno = ENXIO;\t/* i/f index not found */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t\tgoto doioctl;\n\t\t} else if (ifname != NULL) {\n\t\t\tstrncpy(ifreq.ifr_name, ifname, IFNAMSIZ);\ndoioctl:\n\t\t\tif (ioctl(sockfd, SIOCGIFADDR, &ifreq) < 0)\n\t\t\t\treturn(-1);\n\t\t\tmemcpy(&inaddr,\n\t\t\t\t   &((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr,\n\t\t\t\t   sizeof(struct in_addr));\n\t\t} else\n\t\t\tinaddr.s_addr = htonl(INADDR_ANY);\t/* remove prev. set default */\n\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF,\n\t\t\t\t\t\t  &inaddr, sizeof(struct in_addr)));\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tu_int\tidx;\n\n\t\tif ( (idx = ifindex) == 0) {\n\t\t\tif (ifname == NULL) {\n\t\t\t\terrno = EINVAL;\t/* must supply either index or name */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t\tif ( (idx = if_nametoindex(ifname)) == 0) {\n\t\t\t\terrno = ENXIO;\t/* i/f name not found */\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t}\n\t\treturn(setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_IF,\n\t\t\t\t\t\t  &idx, sizeof(idx)));\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n}\n\nvoid\nMcast_set_if(int sockfd, const char *ifname, u_int ifindex)\n{\n\tif (mcast_set_if(sockfd, ifname, ifindex) < 0)\n\t\terr_sys(\"mcast_set_if error\");\n}\n"
  },
  {
    "path": "lib/mcast_set_loop.c",
    "content": "/* include mcast_set_loop */\n#include\t\"unp.h\"\n\nint\nmcast_set_loop(int sockfd, int onoff)\n{\n\tswitch (sockfd_to_family(sockfd)) {\n\tcase AF_INET: {\n\t\tu_char\t\tflag;\n\n\t\tflag = onoff;\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP,\n\t\t\t\t\t\t  &flag, sizeof(flag)));\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tu_int\t\tflag;\n\n\t\tflag = onoff;\n\t\treturn(setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,\n\t\t\t\t\t\t  &flag, sizeof(flag)));\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n}\n/* end mcast_set_loop */\n\nvoid\nMcast_set_loop(int sockfd, int onoff)\n{\n\tif (mcast_set_loop(sockfd, onoff) < 0)\n\t\terr_sys(\"mcast_set_loop error\");\n}\n"
  },
  {
    "path": "lib/mcast_set_loop.lc",
    "content": "/* include mcast_set_loop */\n#include    \"unp.h\"##  1 ##src/lib/mcast_set_loop.c##\n\nint##  2 ##src/lib/mcast_set_loop.c##\nmcast_set_loop(int sockfd, int onoff)##  3 ##src/lib/mcast_set_loop.c##\n{##  4 ##src/lib/mcast_set_loop.c##\n    switch (sockfd_to_family(sockfd)) {##  5 ##src/lib/mcast_set_loop.c##\n    case AF_INET:{##  6 ##src/lib/mcast_set_loop.c##\n            u_char  flag;##  7 ##src/lib/mcast_set_loop.c##\n\n            flag = onoff;##  8 ##src/lib/mcast_set_loop.c##\n            return (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP,##  9 ##src/lib/mcast_set_loop.c##\n                               &flag, sizeof(flag)));## 10 ##src/lib/mcast_set_loop.c##\n        }## 11 ##src/lib/mcast_set_loop.c##\n\n#ifdef  IPV6## 12 ##src/lib/mcast_set_loop.c##\n    case AF_INET6:{## 13 ##src/lib/mcast_set_loop.c##\n            u_int   flag;## 14 ##src/lib/mcast_set_loop.c##\n\n            flag = onoff;## 15 ##src/lib/mcast_set_loop.c##\n            return (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,## 16 ##src/lib/mcast_set_loop.c##\n                               &flag, sizeof(flag)));## 17 ##src/lib/mcast_set_loop.c##\n        }## 18 ##src/lib/mcast_set_loop.c##\n#endif## 19 ##src/lib/mcast_set_loop.c##\n\n    default:## 20 ##src/lib/mcast_set_loop.c##\n        errno = EPROTONOSUPPORT;## 21 ##src/lib/mcast_set_loop.c##\n        return (-1);## 22 ##src/lib/mcast_set_loop.c##\n    }## 23 ##src/lib/mcast_set_loop.c##\n}## 24 ##src/lib/mcast_set_loop.c##\n/* end mcast_set_loop */\n\nvoid## 25 ##src/lib/mcast_set_loop.c##\nMcast_set_loop(int sockfd, int onoff)## 26 ##src/lib/mcast_set_loop.c##\n{## 27 ##src/lib/mcast_set_loop.c##\n    if (mcast_set_loop(sockfd, onoff) < 0)## 28 ##src/lib/mcast_set_loop.c##\n        err_sys(\"mcast_set_loop error\");## 29 ##src/lib/mcast_set_loop.c##\n}## 30 ##src/lib/mcast_set_loop.c##\n"
  },
  {
    "path": "lib/mcast_set_ttl.c",
    "content": "#include\t\"unp.h\"\n\nint\nmcast_set_ttl(int sockfd, int val)\n{\n\tswitch (sockfd_to_family(sockfd)) {\n\tcase AF_INET: {\n\t\tu_char\t\tttl;\n\n\t\tttl = val;\n\t\treturn(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL,\n\t\t\t\t\t\t  &ttl, sizeof(ttl)));\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tint\t\thop;\n\n\t\thop = val;\n\t\treturn(setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,\n\t\t\t\t\t\t  &hop, sizeof(hop)));\n\t}\n#endif\n\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn(-1);\n\t}\n}\n\nvoid\nMcast_set_ttl(int sockfd, int val)\n{\n\tif (mcast_set_ttl(sockfd, val) < 0)\n\t\terr_sys(\"mcast_set_ttl error\");\n}\n"
  },
  {
    "path": "lib/my_addrs.c",
    "content": "/* include my_addrs */\n#include\t\"unp.h\"\n#include\t<sys/utsname.h>\n\nchar **\nmy_addrs(int *addrtype)\n{\n\tstruct hostent\t*hptr;\n\tstruct utsname\tmyname;\n\n\tif (uname(&myname) < 0)\n\t\treturn(NULL);\n\n\tif ( (hptr = gethostbyname(myname.nodename)) == NULL)\n\t\treturn(NULL);\n\n\t*addrtype = hptr->h_addrtype;\n\treturn(hptr->h_addr_list);\n}\n/* end my_addrs */\n\nchar **\nMy_addrs(int *pfamily)\n{\n\tchar\t**pptr;\n\n\tif ( (pptr = my_addrs(pfamily)) == NULL)\n\t\terr_sys(\"my_addrs error\");\n\treturn(pptr);\n}\n"
  },
  {
    "path": "lib/my_addrs.lc",
    "content": "/* include my_addrs */\n#include    \"unp.h\"##  1 ##src/lib/my_addrs.c##\n#include    <sys/utsname.h>##  2 ##src/lib/my_addrs.c##\n\nchar  **##  3 ##src/lib/my_addrs.c##\nmy_addrs(int *addrtype)##  4 ##src/lib/my_addrs.c##\n{##  5 ##src/lib/my_addrs.c##\n    struct hostent *hptr;##  6 ##src/lib/my_addrs.c##\n    struct utsname myname;##  7 ##src/lib/my_addrs.c##\n\n    if (uname(&myname) < 0)##  8 ##src/lib/my_addrs.c##\n        return (NULL);##  9 ##src/lib/my_addrs.c##\n\n    if ((hptr = gethostbyname(myname.nodename)) == NULL)## 10 ##src/lib/my_addrs.c##\n        return (NULL);## 11 ##src/lib/my_addrs.c##\n\n    *addrtype = hptr->h_addrtype;## 12 ##src/lib/my_addrs.c##\n    return (hptr->h_addr_list);## 13 ##src/lib/my_addrs.c##\n}## 14 ##src/lib/my_addrs.c##\n/* end my_addrs */\n\nchar  **## 15 ##src/lib/my_addrs.c##\nMy_addrs(int *pfamily)## 16 ##src/lib/my_addrs.c##\n{## 17 ##src/lib/my_addrs.c##\n    char  **pptr;## 18 ##src/lib/my_addrs.c##\n\n    if ((pptr = my_addrs(pfamily)) == NULL)## 19 ##src/lib/my_addrs.c##\n        err_sys(\"my_addrs error\");## 20 ##src/lib/my_addrs.c##\n    return (pptr);## 21 ##src/lib/my_addrs.c##\n}## 22 ##src/lib/my_addrs.c##\n"
  },
  {
    "path": "lib/pselect.c",
    "content": "/*\n * This is *not* a complete implementation of the Posix.1g pselect()\n * function.  For atomicity this must be implemented within the kernel,\n * with the sigprocmask/select/sigprocmask performed as a single atomic\n * operation.\n * This is just a quick hack to allow simple programs using it to compile.\n * Using such programs with this hack will probably lead to race conditions.\n */\n/* include pselect */\n#include\t\"unp.h\"\n\nint\npselect(int nfds, fd_set *rset, fd_set *wset, fd_set *xset,\n\t\tconst struct timespec *ts, const sigset_t *sigmask)\n{\n\tint\t\t\t\tn;\n\tstruct timeval\ttv;\n\tsigset_t\t\tsavemask;\n\n\tif (ts != NULL) {\n\t\ttv.tv_sec = ts->tv_sec;\n\t\ttv.tv_usec = ts->tv_nsec / 1000;\t/* nanosec -> microsec */\n\t}\n\n\tsigprocmask(SIG_SETMASK, sigmask, &savemask);\t/* caller's mask */\n\tn = select(nfds, rset, wset, xset, (ts == NULL) ? NULL : &tv);\n\tsigprocmask(SIG_SETMASK, &savemask, NULL);\t\t/* restore mask */\n\n\treturn(n);\n}\n/* end pselect */\n"
  },
  {
    "path": "lib/pselect.lc",
    "content": "/*##  1 ##src/lib/pselect.c##\n * This is *not* a complete implementation of the Posix.1g pselect()##  2 ##src/lib/pselect.c##\n * function.  For atomicity this must be implemented within the kernel,##  3 ##src/lib/pselect.c##\n * with the sigprocmask/select/sigprocmask performed as a single atomic##  4 ##src/lib/pselect.c##\n * operation.##  5 ##src/lib/pselect.c##\n * This is just a quick hack to allow simple programs using it to compile.##  6 ##src/lib/pselect.c##\n * Using such programs with this hack will probably lead to race conditions.##  7 ##src/lib/pselect.c##\n */##  8 ##src/lib/pselect.c##\n/* include pselect */\n#include    \"unp.h\"##  9 ##src/lib/pselect.c##\n\nint## 10 ##src/lib/pselect.c##\npselect(int nfds, fd_set *rset, fd_set *wset, fd_set *xset,## 11 ##src/lib/pselect.c##\n        const struct timespec *ts, const sigset_t *sigmask)## 12 ##src/lib/pselect.c##\n{## 13 ##src/lib/pselect.c##\n    int     n;## 14 ##src/lib/pselect.c##\n    struct timeval tv;## 15 ##src/lib/pselect.c##\n    sigset_t savemask;## 16 ##src/lib/pselect.c##\n\n    if (ts != NULL) {## 17 ##src/lib/pselect.c##\n        tv.tv_sec = ts->tv_sec;## 18 ##src/lib/pselect.c##\n        tv.tv_usec = ts->tv_nsec / 1000;    /* nanosec -> microsec */## 19 ##src/lib/pselect.c##\n    }## 20 ##src/lib/pselect.c##\n\n    sigprocmask(SIG_SETMASK, sigmask, &savemask);   /* caller's mask */## 21 ##src/lib/pselect.c##\n    n = select(nfds, rset, wset, xset, (ts == NULL) ? NULL : &tv);## 22 ##src/lib/pselect.c##\n    sigprocmask(SIG_SETMASK, &savemask, NULL);  /* restore mask */## 23 ##src/lib/pselect.c##\n\n    return (n);## 24 ##src/lib/pselect.c##\n}## 25 ##src/lib/pselect.c##\n/* end pselect */\n"
  },
  {
    "path": "lib/read_fd.c",
    "content": "/* include read_fd */\n#include\t\"unp.h\"\n\nssize_t\nread_fd(int fd, void *ptr, size_t nbytes, int *recvfd)\n{\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov[1];\n\tssize_t\t\t\tn;\n\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n\tunion {\n\t  struct cmsghdr\tcm;\n\t  char\t\t\t\tcontrol[CMSG_SPACE(sizeof(int))];\n\t} control_un;\n\tstruct cmsghdr\t*cmptr;\n\n\tmsg.msg_control = control_un.control;\n\tmsg.msg_controllen = sizeof(control_un.control);\n#else\n\tint\t\t\t\tnewfd;\n\n\tmsg.msg_accrights = (caddr_t) &newfd;\n\tmsg.msg_accrightslen = sizeof(int);\n#endif\n\n\tmsg.msg_name = NULL;\n\tmsg.msg_namelen = 0;\n\n\tiov[0].iov_base = ptr;\n\tiov[0].iov_len = nbytes;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\n\tif ( (n = recvmsg(fd, &msg, 0)) <= 0)\n\t\treturn(n);\n\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n\tif ( (cmptr = CMSG_FIRSTHDR(&msg)) != NULL &&\n\t    cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {\n\t\tif (cmptr->cmsg_level != SOL_SOCKET)\n\t\t\terr_quit(\"control level != SOL_SOCKET\");\n\t\tif (cmptr->cmsg_type != SCM_RIGHTS)\n\t\t\terr_quit(\"control type != SCM_RIGHTS\");\n\t\t*recvfd = *((int *) CMSG_DATA(cmptr));\n\t} else\n\t\t*recvfd = -1;\t\t/* descriptor was not passed */\n#else\n/* *INDENT-OFF* */\n\tif (msg.msg_accrightslen == sizeof(int))\n\t\t*recvfd = newfd;\n\telse\n\t\t*recvfd = -1;\t\t/* descriptor was not passed */\n/* *INDENT-ON* */\n#endif\n\n\treturn(n);\n}\n/* end read_fd */\n\nssize_t\nRead_fd(int fd, void *ptr, size_t nbytes, int *recvfd)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = read_fd(fd, ptr, nbytes, recvfd)) < 0)\n\t\terr_sys(\"read_fd error\");\n\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/read_fd.lc",
    "content": "/* include read_fd */\n#include    \"unp.h\"##  1 ##src/lib/read_fd.c##\n\nssize_t##  2 ##src/lib/read_fd.c##\nread_fd(int fd, void *ptr, size_t nbytes, int *recvfd)##  3 ##src/lib/read_fd.c##\n{##  4 ##src/lib/read_fd.c##\n    struct msghdr msg;##  5 ##src/lib/read_fd.c##\n    struct iovec iov[1];##  6 ##src/lib/read_fd.c##\n    ssize_t n;##  7 ##src/lib/read_fd.c##\n\n#ifdef  HAVE_MSGHDR_MSG_CONTROL##  8 ##src/lib/read_fd.c##\n    union {##  9 ##src/lib/read_fd.c##\n        struct cmsghdr cm;## 10 ##src/lib/read_fd.c##\n        char    control[CMSG_SPACE(sizeof(int))];## 11 ##src/lib/read_fd.c##\n    } control_un;## 12 ##src/lib/read_fd.c##\n    struct cmsghdr *cmptr;## 13 ##src/lib/read_fd.c##\n\n    msg.msg_control = control_un.control;## 14 ##src/lib/read_fd.c##\n    msg.msg_controllen = sizeof(control_un.control);## 15 ##src/lib/read_fd.c##\n#else## 16 ##src/lib/read_fd.c##\n    int     newfd;## 17 ##src/lib/read_fd.c##\n\n    msg.msg_accrights = (caddr_t) & newfd;## 18 ##src/lib/read_fd.c##\n    msg.msg_accrightslen = sizeof(int);## 19 ##src/lib/read_fd.c##\n#endif## 20 ##src/lib/read_fd.c##\n\n    msg.msg_name = NULL;## 21 ##src/lib/read_fd.c##\n    msg.msg_namelen = 0;## 22 ##src/lib/read_fd.c##\n\n    iov[0].iov_base = ptr;## 23 ##src/lib/read_fd.c##\n    iov[0].iov_len = nbytes;## 24 ##src/lib/read_fd.c##\n    msg.msg_iov = iov;## 25 ##src/lib/read_fd.c##\n    msg.msg_iovlen = 1;## 26 ##src/lib/read_fd.c##\n\n    if ((n = recvmsg(fd, &msg, 0)) <= 0)## 27 ##src/lib/read_fd.c##\n        return (n);## 28 ##src/lib/read_fd.c##\n\n#ifdef  HAVE_MSGHDR_MSG_CONTROL## 29 ##src/lib/read_fd.c##\n    if ((cmptr = CMSG_FIRSTHDR(&msg)) != NULL &&## 30 ##src/lib/read_fd.c##\n        cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {## 31 ##src/lib/read_fd.c##\n        if (cmptr->cmsg_level != SOL_SOCKET)## 32 ##src/lib/read_fd.c##\n            err_quit(\"control level != SOL_SOCKET\");## 33 ##src/lib/read_fd.c##\n        if (cmptr->cmsg_type != SCM_RIGHTS)## 34 ##src/lib/read_fd.c##\n            err_quit(\"control type != SCM_RIGHTS\");## 35 ##src/lib/read_fd.c##\n        *recvfd = *((int *) CMSG_DATA(cmptr));## 36 ##src/lib/read_fd.c##\n    } else## 37 ##src/lib/read_fd.c##\n        *recvfd = -1;           /* descriptor was not passed */## 38 ##src/lib/read_fd.c##\n#else## 39 ##src/lib/read_fd.c##\n    if (msg.msg_accrightslen == sizeof(int))## 40 ##src/lib/read_fd.c##\n        *recvfd = newfd;## 41 ##src/lib/read_fd.c##\n    else## 42 ##src/lib/read_fd.c##\n        *recvfd = -1;       /* descriptor was not passed */## 43 ##src/lib/read_fd.c##\n#endif## 44 ##src/lib/read_fd.c##\n\n    return (n);## 45 ##src/lib/read_fd.c##\n}## 46 ##src/lib/read_fd.c##\n/* end read_fd */\n\nssize_t## 47 ##src/lib/read_fd.c##\nRead_fd(int fd, void *ptr, size_t nbytes, int *recvfd)## 48 ##src/lib/read_fd.c##\n{## 49 ##src/lib/read_fd.c##\n    ssize_t n;## 50 ##src/lib/read_fd.c##\n\n    if ((n = read_fd(fd, ptr, nbytes, recvfd)) < 0)## 51 ##src/lib/read_fd.c##\n        err_sys(\"read_fd error\");## 52 ##src/lib/read_fd.c##\n\n    return (n);## 53 ##src/lib/read_fd.c##\n}## 54 ##src/lib/read_fd.c##\n"
  },
  {
    "path": "lib/readable_timeo.c",
    "content": "/* include readable_timeo */\n#include\t\"unp.h\"\n\nint\nreadable_timeo(int fd, int sec)\n{\n\tfd_set\t\t\trset;\n\tstruct timeval\ttv;\n\n\tFD_ZERO(&rset);\n\tFD_SET(fd, &rset);\n\n\ttv.tv_sec = sec;\n\ttv.tv_usec = 0;\n\n\treturn(select(fd+1, &rset, NULL, NULL, &tv));\n\t\t/* 4> 0 if descriptor is readable */\n}\n/* end readable_timeo */\n\nint\nReadable_timeo(int fd, int sec)\n{\n\tint\t\tn;\n\n\tif ( (n = readable_timeo(fd, sec)) < 0)\n\t\terr_sys(\"readable_timeo error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/readable_timeo.lc",
    "content": "/* include readable_timeo */\n#include    \"unp.h\"##  1 ##src/lib/readable_timeo.c##\n\nint##  2 ##src/lib/readable_timeo.c##\nreadable_timeo(int fd, int sec)##  3 ##src/lib/readable_timeo.c##\n{##  4 ##src/lib/readable_timeo.c##\n    fd_set  rset;##  5 ##src/lib/readable_timeo.c##\n    struct timeval tv;##  6 ##src/lib/readable_timeo.c##\n\n    FD_ZERO(&rset);##  7 ##src/lib/readable_timeo.c##\n    FD_SET(fd, &rset);##  8 ##src/lib/readable_timeo.c##\n\n    tv.tv_sec = sec;##  9 ##src/lib/readable_timeo.c##\n    tv.tv_usec = 0;## 10 ##src/lib/readable_timeo.c##\n\n    return (select(fd + 1, &rset, NULL, NULL, &tv));## 11 ##src/lib/readable_timeo.c##\n    /* 4> 0 if descriptor is readable */## 12 ##src/lib/readable_timeo.c##\n}## 13 ##src/lib/readable_timeo.c##\n/* end readable_timeo */\n\nint## 14 ##src/lib/readable_timeo.c##\nReadable_timeo(int fd, int sec)## 15 ##src/lib/readable_timeo.c##\n{## 16 ##src/lib/readable_timeo.c##\n    int     n;## 17 ##src/lib/readable_timeo.c##\n\n    if ((n = readable_timeo(fd, sec)) < 0)## 18 ##src/lib/readable_timeo.c##\n        err_sys(\"readable_timeo error\");## 19 ##src/lib/readable_timeo.c##\n    return (n);## 20 ##src/lib/readable_timeo.c##\n}## 21 ##src/lib/readable_timeo.c##\n"
  },
  {
    "path": "lib/readline.c",
    "content": "/* include readline */\n#include\t\"unp.h\"\n\nstatic int\tread_cnt;\nstatic char\t*read_ptr;\nstatic char\tread_buf[MAXLINE];\n\nstatic ssize_t\nmy_read(int fd, char *ptr)\n{\n\n\tif (read_cnt <= 0) {\nagain:\n\t\tif ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tgoto again;\n\t\t\treturn(-1);\n\t\t} else if (read_cnt == 0)\n\t\t\treturn(0);\n\t\tread_ptr = read_buf;\n\t}\n\n\tread_cnt--;\n\t*ptr = *read_ptr++;\n\treturn(1);\n}\n\nssize_t\nreadline(int fd, void *vptr, size_t maxlen)\n{\n\tssize_t\tn, rc;\n\tchar\tc, *ptr;\n\n\tptr = vptr;\n\tfor (n = 1; n < maxlen; n++) {\n\t\tif ( (rc = my_read(fd, &c)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\t/* newline is stored, like fgets() */\n\t\t} else if (rc == 0) {\n\t\t\t*ptr = 0;\n\t\t\treturn(n - 1);\t/* EOF, n - 1 bytes were read */\n\t\t} else\n\t\t\treturn(-1);\t\t/* error, errno set by read() */\n\t}\n\n\t*ptr = 0;\t/* null terminate like fgets() */\n\treturn(n);\n}\n\nssize_t\nreadlinebuf(void **vptrptr)\n{\n\tif (read_cnt)\n\t\t*vptrptr = read_ptr;\n\treturn(read_cnt);\n}\n/* end readline */\n\nssize_t\nReadline(int fd, void *ptr, size_t maxlen)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline(fd, ptr, maxlen)) < 0)\n\t\terr_sys(\"readline error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/readline.lc",
    "content": "/* include readline */\n#include    \"unp.h\"##  1 ##src/lib/readline.c##\n\nstatic int read_cnt;##  2 ##src/lib/readline.c##\nstatic char *read_ptr;##  3 ##src/lib/readline.c##\nstatic char read_buf[MAXLINE];##  4 ##src/lib/readline.c##\n\nstatic ssize_t##  5 ##src/lib/readline.c##\nmy_read(int fd, char *ptr)##  6 ##src/lib/readline.c##\n{##  7 ##src/lib/readline.c##\n\n    if (read_cnt <= 0) {##  8 ##src/lib/readline.c##\n      again:##  9 ##src/lib/readline.c##\n        if ((read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {## 10 ##src/lib/readline.c##\n            if (errno == EINTR)## 11 ##src/lib/readline.c##\n                goto again;## 12 ##src/lib/readline.c##\n            return (-1);## 13 ##src/lib/readline.c##\n        } else if (read_cnt == 0)## 14 ##src/lib/readline.c##\n            return (0);## 15 ##src/lib/readline.c##\n        read_ptr = read_buf;## 16 ##src/lib/readline.c##\n    }## 17 ##src/lib/readline.c##\n\n    read_cnt--;## 18 ##src/lib/readline.c##\n    *ptr = *read_ptr++;## 19 ##src/lib/readline.c##\n    return (1);## 20 ##src/lib/readline.c##\n}## 21 ##src/lib/readline.c##\n\nssize_t## 22 ##src/lib/readline.c##\nreadline(int fd, void *vptr, size_t maxlen)## 23 ##src/lib/readline.c##\n{## 24 ##src/lib/readline.c##\n    ssize_t n, rc;## 25 ##src/lib/readline.c##\n    char    c, *ptr;## 26 ##src/lib/readline.c##\n\n    ptr = vptr;## 27 ##src/lib/readline.c##\n    for (n = 1; n < maxlen; n++) {## 28 ##src/lib/readline.c##\n        if ((rc = my_read(fd, &c)) == 1) {## 29 ##src/lib/readline.c##\n            *ptr++ = c;## 30 ##src/lib/readline.c##\n            if (c == '\\n')## 31 ##src/lib/readline.c##\n                break;          /* newline is stored, like fgets() */## 32 ##src/lib/readline.c##\n        } else if (rc == 0) {## 33 ##src/lib/readline.c##\n            *ptr = 0;## 34 ##src/lib/readline.c##\n            return (n - 1);     /* EOF, n - 1 bytes were read */## 35 ##src/lib/readline.c##\n        } else## 36 ##src/lib/readline.c##\n            return (-1);        /* error, errno set by read() */## 37 ##src/lib/readline.c##\n    }## 38 ##src/lib/readline.c##\n\n    *ptr = 0;                   /* null terminate like fgets() */## 39 ##src/lib/readline.c##\n    return (n);## 40 ##src/lib/readline.c##\n}## 41 ##src/lib/readline.c##\n\nssize_t## 42 ##src/lib/readline.c##\nreadlinebuf(void **vptrptr)## 43 ##src/lib/readline.c##\n{## 44 ##src/lib/readline.c##\n    if (read_cnt)## 45 ##src/lib/readline.c##\n        *vptrptr = read_ptr;## 46 ##src/lib/readline.c##\n    return (read_cnt);## 47 ##src/lib/readline.c##\n}## 48 ##src/lib/readline.c##\n/* end readline */\n\nssize_t## 49 ##src/lib/readline.c##\nReadline(int fd, void *ptr, size_t maxlen)## 50 ##src/lib/readline.c##\n{## 51 ##src/lib/readline.c##\n    ssize_t n;## 52 ##src/lib/readline.c##\n\n    if ((n = readline(fd, ptr, maxlen)) < 0)## 53 ##src/lib/readline.c##\n        err_sys(\"readline error\");## 54 ##src/lib/readline.c##\n    return (n);## 55 ##src/lib/readline.c##\n}## 56 ##src/lib/readline.c##\n"
  },
  {
    "path": "lib/readn.c",
    "content": "/* include readn */\n#include\t\"unp.h\"\n\nssize_t\t\t\t\t\t\t/* Read \"n\" bytes from a descriptor. */\nreadn(int fd, void *vptr, size_t n)\n{\n\tsize_t\tnleft;\n\tssize_t\tnread;\n\tchar\t*ptr;\n\n\tptr = vptr;\n\tnleft = n;\n\twhile (nleft > 0) {\n\t\tif ( (nread = read(fd, ptr, nleft)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tnread = 0;\t\t/* and call read() again */\n\t\t\telse\n\t\t\t\treturn(-1);\n\t\t} else if (nread == 0)\n\t\t\tbreak;\t\t\t\t/* EOF */\n\n\t\tnleft -= nread;\n\t\tptr   += nread;\n\t}\n\treturn(n - nleft);\t\t/* return >= 0 */\n}\n/* end readn */\n\nssize_t\nReadn(int fd, void *ptr, size_t nbytes)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readn(fd, ptr, nbytes)) < 0)\n\t\terr_sys(\"readn error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/readn.lc",
    "content": "/* include readn */\n#include    \"unp.h\"##  1 ##src/lib/readn.c##\n\nssize_t                         /* Read \"n\" bytes from a descriptor. */##  2 ##src/lib/readn.c##\nreadn(int fd, void *vptr, size_t n)##  3 ##src/lib/readn.c##\n{##  4 ##src/lib/readn.c##\n    size_t  nleft;##  5 ##src/lib/readn.c##\n    ssize_t nread;##  6 ##src/lib/readn.c##\n    char   *ptr;##  7 ##src/lib/readn.c##\n\n    ptr = vptr;##  8 ##src/lib/readn.c##\n    nleft = n;##  9 ##src/lib/readn.c##\n    while (nleft > 0) {## 10 ##src/lib/readn.c##\n        if ((nread = read(fd, ptr, nleft)) < 0) {## 11 ##src/lib/readn.c##\n            if (errno == EINTR)## 12 ##src/lib/readn.c##\n                nread = 0;      /* and call read() again */## 13 ##src/lib/readn.c##\n            else## 14 ##src/lib/readn.c##\n                return (-1);## 15 ##src/lib/readn.c##\n        } else if (nread == 0)## 16 ##src/lib/readn.c##\n            break;              /* EOF */## 17 ##src/lib/readn.c##\n\n        nleft -= nread;## 18 ##src/lib/readn.c##\n        ptr += nread;## 19 ##src/lib/readn.c##\n    }## 20 ##src/lib/readn.c##\n    return (n - nleft);         /* return >= 0 */## 21 ##src/lib/readn.c##\n}## 22 ##src/lib/readn.c##\n/* end readn */\n\nssize_t## 23 ##src/lib/readn.c##\nReadn(int fd, void *ptr, size_t nbytes)## 24 ##src/lib/readn.c##\n{## 25 ##src/lib/readn.c##\n    ssize_t n;## 26 ##src/lib/readn.c##\n\n    if ((n = readn(fd, ptr, nbytes)) < 0)## 27 ##src/lib/readn.c##\n        err_sys(\"readn error\");## 28 ##src/lib/readn.c##\n    return (n);## 29 ##src/lib/readn.c##\n}## 30 ##src/lib/readn.c##\n"
  },
  {
    "path": "lib/rtt.c",
    "content": "/* include rtt1 */\n#include\t\"unprtt.h\"\n\nint\t\trtt_d_flag = 0;\t\t/* debug flag; can be set by caller */\n\n/*\n * Calculate the RTO value based on current estimators:\n *\t\tsmoothed RTT plus four times the deviation\n */\n#define\tRTT_RTOCALC(ptr) ((ptr)->rtt_srtt + (4.0 * (ptr)->rtt_rttvar))\n\nstatic float\nrtt_minmax(float rto)\n{\n\tif (rto < RTT_RXTMIN)\n\t\trto = RTT_RXTMIN;\n\telse if (rto > RTT_RXTMAX)\n\t\trto = RTT_RXTMAX;\n\treturn(rto);\n}\n\nvoid\nrtt_init(struct rtt_info *ptr)\n{\n\tstruct timeval\ttv;\n\n\tGettimeofday(&tv, NULL);\n\tptr->rtt_base = tv.tv_sec;\t\t/* # sec since 1/1/1970 at start */\n\n\tptr->rtt_rtt    = 0;\n\tptr->rtt_srtt   = 0;\n\tptr->rtt_rttvar = 0.75;\n\tptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr));\n\t\t/* first RTO at (srtt + (4 * rttvar)) = 3 seconds */\n}\n/* end rtt1 */\n\n/*\n * Return the current timestamp.\n * Our timestamps are 32-bit integers that count milliseconds since\n * rtt_init() was called.\n */\n\n/* include rtt_ts */\nuint32_t\nrtt_ts(struct rtt_info *ptr)\n{\n\tuint32_t\t\tts;\n\tstruct timeval\ttv;\n\n\tGettimeofday(&tv, NULL);\n\tts = ((tv.tv_sec - ptr->rtt_base) * 1000) + (tv.tv_usec / 1000);\n\treturn(ts);\n}\n\nvoid\nrtt_newpack(struct rtt_info *ptr)\n{\n\tptr->rtt_nrexmt = 0;\n}\n\nint\nrtt_start(struct rtt_info *ptr)\n{\n\treturn((int) (ptr->rtt_rto + 0.5));\t\t/* round float to int */\n\t\t/* 4return value can be used as: alarm(rtt_start(&foo)) */\n}\n/* end rtt_ts */\n\n/*\n * A response was received.\n * Stop the timer and update the appropriate values in the structure\n * based on this packet's RTT.  We calculate the RTT, then update the\n * estimators of the RTT and its mean deviation.\n * This function should be called right after turning off the\n * timer with alarm(0), or right after a timeout occurs.\n */\n\n/* include rtt_stop */\nvoid\nrtt_stop(struct rtt_info *ptr, uint32_t ms)\n{\n\tdouble\t\tdelta;\n\n\tptr->rtt_rtt = ms / 1000.0;\t\t/* measured RTT in seconds */\n\n\t/*\n\t * Update our estimators of RTT and mean deviation of RTT.\n\t * See Jacobson's SIGCOMM '88 paper, Appendix A, for the details.\n\t * We use floating point here for simplicity.\n\t */\n\n\tdelta = ptr->rtt_rtt - ptr->rtt_srtt;\n\tptr->rtt_srtt += delta / 8;\t\t/* g = 1/8 */\n\n\tif (delta < 0.0)\n\t\tdelta = -delta;\t\t\t\t/* |delta| */\n\n\tptr->rtt_rttvar += (delta - ptr->rtt_rttvar) / 4;\t/* h = 1/4 */\n\n\tptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr));\n}\n/* end rtt_stop */\n\n/*\n * A timeout has occurred.\n * Return -1 if it's time to give up, else return 0.\n */\n\n/* include rtt_timeout */\nint\nrtt_timeout(struct rtt_info *ptr)\n{\n\tptr->rtt_rto *= 2;\t\t/* next RTO */\n\n\tif (++ptr->rtt_nrexmt > RTT_MAXNREXMT)\n\t\treturn(-1);\t\t\t/* time to give up for this packet */\n\treturn(0);\n}\n/* end rtt_timeout */\n\n/*\n * Print debugging information on stderr, if the \"rtt_d_flag\" is nonzero.\n */\n\nvoid\nrtt_debug(struct rtt_info *ptr)\n{\n\tif (rtt_d_flag == 0)\n\t\treturn;\n\n\tfprintf(stderr, \"rtt = %.3f, srtt = %.3f, rttvar = %.3f, rto = %.3f\\n\",\n\t\t\tptr->rtt_rtt, ptr->rtt_srtt, ptr->rtt_rttvar, ptr->rtt_rto);\n\tfflush(stderr);\n}\n"
  },
  {
    "path": "lib/rtt.lc",
    "content": "/* include rtt1 */\n#include    \"unprtt.h\"##  1 ##src/lib/rtt.c##\n\nint     rtt_d_flag = 0;         /* debug flag; can be set nonzero by caller */##  2 ##src/lib/rtt.c##\n\n/*##  3 ##src/lib/rtt.c##\n * Calculate the RTO value based on current estimators:##  4 ##src/lib/rtt.c##\n *      smoothed RTT plus four times the deviation.##  5 ##src/lib/rtt.c##\n */##  6 ##src/lib/rtt.c##\n#define RTT_RTOCALC(ptr) ((ptr)->rtt_srtt + (4.0 * (ptr)->rtt_rttvar))##  7 ##src/lib/rtt.c##\n\nstatic float##  8 ##src/lib/rtt.c##\nrtt_minmax(float rto)##  9 ##src/lib/rtt.c##\n{## 10 ##src/lib/rtt.c##\n    if (rto < RTT_RXTMIN)## 11 ##src/lib/rtt.c##\n        rto = RTT_RXTMIN;## 12 ##src/lib/rtt.c##\n    else if (rto > RTT_RXTMAX)## 13 ##src/lib/rtt.c##\n        rto = RTT_RXTMAX;## 14 ##src/lib/rtt.c##\n    return (rto);## 15 ##src/lib/rtt.c##\n}## 16 ##src/lib/rtt.c##\n\nvoid## 17 ##src/lib/rtt.c##\nrtt_init(struct rtt_info *ptr)## 18 ##src/lib/rtt.c##\n{## 19 ##src/lib/rtt.c##\n    struct timeval tv;## 20 ##src/lib/rtt.c##\n\n    Gettimeofday(&tv, NULL);## 21 ##src/lib/rtt.c##\n    ptr->rtt_base = tv.tv_sec;  /* #sec since 1/1/1970 at start */## 22 ##src/lib/rtt.c##\n\n    ptr->rtt_rtt = 0;## 23 ##src/lib/rtt.c##\n    ptr->rtt_srtt = 0;## 24 ##src/lib/rtt.c##\n    ptr->rtt_rttvar = 0.75;## 25 ##src/lib/rtt.c##\n    ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr));## 26 ##src/lib/rtt.c##\n    /* first RTO at (srtt + (4 * rttvar)) = 3 seconds */## 27 ##src/lib/rtt.c##\n}## 28 ##src/lib/rtt.c##\n/* end rtt1 */\n\n/*## 29 ##src/lib/rtt.c##\n * Return the current timestamp.## 30 ##src/lib/rtt.c##\n * Our timestamps are 32-bit integers that count milliseconds since## 31 ##src/lib/rtt.c##\n * rtt_init() was called.## 32 ##src/lib/rtt.c##\n */## 33 ##src/lib/rtt.c##\n\n/* include rtt_ts */\nuint32_t## 34 ##src/lib/rtt.c##\nrtt_ts(struct rtt_info *ptr)## 35 ##src/lib/rtt.c##\n{## 36 ##src/lib/rtt.c##\n    uint32_t ts;## 37 ##src/lib/rtt.c##\n    struct timeval tv;## 38 ##src/lib/rtt.c##\n\n    Gettimeofday(&tv, NULL);## 39 ##src/lib/rtt.c##\n    ts = ((tv.tv_sec - ptr->rtt_base) * 1000) + (tv.tv_usec / 1000);## 40 ##src/lib/rtt.c##\n    return (ts);## 41 ##src/lib/rtt.c##\n}## 42 ##src/lib/rtt.c##\n\nvoid## 43 ##src/lib/rtt.c##\nrtt_newpack(struct rtt_info *ptr)## 44 ##src/lib/rtt.c##\n{## 45 ##src/lib/rtt.c##\n    ptr->rtt_nrexmt = 0;## 46 ##src/lib/rtt.c##\n}## 47 ##src/lib/rtt.c##\n\nint## 48 ##src/lib/rtt.c##\nrtt_start(struct rtt_info *ptr)## 49 ##src/lib/rtt.c##\n{## 50 ##src/lib/rtt.c##\n    return ((int) (ptr->rtt_rto + 0.5));    /* round float to int */## 51 ##src/lib/rtt.c##\n    /* 4return value can be used as: alarm(rtt_start(&foo)) */## 52 ##src/lib/rtt.c##\n}## 53 ##src/lib/rtt.c##\n/* end rtt_ts */\n\n/*## 54 ##src/lib/rtt.c##\n * A response was received.## 55 ##src/lib/rtt.c##\n * Stop the timer and update the appropriate values in the structure## 56 ##src/lib/rtt.c##\n * based on this packet's RTT.  We calculate the RTT, then update the## 57 ##src/lib/rtt.c##\n * estimators of the RTT and its mean deviation.## 58 ##src/lib/rtt.c##\n * This function should be called right after turning off the## 59 ##src/lib/rtt.c##\n * timer with alarm(0), or right after a timeout occurs.## 60 ##src/lib/rtt.c##\n */## 61 ##src/lib/rtt.c##\n\n/* include rtt_stop */\nvoid## 62 ##src/lib/rtt.c##\nrtt_stop(struct rtt_info *ptr, uint32_t ms)## 63 ##src/lib/rtt.c##\n{## 64 ##src/lib/rtt.c##\n    double  delta;## 65 ##src/lib/rtt.c##\n\n    ptr->rtt_rtt = ms / 1000.0; /* measured RTT in seconds */## 66 ##src/lib/rtt.c##\n\n    /* ## 67 ##src/lib/rtt.c##\n     * Update our estimators of RTT and mean deviation of RTT.## 68 ##src/lib/rtt.c##\n     * See Jacobson's SIGCOMM '88 paper, Appendix A, for the details.## 69 ##src/lib/rtt.c##\n     * We use floating point here for simplicity.## 70 ##src/lib/rtt.c##\n     */## 71 ##src/lib/rtt.c##\n\n    delta = ptr->rtt_rtt - ptr->rtt_srtt;## 72 ##src/lib/rtt.c##\n    ptr->rtt_srtt += delta / 8; /* g = 1/8 */## 73 ##src/lib/rtt.c##\n\n    if (delta < 0.0)## 74 ##src/lib/rtt.c##\n        delta = -delta;         /* |delta| */## 75 ##src/lib/rtt.c##\n\n    ptr->rtt_rttvar += (delta - ptr->rtt_rttvar) / 4;   /* h = 1/4 */## 76 ##src/lib/rtt.c##\n\n    ptr->rtt_rto = rtt_minmax(RTT_RTOCALC(ptr));## 77 ##src/lib/rtt.c##\n}## 78 ##src/lib/rtt.c##\n/* end rtt_stop */\n\n/*## 79 ##src/lib/rtt.c##\n * A timeout has occurred.## 80 ##src/lib/rtt.c##\n * Return -1 if it's time to give up, else return 0.## 81 ##src/lib/rtt.c##\n */## 82 ##src/lib/rtt.c##\n\n/* include rtt_timeout */\nint## 83 ##src/lib/rtt.c##\nrtt_timeout(struct rtt_info *ptr)## 84 ##src/lib/rtt.c##\n{## 85 ##src/lib/rtt.c##\n    ptr->rtt_rto *= 2;          /* next RTO */## 86 ##src/lib/rtt.c##\n\n    if (++ptr->rtt_nrexmt > RTT_MAXNREXMT)## 87 ##src/lib/rtt.c##\n        return (-1);            /* time to give up for this packet */## 88 ##src/lib/rtt.c##\n    return (0);## 89 ##src/lib/rtt.c##\n}## 90 ##src/lib/rtt.c##\n/* end rtt_timeout */\n\n/*## 91 ##src/lib/rtt.c##\n * Print debugging information on stderr, if the \"rtt_d_flag\" is nonzero.## 92 ##src/lib/rtt.c##\n */## 93 ##src/lib/rtt.c##\n\nvoid## 94 ##src/lib/rtt.c##\nrtt_debug(struct rtt_info *ptr)## 95 ##src/lib/rtt.c##\n{## 96 ##src/lib/rtt.c##\n    if (rtt_d_flag == 0)## 97 ##src/lib/rtt.c##\n        return;## 98 ##src/lib/rtt.c##\n\n    fprintf(stderr, \"rtt = %.3f, srtt = %.3f, rttvar = %.3f, rto = %.3f\\n\",## 99 ##src/lib/rtt.c##\n            ptr->rtt_rtt, ptr->rtt_srtt, ptr->rtt_rttvar, ptr->rtt_rto);##100 ##src/lib/rtt.c##\n    fflush(stderr);##101 ##src/lib/rtt.c##\n}##102 ##src/lib/rtt.c##\n"
  },
  {
    "path": "lib/signal.c",
    "content": "/* include signal */\n#include\t\"unp.h\"\n\nSigfunc *\nsignal(int signo, Sigfunc *func)\n{\n\tstruct sigaction\tact, oact;\n\n\tact.sa_handler = func;\n\tsigemptyset(&act.sa_mask);\n\tact.sa_flags = 0;\n\tif (signo == SIGALRM) {\n#ifdef\tSA_INTERRUPT\n\t\tact.sa_flags |= SA_INTERRUPT;\t/* SunOS 4.x */\n#endif\n\t} else {\n#ifdef\tSA_RESTART\n\t\tact.sa_flags |= SA_RESTART;\t\t/* SVR4, 44BSD */\n#endif\n\t}\n\tif (sigaction(signo, &act, &oact) < 0)\n\t\treturn(SIG_ERR);\n\treturn(oact.sa_handler);\n}\n/* end signal */\n\nSigfunc *\nSignal(int signo, Sigfunc *func)\t/* for our signal() function */\n{\n\tSigfunc\t*sigfunc;\n\n\tif ( (sigfunc = signal(signo, func)) == SIG_ERR)\n\t\terr_sys(\"signal error\");\n\treturn(sigfunc);\n}\n"
  },
  {
    "path": "lib/signal.lc",
    "content": "/* include signal */\n#include    \"unp.h\"##  1 ##src/lib/signal.c##\n\nSigfunc *##  2 ##src/lib/signal.c##\nsignal(int signo, Sigfunc *func)##  3 ##src/lib/signal.c##\n{##  4 ##src/lib/signal.c##\n    struct sigaction act, oact;##  5 ##src/lib/signal.c##\n\n    act.sa_handler = func;##  6 ##src/lib/signal.c##\n    sigemptyset(&act.sa_mask);##  7 ##src/lib/signal.c##\n    act.sa_flags = 0;##  8 ##src/lib/signal.c##\n    if (signo == SIGALRM) {##  9 ##src/lib/signal.c##\n#ifdef  SA_INTERRUPT## 10 ##src/lib/signal.c##\n        act.sa_flags |= SA_INTERRUPT;   /* SunOS 4.x */## 11 ##src/lib/signal.c##\n#endif## 12 ##src/lib/signal.c##\n    } else {## 13 ##src/lib/signal.c##\n#ifdef  SA_RESTART## 14 ##src/lib/signal.c##\n        act.sa_flags |= SA_RESTART; /* SVR4, 44BSD */## 15 ##src/lib/signal.c##\n#endif## 16 ##src/lib/signal.c##\n    }## 17 ##src/lib/signal.c##\n    if (sigaction(signo, &act, &oact) < 0)## 18 ##src/lib/signal.c##\n        return (SIG_ERR);## 19 ##src/lib/signal.c##\n    return (oact.sa_handler);## 20 ##src/lib/signal.c##\n}## 21 ##src/lib/signal.c##\n/* end signal */\n\nSigfunc *## 22 ##src/lib/signal.c##\nSignal(int signo, Sigfunc *func)## 23 ##src/lib/signal.c##\n{                               /* for our signal() function */## 24 ##src/lib/signal.c##\n    Sigfunc *sigfunc;## 25 ##src/lib/signal.c##\n\n    if ((sigfunc = signal(signo, func)) == SIG_ERR)## 26 ##src/lib/signal.c##\n        err_sys(\"signal error\");## 27 ##src/lib/signal.c##\n    return (sigfunc);## 28 ##src/lib/signal.c##\n}## 29 ##src/lib/signal.c##\n"
  },
  {
    "path": "lib/signal_intr.c",
    "content": "/* include signal_intr */\n#include\t\"unp.h\"\n\nSigfunc *\nsignal_intr(int signo, Sigfunc *func)\n{\n\tstruct sigaction\tact, oact;\n\n\tact.sa_handler = func;\n\tsigemptyset(&act.sa_mask);\n\tact.sa_flags = 0;\n#ifdef\tSA_INTERRUPT\t/* SunOS */\n\tact.sa_flags |= SA_INTERRUPT;\n#endif\n\tif (sigaction(signo, &act, &oact) < 0)\n\t\treturn(SIG_ERR);\n\treturn(oact.sa_handler);\n}\n/* end signal_intr */\n\nSigfunc *\nSignal_intr(int signo, Sigfunc *func)\n{\n\tSigfunc\t*sigfunc;\n\n\tif ( (sigfunc = signal_intr(signo, func)) == SIG_ERR)\n\t\terr_sys(\"signal_intr error\");\n\treturn(sigfunc);\n}\n"
  },
  {
    "path": "lib/snprintf.c",
    "content": "/*\n * Throughout the book I use snprintf() because it's safer than sprintf().\n * But as of the time of this writing, not all systems provide this\n * function.  The function below should only be built on those systems\n * that do not provide a real snprintf().\n * The function below just acts like sprintf(); it is not safe, but it\n * tries to detect overflow.\n */\n\n#include\t\"unp.h\"\n\n#include\t<stdarg.h>\t\t/* ANSI C header file */\n\nint\nsnprintf(char *buf, size_t size, const char *fmt, ...)\n{\n\tint\t\t\tn;\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\tvsprintf(buf, fmt, ap);\t/* Sigh, some vsprintf's return ptr, not length */\n\tn = strlen(buf);\n\tva_end(ap);\n\tif (n >= size)\n\t\terr_quit(\"snprintf: '%s' overflowed array\", fmt);\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/sock_bind_wild.c",
    "content": "#include\t\"unp.h\"\n\nint\nsock_bind_wild(int sockfd, int family)\n{\n\tsocklen_t\tlen;\n\n\tswitch (family) {\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\tsin;\n\n\t\tbzero(&sin, sizeof(sin));\n\t\tsin.sin_family = AF_INET;\n\t\tsin.sin_addr.s_addr = htonl(INADDR_ANY);\n\t\tsin.sin_port = htons(0);\t/* bind ephemeral port */\n\n\t\tif (bind(sockfd, (SA *) &sin, sizeof(sin)) < 0)\n\t\t\treturn(-1);\n\t\tlen = sizeof(sin);\n\t\tif (getsockname(sockfd, (SA *) &sin, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(sin.sin_port);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\tsin6;\n\n\t\tbzero(&sin6, sizeof(sin6));\n\t\tsin6.sin6_family = AF_INET6;\n\t\tsin6.sin6_addr = in6addr_any;\n\t\tsin6.sin6_port = htons(0);\t/* bind ephemeral port */\n\n\t\tif (bind(sockfd, (SA *) &sin6, sizeof(sin6)) < 0)\n\t\t\treturn(-1);\n\t\tlen = sizeof(sin6);\n\t\tif (getsockname(sockfd, (SA *) &sin6, &len) < 0)\n\t\t\treturn(-1);\n\t\treturn(sin6.sin6_port);\n\t}\n#endif\n\t}\n\treturn(-1);\n}\n\nint\nSock_bind_wild(int sockfd, int family)\n{\n\tint\t\tport;\n\n\tif ( (port = sock_bind_wild(sockfd, family)) < 0)\n\t\terr_sys(\"sock_bind_wild error\");\n\n\treturn(port);\n}\n"
  },
  {
    "path": "lib/sock_cmp_addr.c",
    "content": "#include\t\"unp.h\"\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n#include\t<net/if_dl.h>\n#endif\n\nint\nsock_cmp_addr(const struct sockaddr *sa1, const struct sockaddr *sa2,\n\t\t\t socklen_t salen)\n{\n\tif (sa1->sa_family != sa2->sa_family)\n\t\treturn(-1);\n\n\tswitch (sa1->sa_family) {\n\tcase AF_INET: {\n\t\treturn(memcmp( &((struct sockaddr_in *) sa1)->sin_addr,\n\t\t\t\t\t   &((struct sockaddr_in *) sa2)->sin_addr,\n\t\t\t\t\t   sizeof(struct in_addr)));\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\treturn(memcmp( &((struct sockaddr_in6 *) sa1)->sin6_addr,\n\t\t\t\t\t   &((struct sockaddr_in6 *) sa2)->sin6_addr,\n\t\t\t\t\t   sizeof(struct in6_addr)));\n\t}\n#endif\n\n#ifdef\tAF_UNIX\n\tcase AF_UNIX: {\n\t\treturn(strcmp( ((struct sockaddr_un *) sa1)->sun_path,\n\t\t\t\t\t   ((struct sockaddr_un *) sa2)->sun_path));\n\t}\n#endif\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n\tcase AF_LINK: {\n\t\treturn(-1);\t\t/* no idea what to compare here ? */\n\t}\n#endif\n\t}\n    return (-1);\n}\n"
  },
  {
    "path": "lib/sock_cmp_port.c",
    "content": "#include\t\"unp.h\"\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n#include\t<net/if_dl.h>\n#endif\n\nint\nsock_cmp_port(const struct sockaddr *sa1, const struct sockaddr *sa2,\n\t\t\t socklen_t salen)\n{\n\tif (sa1->sa_family != sa2->sa_family)\n\t\treturn(-1);\n\n\tswitch (sa1->sa_family) {\n\tcase AF_INET: {\n\t\treturn( ((struct sockaddr_in *) sa1)->sin_port ==\n\t\t\t\t((struct sockaddr_in *) sa2)->sin_port);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\treturn( ((struct sockaddr_in6 *) sa1)->sin6_port ==\n\t\t\t\t((struct sockaddr_in6 *) sa2)->sin6_port);\n\t}\n#endif\n\n\t}\n    return (-1);\n}\n"
  },
  {
    "path": "lib/sock_get_port.c",
    "content": "#include\t\"unp.h\"\n\nint\nsock_get_port(const struct sockaddr *sa, socklen_t salen)\n{\n\tswitch (sa->sa_family) {\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sin = (struct sockaddr_in *) sa;\n\n\t\treturn(sin->sin_port);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sin6 = (struct sockaddr_in6 *) sa;\n\n\t\treturn(sin6->sin6_port);\n\t}\n#endif\n\t}\n\n    return(-1);\t\t/* ??? */\n}\n"
  },
  {
    "path": "lib/sock_ntop.c",
    "content": "#include\t\"unp.h\"\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n#include\t<net/if_dl.h>\n#endif\n\n/* include sock_ntop */\nchar *\nsock_ntop(const struct sockaddr *sa, socklen_t salen)\n{\n    char\t\tportstr[8];\n    static char str[128];\t\t/* Unix domain is largest */\n\n\tswitch (sa->sa_family) {\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sin = (struct sockaddr_in *) sa;\n\n\t\tif (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)\n\t\t\treturn(NULL);\n\t\tif (ntohs(sin->sin_port) != 0) {\n\t\t\tsnprintf(portstr, sizeof(portstr), \":%d\", ntohs(sin->sin_port));\n\t\t\tstrcat(str, portstr);\n\t\t}\n\t\treturn(str);\n\t}\n/* end sock_ntop */\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sin6 = (struct sockaddr_in6 *) sa;\n\n\t\tstr[0] = '[';\n\t\tif (inet_ntop(AF_INET6, &sin6->sin6_addr, str + 1, sizeof(str) - 1) == NULL)\n\t\t\treturn(NULL);\n\t\tif (ntohs(sin6->sin6_port) != 0) {\n\t\t\tsnprintf(portstr, sizeof(portstr), \"]:%d\", ntohs(sin6->sin6_port));\n\t\t\tstrcat(str, portstr);\n\t\t\treturn(str);\n\t\t}\n\t\treturn (str + 1);\n\t}\n#endif\n\n#ifdef\tAF_UNIX\n\tcase AF_UNIX: {\n\t\tstruct sockaddr_un\t*unp = (struct sockaddr_un *) sa;\n\n\t\t\t/* OK to have no pathname bound to the socket: happens on\n\t\t\t   every connect() unless client calls bind() first. */\n\t\tif (unp->sun_path[0] == 0)\n\t\t\tstrcpy(str, \"(no pathname bound)\");\n\t\telse\n\t\t\tsnprintf(str, sizeof(str), \"%s\", unp->sun_path);\n\t\treturn(str);\n\t}\n#endif\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n\tcase AF_LINK: {\n\t\tstruct sockaddr_dl\t*sdl = (struct sockaddr_dl *) sa;\n\n\t\tif (sdl->sdl_nlen > 0)\n\t\t\tsnprintf(str, sizeof(str), \"%*s (index %d)\",\n\t\t\t\t\t sdl->sdl_nlen, &sdl->sdl_data[0], sdl->sdl_index);\n\t\telse\n\t\t\tsnprintf(str, sizeof(str), \"AF_LINK, index=%d\", sdl->sdl_index);\n\t\treturn(str);\n\t}\n#endif\n\tdefault:\n\t\tsnprintf(str, sizeof(str), \"sock_ntop: unknown AF_xxx: %d, len %d\",\n\t\t\t\t sa->sa_family, salen);\n\t\treturn(str);\n\t}\n    return (NULL);\n}\n\nchar *\nSock_ntop(const struct sockaddr *sa, socklen_t salen)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = sock_ntop(sa, salen)) == NULL)\n\t\terr_sys(\"sock_ntop error\");\t/* inet_ntop() sets errno */\n\treturn(ptr);\n}\n"
  },
  {
    "path": "lib/sock_ntop.lc",
    "content": "#include    \"unp.h\"##  1 ##src/lib/sock_ntop.c##\n\n#ifdef  HAVE_SOCKADDR_DL_STRUCT##  2 ##src/lib/sock_ntop.c##\n#include    <net/if_dl.h>##  3 ##src/lib/sock_ntop.c##\n#endif##  4 ##src/lib/sock_ntop.c##\n\n/* include sock_ntop */\nchar   *##  5 ##src/lib/sock_ntop.c##\nsock_ntop(const struct sockaddr *sa, socklen_t salen)##  6 ##src/lib/sock_ntop.c##\n{##  7 ##src/lib/sock_ntop.c##\n    char    portstr[8];##  8 ##src/lib/sock_ntop.c##\n    static char str[128];       /* Unix domain is largest */##  9 ##src/lib/sock_ntop.c##\n\n    switch (sa->sa_family) {## 10 ##src/lib/sock_ntop.c##\n    case AF_INET:{## 11 ##src/lib/sock_ntop.c##\n            struct sockaddr_in *sin = (struct sockaddr_in *) sa;## 12 ##src/lib/sock_ntop.c##\n\n            if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)## 13 ##src/lib/sock_ntop.c##\n                return (NULL);## 14 ##src/lib/sock_ntop.c##\n            if (ntohs(sin->sin_port) != 0) {## 15 ##src/lib/sock_ntop.c##\n                snprintf(portstr, sizeof(portstr), \":%d\",## 16 ##src/lib/sock_ntop.c##\n                         ntohs(sin->sin_port));## 17 ##src/lib/sock_ntop.c##\n                strcat(str, portstr);## 18 ##src/lib/sock_ntop.c##\n            }## 19 ##src/lib/sock_ntop.c##\n            return (str);## 20 ##src/lib/sock_ntop.c##\n        }## 21 ##src/lib/sock_ntop.c##\n/* end sock_ntop */\n\n#ifdef  IPV6## 22 ##src/lib/sock_ntop.c##\n    case AF_INET6:{## 23 ##src/lib/sock_ntop.c##\n            struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;## 24 ##src/lib/sock_ntop.c##\n\n            str[0] = '[';## 25 ##src/lib/sock_ntop.c##\n            if (inet_ntop## 26 ##src/lib/sock_ntop.c##\n                (AF_INET6, &sin6->sin6_addr, str + 1,## 27 ##src/lib/sock_ntop.c##\n                 sizeof(str) - 1) == NULL)## 28 ##src/lib/sock_ntop.c##\n                return (NULL);## 29 ##src/lib/sock_ntop.c##\n            if (ntohs(sin6->sin6_port) != 0) {## 30 ##src/lib/sock_ntop.c##\n                snprintf(portstr, sizeof(portstr), \"]:%d\",## 31 ##src/lib/sock_ntop.c##\n                         ntohs(sin6->sin6_port));## 32 ##src/lib/sock_ntop.c##\n                strcat(str, portstr);## 33 ##src/lib/sock_ntop.c##\n                return (str);## 34 ##src/lib/sock_ntop.c##\n            }## 35 ##src/lib/sock_ntop.c##\n            return (str + 1);## 36 ##src/lib/sock_ntop.c##\n        }## 37 ##src/lib/sock_ntop.c##\n#endif## 38 ##src/lib/sock_ntop.c##\n\n#ifdef  AF_UNIX## 39 ##src/lib/sock_ntop.c##\n    case AF_UNIX:{## 40 ##src/lib/sock_ntop.c##\n            struct sockaddr_un *unp = (struct sockaddr_un *) sa;## 41 ##src/lib/sock_ntop.c##\n\n            /* OK to have no pathname bound to the socket: happens on every connect() unless client calls bind() first. */## 42 ##src/lib/sock_ntop.c##\n            if (unp->sun_path[0] == 0)## 43 ##src/lib/sock_ntop.c##\n                strcpy(str, \"(no pathname bound)\");## 44 ##src/lib/sock_ntop.c##\n            else## 45 ##src/lib/sock_ntop.c##\n                snprintf(str, sizeof(str), \"%s\", unp->sun_path);## 46 ##src/lib/sock_ntop.c##\n            return (str);## 47 ##src/lib/sock_ntop.c##\n        }## 48 ##src/lib/sock_ntop.c##\n#endif## 49 ##src/lib/sock_ntop.c##\n\n#ifdef  HAVE_SOCKADDR_DL_STRUCT## 50 ##src/lib/sock_ntop.c##\n    case AF_LINK:{## 51 ##src/lib/sock_ntop.c##\n            struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa;## 52 ##src/lib/sock_ntop.c##\n\n            if (sdl->sdl_nlen > 0)## 53 ##src/lib/sock_ntop.c##\n                snprintf(str, sizeof(str), \"%*s (index %d)\",## 54 ##src/lib/sock_ntop.c##\n                         sdl->sdl_nlen, &sdl->sdl_data[0], sdl->sdl_index);## 55 ##src/lib/sock_ntop.c##\n            else## 56 ##src/lib/sock_ntop.c##\n                snprintf(str, sizeof(str), \"AF_LINK, index=%d\",## 57 ##src/lib/sock_ntop.c##\n                         sdl->sdl_index);## 58 ##src/lib/sock_ntop.c##\n            return (str);## 59 ##src/lib/sock_ntop.c##\n        }## 60 ##src/lib/sock_ntop.c##\n#endif## 61 ##src/lib/sock_ntop.c##\n    default:## 62 ##src/lib/sock_ntop.c##\n        snprintf(str, sizeof(str), \"sock_ntop: unknown AF_xxx: %d, len %d\",## 63 ##src/lib/sock_ntop.c##\n                 sa->sa_family, salen);## 64 ##src/lib/sock_ntop.c##\n        return (str);## 65 ##src/lib/sock_ntop.c##\n    }## 66 ##src/lib/sock_ntop.c##\n    return (NULL);## 67 ##src/lib/sock_ntop.c##\n}## 68 ##src/lib/sock_ntop.c##\n\nchar   *## 69 ##src/lib/sock_ntop.c##\nSock_ntop(const struct sockaddr *sa, socklen_t salen)## 70 ##src/lib/sock_ntop.c##\n{## 71 ##src/lib/sock_ntop.c##\n    char   *ptr;## 72 ##src/lib/sock_ntop.c##\n\n    if ((ptr = sock_ntop(sa, salen)) == NULL)## 73 ##src/lib/sock_ntop.c##\n        err_sys(\"sock_ntop error\"); /* inet_ntop() sets errno */## 74 ##src/lib/sock_ntop.c##\n    return (ptr);## 75 ##src/lib/sock_ntop.c##\n}## 76 ##src/lib/sock_ntop.c##\n"
  },
  {
    "path": "lib/sock_ntop_host.c",
    "content": "#include\t\"unp.h\"\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n#include\t<net/if_dl.h>\n#endif\n\nchar *\nsock_ntop_host(const struct sockaddr *sa, socklen_t salen)\n{\n    static char str[128];\t\t/* Unix domain is largest */\n\n\tswitch (sa->sa_family) {\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sin = (struct sockaddr_in *) sa;\n\n\t\tif (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)\n\t\t\treturn(NULL);\n\t\treturn(str);\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sin6 = (struct sockaddr_in6 *) sa;\n\n\t\tif (inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str)) == NULL)\n\t\t\treturn(NULL);\n\t\treturn(str);\n\t}\n#endif\n\n#ifdef\tAF_UNIX\n\tcase AF_UNIX: {\n\t\tstruct sockaddr_un\t*unp = (struct sockaddr_un *) sa;\n\n\t\t\t/* OK to have no pathname bound to the socket: happens on\n\t\t\t   every connect() unless client calls bind() first. */\n\t\tif (unp->sun_path[0] == 0)\n\t\t\tstrcpy(str, \"(no pathname bound)\");\n\t\telse\n\t\t\tsnprintf(str, sizeof(str), \"%s\", unp->sun_path);\n\t\treturn(str);\n\t}\n#endif\n\n#ifdef\tHAVE_SOCKADDR_DL_STRUCT\n\tcase AF_LINK: {\n\t\tstruct sockaddr_dl\t*sdl = (struct sockaddr_dl *) sa;\n\n\t\tif (sdl->sdl_nlen > 0)\n\t\t\tsnprintf(str, sizeof(str), \"%*s\",\n\t\t\t\t\t sdl->sdl_nlen, &sdl->sdl_data[0]);\n\t\telse\n\t\t\tsnprintf(str, sizeof(str), \"AF_LINK, index=%d\", sdl->sdl_index);\n\t\treturn(str);\n\t}\n#endif\n\tdefault:\n\t\tsnprintf(str, sizeof(str), \"sock_ntop_host: unknown AF_xxx: %d, len %d\",\n\t\t\t\t sa->sa_family, salen);\n\t\treturn(str);\n\t}\n    return (NULL);\n}\n\nchar *\nSock_ntop_host(const struct sockaddr *sa, socklen_t salen)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = sock_ntop_host(sa, salen)) == NULL)\n\t\terr_sys(\"sock_ntop_host error\");\t/* inet_ntop() sets errno */\n\treturn(ptr);\n}\n"
  },
  {
    "path": "lib/sock_set_addr.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsock_set_addr(struct sockaddr *sa, socklen_t salen, const void *addr)\n{\n\tswitch (sa->sa_family) {\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sin = (struct sockaddr_in *) sa;\n\n\t\tmemcpy(&sin->sin_addr, addr, sizeof(struct in_addr));\n\t\treturn;\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sin6 = (struct sockaddr_in6 *) sa;\n\n\t\tmemcpy(&sin6->sin6_addr, addr, sizeof(struct in6_addr));\n\t\treturn;\n\t}\n#endif\n\t}\n\n    return;\n}\n"
  },
  {
    "path": "lib/sock_set_port.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsock_set_port(struct sockaddr *sa, socklen_t salen, int port)\n{\n\tswitch (sa->sa_family) {\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sin = (struct sockaddr_in *) sa;\n\n\t\tsin->sin_port = port;\n\t\treturn;\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sin6 = (struct sockaddr_in6 *) sa;\n\n\t\tsin6->sin6_port = port;\n\t\treturn;\n\t}\n#endif\n\t}\n\n    return;\n}\n"
  },
  {
    "path": "lib/sock_set_wild.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsock_set_wild(struct sockaddr *sa, socklen_t salen)\n{\n\tconst void\t*wildptr;\n\n\tswitch (sa->sa_family) {\n\tcase AF_INET: {\n\t\tstatic struct in_addr\tin4addr_any;\n\n\t\tin4addr_any.s_addr = htonl(INADDR_ANY);\n\t\twildptr = &in4addr_any;\n\t\tbreak;\n\t}\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\twildptr = &in6addr_any;\n\t\tbreak;\n\t}\n#endif\n\n\tdefault:\n\t\treturn;\n\t}\n\tsock_set_addr(sa, salen, wildptr);\n    return;\n}\n"
  },
  {
    "path": "lib/sockatmark.c",
    "content": "#include\t\"unp.h\"\n\nint\nsockatmark(int fd)\n{\n\tint\t\tflag;\n\n\tif (ioctl(fd, SIOCATMARK, &flag) < 0)\n\t\treturn(-1);\n\treturn(flag != 0);\n}\n"
  },
  {
    "path": "lib/sockfd_to_family.c",
    "content": "/* include sockfd_to_family */\n#include\t\"unp.h\"\n\nint\nsockfd_to_family(int sockfd)\n{\n\tstruct sockaddr_storage ss;\n\tsocklen_t\tlen;\n\n\tlen = sizeof(ss);\n\tif (getsockname(sockfd, (SA *) &ss, &len) < 0)\n\t\treturn(-1);\n\treturn(ss.ss_family);\n}\n/* end sockfd_to_family */\n\nint\nSockfd_to_family(int sockfd)\n{\n\tint\t\trc;\n\n\tif ( (rc = sockfd_to_family(sockfd)) < 0)\n\t\terr_sys(\"sockfd_to_family error\");\n\n\treturn(rc);\n}\n"
  },
  {
    "path": "lib/sockfd_to_family.lc",
    "content": "/* include sockfd_to_family */\n#include    \"unp.h\"##  1 ##src/lib/sockfd_to_family.c##\n\nint##  2 ##src/lib/sockfd_to_family.c##\nsockfd_to_family(int sockfd)##  3 ##src/lib/sockfd_to_family.c##\n{##  4 ##src/lib/sockfd_to_family.c##\n    struct sockaddr_storage ss;##  5 ##src/lib/sockfd_to_family.c##\n    socklen_t len;##  6 ##src/lib/sockfd_to_family.c##\n\n    len = sizeof(ss);##  7 ##src/lib/sockfd_to_family.c##\n    if (getsockname(sockfd, (SA *) &ss, &len) < 0)##  8 ##src/lib/sockfd_to_family.c##\n        return (-1);##  9 ##src/lib/sockfd_to_family.c##\n    return (ss.ss_family);## 10 ##src/lib/sockfd_to_family.c##\n}## 11 ##src/lib/sockfd_to_family.c##\n/* end sockfd_to_family */\n\nint## 12 ##src/lib/sockfd_to_family.c##\nSockfd_to_family(int sockfd)## 13 ##src/lib/sockfd_to_family.c##\n{## 14 ##src/lib/sockfd_to_family.c##\n    int     rc;## 15 ##src/lib/sockfd_to_family.c##\n\n    if ((rc = sockfd_to_family(sockfd)) < 0)## 16 ##src/lib/sockfd_to_family.c##\n        err_sys(\"sockfd_to_family error\");## 17 ##src/lib/sockfd_to_family.c##\n\n    return (rc);## 18 ##src/lib/sockfd_to_family.c##\n}## 19 ##src/lib/sockfd_to_family.c##\n"
  },
  {
    "path": "lib/str_cli.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tchar\tsendline[MAXLINE], recvline[MAXLINE];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tWriten(sockfd, sendline, strlen(sendline));\n\n\t\tif (Readline(sockfd, recvline, MAXLINE) == 0)\n\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "lib/str_cli.lc",
    "content": "#include    \"unp.h\"##  1 ##src/lib/str_cli.c##\n\nvoid##  2 ##src/lib/str_cli.c##\nstr_cli(FILE *fp, int sockfd)##  3 ##src/lib/str_cli.c##\n{##  4 ##src/lib/str_cli.c##\n    char    sendline[MAXLINE], recvline[MAXLINE];##  5 ##src/lib/str_cli.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {##  6 ##src/lib/str_cli.c##\n\n        Writen(sockfd, sendline, strlen(sendline));##  7 ##src/lib/str_cli.c##\n\n        if (Readline(sockfd, recvline, MAXLINE) == 0)##  8 ##src/lib/str_cli.c##\n            err_quit(\"str_cli: server terminated prematurely\");##  9 ##src/lib/str_cli.c##\n\n        Fputs(recvline, stdout);## 10 ##src/lib/str_cli.c##\n    }## 11 ##src/lib/str_cli.c##\n}## 12 ##src/lib/str_cli.c##\n"
  },
  {
    "path": "lib/str_echo.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_echo(int sockfd)\n{\n\tssize_t\t\tn;\n\tchar\t\tbuf[MAXLINE];\n\nagain:\n\twhile ( (n = read(sockfd, buf, MAXLINE)) > 0)\n\t\tWriten(sockfd, buf, n);\n\n\tif (n < 0 && errno == EINTR)\n\t\tgoto again;\n\telse if (n < 0)\n\t\terr_sys(\"str_echo: read error\");\n}\n"
  },
  {
    "path": "lib/str_echo.lc",
    "content": "#include    \"unp.h\"##  1 ##src/lib/str_echo.c##\n\nvoid##  2 ##src/lib/str_echo.c##\nstr_echo(int sockfd)##  3 ##src/lib/str_echo.c##\n{##  4 ##src/lib/str_echo.c##\n    ssize_t n;##  5 ##src/lib/str_echo.c##\n    char    buf[MAXLINE];##  6 ##src/lib/str_echo.c##\n\n  again:##  7 ##src/lib/str_echo.c##\n    while ((n = read(sockfd, buf, MAXLINE)) > 0)##  8 ##src/lib/str_echo.c##\n        Writen(sockfd, buf, n);##  9 ##src/lib/str_echo.c##\n\n    if (n < 0 && errno == EINTR)## 10 ##src/lib/str_echo.c##\n        goto again;## 11 ##src/lib/str_echo.c##\n    else if (n < 0)## 12 ##src/lib/str_echo.c##\n        err_sys(\"str_echo: read error\");## 13 ##src/lib/str_echo.c##\n}## 14 ##src/lib/str_echo.c##\n"
  },
  {
    "path": "lib/tcp_connect.c",
    "content": "/* include tcp_connect */\n#include\t\"unp.h\"\n\nint\ntcp_connect(const char *host, const char *serv)\n{\n\tint\t\t\t\tsockfd, n;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_STREAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"tcp_connect error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tsockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (sockfd < 0)\n\t\t\tcontinue;\t/* ignore this one */\n\n\t\tif (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)\n\t\t\tbreak;\t\t/* success */\n\n\t\tClose(sockfd);\t/* ignore this one */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno set from final connect() */\n\t\terr_sys(\"tcp_connect error for %s, %s\", host, serv);\n\n\tfreeaddrinfo(ressave);\n\n\treturn(sockfd);\n}\n/* end tcp_connect */\n\n/*\n * We place the wrapper function here, not in wraplib.c, because some\n * XTI programs need to include wraplib.c, and it also defines\n * a Tcp_connect() function.\n */\n\nint\nTcp_connect(const char *host, const char *serv)\n{\n\treturn(tcp_connect(host, serv));\n}\n"
  },
  {
    "path": "lib/tcp_connect.lc",
    "content": "/* include tcp_connect */\n#include    \"unp.h\"##  1 ##src/lib/tcp_connect.c##\n\nint##  2 ##src/lib/tcp_connect.c##\ntcp_connect(const char *host, const char *serv)##  3 ##src/lib/tcp_connect.c##\n{##  4 ##src/lib/tcp_connect.c##\n    int     sockfd, n;##  5 ##src/lib/tcp_connect.c##\n    struct addrinfo hints, *res, *ressave;##  6 ##src/lib/tcp_connect.c##\n\n    bzero(&hints, sizeof(struct addrinfo));##  7 ##src/lib/tcp_connect.c##\n    hints.ai_family = AF_UNSPEC;##  8 ##src/lib/tcp_connect.c##\n    hints.ai_socktype = SOCK_STREAM;##  9 ##src/lib/tcp_connect.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 10 ##src/lib/tcp_connect.c##\n        err_quit(\"tcp_connect error for %s, %s: %s\",## 11 ##src/lib/tcp_connect.c##\n                 host, serv, gai_strerror(n));## 12 ##src/lib/tcp_connect.c##\n    ressave = res;## 13 ##src/lib/tcp_connect.c##\n\n    do {## 14 ##src/lib/tcp_connect.c##\n        sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);## 15 ##src/lib/tcp_connect.c##\n        if (sockfd < 0)## 16 ##src/lib/tcp_connect.c##\n            continue;           /* ignore this one */## 17 ##src/lib/tcp_connect.c##\n\n        if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)## 18 ##src/lib/tcp_connect.c##\n            break;              /* success */## 19 ##src/lib/tcp_connect.c##\n\n        Close(sockfd);          /* ignore this one */## 20 ##src/lib/tcp_connect.c##\n    } while ((res = res->ai_next) != NULL);## 21 ##src/lib/tcp_connect.c##\n\n    if (res == NULL)            /* errno set from final connect() */## 22 ##src/lib/tcp_connect.c##\n        err_sys(\"tcp_connect error for %s, %s\", host, serv);## 23 ##src/lib/tcp_connect.c##\n\n    freeaddrinfo(ressave);## 24 ##src/lib/tcp_connect.c##\n\n    return (sockfd);## 25 ##src/lib/tcp_connect.c##\n}## 26 ##src/lib/tcp_connect.c##\n/* end tcp_connect */\n\n/*## 27 ##src/lib/tcp_connect.c##\n * We place the wrapper function here, not in wraplib.c, because some## 28 ##src/lib/tcp_connect.c##\n * XTI programs need to include wraplib.c, and it also defines## 29 ##src/lib/tcp_connect.c##\n * a Tcp_connect() function.## 30 ##src/lib/tcp_connect.c##\n */## 31 ##src/lib/tcp_connect.c##\n\nint## 32 ##src/lib/tcp_connect.c##\nTcp_connect(const char *host, const char *serv)## 33 ##src/lib/tcp_connect.c##\n{## 34 ##src/lib/tcp_connect.c##\n    return (tcp_connect(host, serv));## 35 ##src/lib/tcp_connect.c##\n}## 36 ##src/lib/tcp_connect.c##\n"
  },
  {
    "path": "lib/tcp_listen.c",
    "content": "/* include tcp_listen */\n#include\t\"unp.h\"\n\nint\ntcp_listen(const char *host, const char *serv, socklen_t *addrlenp)\n{\n\tint\t\t\t\tlistenfd, n;\n\tconst int\t\ton = 1;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_flags = AI_PASSIVE;\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_STREAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"tcp_listen error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tlistenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (listenfd < 0)\n\t\t\tcontinue;\t\t/* error, try next one */\n\n\t\tSetsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\t\tif (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0)\n\t\t\tbreak;\t\t\t/* success */\n\n\t\tClose(listenfd);\t/* bind error, close and try next one */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno from final socket() or bind() */\n\t\terr_sys(\"tcp_listen error for %s, %s\", host, serv);\n\n\tListen(listenfd, LISTENQ);\n\n\tif (addrlenp)\n\t\t*addrlenp = res->ai_addrlen;\t/* return size of protocol address */\n\n\tfreeaddrinfo(ressave);\n\n\treturn(listenfd);\n}\n/* end tcp_listen */\n\n/*\n * We place the wrapper function here, not in wraplib.c, because some\n * XTI programs need to include wraplib.c, and it also defines\n * a Tcp_listen() function.\n */\n\nint\nTcp_listen(const char *host, const char *serv, socklen_t *addrlenp)\n{\n\treturn(tcp_listen(host, serv, addrlenp));\n}\n"
  },
  {
    "path": "lib/tcp_listen.lc",
    "content": "/* include tcp_listen */\n#include    \"unp.h\"##  1 ##src/lib/tcp_listen.c##\n\nint##  2 ##src/lib/tcp_listen.c##\ntcp_listen(const char *host, const char *serv, socklen_t *addrlenp)##  3 ##src/lib/tcp_listen.c##\n{##  4 ##src/lib/tcp_listen.c##\n    int     listenfd, n;##  5 ##src/lib/tcp_listen.c##\n    const int on = 1;##  6 ##src/lib/tcp_listen.c##\n    struct addrinfo hints, *res, *ressave;##  7 ##src/lib/tcp_listen.c##\n\n    bzero(&hints, sizeof(struct addrinfo));##  8 ##src/lib/tcp_listen.c##\n    hints.ai_flags = AI_PASSIVE;##  9 ##src/lib/tcp_listen.c##\n    hints.ai_family = AF_UNSPEC;## 10 ##src/lib/tcp_listen.c##\n    hints.ai_socktype = SOCK_STREAM;## 11 ##src/lib/tcp_listen.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 12 ##src/lib/tcp_listen.c##\n        err_quit(\"tcp_listen error for %s, %s: %s\",## 13 ##src/lib/tcp_listen.c##\n                 host, serv, gai_strerror(n));## 14 ##src/lib/tcp_listen.c##\n    ressave = res;## 15 ##src/lib/tcp_listen.c##\n\n    do {## 16 ##src/lib/tcp_listen.c##\n        listenfd =## 17 ##src/lib/tcp_listen.c##\n            socket(res->ai_family, res->ai_socktype, res->ai_protocol);## 18 ##src/lib/tcp_listen.c##\n        if (listenfd < 0)## 19 ##src/lib/tcp_listen.c##\n            continue;           /* error, try next one */## 20 ##src/lib/tcp_listen.c##\n\n        Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 21 ##src/lib/tcp_listen.c##\n        if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0)## 22 ##src/lib/tcp_listen.c##\n            break;              /* success */## 23 ##src/lib/tcp_listen.c##\n\n        Close(listenfd);        /* bind error, close and try next one */## 24 ##src/lib/tcp_listen.c##\n    } while ((res = res->ai_next) != NULL);## 25 ##src/lib/tcp_listen.c##\n\n    if (res == NULL)            /* errno from final socket() or bind() */## 26 ##src/lib/tcp_listen.c##\n        err_sys(\"tcp_listen error for %s, %s\", host, serv);## 27 ##src/lib/tcp_listen.c##\n\n    Listen(listenfd, LISTENQ);## 28 ##src/lib/tcp_listen.c##\n\n    if (addrlenp)## 29 ##src/lib/tcp_listen.c##\n        *addrlenp = res->ai_addrlen;    /* return size of protocol address */## 30 ##src/lib/tcp_listen.c##\n\n    freeaddrinfo(ressave);## 31 ##src/lib/tcp_listen.c##\n\n    return (listenfd);## 32 ##src/lib/tcp_listen.c##\n}## 33 ##src/lib/tcp_listen.c##\n/* end tcp_listen */\n\n/*## 34 ##src/lib/tcp_listen.c##\n * We place the wrapper function here, not in wraplib.c, because some## 35 ##src/lib/tcp_listen.c##\n * XTI programs need to include wraplib.c, and it also defines## 36 ##src/lib/tcp_listen.c##\n * a Tcp_listen() function.## 37 ##src/lib/tcp_listen.c##\n */## 38 ##src/lib/tcp_listen.c##\n\nint## 39 ##src/lib/tcp_listen.c##\nTcp_listen(const char *host, const char *serv, socklen_t *addrlenp)## 40 ##src/lib/tcp_listen.c##\n{## 41 ##src/lib/tcp_listen.c##\n    return (tcp_listen(host, serv, addrlenp));## 42 ##src/lib/tcp_listen.c##\n}## 43 ##src/lib/tcp_listen.c##\n"
  },
  {
    "path": "lib/tv_sub.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ntv_sub(struct timeval *out, struct timeval *in)\n{\n\tif ( (out->tv_usec -= in->tv_usec) < 0) {\t/* out -= in */\n\t\t--out->tv_sec;\n\t\tout->tv_usec += 1000000;\n\t}\n\tout->tv_sec -= in->tv_sec;\n}\n"
  },
  {
    "path": "lib/udp_client.c",
    "content": "/* include udp_client */\n#include\t\"unp.h\"\n\nint\nudp_client(const char *host, const char *serv, SA **saptr, socklen_t *lenp)\n{\n\tint\t\t\t\tsockfd, n;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_DGRAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"udp_client error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tsockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (sockfd >= 0)\n\t\t\tbreak;\t\t/* success */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno set from final socket() */\n\t\terr_sys(\"udp_client error for %s, %s\", host, serv);\n\n\t*saptr = Malloc(res->ai_addrlen);\n\tmemcpy(*saptr, res->ai_addr, res->ai_addrlen);\n\t*lenp = res->ai_addrlen;\n\n\tfreeaddrinfo(ressave);\n\n\treturn(sockfd);\n}\n/* end udp_client */\n\nint\nUdp_client(const char *host, const char *serv, SA **saptr, socklen_t *lenptr)\n{\n\treturn(udp_client(host, serv, saptr, lenptr));\n}\n"
  },
  {
    "path": "lib/udp_client.lc",
    "content": "/* include udp_client */\n#include    \"unp.h\"##  1 ##src/lib/udp_client.c##\n\nint##  2 ##src/lib/udp_client.c##\nudp_client(const char *host, const char *serv, SA **saptr, socklen_t *lenp)##  3 ##src/lib/udp_client.c##\n{##  4 ##src/lib/udp_client.c##\n    int     sockfd, n;##  5 ##src/lib/udp_client.c##\n    struct addrinfo hints, *res, *ressave;##  6 ##src/lib/udp_client.c##\n\n    bzero(&hints, sizeof(struct addrinfo));##  7 ##src/lib/udp_client.c##\n    hints.ai_family = AF_UNSPEC;##  8 ##src/lib/udp_client.c##\n    hints.ai_socktype = SOCK_DGRAM;##  9 ##src/lib/udp_client.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 10 ##src/lib/udp_client.c##\n        err_quit(\"udp_client error for %s, %s: %s\",## 11 ##src/lib/udp_client.c##\n                 host, serv, gai_strerror(n));## 12 ##src/lib/udp_client.c##\n    ressave = res;## 13 ##src/lib/udp_client.c##\n\n    do {## 14 ##src/lib/udp_client.c##\n        sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);## 15 ##src/lib/udp_client.c##\n        if (sockfd >= 0)## 16 ##src/lib/udp_client.c##\n            break;              /* success */## 17 ##src/lib/udp_client.c##\n    } while ((res = res->ai_next) != NULL);## 18 ##src/lib/udp_client.c##\n\n    if (res == NULL)            /* errno set from final socket() */## 19 ##src/lib/udp_client.c##\n        err_sys(\"udp_client error for %s, %s\", host, serv);## 20 ##src/lib/udp_client.c##\n\n    *saptr = Malloc(res->ai_addrlen);## 21 ##src/lib/udp_client.c##\n    memcpy(*saptr, res->ai_addr, res->ai_addrlen);## 22 ##src/lib/udp_client.c##\n    *lenp = res->ai_addrlen;## 23 ##src/lib/udp_client.c##\n\n    freeaddrinfo(ressave);## 24 ##src/lib/udp_client.c##\n\n    return (sockfd);## 25 ##src/lib/udp_client.c##\n}## 26 ##src/lib/udp_client.c##\n/* end udp_client */\n\nint## 27 ##src/lib/udp_client.c##\nUdp_client(const char *host, const char *serv, SA **saptr, socklen_t *lenptr)## 28 ##src/lib/udp_client.c##\n{## 29 ##src/lib/udp_client.c##\n    return (udp_client(host, serv, saptr, lenptr));## 30 ##src/lib/udp_client.c##\n}## 31 ##src/lib/udp_client.c##\n"
  },
  {
    "path": "lib/udp_connect.c",
    "content": "/* include udp_connect */\n#include\t\"unp.h\"\n\nint\nudp_connect(const char *host, const char *serv)\n{\n\tint\t\t\t\tsockfd, n;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_DGRAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"udp_connect error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tsockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (sockfd < 0)\n\t\t\tcontinue;\t/* ignore this one */\n\n\t\tif (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)\n\t\t\tbreak;\t\t/* success */\n\n\t\tClose(sockfd);\t/* ignore this one */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno set from final connect() */\n\t\terr_sys(\"udp_connect error for %s, %s\", host, serv);\n\n\tfreeaddrinfo(ressave);\n\n\treturn(sockfd);\n}\n/* end udp_connect */\n\nint\nUdp_connect(const char *host, const char *serv)\n{\n\tint\t\tn;\n\n\tif ( (n = udp_connect(host, serv)) < 0) {\n\t\terr_quit(\"udp_connect error for %s, %s: %s\",\n\t\t\t\t\t host, serv, gai_strerror(-n));\n\t}\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/udp_connect.lc",
    "content": "/* include udp_connect */\n#include    \"unp.h\"##  1 ##src/lib/udp_connect.c##\n\nint##  2 ##src/lib/udp_connect.c##\nudp_connect(const char *host, const char *serv)##  3 ##src/lib/udp_connect.c##\n{##  4 ##src/lib/udp_connect.c##\n    int     sockfd, n;##  5 ##src/lib/udp_connect.c##\n    struct addrinfo hints, *res, *ressave;##  6 ##src/lib/udp_connect.c##\n\n    bzero(&hints, sizeof(struct addrinfo));##  7 ##src/lib/udp_connect.c##\n    hints.ai_family = AF_UNSPEC;##  8 ##src/lib/udp_connect.c##\n    hints.ai_socktype = SOCK_DGRAM;##  9 ##src/lib/udp_connect.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 10 ##src/lib/udp_connect.c##\n        err_quit(\"udp_connect error for %s, %s: %s\",## 11 ##src/lib/udp_connect.c##\n                 host, serv, gai_strerror(n));## 12 ##src/lib/udp_connect.c##\n    ressave = res;## 13 ##src/lib/udp_connect.c##\n\n    do {## 14 ##src/lib/udp_connect.c##\n        sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);## 15 ##src/lib/udp_connect.c##\n        if (sockfd < 0)## 16 ##src/lib/udp_connect.c##\n            continue;           /* ignore this one */## 17 ##src/lib/udp_connect.c##\n\n        if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)## 18 ##src/lib/udp_connect.c##\n            break;              /* success */## 19 ##src/lib/udp_connect.c##\n\n        Close(sockfd);          /* ignore this one */## 20 ##src/lib/udp_connect.c##\n    } while ((res = res->ai_next) != NULL);## 21 ##src/lib/udp_connect.c##\n\n    if (res == NULL)            /* errno set from final connect() */## 22 ##src/lib/udp_connect.c##\n        err_sys(\"udp_connect error for %s, %s\", host, serv);## 23 ##src/lib/udp_connect.c##\n\n    freeaddrinfo(ressave);## 24 ##src/lib/udp_connect.c##\n\n    return (sockfd);## 25 ##src/lib/udp_connect.c##\n}## 26 ##src/lib/udp_connect.c##\n/* end udp_connect */\n\nint## 27 ##src/lib/udp_connect.c##\nUdp_connect(const char *host, const char *serv)## 28 ##src/lib/udp_connect.c##\n{## 29 ##src/lib/udp_connect.c##\n    int     n;## 30 ##src/lib/udp_connect.c##\n\n    if ((n = udp_connect(host, serv)) < 0) {## 31 ##src/lib/udp_connect.c##\n        err_quit(\"udp_connect error for %s, %s: %s\",## 32 ##src/lib/udp_connect.c##\n                 host, serv, gai_strerror(-n));## 33 ##src/lib/udp_connect.c##\n    }## 34 ##src/lib/udp_connect.c##\n    return (n);## 35 ##src/lib/udp_connect.c##\n}## 36 ##src/lib/udp_connect.c##\n"
  },
  {
    "path": "lib/udp_server.c",
    "content": "/* include udp_server */\n#include\t\"unp.h\"\n\nint\nudp_server(const char *host, const char *serv, socklen_t *addrlenp)\n{\n\tint\t\t\t\tsockfd, n;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_flags = AI_PASSIVE;\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_DGRAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"udp_server error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tsockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (sockfd < 0)\n\t\t\tcontinue;\t\t/* error - try next one */\n\n\t\tif (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0)\n\t\t\tbreak;\t\t\t/* success */\n\n\t\tClose(sockfd);\t\t/* bind error - close and try next one */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno from final socket() or bind() */\n\t\terr_sys(\"udp_server error for %s, %s\", host, serv);\n\n\tif (addrlenp)\n\t\t*addrlenp = res->ai_addrlen;\t/* return size of protocol address */\n\n\tfreeaddrinfo(ressave);\n\n\treturn(sockfd);\n}\n/* end udp_server */\n\nint\nUdp_server(const char *host, const char *serv, socklen_t *addrlenp)\n{\n\treturn(udp_server(host, serv, addrlenp));\n}\n"
  },
  {
    "path": "lib/udp_server.lc",
    "content": "/* include udp_server */\n#include    \"unp.h\"##  1 ##src/lib/udp_server.c##\n\nint##  2 ##src/lib/udp_server.c##\nudp_server(const char *host, const char *serv, socklen_t *addrlenp)##  3 ##src/lib/udp_server.c##\n{##  4 ##src/lib/udp_server.c##\n    int     sockfd, n;##  5 ##src/lib/udp_server.c##\n    struct addrinfo hints, *res, *ressave;##  6 ##src/lib/udp_server.c##\n\n    bzero(&hints, sizeof(struct addrinfo));##  7 ##src/lib/udp_server.c##\n    hints.ai_flags = AI_PASSIVE;##  8 ##src/lib/udp_server.c##\n    hints.ai_family = AF_UNSPEC;##  9 ##src/lib/udp_server.c##\n    hints.ai_socktype = SOCK_DGRAM;## 10 ##src/lib/udp_server.c##\n\n    if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)## 11 ##src/lib/udp_server.c##\n        err_quit(\"udp_server error for %s, %s: %s\",## 12 ##src/lib/udp_server.c##\n                 host, serv, gai_strerror(n));## 13 ##src/lib/udp_server.c##\n    ressave = res;## 14 ##src/lib/udp_server.c##\n\n    do {## 15 ##src/lib/udp_server.c##\n        sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);## 16 ##src/lib/udp_server.c##\n        if (sockfd < 0)## 17 ##src/lib/udp_server.c##\n            continue;           /* error, try next one */## 18 ##src/lib/udp_server.c##\n\n        if (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0)## 19 ##src/lib/udp_server.c##\n            break;              /* success */## 20 ##src/lib/udp_server.c##\n\n        Close(sockfd);          /* bind error, close and try next one */## 21 ##src/lib/udp_server.c##\n    } while ((res = res->ai_next) != NULL);## 22 ##src/lib/udp_server.c##\n\n    if (res == NULL)            /* errno from final socket() or bind() */## 23 ##src/lib/udp_server.c##\n        err_sys(\"udp_server error for %s, %s\", host, serv);## 24 ##src/lib/udp_server.c##\n\n    if (addrlenp)## 25 ##src/lib/udp_server.c##\n        *addrlenp = res->ai_addrlen;    /* return size of protocol address */## 26 ##src/lib/udp_server.c##\n\n    freeaddrinfo(ressave);## 27 ##src/lib/udp_server.c##\n\n    return (sockfd);## 28 ##src/lib/udp_server.c##\n}## 29 ##src/lib/udp_server.c##\n/* end udp_server */\n\nint## 30 ##src/lib/udp_server.c##\nUdp_server(const char *host, const char *serv, socklen_t *addrlenp)## 31 ##src/lib/udp_server.c##\n{## 32 ##src/lib/udp_server.c##\n    return (udp_server(host, serv, addrlenp));## 33 ##src/lib/udp_server.c##\n}## 34 ##src/lib/udp_server.c##\n"
  },
  {
    "path": "lib/unp.h",
    "content": "/* include unph */\n/* Our own header.  Tabs are set for 4 spaces, not 8 */\n\n#ifndef\t__unp_h\n#define\t__unp_h\n\n#include\t\"../config.h\"\t/* configuration options for current OS */\n\t\t\t\t\t\t\t/* \"../config.h\" is generated by configure */\n\n/* If anything changes in the following list of #includes, must change\n   acsite.m4 also, for configure's tests. */\n\n#include\t<sys/types.h>\t/* basic system data types */\n#include\t<sys/socket.h>\t/* basic socket definitions */\n#if TIME_WITH_SYS_TIME\n#include\t<sys/time.h>\t/* timeval{} for select() */\n#include\t<time.h>\t\t/* timespec{} for pselect() */\n#else\n#if HAVE_SYS_TIME_H\n#include\t<sys/time.h>\t/* includes <time.h> unsafely */\n#else\n#include\t<time.h>\t\t/* old system? */\n#endif\n#endif\n#include\t<netinet/in.h>\t/* sockaddr_in{} and other Internet defns */\n#include\t<arpa/inet.h>\t/* inet(3) functions */\n#include\t<errno.h>\n#include\t<fcntl.h>\t\t/* for nonblocking */\n#include\t<netdb.h>\n#include\t<signal.h>\n#include\t<stdio.h>\n#include\t<stdlib.h>\n#include\t<string.h>\n#include\t<sys/stat.h>\t/* for S_xxx file mode constants */\n#include\t<sys/uio.h>\t\t/* for iovec{} and readv/writev */\n#include\t<unistd.h>\n#include\t<sys/wait.h>\n#include\t<sys/un.h>\t\t/* for Unix domain sockets */\n\n#ifdef\tHAVE_SYS_SELECT_H\n# include\t<sys/select.h>\t/* for convenience */\n#endif\n\n#ifdef\tHAVE_SYS_SYSCTL_H\n#ifdef\tHAVE_SYS_PARAM_H\n# include\t<sys/param.h>\t/* OpenBSD prereq for sysctl.h */\n#endif\n# include\t<sys/sysctl.h>\n#endif\n\n#ifdef\tHAVE_POLL_H\n# include\t<poll.h>\t\t/* for convenience */\n#endif\n\n#ifdef\tHAVE_SYS_EVENT_H\n# include\t<sys/event.h>\t/* for kqueue */\n#endif\n\n#ifdef\tHAVE_STRINGS_H\n# include\t<strings.h>\t\t/* for convenience */\n#endif\n\n/* Three headers are normally needed for socket/file ioctl's:\n * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.\n */\n#ifdef\tHAVE_SYS_IOCTL_H\n# include\t<sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include\t<sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include\t<sys/sockio.h>\n#endif\n\n#ifdef\tHAVE_PTHREAD_H\n# include\t<pthread.h>\n#endif\n\n#ifdef HAVE_NET_IF_DL_H\n# include\t<net/if_dl.h>\n#endif\n\n#ifdef HAVE_NETINET_SCTP_H\n#include\t<netinet/sctp.h>\n#endif\n\n/* OSF/1 actually disables recv() and send() in <sys/socket.h> */\n#ifdef\t__osf__\n#undef\trecv\n#undef\tsend\n#define\trecv(a,b,c,d)\trecvfrom(a,b,c,d,0,0)\n#define\tsend(a,b,c,d)\tsendto(a,b,c,d,0,0)\n#endif\n\n#ifndef\tINADDR_NONE\n/* $$.Ic INADDR_NONE$$ */\n#define\tINADDR_NONE\t0xffffffff\t/* should have been in <netinet/in.h> */\n#endif\n\n#ifndef\tSHUT_RD\t\t\t\t/* these three POSIX names are new */\n#define\tSHUT_RD\t\t0\t/* shutdown for reading */\n#define\tSHUT_WR\t\t1\t/* shutdown for writing */\n#define\tSHUT_RDWR\t2\t/* shutdown for reading and writing */\n/* $$.Ic SHUT_RD$$ */\n/* $$.Ic SHUT_WR$$ */\n/* $$.Ic SHUT_RDWR$$ */\n#endif\n\n/* *INDENT-OFF* */\n#ifndef INET_ADDRSTRLEN\n/* $$.Ic INET_ADDRSTRLEN$$ */\n#define\tINET_ADDRSTRLEN\t\t16\t/* \"ddd.ddd.ddd.ddd\\0\"\n\t\t\t\t\t\t\t\t    1234567890123456 */\n#endif\n\n/* Define following even if IPv6 not supported, so we can always allocate\n   an adequately sized buffer without #ifdefs in the code. */\n#ifndef INET6_ADDRSTRLEN\n/* $$.Ic INET6_ADDRSTRLEN$$ */\n#define\tINET6_ADDRSTRLEN\t46\t/* max size of IPv6 address string:\n\t\t\t\t   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx\" or\n\t\t\t\t   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\\0\"\n\t\t\t\t    1234567890123456789012345678901234567890123456 */\n#endif\n/* *INDENT-ON* */\n\n/* Define bzero() as a macro if it's not in standard C library. */\n#ifndef\tHAVE_BZERO\n#define\tbzero(ptr,n)\t\tmemset(ptr, 0, n)\n/* $$.If bzero$$ */\n/* $$.If memset$$ */\n#endif\n\n/* Older resolvers do not have gethostbyname2() */\n#ifndef\tHAVE_GETHOSTBYNAME2\n#define\tgethostbyname2(host,family)\t\tgethostbyname((host))\n#endif\n\n/* The structure returned by recvfrom_flags() */\nstruct unp_in_pktinfo {\n  struct in_addr\tipi_addr;\t/* dst IPv4 address */\n  int\t\t\t\tipi_ifindex;/* received interface index */\n};\n/* $$.It unp_in_pktinfo$$ */\n/* $$.Ib ipi_addr$$ */\n/* $$.Ib ipi_ifindex$$ */\n\n/* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few\n   implementations support them today.  These two macros really need\n    an ALIGN() macro, but each implementation does this differently. */\n#ifndef\tCMSG_LEN\n/* $$.Im CMSG_LEN$$ */\n#define\tCMSG_LEN(size)\t\t(sizeof(struct cmsghdr) + (size))\n#endif\n#ifndef\tCMSG_SPACE\n/* $$.Im CMSG_SPACE$$ */\n#define\tCMSG_SPACE(size)\t(sizeof(struct cmsghdr) + (size))\n#endif\n\n/* POSIX requires the SUN_LEN() macro, but not all implementations DefinE\n   it (yet).  Note that this 4.4BSD macro works regardless whether there is\n   a length field or not. */\n#ifndef\tSUN_LEN\n/* $$.Im SUN_LEN$$ */\n# define\tSUN_LEN(su) \\\n\t(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))\n#endif\n\n/* POSIX renames \"Unix domain\" as \"local IPC.\"\n   Not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */\n#ifndef\tAF_LOCAL\n#define AF_LOCAL\tAF_UNIX\n#endif\n#ifndef\tPF_LOCAL\n#define PF_LOCAL\tPF_UNIX\n#endif\n\n/* POSIX requires that an #include of <poll.h> DefinE INFTIM, but many\n   systems still DefinE it in <sys/stropts.h>.  We don't want to include\n   all the STREAMS stuff if it's not needed, so we just DefinE INFTIM here.\n   This is the standard value, but there's no guarantee it is -1. */\n#ifndef INFTIM\n#define INFTIM          (-1)    /* infinite poll timeout */\n/* $$.Ic INFTIM$$ */\n#ifdef\tHAVE_POLL_H\n#define\tINFTIM_UNPH\t\t\t\t/* tell unpxti.h we defined it */\n#endif\n#endif\n\n/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many\n   kernels still #define it as 5, while actually supporting many more */\n#define\tLISTENQ\t\t1024\t/* 2nd argument to listen() */\n\n/* Miscellaneous constants */\n#define\tMAXLINE\t\t4096\t/* max text line length */\n#define\tBUFFSIZE\t8192\t/* buffer size for reads and writes */\n\n/* Define some port number that can be used for our examples */\n#define\tSERV_PORT\t\t 9877\t\t\t/* TCP and UDP */\n#define\tSERV_PORT_STR\t\"9877\"\t\t\t/* TCP and UDP */\n#define\tUNIXSTR_PATH\t\"/tmp/unix.str\"\t/* Unix domain stream */\n#define\tUNIXDG_PATH\t\t\"/tmp/unix.dg\"\t/* Unix domain datagram */\n/* $$.ix [LISTENQ]~constant,~definition~of$$ */\n/* $$.ix [MAXLINE]~constant,~definition~of$$ */\n/* $$.ix [BUFFSIZE]~constant,~definition~of$$ */\n/* $$.ix [SERV_PORT]~constant,~definition~of$$ */\n/* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */\n/* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */\n\n/* Following shortens all the typecasts of pointer arguments: */\n#define\tSA\tstruct sockaddr\n\n#ifndef HAVE_STRUCT_SOCKADDR_STORAGE\n/*\n * RFC 3493: protocol-independent placeholder for socket addresses\n */\n#define\t__SS_MAXSIZE\t128\n#define\t__SS_ALIGNSIZE\t(sizeof(int64_t))\n#ifdef HAVE_SOCKADDR_SA_LEN\n#define\t__SS_PAD1SIZE\t(__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t))\n#else\n#define\t__SS_PAD1SIZE\t(__SS_ALIGNSIZE - sizeof(sa_family_t))\n#endif\n#define\t__SS_PAD2SIZE\t(__SS_MAXSIZE - 2*__SS_ALIGNSIZE)\n\nstruct sockaddr_storage {\n#ifdef HAVE_SOCKADDR_SA_LEN\n\tu_char\t\tss_len;\n#endif\n\tsa_family_t\tss_family;\n\tchar\t\t__ss_pad1[__SS_PAD1SIZE];\n\tint64_t\t\t__ss_align;\n\tchar\t\t__ss_pad2[__SS_PAD2SIZE];\n};\n#endif\n\n#define\tFILE_MODE\t(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)\n\t\t\t\t\t/* default file access permissions for new files */\n#define\tDIR_MODE\t(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)\n\t\t\t\t\t/* default permissions for new directories */\n\ntypedef\tvoid\tSigfunc(int);\t/* for signal handlers */\n\n#define\tmin(a,b)\t((a) < (b) ? (a) : (b))\n#define\tmax(a,b)\t((a) > (b) ? (a) : (b))\n\n#ifndef\tHAVE_ADDRINFO_STRUCT\n# include\t\"../lib/addrinfo.h\"\n#endif\n\n#ifndef\tHAVE_IF_NAMEINDEX_STRUCT\nstruct if_nameindex {\n  unsigned int   if_index;  /* 1, 2, ... */\n  char          *if_name;   /* null-terminated name: \"le0\", ... */\n};\n/* $$.It if_nameindex$$ */\n/* $$.Ib if_index$$ */\n/* $$.Ib if_name$$ */\n#endif\n\n#ifndef\tHAVE_TIMESPEC_STRUCT\nstruct timespec {\n  time_t\ttv_sec;\t\t/* seconds */\n  long\t\ttv_nsec;\t/* and nanoseconds */\n};\n/* $$.It timespec$$ */\n/* $$.Ib tv_sec$$ */\n/* $$.Ib tv_nsec$$ */\n#endif\n/* end unph */\n\n\t\t\t/* prototypes for our own library functions */\nint\t\t connect_nonb(int, const SA *, socklen_t, int);\nint\t\t connect_timeo(int, const SA *, socklen_t, int);\nint\t daemon_init(const char *, int);\nvoid\t daemon_inetd(const char *, int);\nvoid\t dg_cli(FILE *, int, const SA *, socklen_t);\nvoid\t dg_echo(int, SA *, socklen_t);\nint\t\t family_to_level(int);\nchar\t*gf_time(void);\nvoid\t heartbeat_cli(int, int, int);\nvoid\t heartbeat_serv(int, int, int);\nstruct addrinfo *host_serv(const char *, const char *, int, int);\nint\t\t inet_srcrt_add(char *);\nu_char  *inet_srcrt_init(int);\nvoid\t inet_srcrt_print(u_char *, int);\nvoid\t inet6_srcrt_print(void *);\nchar   **my_addrs(int *);\nint\t\t readable_timeo(int, int);\nssize_t\t readline(int, void *, size_t);\nssize_t\t readn(int, void *, size_t);\nssize_t\t read_fd(int, void *, size_t, int *);\nssize_t\t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,\n\t\t struct unp_in_pktinfo *);\nSigfunc *signal_intr(int, Sigfunc *);\nint\t\t sock_bind_wild(int, int);\nint\t\t sock_cmp_addr(const SA *, const SA *, socklen_t);\nint\t\t sock_cmp_port(const SA *, const SA *, socklen_t);\nint\t\t sock_get_port(const SA *, socklen_t);\nvoid\t sock_set_addr(SA *, socklen_t, const void *);\nvoid\t sock_set_port(SA *, socklen_t, int);\nvoid\t sock_set_wild(SA *, socklen_t);\nchar\t*sock_ntop(const SA *, socklen_t);\nchar\t*sock_ntop_host(const SA *, socklen_t);\nint\t\t sockfd_to_family(int);\nvoid\t str_echo(int);\nvoid\t str_cli(FILE *, int);\nint\t\t tcp_connect(const char *, const char *);\nint\t\t tcp_listen(const char *, const char *, socklen_t *);\nvoid\t tv_sub(struct timeval *, struct timeval *);\nint\t\t udp_client(const char *, const char *, SA **, socklen_t *);\nint\t\t udp_connect(const char *, const char *);\nint\t\t udp_server(const char *, const char *, socklen_t *);\nint\t\t writable_timeo(int, int);\nssize_t\t writen(int, const void *, size_t);\nssize_t\t write_fd(int, void *, size_t, int);\n\n#ifdef\tMCAST\nint\t\t mcast_leave(int, const SA *, socklen_t);\nint\t\t mcast_join(int, const SA *, socklen_t, const char *, u_int);\nint\t\t mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nint\t\t mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t const SA *grp, socklen_t grplen,\n\t\t\t\t\t\t\t\t const char *ifname, u_int ifindex);\nint\t\t mcast_block_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\tconst SA *grp, socklen_t grplen);\nint\t\t mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nint\t\t mcast_get_if(int);\nint\t\t mcast_get_loop(int);\nint\t\t mcast_get_ttl(int);\nint\t\t mcast_set_if(int, const char *, u_int);\nint\t\t mcast_set_loop(int, int);\nint\t\t mcast_set_ttl(int, int);\n\nvoid\t Mcast_leave(int, const SA *, socklen_t);\nvoid\t Mcast_join(int, const SA *, socklen_t, const char *, u_int);\nvoid\t Mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nvoid\t Mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t\t const SA *grp, socklen_t grplen,\n\t\t\t\t\t\t\t\t const char *ifname, u_int ifindex);\nvoid\t Mcast_block_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\tconst SA *grp, socklen_t grplen);\nvoid\t Mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,\n\t\t\t\t\t\t\t  const SA *grp, socklen_t grplen);\nint\t\t Mcast_get_if(int);\nint\t\t Mcast_get_loop(int);\nint\t\t Mcast_get_ttl(int);\nvoid\t Mcast_set_if(int, const char *, u_int);\nvoid\t Mcast_set_loop(int, int);\nvoid\t Mcast_set_ttl(int, int);\n#endif\n\nuint16_t\tin_cksum(uint16_t *, int);\n\n#ifndef\tHAVE_GETADDRINFO_PROTO\nint\t\t getaddrinfo(const char *, const char *, const struct addrinfo *,\n\t\t\t\t\t struct addrinfo **);\nvoid\t freeaddrinfo(struct addrinfo *);\nchar\t*gai_strerror(int);\n#endif\n\n#ifndef\tHAVE_GETNAMEINFO_PROTO\nint\t\t getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);\n#endif\n\n#ifndef\tHAVE_GETHOSTNAME_PROTO\nint\t\t gethostname(char *, int);\n#endif\n\n#ifndef\tHAVE_HSTRERROR_PROTO\nconst char\t*hstrerror(int);\n#endif\n\n#ifndef\tHAVE_IF_NAMETOINDEX_PROTO\nunsigned int\t if_nametoindex(const char *);\nchar\t\t\t*if_indextoname(unsigned int, char *);\nvoid\t\t\t if_freenameindex(struct if_nameindex *);\nstruct if_nameindex *if_nameindex(void);\n#endif\n\n#ifndef\tHAVE_INET_PTON_PROTO\nint\t\t\t inet_pton(int, const char *, void *);\nconst char\t*inet_ntop(int, const void *, char *, size_t);\n#endif\n\n#ifndef\tHAVE_INET_ATON_PROTO\nint\t\t inet_aton(const char *, struct in_addr *);\n#endif\n\n#ifndef\tHAVE_PSELECT_PROTO\nint\t\t pselect(int, fd_set *, fd_set *, fd_set *,\n\t\t\t\t const struct timespec *, const sigset_t *);\n#endif\n\n#ifndef\tHAVE_SOCKATMARK_PROTO\nint\t\t sockatmark(int);\n#endif\n\n#ifndef\tHAVE_SNPRINTF_PROTO\nint\t\t snprintf(char *, size_t, const char *, ...);\n#endif\n\n\t\t\t/* prototypes for our own library wrapper functions */\nvoid\t Connect_timeo(int, const SA *, socklen_t, int);\nint\t\t Family_to_level(int);\nstruct addrinfo *Host_serv(const char *, const char *, int, int);\nconst char\t\t*Inet_ntop(int, const void *, char *, size_t);\nvoid\t\t\t Inet_pton(int, const char *, void *);\nchar\t\t\t*If_indextoname(unsigned int, char *);\nunsigned int\t\t If_nametoindex(const char *);\nstruct if_nameindex\t*If_nameindex(void);\nchar   **My_addrs(int *);\nssize_t\t Read_fd(int, void *, size_t, int *);\nint\t\t Readable_timeo(int, int);\nssize_t\t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,\n\t\t struct unp_in_pktinfo *);\nSigfunc *Signal(int, Sigfunc *);\nSigfunc *Signal_intr(int, Sigfunc *);\nint\t\t Sock_bind_wild(int, int);\nchar\t*Sock_ntop(const SA *, socklen_t);\nchar\t*Sock_ntop_host(const SA *, socklen_t);\nint\t\t Sockfd_to_family(int);\nint\t\t Tcp_connect(const char *, const char *);\nint\t\t Tcp_listen(const char *, const char *, socklen_t *);\nint\t\t Udp_client(const char *, const char *, SA **, socklen_t *);\nint\t\t Udp_connect(const char *, const char *);\nint\t\t Udp_server(const char *, const char *, socklen_t *);\nssize_t\t Write_fd(int, void *, size_t, int);\nint\t\t Writable_timeo(int, int);\n\n\t\t\t/* prototypes for our Unix wrapper functions: see {Sec errors} */\nvoid\t*Calloc(size_t, size_t);\nvoid\t Close(int);\nvoid\t Dup2(int, int);\nint\t\t Fcntl(int, int, int);\nvoid\t Gettimeofday(struct timeval *, void *);\nint\t\t Ioctl(int, int, void *);\npid_t\t Fork(void);\nvoid\t*Malloc(size_t);\nint\t Mkstemp(char *);\nvoid\t*Mmap(void *, size_t, int, int, int, off_t);\nint\t\t Open(const char *, int, mode_t);\nvoid\t Pipe(int *fds);\nssize_t\t Read(int, void *, size_t);\nvoid\t Sigaddset(sigset_t *, int);\nvoid\t Sigdelset(sigset_t *, int);\nvoid\t Sigemptyset(sigset_t *);\nvoid\t Sigfillset(sigset_t *);\nint\t\t Sigismember(const sigset_t *, int);\nvoid\t Sigpending(sigset_t *);\nvoid\t Sigprocmask(int, const sigset_t *, sigset_t *);\nchar\t*Strdup(const char *);\nlong\t Sysconf(int);\nvoid\t Sysctl(int *, u_int, void *, size_t *, void *, size_t);\nvoid\t Unlink(const char *);\npid_t\t Wait(int *);\npid_t\t Waitpid(pid_t, int *, int);\nvoid\t Write(int, void *, size_t);\n\n\t\t\t/* prototypes for our stdio wrapper functions: see {Sec errors} */\nvoid\t Fclose(FILE *);\nFILE\t*Fdopen(int, const char *);\nchar\t*Fgets(char *, int, FILE *);\nFILE\t*Fopen(const char *, const char *);\nvoid\t Fputs(const char *, FILE *);\n\n\t\t\t/* prototypes for our socket wrapper functions: see {Sec errors} */\nint\t\t Accept(int, SA *, socklen_t *);\nvoid\t Bind(int, const SA *, socklen_t);\nvoid\t Connect(int, const SA *, socklen_t);\nvoid\t Getpeername(int, SA *, socklen_t *);\nvoid\t Getsockname(int, SA *, socklen_t *);\nvoid\t Getsockopt(int, int, int, void *, socklen_t *);\n#ifdef\tHAVE_INET6_RTH_INIT\nint\t\t Inet6_rth_space(int, int);\nvoid\t*Inet6_rth_init(void *, socklen_t, int, int);\nvoid\t Inet6_rth_add(void *, const struct in6_addr *);\nvoid\t Inet6_rth_reverse(const void *, void *);\nint\t\t Inet6_rth_segments(const void *);\nstruct in6_addr *Inet6_rth_getaddr(const void *, int);\n#endif\n#ifdef\tHAVE_KQUEUE\nint\t\t Kqueue(void);\nint\t\t Kevent(int, const struct kevent *, int,\n\t\t\t\tstruct kevent *, int, const struct timespec *);\n#endif\nvoid\t Listen(int, int);\n#ifdef\tHAVE_POLL\nint\t\t Poll(struct pollfd *, unsigned long, int);\n#endif\nssize_t\t Readline(int, void *, size_t);\nssize_t\t Readn(int, void *, size_t);\nssize_t\t Recv(int, void *, size_t, int);\nssize_t\t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);\nssize_t\t Recvmsg(int, struct msghdr *, int);\nint\t\t Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);\nvoid\t Send(int, const void *, size_t, int);\nvoid\t Sendto(int, const void *, size_t, int, const SA *, socklen_t);\nvoid\t Sendmsg(int, const struct msghdr *, int);\nvoid\t Setsockopt(int, int, int, const void *, socklen_t);\nvoid\t Shutdown(int, int);\nint\t\t Sockatmark(int);\nint\t\t Socket(int, int, int);\nvoid\t Socketpair(int, int, int, int *);\nvoid\t Writen(int, void *, size_t);\n\nvoid\t err_dump(const char *, ...);\nvoid\t err_msg(const char *, ...);\nvoid\t err_quit(const char *, ...);\nvoid\t err_ret(const char *, ...);\nvoid\t err_sys(const char *, ...);\n\n#endif\t/* __unp_h */\n"
  },
  {
    "path": "lib/unp.lh",
    "content": "/* include unph */\n/* Our own header.  Tabs are set for 4 spaces, not 8 */##  1 ##src/lib/unp.h##\n\n#ifndef __unp_h##  2 ##src/lib/unp.h##\n#define __unp_h##  3 ##src/lib/unp.h##\n\n#include    \"../config.h\"       /* configuration options for current OS */##  4 ##src/lib/unp.h##\n                            /* \"../config.h\" is generated by configure */##  5 ##src/lib/unp.h##\n\n/* If anything changes in the following list of #includes, must change##  6 ##src/lib/unp.h##\n   acsite.m4 also, for configure's tests. */##  7 ##src/lib/unp.h##\n\n#include    <sys/types.h>       /* basic system data types */##  8 ##src/lib/unp.h##\n#include    <sys/socket.h>      /* basic socket definitions */##  9 ##src/lib/unp.h##\n#include    <sys/time.h>        /* timeval{} for select() */## 10 ##src/lib/unp.h##\n#include    <time.h>            /* timespec{} for pselect() */## 11 ##src/lib/unp.h##\n#include    <netinet/in.h>      /* sockaddr_in{} and other Internet defns */## 12 ##src/lib/unp.h##\n#include    <arpa/inet.h>       /* inet(3) functions */## 13 ##src/lib/unp.h##\n#include    <errno.h>## 14 ##src/lib/unp.h##\n#include    <fcntl.h>           /* for nonblocking */## 15 ##src/lib/unp.h##\n#include    <netdb.h>## 16 ##src/lib/unp.h##\n#include    <signal.h>## 17 ##src/lib/unp.h##\n#include    <stdio.h>## 18 ##src/lib/unp.h##\n#include    <stdlib.h>## 19 ##src/lib/unp.h##\n#include    <string.h>## 20 ##src/lib/unp.h##\n#include    <sys/stat.h>        /* for S_xxx file mode constants */## 21 ##src/lib/unp.h##\n#include    <sys/uio.h>         /* for iovec{} and readv/writev */## 22 ##src/lib/unp.h##\n#include    <unistd.h>## 23 ##src/lib/unp.h##\n#include    <sys/wait.h>## 24 ##src/lib/unp.h##\n#include    <sys/un.h>          /* for Unix domain sockets */## 25 ##src/lib/unp.h##\n\n#ifdef  HAVE_SYS_SELECT_H## 26 ##src/lib/unp.h##\n#include    <sys/select.h>      /* for convenience */## 27 ##src/lib/unp.h##\n#endif## 28 ##src/lib/unp.h##\n\n#ifdef  HAVE_POLL_H## 29 ##src/lib/unp.h##\n#include    <poll.h>            /* for convenience */## 30 ##src/lib/unp.h##\n#endif## 31 ##src/lib/unp.h##\n\n#ifdef  HAVE_STRINGS_H## 32 ##src/lib/unp.h##\n#include    <strings.h>         /* for convenience */## 33 ##src/lib/unp.h##\n#endif## 34 ##src/lib/unp.h##\n\n/* Three headers are normally needed for socket/file ioctl's:## 35 ##src/lib/unp.h##\n * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.## 36 ##src/lib/unp.h##\n */## 37 ##src/lib/unp.h##\n#ifdef  HAVE_SYS_IOCTL_H## 38 ##src/lib/unp.h##\n#include    <sys/ioctl.h>## 39 ##src/lib/unp.h##\n#endif## 40 ##src/lib/unp.h##\n#ifdef  HAVE_SYS_FILIO_H## 41 ##src/lib/unp.h##\n#include    <sys/filio.h>## 42 ##src/lib/unp.h##\n#endif## 43 ##src/lib/unp.h##\n#ifdef  HAVE_SYS_SOCKIO_H## 44 ##src/lib/unp.h##\n#include    <sys/sockio.h>## 45 ##src/lib/unp.h##\n#endif## 46 ##src/lib/unp.h##\n\n#ifdef  HAVE_PTHREAD_H## 47 ##src/lib/unp.h##\n#include    <pthread.h>## 48 ##src/lib/unp.h##\n#endif## 49 ##src/lib/unp.h##\n\n/* OSF/1 actually disables recv() and send() in <sys/socket.h> */## 50 ##src/lib/unp.h##\n#ifdef  __osf__## 51 ##src/lib/unp.h##\n#undef  recv## 52 ##src/lib/unp.h##\n#undef  send## 53 ##src/lib/unp.h##\n#define recv(a,b,c,d)   recvfrom(a,b,c,d,0,0)## 54 ##src/lib/unp.h##\n#define send(a,b,c,d)   sendto(a,b,c,d,0,0)## 55 ##src/lib/unp.h##\n#endif## 56 ##src/lib/unp.h##\n\n#ifndef INADDR_NONE## 57 ##src/lib/unp.h##\n/* $$.Ic INADDR_NONE$$ */\n#define INADDR_NONE 0xffffffff  /* should have been in <netinet/in.h> */## 58 ##src/lib/unp.h##\n#endif## 59 ##src/lib/unp.h##\n\n#ifndef SHUT_RD                 /* these three Posix.1g names are quite new */## 60 ##src/lib/unp.h##\n#define SHUT_RD     0           /* shutdown for reading */## 61 ##src/lib/unp.h##\n#define SHUT_WR     1           /* shutdown for writing */## 62 ##src/lib/unp.h##\n#define SHUT_RDWR   2           /* shutdown for reading and writing */## 63 ##src/lib/unp.h##\n/* $$.Ic SHUT_RD$$ */\n/* $$.Ic SHUT_WR$$ */\n/* $$.Ic SHUT_RDWR$$ */\n#endif## 64 ##src/lib/unp.h##\n#ifndef INET_ADDRSTRLEN## 65 ##src/lib/unp.h##\n/* $$.Ic INET_ADDRSTRLEN$$ */\n#define INET_ADDRSTRLEN     16  /* \"ddd.ddd.ddd.ddd\\0\"## 66 ##src/lib/unp.h##\n                                    1234567890123456 */## 67 ##src/lib/unp.h##\n#endif## 68 ##src/lib/unp.h##\n\n/* Define following even if IPv6 not supported, so we can always allocate## 69 ##src/lib/unp.h##\n   an adequately-sized buffer, without #ifdefs in the code. */## 70 ##src/lib/unp.h##\n#ifndef INET6_ADDRSTRLEN## 71 ##src/lib/unp.h##\n/* $$.Ic INET6_ADDRSTRLEN$$ */\n#define INET6_ADDRSTRLEN    46  /* max size of IPv6 address string:## 72 ##src/lib/unp.h##\n                   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx\" or## 73 ##src/lib/unp.h##\n                   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\\0\"## 74 ##src/lib/unp.h##\n                    1234567890123456789012345678901234567890123456 */## 75 ##src/lib/unp.h##\n#endif## 76 ##src/lib/unp.h##\n\n/* Define bzero() as a macro if it's not in standard C library. */## 77 ##src/lib/unp.h##\n#ifndef HAVE_BZERO## 78 ##src/lib/unp.h##\n#define bzero(ptr,n)        memset(ptr, 0, n)## 79 ##src/lib/unp.h##\n/* $$.If bzero$$ */\n/* $$.If memset$$ */\n#endif## 80 ##src/lib/unp.h##\n\n/* Older resolvers do not have gethostbyname2() */## 81 ##src/lib/unp.h##\n#ifndef HAVE_GETHOSTBYNAME2## 82 ##src/lib/unp.h##\n#define gethostbyname2(host,family)     gethostbyname((host))## 83 ##src/lib/unp.h##\n#endif## 84 ##src/lib/unp.h##\n\n/* The structure returned by recvfrom_flags() */## 85 ##src/lib/unp.h##\nstruct in_pktinfo {## 86 ##src/lib/unp.h##\n    struct in_addr ipi_addr;    /* dst IPv4 address */## 87 ##src/lib/unp.h##\n    int     ipi_ifindex;        /* received interface index */## 88 ##src/lib/unp.h##\n};## 89 ##src/lib/unp.h##\n/* $$.It in_pktinfo$$ */\n/* $$.Ib ipi_addr$$ */\n/* $$.Ib ipi_ifindex$$ */\n\n/* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few## 90 ##src/lib/unp.h##\n   implementations support them today.  These two macros really need## 91 ##src/lib/unp.h##\n   an ALIGN() macro, but each implementation does this differently. */## 92 ##src/lib/unp.h##\n#ifndef CMSG_LEN## 93 ##src/lib/unp.h##\n/* $$.Ic CMSG_LEN$$ */\n#define CMSG_LEN(size)      (sizeof(struct cmsghdr) + (size))## 94 ##src/lib/unp.h##\n#endif## 95 ##src/lib/unp.h##\n#ifndef CMSG_SPACE## 96 ##src/lib/unp.h##\n/* $$.Ic CMSG_SPACE$$ */\n#define CMSG_SPACE(size)    (sizeof(struct cmsghdr) + (size))## 97 ##src/lib/unp.h##\n#endif## 98 ##src/lib/unp.h##\n\n/* Posix.1g requires the SUN_LEN() macro but not all implementations define## 99 ##src/lib/unp.h##\n   it (yet).  Note that this 4.4BSD macro works regardless whether there is##100 ##src/lib/unp.h##\n   a length field or not. */##101 ##src/lib/unp.h##\n#ifndef SUN_LEN##102 ##src/lib/unp.h##\n/* $$.Im SUN_LEN$$ */\n#define SUN_LEN(su) \\##103 ##src/lib/unp.h##\n    (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))##104 ##src/lib/unp.h##\n#endif##105 ##src/lib/unp.h##\n\n/* Posix.1g renames \"Unix domain\" as \"local IPC\".##106 ##src/lib/unp.h##\n   But not all systems define AF_LOCAL and PF_LOCAL (yet). */##107 ##src/lib/unp.h##\n#ifndef AF_LOCAL##108 ##src/lib/unp.h##\n#define AF_LOCAL    AF_UNIX##109 ##src/lib/unp.h##\n#endif##110 ##src/lib/unp.h##\n#ifndef PF_LOCAL##111 ##src/lib/unp.h##\n#define PF_LOCAL    PF_UNIX##112 ##src/lib/unp.h##\n#endif##113 ##src/lib/unp.h##\n\n/* Posix.1g requires that an #include of <poll.h> define INFTIM, but many##114 ##src/lib/unp.h##\n   systems still define it in <sys/stropts.h>.  We don't want to include##115 ##src/lib/unp.h##\n   all the streams stuff if it's not needed, so we just define INFTIM here.##116 ##src/lib/unp.h##\n   This is the standard value, but there's no guarantee it is -1. */##117 ##src/lib/unp.h##\n#ifndef INFTIM##118 ##src/lib/unp.h##\n#define INFTIM          (-1)    /* infinite poll timeout */##119 ##src/lib/unp.h##\n/* $$.Ic INFTIM$$ */\n#ifdef  HAVE_POLL_H##120 ##src/lib/unp.h##\n#define INFTIM_UNPH             /* tell unpxti.h we defined it */##121 ##src/lib/unp.h##\n#endif##122 ##src/lib/unp.h##\n#endif##123 ##src/lib/unp.h##\n\n/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many##124 ##src/lib/unp.h##\n   kernels still #define it as 5, while actually supporting many more */##125 ##src/lib/unp.h##\n#define LISTENQ     1024        /* 2nd argument to listen() */##126 ##src/lib/unp.h##\n\n/* Miscellaneous constants */##127 ##src/lib/unp.h##\n#define MAXLINE     4096        /* max text line length */##128 ##src/lib/unp.h##\n#define MAXSOCKADDR  128        /* max socket address structure size */##129 ##src/lib/unp.h##\n#define BUFFSIZE    8192        /* buffer size for reads and writes */##130 ##src/lib/unp.h##\n\n/* Define some port number that can be used for client-servers */##131 ##src/lib/unp.h##\n#define SERV_PORT        9877   /* TCP and UDP client-servers */##132 ##src/lib/unp.h##\n#define SERV_PORT_STR   \"9877\"  /* TCP and UDP client-servers */##133 ##src/lib/unp.h##\n#define UNIXSTR_PATH    \"/tmp/unix.str\"     /* Unix domain stream cli-serv */##134 ##src/lib/unp.h##\n#define UNIXDG_PATH     \"/tmp/unix.dg\"  /* Unix domain datagram cli-serv */##135 ##src/lib/unp.h##\n/* $$.ix [LISTENQ]~constant,~definition~of$$ */\n/* $$.ix [MAXLINE]~constant,~definition~of$$ */\n/* $$.ix [MAXSOCKADDR]~constant,~definition~of$$ */\n/* $$.ix [BUFFSIZE]~constant,~definition~of$$ */\n/* $$.ix [SERV_PORT]~constant,~definition~of$$ */\n/* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */\n/* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */\n\n/* Following shortens all the type casts of pointer arguments */##136 ##src/lib/unp.h##\n#define SA  struct sockaddr##137 ##src/lib/unp.h##\n\n#define FILE_MODE   (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)##138 ##src/lib/unp.h##\n                    /* default file access permissions for new files */##139 ##src/lib/unp.h##\n#define DIR_MODE    (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)##140 ##src/lib/unp.h##\n                    /* default permissions for new directories */##141 ##src/lib/unp.h##\n\ntypedef void Sigfunc (int);     /* for signal handlers */##142 ##src/lib/unp.h##\n\n#define min(a,b)    ((a) < (b) ? (a) : (b))##143 ##src/lib/unp.h##\n#define max(a,b)    ((a) > (b) ? (a) : (b))##144 ##src/lib/unp.h##\n\n#ifndef HAVE_ADDRINFO_STRUCT##145 ##src/lib/unp.h##\n#include    \"../lib/addrinfo.h\"##146 ##src/lib/unp.h##\n#endif##147 ##src/lib/unp.h##\n\n#ifndef HAVE_IF_NAMEINDEX_STRUCT##148 ##src/lib/unp.h##\nstruct if_nameindex {##149 ##src/lib/unp.h##\n    unsigned int if_index;      /* 1, 2, ... */##150 ##src/lib/unp.h##\n    char   *if_name;            /* null terminated name: \"le0\", ... */##151 ##src/lib/unp.h##\n};##152 ##src/lib/unp.h##\n/* $$.It if_nameindex$$ */\n/* $$.Ib if_index$$ */\n/* $$.Ib if_name$$ */\n#endif##153 ##src/lib/unp.h##\n\n#ifndef HAVE_TIMESPEC_STRUCT##154 ##src/lib/unp.h##\nstruct timespec {##155 ##src/lib/unp.h##\n    time_t  tv_sec;             /* seconds */##156 ##src/lib/unp.h##\n    long    tv_nsec;            /* and nanoseconds */##157 ##src/lib/unp.h##\n};##158 ##src/lib/unp.h##\n/* $$.It timespec$$ */\n/* $$.Ib tv_sec$$ */\n/* $$.Ib tv_nsec$$ */\n#endif##159 ##src/lib/unp.h##\n/* end unph */\n\n            /* prototypes for our own library functions */##160 ##src/lib/unp.h##\nint     connect_nonb(int, const SA *, socklen_t, int);##161 ##src/lib/unp.h##\nint     connect_timeo(int, const SA *, socklen_t, int);##162 ##src/lib/unp.h##\nvoid    daemon_init(const char *, int);##163 ##src/lib/unp.h##\nvoid    daemon_inetd(const char *, int);##164 ##src/lib/unp.h##\nvoid    dg_cli(FILE *, int, const SA *, socklen_t);##165 ##src/lib/unp.h##\nvoid    dg_echo(int, SA *, socklen_t);##166 ##src/lib/unp.h##\nchar   *gf_time(void);##167 ##src/lib/unp.h##\nvoid    heartbeat_cli(int, int, int);##168 ##src/lib/unp.h##\nvoid    heartbeat_serv(int, int, int);##169 ##src/lib/unp.h##\nstruct addrinfo *host_serv(const char *, const char *, int, int);##170 ##src/lib/unp.h##\nint     inet_srcrt_add(char *, int);##171 ##src/lib/unp.h##\nu_char *inet_srcrt_init(void);##172 ##src/lib/unp.h##\nvoid    inet_srcrt_print(u_char *, int);##173 ##src/lib/unp.h##\nchar  **my_addrs(int *);##174 ##src/lib/unp.h##\nint     readable_timeo(int, int);##175 ##src/lib/unp.h##\nssize_t readline(int, void *, size_t);##176 ##src/lib/unp.h##\nssize_t readn(int, void *, size_t);##177 ##src/lib/unp.h##\nssize_t read_fd(int, void *, size_t, int *);##178 ##src/lib/unp.h##\nssize_t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,##179 ##src/lib/unp.h##\n                       struct in_pktinfo *);##180 ##src/lib/unp.h##\nSigfunc *signal_intr(int, Sigfunc *);##181 ##src/lib/unp.h##\nint     sock_bind_wild(int, int);##182 ##src/lib/unp.h##\nint     sock_cmp_addr(const SA *, const SA *, socklen_t);##183 ##src/lib/unp.h##\nint     sock_cmp_port(const SA *, const SA *, socklen_t);##184 ##src/lib/unp.h##\nint     sock_get_port(const SA *, socklen_t);##185 ##src/lib/unp.h##\nvoid    sock_set_addr(SA *, socklen_t, const void *);##186 ##src/lib/unp.h##\nvoid    sock_set_port(SA *, socklen_t, int);##187 ##src/lib/unp.h##\nvoid    sock_set_wild(SA *, socklen_t);##188 ##src/lib/unp.h##\nchar   *sock_ntop(const SA *, socklen_t);##189 ##src/lib/unp.h##\nchar   *sock_ntop_host(const SA *, socklen_t);##190 ##src/lib/unp.h##\nint     sockfd_to_family(int);##191 ##src/lib/unp.h##\nvoid    str_echo(int);##192 ##src/lib/unp.h##\nvoid    str_cli(FILE *, int);##193 ##src/lib/unp.h##\nint     tcp_connect(const char *, const char *);##194 ##src/lib/unp.h##\nint     tcp_listen(const char *, const char *, socklen_t *);##195 ##src/lib/unp.h##\nvoid    tv_sub(struct timeval *, struct timeval *);##196 ##src/lib/unp.h##\nint     udp_client(const char *, const char *, void **, socklen_t *);##197 ##src/lib/unp.h##\nint     udp_connect(const char *, const char *);##198 ##src/lib/unp.h##\nint     udp_server(const char *, const char *, socklen_t *);##199 ##src/lib/unp.h##\nint     writable_timeo(int, int);##200 ##src/lib/unp.h##\nssize_t writen(int, const void *, size_t);##201 ##src/lib/unp.h##\nssize_t write_fd(int, void *, size_t, int);##202 ##src/lib/unp.h##\n\n#ifdef  MCAST##203 ##src/lib/unp.h##\nint     mcast_leave(int, const SA *, socklen_t);##204 ##src/lib/unp.h##\nint     mcast_join(int, const SA *, socklen_t, const char *, u_int);##205 ##src/lib/unp.h##\nint     mcast_get_if(int);##206 ##src/lib/unp.h##\nint     mcast_get_loop(int);##207 ##src/lib/unp.h##\nint     mcast_get_ttl(int);##208 ##src/lib/unp.h##\nint     mcast_set_if(int, const char *, u_int);##209 ##src/lib/unp.h##\nint     mcast_set_loop(int, int);##210 ##src/lib/unp.h##\nint     mcast_set_ttl(int, int);##211 ##src/lib/unp.h##\n\nvoid    Mcast_leave(int, const SA *, socklen_t);##212 ##src/lib/unp.h##\nvoid    Mcast_join(int, const SA *, socklen_t, const char *, u_int);##213 ##src/lib/unp.h##\nint     Mcast_get_if(int);##214 ##src/lib/unp.h##\nint     Mcast_get_loop(int);##215 ##src/lib/unp.h##\nint     Mcast_get_ttl(int);##216 ##src/lib/unp.h##\nvoid    Mcast_set_if(int, const char *, u_int);##217 ##src/lib/unp.h##\nvoid    Mcast_set_loop(int, int);##218 ##src/lib/unp.h##\nvoid    Mcast_set_ttl(int, int);##219 ##src/lib/unp.h##\n#endif##220 ##src/lib/unp.h##\n\nunsigned short in_cksum(unsigned short *, int);##221 ##src/lib/unp.h##\n\n#ifndef HAVE_GETADDRINFO_PROTO##222 ##src/lib/unp.h##\nint     getaddrinfo(const char *, const char *, const struct addrinfo *,##223 ##src/lib/unp.h##\n                    struct addrinfo **);##224 ##src/lib/unp.h##\nvoid    freeaddrinfo(struct addrinfo *);##225 ##src/lib/unp.h##\nchar   *gai_strerror(int);##226 ##src/lib/unp.h##\n#endif##227 ##src/lib/unp.h##\n\n#ifndef HAVE_GETNAMEINFO_PROTO##228 ##src/lib/unp.h##\nint     getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);##229 ##src/lib/unp.h##\n#endif##230 ##src/lib/unp.h##\n\n#ifndef HAVE_GETHOSTNAME_PROTO##231 ##src/lib/unp.h##\nint     gethostname(char *, int);##232 ##src/lib/unp.h##\n#endif##233 ##src/lib/unp.h##\n\n#ifndef HAVE_HSTRERROR_PROTO##234 ##src/lib/unp.h##\nconst char *hstrerror(int);##235 ##src/lib/unp.h##\n#endif##236 ##src/lib/unp.h##\n\n#ifndef HAVE_IF_NAMETOINDEX_PROTO##237 ##src/lib/unp.h##\nunsigned int if_nametoindex(const char *);##238 ##src/lib/unp.h##\nchar   *if_indextoname(unsigned int, char *);##239 ##src/lib/unp.h##\nvoid    if_freenameindex(struct if_nameindex *);##240 ##src/lib/unp.h##\nstruct if_nameindex *if_nameindex(void);##241 ##src/lib/unp.h##\n#endif##242 ##src/lib/unp.h##\n\n#ifndef HAVE_INET_PTON_PROTO##243 ##src/lib/unp.h##\nint     inet_pton(int, const char *, void *);##244 ##src/lib/unp.h##\nconst char *inet_ntop(int, const void *, char *, size_t);##245 ##src/lib/unp.h##\n#endif##246 ##src/lib/unp.h##\n\n#ifndef HAVE_INET_ATON_PROTO##247 ##src/lib/unp.h##\nint     inet_aton(const char *, struct in_addr *);##248 ##src/lib/unp.h##\n#endif##249 ##src/lib/unp.h##\n\n#ifndef HAVE_ISFDTYPE_PROTO##250 ##src/lib/unp.h##\nint     isfdtype(int, int);##251 ##src/lib/unp.h##\n#endif##252 ##src/lib/unp.h##\n\n#ifndef HAVE_PSELECT_PROTO##253 ##src/lib/unp.h##\nint     pselect(int, fd_set *, fd_set *, fd_set *,##254 ##src/lib/unp.h##\n                const struct timespec *, const sigset_t *);##255 ##src/lib/unp.h##\n#endif##256 ##src/lib/unp.h##\n\n#ifndef HAVE_SOCKATMARK_PROTO##257 ##src/lib/unp.h##\nint     sockatmark(int);##258 ##src/lib/unp.h##\n#endif##259 ##src/lib/unp.h##\n\n#ifndef HAVE_SNPRINTF_PROTO##260 ##src/lib/unp.h##\nint     snprintf(char *, size_t, const char *,...);##261 ##src/lib/unp.h##\n#endif##262 ##src/lib/unp.h##\n\n            /* prototypes for our own library wrapper functions */##263 ##src/lib/unp.h##\nvoid    Connect_timeo(int, const SA *, socklen_t, int);##264 ##src/lib/unp.h##\nstruct addrinfo *Host_serv(const char *, const char *, int, int);##265 ##src/lib/unp.h##\nconst char *Inet_ntop(int, const void *, char *, size_t);##266 ##src/lib/unp.h##\nvoid    Inet_pton(int, const char *, void *);##267 ##src/lib/unp.h##\nchar   *If_indextoname(unsigned int, char *);##268 ##src/lib/unp.h##\nunsigned int If_nametoindex(const char *);##269 ##src/lib/unp.h##\nstruct if_nameindex *If_nameindex(void);##270 ##src/lib/unp.h##\nchar  **My_addrs(int *);##271 ##src/lib/unp.h##\nssize_t Read_fd(int, void *, size_t, int *);##272 ##src/lib/unp.h##\nint     Readable_timeo(int, int);##273 ##src/lib/unp.h##\nssize_t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,##274 ##src/lib/unp.h##\n                       struct in_pktinfo *);##275 ##src/lib/unp.h##\nSigfunc *Signal(int, Sigfunc *);##276 ##src/lib/unp.h##\nSigfunc *Signal_intr(int, Sigfunc *);##277 ##src/lib/unp.h##\nint     Sock_bind_wild(int, int);##278 ##src/lib/unp.h##\nchar   *Sock_ntop(const SA *, socklen_t);##279 ##src/lib/unp.h##\nchar   *Sock_ntop_host(const SA *, socklen_t);##280 ##src/lib/unp.h##\nint     Sockfd_to_family(int);##281 ##src/lib/unp.h##\nint     Tcp_connect(const char *, const char *);##282 ##src/lib/unp.h##\nint     Tcp_listen(const char *, const char *, socklen_t *);##283 ##src/lib/unp.h##\nint     Udp_client(const char *, const char *, void **, socklen_t *);##284 ##src/lib/unp.h##\nint     Udp_connect(const char *, const char *);##285 ##src/lib/unp.h##\nint     Udp_server(const char *, const char *, socklen_t *);##286 ##src/lib/unp.h##\nssize_t Write_fd(int, void *, size_t, int);##287 ##src/lib/unp.h##\nint     Writable_timeo(int, int);##288 ##src/lib/unp.h##\n\n            /* prototypes for our Unix wrapper functions: see {Sec errors} */##289 ##src/lib/unp.h##\nvoid   *Calloc(size_t, size_t);##290 ##src/lib/unp.h##\nvoid    Close(int);##291 ##src/lib/unp.h##\nvoid    Dup2(int, int);##292 ##src/lib/unp.h##\nint     Fcntl(int, int, int);##293 ##src/lib/unp.h##\nvoid    Gettimeofday(struct timeval *, void *);##294 ##src/lib/unp.h##\nint     Ioctl(int, int, void *);##295 ##src/lib/unp.h##\npid_t   Fork(void);##296 ##src/lib/unp.h##\nvoid   *Malloc(size_t);##297 ##src/lib/unp.h##\nvoid    Mktemp(char *);##298 ##src/lib/unp.h##\nvoid   *Mmap(void *, size_t, int, int, int, off_t);##299 ##src/lib/unp.h##\nint     Open(const char *, int, mode_t);##300 ##src/lib/unp.h##\nvoid    Pipe(int *fds);##301 ##src/lib/unp.h##\nssize_t Read(int, void *, size_t);##302 ##src/lib/unp.h##\nvoid    Sigaddset(sigset_t *, int);##303 ##src/lib/unp.h##\nvoid    Sigdelset(sigset_t *, int);##304 ##src/lib/unp.h##\nvoid    Sigemptyset(sigset_t *);##305 ##src/lib/unp.h##\nvoid    Sigfillset(sigset_t *);##306 ##src/lib/unp.h##\nint     Sigismember(const sigset_t *, int);##307 ##src/lib/unp.h##\nvoid    Sigpending(sigset_t *);##308 ##src/lib/unp.h##\nvoid    Sigprocmask(int, const sigset_t *, sigset_t *);##309 ##src/lib/unp.h##\nchar   *Strdup(const char *);##310 ##src/lib/unp.h##\nlong    Sysconf(int);##311 ##src/lib/unp.h##\nvoid    Sysctl(int *, u_int, void *, size_t *, void *, size_t);##312 ##src/lib/unp.h##\nvoid    Unlink(const char *);##313 ##src/lib/unp.h##\npid_t   Wait(int *);##314 ##src/lib/unp.h##\npid_t   Waitpid(pid_t, int *, int);##315 ##src/lib/unp.h##\nvoid    Write(int, void *, size_t);##316 ##src/lib/unp.h##\n\n            /* prototypes for our stdio wrapper functions: see {Sec errors} */##317 ##src/lib/unp.h##\nvoid    Fclose(FILE *);##318 ##src/lib/unp.h##\nFILE   *Fdopen(int, const char *);##319 ##src/lib/unp.h##\nchar   *Fgets(char *, int, FILE *);##320 ##src/lib/unp.h##\nFILE   *Fopen(const char *, const char *);##321 ##src/lib/unp.h##\nvoid    Fputs(const char *, FILE *);##322 ##src/lib/unp.h##\n\n            /* prototypes for our socket wrapper functions: see {Sec errors} */##323 ##src/lib/unp.h##\nint     Accept(int, SA *, socklen_t *);##324 ##src/lib/unp.h##\nvoid    Bind(int, const SA *, socklen_t);##325 ##src/lib/unp.h##\nvoid    Connect(int, const SA *, socklen_t);##326 ##src/lib/unp.h##\nvoid    Getpeername(int, SA *, socklen_t *);##327 ##src/lib/unp.h##\nvoid    Getsockname(int, SA *, socklen_t *);##328 ##src/lib/unp.h##\nvoid    Getsockopt(int, int, int, void *, socklen_t *);##329 ##src/lib/unp.h##\nint     Isfdtype(int, int);##330 ##src/lib/unp.h##\nvoid    Listen(int, int);##331 ##src/lib/unp.h##\n#ifdef  HAVE_POLL##332 ##src/lib/unp.h##\nint     Poll(struct pollfd *, unsigned long, int);##333 ##src/lib/unp.h##\n#endif##334 ##src/lib/unp.h##\nssize_t Readline(int, void *, size_t);##335 ##src/lib/unp.h##\nssize_t Readn(int, void *, size_t);##336 ##src/lib/unp.h##\nssize_t Recv(int, void *, size_t, int);##337 ##src/lib/unp.h##\nssize_t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);##338 ##src/lib/unp.h##\nssize_t Recvmsg(int, struct msghdr *, int);##339 ##src/lib/unp.h##\nint     Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);##340 ##src/lib/unp.h##\nvoid    Send(int, const void *, size_t, int);##341 ##src/lib/unp.h##\nvoid    Sendto(int, const void *, size_t, int, const SA *, socklen_t);##342 ##src/lib/unp.h##\nvoid    Sendmsg(int, const struct msghdr *, int);##343 ##src/lib/unp.h##\nvoid    Setsockopt(int, int, int, const void *, socklen_t);##344 ##src/lib/unp.h##\nvoid    Shutdown(int, int);##345 ##src/lib/unp.h##\nint     Sockatmark(int);##346 ##src/lib/unp.h##\nint     Socket(int, int, int);##347 ##src/lib/unp.h##\nvoid    Socketpair(int, int, int, int *);##348 ##src/lib/unp.h##\nvoid    Writen(int, void *, size_t);##349 ##src/lib/unp.h##\n\nvoid    err_dump(const char *,...);##350 ##src/lib/unp.h##\nvoid    err_msg(const char *,...);##351 ##src/lib/unp.h##\nvoid    err_quit(const char *,...);##352 ##src/lib/unp.h##\nvoid    err_ret(const char *,...);##353 ##src/lib/unp.h##\nvoid    err_sys(const char *,...);##354 ##src/lib/unp.h##\n\n#endif  /* __unp_h */##355 ##src/lib/unp.h##\n"
  },
  {
    "path": "lib/unpifi.h",
    "content": "/* Our own header for the programs that need interface configuration info.\n   Include this file, instead of \"unp.h\". */\n\n#ifndef\t__unp_ifi_h\n#define\t__unp_ifi_h\n\n#include\t\"unp.h\"\n#include\t<net/if.h>\n\n#define\tIFI_NAME\t16\t\t\t/* same as IFNAMSIZ in <net/if.h> */\n#define\tIFI_HADDR\t 8\t\t\t/* allow for 64-bit EUI-64 in future */\n\nstruct ifi_info {\n  char    ifi_name[IFI_NAME];\t/* interface name, null-terminated */\n  short   ifi_index;\t\t\t/* interface index */\n  short   ifi_mtu;\t\t\t\t/* interface MTU */\n  u_char  ifi_haddr[IFI_HADDR];\t/* hardware address */\n  u_short ifi_hlen;\t\t\t\t/* # bytes in hardware address: 0, 6, 8 */\n  short   ifi_flags;\t\t\t/* IFF_xxx constants from <net/if.h> */\n  short   ifi_myflags;\t\t\t/* our own IFI_xxx flags */\n  struct sockaddr  *ifi_addr;\t/* primary address */\n  struct sockaddr  *ifi_brdaddr;/* broadcast address */\n  struct sockaddr  *ifi_dstaddr;/* destination address */\n  struct ifi_info  *ifi_next;\t/* next of these structures */\n};\n\n#define\tIFI_ALIAS\t1\t\t\t/* ifi_addr is an alias */\n\n\t\t\t\t\t/* function prototypes */\nstruct ifi_info\t*get_ifi_info(int, int);\nstruct ifi_info\t*Get_ifi_info(int, int);\nvoid\t\t\t free_ifi_info(struct ifi_info *);\n\n#endif\t/* __unp_ifi_h */\n"
  },
  {
    "path": "lib/unprtt.h",
    "content": "#ifndef\t__unp_rtt_h\n#define\t__unp_rtt_h\n\n#include\t\"unp.h\"\n\nstruct rtt_info {\n  float\t\trtt_rtt;\t/* most recent measured RTT, in seconds */\n  float\t\trtt_srtt;\t/* smoothed RTT estimator, in seconds */\n  float\t\trtt_rttvar;\t/* smoothed mean deviation, in seconds */\n  float\t\trtt_rto;\t/* current RTO to use, in seconds */\n  int\t\trtt_nrexmt;\t/* # times retransmitted: 0, 1, 2, ... */\n  uint32_t\trtt_base;\t/* # sec since 1/1/1970 at start */\n};\n\n#define\tRTT_RXTMIN      2\t/* min retransmit timeout value, in seconds */\n#define\tRTT_RXTMAX     60\t/* max retransmit timeout value, in seconds */\n#define\tRTT_MAXNREXMT \t3\t/* max # times to retransmit */\n\n\t\t\t\t/* function prototypes */\nvoid\t rtt_debug(struct rtt_info *);\nvoid\t rtt_init(struct rtt_info *);\nvoid\t rtt_newpack(struct rtt_info *);\nint\t\t rtt_start(struct rtt_info *);\nvoid\t rtt_stop(struct rtt_info *, uint32_t);\nint\t\t rtt_timeout(struct rtt_info *);\nuint32_t rtt_ts(struct rtt_info *);\n\nextern int\trtt_d_flag;\t/* can be set to nonzero for addl info */\n\n#endif\t/* __unp_rtt_h */\n"
  },
  {
    "path": "lib/unprtt.lh",
    "content": "#ifndef __unp_rtt_h##  1 ##src/lib/unprtt.h##\n#define __unp_rtt_h##  2 ##src/lib/unprtt.h##\n\n#include    \"unp.h\"##  3 ##src/lib/unprtt.h##\n\nstruct rtt_info {##  4 ##src/lib/unprtt.h##\n    float   rtt_rtt;            /* most recent measured RTT, seconds */##  5 ##src/lib/unprtt.h##\n    float   rtt_srtt;           /* smoothed RTT estimator, seconds */##  6 ##src/lib/unprtt.h##\n    float   rtt_rttvar;         /* smoothed mean deviation, seconds */##  7 ##src/lib/unprtt.h##\n    float   rtt_rto;            /* current RTO to use, seconds */##  8 ##src/lib/unprtt.h##\n    int     rtt_nrexmt;         /* #times retransmitted: 0, 1, 2, ... */##  9 ##src/lib/unprtt.h##\n    uint32_t rtt_base;          /* #sec since 1/1/1970 at start */## 10 ##src/lib/unprtt.h##\n};## 11 ##src/lib/unprtt.h##\n\n#define RTT_RXTMIN      2       /* min retransmit timeout value, seconds */## 12 ##src/lib/unprtt.h##\n#define RTT_RXTMAX     60       /* max retransmit timeout value, seconds */## 13 ##src/lib/unprtt.h##\n#define RTT_MAXNREXMT   3       /* max #times to retransmit */## 14 ##src/lib/unprtt.h##\n\n                /* function prototypes */## 15 ##src/lib/unprtt.h##\nvoid    rtt_debug(struct rtt_info *);## 16 ##src/lib/unprtt.h##\nvoid    rtt_init(struct rtt_info *);## 17 ##src/lib/unprtt.h##\nvoid    rtt_newpack(struct rtt_info *);## 18 ##src/lib/unprtt.h##\nint     rtt_start(struct rtt_info *);## 19 ##src/lib/unprtt.h##\nvoid    rtt_stop(struct rtt_info *, uint32_t);## 20 ##src/lib/unprtt.h##\nint     rtt_timeout(struct rtt_info *);## 21 ##src/lib/unprtt.h##\nuint32_t rtt_ts(struct rtt_info *);## 22 ##src/lib/unprtt.h##\n\nextern int rtt_d_flag;          /* can be set nonzero for addl info */## 23 ##src/lib/unprtt.h##\n\n#endif  /* __unp_rtt_h */## 24 ##src/lib/unprtt.h##\n"
  },
  {
    "path": "lib/unpthread.h",
    "content": "/* Our own header for the programs that use threads.\n   Include this file, instead of \"unp.h\". */\n\n#ifndef\t__unp_pthread_h\n#define\t__unp_pthread_h\n\n#include\t\"unp.h\"\n\nvoid\tPthread_create(pthread_t *, const pthread_attr_t *,\n\t\t\t\t\t   void * (*)(void *), void *);\nvoid\tPthread_join(pthread_t, void **);\nvoid\tPthread_detach(pthread_t);\nvoid\tPthread_kill(pthread_t, int);\n\nvoid\tPthread_mutexattr_init(pthread_mutexattr_t *);\nvoid\tPthread_mutexattr_setpshared(pthread_mutexattr_t *, int);\nvoid\tPthread_mutex_init(pthread_mutex_t *, pthread_mutexattr_t *);\nvoid\tPthread_mutex_lock(pthread_mutex_t *);\nvoid\tPthread_mutex_unlock(pthread_mutex_t *);\n\nvoid\tPthread_cond_broadcast(pthread_cond_t *);\nvoid\tPthread_cond_signal(pthread_cond_t *);\nvoid\tPthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);\nvoid\tPthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,\n\t\t\t\t\t\t\t   const struct timespec *);\n\nvoid\tPthread_key_create(pthread_key_t *, void (*)(void *));\nvoid\tPthread_setspecific(pthread_key_t, const void *);\nvoid\tPthread_once(pthread_once_t *, void (*)(void));\n\n#endif\t/* __unp_pthread_h */\n"
  },
  {
    "path": "lib/wraplib.c",
    "content": "/*\n * Wrapper functions for our own library functions.\n * Most are included in the source file for the function itself.\n */\n\n#include\t\"unp.h\"\n\nconst char *\nInet_ntop(int family, const void *addrptr, char *strptr, size_t len)\n{\n\tconst char\t*ptr;\n\n\tif (strptr == NULL)\t\t/* check for old code */\n\t\terr_quit(\"NULL 3rd argument to inet_ntop\");\n\tif ( (ptr = inet_ntop(family, addrptr, strptr, len)) == NULL)\n\t\terr_sys(\"inet_ntop error\");\t\t/* sets errno */\n\treturn(ptr);\n}\n\nvoid\nInet_pton(int family, const char *strptr, void *addrptr)\n{\n\tint\t\tn;\n\n\tif ( (n = inet_pton(family, strptr, addrptr)) < 0)\n\t\terr_sys(\"inet_pton error for %s\", strptr);\t/* errno set */\n\telse if (n == 0)\n\t\terr_quit(\"inet_pton error for %s\", strptr);\t/* errno not set */\n\n\t/* nothing to return */\n}\n"
  },
  {
    "path": "lib/wrappthread.c",
    "content": "/*\n * pthreads wrapper functions.\n */\n\n#include\t\"unp.h\"\n#include\t\"unpthread.h\"\n\nvoid\nPthread_create(pthread_t *tid, const pthread_attr_t *attr,\n\t\t\t   void * (*func)(void *), void *arg)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_create(tid, attr, func, arg)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_create error\");\n}\n\nvoid\nPthread_join(pthread_t tid, void **status)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_join(tid, status)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_join error\");\n}\n\nvoid\nPthread_detach(pthread_t tid)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_detach(tid)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_detach error\");\n}\n\nvoid\nPthread_kill(pthread_t tid, int signo)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_kill(tid, signo)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_kill error\");\n}\n\nvoid\nPthread_mutexattr_init(pthread_mutexattr_t *attr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_mutexattr_init(attr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_mutexattr_init error\");\n}\n\n#ifdef\t_POSIX_THREAD_PROCESS_SHARED\nvoid\nPthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int flag)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_mutexattr_setpshared(attr, flag)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_mutexattr_setpshared error\");\n}\n#endif\n\nvoid\nPthread_mutex_init(pthread_mutex_t *mptr, pthread_mutexattr_t *attr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_mutex_init(mptr, attr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_mutex_init error\");\n}\n\n/* include Pthread_mutex_lock */\nvoid\nPthread_mutex_lock(pthread_mutex_t *mptr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_mutex_lock(mptr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_mutex_lock error\");\n}\n/* end Pthread_mutex_lock */\n\nvoid\nPthread_mutex_unlock(pthread_mutex_t *mptr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_mutex_unlock(mptr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_mutex_unlock error\");\n}\n\nvoid\nPthread_cond_broadcast(pthread_cond_t *cptr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_cond_broadcast(cptr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_cond_broadcast error\");\n}\n\nvoid\nPthread_cond_signal(pthread_cond_t *cptr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_cond_signal(cptr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_cond_signal error\");\n}\n\nvoid\nPthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_cond_wait(cptr, mptr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_cond_wait error\");\n}\n\nvoid\nPthread_cond_timedwait(pthread_cond_t *cptr, pthread_mutex_t *mptr,\n\t\t\t\t\t   const struct timespec *tsptr)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_cond_timedwait(cptr, mptr, tsptr)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_cond_timedwait error\");\n}\n\nvoid\nPthread_once(pthread_once_t *ptr, void (*func)(void))\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_once(ptr, func)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_once error\");\n}\n\nvoid\nPthread_key_create(pthread_key_t *key, void (*func)(void *))\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_key_create(key, func)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_key_create error\");\n}\n\nvoid\nPthread_setspecific(pthread_key_t key, const void *value)\n{\n\tint\t\tn;\n\n\tif ( (n = pthread_setspecific(key, value)) == 0)\n\t\treturn;\n\terrno = n;\n\terr_sys(\"pthread_setspecific error\");\n}\n"
  },
  {
    "path": "lib/wrappthread.lc",
    "content": "/*##  1 ##src/lib/wrappthread.c##\n * pthreads wrapper functions.##  2 ##src/lib/wrappthread.c##\n */##  3 ##src/lib/wrappthread.c##\n\n#include    \"unp.h\"##  4 ##src/lib/wrappthread.c##\n#include    \"unpthread.h\"##  5 ##src/lib/wrappthread.c##\n\nvoid##  6 ##src/lib/wrappthread.c##\nPthread_create(pthread_t * tid, const pthread_attr_t * attr,##  7 ##src/lib/wrappthread.c##\n               void *(*func) (void *), void *arg)##  8 ##src/lib/wrappthread.c##\n{##  9 ##src/lib/wrappthread.c##\n    int     n;## 10 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_create(tid, attr, func, arg)) == 0)## 11 ##src/lib/wrappthread.c##\n        return;## 12 ##src/lib/wrappthread.c##\n    errno = n;## 13 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_create error\");## 14 ##src/lib/wrappthread.c##\n}## 15 ##src/lib/wrappthread.c##\n\nvoid## 16 ##src/lib/wrappthread.c##\nPthread_join(pthread_t tid, void **status)## 17 ##src/lib/wrappthread.c##\n{## 18 ##src/lib/wrappthread.c##\n    int     n;## 19 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_join(tid, status)) == 0)## 20 ##src/lib/wrappthread.c##\n        return;## 21 ##src/lib/wrappthread.c##\n    errno = n;## 22 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_join error\");## 23 ##src/lib/wrappthread.c##\n}## 24 ##src/lib/wrappthread.c##\n\nvoid## 25 ##src/lib/wrappthread.c##\nPthread_detach(pthread_t tid)## 26 ##src/lib/wrappthread.c##\n{## 27 ##src/lib/wrappthread.c##\n    int     n;## 28 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_detach(tid)) == 0)## 29 ##src/lib/wrappthread.c##\n        return;## 30 ##src/lib/wrappthread.c##\n    errno = n;## 31 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_detach error\");## 32 ##src/lib/wrappthread.c##\n}## 33 ##src/lib/wrappthread.c##\n\nvoid## 34 ##src/lib/wrappthread.c##\nPthread_kill(pthread_t tid, int signo)## 35 ##src/lib/wrappthread.c##\n{## 36 ##src/lib/wrappthread.c##\n    int     n;## 37 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_kill(tid, signo)) == 0)## 38 ##src/lib/wrappthread.c##\n        return;## 39 ##src/lib/wrappthread.c##\n    errno = n;## 40 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_kill error\");## 41 ##src/lib/wrappthread.c##\n}## 42 ##src/lib/wrappthread.c##\n\nvoid## 43 ##src/lib/wrappthread.c##\nPthread_mutexattr_init(pthread_mutexattr_t * attr)## 44 ##src/lib/wrappthread.c##\n{## 45 ##src/lib/wrappthread.c##\n    int     n;## 46 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_mutexattr_init(attr)) == 0)## 47 ##src/lib/wrappthread.c##\n        return;## 48 ##src/lib/wrappthread.c##\n    errno = n;## 49 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_mutexattr_init error\");## 50 ##src/lib/wrappthread.c##\n}## 51 ##src/lib/wrappthread.c##\n\n#ifdef  _POSIX_THREAD_PROCESS_SHARED## 52 ##src/lib/wrappthread.c##\nvoid## 53 ##src/lib/wrappthread.c##\nPthread_mutexattr_setpshared(pthread_mutexattr_t * attr, int flag)## 54 ##src/lib/wrappthread.c##\n{## 55 ##src/lib/wrappthread.c##\n    int     n;## 56 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_mutexattr_setpshared(attr, flag)) == 0)## 57 ##src/lib/wrappthread.c##\n        return;## 58 ##src/lib/wrappthread.c##\n    errno = n;## 59 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_mutexattr_setpshared error\");## 60 ##src/lib/wrappthread.c##\n}## 61 ##src/lib/wrappthread.c##\n#endif## 62 ##src/lib/wrappthread.c##\n\nvoid## 63 ##src/lib/wrappthread.c##\nPthread_mutex_init(pthread_mutex_t *mptr, pthread_mutexattr_t * attr)## 64 ##src/lib/wrappthread.c##\n{## 65 ##src/lib/wrappthread.c##\n    int     n;## 66 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_mutex_init(mptr, attr)) == 0)## 67 ##src/lib/wrappthread.c##\n        return;## 68 ##src/lib/wrappthread.c##\n    errno = n;## 69 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_mutex_init error\");## 70 ##src/lib/wrappthread.c##\n}## 71 ##src/lib/wrappthread.c##\n\n/* include Pthread_mutex_lock */\nvoid## 72 ##src/lib/wrappthread.c##\nPthread_mutex_lock(pthread_mutex_t *mptr)## 73 ##src/lib/wrappthread.c##\n{## 74 ##src/lib/wrappthread.c##\n    int     n;## 75 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_mutex_lock(mptr)) == 0)## 76 ##src/lib/wrappthread.c##\n        return;## 77 ##src/lib/wrappthread.c##\n    errno = n;## 78 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_mutex_lock error\");## 79 ##src/lib/wrappthread.c##\n}## 80 ##src/lib/wrappthread.c##\n/* end Pthread_mutex_lock */\n\nvoid## 81 ##src/lib/wrappthread.c##\nPthread_mutex_unlock(pthread_mutex_t *mptr)## 82 ##src/lib/wrappthread.c##\n{## 83 ##src/lib/wrappthread.c##\n    int     n;## 84 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_mutex_unlock(mptr)) == 0)## 85 ##src/lib/wrappthread.c##\n        return;## 86 ##src/lib/wrappthread.c##\n    errno = n;## 87 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_mutex_unlock error\");## 88 ##src/lib/wrappthread.c##\n}## 89 ##src/lib/wrappthread.c##\n\nvoid## 90 ##src/lib/wrappthread.c##\nPthread_cond_broadcast(pthread_cond_t *cptr)## 91 ##src/lib/wrappthread.c##\n{## 92 ##src/lib/wrappthread.c##\n    int     n;## 93 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_cond_broadcast(cptr)) == 0)## 94 ##src/lib/wrappthread.c##\n        return;## 95 ##src/lib/wrappthread.c##\n    errno = n;## 96 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_cond_broadcast error\");## 97 ##src/lib/wrappthread.c##\n}## 98 ##src/lib/wrappthread.c##\n\nvoid## 99 ##src/lib/wrappthread.c##\nPthread_cond_signal(pthread_cond_t *cptr)##100 ##src/lib/wrappthread.c##\n{##101 ##src/lib/wrappthread.c##\n    int     n;##102 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_cond_signal(cptr)) == 0)##103 ##src/lib/wrappthread.c##\n        return;##104 ##src/lib/wrappthread.c##\n    errno = n;##105 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_cond_signal error\");##106 ##src/lib/wrappthread.c##\n}##107 ##src/lib/wrappthread.c##\n\nvoid##108 ##src/lib/wrappthread.c##\nPthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr)##109 ##src/lib/wrappthread.c##\n{##110 ##src/lib/wrappthread.c##\n    int     n;##111 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_cond_wait(cptr, mptr)) == 0)##112 ##src/lib/wrappthread.c##\n        return;##113 ##src/lib/wrappthread.c##\n    errno = n;##114 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_cond_wait error\");##115 ##src/lib/wrappthread.c##\n}##116 ##src/lib/wrappthread.c##\n\nvoid##117 ##src/lib/wrappthread.c##\nPthread_cond_timedwait(pthread_cond_t *cptr, pthread_mutex_t *mptr,##118 ##src/lib/wrappthread.c##\n                       const struct timespec *tsptr)##119 ##src/lib/wrappthread.c##\n{##120 ##src/lib/wrappthread.c##\n    int     n;##121 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_cond_timedwait(cptr, mptr, tsptr)) == 0)##122 ##src/lib/wrappthread.c##\n        return;##123 ##src/lib/wrappthread.c##\n    errno = n;##124 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_cond_timedwait error\");##125 ##src/lib/wrappthread.c##\n}##126 ##src/lib/wrappthread.c##\n\nvoid##127 ##src/lib/wrappthread.c##\nPthread_once(pthread_once_t * ptr, void (*func) (void))##128 ##src/lib/wrappthread.c##\n{##129 ##src/lib/wrappthread.c##\n    int     n;##130 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_once(ptr, func)) == 0)##131 ##src/lib/wrappthread.c##\n        return;##132 ##src/lib/wrappthread.c##\n    errno = n;##133 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_once error\");##134 ##src/lib/wrappthread.c##\n}##135 ##src/lib/wrappthread.c##\n\nvoid##136 ##src/lib/wrappthread.c##\nPthread_key_create(pthread_key_t * key, void (*func) (void *))##137 ##src/lib/wrappthread.c##\n{##138 ##src/lib/wrappthread.c##\n    int     n;##139 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_key_create(key, func)) == 0)##140 ##src/lib/wrappthread.c##\n        return;##141 ##src/lib/wrappthread.c##\n    errno = n;##142 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_key_create error\");##143 ##src/lib/wrappthread.c##\n}##144 ##src/lib/wrappthread.c##\n\nvoid##145 ##src/lib/wrappthread.c##\nPthread_setspecific(pthread_key_t key, const void *value)##146 ##src/lib/wrappthread.c##\n{##147 ##src/lib/wrappthread.c##\n    int     n;##148 ##src/lib/wrappthread.c##\n\n    if ((n = pthread_setspecific(key, value)) == 0)##149 ##src/lib/wrappthread.c##\n        return;##150 ##src/lib/wrappthread.c##\n    errno = n;##151 ##src/lib/wrappthread.c##\n    err_sys(\"pthread_setspecific error\");##152 ##src/lib/wrappthread.c##\n}##153 ##src/lib/wrappthread.c##\n"
  },
  {
    "path": "lib/wrapsock.c",
    "content": "/*\n * Socket wrapper functions.\n * These could all go into separate files, so only the ones needed cause\n * the corresponding function to be added to the executable.  If sockets\n * are a library (SVR4) this might make a difference (?), but if sockets\n * are in the kernel (BSD) it doesn't matter.\n *\n * These wrapper functions also use the same prototypes as POSIX.1g,\n * which might differ from many implementations (i.e., POSIX.1g specifies\n * the fourth argument to getsockopt() as \"void *\", not \"char *\").\n *\n * If your system's headers are not correct [i.e., the Solaris 2.5\n * <sys/socket.h> omits the \"const\" from the second argument to both\n * bind() and connect()], you'll get warnings of the form:\n *warning: passing arg 2 of `bind' discards `const' from pointer target type\n *warning: passing arg 2 of `connect' discards `const' from pointer target type\n */\n\n#include\t\"unp.h\"\n\nint\nAccept(int fd, struct sockaddr *sa, socklen_t *salenptr)\n{\n\tint\t\tn;\n\nagain:\n\tif ( (n = accept(fd, sa, salenptr)) < 0) {\n#ifdef\tEPROTO\n\t\tif (errno == EPROTO || errno == ECONNABORTED)\n#else\n\t\tif (errno == ECONNABORTED)\n#endif\n\t\t\tgoto again;\n\t\telse\n\t\t\terr_sys(\"accept error\");\n\t}\n\treturn(n);\n}\n\nvoid\nBind(int fd, const struct sockaddr *sa, socklen_t salen)\n{\n\tif (bind(fd, sa, salen) < 0)\n\t\terr_sys(\"bind error\");\n}\n\nvoid\nConnect(int fd, const struct sockaddr *sa, socklen_t salen)\n{\n\tif (connect(fd, sa, salen) < 0)\n\t\terr_sys(\"connect error\");\n}\n\nvoid\nGetpeername(int fd, struct sockaddr *sa, socklen_t *salenptr)\n{\n\tif (getpeername(fd, sa, salenptr) < 0)\n\t\terr_sys(\"getpeername error\");\n}\n\nvoid\nGetsockname(int fd, struct sockaddr *sa, socklen_t *salenptr)\n{\n\tif (getsockname(fd, sa, salenptr) < 0)\n\t\terr_sys(\"getsockname error\");\n}\n\nvoid\nGetsockopt(int fd, int level, int optname, void *optval, socklen_t *optlenptr)\n{\n\tif (getsockopt(fd, level, optname, optval, optlenptr) < 0)\n\t\terr_sys(\"getsockopt error\");\n}\n\n#ifdef\tHAVE_INET6_RTH_INIT\nint\nInet6_rth_space(int type, int segments)\n{\n\tint ret;\n\t\n\tret = inet6_rth_space(type, segments);\n\tif (ret < 0)\n\t\terr_quit(\"inet6_rth_space error\");\n\n\treturn ret;\n}\n\nvoid *\nInet6_rth_init(void *rthbuf, socklen_t rthlen, int type, int segments)\n{\n\tvoid *ret;\n\n\tret = inet6_rth_init(rthbuf, rthlen, type, segments);\n\tif (ret == NULL)\n\t\terr_quit(\"inet6_rth_init error\");\n\n\treturn ret;\n}\n\nvoid\nInet6_rth_add(void *rthbuf, const struct in6_addr *addr)\n{\n\tif (inet6_rth_add(rthbuf, addr) < 0)\n\t\terr_quit(\"inet6_rth_add error\");\n}\n\nvoid\nInet6_rth_reverse(const void *in, void *out)\n{\n\tif (inet6_rth_reverse(in, out) < 0)\n\t\terr_quit(\"inet6_rth_reverse error\");\n}\n\nint\nInet6_rth_segments(const void *rthbuf)\n{\n\tint ret;\n\n\tret = inet6_rth_segments(rthbuf);\n\tif (ret < 0)\n\t\terr_quit(\"inet6_rth_segments error\");\n\n\treturn ret;\n}\n\nstruct in6_addr *\nInet6_rth_getaddr(const void *rthbuf, int idx)\n{\n\tstruct in6_addr *ret;\n\n\tret = inet6_rth_getaddr(rthbuf, idx);\n\tif (ret == NULL)\n\t\terr_quit(\"inet6_rth_getaddr error\");\n\n\treturn ret;\n}\n#endif\n\n#ifdef HAVE_KQUEUE\nint\nKqueue(void)\n{\n\tint ret;\n\n\tif ((ret = kqueue()) < 0)\n\t\terr_sys(\"kqueue error\");\n\treturn ret;\n}\n\nint\nKevent(int kq, const struct kevent *changelist, int nchanges,\n       struct kevent *eventlist, int nevents, const struct timespec *timeout)\n{\n\tint ret;\n\n\tif ((ret = kevent(kq, changelist, nchanges,\n\t\t\t\t\t  eventlist, nevents, timeout)) < 0)\n\t\terr_sys(\"kevent error\");\n\treturn ret;\n}\n#endif\n\n\n/* include Listen */\nvoid\nListen(int fd, int backlog)\n{\n\tchar\t*ptr;\n\n\t\t/*4can override 2nd argument with environment variable */\n\tif ( (ptr = getenv(\"LISTENQ\")) != NULL)\n\t\tbacklog = atoi(ptr);\n\n\tif (listen(fd, backlog) < 0)\n\t\terr_sys(\"listen error\");\n}\n/* end Listen */\n\n#ifdef\tHAVE_POLL\nint\nPoll(struct pollfd *fdarray, unsigned long nfds, int timeout)\n{\n\tint\t\tn;\n\n\tif ( (n = poll(fdarray, nfds, timeout)) < 0)\n\t\terr_sys(\"poll error\");\n\n\treturn(n);\n}\n#endif\n\nssize_t\nRecv(int fd, void *ptr, size_t nbytes, int flags)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = recv(fd, ptr, nbytes, flags)) < 0)\n\t\terr_sys(\"recv error\");\n\treturn(n);\n}\n\nssize_t\nRecvfrom(int fd, void *ptr, size_t nbytes, int flags,\n\t\t struct sockaddr *sa, socklen_t *salenptr)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = recvfrom(fd, ptr, nbytes, flags, sa, salenptr)) < 0)\n\t\terr_sys(\"recvfrom error\");\n\treturn(n);\n}\n\nssize_t\nRecvmsg(int fd, struct msghdr *msg, int flags)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = recvmsg(fd, msg, flags)) < 0)\n\t\terr_sys(\"recvmsg error\");\n\treturn(n);\n}\n\nint\nSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,\n       struct timeval *timeout)\n{\n\tint\t\tn;\n\n\tif ( (n = select(nfds, readfds, writefds, exceptfds, timeout)) < 0)\n\t\terr_sys(\"select error\");\n\treturn(n);\t\t/* can return 0 on timeout */\n}\n\nvoid\nSend(int fd, const void *ptr, size_t nbytes, int flags)\n{\n\tif (send(fd, ptr, nbytes, flags) != (ssize_t)nbytes)\n\t\terr_sys(\"send error\");\n}\n\nvoid\nSendto(int fd, const void *ptr, size_t nbytes, int flags,\n\t   const struct sockaddr *sa, socklen_t salen)\n{\n\tif (sendto(fd, ptr, nbytes, flags, sa, salen) != (ssize_t)nbytes)\n\t\terr_sys(\"sendto error\");\n}\n\nvoid\nSendmsg(int fd, const struct msghdr *msg, int flags)\n{\n\tunsigned int\ti;\n\tssize_t\t\t\tnbytes;\n\n\tnbytes = 0;\t/* must first figure out what return value should be */\n\tfor (i = 0; i < msg->msg_iovlen; i++)\n\t\tnbytes += msg->msg_iov[i].iov_len;\n\n\tif (sendmsg(fd, msg, flags) != nbytes)\n\t\terr_sys(\"sendmsg error\");\n}\n\nvoid\nSetsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen)\n{\n\tif (setsockopt(fd, level, optname, optval, optlen) < 0)\n\t\terr_sys(\"setsockopt error\");\n}\n\nvoid\nShutdown(int fd, int how)\n{\n\tif (shutdown(fd, how) < 0)\n\t\terr_sys(\"shutdown error\");\n}\n\nint\nSockatmark(int fd)\n{\n\tint\t\tn;\n\n\tif ( (n = sockatmark(fd)) < 0)\n\t\terr_sys(\"sockatmark error\");\n\treturn(n);\n}\n\n/* include Socket */\nint\nSocket(int family, int type, int protocol)\n{\n\tint\t\tn;\n\n\tif ( (n = socket(family, type, protocol)) < 0)\n\t\terr_sys(\"socket error\");\n\treturn(n);\n}\n/* end Socket */\n\nvoid\nSocketpair(int family, int type, int protocol, int *fd)\n{\n\tint\t\tn;\n\n\tif ( (n = socketpair(family, type, protocol, fd)) < 0)\n\t\terr_sys(\"socketpair error\");\n}\n"
  },
  {
    "path": "lib/wrapsock.lc",
    "content": "/*##  1 ##src/lib/wrapsock.c##\n * Socket wrapper functions.##  2 ##src/lib/wrapsock.c##\n * These could all go into separate files, so only the ones needed cause##  3 ##src/lib/wrapsock.c##\n * the corresponding function to be added to the executable.  If sockets##  4 ##src/lib/wrapsock.c##\n * are a library (SVR4) this might make a difference (?), but if sockets##  5 ##src/lib/wrapsock.c##\n * are in the kernel (BSD) it doesn't matter.##  6 ##src/lib/wrapsock.c##\n *##  7 ##src/lib/wrapsock.c##\n * These wrapper functions also use the same prototypes as POSIX.1g,##  8 ##src/lib/wrapsock.c##\n * which might differ from many implementations (i.e., POSIX.1g specifies##  9 ##src/lib/wrapsock.c##\n * the fourth argument to getsockopt() as \"void *\", not \"char *\").## 10 ##src/lib/wrapsock.c##\n *## 11 ##src/lib/wrapsock.c##\n * If your system's headers are not correct [i.e., the Solaris 2.5## 12 ##src/lib/wrapsock.c##\n * <sys/socket.h> omits the \"const\" from the second argument to both## 13 ##src/lib/wrapsock.c##\n * bind() and connect()], you'll get warnings of the form:## 14 ##src/lib/wrapsock.c##\n *warning: passing arg 2 of bind discards const from pointer target type## 15 ##src/lib/wrapsock.c##\n *warning: passing arg 2 of connect discards const from pointer target type## 16 ##src/lib/wrapsock.c##\n */## 17 ##src/lib/wrapsock.c##\n\n#include    \"unp.h\"## 18 ##src/lib/wrapsock.c##\n\nint## 19 ##src/lib/wrapsock.c##\nAccept(int fd, struct sockaddr *sa, socklen_t *salenptr)## 20 ##src/lib/wrapsock.c##\n{## 21 ##src/lib/wrapsock.c##\n    int     n;## 22 ##src/lib/wrapsock.c##\n\n  again:## 23 ##src/lib/wrapsock.c##\n    if ((n = accept(fd, sa, salenptr)) < 0) {## 24 ##src/lib/wrapsock.c##\n#ifdef  EPROTO## 25 ##src/lib/wrapsock.c##\n        if (errno == EPROTO || errno == ECONNABORTED)## 26 ##src/lib/wrapsock.c##\n#else## 27 ##src/lib/wrapsock.c##\n        if (errno == ECONNABORTED)## 28 ##src/lib/wrapsock.c##\n#endif## 29 ##src/lib/wrapsock.c##\n            goto again;## 30 ##src/lib/wrapsock.c##\n        else## 31 ##src/lib/wrapsock.c##\n            err_sys(\"accept error\");## 32 ##src/lib/wrapsock.c##\n    }## 33 ##src/lib/wrapsock.c##\n    return (n);## 34 ##src/lib/wrapsock.c##\n}## 35 ##src/lib/wrapsock.c##\n\nvoid## 36 ##src/lib/wrapsock.c##\nBind(int fd, const struct sockaddr *sa, socklen_t salen)## 37 ##src/lib/wrapsock.c##\n{## 38 ##src/lib/wrapsock.c##\n    if (bind(fd, sa, salen) < 0)## 39 ##src/lib/wrapsock.c##\n        err_sys(\"bind error\");## 40 ##src/lib/wrapsock.c##\n}## 41 ##src/lib/wrapsock.c##\n\nvoid## 42 ##src/lib/wrapsock.c##\nConnect(int fd, const struct sockaddr *sa, socklen_t salen)## 43 ##src/lib/wrapsock.c##\n{## 44 ##src/lib/wrapsock.c##\n    if (connect(fd, sa, salen) < 0)## 45 ##src/lib/wrapsock.c##\n        err_sys(\"connect error\");## 46 ##src/lib/wrapsock.c##\n}## 47 ##src/lib/wrapsock.c##\n\nvoid## 48 ##src/lib/wrapsock.c##\nGetpeername(int fd, struct sockaddr *sa, socklen_t *salenptr)## 49 ##src/lib/wrapsock.c##\n{## 50 ##src/lib/wrapsock.c##\n    if (getpeername(fd, sa, salenptr) < 0)## 51 ##src/lib/wrapsock.c##\n        err_sys(\"getpeername error\");## 52 ##src/lib/wrapsock.c##\n}## 53 ##src/lib/wrapsock.c##\n\nvoid## 54 ##src/lib/wrapsock.c##\nGetsockname(int fd, struct sockaddr *sa, socklen_t *salenptr)## 55 ##src/lib/wrapsock.c##\n{## 56 ##src/lib/wrapsock.c##\n    if (getsockname(fd, sa, salenptr) < 0)## 57 ##src/lib/wrapsock.c##\n        err_sys(\"getsockname error\");## 58 ##src/lib/wrapsock.c##\n}## 59 ##src/lib/wrapsock.c##\n\nvoid## 60 ##src/lib/wrapsock.c##\nGetsockopt(int fd, int level, int optname, void *optval,## 61 ##src/lib/wrapsock.c##\n           socklen_t *optlenptr)## 62 ##src/lib/wrapsock.c##\n{## 63 ##src/lib/wrapsock.c##\n    if (getsockopt(fd, level, optname, optval, optlenptr) < 0)## 64 ##src/lib/wrapsock.c##\n        err_sys(\"getsockopt error\");## 65 ##src/lib/wrapsock.c##\n}## 66 ##src/lib/wrapsock.c##\n\n/* include Listen */\nvoid## 67 ##src/lib/wrapsock.c##\nListen(int fd, int backlog)## 68 ##src/lib/wrapsock.c##\n{## 69 ##src/lib/wrapsock.c##\n    char   *ptr;## 70 ##src/lib/wrapsock.c##\n\n    /* 4can override 2nd argument with environment variable */## 71 ##src/lib/wrapsock.c##\n    if ((ptr = getenv(\"LISTENQ\")) != NULL)## 72 ##src/lib/wrapsock.c##\n        backlog = atoi(ptr);## 73 ##src/lib/wrapsock.c##\n\n    if (listen(fd, backlog) < 0)## 74 ##src/lib/wrapsock.c##\n        err_sys(\"listen error\");## 75 ##src/lib/wrapsock.c##\n}## 76 ##src/lib/wrapsock.c##\n/* end Listen */\n\n#ifdef  HAVE_POLL## 77 ##src/lib/wrapsock.c##\nint## 78 ##src/lib/wrapsock.c##\nPoll(struct pollfd *fdarray, unsigned long nfds, int timeout)## 79 ##src/lib/wrapsock.c##\n{## 80 ##src/lib/wrapsock.c##\n    int     n;## 81 ##src/lib/wrapsock.c##\n\n    if ((n = poll(fdarray, nfds, timeout)) < 0)## 82 ##src/lib/wrapsock.c##\n        err_sys(\"poll error\");## 83 ##src/lib/wrapsock.c##\n\n    return (n);## 84 ##src/lib/wrapsock.c##\n}## 85 ##src/lib/wrapsock.c##\n#endif## 86 ##src/lib/wrapsock.c##\n\nssize_t## 87 ##src/lib/wrapsock.c##\nRecv(int fd, void *ptr, size_t nbytes, int flags)## 88 ##src/lib/wrapsock.c##\n{## 89 ##src/lib/wrapsock.c##\n    ssize_t n;## 90 ##src/lib/wrapsock.c##\n\n    if ((n = recv(fd, ptr, nbytes, flags)) < 0)## 91 ##src/lib/wrapsock.c##\n        err_sys(\"recv error\");## 92 ##src/lib/wrapsock.c##\n    return (n);## 93 ##src/lib/wrapsock.c##\n}## 94 ##src/lib/wrapsock.c##\n\nssize_t## 95 ##src/lib/wrapsock.c##\nRecvfrom(int fd, void *ptr, size_t nbytes, int flags,## 96 ##src/lib/wrapsock.c##\n         struct sockaddr *sa, socklen_t *salenptr)## 97 ##src/lib/wrapsock.c##\n{## 98 ##src/lib/wrapsock.c##\n    ssize_t n;## 99 ##src/lib/wrapsock.c##\n\n    if ((n = recvfrom(fd, ptr, nbytes, flags, sa, salenptr)) < 0)##100 ##src/lib/wrapsock.c##\n        err_sys(\"recvfrom error\");##101 ##src/lib/wrapsock.c##\n    return (n);##102 ##src/lib/wrapsock.c##\n}##103 ##src/lib/wrapsock.c##\n\nssize_t##104 ##src/lib/wrapsock.c##\nRecvmsg(int fd, struct msghdr *msg, int flags)##105 ##src/lib/wrapsock.c##\n{##106 ##src/lib/wrapsock.c##\n    ssize_t n;##107 ##src/lib/wrapsock.c##\n\n    if ((n = recvmsg(fd, msg, flags)) < 0)##108 ##src/lib/wrapsock.c##\n        err_sys(\"recvmsg error\");##109 ##src/lib/wrapsock.c##\n    return (n);##110 ##src/lib/wrapsock.c##\n}##111 ##src/lib/wrapsock.c##\n\nint##112 ##src/lib/wrapsock.c##\nSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,##113 ##src/lib/wrapsock.c##\n       struct timeval *timeout)##114 ##src/lib/wrapsock.c##\n{##115 ##src/lib/wrapsock.c##\n    int     n;##116 ##src/lib/wrapsock.c##\n\n    if ((n = select(nfds, readfds, writefds, exceptfds, timeout)) < 0)##117 ##src/lib/wrapsock.c##\n        err_sys(\"select error\");##118 ##src/lib/wrapsock.c##\n    return (n);                 /* can return 0 on timeout */##119 ##src/lib/wrapsock.c##\n}##120 ##src/lib/wrapsock.c##\n\nvoid##121 ##src/lib/wrapsock.c##\nSend(int fd, const void *ptr, size_t nbytes, int flags)##122 ##src/lib/wrapsock.c##\n{##123 ##src/lib/wrapsock.c##\n    if (send(fd, ptr, nbytes, flags) != (ssize_t) nbytes)##124 ##src/lib/wrapsock.c##\n        err_sys(\"send error\");##125 ##src/lib/wrapsock.c##\n}##126 ##src/lib/wrapsock.c##\n\nvoid##127 ##src/lib/wrapsock.c##\nSendto(int fd, const void *ptr, size_t nbytes, int flags,##128 ##src/lib/wrapsock.c##\n       const struct sockaddr *sa, socklen_t salen)##129 ##src/lib/wrapsock.c##\n{##130 ##src/lib/wrapsock.c##\n    if (sendto(fd, ptr, nbytes, flags, sa, salen) != (ssize_t) nbytes)##131 ##src/lib/wrapsock.c##\n        err_sys(\"sendto error\");##132 ##src/lib/wrapsock.c##\n}##133 ##src/lib/wrapsock.c##\n\nvoid##134 ##src/lib/wrapsock.c##\nSendmsg(int fd, const struct msghdr *msg, int flags)##135 ##src/lib/wrapsock.c##\n{##136 ##src/lib/wrapsock.c##\n    unsigned int i;##137 ##src/lib/wrapsock.c##\n    ssize_t nbytes;##138 ##src/lib/wrapsock.c##\n\n    nbytes = 0;                 /* must first figure out what return value should be */##139 ##src/lib/wrapsock.c##\n    for (i = 0; i < msg->msg_iovlen; i++)##140 ##src/lib/wrapsock.c##\n        nbytes += msg->msg_iov[i].iov_len;##141 ##src/lib/wrapsock.c##\n\n    if (sendmsg(fd, msg, flags) != nbytes)##142 ##src/lib/wrapsock.c##\n        err_sys(\"sendmsg error\");##143 ##src/lib/wrapsock.c##\n}##144 ##src/lib/wrapsock.c##\n\nvoid##145 ##src/lib/wrapsock.c##\nSetsockopt(int fd, int level, int optname, const void *optval,##146 ##src/lib/wrapsock.c##\n           socklen_t optlen)##147 ##src/lib/wrapsock.c##\n{##148 ##src/lib/wrapsock.c##\n    if (setsockopt(fd, level, optname, optval, optlen) < 0)##149 ##src/lib/wrapsock.c##\n        err_sys(\"setsockopt error\");##150 ##src/lib/wrapsock.c##\n}##151 ##src/lib/wrapsock.c##\n\nvoid##152 ##src/lib/wrapsock.c##\nShutdown(int fd, int how)##153 ##src/lib/wrapsock.c##\n{##154 ##src/lib/wrapsock.c##\n    if (shutdown(fd, how) < 0)##155 ##src/lib/wrapsock.c##\n        err_sys(\"shutdown error\");##156 ##src/lib/wrapsock.c##\n}##157 ##src/lib/wrapsock.c##\n\nint##158 ##src/lib/wrapsock.c##\nSockatmark(int fd)##159 ##src/lib/wrapsock.c##\n{##160 ##src/lib/wrapsock.c##\n    int     n;##161 ##src/lib/wrapsock.c##\n\n    if ((n = sockatmark(fd)) < 0)##162 ##src/lib/wrapsock.c##\n        err_sys(\"sockatmark error\");##163 ##src/lib/wrapsock.c##\n    return (n);##164 ##src/lib/wrapsock.c##\n}##165 ##src/lib/wrapsock.c##\n\n/* include Socket */\nint##166 ##src/lib/wrapsock.c##\nSocket(int family, int type, int protocol)##167 ##src/lib/wrapsock.c##\n{##168 ##src/lib/wrapsock.c##\n    int     n;##169 ##src/lib/wrapsock.c##\n\n    if ((n = socket(family, type, protocol)) < 0)##170 ##src/lib/wrapsock.c##\n        err_sys(\"socket error\");##171 ##src/lib/wrapsock.c##\n    return (n);##172 ##src/lib/wrapsock.c##\n}##173 ##src/lib/wrapsock.c##\n/* end Socket */\n\nvoid##174 ##src/lib/wrapsock.c##\nSocketpair(int family, int type, int protocol, int *fd)##175 ##src/lib/wrapsock.c##\n{##176 ##src/lib/wrapsock.c##\n    int     n;##177 ##src/lib/wrapsock.c##\n\n    if ((n = socketpair(family, type, protocol, fd)) < 0)##178 ##src/lib/wrapsock.c##\n        err_sys(\"socketpair error\");##179 ##src/lib/wrapsock.c##\n}##180 ##src/lib/wrapsock.c##\n"
  },
  {
    "path": "lib/wrapstdio.c",
    "content": "/*\n * Standard I/O wrapper functions.\n */\n\n#include\t\"unp.h\"\n\nvoid\nFclose(FILE *fp)\n{\n\tif (fclose(fp) != 0)\n\t\terr_sys(\"fclose error\");\n}\n\nFILE *\nFdopen(int fd, const char *type)\n{\n\tFILE\t*fp;\n\n\tif ( (fp = fdopen(fd, type)) == NULL)\n\t\terr_sys(\"fdopen error\");\n\n\treturn(fp);\n}\n\nchar *\nFgets(char *ptr, int n, FILE *stream)\n{\n\tchar\t*rptr;\n\n\tif ( (rptr = fgets(ptr, n, stream)) == NULL && ferror(stream))\n\t\terr_sys(\"fgets error\");\n\n\treturn (rptr);\n}\n\nFILE *\nFopen(const char *filename, const char *mode)\n{\n\tFILE\t*fp;\n\n\tif ( (fp = fopen(filename, mode)) == NULL)\n\t\terr_sys(\"fopen error\");\n\n\treturn(fp);\n}\n\nvoid\nFputs(const char *ptr, FILE *stream)\n{\n\tif (fputs(ptr, stream) == EOF)\n\t\terr_sys(\"fputs error\");\n}\n"
  },
  {
    "path": "lib/wrapunix.c",
    "content": "/*\n * Socket wrapper functions.\n * These could all go into separate files, so only the ones needed cause\n * the corresponding function to be added to the executable.  If sockets\n * are a library (SVR4) this might make a difference (?), but if sockets\n * are in the kernel (BSD) it doesn't matter.\n *\n * These wrapper functions also use the same prototypes as POSIX.1g,\n * which might differ from many implementations (i.e., POSIX.1g specifies\n * the fourth argument to getsockopt() as \"void *\", not \"char *\").\n *\n * If your system's headers are not correct [i.e., the Solaris 2.5\n * <sys/socket.h> omits the \"const\" from the second argument to both\n * bind() and connect()], you'll get warnings of the form:\n *warning: passing arg 2 of `bind' discards `const' from pointer target type\n *warning: passing arg 2 of `connect' discards `const' from pointer target type\n */\n\n#include\t\"unp.h\"\n\nvoid *\nCalloc(size_t n, size_t size)\n{\n\tvoid\t*ptr;\n\n\tif ( (ptr = calloc(n, size)) == NULL)\n\t\terr_sys(\"calloc error\");\n\treturn(ptr);\n}\n\nvoid\nClose(int fd)\n{\n\tif (close(fd) == -1)\n\t\terr_sys(\"close error\");\n}\n\nvoid\nDup2(int fd1, int fd2)\n{\n\tif (dup2(fd1, fd2) == -1)\n\t\terr_sys(\"dup2 error\");\n}\n\nint\nFcntl(int fd, int cmd, int arg)\n{\n\tint\tn;\n\n\tif ( (n = fcntl(fd, cmd, arg)) == -1)\n\t\terr_sys(\"fcntl error\");\n\treturn(n);\n}\n\nvoid\nGettimeofday(struct timeval *tv, void *foo)\n{\n\tif (gettimeofday(tv, foo) == -1)\n\t\terr_sys(\"gettimeofday error\");\n\treturn;\n}\n\nint\nIoctl(int fd, int request, void *arg)\n{\n\tint\t\tn;\n\n\tif ( (n = ioctl(fd, request, arg)) == -1)\n\t\terr_sys(\"ioctl error\");\n\treturn(n);\t/* streamio of I_LIST returns value */\n}\n\npid_t\nFork(void)\n{\n\tpid_t\tpid;\n\n\tif ( (pid = fork()) == -1)\n\t\terr_sys(\"fork error\");\n\treturn(pid);\n}\n\nvoid *\nMalloc(size_t size)\n{\n\tvoid\t*ptr;\n\n\tif ( (ptr = malloc(size)) == NULL)\n\t\terr_sys(\"malloc error\");\n\treturn(ptr);\n}\n\nint\nMkstemp(char *template)\n{\n\tint i;\n\n#ifdef HAVE_MKSTEMP\n\tif ((i = mkstemp(template)) < 0)\n\t\terr_quit(\"mkstemp error\");\n#else\n\tif (mktemp(template) == NULL || template[0] == 0)\n\t\terr_quit(\"mktemp error\");\n\ti = Open(template, O_CREAT | O_WRONLY, FILE_MODE);\n#endif\n\n\treturn i;\n}\n\n#include\t<sys/mman.h>\n\nvoid *\nMmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)\n{\n\tvoid\t*ptr;\n\n\tif ( (ptr = mmap(addr, len, prot, flags, fd, offset)) == ((void *) -1))\n\t\terr_sys(\"mmap error\");\n\treturn(ptr);\n}\n\nint\nOpen(const char *pathname, int oflag, mode_t mode)\n{\n\tint\t\tfd;\n\n\tif ( (fd = open(pathname, oflag, mode)) == -1)\n\t\terr_sys(\"open error for %s\", pathname);\n\treturn(fd);\n}\n\nvoid\nPipe(int *fds)\n{\n\tif (pipe(fds) < 0)\n\t\terr_sys(\"pipe error\");\n}\n\nssize_t\nRead(int fd, void *ptr, size_t nbytes)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = read(fd, ptr, nbytes)) == -1)\n\t\terr_sys(\"read error\");\n\treturn(n);\n}\n\nvoid\nSigaddset(sigset_t *set, int signo)\n{\n\tif (sigaddset(set, signo) == -1)\n\t\terr_sys(\"sigaddset error\");\n}\n\nvoid\nSigdelset(sigset_t *set, int signo)\n{\n\tif (sigdelset(set, signo) == -1)\n\t\terr_sys(\"sigdelset error\");\n}\n\nvoid\nSigemptyset(sigset_t *set)\n{\n\tif (sigemptyset(set) == -1)\n\t\terr_sys(\"sigemptyset error\");\n}\n\nvoid\nSigfillset(sigset_t *set)\n{\n\tif (sigfillset(set) == -1)\n\t\terr_sys(\"sigfillset error\");\n}\n\nint\nSigismember(const sigset_t *set, int signo)\n{\n\tint\t\tn;\n\n\tif ( (n = sigismember(set, signo)) == -1)\n\t\terr_sys(\"sigismember error\");\n\treturn(n);\n}\n\nvoid\nSigpending(sigset_t *set)\n{\n\tif (sigpending(set) == -1)\n\t\terr_sys(\"sigpending error\");\n}\n\nvoid\nSigprocmask(int how, const sigset_t *set, sigset_t *oset)\n{\n\tif (sigprocmask(how, set, oset) == -1)\n\t\terr_sys(\"sigprocmask error\");\n}\n\nchar *\nStrdup(const char *str)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = strdup(str)) == NULL)\n\t\terr_sys(\"strdup error\");\n\treturn(ptr);\n}\n\nlong\nSysconf(int name)\n{\n\tlong\tval;\n\n\terrno = 0;\t\t/* in case sysconf() does not change this */\n\tif ( (val = sysconf(name)) == -1)\n\t\terr_sys(\"sysconf error\");\n\treturn(val);\n}\n\n#ifdef\tHAVE_SYS_SYSCTL_H\nvoid\nSysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,\n\t   void *newp, size_t newlen)\n{\n\tif (sysctl(name, namelen, oldp, oldlenp, newp, newlen) == -1)\n\t\terr_sys(\"sysctl error\");\n}\n#endif\n\nvoid\nUnlink(const char *pathname)\n{\n\tif (unlink(pathname) == -1)\n\t\terr_sys(\"unlink error for %s\", pathname);\n}\n\npid_t\nWait(int *iptr)\n{\n\tpid_t\tpid;\n\n\tif ( (pid = wait(iptr)) == -1)\n\t\terr_sys(\"wait error\");\n\treturn(pid);\n}\n\npid_t\nWaitpid(pid_t pid, int *iptr, int options)\n{\n\tpid_t\tretpid;\n\n\tif ( (retpid = waitpid(pid, iptr, options)) == -1)\n\t\terr_sys(\"waitpid error\");\n\treturn(retpid);\n}\n\nvoid\nWrite(int fd, void *ptr, size_t nbytes)\n{\n\tif (write(fd, ptr, nbytes) != nbytes)\n\t\terr_sys(\"write error\");\n}\n"
  },
  {
    "path": "lib/writable_timeo.c",
    "content": "/* include writable_timeo */\n#include\t\"unp.h\"\n\nint\nwritable_timeo(int fd, int sec)\n{\n\tfd_set\t\t\twset;\n\tstruct timeval\ttv;\n\n\tFD_ZERO(&wset);\n\tFD_SET(fd, &wset);\n\n\ttv.tv_sec = sec;\n\ttv.tv_usec = 0;\n\n\treturn(select(fd+1, NULL, &wset, NULL, &tv));\n\t\t/* > 0 if descriptor is writable */\n}\n/* end writable_timeo */\n\nint\nWritable_timeo(int fd, int sec)\n{\n\tint\t\tn;\n\n\tif ( (n = writable_timeo(fd, sec)) < 0)\n\t\terr_sys(\"writable_timeo error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/write_fd.c",
    "content": "/* include write_fd */\n#include\t\"unp.h\"\n\nssize_t\nwrite_fd(int fd, void *ptr, size_t nbytes, int sendfd)\n{\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov[1];\n\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n\tunion {\n\t  struct cmsghdr\tcm;\n\t  char\t\t\t\tcontrol[CMSG_SPACE(sizeof(int))];\n\t} control_un;\n\tstruct cmsghdr\t*cmptr;\n\n\tmsg.msg_control = control_un.control;\n\tmsg.msg_controllen = sizeof(control_un.control);\n\n\tcmptr = CMSG_FIRSTHDR(&msg);\n\tcmptr->cmsg_len = CMSG_LEN(sizeof(int));\n\tcmptr->cmsg_level = SOL_SOCKET;\n\tcmptr->cmsg_type = SCM_RIGHTS;\n\t*((int *) CMSG_DATA(cmptr)) = sendfd;\n#else\n\tmsg.msg_accrights = (caddr_t) &sendfd;\n\tmsg.msg_accrightslen = sizeof(int);\n#endif\n\n\tmsg.msg_name = NULL;\n\tmsg.msg_namelen = 0;\n\n\tiov[0].iov_base = ptr;\n\tiov[0].iov_len = nbytes;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\n\treturn(sendmsg(fd, &msg, 0));\n}\n/* end write_fd */\n\nssize_t\nWrite_fd(int fd, void *ptr, size_t nbytes, int sendfd)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = write_fd(fd, ptr, nbytes, sendfd)) < 0)\n\t\terr_sys(\"write_fd error\");\n\n\treturn(n);\n}\n"
  },
  {
    "path": "lib/write_fd.lc",
    "content": "/* include write_fd */\n#include    \"unp.h\"##  1 ##src/lib/write_fd.c##\n\nssize_t##  2 ##src/lib/write_fd.c##\nwrite_fd(int fd, void *ptr, size_t nbytes, int sendfd)##  3 ##src/lib/write_fd.c##\n{##  4 ##src/lib/write_fd.c##\n    struct msghdr msg;##  5 ##src/lib/write_fd.c##\n    struct iovec iov[1];##  6 ##src/lib/write_fd.c##\n\n#ifdef  HAVE_MSGHDR_MSG_CONTROL##  7 ##src/lib/write_fd.c##\n    union {##  8 ##src/lib/write_fd.c##\n        struct cmsghdr cm;##  9 ##src/lib/write_fd.c##\n        char    control[CMSG_SPACE(sizeof(int))];## 10 ##src/lib/write_fd.c##\n    } control_un;## 11 ##src/lib/write_fd.c##\n    struct cmsghdr *cmptr;## 12 ##src/lib/write_fd.c##\n\n    msg.msg_control = control_un.control;## 13 ##src/lib/write_fd.c##\n    msg.msg_controllen = sizeof(control_un.control);## 14 ##src/lib/write_fd.c##\n\n    cmptr = CMSG_FIRSTHDR(&msg);## 15 ##src/lib/write_fd.c##\n    cmptr->cmsg_len = CMSG_LEN(sizeof(int));## 16 ##src/lib/write_fd.c##\n    cmptr->cmsg_level = SOL_SOCKET;## 17 ##src/lib/write_fd.c##\n    cmptr->cmsg_type = SCM_RIGHTS;## 18 ##src/lib/write_fd.c##\n    *((int *) CMSG_DATA(cmptr)) = sendfd;## 19 ##src/lib/write_fd.c##\n#else## 20 ##src/lib/write_fd.c##\n    msg.msg_accrights = (caddr_t) & sendfd;## 21 ##src/lib/write_fd.c##\n    msg.msg_accrightslen = sizeof(int);## 22 ##src/lib/write_fd.c##\n#endif## 23 ##src/lib/write_fd.c##\n\n    msg.msg_name = NULL;## 24 ##src/lib/write_fd.c##\n    msg.msg_namelen = 0;## 25 ##src/lib/write_fd.c##\n\n    iov[0].iov_base = ptr;## 26 ##src/lib/write_fd.c##\n    iov[0].iov_len = nbytes;## 27 ##src/lib/write_fd.c##\n    msg.msg_iov = iov;## 28 ##src/lib/write_fd.c##\n    msg.msg_iovlen = 1;## 29 ##src/lib/write_fd.c##\n\n    return (sendmsg(fd, &msg, 0));## 30 ##src/lib/write_fd.c##\n}## 31 ##src/lib/write_fd.c##\n/* end write_fd */\n\nssize_t## 32 ##src/lib/write_fd.c##\nWrite_fd(int fd, void *ptr, size_t nbytes, int sendfd)## 33 ##src/lib/write_fd.c##\n{## 34 ##src/lib/write_fd.c##\n    ssize_t n;## 35 ##src/lib/write_fd.c##\n\n    if ((n = write_fd(fd, ptr, nbytes, sendfd)) < 0)## 36 ##src/lib/write_fd.c##\n        err_sys(\"write_fd error\");## 37 ##src/lib/write_fd.c##\n\n    return (n);## 38 ##src/lib/write_fd.c##\n}## 39 ##src/lib/write_fd.c##\n"
  },
  {
    "path": "lib/writen.c",
    "content": "/* include writen */\n#include\t\"unp.h\"\n\nssize_t\t\t\t\t\t\t/* Write \"n\" bytes to a descriptor. */\nwriten(int fd, const void *vptr, size_t n)\n{\n\tsize_t\t\tnleft;\n\tssize_t\t\tnwritten;\n\tconst char\t*ptr;\n\n\tptr = vptr;\n\tnleft = n;\n\twhile (nleft > 0) {\n\t\tif ( (nwritten = write(fd, ptr, nleft)) <= 0) {\n\t\t\tif (nwritten < 0 && errno == EINTR)\n\t\t\t\tnwritten = 0;\t\t/* and call write() again */\n\t\t\telse\n\t\t\t\treturn(-1);\t\t\t/* error */\n\t\t}\n\n\t\tnleft -= nwritten;\n\t\tptr   += nwritten;\n\t}\n\treturn(n);\n}\n/* end writen */\n\nvoid\nWriten(int fd, void *ptr, size_t nbytes)\n{\n\tif (writen(fd, ptr, nbytes) != nbytes)\n\t\terr_sys(\"writen error\");\n}\n"
  },
  {
    "path": "lib/writen.lc",
    "content": "/* include writen */\n#include    \"unp.h\"##  1 ##src/lib/writen.c##\n\nssize_t                         /* Write \"n\" bytes to a descriptor. */##  2 ##src/lib/writen.c##\nwriten(int fd, const void *vptr, size_t n)##  3 ##src/lib/writen.c##\n{##  4 ##src/lib/writen.c##\n    size_t  nleft;##  5 ##src/lib/writen.c##\n    ssize_t nwritten;##  6 ##src/lib/writen.c##\n    const char *ptr;##  7 ##src/lib/writen.c##\n\n    ptr = vptr;##  8 ##src/lib/writen.c##\n    nleft = n;##  9 ##src/lib/writen.c##\n    while (nleft > 0) {## 10 ##src/lib/writen.c##\n        if ((nwritten = write(fd, ptr, nleft)) <= 0) {## 11 ##src/lib/writen.c##\n            if (nwritten < 0 && errno == EINTR)## 12 ##src/lib/writen.c##\n                nwritten = 0;   /* and call write() again */## 13 ##src/lib/writen.c##\n            else## 14 ##src/lib/writen.c##\n                return (-1);    /* error */## 15 ##src/lib/writen.c##\n        }## 16 ##src/lib/writen.c##\n\n        nleft -= nwritten;## 17 ##src/lib/writen.c##\n        ptr += nwritten;## 18 ##src/lib/writen.c##\n    }## 19 ##src/lib/writen.c##\n    return (n);## 20 ##src/lib/writen.c##\n}## 21 ##src/lib/writen.c##\n/* end writen */\n\nvoid## 22 ##src/lib/writen.c##\nWriten(int fd, void *ptr, size_t nbytes)## 23 ##src/lib/writen.c##\n{## 24 ##src/lib/writen.c##\n    if (writen(fd, ptr, nbytes) != nbytes)## 25 ##src/lib/writen.c##\n        err_sys(\"writen error\");## 26 ##src/lib/writen.c##\n}## 27 ##src/lib/writen.c##\n"
  },
  {
    "path": "libfree/Makefile",
    "content": "include ../Make.defines\n\nall:\t${LIBFREE_OBJS}\n\t\tar rv ${LIBUNP_NAME} $?\n\t\t${RANLIB} ${LIBUNP_NAME}\n\ntest_inet_pton:\ttest_inet_pton.o\n\t\t${CC} ${CFLAGS} -o $@ test_inet_pton.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "libfree/README",
    "content": "This directory contains the library files that do *not* #include unp.h.\nThe intent is that these functions can stand alone, without the rest\nof the code from the book.\n"
  },
  {
    "path": "libfree/README.getaddrinfo",
    "content": "09Sep96\n\nPlease read the comments at the begiinning of getaddrinfo.c.\n\nSupplied with this function are the two files inet_pton.c and\ninet_ntop.c from the BIND-4.9.4 release.  The arguments of\nthese two functions differ from the current (but old) Internet\nDraft \"ipngwg-bsd-api-05.txt\", but the next revision of this\ndraft will document these functions as they exist in BIND-4.9.4.\n\nBeware that most IPv6 releases are \"alpha\" at this time.  The\nuse of the RES_USE_INET6 option in getaddrinfo() is again from\nthe BIND-4.9.4 release, as this is what will become the standard.\nBut few implementations, if any, support this unless you install\nBIND-4.9.4 (or later) yourself.\n\nBuf fixes, suggestions, etc. are welcome.\n\n\tRich Stevens  (rstevens@kohala.com)\n"
  },
  {
    "path": "libfree/addrinfo.h",
    "content": "#ifndef\t__addrinfo_h\n#define\t__addrinfo_h\n\n/*\n * Everything here really belongs in <netdb.h>.\n * These defines are separate for now, to avoid having to modify the\n * system's header.\n */\n\nstruct addrinfo {\n  int\t\tai_flags;\t\t\t/* AI_PASSIVE, AI_CANONNAME */\n  int\t\tai_family;\t\t\t/* PF_xxx */\n  int\t\tai_socktype;\t\t/* SOCK_xxx */\n  int\t\tai_protocol;\t\t/* IPPROTO_xxx for IPv4 and IPv6 */\n  size_t\tai_addrlen;\t\t\t/* length of ai_addr */\n  char\t\t*ai_canonname;\t\t/* canonical name for host */\n  struct sockaddr\t*ai_addr;\t/* binary address */\n  struct addrinfo\t*ai_next;\t/* next structure in linked list */\n};\n\n\t\t\t/* following for getaddrinfo() */\n#define\tAI_PASSIVE\t\t 1\t/* socket is intended for bind() + listen() */\n#define\tAI_CANONNAME\t 2\t/* return canonical name */\n\n\t\t\t/* following for getnameinfo() */\n#define\tNI_MAXHOST\t  1025\t/* max hostname returned */\n#define\tNI_MAXSERV\t    32\t/* max service name returned */\n\n#define\tNI_NOFQDN\t     1\t/* do not return FQDN */\n#define\tNI_NUMERICHOST   2\t/* return numeric form of hostname */\n#define\tNI_NAMEREQD\t     4\t/* return error if hostname not found */\n#define\tNI_NUMERICSERV   8\t/* return numeric form of service name */\n#define\tNI_DGRAM\t    16\t/* datagram service for getservbyname() */\n\n\t\t\t/* error returns */\n#define\tEAI_ADDRFAMILY\t 1\t/* address family for host not supported */\n#define\tEAI_AGAIN\t\t 2\t/* temporary failure in name resolution */\n#define\tEAI_BADFLAGS\t 3\t/* invalid value for ai_flags */\n#define\tEAI_FAIL\t\t 4\t/* non-recoverable failure in name resolution */\n#define\tEAI_FAMILY\t\t 5\t/* ai_family not supported */\n#define\tEAI_MEMORY\t\t 6\t/* memory allocation failure */\n#define\tEAI_NODATA\t\t 7\t/* no address associated with host */\n#define\tEAI_NONAME\t\t 8\t/* host nor service provided, or not known */\n#define\tEAI_SERVICE\t\t 9\t/* service not supported for ai_socktype */\n#define\tEAI_SOCKTYPE\t10\t/* ai_socktype not supported */\n#define\tEAI_SYSTEM\t\t11\t/* system error returned in errno */\n\n#endif\t/* __addrinfo_h */\n"
  },
  {
    "path": "libfree/getaddrinfo.c",
    "content": "/*\n * Copyright (c) 1996 W. Richard Stevens.  All rights reserved. \n *\n * Permission to use or modify this software for educational or\n * for commercial purposes, and without fee, is hereby granted,\n * provided that the above copyright notice appears in connection\n * with any and all uses, with clear indication as to any\n * modifications made.  The author RESERVES the sole rights of\n * reproduction, publication and distribution and hence permission\n * to print this source code in any book, reference manual,\n * magazine, or other type of publication, including any digital\n * medium, must be granted in writing by W. Richard Stevens.\n *\n * The author makes no representations about the suitability of this \n * software for any purpose.  It is provided \"as is\" without express\n * or implied warranty. \n */\n\n/* tabs set for 4 spaces, not 8 */\n\n#ifdef\t__osf__\n#define\t_SOCKADDR_LEN\t\t/* required for this implementation */\n#define\tINET6\t\t\t\t/* required for this implementation */\n#endif\n\n#include\t<sys/types.h>\n#include\t<sys/socket.h>\n#include\t<netinet/in.h>\n#include\t<ctype.h>\t\t/* isdigit() */\n#include\t<netdb.h>\t\t/* hostent{}, servent{}, etc. */\n#include\t<arpa/inet.h>\t/* inet_pton() */\n#include\t<arpa/nameser.h>\n#include\t<resolv.h>\t\t/* DNS resolver */\n#include\t<stdlib.h>\t\t/* malloc() and calloc() */\n#include\t<string.h>\t\t/* strdup() and strncpy() */\n#include\t<unistd.h>\t\t/* unlink() */\n#include\t<sys/un.h>\t\t/* for Unix domain socket stuff */\n\n#ifndef\t__osf__\n#include\t\"addrinfo.h\"\t/* defines in here really belong in <netdb.h> */\n#endif\n\n/* NOTE: this code assumes you have the inet_pton() function as defined\n * in the BIND-4.9.4 release or later (ftp://ftp.vix.com/pub/bind).\n * If you don't have this in your resolver library, in this tar file is\n * a copy of it, along with inet_ntop(). */\n\n/* We need a way to determine if the compiling host supports IPv4/IPv6.\n * Cannot test for AF_INET6, as some vendors #define it, even though\n * they don't support it. */\n\n#ifdef\tAF_INET\n#define\tIPV4\t/* this is tested throughout the code that follows */\n#endif\n\n\t\t\t/* no one constant that all implementations define, sigh */\n#if\t\tdefined(IPV6ADDR_ANY_INIT)\n#define\tIPV6\t/* this is tested throughout the code that follows */\n#elif\tdefined(IPV6_FLOWINFO_FLOWLABEL)\n#define\tIPV6\t/* this is tested throughout the code that follows */\n#endif\n\n/* There is no requirement that getaddrinfo() support Unix domain sockets,\n * but what the heck, it doesn't take too much code, and it's a real good\n * test whether an application is *really* protocol-independent. */\n\n#ifdef\tAF_UNIX\n#define\tLOCAL\t/* this is tested throughout the code that follows */\n\n#ifndef\tAF_LOCAL\n#define\tAF_LOCAL\tAF_UNIX\t\t/* the Posix.1g correct term */\n#endif\n#ifndef\tPF_LOCAL\n#define\tPF_LOCAL\tPF_UNIX\t\t/* the Posix.1g correct term */\n#endif\n\n#endif\t/* AF_UNIX */\n\n/* Define REENTRANT if the reentrant versions of get{host|serv}byname\n * are to be used.\n * Note that getaddrinfo{} *must* be reentrant if the underlying\n * get{host|serv}byname_r functions are provided.\n * This program has only been tested with the Solaris 2.x functions.\n * (I have no idea if other vendors have the same functions or not.)\n *\n * Long diatribe: Don't define REENTRANT.  At least not until you know\n * what your vendor's gethostbyname_r() function does with regard to\n * IPv4/IPv6 addresses.  If you really need a reentrant version of this\n * function, because you call it from different threads, then use a\n * mutex lock to protect the calls.\n * The problem at the time of this writing is the handling of IPv4/IPv6\n * addresses.  BIND-4.9.4 does it the \"right\" way :-), but this won't\n * be documented until a later revision of the IPv6 BSD API spec.  Also\n * BIND-4.9.4 doesn't provide the reentrant _r() functions, and I have\n * no idea what the vendors like Sun have done with these functions.\n * The code far below that calls gethostbyname() sets the resolver\n * RES_USE_INET6 option if the caller specifies an ai_family of AF_INET6.\n * This causes 16-byte addresses to be returned, regardless, either\n * \"true\" IPv6 address from AAAA records, or IPv4-mapped IPv6 addresses\n * from A records.  If the caller specifies an ai_family of AF_INET6,\n * then we should return 16-byte addresses.\n * With BIND-4.9.4 the caller can also force the return of 16-byte addresses\n * by setting the environment variable RES_OPTIONS, as in\n *    % RES_OPTIONS=inet6 ./a.out arguments...\n * This way the caller need not pollute the code with code like\n * ai_family = AF_INET6, making the code protocol-dependent.\n */\n\n/* #define\tREENTRANT */\n\n/* Define following function prototype if your headers don't define it */\n\nint\t inet_pton(int, const char *, void *);\n\n#define\tHENTBUFSIZ\t8*1024\n#define\tHENTMAXADDR\t    32\t/* max binary address: 16 for IPv4, 24 for IPv6 */\n\n\t\t/* following internal flags cannot overlap with other AI_xxx flags */\n#define\tAI_CLONE\t     4\t/* clone this entry for other socket types */\n\n\t\t/* function prototypes for our own internal functions */\nstatic int\tgetaddrinfo_host(const char *, struct hostent *,\n\t\t\t\t\t\t\t struct hostent **, char *, int, int);\nstatic int\tgetaddrinfo_serv(struct addrinfo *,\n\t\t\t\t\t\t\t const struct addrinfo *, const char *,\n\t\t\t\t\t\t\t struct servent *, char *, int);\nstatic int\tgetaddrinfo_port(struct addrinfo *, int , int);\nstatic int\taddrinfo_local(const char *, struct addrinfo *,\n\t\t\t\t\t\t   struct addrinfo **);\nstatic struct addrinfo\t*getaddrinfo_clone(struct addrinfo *);\n\n\t\t/* globals for all functions in this file; these *must* be\n\t\t   read-only if this function is to be reentrant */\nstatic struct addrinfo\thints_default;\n\nint\ngetaddrinfo(const char *host, const char *serv,\n\t\t\tconst struct addrinfo *hintsptr, struct addrinfo **result)\n{\n\tint\t\t\t\t\trc, error;\n\tstruct hostent\t\t*hptr, hent;\n\tstruct servent\t\tsent;\n\tchar\t\t\t\thentbuf[HENTBUFSIZ], hent_addr[HENTMAXADDR];\n\tchar\t\t\t\t*hent_aliases[1], *hent_addr_list[2];\n\tchar\t\t\t\t**ap;\n\tstruct addrinfo\t\thints, *ai, *aihead, **aipnext;\n\n#ifdef\tIPV4\n\tstruct sockaddr_in\t*sinptr;\n#endif\n\n#ifdef\tIPV6\n\tstruct sockaddr_in6\t*sin6ptr;\n#endif\n\n/* If we encounter an error we want to free() any dynamic memory\n   that we've allocated.  This is our hack to simplify the code. */\n#define\terror(e) { error = (e); goto bad; }\n\n\t/*\n\t * We must make a copy of the caller's hints structure, so we can\n\t * modify ai_family.  If the caller doesn't provide a hints structure,\n\t * use a default one.  This simplifies all the following code.\n\t * In the default one, ai_flags, ai_socktype, and ai_protocol are all 0,\n\t * but we have to set ai_family to AF_UNSPEC, which isn't guaranteed to\n\t * be 0.\n\t */ \n\tif (hintsptr == NULL) {\n\t\thints_default.ai_family = AF_UNSPEC;\n\t\thints = hints_default;\t/* struct copy */\n\t} else\n\t\thints = *hintsptr;\t\t/* struct copy */\n\n\t/*\n\t * First some error checking.\n\t */\n\tif (hints.ai_flags & ~(AI_PASSIVE | AI_CANONNAME))\n\t\terror(EAI_BADFLAGS);\t/* unknown flag bits */\n\n\t/*\n\t * Check that the family is valid, and if a socket type is also\n\t * specified, check that it's valid for the family.\n\t */\n\tif (hints.ai_family != 0) {\n\t\tswitch(hints.ai_family) {\n\t\t\tcase AF_UNSPEC:\tbreak;\n\t\t\t\t/* Actually, AF_UNSPEC is normally defined as 0,\n\t\t\t\t   but Posix.1g does not require this. */\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\n\t\t\t\tif (hints.ai_socktype != 0 &&\n\t\t\t\t\t(hints.ai_socktype != SOCK_STREAM &&\n\t\t\t\t\t hints.ai_socktype != SOCK_DGRAM &&\n\t\t\t\t\t hints.ai_socktype != SOCK_RAW))\n\t\t\t\t\terror(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\n\t\t\t\tif (hints.ai_socktype != 0 &&\n\t\t\t\t\t(hints.ai_socktype != SOCK_STREAM &&\n\t\t\t\t\t hints.ai_socktype != SOCK_DGRAM &&\n\t\t\t\t\t hints.ai_socktype != SOCK_RAW))\n\t\t\t\t\terror(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\t\tbreak;\n#endif\n#ifdef\tLOCAL\n\t\t\tcase AF_LOCAL:\n\t\t\t\tif (hints.ai_socktype != 0 &&\n\t\t\t\t\t(hints.ai_socktype != SOCK_STREAM &&\n\t\t\t\t\t hints.ai_socktype != SOCK_DGRAM))\n\t\t\t\t\terror(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\terror(EAI_FAMILY);\t\t/* unknown protocol family */\n\t\t}\n\t}\n\n\tif (host == NULL || host[0] == '\\0') {\n\t\tif (serv == NULL || serv[0] == '\\0')\n\t\t\terror(EAI_NONAME);\t/* either host or serv must be specified */\n\n\t\tif (hints.ai_flags & AI_PASSIVE) {\n\t\t\t/*\n\t\t\t * No \"host\" and AI_PASSIVE: the returned address must be\n\t\t\t * ready for bind(): 0.0.0.0 for IPv4 or 0::0 for IPv6.\n\t\t\t */\n\t\t\tswitch (hints.ai_family) {\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\thost = \"0.0.0.0\"; break;\n#endif\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\thost = \"0::0\"; break;\n#endif\n#ifdef\tLOCAL\n\t\t\tcase AF_LOCAL:\n\t\t\t\tif (serv[0] != '/')\t\t/* allow service to specify path */\n\t\t\t\t\terror(EAI_ADDRFAMILY);\n\t\t\t\tbreak;\n#endif\n\t\t\tcase 0:\t\t\terror(EAI_ADDRFAMILY);\n\t\t\t\t\t/* How can we initialize a socket address structure\n\t\t\t\t\t   for a passive open if we don't even know the family? */\n\t\t\t}\n\t\t} else {\n\t\t\t/*\n\t\t\t * No host and not AI_PASSIVE: caller implies connect() to\n\t\t\t * local host.\n\t\t\t */\n\n\t\t\thost = \"localhost\";\n\t\t}\n\t} else if (hints.ai_family == 0) {\n\t\t/*\n\t\t * Caller specifies a host but no address family.\n\t\t * If the host string is really a valid IPv4 dotted-decimal address,\n\t\t * set family to IPv4.  Similarly for IPv6 strings.\n\t\t * This allows server applications to be protocol independent\n\t\t * (not having to hard code a protocol family), allowing the\n\t\t * user who starts the program to specify either 0.0.0.0 or 0::0.\n\t\t *\n\t\t * Assumed below is that inet_pton() allows only \"valid\" strings,\n\t\t * which Paul Vixie put into the BIND-4.9.4 version of this function.\n\t\t */\n\n\t\tchar\ttemp[16];\n\n#ifdef\tIPV4\n\t\tif (inet_pton(AF_INET, host, temp) == 1)\n\t\t\thints.ai_family = AF_INET;\n#endif\n#ifdef\tIPV6\n\t\tif (inet_pton(AF_INET6, host, temp) == 1)\n\t\t\thints.ai_family = AF_INET6;\n#endif\n\t\t/*\n\t\t * Note that we could bypass some of the testing done in\n\t\t * getaddrinfo_host(), but it doesn't seem worth complicating\n\t\t * this (already long) function.\n\t\t */\n\t}\n\n#ifdef\tLOCAL\n\t/*\n\t * For a Unix domain socket only one string can be provided and we\n\t * require it to be an absolute pathname.  (Using relative pathnames\n\t * is asking for trouble.)  We allow this string to be specified as\n\t * either the hostname or the service name, in which case we ignore\n\t * the other string.  Notice that a slash is not allowed in a DNS\n\t * hostname (see RFC 1912) and a slash does not appear in any of the\n\t * service names in /etc/services either.  Hence no conflict.\n\t * For example, often a protocol-independent server will allow an\n\t * argument to specify the service (e.g., port number) and let the\n\t * hostname be wildcarded.  Similarly, a protocol-independent client\n\t * often allows only the hostname as a command-line argument, hardcoding\n\t * a service name in the program (which we ignore).\n\t */\n\n\tif ((host != NULL && host[0] == '/'))\n\t\treturn(addrinfo_local(host, &hints, result));\n\n\tif ((serv != NULL && serv[0] == '/'))\n\t\treturn(addrinfo_local(serv, &hints, result));\n#endif\n\n\t/*\n\t * Look up the host.  The code above guarantees that \"host\"\n\t * is a nonnull pointer to a nonull string.\n\t *\n\t * We first initialize \"hent\" assuming \"host\" is an IPv4/IPv6 address\n\t * (instead of a name).  This saves passing lots of additional\n\t * arguments to getaddrinfo_host().\n\t */\n\n\thent.h_name = hentbuf;\t\t/* char string specifying address goes here */\n\thent.h_aliases = hent_aliases;\n\thent_aliases[0] = NULL;\t\t\t/* no aliases */\n\thent.h_addr_list = hent_addr_list;\n\thent_addr_list[0] = hent_addr;\t/* one binary address in [0] */\n\thent_addr_list[1] = NULL;\n\thptr = &hent;\n\n\tif ( (rc = getaddrinfo_host(host, &hent, &hptr, hentbuf, HENTBUFSIZ,\n\t\t\t\t\t\t\t\thints.ai_family)) != 0)\n\t\terror(rc);\n\n\t/*\n\t * \"hptr\" now points to a filled in hostent{}.\n\t * If \"host\" was an IPv4/IPv6 address, instead of a name, then\n\t * \"hptr\" points to our own \"hent\" structure.\n\t * If gethostbyname_r() was called, then \"hptr\" points to our own\n\t * \"hent\" structure, which was passed as as an argument to the\n\t * reentrant function.\n\t * If gethostbyname() was called, then \"hptr\" points to the static\n\t * hostent{} that it returned.\n\t *\n\t * Check for address family mismatch if the caller specified one.\n\t * Note that Posix.1g assumes that AF_foo == PF_foo.\n\t */\n\tif (hints.ai_family != AF_UNSPEC && hints.ai_family != hptr->h_addrtype)\n\t\terror(EAI_ADDRFAMILY);\n\n\t/*\n\t * Go through the list of returned addresses and create one\n\t * addrinfo{} for each one, linking all the structures together.\n\t * We still have not looked at the service--that comes after this.\n\t */\n\n\taihead = NULL;\n\taipnext = &aihead;\n\tfor (ap = hptr->h_addr_list; *ap != NULL; ap++) {\n\t\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\t\terror(EAI_MEMORY);\n\t\t*aipnext = ai;\t\t\t/* prev points to this new one */\n\t\taipnext = &ai->ai_next;\t/* pointer to next one goes here */\n\n\t\t\t/* initialize from hints; could be 0 */\n\t\tif ( (ai->ai_socktype = hints.ai_socktype) == 0)\n\t\t\tai->ai_flags |= AI_CLONE;\n\t\tai->ai_protocol = hints.ai_protocol;\n\n\t\tai->ai_family = hptr->h_addrtype;\n\t\tswitch (ai->ai_family) {\n\t\t\t/*\n\t\t\t * Allocate a socket address structure and fill it in.\n\t\t\t * The port number will be filled in later, when the service\n\t\t\t * is processed.\n\t\t\t */\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\n\t\t\t\tif ( (sinptr = calloc(1, sizeof(struct sockaddr_in))) == NULL)\n\t\t\t\t\terror(EAI_MEMORY);\n#ifdef\tSIN_LEN\n\t\t\t\tsinptr->sin_len = sizeof(struct sockaddr_in);\n#endif\n\t\t\t\tsinptr->sin_family = AF_INET;\n\t\t\t\tmemcpy(&sinptr->sin_addr, *ap, sizeof(struct in_addr));\n\t\t\t\tai->ai_addr = (struct sockaddr *) sinptr;\n\t\t\t\tai->ai_addrlen = sizeof(struct sockaddr_in);\n\t\t\t\tbreak;\n#endif\t/* IPV4 */\n\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\n\t\t\t\tif ( (sin6ptr = calloc(1, sizeof(struct sockaddr_in6))) == NULL)\n\t\t\t\t\terror(EAI_MEMORY);\n#ifdef\tSIN6_LEN\n\t\t\t\tsin6ptr->sin6_len = sizeof(struct sockaddr_in6);\n#endif\n\t\t\t\tsin6ptr->sin6_family = AF_INET6;\n\t\t\t\tmemcpy(&sin6ptr->sin6_addr, *ap, sizeof(struct in6_addr));\n\t\t\t\tai->ai_addr = (struct sockaddr *) sin6ptr;\n\t\t\t\tai->ai_addrlen = sizeof(struct sockaddr_in6);\n\t\t\t\tbreak;\n#endif\t/* IPV6 */\n\t\t}\n\t}\n\t/* \"aihead\" points to the first structure in the linked list */\n\n\tif (hints.ai_flags & AI_CANONNAME) {\n\t\t/*\n\t\t * Posix.1g doesn't say what to do if this flag is set and\n\t\t * multiple addrinfo structures are returned.\n\t\t * We return the canonical name only in the first addrinfo{}.\n\t\t */\n\t\tif (hptr->h_name != NULL) {\n\t\t\tif ( (aihead->ai_canonname = strdup(hptr->h_name)) == NULL)\n\t\t\t\terror(EAI_MEMORY);\n\t\t} else {\n\t\t\t/*\n\t\t\t * Posix.1g says we can just set ai_canonname to point to the\n\t\t\t * \"host\" argument, but that makes freeaddrinfo() harder.\n\t\t\t * We dynamically allocate room for a copy of \"host\".\n\t\t\t */\n\t\t\tif ( (aihead->ai_canonname = strdup(host)) == NULL)\n\t\t\t\terror(EAI_MEMORY);\n\t\t}\n\t}\n\n\t/*\n\t * Now look up the service, if specified.\n\t */\n\tif (serv != NULL && serv[0] != '\\0') {\n\t\tif ( (rc = getaddrinfo_serv(aihead, &hints, serv, &sent,\n\t\t\t\t\t\t\t\t\thentbuf, HENTBUFSIZ)) != 0)\n\t\t\terror(rc);\n\t}\n\n\t*result = aihead;\t/* pointer to first structure in linked list */\n\treturn(0);\n\nbad:\n\tfreeaddrinfo(aihead);\t/* free any alloc'ed memory */\n\treturn(error);\n}\n\n/*\n * This function handles the host string.\n */\n\nstatic int\ngetaddrinfo_host(const char *host,\n\t\t\t\t struct hostent *hptr, struct hostent **hptrptr,\n\t\t\t\t char *buf, int bufsiz, int family)\n{\n\n#ifdef\tREENTRANT\n\tint\t\th_errno;\n#endif\t/* REENTRANT */\n\n#ifdef\tIPV4\n\t/*\n\t * We explicitly check for an IPv4 dotted-decimal string.\n\t * Recent versions of gethostbyname(), starting around BIND 4.9.2\n\t * do this too, but we have the check here so we don't depend on\n\t * this newer feature.  (You wouldn't believe the ancient versions\n\t * of BIND that some vendors ship.)\n\t */\n\tif (isdigit(host[0])) {\n\t\tif (inet_pton(AF_INET, host, hptr->h_addr_list[0]) == 1) {\n\t\t\t\t/* Success.  Finish making up the hostent{} as though\n\t\t\t\t   we had called gethostbyname(). */\n\t\t\tstrncpy(hptr->h_name, host, bufsiz-1);\n\t\t\tbuf[bufsiz-1] = '\\0';\n\t\t\thptr->h_addrtype = AF_INET;\n\t\t\thptr->h_length = sizeof(struct in_addr);\n\t\t\treturn(0);\n\t\t}\n\t}\n#endif\t/* IPV4 */\n\n#ifdef\tIPV6\n\t/*\n\t * Check for an IPv6 hex string.\n\t */\n\tif (isxdigit(host[0]) || host[0] == ':') {\n\t\tif (inet_pton(AF_INET6, host, hptr->h_addr_list[0]) == 1) {\n\t\t\t\t/* Success.  Finish making up a hostent{} as though\n\t\t\t\t   we had called gethostbyname(). */\n\t\t\tstrncpy(buf, host, bufsiz-1);\n\t\t\tbuf[bufsiz-1] = '\\0';\n\t\t\thptr->h_addrtype = AF_INET6;\n\t\t\thptr->h_length = sizeof(struct in6_addr);\n\t\t\treturn(0);\n\t\t}\n\t}\n#endif\t/* IPV6 */\n\n\t/*\n\t * Not an address, must be a hostname, try the DNS.\n\t * Initialize the resolver, if not already initialized.\n\t */\n\n\tif ((_res.options & RES_INIT) == 0)\n\t\tres_init();\t\t\t/* need this to set _res.options below */\n\n#ifdef\tIPV6\n\t/*\n\t * Notice that the following might be considered optional, and\n\t * could be #ifdef'ed out if your <resolv.h> does not define\n\t * RES_USE_INET6.  But I am assuming you have BIND-4.9.4 installed\n\t * and want the IPv4/IPv6 semantics that it defines for gethostbyname().\n\t */\n\n#ifndef\tRES_USE_INET6\n\t/* This is a gross hack; following line from BIND-4.9.4 release ... */\n\t/* (if you're using 4.9.4, but have not installed the include files) */\n#define\tRES_USE_INET6\t0x00002000\t/* use/map IPv6 in gethostbyname() */\n#endif\n\tif (family == AF_INET6)\n\t\t_res.options |= RES_USE_INET6;\n#endif\t/* IPV6 */\n\n#ifdef\tREENTRANT\n\thptr = gethostbyname_r(host, hptr, buf, bufsiz, &h_errno);\n#else\n\thptr = gethostbyname(host);\n#endif\t/* REENTRANT */\n\tif (hptr == NULL) {\n\t\tswitch (h_errno) {\n\t\t\tcase HOST_NOT_FOUND:\treturn(EAI_NONAME);\n\t\t\tcase TRY_AGAIN:\t\t\treturn(EAI_AGAIN);\n\t\t\tcase NO_RECOVERY:\t\treturn(EAI_FAIL);\n\t\t\tcase NO_DATA:\t\t\treturn(EAI_NODATA);\n\t\t\tdefault:\t\t\t\treturn(EAI_NONAME);\n\t\t}\n\t}\n\t*hptrptr = hptr;\n\treturn(0);\n}\n\n/*\n * This function handles the service string.\n */\n\nstatic int\ngetaddrinfo_serv(struct addrinfo *aihead,\n\t\t\t\t const struct addrinfo *hintsptr, const char *serv,\n\t\t\t\t struct servent *sptrarg, char *buf, int bufsiz)\n{\n\tint\t\t\t\tport, rc;\n\tint\t\t\t\tnfound = 0;\n\tstruct servent\t*sptr;\n\n\t/*\n\t * We allow the service to be a numeric string, which we\n\t * interpret as a decimal port number.  Posix.1g doesn't\n\t * explicitly say to do this, but it just makes sense.\n\t * But to do this the caller must specify a socket type,\n\t * else there's no way to return values for socket().\n\t */\n\n\tif (isdigit(serv[0]) && hintsptr->ai_socktype != 0) {\n\t\tport = htons(atoi(serv));\n\t\tif ( (rc = getaddrinfo_port(aihead, port, hintsptr->ai_socktype)) == 0)\n\t\t\treturn(EAI_NONAME);\n\t\telse if (rc < 0)\n\t\t\treturn(EAI_MEMORY);\n\t\telse\n\t\t\treturn(0);\n\t}\n\n\t/*\n\t * Not a special case, try the \"/etc/services\" file (or whatever).\n\t * We first try TCP, if applicable.\n\t */\n\n\tif (hintsptr->ai_socktype == 0 || hintsptr->ai_socktype == SOCK_STREAM) {\n#ifdef\tREENTRANT\n\t\tsptr = getservbyname_r(serv, \"tcp\", sptrarg, buf, bufsiz);\n#else\n\t\tsptr = getservbyname(serv, \"tcp\");\n#endif\t/* REENTRANT */\n\t\tif (sptr != NULL) {\n\t\t\trc = getaddrinfo_port(aihead, sptr->s_port, SOCK_STREAM);\n\t\t\tif (rc < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t}\n\t}\n\n\t/*\n\t * Now try UDP, if applicable.\n\t */\n\tif (hintsptr->ai_socktype == 0 || hintsptr->ai_socktype == SOCK_DGRAM) {\n#ifdef\tREENTRANT\n\t\tsptr = getservbyname_r(serv, \"udp\", sptrarg, buf, bufsiz);\n#else\n\t\tsptr = getservbyname(serv, \"udp\");\n#endif\t/* REENTRANT */\n\t\tif (sptr != NULL) {\n\t\t\trc = getaddrinfo_port(aihead, sptr->s_port, SOCK_DGRAM);\n\t\t\tif (rc < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t}\n\t}\n\n\tif (nfound == 0) {\n\t\t\t/* You could call getservbyname() one more time, with no\n\t\t\t   protocol specified, but \"tcp\" and \"udp\" are all that\n\t\t\t   are supported today. */\n\n\t\tif (hintsptr->ai_socktype == 0)\n\t\t\treturn(EAI_NONAME);\t/* all calls to getservbyname() failed */\n\t\telse\n\t\t\treturn(EAI_SERVICE);/* service not supported for socket type */\n\t}\n\treturn(0);\n}\n\n/*\n * Go through all the addrinfo structures, checking for a match of the\n * socket type and filling in the socket type, and then the port number\n * in the corresponding socket address structures.\n *\n * The AI_CLONE flag works as follows.  Consider a multihomed host with\n * two IP addresses and no socket type specified by the caller.  After\n * the \"host\" search there are two addrinfo structures, one per IP address.\n * Assuming a service supported by both TCP and UDP (say the daytime\n * service) we need to return *four* addrinfo structures:\n *\t\tIP#1, SOCK_STREAM, TCP port,\n *\t\tIP#1, SOCK_DGRAM, UDP port,\n *\t\tIP#2, SOCK_STREAM, TCP port,\n *\t\tIP#2, SOCK_DGRAM, UDP port.\n * To do this, when the \"host\" loop creates an addrinfo structure, if the\n * caller has not specified a socket type (hints->ai_socktype == 0), the\n * AI_CLONE flag is set.  When the following function finds an entry like\n * this it is handled as follows: If the entry's ai_socktype is still 0,\n * this is the first use of the structure, and the ai_socktype field is set.\n * But, if the entry's ai_socktype is nonzero, then we clone a new addrinfo\n * structure and set it's ai_socktype to the new value.  Although we only\n * need two socket types today (SOCK_STREAM and SOCK_DGRAM) this algorithm\n * will handle any number.  Also notice that Posix.1g requires all socket\n * types to be nonzero.\n */\n\nstatic int\ngetaddrinfo_port(struct addrinfo *aihead, int port, int socktype)\n\t\t/* port must be in network byte order */\n{\n\tint\t\t\t\tnfound = 0;\n\tstruct addrinfo\t*ai;\n\n\tfor (ai = aihead; ai != NULL; ai = ai->ai_next) {\n\t\t/*\n\t\t * We set the socket type but not the protocol, because if a\n\t\t * port number is specified, the protocol must be TCP or UDP,\n\t\t * and a protocol of 0 for socket() is fine for TCP and UDP.\n\t\t * The only time a nonzero protocol argument is required by\n\t\t * socket() is for a raw socket, in which case a service will\n\t\t * not be specified to getaddrinfo().\n\t\t */\n\n\t\tif (ai->ai_flags & AI_CLONE) {\n\t\t\tif (ai->ai_socktype != 0) {\n\t\t\t\tif ( (ai = getaddrinfo_clone(ai)) == NULL)\n\t\t\t\t\treturn(-1);\t/* tell caller it's a memory allocation error */\n\t\t\t\t/* ai points to newly cloned entry, which is what we want */\n\t\t\t}\n\t\t} else if (ai->ai_socktype != socktype)\n\t\t\tcontinue;\t\t/* ignore if mismatch on socket type */\n\n\t\tai->ai_socktype = socktype;\n\n\t\tswitch (ai->ai_family) {\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\n\t\t\t\t((struct sockaddr_in *) ai->ai_addr)->sin_port = port;\n\t\t\t\tnfound++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\n\t\t\t\t((struct sockaddr_in6 *) ai->ai_addr)->sin6_port = port;\n\t\t\t\tnfound++;\n\t\t\t\tbreak;\n#endif\n\t\t}\n\t}\n\treturn(nfound);\n}\n\n/*\n * Clone a new addrinfo structure from an existing one.\n */\n\nstatic struct addrinfo *\ngetaddrinfo_clone(struct addrinfo *ai)\n{\n\tstruct addrinfo\t*new;\n\n\tif ( (new = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(NULL);\n\n\tnew->ai_next = ai->ai_next;\n\tai->ai_next = new;\n\n\tnew->ai_flags = 0;\t\t\t\t/* make sure AI_CLONE is off */\n\tnew->ai_family = ai->ai_family;\n\tnew->ai_socktype = ai->ai_socktype;\n\tnew->ai_protocol = ai->ai_protocol;\n\tnew->ai_canonname = NULL;\n\tnew->ai_addrlen = ai->ai_addrlen;\n\tif ( (new->ai_addr = malloc(ai->ai_addrlen)) == NULL)\n\t\treturn(NULL);\n\tmemcpy(new->ai_addr, ai->ai_addr, ai->ai_addrlen);\n\n\treturn(new);\n}\n\n#ifdef\tLOCAL\n/*\n * Do everything for a Unix domain socket.\n * Only one addrinfo{} is returned.\n */\n\nstatic int\naddrinfo_local(const char *path, struct addrinfo *hints,\n\t\t\t   struct addrinfo **result)\n{\n\tstruct addrinfo\t\t*ai;\n\tstruct sockaddr_un\t*unp;\n\n\tif (hints->ai_socktype == 0)\n\t\treturn(EAI_SOCKTYPE);\t/* we cannot tell socket type from service */\n\n\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(NULL);\n\n\tai->ai_flags = 0;\n\tai->ai_family = AF_LOCAL;\n\tai->ai_socktype = hints->ai_socktype;\n\tai->ai_protocol = 0;\n\n\t\t/* allocate and fill in a socket address structure */\n\tai->ai_addrlen = sizeof(struct sockaddr_un);\n\tif ( (ai->ai_addr = malloc(ai->ai_addrlen)) == NULL)\n\t\treturn(EAI_MEMORY);\n\tunp = (struct sockaddr_un *) ai->ai_addr;\n\tunp->sun_family = AF_UNIX;\n\tstrncpy(unp->sun_path, path, sizeof(unp->sun_path));\n\n\tai->ai_canonname = NULL;\t/* maybe return the i-node number :-) */\n\tai->ai_next = NULL;\n\t*result = ai;\n\n\tif (hints->ai_flags & AI_PASSIVE)\n\t\tunlink(path);\t\t/* OK if this fails */\n\n\treturn(0);\t\t/* success */\n}\n#endif\t/* LOCAL */\n\nvoid\nfreeaddrinfo(struct addrinfo *aihead)\n{\n\tstruct addrinfo\t*ai, *ainext;\n\n\tfor (ai = aihead; ai != NULL; ai = ainext) {\n\t\tif (ai->ai_addr != NULL)\n\t\t\tfree(ai->ai_addr);\t\t/* the socket address structure */\n\t\tif (ai->ai_canonname != NULL)\n\t\t\tfree(ai->ai_canonname);\t/* the canonical name */\n\t\tainext = ai->ai_next;\t\t/* can't fetch ai_next after free() */\n\t\tfree(ai);\t\t\t\t\t/* the addrinfo{} itself */\n\t}\n}\n"
  },
  {
    "path": "libfree/getnameinfo.c",
    "content": "/*\n * Copyright (c) 1996 W. Richard Stevens.  All rights reserved. \n *\n * Permission to use or modify this software for educational or\n * for commercial purposes, and without fee, is hereby granted,\n * provided that the above copyright notice appears in connection\n * with any and all uses, with clear indication as to any\n * modifications made.  The author RESERVES the sole rights of\n * reproduction, publication and distribution and hence permission\n * to print this source code in any book, reference manual,\n * magazine, or other type of publication, including any digital\n * medium, must be granted in writing by W. Richard Stevens.\n *\n * The author makes no representations about the suitability of this \n * software for any purpose.  It is provided \"as is\" without express\n * or implied warranty. \n */\n\n/* tabs set for 4 spaces, not 8 */\n#include\t<sys/types.h>\n#include\t<sys/socket.h>\n#include\t<netinet/in.h>\n#include\t<netdb.h>\t\t/* hostent{}, servent{}, etc. */\n#include\t<string.h>\t\t/* strncpy() */\n\n/* We need a way to determine if the compiling host supports IPv4/IPv6.\n   Cannot test for AF_INET6, as some vendors #define it, even though\n   they don't support it. */\n#ifdef\tAF_INET\n#define\tIPV4\t/* this is tested throughout the code that follows */\n#endif\n#ifdef\tIPV6ADDR_ANY_INIT\n#define\tIPV6\t/* this is tested throughout the code that follows */\n#endif\n\n/* Define following if the reentrant versions of get{host|serv}byaddr\n   are to be used.\n   Note that getaddrinfo{} must be reentrant if the underlying\n   get{host|serv}byaddr_r functions are provided. */\n/* #define\tREENTRANT */\n\n#define\tHENTBUFSIZ\t8*1024\n\n\t\t/* function prototypes for our own internal functions */\nstatic int\tdo_ipv46(char *, size_t, char *, size_t,\n\t\t\t\t\t void *, size_t, int, int);\n\nint\ngetnameinfo(const struct sockaddr *sa, size_t salen,\n\t\t    char *host, size_t hostlen, char *serv, size_t servlen)\n{\n\n\tswitch (sa->sa_family) {\n#ifdef\tIPV4\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sain = (struct sockaddr_in *) sa;\n\n\t\treturn(do_ipv46(host, hostlen, serv, servlen,\n\t\t\t\t\t &sain->sin_addr, sizeof(struct in_addr), AF_INET,\n\t\t\t\t\t sain->sin_port));\n\t}\n#endif\t/* IPV4 */\n\n#ifdef\tIPV6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sain = (struct sockaddr_in6 *) sa;\n\n\t\treturn(do_ipv46(host, hostlen, serv, servlen,\n\t\t\t\t\t &sain->sin6_addr, sizeof(struct in6_addr), AF_INET6,\n\t\t\t\t\t sain->sin6_port));\n\t}\n#endif\t/* IPV6 */\n\n\tdefault:\n\t\treturn(1);\n\t}\n}\n\n/*\n * Handle either an IPv4 or an IPv6 address and port.\n */\n\nstatic int\ndo_ipv46(char *host, size_t hostlen, char *serv, size_t servlen,\n\t\t void *aptr, size_t alen, int family, int port)\n{\n\tstruct hostent\t\t*hptr, hent;\n\tstruct servent\t\t*sptr, sent;\n\tchar\t\t\t\thentbuf[HENTBUFSIZ];\n\n\tif (hostlen > 0) {\n#ifdef\tREENTRANT\n\t\thptr = gethostbyaddr_r(aptr, alen, family,\n\t\t\t\t\t\t\t   &hent, hentbuf, HENTBUFSIZ, &h_errno);\n#else\n\t\thptr = gethostbyaddr(aptr, alen, family);\n#endif\n\t\tif (hptr != NULL && hptr->h_name != NULL)\n\t\t\tstrncpy(host, hptr->h_name, hostlen);\n\t\telse\n\t\t\treturn(1);\n\t}\n\n\tif (servlen > 0) {\n\t\t/*\n\t\t * Notice that we do not have enough information to pass a\n\t\t * \"protocol\" argument to getservbyport(), so the assumption\n\t\t * is that the protocol (TCP or UDP) does not matter.\n\t\t */\n#ifdef\tREENTRANT\n\t\tsptr = getservbyport_r(port, NULL,\n\t\t\t\t\t\t\t   &sent, hentbuf, HENTBUFSIZ);\n#else\n\t\tsptr = getservbyport(port, NULL);\n#endif\n\t\tif (sptr != NULL && sptr->s_name != NULL)\n\t\t\tstrncpy(serv, sptr->s_name, servlen);\n\t\telse\n\t\t\treturn(1);\n\t}\n\treturn(0);\n}\n"
  },
  {
    "path": "libfree/in_cksum.c",
    "content": "#include \"unp.h\"\n\nuint16_t\nin_cksum(uint16_t *addr, int len)\n{\n\tint\t\t\t\tnleft = len;\n\tuint32_t\t\tsum = 0;\n\tuint16_t\t\t*w = addr;\n\tuint16_t\t\tanswer = 0;\n\n\t/*\n\t * Our algorithm is simple, using a 32 bit accumulator (sum), we add\n\t * sequential 16 bit words to it, and at the end, fold back all the\n\t * carry bits from the top 16 bits into the lower 16 bits.\n\t */\n\twhile (nleft > 1)  {\n\t\tsum += *w++;\n\t\tnleft -= 2;\n\t}\n\n\t\t/* 4mop up an odd byte, if necessary */\n\tif (nleft == 1) {\n\t\t*(unsigned char *)(&answer) = *(unsigned char *)w ;\n\t\tsum += answer;\n\t}\n\n\t\t/* 4add back carry outs from top 16 bits to low 16 bits */\n\tsum = (sum >> 16) + (sum & 0xffff);\t/* add hi 16 to low 16 */\n\tsum += (sum >> 16);\t\t\t/* add carry */\n\tanswer = ~sum;\t\t\t\t/* truncate to 16 bits */\n\treturn(answer);\n}\n"
  },
  {
    "path": "libfree/inet_aton.c",
    "content": "/*\n *  inet_aton.c,v 1.3 1993/05/19 03:39:32 jch Exp\n */\n\n/* Gated Release 3.5 */\n/* Copyright (c) 1990,1991,1992,1993,1994,1995 by Cornell University.  All */\n/* rights reserved.  Refer to Particulars and other Copyright notices at */\n/* the end of this file.  */\n/*  */\n\n#include\t<sys/types.h>\n#include\t<netinet/in.h>\n\n/* \n * Check whether \"cp\" is a valid ascii representation\n * of an Internet address and convert to a binary address.\n * Returns 1 if the address is valid, 0 if not.\n * This replaces inet_addr, the return value from which\n * cannot distinguish between failure and a local broadcast address.\n */\n\nint\ninet_aton(const char *cp, struct in_addr *ap)\n{\n    int dots = 0;\n    register u_long acc = 0, addr = 0;\n\n    do {\n\tregister char cc = *cp;\n\n\tswitch (cc) {\n\tcase '0':\n\tcase '1':\n\tcase '2':\n\tcase '3':\n\tcase '4':\n\tcase '5':\n\tcase '6':\n\tcase '7':\n\tcase '8':\n\tcase '9':\n\t    acc = acc * 10 + (cc - '0');\n\t    break;\n\n\tcase '.':\n\t    if (++dots > 3) {\n\t\treturn 0;\n\t    }\n\t    /* Fall through */\n\n\tcase '\\0':\n\t    if (acc > 255) {\n\t\treturn 0;\n\t    }\n\t    addr = addr << 8 | acc;\n\t    acc = 0;\n\t    break;\n\n\tdefault:\n\t    return 0;\n\t}\n    } while (*cp++) ;\n\n    /* Normalize the address */\n    if (dots < 3) {\n\taddr <<= 8 * (3 - dots) ;\n    }\n\n    /* Store it if requested */\n    if (ap) {\n\tap->s_addr = htonl(addr);\n    }\n\n    return 1;    \n}\n\n/*\n * ------------------------------------------------------------------------\n * \n * \tGateD, Release 3.5\n * \n * \tCopyright (c) 1990,1991,1992,1993,1994,1995 by Cornell University.\n * \t    All rights reserved.\n * \n * \tTHIS SOFTWARE IS PROVIDED \"AS IS\" AND WITHOUT ANY\n * \tEXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT\n * \tLIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * \tAND FITNESS FOR A PARTICULAR PURPOSE.\n * \n * \tRoyalty-free licenses to redistribute GateD Release\n * \t3 in whole or in part may be obtained by writing to:\n * \n * \t    GateDaemon Project\n * \t    Information Technologies/Network Resources\n * \t    200 CCC\n * \t    Cornell University\n * \t    Ithaca, NY  14853-2601  USA\n * \n * \tGateD is based on Kirton's EGP, UC Berkeley's routing\n * \tdaemon\t (routed), and DCN's HELLO routing Protocol.\n * \tDevelopment of GateD has been supported in part by the\n * \tNational Science Foundation.\n * \n * \tPlease forward bug fixes, enhancements and questions to the\n * \tgated mailing list: gated-people@gated.cornell.edu.\n * \n * ------------------------------------------------------------------------\n * \n *       Portions of this software may fall under the following\n *       copyrights:\n * \n * \tCopyright (c) 1988 Regents of the University of California.\n * \tAll rights reserved.\n * \n * \tRedistribution and use in source and binary forms are\n * \tpermitted provided that the above copyright notice and\n * \tthis paragraph are duplicated in all such forms and that\n * \tany documentation, advertising materials, and other\n * \tmaterials related to such distribution and use\n * \tacknowledge that the software was developed by the\n * \tUniversity of California, Berkeley.  The name of the\n * \tUniversity may not be used to endorse or promote\n * \tproducts derived from this software without specific\n * \tprior written permission.  THIS SOFTWARE IS PROVIDED\n * \t``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,\n * \tINCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * \tMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n */\n"
  },
  {
    "path": "libfree/inet_ntop.c",
    "content": "/* This is from the BIND 4.9.4 release, modified to compile by itself */\n\n/* Copyright (c) 1996 by Internet Software Consortium.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS\n * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE\n * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL\n * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR\n * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\n * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\n * SOFTWARE.\n */\n\n#if defined(LIBC_SCCS) && !defined(lint)\nstatic char rcsid[] = \"$Id: inet_ntop.c,v 1.1.1.1 2002/11/14 03:33:35 fenner Exp $\";\n#endif /* LIBC_SCCS and not lint */\n\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <string.h>\n#include <errno.h>\n#include <stdio.h>\n\n#define\tIN6ADDRSZ\t16\n#define\tINT16SZ\t\t 2\n\n#ifndef\tAF_INET6\n#define\tAF_INET6\tAF_MAX+1\t/* just to let this compile */\n#endif\n\n/*\n * WARNING: Don't even consider trying to compile this on a system where\n * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.\n */\n\nstatic const char *inet_ntop4(const u_char *src, char *dst, size_t size);\nstatic const char *inet_ntop6(const u_char *src, char *dst, size_t size);\n\n/* char *\n * inet_ntop(af, src, dst, size)\n *\tconvert a network format address to presentation format.\n * return:\n *\tpointer to presentation format address (`dst'), or NULL (see errno).\n * author:\n *\tPaul Vixie, 1996.\n */\nconst char *\ninet_ntop(af, src, dst, size)\n\tint af;\n\tconst void *src;\n\tchar *dst;\n\tsize_t size;\n{\n\tswitch (af) {\n\tcase AF_INET:\n\t\treturn (inet_ntop4(src, dst, size));\n\tcase AF_INET6:\n\t\treturn (inet_ntop6(src, dst, size));\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn (NULL);\n\t}\n\t/* NOTREACHED */\n}\n\n/* const char *\n * inet_ntop4(src, dst, size)\n *\tformat an IPv4 address, more or less like inet_ntoa()\n * return:\n *\t`dst' (as a const)\n * notes:\n *\t(1) uses no statics\n *\t(2) takes a u_char* not an in_addr as input\n * author:\n *\tPaul Vixie, 1996.\n */\nstatic const char *\ninet_ntop4(src, dst, size)\n\tconst u_char *src;\n\tchar *dst;\n\tsize_t size;\n{\n\tstatic const char fmt[] = \"%u.%u.%u.%u\";\n\tchar tmp[sizeof \"255.255.255.255\"];\n\n\tsprintf(tmp, fmt, src[0], src[1], src[2], src[3]);\n\tif (strlen(tmp) > size) {\n\t\terrno = ENOSPC;\n\t\treturn (NULL);\n\t}\n\tstrcpy(dst, tmp);\n\treturn (dst);\n}\n\n/* const char *\n * inet_ntop6(src, dst, size)\n *\tconvert IPv6 binary address into presentation (printable) format\n * author:\n *\tPaul Vixie, 1996.\n */\nstatic const char *\ninet_ntop6(src, dst, size)\n\tconst u_char *src;\n\tchar *dst;\n\tsize_t size;\n{\n\t/*\n\t * Note that int32_t and int16_t need only be \"at least\" large enough\n\t * to contain a value of the specified size.  On some systems, like\n\t * Crays, there is no such thing as an integer variable with 16 bits.\n\t * Keep this in mind if you think this function should have been coded\n\t * to use pointer overlays.  All the world's not a VAX.\n\t */\n\tchar tmp[sizeof \"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255\"], *tp;\n\tstruct { int base, len; } best, cur;\n\tu_int words[IN6ADDRSZ / INT16SZ];\n\tint i;\n\n\t/*\n\t * Preprocess:\n\t *\tCopy the input (bytewise) array into a wordwise array.\n\t *\tFind the longest run of 0x00's in src[] for :: shorthanding.\n\t */\n\tmemset(words, 0, sizeof words);\n\tfor (i = 0; i < IN6ADDRSZ; i++)\n\t\twords[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));\n\tbest.base = -1;\n\tcur.base = -1;\n\tfor (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {\n\t\tif (words[i] == 0) {\n\t\t\tif (cur.base == -1)\n\t\t\t\tcur.base = i, cur.len = 1;\n\t\t\telse\n\t\t\t\tcur.len++;\n\t\t} else {\n\t\t\tif (cur.base != -1) {\n\t\t\t\tif (best.base == -1 || cur.len > best.len)\n\t\t\t\t\tbest = cur;\n\t\t\t\tcur.base = -1;\n\t\t\t}\n\t\t}\n\t}\n\tif (cur.base != -1) {\n\t\tif (best.base == -1 || cur.len > best.len)\n\t\t\tbest = cur;\n\t}\n\tif (best.base != -1 && best.len < 2)\n\t\tbest.base = -1;\n\n\t/*\n\t * Format the result.\n\t */\n\ttp = tmp;\n\tfor (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {\n\t\t/* Are we inside the best run of 0x00's? */\n\t\tif (best.base != -1 && i >= best.base &&\n\t\t    i < (best.base + best.len)) {\n\t\t\tif (i == best.base)\n\t\t\t\t*tp++ = ':';\n\t\t\tcontinue;\n\t\t}\n\t\t/* Are we following an initial run of 0x00s or any real hex? */\n\t\tif (i != 0)\n\t\t\t*tp++ = ':';\n\t\t/* Is this address an encapsulated IPv4? */\n\t\tif (i == 6 && best.base == 0 &&\n\t\t    (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {\n\t\t\tif (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)))\n\t\t\t\treturn (NULL);\n\t\t\ttp += strlen(tp);\n\t\t\tbreak;\n\t\t}\n\t\tsprintf(tp, \"%x\", words[i]);\n\t\ttp += strlen(tp);\n\t}\n\t/* Was it a trailing run of 0x00's? */\n\tif (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))\n\t\t*tp++ = ':';\n\t*tp++ = '\\0';\n\n\t/*\n\t * Check for overflow, copy, and we're done.\n\t */\n\tif ((tp - tmp) > size) {\n\t\terrno = ENOSPC;\n\t\treturn (NULL);\n\t}\n\tstrcpy(dst, tmp);\n\treturn (dst);\n}\n"
  },
  {
    "path": "libfree/inet_ntop_ipv4.c",
    "content": "#include\t<sys/types.h>\n#include\t<sys/socket.h>\n#include\t<errno.h>\n#include\t<stdio.h>\n\n#ifndef\tINET_ADDRSTRLEN\n#define\tINET_ADDRSTRLEN\t\t16\n#endif\n\n/* include inet_ntop */\nconst char *\ninet_ntop(int family, const void *addrptr, char *strptr, size_t len)\n{\n\tconst u_char *p = (const u_char *) addrptr;\n\n\tif (family == AF_INET) {\n\t\tchar\ttemp[INET_ADDRSTRLEN];\n\n\t\tsnprintf(temp, sizeof(temp), \"%d.%d.%d.%d\",\n\t\t\t\t p[0], p[1], p[2], p[3]);\n\t\tif (strlen(temp) >= len) {\n\t\t\terrno = ENOSPC;\n\t\t\treturn (NULL);\n\t\t}\n\t\tstrcpy(strptr, temp);\n\t\treturn (strptr);\n\t}\n\terrno = EAFNOSUPPORT;\n\treturn (NULL);\n}\n/* end inet_ntop */\n"
  },
  {
    "path": "libfree/inet_ntop_ipv4.lc",
    "content": "#include    <sys/types.h>##  1 ##src/libfree/inet_ntop_ipv4.c##\n#include    <sys/socket.h>##  2 ##src/libfree/inet_ntop_ipv4.c##\n#include    <errno.h>##  3 ##src/libfree/inet_ntop_ipv4.c##\n#include    <stdio.h>##  4 ##src/libfree/inet_ntop_ipv4.c##\n\n#ifndef INET_ADDRSTRLEN##  5 ##src/libfree/inet_ntop_ipv4.c##\n#define INET_ADDRSTRLEN     16##  6 ##src/libfree/inet_ntop_ipv4.c##\n#endif##  7 ##src/libfree/inet_ntop_ipv4.c##\n\n/* include inet_ntop */\nconst char *##  8 ##src/libfree/inet_ntop_ipv4.c##\ninet_ntop(int family, const void *addrptr, char *strptr, size_t len)##  9 ##src/libfree/inet_ntop_ipv4.c##\n{## 10 ##src/libfree/inet_ntop_ipv4.c##\n    const u_char *p = (const u_char *) addrptr;## 11 ##src/libfree/inet_ntop_ipv4.c##\n\n    if (family == AF_INET) {## 12 ##src/libfree/inet_ntop_ipv4.c##\n        char    temp[INET_ADDRSTRLEN];## 13 ##src/libfree/inet_ntop_ipv4.c##\n\n        snprintf(temp, sizeof(temp), \"%d.%d.%d.%d\", p[0], p[1], p[2], p[3]);## 14 ##src/libfree/inet_ntop_ipv4.c##\n        if (strlen(temp) >= len) {## 15 ##src/libfree/inet_ntop_ipv4.c##\n            errno = ENOSPC;## 16 ##src/libfree/inet_ntop_ipv4.c##\n            return (NULL);## 17 ##src/libfree/inet_ntop_ipv4.c##\n        }## 18 ##src/libfree/inet_ntop_ipv4.c##\n        strcpy(strptr, temp);## 19 ##src/libfree/inet_ntop_ipv4.c##\n        return (strptr);## 20 ##src/libfree/inet_ntop_ipv4.c##\n    }## 21 ##src/libfree/inet_ntop_ipv4.c##\n    errno = EAFNOSUPPORT;## 22 ##src/libfree/inet_ntop_ipv4.c##\n    return (NULL);## 23 ##src/libfree/inet_ntop_ipv4.c##\n}## 24 ##src/libfree/inet_ntop_ipv4.c##\n/* end inet_ntop */\n"
  },
  {
    "path": "libfree/inet_pton.c",
    "content": "/* This is from the BIND 4.9.4 release, modified to compile by itself */\n\n/* Copyright (c) 1996 by Internet Software Consortium.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS\n * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE\n * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL\n * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR\n * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\n * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\n * SOFTWARE.\n */\n\n#if defined(LIBC_SCCS) && !defined(lint)\nstatic char rcsid[] = \"$Id: inet_pton.c,v 1.1.1.1 2002/11/14 03:33:35 fenner Exp $\";\n#endif /* LIBC_SCCS and not lint */\n\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <string.h>\n#include <errno.h>\n\n#define\tIN6ADDRSZ\t16\n#define\tINADDRSZ\t 4\n#define\tINT16SZ\t\t 2\n\n#ifndef\tAF_INET6\n#define\tAF_INET6\tAF_MAX+1\t/* just to let this compile */\n#endif\n\n/*\n * WARNING: Don't even consider trying to compile this on a system where\n * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.\n */\n\nstatic int\tinet_pton4(const char *src, u_char *dst);\nstatic int\tinet_pton6(const char *src, u_char *dst);\n\n/* int\n * inet_pton(af, src, dst)\n *\tconvert from presentation format (which usually means ASCII printable)\n *\tto network format (which is usually some kind of binary format).\n * return:\n *\t1 if the address was valid for the specified address family\n *\t0 if the address wasn't valid (`dst' is untouched in this case)\n *\t-1 if some other error occurred (`dst' is untouched in this case, too)\n * author:\n *\tPaul Vixie, 1996.\n */\nint\ninet_pton(af, src, dst)\n\tint af;\n\tconst char *src;\n\tvoid *dst;\n{\n\tswitch (af) {\n\tcase AF_INET:\n\t\treturn (inet_pton4(src, dst));\n\tcase AF_INET6:\n\t\treturn (inet_pton6(src, dst));\n\tdefault:\n\t\terrno = EAFNOSUPPORT;\n\t\treturn (-1);\n\t}\n\t/* NOTREACHED */\n}\n\n/* int\n * inet_pton4(src, dst)\n *\tlike inet_aton() but without all the hexadecimal and shorthand.\n * return:\n *\t1 if `src' is a valid dotted quad, else 0.\n * notice:\n *\tdoes not touch `dst' unless it's returning 1.\n * author:\n *\tPaul Vixie, 1996.\n */\nstatic int\ninet_pton4(src, dst)\n\tconst char *src;\n\tu_char *dst;\n{\n\tstatic const char digits[] = \"0123456789\";\n\tint saw_digit, octets, ch;\n\tu_char tmp[INADDRSZ], *tp;\n\n\tsaw_digit = 0;\n\toctets = 0;\n\t*(tp = tmp) = 0;\n\twhile ((ch = *src++) != '\\0') {\n\t\tconst char *pch;\n\n\t\tif ((pch = strchr(digits, ch)) != NULL) {\n\t\t\tu_int new = *tp * 10 + (pch - digits);\n\n\t\t\tif (new > 255)\n\t\t\t\treturn (0);\n\t\t\t*tp = new;\n\t\t\tif (! saw_digit) {\n\t\t\t\tif (++octets > 4)\n\t\t\t\t\treturn (0);\n\t\t\t\tsaw_digit = 1;\n\t\t\t}\n\t\t} else if (ch == '.' && saw_digit) {\n\t\t\tif (octets == 4)\n\t\t\t\treturn (0);\n\t\t\t*++tp = 0;\n\t\t\tsaw_digit = 0;\n\t\t} else\n\t\t\treturn (0);\n\t}\n\tif (octets < 4)\n\t\treturn (0);\n\t/* bcopy(tmp, dst, INADDRSZ); */\n\tmemcpy(dst, tmp, INADDRSZ);\n\treturn (1);\n}\n\n/* int\n * inet_pton6(src, dst)\n *\tconvert presentation level address to network order binary form.\n * return:\n *\t1 if `src' is a valid [RFC1884 2.2] address, else 0.\n * notice:\n *\t(1) does not touch `dst' unless it's returning 1.\n *\t(2) :: in a full address is silently ignored.\n * credit:\n *\tinspired by Mark Andrews.\n * author:\n *\tPaul Vixie, 1996.\n */\nstatic int\ninet_pton6(src, dst)\n\tconst char *src;\n\tu_char *dst;\n{\n\tstatic const char xdigits_l[] = \"0123456789abcdef\",\n\t\t\t  xdigits_u[] = \"0123456789ABCDEF\";\n\tu_char tmp[IN6ADDRSZ], *tp, *endp, *colonp;\n\tconst char *xdigits, *curtok;\n\tint ch, saw_xdigit;\n\tu_int val;\n\n\tmemset((tp = tmp), 0, IN6ADDRSZ);\n\tendp = tp + IN6ADDRSZ;\n\tcolonp = NULL;\n\t/* Leading :: requires some special handling. */\n\tif (*src == ':')\n\t\tif (*++src != ':')\n\t\t\treturn (0);\n\tcurtok = src;\n\tsaw_xdigit = 0;\n\tval = 0;\n\twhile ((ch = *src++) != '\\0') {\n\t\tconst char *pch;\n\n\t\tif ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)\n\t\t\tpch = strchr((xdigits = xdigits_u), ch);\n\t\tif (pch != NULL) {\n\t\t\tval <<= 4;\n\t\t\tval |= (pch - xdigits);\n\t\t\tif (val > 0xffff)\n\t\t\t\treturn (0);\n\t\t\tsaw_xdigit = 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch == ':') {\n\t\t\tcurtok = src;\n\t\t\tif (!saw_xdigit) {\n\t\t\t\tif (colonp)\n\t\t\t\t\treturn (0);\n\t\t\t\tcolonp = tp;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (tp + INT16SZ > endp)\n\t\t\t\treturn (0);\n\t\t\t*tp++ = (u_char) (val >> 8) & 0xff;\n\t\t\t*tp++ = (u_char) val & 0xff;\n\t\t\tsaw_xdigit = 0;\n\t\t\tval = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch == '.' && ((tp + INADDRSZ) <= endp) &&\n\t\t    inet_pton4(curtok, tp) > 0) {\n\t\t\ttp += INADDRSZ;\n\t\t\tsaw_xdigit = 0;\n\t\t\tbreak;\t/* '\\0' was seen by inet_pton4(). */\n\t\t}\n\t\treturn (0);\n\t}\n\tif (saw_xdigit) {\n\t\tif (tp + INT16SZ > endp)\n\t\t\treturn (0);\n\t\t*tp++ = (u_char) (val >> 8) & 0xff;\n\t\t*tp++ = (u_char) val & 0xff;\n\t}\n\tif (colonp != NULL) {\n\t\t/*\n\t\t * Since some memmove()'s erroneously fail to handle\n\t\t * overlapping regions, we'll do the shift by hand.\n\t\t */\n\t\tconst int n = tp - colonp;\n\t\tint i;\n\n\t\tfor (i = 1; i <= n; i++) {\n\t\t\tendp[- i] = colonp[n - i];\n\t\t\tcolonp[n - i] = 0;\n\t\t}\n\t\ttp = endp;\n\t}\n\tif (tp != endp)\n\t\treturn (0);\n\t/* bcopy(tmp, dst, IN6ADDRSZ); */\n\tmemcpy(dst, tmp, IN6ADDRSZ);\n\treturn (1);\n}\n"
  },
  {
    "path": "libfree/inet_pton_ipv4.c",
    "content": "#include\t<sys/types.h>\n#include\t<sys/socket.h>\n#include\t<netinet/in.h>\n#include\t<arpa/inet.h>\n#include\t<errno.h>\n#include\t<string.h>\n\n/* Delete following line if your system's headers already DefinE this\n   function prototype */\nint\t\t inet_aton(const char *, struct in_addr *);\n\n/* include inet_pton */\nint\ninet_pton(int family, const char *strptr, void *addrptr)\n{\n    if (family == AF_INET) {\n    \tstruct in_addr  in_val;\n\n        if (inet_aton(strptr, &in_val)) {\n            memcpy(addrptr, &in_val, sizeof(struct in_addr));\n            return (1);\n        }\n\t\treturn(0);\n    }\n\terrno = EAFNOSUPPORT;\n    return (-1);\n}\n/* end inet_pton */\n"
  },
  {
    "path": "libfree/inet_pton_ipv4.lc",
    "content": "#include    <sys/types.h>##  1 ##src/libfree/inet_pton_ipv4.c##\n#include    <sys/socket.h>##  2 ##src/libfree/inet_pton_ipv4.c##\n#include    <netinet/in.h>##  3 ##src/libfree/inet_pton_ipv4.c##\n#include    <arpa/inet.h>##  4 ##src/libfree/inet_pton_ipv4.c##\n#include    <errno.h>##  5 ##src/libfree/inet_pton_ipv4.c##\n#include    <string.h>##  6 ##src/libfree/inet_pton_ipv4.c##\n\n/* Delete following line if your system's headers already define this##  7 ##src/libfree/inet_pton_ipv4.c##\n   function prototype */##  8 ##src/libfree/inet_pton_ipv4.c##\nint     inet_aton(const char *, struct in_addr *);##  9 ##src/libfree/inet_pton_ipv4.c##\n\n/* include inet_pton */\nint## 10 ##src/libfree/inet_pton_ipv4.c##\ninet_pton(int family, const char *strptr, void *addrptr)## 11 ##src/libfree/inet_pton_ipv4.c##\n{## 12 ##src/libfree/inet_pton_ipv4.c##\n    if (family == AF_INET) {## 13 ##src/libfree/inet_pton_ipv4.c##\n        struct in_addr in_val;## 14 ##src/libfree/inet_pton_ipv4.c##\n\n        if (inet_aton(strptr, &in_val)) {## 15 ##src/libfree/inet_pton_ipv4.c##\n            memcpy(addrptr, &in_val, sizeof(struct in_addr));## 16 ##src/libfree/inet_pton_ipv4.c##\n            return (1);## 17 ##src/libfree/inet_pton_ipv4.c##\n        }## 18 ##src/libfree/inet_pton_ipv4.c##\n        return (0);## 19 ##src/libfree/inet_pton_ipv4.c##\n    }## 20 ##src/libfree/inet_pton_ipv4.c##\n    errno = EAFNOSUPPORT;## 21 ##src/libfree/inet_pton_ipv4.c##\n    return (-1);## 22 ##src/libfree/inet_pton_ipv4.c##\n}## 23 ##src/libfree/inet_pton_ipv4.c##\n/* end inet_pton */\n"
  },
  {
    "path": "libfree/test_ascii2addr.c",
    "content": "#include\t<sys/types.h>\n#include\t<sys/socket.h>\n#include\t<netinet/in.h>\n#include\t<netdb.h>\n#include\t<stdio.h>\n\nmain()\n{\n\tstruct in6_addr\tfoo;\n\n\tprintf(\"ascii2addr returned %d\\n\",\n\t\tascii2addr(AF_INET6, \"::140.252.13.36\", &foo));\n\n\texit(0);\n}\n"
  },
  {
    "path": "libfree/test_getservbyname_r.c",
    "content": "#include\t<netdb.h>\n\nmain()\n{\n\tchar\t\tbuf[8192];\n\tstruct servent\tsent, *sptr;\n\n\tsptr = getservbyname_r(\"tftp\", \"tcp\", &sent, buf, sizeof(buf));\n\tprintf(\"TCP, sptr = %p\\n\", sptr);\n\n\tsptr = getservbyname_r(\"tftp\", \"udp\", &sent, buf, sizeof(buf));\n\tprintf(\"UDP, sptr = %p\\n\", sptr);\n\n\tsptr = getservbyname_r(\"tftp\", \"tcp\", &sent, buf, sizeof(buf));\n\tprintf(\"TCP, sptr = %p\\n\", sptr);\n\n\tsptr = getservbyname_r(\"tftp\", \"udp\", &sent, buf, sizeof(buf));\n\tprintf(\"UDP, sptr = %p\\n\", sptr);\n\n\texit(0);\n}\n"
  },
  {
    "path": "libfree/test_inet_pton.c",
    "content": "#include\t\"../lib/unp.h\"\n\n#ifndef\tAF_INET6\n#define\tAF_INET6\tAF_MAX+1\t/* just to let this compile */\n#endif\n\nint\t\tinet_pton(int, const char *, void *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti;\n\tchar\tbuff[100];\n\n\t/*\n\t * Make certain that we can test the difference between 0.0.0.0\n\t * being acceptable for AF_INET (but not acceptable for AF_INET6)\n\t * and 0::0 being OK for AF_INET6 (but not OK for AF_INET).\n\t * This way a server can be coded as protocol independent (IPv4 or\n\t * IPv6) but let the user specify the local IP address as either\n\t * 0.0.0.0 or 0::0 as an indirect way of telling the server when\n\t * it starts, which protocol to use (but still allowing the server\n\t * to bind the wildcard address).\n\t */\n\n\tif ( (i = inet_pton(AF_INET, \"0.0.0.0\", buff)) != 1)\t/* should be OK */\n\t\tprintf(\"AF_INET, 0.0.0.0 returned: %d\\n\", i);\n\tif ( (i = inet_pton(AF_INET6, \"0.0.0.0\", buff)) != 0)\n\t\tprintf(\"AF_INET6, 0.0.0.0 returned: %d\\n\", i);\n\n\tif ( (i = inet_pton(AF_INET6, \"0::0\", buff)) != 1)\t\t/* should be OK */\n\t\tprintf(\"AF_INET6, 0::0 returned: %d\\n\", i);\n\tif ( (i = inet_pton(AF_INET, \"0::0\", buff)) != 0)\n\t\tprintf(\"AF_INET, 0::0 returned: %d\\n\", i);\n\n\tprintf(\"inet_pton(AF_INET6, \\\"1.2.3.4\\\", buff) returns %d\\n\",\n\t\t    inet_pton(AF_INET6,  \"1.2.3.4\", buff));\n\tprintf(\"inet_pton(AF_INET6, \\\"::1.2.3.4\\\", buff) returns %d\\n\",\n\t\t    inet_pton(AF_INET6,  \"::1.2.3.4\", buff));\n\n\texit(0);\n}\n"
  },
  {
    "path": "libgai/Makefile",
    "content": "include ../Make.defines\n\n# Note: In the source code in this directory I #ifdef the constants\n# IPv4, IPv6 (both lowercase \"v\"), and UNIXdomain.  This is instead of\n# the all-uppercase constants so that these #ifdef/#endif lines do not\n# appear in the book (too much clutter, given the amount of conditional\n# testing for all the code in this directory).\n\nall:\t${LIBGAI_OBJS}\n\t\tar rv ${LIBUNP_NAME} $?\n\t\t${RANLIB} ${LIBUNP_NAME}\n\nPROGS = testga test1\n\ntestga:\ttestga.o\n\t\t${CC} ${CFLAGS} -o $@ testga.o ${LIBS}\n\ntest1:\ttest1.o\n\t\t${CC} ${CFLAGS} -o $@ test1.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "libgai/addrinfo.h",
    "content": "#ifndef\t__addrinfo_h\n#define\t__addrinfo_h\n\n/*\n * Everything here really belongs in <netdb.h>.\n * These defines are separate for now, to avoid having to modify the\n * system's header.\n */\n\nstruct addrinfo {\n  int\t\tai_flags;\t\t\t/* AI_PASSIVE, AI_CANONNAME */\n  int\t\tai_family;\t\t\t/* PF_xxx */\n  int\t\tai_socktype;\t\t/* SOCK_xxx */\n  int\t\tai_protocol;\t\t/* IPPROTO_xxx for IPv4 and IPv6 */\n  size_t\tai_addrlen;\t\t\t/* length of ai_addr */\n  char\t\t*ai_canonname;\t\t/* canonical name for host */\n  struct sockaddr\t*ai_addr;\t/* binary address */\n  struct addrinfo\t*ai_next;\t/* next structure in linked list */\n};\n\n\t\t\t/* following for getaddrinfo() */\n#define\tAI_PASSIVE\t\t 1\t/* socket is intended for bind() + listen() */\n#define\tAI_CANONNAME\t 2\t/* return canonical name */\n\n\t\t\t/* following for getnameinfo() */\n#define\tNI_MAXHOST\t  1025\t/* max hostname returned */\n#define\tNI_MAXSERV\t    32\t/* max service name returned */\n\n#define\tNI_NOFQDN\t     1\t/* do not return FQDN */\n#define\tNI_NUMERICHOST   2\t/* return numeric form of hostname */\n#define\tNI_NAMEREQD\t     4\t/* return error if hostname not found */\n#define\tNI_NUMERICSERV   8\t/* return numeric form of service name */\n#define\tNI_DGRAM\t    16\t/* datagram service for getservbyname() */\n\n\t\t\t/* error returns */\n#define\tEAI_ADDRFAMILY\t 1\t/* address family for host not supported */\n#define\tEAI_AGAIN\t\t 2\t/* temporary failure in name resolution */\n#define\tEAI_BADFLAGS\t 3\t/* invalid value for ai_flags */\n#define\tEAI_FAIL\t\t 4\t/* non-recoverable failure in name resolution */\n#define\tEAI_FAMILY\t\t 5\t/* ai_family not supported */\n#define\tEAI_MEMORY\t\t 6\t/* memory allocation failure */\n#define\tEAI_NODATA\t\t 7\t/* no address associated with host */\n#define\tEAI_NONAME\t\t 8\t/* host nor service provided, or not known */\n#define\tEAI_SERVICE\t\t 9\t/* service not supported for ai_socktype */\n#define\tEAI_SOCKTYPE\t10\t/* ai_socktype not supported */\n#define\tEAI_SYSTEM\t\t11\t/* system error returned in errno */\n\n#endif\t/* __addrinfo_h */\n"
  },
  {
    "path": "libgai/freeaddrinfo.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/* include freeaddrinfo */\nvoid\nfreeaddrinfo(struct addrinfo *aihead)\n{\n\tstruct addrinfo\t*ai, *ainext;\n\n\tfor (ai = aihead; ai != NULL; ai = ainext) {\n\t\tif (ai->ai_addr != NULL)\n\t\t\tfree(ai->ai_addr);\t\t/* socket address structure */\n\n\t\tif (ai->ai_canonname != NULL)\n\t\t\tfree(ai->ai_canonname);\n\n\t\tainext = ai->ai_next;\t/* can't fetch ai_next after free() */\n\t\tfree(ai);\t\t\t\t/* the addrinfo{} itself */\n\t}\n}\n/* end freeaddrinfo */\n"
  },
  {
    "path": "libgai/ga_aistruct.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * Create and fill in an addrinfo{}.\n */\n\n/* include ga_aistruct1 */\nint\nga_aistruct(struct addrinfo ***paipnext, const struct addrinfo *hintsp,\n\t\t\tconst void *addr, int family)\n{\n\tstruct addrinfo\t*ai;\n\n\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(EAI_MEMORY);\n\tai->ai_next = NULL;\n\tai->ai_canonname = NULL;\n\t**paipnext = ai;\n\t*paipnext = &ai->ai_next;\n\n\tif ( (ai->ai_socktype = hintsp->ai_socktype) == 0)\n\t\tai->ai_flags |= AI_CLONE;\n\n\tai->ai_protocol = hintsp->ai_protocol;\n/* end ga_aistruct1 */\n\t\n/* include ga_aistruct2 */\n\tswitch ((ai->ai_family = family)) {\n#ifdef\tIPv4\n\t\tcase AF_INET: {\n\t\t\tstruct sockaddr_in\t*sinptr;\n\n\t\t\t\t/* 4allocate sockaddr_in{} and fill in all but port */\n\t\t\tif ( (sinptr = calloc(1, sizeof(struct sockaddr_in))) == NULL)\n\t\t\t\treturn(EAI_MEMORY);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\tsinptr->sin_len = sizeof(struct sockaddr_in);\n#endif\n\t\t\tsinptr->sin_family = AF_INET;\n\t\t\tmemcpy(&sinptr->sin_addr, addr, sizeof(struct in_addr));\n\t\t\tai->ai_addr = (struct sockaddr *) sinptr;\n\t\t\tai->ai_addrlen = sizeof(struct sockaddr_in);\n\t\t\tbreak;\n\t\t}\n#endif\t/* IPV4 */\n#ifdef\tIPv6\n\t\tcase AF_INET6: {\n\t\t\tstruct sockaddr_in6\t*sin6ptr;\n\n\t\t\t\t/* 4allocate sockaddr_in6{} and fill in all but port */\n\t\t\tif ( (sin6ptr = calloc(1, sizeof(struct sockaddr_in6))) == NULL)\n\t\t\t\treturn(EAI_MEMORY);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\tsin6ptr->sin6_len = sizeof(struct sockaddr_in6);\n#endif\n\t\t\tsin6ptr->sin6_family = AF_INET6;\n\t\t\tmemcpy(&sin6ptr->sin6_addr, addr, sizeof(struct in6_addr));\n\t\t\tai->ai_addr = (struct sockaddr *) sin6ptr;\n\t\t\tai->ai_addrlen = sizeof(struct sockaddr_in6);\n\t\t\tbreak;\n\t\t}\n#endif\t/* IPV6 */\n#ifdef\tUNIXdomain\n\t\tcase AF_LOCAL: {\n\t\t\tstruct sockaddr_un\t*unp;\n\n\t\t\t\t/* 4allocate sockaddr_un{} and fill in */\n/* *INDENT-OFF* */\n\t\t\tif (strlen(addr) >= sizeof(unp->sun_path))\n\t\t\t\treturn(EAI_SERVICE);\n\t\t\tif ( (unp = calloc(1, sizeof(struct sockaddr_un))) == NULL)\n\t\t\t\treturn(EAI_MEMORY);\n/* *INDENT-ON* */\n\t\t\tunp->sun_family = AF_LOCAL;\n\t\t\tstrcpy(unp->sun_path, addr);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\tunp->sun_len = SUN_LEN(unp);\n#endif\n\t\t\tai->ai_addr = (struct sockaddr *) unp;\n\t\t\tai->ai_addrlen = sizeof(struct sockaddr_un);\n\t\t\tif (hintsp->ai_flags & AI_PASSIVE)\n\t\t\t\tunlink(unp->sun_path);\t/* OK if this fails */\n\t\t\tbreak;\n\t\t}\n#endif\t/* UNIXDOMAIN */\n\t}\n\treturn(0);\n}\n/* end ga_aistruct2 */\n"
  },
  {
    "path": "libgai/ga_aistruct.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_aistruct.c##\n\n/*##  2 ##src/libgai/ga_aistruct.c##\n * Create and fill in an addrinfo{}.##  3 ##src/libgai/ga_aistruct.c##\n */##  4 ##src/libgai/ga_aistruct.c##\n\n/* include ga_aistruct1 */\nint##  5 ##src/libgai/ga_aistruct.c##\nga_aistruct(struct addrinfo ***paipnext, const struct addrinfo *hintsp,##  6 ##src/libgai/ga_aistruct.c##\n            const void *addr, int family)##  7 ##src/libgai/ga_aistruct.c##\n{##  8 ##src/libgai/ga_aistruct.c##\n    struct addrinfo *ai;##  9 ##src/libgai/ga_aistruct.c##\n\n    if ((ai = calloc(1, sizeof(struct addrinfo))) == NULL)## 10 ##src/libgai/ga_aistruct.c##\n        return (EAI_MEMORY);## 11 ##src/libgai/ga_aistruct.c##\n    ai->ai_next = NULL;## 12 ##src/libgai/ga_aistruct.c##\n    ai->ai_canonname = NULL;## 13 ##src/libgai/ga_aistruct.c##\n    **paipnext = ai;## 14 ##src/libgai/ga_aistruct.c##\n    *paipnext = &ai->ai_next;## 15 ##src/libgai/ga_aistruct.c##\n\n    if ((ai->ai_socktype = hintsp->ai_socktype) == 0)## 16 ##src/libgai/ga_aistruct.c##\n        ai->ai_flags |= AI_CLONE;## 17 ##src/libgai/ga_aistruct.c##\n\n    ai->ai_protocol = hintsp->ai_protocol;## 18 ##src/libgai/ga_aistruct.c##\n/* end ga_aistruct1 */\n\n/* include ga_aistruct2 */\n    switch ((ai->ai_family = family)) {## 19 ##src/libgai/ga_aistruct.c##\n    case AF_INET:{## 20 ##src/libgai/ga_aistruct.c##\n            struct sockaddr_in *sinptr;## 21 ##src/libgai/ga_aistruct.c##\n\n            /* 4allocate sockaddr_in{} and fill in all but port */## 22 ##src/libgai/ga_aistruct.c##\n            if ((sinptr = calloc(1, sizeof(struct sockaddr_in))) == NULL)## 23 ##src/libgai/ga_aistruct.c##\n                return (EAI_MEMORY);## 24 ##src/libgai/ga_aistruct.c##\n#ifdef  HAVE_SOCKADDR_SA_LEN## 25 ##src/libgai/ga_aistruct.c##\n            sinptr->sin_len = sizeof(struct sockaddr_in);## 26 ##src/libgai/ga_aistruct.c##\n#endif## 27 ##src/libgai/ga_aistruct.c##\n            sinptr->sin_family = AF_INET;## 28 ##src/libgai/ga_aistruct.c##\n            memcpy(&sinptr->sin_addr, addr, sizeof(struct in_addr));## 29 ##src/libgai/ga_aistruct.c##\n            ai->ai_addr = (struct sockaddr *) sinptr;## 30 ##src/libgai/ga_aistruct.c##\n            ai->ai_addrlen = sizeof(struct sockaddr_in);## 31 ##src/libgai/ga_aistruct.c##\n            break;## 32 ##src/libgai/ga_aistruct.c##\n        }## 33 ##src/libgai/ga_aistruct.c##\n    case AF_INET6:{## 34 ##src/libgai/ga_aistruct.c##\n            struct sockaddr_in6 *sin6ptr;## 35 ##src/libgai/ga_aistruct.c##\n\n            /* 4allocate sockaddr_in6{} and fill in all but port */## 36 ##src/libgai/ga_aistruct.c##\n            if ((sin6ptr = calloc(1, sizeof(struct sockaddr_in6))) == NULL)## 37 ##src/libgai/ga_aistruct.c##\n                return (EAI_MEMORY);## 38 ##src/libgai/ga_aistruct.c##\n#ifdef  HAVE_SOCKADDR_SA_LEN## 39 ##src/libgai/ga_aistruct.c##\n            sin6ptr->sin6_len = sizeof(struct sockaddr_in6);## 40 ##src/libgai/ga_aistruct.c##\n#endif## 41 ##src/libgai/ga_aistruct.c##\n            sin6ptr->sin6_family = AF_INET6;## 42 ##src/libgai/ga_aistruct.c##\n            memcpy(&sin6ptr->sin6_addr, addr, sizeof(struct in6_addr));## 43 ##src/libgai/ga_aistruct.c##\n            ai->ai_addr = (struct sockaddr *) sin6ptr;## 44 ##src/libgai/ga_aistruct.c##\n            ai->ai_addrlen = sizeof(struct sockaddr_in6);## 45 ##src/libgai/ga_aistruct.c##\n            break;## 46 ##src/libgai/ga_aistruct.c##\n        }## 47 ##src/libgai/ga_aistruct.c##\n    case AF_LOCAL:{## 48 ##src/libgai/ga_aistruct.c##\n            struct sockaddr_un *unp;## 49 ##src/libgai/ga_aistruct.c##\n\n            /* 4allocate sockaddr_un{} and fill in */## 50 ##src/libgai/ga_aistruct.c##\n            if (strlen(addr) >= sizeof(unp->sun_path))## 51 ##src/libgai/ga_aistruct.c##\n                return(EAI_SERVICE);## 52 ##src/libgai/ga_aistruct.c##\n            if ( (unp = calloc(1, sizeof(struct sockaddr_un))) == NULL)## 53 ##src/libgai/ga_aistruct.c##\n                return(EAI_MEMORY);## 54 ##src/libgai/ga_aistruct.c##\n            unp->sun_family = AF_LOCAL;## 55 ##src/libgai/ga_aistruct.c##\n            strcpy(unp->sun_path, addr);## 56 ##src/libgai/ga_aistruct.c##\n#ifdef  HAVE_SOCKADDR_SA_LEN## 57 ##src/libgai/ga_aistruct.c##\n            unp->sun_len = SUN_LEN(unp);## 58 ##src/libgai/ga_aistruct.c##\n#endif## 59 ##src/libgai/ga_aistruct.c##\n            ai->ai_addr = (struct sockaddr *) unp;## 60 ##src/libgai/ga_aistruct.c##\n            ai->ai_addrlen = sizeof(struct sockaddr_un);## 61 ##src/libgai/ga_aistruct.c##\n            if (hintsp->ai_flags & AI_PASSIVE)## 62 ##src/libgai/ga_aistruct.c##\n                unlink(unp->sun_path);  /* OK if this fails */## 63 ##src/libgai/ga_aistruct.c##\n            break;## 64 ##src/libgai/ga_aistruct.c##\n        }## 65 ##src/libgai/ga_aistruct.c##\n    }## 66 ##src/libgai/ga_aistruct.c##\n    return (0);## 67 ##src/libgai/ga_aistruct.c##\n}## 68 ##src/libgai/ga_aistruct.c##\n/* end ga_aistruct2 */\n"
  },
  {
    "path": "libgai/ga_clone.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * Clone a new addrinfo structure from an existing one.\n */\n\n/* include ga_clone */\nstruct addrinfo *\nga_clone(struct addrinfo *ai)\n{\n\tstruct addrinfo\t*new;\n\n\tif ( (new = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(NULL);\n\n\tnew->ai_next = ai->ai_next;\n\tai->ai_next = new;\n\n\tnew->ai_flags = 0;\t\t\t\t/* make sure AI_CLONE is off */\n\tnew->ai_family = ai->ai_family;\n\tnew->ai_socktype = ai->ai_socktype;\n\tnew->ai_protocol = ai->ai_protocol;\n\tnew->ai_canonname = NULL;\n\tnew->ai_addrlen = ai->ai_addrlen;\n\tif ( (new->ai_addr = malloc(ai->ai_addrlen)) == NULL)\n\t\treturn(NULL);\n\tmemcpy(new->ai_addr, ai->ai_addr, ai->ai_addrlen);\n\n\treturn(new);\n}\n/* end ga_clone */\n"
  },
  {
    "path": "libgai/ga_clone.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_clone.c##\n\n/*##  2 ##src/libgai/ga_clone.c##\n * Clone a new addrinfo structure from an existing one.##  3 ##src/libgai/ga_clone.c##\n */##  4 ##src/libgai/ga_clone.c##\n\n/* include ga_clone */\nstruct addrinfo *##  5 ##src/libgai/ga_clone.c##\nga_clone(struct addrinfo *ai)##  6 ##src/libgai/ga_clone.c##\n{##  7 ##src/libgai/ga_clone.c##\n    struct addrinfo *new;##  8 ##src/libgai/ga_clone.c##\n\n    if ((new = calloc(1, sizeof(struct addrinfo))) == NULL)##  9 ##src/libgai/ga_clone.c##\n        return (NULL);## 10 ##src/libgai/ga_clone.c##\n\n    new->ai_next = ai->ai_next;## 11 ##src/libgai/ga_clone.c##\n    ai->ai_next = new;## 12 ##src/libgai/ga_clone.c##\n\n    new->ai_flags = 0;          /* make sure AI_CLONE is off */## 13 ##src/libgai/ga_clone.c##\n    new->ai_family = ai->ai_family;## 14 ##src/libgai/ga_clone.c##\n    new->ai_socktype = ai->ai_socktype;## 15 ##src/libgai/ga_clone.c##\n    new->ai_protocol = ai->ai_protocol;## 16 ##src/libgai/ga_clone.c##\n    new->ai_canonname = NULL;## 17 ##src/libgai/ga_clone.c##\n    new->ai_addrlen = ai->ai_addrlen;## 18 ##src/libgai/ga_clone.c##\n    if ((new->ai_addr = malloc(ai->ai_addrlen)) == NULL)## 19 ##src/libgai/ga_clone.c##\n        return (NULL);## 20 ##src/libgai/ga_clone.c##\n    memcpy(new->ai_addr, ai->ai_addr, ai->ai_addrlen);## 21 ##src/libgai/ga_clone.c##\n\n    return (new);## 22 ##src/libgai/ga_clone.c##\n}## 23 ##src/libgai/ga_clone.c##\n/* end ga_clone */\n"
  },
  {
    "path": "libgai/ga_echeck.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * Basic error checking of flags, family, socket type, and protocol.\n */\n\n/* include ga_echeck */\nint\nga_echeck(const char *hostname, const char *servname,\n\t\t  int flags, int family, int socktype, int protocol)\n{\n\tif (flags & ~(AI_PASSIVE | AI_CANONNAME))\n\t\treturn(EAI_BADFLAGS);\t/* unknown flag bits */\n\n\tif (hostname == NULL || hostname[0] == '\\0') {\n\t\tif (servname == NULL || servname[0] == '\\0')\n\t\t\treturn(EAI_NONAME);\t/* host or service must be specified */\n\t}\n\n\tswitch(family) {\n\t\tcase AF_UNSPEC:\n\t\t\tbreak;\n#ifdef\tIPv4\n\t\tcase AF_INET:\n\t\t\tif (socktype != 0 &&\n\t\t\t\t(socktype != SOCK_STREAM &&\n\t\t\t\t socktype != SOCK_DGRAM &&\n\t\t\t\t socktype != SOCK_RAW))\n\t\t\t\treturn(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\tbreak;\n#endif\n#ifdef\tIPv6\n\t\tcase AF_INET6:\n\t\t\tif (socktype != 0 &&\n\t\t\t\t(socktype != SOCK_STREAM &&\n\t\t\t\t socktype != SOCK_DGRAM &&\n\t\t\t\t socktype != SOCK_RAW))\n\t\t\t\treturn(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\tbreak;\n#endif\n#ifdef\tUNIXdomain\n\t\tcase AF_LOCAL:\n\t\t\tif (socktype != 0 &&\n\t\t\t\t(socktype != SOCK_STREAM &&\n\t\t\t\t socktype != SOCK_DGRAM))\n\t\t\t\treturn(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\treturn(EAI_FAMILY);\t\t/* unknown protocol family */\n\t}\n\treturn(0);\n}\n/* end ga_echeck */\n"
  },
  {
    "path": "libgai/ga_echeck.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_echeck.c##\n\n/*##  2 ##src/libgai/ga_echeck.c##\n * Basic error checking of flags, family, socket type, and protocol.##  3 ##src/libgai/ga_echeck.c##\n */##  4 ##src/libgai/ga_echeck.c##\n\n/* include ga_echeck */\nint##  5 ##src/libgai/ga_echeck.c##\nga_echeck(const char *hostname, const char *servname,##  6 ##src/libgai/ga_echeck.c##\n          int flags, int family, int socktype, int protocol)##  7 ##src/libgai/ga_echeck.c##\n{##  8 ##src/libgai/ga_echeck.c##\n    if (flags & ~(AI_PASSIVE | AI_CANONNAME))##  9 ##src/libgai/ga_echeck.c##\n        return (EAI_BADFLAGS);  /* unknown flag bits */## 10 ##src/libgai/ga_echeck.c##\n\n    if (hostname == NULL || hostname[0] == '\\0') {## 11 ##src/libgai/ga_echeck.c##\n        if (servname == NULL || servname[0] == '\\0')## 12 ##src/libgai/ga_echeck.c##\n            return (EAI_NONAME);    /* host or service must be specified */## 13 ##src/libgai/ga_echeck.c##\n    }## 14 ##src/libgai/ga_echeck.c##\n\n    switch (family) {## 15 ##src/libgai/ga_echeck.c##\n    case AF_UNSPEC:## 16 ##src/libgai/ga_echeck.c##\n        break;## 17 ##src/libgai/ga_echeck.c##\n    case AF_INET:## 18 ##src/libgai/ga_echeck.c##\n        if (socktype != 0 &&## 19 ##src/libgai/ga_echeck.c##\n            (socktype != SOCK_STREAM &&## 20 ##src/libgai/ga_echeck.c##\n             socktype != SOCK_DGRAM && socktype != SOCK_RAW))## 21 ##src/libgai/ga_echeck.c##\n            return (EAI_SOCKTYPE);  /* invalid socket type */## 22 ##src/libgai/ga_echeck.c##\n        break;## 23 ##src/libgai/ga_echeck.c##\n    case AF_INET6:## 24 ##src/libgai/ga_echeck.c##\n        if (socktype != 0 &&## 25 ##src/libgai/ga_echeck.c##\n            (socktype != SOCK_STREAM &&## 26 ##src/libgai/ga_echeck.c##\n             socktype != SOCK_DGRAM && socktype != SOCK_RAW))## 27 ##src/libgai/ga_echeck.c##\n            return (EAI_SOCKTYPE);  /* invalid socket type */## 28 ##src/libgai/ga_echeck.c##\n        break;## 29 ##src/libgai/ga_echeck.c##\n    case AF_LOCAL:## 30 ##src/libgai/ga_echeck.c##\n        if (socktype != 0 &&## 31 ##src/libgai/ga_echeck.c##\n            (socktype != SOCK_STREAM && socktype != SOCK_DGRAM))## 32 ##src/libgai/ga_echeck.c##\n            return (EAI_SOCKTYPE);  /* invalid socket type */## 33 ##src/libgai/ga_echeck.c##\n        break;## 34 ##src/libgai/ga_echeck.c##\n    default:## 35 ##src/libgai/ga_echeck.c##\n        return (EAI_FAMILY);    /* unknown protocol family */## 36 ##src/libgai/ga_echeck.c##\n    }## 37 ##src/libgai/ga_echeck.c##\n    return (0);## 38 ##src/libgai/ga_echeck.c##\n}## 39 ##src/libgai/ga_echeck.c##\n/* end ga_echeck */\n"
  },
  {
    "path": "libgai/ga_nsearch.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * Set up the search[] array with the hostnames and address families\n * that we are to look up.\n */\n\n/* include ga_nsearch1 */\nint\nga_nsearch(const char *hostname, const struct addrinfo *hintsp,\n\t\t   struct search *search)\n{\n\tint\t\tnsearch = 0;\n\n\tif (hostname == NULL || hostname[0] == '\\0') {\n\t\tif (hintsp->ai_flags & AI_PASSIVE) {\n\t\t\t\t/* 4no hostname and AI_PASSIVE: implies wildcard bind */\n\t\t\tswitch (hintsp->ai_family) {\n#ifdef\tIPv4\n\t\t\tcase AF_INET:\n\t\t\t\tsearch[nsearch].host = \"0.0.0.0\";\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPv6\n\t\t\tcase AF_INET6:\n\t\t\t\tsearch[nsearch].host = \"0::0\";\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n\t\t\tcase AF_UNSPEC:\n#ifdef\tIPv6\n\t\t\t\tsearch[nsearch].host = \"0::0\";\t/* IPv6 first, then IPv4 */\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n#endif\n#ifdef\tIPv4\n\t\t\t\tsearch[nsearch].host = \"0.0.0.0\";\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n/* end ga_nsearch1 */\n/* include ga_nsearch2 */\n\t\t} else {\n\t\t\t\t/* 4no host and not AI_PASSIVE: connect to local host */\n\t\t\tswitch (hintsp->ai_family) {\n#ifdef\tIPv4\n\t\t\tcase AF_INET:\n\t\t\t\tsearch[nsearch].host = \"localhost\";\t/* 127.0.0.1 */\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPv6\n\t\t\tcase AF_INET6:\n\t\t\t\tsearch[nsearch].host = \"0::1\";\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n\t\t\tcase AF_UNSPEC:\n#ifdef\tIPv6\n\t\t\t\tsearch[nsearch].host = \"0::1\";\t/* IPv6 first, then IPv4 */\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n#endif\n#ifdef\tIPv4\n\t\t\t\tsearch[nsearch].host = \"localhost\";\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n/* end ga_nsearch2 */\n/* include ga_nsearch3 */\n\t} else {\t/* host is specified */\n\t\tswitch (hintsp->ai_family) {\n#ifdef\tIPv4\n\t\tcase AF_INET:\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\tnsearch++;\n\t\t\tbreak;\n#endif\n#ifdef\tIPv6\n\t\tcase AF_INET6:\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\tnsearch++;\n\t\t\tbreak;\n#endif\n\t\tcase AF_UNSPEC:\n#ifdef\tIPv6\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET6;\t/* IPv6 first */\n\t\t\tnsearch++;\n#endif\n#ifdef\tIPv4\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET;\t/* then IPv4 */\n\t\t\tnsearch++;\n#endif\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (nsearch < 1 || nsearch > 2)\n\t\terr_quit(\"nsearch = %d\", nsearch);\n\treturn(nsearch);\n}\n/* end ga_nsearch3 */\n"
  },
  {
    "path": "libgai/ga_nsearch.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_nsearch.c##\n\n/*##  2 ##src/libgai/ga_nsearch.c##\n * Set up the search[] array with the hostnames and address families##  3 ##src/libgai/ga_nsearch.c##\n * that we are to look up.##  4 ##src/libgai/ga_nsearch.c##\n */##  5 ##src/libgai/ga_nsearch.c##\n\n/* include ga_nsearch1 */\nint##  6 ##src/libgai/ga_nsearch.c##\nga_nsearch(const char *hostname, const struct addrinfo *hintsp,##  7 ##src/libgai/ga_nsearch.c##\n           struct search *search)##  8 ##src/libgai/ga_nsearch.c##\n{##  9 ##src/libgai/ga_nsearch.c##\n    int     nsearch = 0;## 10 ##src/libgai/ga_nsearch.c##\n\n    if (hostname == NULL || hostname[0] == '\\0') {## 11 ##src/libgai/ga_nsearch.c##\n        if (hintsp->ai_flags & AI_PASSIVE) {## 12 ##src/libgai/ga_nsearch.c##\n            /* 4no hostname and AI_PASSIVE: implies wildcard bind */## 13 ##src/libgai/ga_nsearch.c##\n            switch (hintsp->ai_family) {## 14 ##src/libgai/ga_nsearch.c##\n            case AF_INET:## 15 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"0.0.0.0\";## 16 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET;## 17 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 18 ##src/libgai/ga_nsearch.c##\n                break;## 19 ##src/libgai/ga_nsearch.c##\n            case AF_INET6:## 20 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"0::0\";## 21 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET6;## 22 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 23 ##src/libgai/ga_nsearch.c##\n                break;## 24 ##src/libgai/ga_nsearch.c##\n            case AF_UNSPEC:## 25 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"0::0\";  /* IPv6 first, then IPv4 */## 26 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET6;## 27 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 28 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"0.0.0.0\";## 29 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET;## 30 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 31 ##src/libgai/ga_nsearch.c##\n                break;## 32 ##src/libgai/ga_nsearch.c##\n            }## 33 ##src/libgai/ga_nsearch.c##\n/* end ga_nsearch1 */\n/* include ga_nsearch2 */\n        } else {## 34 ##src/libgai/ga_nsearch.c##\n            /* 4no host and not AI_PASSIVE: connect to local host */## 35 ##src/libgai/ga_nsearch.c##\n            switch (hintsp->ai_family) {## 36 ##src/libgai/ga_nsearch.c##\n            case AF_INET:## 37 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"localhost\"; /* 127.0.0.1 */## 38 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET;## 39 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 40 ##src/libgai/ga_nsearch.c##\n                break;## 41 ##src/libgai/ga_nsearch.c##\n            case AF_INET6:## 42 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"0::1\";## 43 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET6;## 44 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 45 ##src/libgai/ga_nsearch.c##\n                break;## 46 ##src/libgai/ga_nsearch.c##\n            case AF_UNSPEC:## 47 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"0::1\";  /* IPv6 first, then IPv4 */## 48 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET6;## 49 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 50 ##src/libgai/ga_nsearch.c##\n                search[nsearch].host = \"localhost\";## 51 ##src/libgai/ga_nsearch.c##\n                search[nsearch].family = AF_INET;## 52 ##src/libgai/ga_nsearch.c##\n                nsearch++;## 53 ##src/libgai/ga_nsearch.c##\n                break;## 54 ##src/libgai/ga_nsearch.c##\n            }## 55 ##src/libgai/ga_nsearch.c##\n        }## 56 ##src/libgai/ga_nsearch.c##\n/* end ga_nsearch2 */\n/* include ga_nsearch3 */\n    } else {                    /* host is specified */## 57 ##src/libgai/ga_nsearch.c##\n        switch (hintsp->ai_family) {## 58 ##src/libgai/ga_nsearch.c##\n        case AF_INET:## 59 ##src/libgai/ga_nsearch.c##\n            search[nsearch].host = hostname;## 60 ##src/libgai/ga_nsearch.c##\n            search[nsearch].family = AF_INET;## 61 ##src/libgai/ga_nsearch.c##\n            nsearch++;## 62 ##src/libgai/ga_nsearch.c##\n            break;## 63 ##src/libgai/ga_nsearch.c##\n        case AF_INET6:## 64 ##src/libgai/ga_nsearch.c##\n            search[nsearch].host = hostname;## 65 ##src/libgai/ga_nsearch.c##\n            search[nsearch].family = AF_INET6;## 66 ##src/libgai/ga_nsearch.c##\n            nsearch++;## 67 ##src/libgai/ga_nsearch.c##\n            break;## 68 ##src/libgai/ga_nsearch.c##\n        case AF_UNSPEC:## 69 ##src/libgai/ga_nsearch.c##\n            search[nsearch].host = hostname;## 70 ##src/libgai/ga_nsearch.c##\n            search[nsearch].family = AF_INET6;  /* IPv6 first */## 71 ##src/libgai/ga_nsearch.c##\n            nsearch++;## 72 ##src/libgai/ga_nsearch.c##\n            search[nsearch].host = hostname;## 73 ##src/libgai/ga_nsearch.c##\n            search[nsearch].family = AF_INET;   /* then IPv4 */## 74 ##src/libgai/ga_nsearch.c##\n            nsearch++;## 75 ##src/libgai/ga_nsearch.c##\n            break;## 76 ##src/libgai/ga_nsearch.c##\n        }## 77 ##src/libgai/ga_nsearch.c##\n    }## 78 ##src/libgai/ga_nsearch.c##\n    if (nsearch < 1 || nsearch > 2)## 79 ##src/libgai/ga_nsearch.c##\n        err_quit(\"nsearch = %d\", nsearch);## 80 ##src/libgai/ga_nsearch.c##\n    return (nsearch);## 81 ##src/libgai/ga_nsearch.c##\n}## 82 ##src/libgai/ga_nsearch.c##\n/* end ga_nsearch3 */\n"
  },
  {
    "path": "libgai/ga_port.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * Go through all the addrinfo structures, checking for a match of the\n * socket type and filling in the socket type, and then the port number\n * in the corresponding socket address structures.\n *\n * The AI_CLONE flag works as follows.  Consider a multihomed host with\n * two IP addresses and no socket type specified by the caller.  After\n * the \"host\" search there are two addrinfo structures, one per IP address.\n * Assuming a service supported by both TCP and UDP (say the daytime\n * service) we need to return *four* addrinfo structures:\n *\t\tIP#1, SOCK_STREAM, TCP port,\n *\t\tIP#1, SOCK_DGRAM, UDP port,\n *\t\tIP#2, SOCK_STREAM, TCP port,\n *\t\tIP#2, SOCK_DGRAM, UDP port.\n * To do this, when the \"host\" loop creates an addrinfo structure, if the\n * caller has not specified a socket type (hintsp->ai_socktype == 0), the\n * AI_CLONE flag is set.  When the following function finds an entry like\n * this it is handled as follows: If the entry's ai_socktype is still 0,\n * this is the first use of the structure, and the ai_socktype field is set.\n * But, if the entry's ai_socktype is nonzero, then we clone a new addrinfo\n * structure and set it's ai_socktype to the new value.  Although we only\n * need two socket types today (SOCK_STREAM and SOCK_DGRAM) this algorithm\n * will handle any number.  Also notice that Posix.1g requires all socket\n * types to be nonzero.\n */\n\n/* include ga_port */\nint\nga_port(struct addrinfo *aihead, int port, int socktype)\n\t\t/* port must be in network byte order */\n{\n\tint\t\t\t\tnfound = 0;\n\tstruct addrinfo\t*ai;\n\n\tfor (ai = aihead; ai != NULL; ai = ai->ai_next) {\n\t\tif (ai->ai_flags & AI_CLONE) {\n\t\t\tif (ai->ai_socktype != 0) {\n\t\t\t\tif ( (ai = ga_clone(ai)) == NULL)\n\t\t\t\t\treturn(-1);\t\t/* memory allocation error */\n\t\t\t\t/* ai points to newly cloned entry, which is what we want */\n\t\t\t}\n\t\t} else if (ai->ai_socktype != socktype)\n\t\t\tcontinue;\t\t/* ignore if mismatch on socket type */\n\n\t\tai->ai_socktype = socktype;\n\n\t\tswitch (ai->ai_family) {\n#ifdef\tIPv4\n\t\t\tcase AF_INET:\n\t\t\t\t((struct sockaddr_in *) ai->ai_addr)->sin_port = port;\n\t\t\t\tnfound++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPv6\n\t\t\tcase AF_INET6:\n\t\t\t\t((struct sockaddr_in6 *) ai->ai_addr)->sin6_port = port;\n\t\t\t\tnfound++;\n\t\t\t\tbreak;\n#endif\n\t\t}\n\t}\n\treturn(nfound);\n}\n/* end ga_port */\n"
  },
  {
    "path": "libgai/ga_port.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_port.c##\n\n/*##  2 ##src/libgai/ga_port.c##\n * Go through all the addrinfo structures, checking for a match of the##  3 ##src/libgai/ga_port.c##\n * socket type and filling in the socket type, and then the port number##  4 ##src/libgai/ga_port.c##\n * in the corresponding socket address structures.##  5 ##src/libgai/ga_port.c##\n *##  6 ##src/libgai/ga_port.c##\n * The AI_CLONE flag works as follows.  Consider a multihomed host with##  7 ##src/libgai/ga_port.c##\n * two IP addresses and no socket type specified by the caller.  After##  8 ##src/libgai/ga_port.c##\n * the \"host\" search there are two addrinfo structures, one per IP address.##  9 ##src/libgai/ga_port.c##\n * Assuming a service supported by both TCP and UDP (say the daytime## 10 ##src/libgai/ga_port.c##\n * service) we need to return *four* addrinfo structures:## 11 ##src/libgai/ga_port.c##\n *      IP#1, SOCK_STREAM, TCP port,## 12 ##src/libgai/ga_port.c##\n *      IP#1, SOCK_DGRAM, UDP port,## 13 ##src/libgai/ga_port.c##\n *      IP#2, SOCK_STREAM, TCP port,## 14 ##src/libgai/ga_port.c##\n *      IP#2, SOCK_DGRAM, UDP port.## 15 ##src/libgai/ga_port.c##\n * To do this, when the \"host\" loop creates an addrinfo structure, if the## 16 ##src/libgai/ga_port.c##\n * caller has not specified a socket type (hintsp->ai_socktype == 0), the## 17 ##src/libgai/ga_port.c##\n * AI_CLONE flag is set.  When the following function finds an entry like## 18 ##src/libgai/ga_port.c##\n * this it is handled as follows: If the entry's ai_socktype is still 0,## 19 ##src/libgai/ga_port.c##\n * this is the first use of the structure, and the ai_socktype field is set.## 20 ##src/libgai/ga_port.c##\n * But, if the entry's ai_socktype is nonzero, then we clone a new addrinfo## 21 ##src/libgai/ga_port.c##\n * structure and set it's ai_socktype to the new value.  Although we only## 22 ##src/libgai/ga_port.c##\n * need two socket types today (SOCK_STREAM and SOCK_DGRAM) this algorithm## 23 ##src/libgai/ga_port.c##\n * will handle any number.  Also notice that Posix.1g requires all socket## 24 ##src/libgai/ga_port.c##\n * types to be nonzero.## 25 ##src/libgai/ga_port.c##\n */## 26 ##src/libgai/ga_port.c##\n\n/* include ga_port */\nint## 27 ##src/libgai/ga_port.c##\nga_port(struct addrinfo *aihead, int port, int socktype)## 28 ##src/libgai/ga_port.c##\n        /* port must be in network byte order */## 29 ##src/libgai/ga_port.c##\n{## 30 ##src/libgai/ga_port.c##\n    int     nfound = 0;## 31 ##src/libgai/ga_port.c##\n    struct addrinfo *ai;## 32 ##src/libgai/ga_port.c##\n\n    for (ai = aihead; ai != NULL; ai = ai->ai_next) {## 33 ##src/libgai/ga_port.c##\n        if (ai->ai_flags & AI_CLONE) {## 34 ##src/libgai/ga_port.c##\n            if (ai->ai_socktype != 0) {## 35 ##src/libgai/ga_port.c##\n                if ((ai = ga_clone(ai)) == NULL)## 36 ##src/libgai/ga_port.c##\n                    return (-1);    /* memory allocation error */## 37 ##src/libgai/ga_port.c##\n                /* ai points to newly cloned entry, which is what we want */## 38 ##src/libgai/ga_port.c##\n            }## 39 ##src/libgai/ga_port.c##\n        } else if (ai->ai_socktype != socktype)## 40 ##src/libgai/ga_port.c##\n            continue;           /* ignore if mismatch on socket type */## 41 ##src/libgai/ga_port.c##\n\n        ai->ai_socktype = socktype;## 42 ##src/libgai/ga_port.c##\n\n        switch (ai->ai_family) {## 43 ##src/libgai/ga_port.c##\n        case AF_INET:## 44 ##src/libgai/ga_port.c##\n            ((struct sockaddr_in *) ai->ai_addr)->sin_port = port;## 45 ##src/libgai/ga_port.c##\n            nfound++;## 46 ##src/libgai/ga_port.c##\n            break;## 47 ##src/libgai/ga_port.c##\n        case AF_INET6:## 48 ##src/libgai/ga_port.c##\n            ((struct sockaddr_in6 *) ai->ai_addr)->sin6_port = port;## 49 ##src/libgai/ga_port.c##\n            nfound++;## 50 ##src/libgai/ga_port.c##\n            break;## 51 ##src/libgai/ga_port.c##\n        }## 52 ##src/libgai/ga_port.c##\n    }## 53 ##src/libgai/ga_port.c##\n    return (nfound);## 54 ##src/libgai/ga_port.c##\n}## 55 ##src/libgai/ga_port.c##\n/* end ga_port */\n"
  },
  {
    "path": "libgai/ga_serv.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * This function handles the service string.\n */\n\n/* include ga_serv */\nint\nga_serv(struct addrinfo *aihead, const struct addrinfo *hintsp,\n\t\tconst char *serv)\n{\n\tint\t\t\t\tport, rc, nfound;\n\tstruct servent\t*sptr;\n\n\tnfound = 0;\n\tif (isdigit(serv[0])) {\t\t/* check for port number string first */\n\t\tport = htons(atoi(serv));\n\t\tif (hintsp->ai_socktype) {\n\t\t\t\t/* 4caller specifies socket type */\n\t\t\tif ( (rc = ga_port(aihead, port, hintsp->ai_socktype)) < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t} else {\n\t\t\t\t/* 4caller does not specify socket type */\n\t\t\tif ( (rc = ga_port(aihead, port, SOCK_STREAM)) < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t\tif ( (rc = ga_port(aihead, port, SOCK_DGRAM)) < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t}\n\t} else {\n\t\t\t/* 4try service name, TCP then UDP */\n\t\tif (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_STREAM) {\n\t\t\tif ( (sptr = getservbyname(serv, \"tcp\")) != NULL) {\n\t\t\t\tif ( (rc = ga_port(aihead, sptr->s_port, SOCK_STREAM)) < 0)\n\t\t\t\t\treturn(EAI_MEMORY);\n\t\t\t\tnfound += rc;\n\t\t\t}\n\t\t}\n\t\tif (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_DGRAM) {\n\t\t\tif ( (sptr = getservbyname(serv, \"udp\")) != NULL) {\n\t\t\t\tif ( (rc = ga_port(aihead, sptr->s_port, SOCK_DGRAM)) < 0)\n\t\t\t\t\treturn(EAI_MEMORY);\n\t\t\t\tnfound += rc;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (nfound == 0) {\n\t\tif (hintsp->ai_socktype == 0)\n\t\t\treturn(EAI_NONAME);\t/* all calls to getservbyname() failed */\n\t\telse\n\t\t\treturn(EAI_SERVICE);/* service not supported for socket type */\n\t}\n\treturn(0);\n}\n/* end ga_serv */\n"
  },
  {
    "path": "libgai/ga_serv.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_serv.c##\n\n/*##  2 ##src/libgai/ga_serv.c##\n * This function handles the service string.##  3 ##src/libgai/ga_serv.c##\n */##  4 ##src/libgai/ga_serv.c##\n\n/* include ga_serv */\nint##  5 ##src/libgai/ga_serv.c##\nga_serv(struct addrinfo *aihead, const struct addrinfo *hintsp,##  6 ##src/libgai/ga_serv.c##\n        const char *serv)##  7 ##src/libgai/ga_serv.c##\n{##  8 ##src/libgai/ga_serv.c##\n    int     port, rc, nfound;##  9 ##src/libgai/ga_serv.c##\n    struct servent *sptr;## 10 ##src/libgai/ga_serv.c##\n\n    nfound = 0;## 11 ##src/libgai/ga_serv.c##\n    if (isdigit(serv[0])) {     /* check for port number string first */## 12 ##src/libgai/ga_serv.c##\n        port = htons(atoi(serv));## 13 ##src/libgai/ga_serv.c##\n        if (hintsp->ai_socktype) {## 14 ##src/libgai/ga_serv.c##\n            /* 4caller specifies socket type */## 15 ##src/libgai/ga_serv.c##\n            if ((rc = ga_port(aihead, port, hintsp->ai_socktype)) < 0)## 16 ##src/libgai/ga_serv.c##\n                return (EAI_MEMORY);## 17 ##src/libgai/ga_serv.c##\n            nfound += rc;## 18 ##src/libgai/ga_serv.c##\n        } else {## 19 ##src/libgai/ga_serv.c##\n            /* 4caller does not specify socket type */## 20 ##src/libgai/ga_serv.c##\n            if ((rc = ga_port(aihead, port, SOCK_STREAM)) < 0)## 21 ##src/libgai/ga_serv.c##\n                return (EAI_MEMORY);## 22 ##src/libgai/ga_serv.c##\n            nfound += rc;## 23 ##src/libgai/ga_serv.c##\n            if ((rc = ga_port(aihead, port, SOCK_DGRAM)) < 0)## 24 ##src/libgai/ga_serv.c##\n                return (EAI_MEMORY);## 25 ##src/libgai/ga_serv.c##\n            nfound += rc;## 26 ##src/libgai/ga_serv.c##\n        }## 27 ##src/libgai/ga_serv.c##\n    } else {## 28 ##src/libgai/ga_serv.c##\n        /* 4try service name, TCP then UDP */## 29 ##src/libgai/ga_serv.c##\n        if (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_STREAM) {## 30 ##src/libgai/ga_serv.c##\n            if ((sptr = getservbyname(serv, \"tcp\")) != NULL) {## 31 ##src/libgai/ga_serv.c##\n                if ((rc = ga_port(aihead, sptr->s_port, SOCK_STREAM)) < 0)## 32 ##src/libgai/ga_serv.c##\n                    return (EAI_MEMORY);## 33 ##src/libgai/ga_serv.c##\n                nfound += rc;## 34 ##src/libgai/ga_serv.c##\n            }## 35 ##src/libgai/ga_serv.c##\n        }## 36 ##src/libgai/ga_serv.c##\n        if (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_DGRAM) {## 37 ##src/libgai/ga_serv.c##\n            if ((sptr = getservbyname(serv, \"udp\")) != NULL) {## 38 ##src/libgai/ga_serv.c##\n                if ((rc = ga_port(aihead, sptr->s_port, SOCK_DGRAM)) < 0)## 39 ##src/libgai/ga_serv.c##\n                    return (EAI_MEMORY);## 40 ##src/libgai/ga_serv.c##\n                nfound += rc;## 41 ##src/libgai/ga_serv.c##\n            }## 42 ##src/libgai/ga_serv.c##\n        }## 43 ##src/libgai/ga_serv.c##\n    }## 44 ##src/libgai/ga_serv.c##\n\n    if (nfound == 0) {## 45 ##src/libgai/ga_serv.c##\n        if (hintsp->ai_socktype == 0)## 46 ##src/libgai/ga_serv.c##\n            return (EAI_NONAME);    /* all calls to getservbyname() failed */## 47 ##src/libgai/ga_serv.c##\n        else## 48 ##src/libgai/ga_serv.c##\n            return (EAI_SERVICE);   /* service not supported for socket type */## 49 ##src/libgai/ga_serv.c##\n    }## 50 ##src/libgai/ga_serv.c##\n    return (0);## 51 ##src/libgai/ga_serv.c##\n}## 52 ##src/libgai/ga_serv.c##\n/* end ga_serv */\n"
  },
  {
    "path": "libgai/ga_unix.c",
    "content": "#include\t\"gai_hdr.h\"\n#include\t<sys/utsname.h>\n\n#ifdef\tUNIXdomain\n/* include ga_unix */\nint\nga_unix(const char *path, struct addrinfo *hintsp, struct addrinfo **result)\n{\n\tint\t\t\t\trc;\n\tstruct addrinfo\t*aihead, **aipnext;\n\n\taihead = NULL;\n\taipnext = &aihead;\n\n\tif (hintsp->ai_family != AF_UNSPEC && hintsp->ai_family != AF_LOCAL)\n\t\treturn(EAI_ADDRFAMILY);\n\n\tif (hintsp->ai_socktype == 0) {\n\t\t\t/* 4no socket type specified: return stream then dgram */\n\t\thintsp->ai_socktype = SOCK_STREAM;\n\t\tif ( (rc = ga_aistruct(&aipnext, hintsp, path, AF_LOCAL)) != 0)\n\t\t\treturn(rc);\n\t\thintsp->ai_socktype = SOCK_DGRAM;\n\t}\n\n\tif ( (rc = ga_aistruct(&aipnext, hintsp, path, AF_LOCAL)) != 0)\n\t\treturn(rc);\n\n\tif (hintsp->ai_flags & AI_CANONNAME) {\n\t\tstruct utsname\tmyname;\n\n\t\tif (uname(&myname) < 0)\n\t\t\treturn(EAI_SYSTEM);\n\t\tif ( (aihead->ai_canonname = strdup(myname.nodename)) == NULL)\n\t\t\treturn(EAI_MEMORY);\n\t}\n\n\t*result = aihead;\t/* pointer to first structure in linked list */\n\treturn(0);\n}\n/* end ga_unix */\n#endif\t/* UNIXdomain */\n"
  },
  {
    "path": "libgai/ga_unix.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/ga_unix.c##\n#include    <sys/utsname.h>##  2 ##src/libgai/ga_unix.c##\n\n/* include ga_unix */\nint##  3 ##src/libgai/ga_unix.c##\nga_unix(const char *path, struct addrinfo *hintsp, struct addrinfo **result)##  4 ##src/libgai/ga_unix.c##\n{##  5 ##src/libgai/ga_unix.c##\n    int     rc;##  6 ##src/libgai/ga_unix.c##\n    struct addrinfo *aihead, **aipnext;##  7 ##src/libgai/ga_unix.c##\n\n    aihead = NULL;##  8 ##src/libgai/ga_unix.c##\n    aipnext = &aihead;##  9 ##src/libgai/ga_unix.c##\n\n    if (hintsp->ai_family != AF_UNSPEC && hintsp->ai_family != AF_LOCAL)## 10 ##src/libgai/ga_unix.c##\n        return (EAI_ADDRFAMILY);## 11 ##src/libgai/ga_unix.c##\n\n    if (hintsp->ai_socktype == 0) {## 12 ##src/libgai/ga_unix.c##\n        /* 4no socket type specified: return stream then dgram */## 13 ##src/libgai/ga_unix.c##\n        hintsp->ai_socktype = SOCK_STREAM;## 14 ##src/libgai/ga_unix.c##\n        if ((rc = ga_aistruct(&aipnext, hintsp, path, AF_LOCAL)) != 0)## 15 ##src/libgai/ga_unix.c##\n            return (rc);## 16 ##src/libgai/ga_unix.c##\n        hintsp->ai_socktype = SOCK_DGRAM;## 17 ##src/libgai/ga_unix.c##\n    }## 18 ##src/libgai/ga_unix.c##\n\n    if ((rc = ga_aistruct(&aipnext, hintsp, path, AF_LOCAL)) != 0)## 19 ##src/libgai/ga_unix.c##\n        return (rc);## 20 ##src/libgai/ga_unix.c##\n\n    if (hintsp->ai_flags & AI_CANONNAME) {## 21 ##src/libgai/ga_unix.c##\n        struct utsname myname;## 22 ##src/libgai/ga_unix.c##\n\n        if (uname(&myname) < 0)## 23 ##src/libgai/ga_unix.c##\n            return (EAI_SYSTEM);## 24 ##src/libgai/ga_unix.c##\n        if ((aihead->ai_canonname = strdup(myname.nodename)) == NULL)## 25 ##src/libgai/ga_unix.c##\n            return (EAI_MEMORY);## 26 ##src/libgai/ga_unix.c##\n    }## 27 ##src/libgai/ga_unix.c##\n\n    *result = aihead;           /* pointer to first structure in linked list */## 28 ##src/libgai/ga_unix.c##\n    return (0);## 29 ##src/libgai/ga_unix.c##\n}## 30 ##src/libgai/ga_unix.c##\n/* end ga_unix */\n"
  },
  {
    "path": "libgai/gai_hdr.h",
    "content": "#include\t\"unp.h\"\n#include\t<ctype.h>\t\t/* isxdigit(), etc. */\n\n\t\t/* following internal flag cannot overlap with other AI_xxx flags */\n#define\tAI_CLONE\t     4\t/* clone this entry for other socket types */\n\nstruct search {\n  const char\t*host;\t/* hostname or address string */\n  int\t\t\tfamily;\t/* AF_xxx */\n};\n\n\t\t/* 4function prototypes for our own internal functions */\nint\t\tga_aistruct(struct addrinfo ***, const struct addrinfo *,\n\t\t\t\t\tconst void *, int);\nstruct addrinfo\t\t*ga_clone(struct addrinfo *);\nint\t\tga_echeck(const char *, const char *, int, int, int, int);\nint\t\tga_nsearch(const char *, const struct addrinfo *, struct search *);\nint\t\tga_port(struct addrinfo *, int , int);\nint\t\tga_serv(struct addrinfo *, const struct addrinfo *, const char *);\nint\t\tga_unix(const char *, struct addrinfo *, struct addrinfo **);\n\nint\t\tgn_ipv46(char *, size_t, char *, size_t, void *, size_t,\n\t\t\t\t int, int, int);\n"
  },
  {
    "path": "libgai/gai_hdr.lh",
    "content": "#include    \"unp.h\"##  1 ##src/libgai/gai_hdr.h##\n#include    <ctype.h>           /* isxdigit(), etc. */##  2 ##src/libgai/gai_hdr.h##\n\n        /* following internal flag cannot overlap with other AI_xxx flags */##  3 ##src/libgai/gai_hdr.h##\n#define AI_CLONE         4      /* clone this entry for other socket types */##  4 ##src/libgai/gai_hdr.h##\n\nstruct search {##  5 ##src/libgai/gai_hdr.h##\n    const char *host;           /* hostname or address string */##  6 ##src/libgai/gai_hdr.h##\n    int     family;             /* AF_xxx */##  7 ##src/libgai/gai_hdr.h##\n};##  8 ##src/libgai/gai_hdr.h##\n\n        /* 4function prototypes for our own internal functions */##  9 ##src/libgai/gai_hdr.h##\nint     ga_aistruct(struct addrinfo ***, const struct addrinfo *,## 10 ##src/libgai/gai_hdr.h##\n                    const void *, int);## 11 ##src/libgai/gai_hdr.h##\nstruct addrinfo *ga_clone(struct addrinfo *);## 12 ##src/libgai/gai_hdr.h##\nint     ga_echeck(const char *, const char *, int, int, int, int);## 13 ##src/libgai/gai_hdr.h##\nint     ga_nsearch(const char *, const struct addrinfo *, struct search *);## 14 ##src/libgai/gai_hdr.h##\nint     ga_port(struct addrinfo *, int, int);## 15 ##src/libgai/gai_hdr.h##\nint     ga_serv(struct addrinfo *, const struct addrinfo *, const char *);## 16 ##src/libgai/gai_hdr.h##\nint     ga_unix(const char *, struct addrinfo *, struct addrinfo **);## 17 ##src/libgai/gai_hdr.h##\n\nint     gn_ipv46(char *, size_t, char *, size_t, void *, size_t,## 18 ##src/libgai/gai_hdr.h##\n                 int, int, int);## 19 ##src/libgai/gai_hdr.h##\n"
  },
  {
    "path": "libgai/gai_strerror.c",
    "content": "/*\n * Return a string containing some additional information after an\n * error from getaddrinfo().\n */\n\n#include\t<sys/types.h>\n#include\t\"addrinfo.h\"\t/* XXX should be <netdb.h> */\n\nchar *\ngai_strerror(int err)\n{\n\tswitch (err) {\n\t\tcase EAI_ADDRFAMILY:return(\"address family for host not supported\");\n\t\tcase EAI_AGAIN:\t\treturn(\"temporary failure in name resolution\");\n\t\tcase EAI_BADFLAGS:\treturn(\"invalid flags value\");\n\t\tcase EAI_FAIL:\t\treturn(\"non-recoverable failure in name resolution\");\n\t\tcase EAI_FAMILY:\treturn(\"address family not supported\");\n\t\tcase EAI_MEMORY:\treturn(\"memory allocation failure\");\n\t\tcase EAI_NODATA:\treturn(\"no address associated with host\");\n\t\tcase EAI_NONAME:\treturn(\"host nor service provided, or not known\");\n\t\tcase EAI_SERVICE:\treturn(\"service not supported for socket type\");\n\t\tcase EAI_SOCKTYPE:\treturn(\"socket type not supported\");\n\t\tcase EAI_SYSTEM:\treturn(\"system error\");\n\t\tdefault:\t\t\treturn(\"unknown getaddrinfo() error\");\n\t}\n}\n"
  },
  {
    "path": "libgai/getaddrinfo.c",
    "content": "/* include ga1 */\n#include\t\"gai_hdr.h\"\n#include\t<arpa/nameser.h>\t/* needed for <resolv.h> */\n#include\t<resolv.h>\t\t\t/* res_init, _res */\n\nint\ngetaddrinfo(const char *hostname, const char *servname,\n\t\t\tconst struct addrinfo *hintsp, struct addrinfo **result)\n{\n\tint\t\t\t\t\trc, error, nsearch;\n\tchar\t\t\t\t**ap, *canon;\n\tstruct hostent\t\t*hptr;\n\tstruct search\t\tsearch[3], *sptr;\n\tstruct addrinfo\t\thints, *aihead, **aipnext;\n\n\t/*\n\t * If we encounter an error we want to free() any dynamic memory\n\t * that we've allocated.  This is our hack to simplify the code.\n\t */\n#define\terror(e) { error = (e); goto bad; }\n\n\taihead = NULL;\t\t/* initialize automatic variables */\n\taipnext = &aihead;\n\tcanon = NULL;\n\n\tif (hintsp == NULL) {\n\t\tbzero(&hints, sizeof(hints));\n\t\thints.ai_family = AF_UNSPEC;\n\t} else\n\t\thints = *hintsp;\t\t/* struct copy */\n\n\t\t/* 4first some basic error checking */\n\tif ( (rc = ga_echeck(hostname, servname, hints.ai_flags, hints.ai_family,\n\t\t\t\t\t\t hints.ai_socktype, hints.ai_protocol)) != 0)\n\t\terror(rc);\n\n#ifdef\tUNIXdomain\n\t\t/* 4special case Unix domain first */\n\tif (hostname != NULL &&\n\t\t(strcmp(hostname, \"/local\") == 0 || strcmp(hostname, \"/unix\") == 0) &&\n\t\t(servname != NULL && servname[0] == '/'))\n\t\treturn(ga_unix(servname, &hints, result));\n#endif\n/* end ga1 */\n\n/* include ga3 */\n\t\t/* 4remainder of function for IPv4/IPv6 */\n\tnsearch = ga_nsearch(hostname, &hints, &search[0]);\n\tfor (sptr = &search[0]; sptr < &search[nsearch]; sptr++) {\n#ifdef\tIPv4\n\t\t\t/* 4check for an IPv4 dotted-decimal string */\n\t\tif (isdigit(sptr->host[0])) {\n\t\t\tstruct in_addr\tinaddr;\n\n\t\t\tif (inet_pton(AF_INET, sptr->host, &inaddr) == 1) {\n\t\t\t\tif (hints.ai_family != AF_UNSPEC &&\n\t\t\t\t\thints.ai_family != AF_INET)\n\t\t\t\t\terror(EAI_ADDRFAMILY);\n\t\t\t\tif (sptr->family != AF_INET)\n\t\t\t\t\tcontinue;\t\t/* ignore */\n\t\t\t\trc = ga_aistruct(&aipnext, &hints, &inaddr, AF_INET);\n\t\t\t\tif (rc != 0)\n\t\t\t\t\terror(rc);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n#endif\n\t\n#ifdef\tIPv6\n\t\t\t/* 4check for an IPv6 hex string */\n\t\tif ((isxdigit(sptr->host[0]) || sptr->host[0] == ':') &&\n\t\t\t(strchr(sptr->host, ':') != NULL)) {\n\t\t\tstruct in6_addr\tin6addr;\n\n\t\t\tif (inet_pton(AF_INET6, sptr->host, &in6addr) == 1) {\n\t\t\t\tif (hints.ai_family != AF_UNSPEC &&\n\t\t\t\t\thints.ai_family != AF_INET6)\n\t\t\t\t\terror(EAI_ADDRFAMILY);\n\t\t\t\tif (sptr->family != AF_INET6)\n\t\t\t\t\tcontinue;\t\t/* ignore */\n\t\t\t\trc = ga_aistruct(&aipnext, &hints, &in6addr, AF_INET6);\n\t\t\t\tif (rc != 0)\n\t\t\t\t\terror(rc);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n#endif\n/* end ga3 */\n/* include ga4 */\n\t\t\t/* 4remainder of for() to look up hostname */\n\t\tif ((_res.options & RES_INIT) == 0)\n\t\t\tres_init();\t\t\t/* need this to set _res.options */\n\n\t\tif (nsearch == 2) {\n#ifdef\tIPv6\n\t\t\t_res.options &= ~RES_USE_INET6;\n#endif\n\t\t\thptr = gethostbyname2(sptr->host, sptr->family);\n\t\t} else {\n#ifdef  IPv6\n\t\t\tif (sptr->family == AF_INET6)\n\t\t\t\t_res.options |= RES_USE_INET6;\n\t\t\telse\n\t\t\t\t_res.options &= ~RES_USE_INET6;\n#endif\n\t\t\thptr = gethostbyname(sptr->host);\n\t\t}\n\t\tif (hptr == NULL) {\n\t\t\tif (nsearch == 2)\n\t\t\t\tcontinue;\t/* failure OK if multiple searches */\n\n\t\t\tswitch (h_errno) {\n\t\t\t\tcase HOST_NOT_FOUND:\terror(EAI_NONAME);\n\t\t\t\tcase TRY_AGAIN:\t\t\terror(EAI_AGAIN);\n\t\t\t\tcase NO_RECOVERY:\t\terror(EAI_FAIL);\n\t\t\t\tcase NO_DATA:\t\t\terror(EAI_NODATA);\n\t\t\t\tdefault:\t\t\t\terror(EAI_NONAME);\n\t\t\t}\n\t\t}\n\t\n\t\t\t/* 4check for address family mismatch if one specified */\n\t\tif (hints.ai_family != AF_UNSPEC && hints.ai_family != hptr->h_addrtype)\n\t\t\terror(EAI_ADDRFAMILY);\n\n\t\t\t/* 4save canonical name first time */\n\t\tif (hostname != NULL && hostname[0] != '\\0' &&\n\t\t\t(hints.ai_flags & AI_CANONNAME) && canon == NULL) {\n\t\t\tif ( (canon = strdup(hptr->h_name)) == NULL)\t\n\t\t\t\terror(EAI_MEMORY);\n\t\t}\n\t\n\t\t\t/* 4create one addrinfo{} for each returned address */\n\t\tfor (ap = hptr->h_addr_list; *ap != NULL; ap++) {\n\t\t\trc = ga_aistruct(&aipnext, &hints, *ap, hptr->h_addrtype);\n\t\t\tif (rc != 0)\n\t\t\t\terror(rc);\n\t\t}\n\t}\n\tif (aihead == NULL)\n\t\terror(EAI_NONAME);\t\t/* nothing found */\n/* end ga4 */\n\n/* include ga5 */\n\t\t/* 4return canonical name */\n\tif (hostname != NULL && hostname[0] != '\\0' &&\n\t\thints.ai_flags & AI_CANONNAME) {\n\t\tif (canon != NULL)\n\t\t\taihead->ai_canonname = canon;\t/* strdup'ed earlier */\n\t\telse {\n\t\t\tif ( (aihead->ai_canonname = strdup(search[0].host)) == NULL)\n\t\t\t\terror(EAI_MEMORY);\n\t\t}\n\t}\n\n\t\t/* 4now process the service name */\n\tif (servname != NULL && servname[0] != '\\0') {\n\t\tif ( (rc = ga_serv(aihead, &hints, servname)) != 0)\n\t\t\terror(rc);\n\t}\n\n\t*result = aihead;\t/* pointer to first structure in linked list */\n\treturn(0);\n\nbad:\n\tfreeaddrinfo(aihead);\t/* free any alloc'ed memory */\n\treturn(error);\n}\n/* end ga5 */\n"
  },
  {
    "path": "libgai/getaddrinfo.lc",
    "content": "/* include ga1 */\n#include    \"gai_hdr.h\"##  1 ##src/libgai/getaddrinfo.c##\n#include    <arpa/nameser.h>    /* needed for <resolv.h> */##  2 ##src/libgai/getaddrinfo.c##\n#include    <resolv.h>          /* res_init, _res */##  3 ##src/libgai/getaddrinfo.c##\n\nint##  4 ##src/libgai/getaddrinfo.c##\ngetaddrinfo(const char *hostname, const char *servname,##  5 ##src/libgai/getaddrinfo.c##\n            const struct addrinfo *hintsp, struct addrinfo **result)##  6 ##src/libgai/getaddrinfo.c##\n{##  7 ##src/libgai/getaddrinfo.c##\n    int     rc, error, nsearch;##  8 ##src/libgai/getaddrinfo.c##\n    char  **ap, *canon;##  9 ##src/libgai/getaddrinfo.c##\n    struct hostent *hptr;## 10 ##src/libgai/getaddrinfo.c##\n    struct search search[3], *sptr;## 11 ##src/libgai/getaddrinfo.c##\n    struct addrinfo hints, *aihead, **aipnext;## 12 ##src/libgai/getaddrinfo.c##\n\n    /* ## 13 ##src/libgai/getaddrinfo.c##\n     * If we encounter an error we want to free() any dynamic memory## 14 ##src/libgai/getaddrinfo.c##\n     * that we've allocated.  This is our hack to simplify the code.## 15 ##src/libgai/getaddrinfo.c##\n     */## 16 ##src/libgai/getaddrinfo.c##\n#define error(e) { error = (e); goto bad; }## 17 ##src/libgai/getaddrinfo.c##\n\n    aihead = NULL;              /* initialize automatic variables */## 18 ##src/libgai/getaddrinfo.c##\n    aipnext = &aihead;## 19 ##src/libgai/getaddrinfo.c##\n    canon = NULL;## 20 ##src/libgai/getaddrinfo.c##\n\n    if (hintsp == NULL) {## 21 ##src/libgai/getaddrinfo.c##\n        bzero(&hints, sizeof(hints));## 22 ##src/libgai/getaddrinfo.c##\n        hints.ai_family = AF_UNSPEC;## 23 ##src/libgai/getaddrinfo.c##\n    } else## 24 ##src/libgai/getaddrinfo.c##\n        hints = *hintsp;        /* struct copy */## 25 ##src/libgai/getaddrinfo.c##\n\n    /* 4first some basic error checking */## 26 ##src/libgai/getaddrinfo.c##\n    if ((rc = ga_echeck(hostname, servname, hints.ai_flags, hints.ai_family,## 27 ##src/libgai/getaddrinfo.c##\n                        hints.ai_socktype, hints.ai_protocol)) != 0)## 28 ##src/libgai/getaddrinfo.c##\n        error(rc);## 29 ##src/libgai/getaddrinfo.c##\n\n    /* 4special case Unix domain first */## 30 ##src/libgai/getaddrinfo.c##\n    if (hostname != NULL &&## 31 ##src/libgai/getaddrinfo.c##\n        (strcmp(hostname, \"/local\") == 0 || strcmp(hostname, \"/unix\") == 0)## 32 ##src/libgai/getaddrinfo.c##\n        && (servname != NULL && servname[0] == '/'))## 33 ##src/libgai/getaddrinfo.c##\n        return (ga_unix(servname, &hints, result));## 34 ##src/libgai/getaddrinfo.c##\n/* end ga1 */\n\n/* include ga3 */\n    /* 4remainder of function for IPv4/IPv6 */## 35 ##src/libgai/getaddrinfo.c##\n    nsearch = ga_nsearch(hostname, &hints, &search[0]);## 36 ##src/libgai/getaddrinfo.c##\n    for (sptr = &search[0]; sptr < &search[nsearch]; sptr++) {## 37 ##src/libgai/getaddrinfo.c##\n        /* 4check for an IPv4 dotted-decimal string */## 38 ##src/libgai/getaddrinfo.c##\n        if (isdigit(sptr->host[0])) {## 39 ##src/libgai/getaddrinfo.c##\n            struct in_addr inaddr;## 40 ##src/libgai/getaddrinfo.c##\n\n            if (inet_pton(AF_INET, sptr->host, &inaddr) == 1) {## 41 ##src/libgai/getaddrinfo.c##\n                if (hints.ai_family != AF_UNSPEC &&## 42 ##src/libgai/getaddrinfo.c##\n                    hints.ai_family != AF_INET)## 43 ##src/libgai/getaddrinfo.c##\n                    error(EAI_ADDRFAMILY);## 44 ##src/libgai/getaddrinfo.c##\n                if (sptr->family != AF_INET)## 45 ##src/libgai/getaddrinfo.c##\n                    continue;   /* ignore */## 46 ##src/libgai/getaddrinfo.c##\n                rc = ga_aistruct(&aipnext, &hints, &inaddr, AF_INET);## 47 ##src/libgai/getaddrinfo.c##\n                if (rc != 0)## 48 ##src/libgai/getaddrinfo.c##\n                    error(rc);## 49 ##src/libgai/getaddrinfo.c##\n                continue;## 50 ##src/libgai/getaddrinfo.c##\n            }## 51 ##src/libgai/getaddrinfo.c##\n        }## 52 ##src/libgai/getaddrinfo.c##\n\n        /* 4check for an IPv6 hex string */## 53 ##src/libgai/getaddrinfo.c##\n        if ((isxdigit(sptr->host[0]) || sptr->host[0] == ':') &&## 54 ##src/libgai/getaddrinfo.c##\n            (strchr(sptr->host, ':') != NULL)) {## 55 ##src/libgai/getaddrinfo.c##\n            struct in6_addr in6addr;## 56 ##src/libgai/getaddrinfo.c##\n\n            if (inet_pton(AF_INET6, sptr->host, &in6addr) == 1) {## 57 ##src/libgai/getaddrinfo.c##\n                if (hints.ai_family != AF_UNSPEC &&## 58 ##src/libgai/getaddrinfo.c##\n                    hints.ai_family != AF_INET6)## 59 ##src/libgai/getaddrinfo.c##\n                    error(EAI_ADDRFAMILY);## 60 ##src/libgai/getaddrinfo.c##\n                if (sptr->family != AF_INET6)## 61 ##src/libgai/getaddrinfo.c##\n                    continue;   /* ignore */## 62 ##src/libgai/getaddrinfo.c##\n                rc = ga_aistruct(&aipnext, &hints, &in6addr, AF_INET6);## 63 ##src/libgai/getaddrinfo.c##\n                if (rc != 0)## 64 ##src/libgai/getaddrinfo.c##\n                    error(rc);## 65 ##src/libgai/getaddrinfo.c##\n                continue;## 66 ##src/libgai/getaddrinfo.c##\n            }## 67 ##src/libgai/getaddrinfo.c##\n        }## 68 ##src/libgai/getaddrinfo.c##\n/* end ga3 */\n/* include ga4 */\n        /* 4remainder of for() to look up hostname */## 69 ##src/libgai/getaddrinfo.c##\n        if ((_res.options & RES_INIT) == 0)## 70 ##src/libgai/getaddrinfo.c##\n            res_init();         /* need this to set _res.options */## 71 ##src/libgai/getaddrinfo.c##\n\n        if (nsearch == 2) {## 72 ##src/libgai/getaddrinfo.c##\n            _res.options &= ~RES_USE_INET6;## 73 ##src/libgai/getaddrinfo.c##\n            hptr = gethostbyname2(sptr->host, sptr->family);## 74 ##src/libgai/getaddrinfo.c##\n        } else {## 75 ##src/libgai/getaddrinfo.c##\n            if (sptr->family == AF_INET6)## 76 ##src/libgai/getaddrinfo.c##\n                _res.options |= RES_USE_INET6;## 77 ##src/libgai/getaddrinfo.c##\n            else## 78 ##src/libgai/getaddrinfo.c##\n                _res.options &= ~RES_USE_INET6;## 79 ##src/libgai/getaddrinfo.c##\n            hptr = gethostbyname(sptr->host);## 80 ##src/libgai/getaddrinfo.c##\n        }## 81 ##src/libgai/getaddrinfo.c##\n        if (hptr == NULL) {## 82 ##src/libgai/getaddrinfo.c##\n            if (nsearch == 2)## 83 ##src/libgai/getaddrinfo.c##\n                continue;       /* failure OK if multiple searches */## 84 ##src/libgai/getaddrinfo.c##\n\n            switch (h_errno) {## 85 ##src/libgai/getaddrinfo.c##\n            case HOST_NOT_FOUND:## 86 ##src/libgai/getaddrinfo.c##\n                error(EAI_NONAME);## 87 ##src/libgai/getaddrinfo.c##\n            case TRY_AGAIN:## 88 ##src/libgai/getaddrinfo.c##\n                error(EAI_AGAIN);## 89 ##src/libgai/getaddrinfo.c##\n            case NO_RECOVERY:## 90 ##src/libgai/getaddrinfo.c##\n                error(EAI_FAIL);## 91 ##src/libgai/getaddrinfo.c##\n            case NO_DATA:## 92 ##src/libgai/getaddrinfo.c##\n                error(EAI_NODATA);## 93 ##src/libgai/getaddrinfo.c##\n            default:## 94 ##src/libgai/getaddrinfo.c##\n                error(EAI_NONAME);## 95 ##src/libgai/getaddrinfo.c##\n            }## 96 ##src/libgai/getaddrinfo.c##\n        }## 97 ##src/libgai/getaddrinfo.c##\n\n        /* 4check for address family mismatch if one specified */## 98 ##src/libgai/getaddrinfo.c##\n        if (hints.ai_family != AF_UNSPEC## 99 ##src/libgai/getaddrinfo.c##\n            && hints.ai_family != hptr->h_addrtype)##100 ##src/libgai/getaddrinfo.c##\n            error(EAI_ADDRFAMILY);##101 ##src/libgai/getaddrinfo.c##\n\n        /* 4save canonical name first time */##102 ##src/libgai/getaddrinfo.c##\n        if (hostname != NULL && hostname[0] != '\\0' &&##103 ##src/libgai/getaddrinfo.c##\n            (hints.ai_flags & AI_CANONNAME) && canon == NULL) {##104 ##src/libgai/getaddrinfo.c##\n            if ((canon = strdup(hptr->h_name)) == NULL)##105 ##src/libgai/getaddrinfo.c##\n                error(EAI_MEMORY);##106 ##src/libgai/getaddrinfo.c##\n        }##107 ##src/libgai/getaddrinfo.c##\n\n        /* 4create one addrinfo{} for each returned address */##108 ##src/libgai/getaddrinfo.c##\n        for (ap = hptr->h_addr_list; *ap != NULL; ap++) {##109 ##src/libgai/getaddrinfo.c##\n            rc = ga_aistruct(&aipnext, &hints, *ap, hptr->h_addrtype);##110 ##src/libgai/getaddrinfo.c##\n            if (rc != 0)##111 ##src/libgai/getaddrinfo.c##\n                error(rc);##112 ##src/libgai/getaddrinfo.c##\n        }##113 ##src/libgai/getaddrinfo.c##\n    }##114 ##src/libgai/getaddrinfo.c##\n    if (aihead == NULL)##115 ##src/libgai/getaddrinfo.c##\n        error(EAI_NONAME);      /* nothing found */##116 ##src/libgai/getaddrinfo.c##\n/* end ga4 */\n\n/* include ga5 */\n    /* 4return canonical name */##117 ##src/libgai/getaddrinfo.c##\n    if (hostname != NULL && hostname[0] != '\\0' &&##118 ##src/libgai/getaddrinfo.c##\n        hints.ai_flags & AI_CANONNAME) {##119 ##src/libgai/getaddrinfo.c##\n        if (canon != NULL)##120 ##src/libgai/getaddrinfo.c##\n            aihead->ai_canonname = canon;   /* strdup'ed earlier */##121 ##src/libgai/getaddrinfo.c##\n        else {##122 ##src/libgai/getaddrinfo.c##\n            if ((aihead->ai_canonname = strdup(search[0].host)) == NULL)##123 ##src/libgai/getaddrinfo.c##\n                error(EAI_MEMORY);##124 ##src/libgai/getaddrinfo.c##\n        }##125 ##src/libgai/getaddrinfo.c##\n    }##126 ##src/libgai/getaddrinfo.c##\n\n    /* 4now process the service name */##127 ##src/libgai/getaddrinfo.c##\n    if (servname != NULL && servname[0] != '\\0') {##128 ##src/libgai/getaddrinfo.c##\n        if ((rc = ga_serv(aihead, &hints, servname)) != 0)##129 ##src/libgai/getaddrinfo.c##\n            error(rc);##130 ##src/libgai/getaddrinfo.c##\n    }##131 ##src/libgai/getaddrinfo.c##\n\n    *result = aihead;           /* pointer to first structure in linked list */##132 ##src/libgai/getaddrinfo.c##\n    return (0);##133 ##src/libgai/getaddrinfo.c##\n\n  bad:##134 ##src/libgai/getaddrinfo.c##\n    freeaddrinfo(aihead);       /* free any alloc'ed memory */##135 ##src/libgai/getaddrinfo.c##\n    return (error);##136 ##src/libgai/getaddrinfo.c##\n}##137 ##src/libgai/getaddrinfo.c##\n/* end ga5 */\n"
  },
  {
    "path": "libgai/getnameinfo.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/* include getnameinfo */\nint\ngetnameinfo(const struct sockaddr *sa, socklen_t salen,\n\t\t    char *host, size_t hostlen,\n\t\t\tchar *serv, size_t servlen, int flags)\n{\n\n\tswitch (sa->sa_family) {\n#ifdef\tIPv4\n\tcase AF_INET: {\n\t\tstruct sockaddr_in\t*sain = (struct sockaddr_in *) sa;\n\n\t\treturn(gn_ipv46(host, hostlen, serv, servlen,\n\t\t\t\t\t\t&sain->sin_addr, sizeof(struct in_addr),\n\t\t\t\t\t\tAF_INET, sain->sin_port, flags));\n\t}\n#endif\n\n#ifdef\tIPv6\n\tcase AF_INET6: {\n\t\tstruct sockaddr_in6\t*sain = (struct sockaddr_in6 *) sa;\n\n\t\treturn(gn_ipv46(host, hostlen, serv, servlen,\n\t\t\t\t\t\t&sain->sin6_addr, sizeof(struct in6_addr),\n\t\t\t\t\t\tAF_INET6, sain->sin6_port, flags));\n\t}\n#endif\n\n#ifdef\tUNIXdomain\n\tcase AF_LOCAL: {\n\t\tstruct sockaddr_un\t*un = (struct sockaddr_un *) sa;\n\n\t\tif (hostlen > 0)\n\t\t\tsnprintf(host, hostlen, \"%s\", \"/local\");\n\t\tif (servlen > 0)\n\t\t\tsnprintf(serv, servlen, \"%s\", un->sun_path);\n\t\treturn(0);\n\t}\n#endif\n\n\tdefault:\n\t\treturn(1);\n\t}\n}\n/* end getnameinfo */\n"
  },
  {
    "path": "libgai/getnameinfo.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/getnameinfo.c##\n\n/* include getnameinfo */\nint##  2 ##src/libgai/getnameinfo.c##\ngetnameinfo(const struct sockaddr *sa, socklen_t salen,##  3 ##src/libgai/getnameinfo.c##\n            char *host, size_t hostlen,##  4 ##src/libgai/getnameinfo.c##\n            char *serv, size_t servlen, int flags)##  5 ##src/libgai/getnameinfo.c##\n{##  6 ##src/libgai/getnameinfo.c##\n\n    switch (sa->sa_family) {##  7 ##src/libgai/getnameinfo.c##\n    case AF_INET:{##  8 ##src/libgai/getnameinfo.c##\n            struct sockaddr_in *sain = (struct sockaddr_in *) sa;##  9 ##src/libgai/getnameinfo.c##\n\n            return (gn_ipv46(host, hostlen, serv, servlen,## 10 ##src/libgai/getnameinfo.c##\n                             &sain->sin_addr, sizeof(struct in_addr),## 11 ##src/libgai/getnameinfo.c##\n                             AF_INET, sain->sin_port, flags));## 12 ##src/libgai/getnameinfo.c##\n        }## 13 ##src/libgai/getnameinfo.c##\n\n    case AF_INET6:{## 14 ##src/libgai/getnameinfo.c##\n            struct sockaddr_in6 *sain = (struct sockaddr_in6 *) sa;## 15 ##src/libgai/getnameinfo.c##\n\n            return (gn_ipv46(host, hostlen, serv, servlen,## 16 ##src/libgai/getnameinfo.c##\n                             &sain->sin6_addr, sizeof(struct in6_addr),## 17 ##src/libgai/getnameinfo.c##\n                             AF_INET6, sain->sin6_port, flags));## 18 ##src/libgai/getnameinfo.c##\n        }## 19 ##src/libgai/getnameinfo.c##\n\n    case AF_LOCAL:{## 20 ##src/libgai/getnameinfo.c##\n            struct sockaddr_un *un = (struct sockaddr_un *) sa;## 21 ##src/libgai/getnameinfo.c##\n\n            if (hostlen > 0)## 22 ##src/libgai/getnameinfo.c##\n                snprintf(host, hostlen, \"%s\", \"/local\");## 23 ##src/libgai/getnameinfo.c##\n            if (servlen > 0)## 24 ##src/libgai/getnameinfo.c##\n                snprintf(serv, servlen, \"%s\", un->sun_path);## 25 ##src/libgai/getnameinfo.c##\n            return (0);## 26 ##src/libgai/getnameinfo.c##\n        }## 27 ##src/libgai/getnameinfo.c##\n\n    default:## 28 ##src/libgai/getnameinfo.c##\n        return (1);## 29 ##src/libgai/getnameinfo.c##\n    }## 30 ##src/libgai/getnameinfo.c##\n}## 31 ##src/libgai/getnameinfo.c##\n/* end getnameinfo */\n"
  },
  {
    "path": "libgai/gn_ipv46.c",
    "content": "#include\t\"gai_hdr.h\"\n\n/*\n * Handle either an IPv4 or an IPv6 address and port.\n */\n\n/* include gn_ipv46 */\nint\ngn_ipv46(char *host, size_t hostlen, char *serv, size_t servlen,\n\t\t void *aptr, size_t alen, int family, int port, int flags)\n{\n\tchar\t\t\t*ptr;\n\tstruct hostent\t*hptr;\n\tstruct servent\t*sptr;\n\n\tif (hostlen > 0) {\n\t\tif (flags & NI_NUMERICHOST) {\n\t\t\tif (inet_ntop(family, aptr, host, hostlen) == NULL)\n\t\t\t\treturn(1);\n\t\t} else {\n\t\t\thptr = gethostbyaddr(aptr, alen, family);\n\t\t\tif (hptr != NULL && hptr->h_name != NULL) {\n\t\t\t\tif (flags & NI_NOFQDN) {\n\t\t\t\t\tif ( (ptr = strchr(hptr->h_name, '.')) != NULL)\n\t\t\t\t\t\t*ptr = 0;\t/* overwrite first dot */\n\t\t\t\t}\n\t\t\t\tsnprintf(host, hostlen, \"%s\", hptr->h_name);\n\t\t\t} else {\n\t\t\t\tif (flags & NI_NAMEREQD)\n\t\t\t\t\treturn(1);\n\t\t\t\tif (inet_ntop(family, aptr, host, hostlen) == NULL)\n\t\t\t\t\treturn(1);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (servlen > 0) {\n\t\tif (flags & NI_NUMERICSERV) {\n\t\t\tsnprintf(serv, servlen, \"%d\", ntohs(port));\n\t\t} else {\n\t\t\tsptr = getservbyport(port, (flags & NI_DGRAM) ? \"udp\" : NULL);\n\t\t\tif (sptr != NULL && sptr->s_name != NULL)\n\t\t\t\tsnprintf(serv, servlen, \"%s\", sptr->s_name);\n\t\t\telse\n\t\t\t\tsnprintf(serv, servlen, \"%d\", ntohs(port));\n\t\t}\n\t}\n\treturn(0);\n}\n/* end gn_ipv46 */\n"
  },
  {
    "path": "libgai/gn_ipv46.lc",
    "content": "#include    \"gai_hdr.h\"##  1 ##src/libgai/gn_ipv46.c##\n\n/*##  2 ##src/libgai/gn_ipv46.c##\n * Handle either an IPv4 or an IPv6 address and port.##  3 ##src/libgai/gn_ipv46.c##\n */##  4 ##src/libgai/gn_ipv46.c##\n\n/* include gn_ipv46 */\nint##  5 ##src/libgai/gn_ipv46.c##\ngn_ipv46(char *host, size_t hostlen, char *serv, size_t servlen,##  6 ##src/libgai/gn_ipv46.c##\n         void *aptr, size_t alen, int family, int port, int flags)##  7 ##src/libgai/gn_ipv46.c##\n{##  8 ##src/libgai/gn_ipv46.c##\n    char   *ptr;##  9 ##src/libgai/gn_ipv46.c##\n    struct hostent *hptr;## 10 ##src/libgai/gn_ipv46.c##\n    struct servent *sptr;## 11 ##src/libgai/gn_ipv46.c##\n\n    if (hostlen > 0) {## 12 ##src/libgai/gn_ipv46.c##\n        if (flags & NI_NUMERICHOST) {## 13 ##src/libgai/gn_ipv46.c##\n            if (inet_ntop(family, aptr, host, hostlen) == NULL)## 14 ##src/libgai/gn_ipv46.c##\n                return (1);## 15 ##src/libgai/gn_ipv46.c##\n        } else {## 16 ##src/libgai/gn_ipv46.c##\n            hptr = gethostbyaddr(aptr, alen, family);## 17 ##src/libgai/gn_ipv46.c##\n            if (hptr != NULL && hptr->h_name != NULL) {## 18 ##src/libgai/gn_ipv46.c##\n                if (flags & NI_NOFQDN) {## 19 ##src/libgai/gn_ipv46.c##\n                    if ((ptr = strchr(hptr->h_name, '.')) != NULL)## 20 ##src/libgai/gn_ipv46.c##\n                        *ptr = 0;   /* overwrite first dot */## 21 ##src/libgai/gn_ipv46.c##\n                }## 22 ##src/libgai/gn_ipv46.c##\n                snprintf(host, hostlen, \"%s\", hptr->h_name);## 23 ##src/libgai/gn_ipv46.c##\n            } else {## 24 ##src/libgai/gn_ipv46.c##\n                if (flags & NI_NAMEREQD)## 25 ##src/libgai/gn_ipv46.c##\n                    return (1);## 26 ##src/libgai/gn_ipv46.c##\n                if (inet_ntop(family, aptr, host, hostlen) == NULL)## 27 ##src/libgai/gn_ipv46.c##\n                    return (1);## 28 ##src/libgai/gn_ipv46.c##\n            }## 29 ##src/libgai/gn_ipv46.c##\n        }## 30 ##src/libgai/gn_ipv46.c##\n    }## 31 ##src/libgai/gn_ipv46.c##\n\n    if (servlen > 0) {## 32 ##src/libgai/gn_ipv46.c##\n        if (flags & NI_NUMERICSERV) {## 33 ##src/libgai/gn_ipv46.c##\n            snprintf(serv, servlen, \"%d\", ntohs(port));## 34 ##src/libgai/gn_ipv46.c##\n        } else {## 35 ##src/libgai/gn_ipv46.c##\n            sptr = getservbyport(port, (flags & NI_DGRAM) ? \"udp\" : NULL);## 36 ##src/libgai/gn_ipv46.c##\n            if (sptr != NULL && sptr->s_name != NULL)## 37 ##src/libgai/gn_ipv46.c##\n                snprintf(serv, servlen, \"%s\", sptr->s_name);## 38 ##src/libgai/gn_ipv46.c##\n            else## 39 ##src/libgai/gn_ipv46.c##\n                snprintf(serv, servlen, \"%d\", ntohs(port));## 40 ##src/libgai/gn_ipv46.c##\n        }## 41 ##src/libgai/gn_ipv46.c##\n    }## 42 ##src/libgai/gn_ipv46.c##\n    return (0);## 43 ##src/libgai/gn_ipv46.c##\n}## 44 ##src/libgai/gn_ipv46.c##\n/* end gn_ipv46 */\n"
  },
  {
    "path": "libgai/old/ga_unixstruct.c",
    "content": "#include\t\"gai_hdr.h\"\n\n#ifdef\tUNIXDOMAIN\nint\nga_unixstruct(const char *path, struct addrinfo *hintsp,\n\t\t\t  struct addrinfo **result, int socktype)\n{\n\tstruct addrinfo\t\t*ai;\n\tstruct sockaddr_un\t*unp;\n\n\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(EAI_MEMORY);\n\n\tai->ai_flags = 0;\n\tai->ai_family = AF_LOCAL;\n\tai->ai_socktype = socktype;\n\tai->ai_protocol = 0;\n\n\t\t/* allocate and fill in a socket address structure */\n\tai->ai_addrlen = sizeof(struct sockaddr_un);\n\tif ( (ai->ai_addr = malloc(ai->ai_addrlen)) == NULL)\n\t\treturn(EAI_MEMORY);\n\tunp = (struct sockaddr_un *) ai->ai_addr;\n\tunp->sun_family = AF_UNIX;\n\tstrncpy(unp->sun_path, path, sizeof(unp->sun_path));\n\n\tai->ai_canonname = NULL;\n\tai->ai_next = NULL;\n\t*result = ai;\n\n\tif (hintsp->ai_flags & AI_PASSIVE)\n\t\tunlink(path);\t\t/* OK if this fails */\n\n\treturn(0);\t\t/* success */\n}\n#endif\t/* UNIXDOMAIN */\n"
  },
  {
    "path": "libgai/old/savecopy.c",
    "content": "#include\t\"unp.h\"\n#include\t<ctype.h>\t\t/* isxdigit(), etc. */\n#include\t<arpa/nameser.h>\n#include\t<resolv.h>\t\t/* res_init, _res */\n\n\t\t/* following internal flag cannot overlap with other AI_xxx flags */\n#define\tAI_CLONE\t     4\t/* clone this entry for other socket types */\n\nstruct search {\n  const char\t*host;\t/* hostname of address string */\n  int\t\t\tfamily;\t/* AF_xxx */\n};\n\n\t\t/* function prototypes for our own internal functions */\nstatic int\tga_echeck(const char *, const char *, const struct addrinfo *);\nstatic int\tga_nsearch(const char *, const struct addrinfo *,\n\t\t\t\t\t   struct search *);\nstatic int\tga_aistruct(struct addrinfo ***, const struct addrinfo *,\n\t\t\t\t\t\tvoid *, int);\nstatic int\tga_serv(struct addrinfo *, const struct addrinfo *, const char *);\nstatic int\tga_port(struct addrinfo *, int , int);\nstatic int\tga_unix(const char *, struct addrinfo *, struct addrinfo **);\nstatic struct addrinfo\t*ga_clone(struct addrinfo *);\n\n\t\t/* globals for all functions in this file; these *must* be\n\t\t   read-only if this function is to be reentrant */\nstatic struct addrinfo\thints_default;\n\nint\ngetaddrinfo(const char *hostname, const char *servname,\n\t\t\tconst struct addrinfo *hintsp, struct addrinfo **result)\n{\n\tint\t\t\t\t\trc, error, nsearch;\n\tchar\t\t\t\t**ap;\n\tstruct hostent\t\t*hptr;\n\tstruct search\t\tsearch[3], *sptr;\n\tstruct addrinfo\t\thints, *ai, *aihead, **aipnext;\n\n\t/*\n\t * If we encounter an error we want to free() any dynamic memory\n\t * that we've allocated.  This is our hack to simplify the code.\n\t */\n#define\terror(e) { error = (e); goto bad; }\n\n\tif (hintsp == NULL) {\n\t\thints = hints_default;\t/* struct copy */\n\t\thints.ai_family = AF_UNSPEC;\n\t} else\n\t\thints = *hintsp;\t\t/* struct copy */\n\n\t\t/* 4first some basic error checking */\n\tif ( (rc = ga_echeck(hostname, servname, &hints)) != 0)\n\t\terror(rc);\n\n#ifdef\tUNIXDOMAIN\n\t/*\n\t * Special case Unix domain first;\n\t * remainder of function for IPv4/IPv6.\n\t */\n\tif (hostname != NULL && hostname[0] == '/' &&\n\t    (servname == NULL || servname[0] == '\\0'))\n\t\treturn(ga_unix(hostname, &hints, result));\n\n\tif (servname != NULL && servname[0] == '/' &&\n\t    (hostname == NULL || hostname[0] == '\\0'))\n\t\treturn(ga_unix(servname, &hints, result));\n#endif\n\n\tnsearch = ga_nsearch(hostname, &hints, &search[0]);\n\n\taihead = NULL;\n\taipnext = &aihead;\n\tfor (sptr = &search[0]; sptr < &search[nsearch]; sptr++) {\n#ifdef\tIPV4\n\t\t\t/* 4check for an IPv4 dotted-decimal string */\n\t\tif (isdigit(sptr->host[0])) {\n\t\t\tstruct in_addr\tinaddr;\n\n\t\t\tif (inet_pton(AF_INET, sptr->host, &inaddr) == 1) {\n\t\t\t\trc = ga_aistruct(&aipnext, &hints, &inaddr, AF_INET);\n\t\t\t\tif (rc != 0)\n\t\t\t\t\terror(rc);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n#endif\n\t\n#ifdef\tIPV6\n\t\t\t/* 4check for an IPv6 hex string */\n\t\tif (isxdigit(sptr->host[0]) || sptr->host[0] == ':') {\n\t\t\tstruct in6_addr\tin6addr;\n\n\t\t\tif (inet_pton(AF_INET6, sptr->host, &in6addr) == 1) {\n\t\t\t\trc = ga_aistruct(&aipnext, &hints, &in6addr, AF_INET6);\n\t\t\t\tif (rc != 0)\n\t\t\t\t\terror(rc);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n#endif\n\t\t\t/* 4look up hostname */\n\t\tif ((_res.options & RES_INIT) == 0)\n\t\t\tres_init();\t\t\t/* need this to set _res.options */\n\n\t\tif (nsearch == 2)\n\t\t\thptr = gethostbyname2(sptr->host, sptr->family);\n\t\telse {\n#ifdef\tIPV6\n\t\t\tif (sptr->family == AF_INET6)\n\t\t\t\t_res.options |= RES_USE_INET6;\n\t\t\telse\n\t\t\t\t_res.options &= ~RES_USE_INET6;\n#endif\n\t\t\thptr = gethostbyname(sptr->host);\n\t\t}\n\t\tif (hptr == NULL) {\n\t\t\tswitch (h_errno) {\n\t\t\t\tcase HOST_NOT_FOUND:\terror(EAI_NONAME);\n\t\t\t\tcase TRY_AGAIN:\t\t\terror(EAI_AGAIN);\n\t\t\t\tcase NO_RECOVERY:\t\terror(EAI_FAIL);\n\t\t\t\tcase NO_DATA:\t\t\terror(EAI_NODATA);\n\t\t\t\tdefault:\t\t\t\terror(EAI_NONAME);\n\t\t\t}\n\t\t}\n\t\n\t\t\t/* 4check for address family mismatch if one specified */\n\t\tif (hints.ai_family != AF_UNSPEC && hints.ai_family != hptr->h_addrtype)\n\t\t\terror(EAI_ADDRFAMILY);\n\t\n\t\t\t/* 4create one addrinfo{} for each returned address */\n\t\tfor (ap = hptr->h_addr_list; *ap != NULL; ap++) {\n\t\t\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\t\t\terror(EAI_MEMORY);\n\t\t\t*aipnext = ai;\n\t\t\taipnext = &ai->ai_next;\n\t\t\trc = ga_aistruct(&aipnext, &hints, *ap, hptr->h_addrtype);\n\t\t\tif (rc != 0)\n\t\t\t\terror(rc);\n\t\t}\n\t}\n\t/* \"aihead\" points to the first structure in the linked list */\n\n\tif (hostname != NULL && hostname[0] != '\\0' &&\n\t\thints.ai_flags & AI_CANONNAME) {\n\t\taihead->ai_canonname = strdup(hptr->h_name != NULL ?\n\t\t\t\t\t\t\t\t\t  hptr->h_name : search[0].host);\n\t\tif (aihead->ai_canonname == NULL)\n\t\t\terror(EAI_MEMORY);\n\t}\n\n\t\t/* 4now process the service name */\n\tif (servname != NULL && servname[0] != '\\0') {\n\t\tif ( (rc = ga_serv(aihead, &hints, servname)) != 0)\n\t\t\terror(rc);\n\t}\n\n\t*result = aihead;\t/* pointer to first structure in linked list */\n\treturn(0);\n\nbad:\n\tfreeaddrinfo(aihead);\t/* free any alloc'ed memory */\n\treturn(error);\n}\n\n/*\n * Basic error checking at the beginning.\n */\n\nstatic int\nga_echeck(const char *hostname, const char *servname,\n\t\t  const struct addrinfo *hintsp)\n{\n\tif (hintsp->ai_flags & ~(AI_PASSIVE | AI_CANONNAME))\n\t\treturn(EAI_BADFLAGS);\t/* unknown flag bits */\n\n\tif (hostname == NULL || hostname[0] == '\\0') {\n\t\tif (servname == NULL || servname[0] == '\\0')\n\t\t\treturn(EAI_NONAME);\t/* host or service must be specified */\n\t}\n\n\tswitch(hintsp->ai_family) {\n\t\tcase AF_UNSPEC:\n\t\t\tbreak;\n#ifdef\tIPV4\n\t\tcase AF_INET:\n\t\t\tif (hintsp->ai_socktype != 0 &&\n\t\t\t\t(hintsp->ai_socktype != SOCK_STREAM &&\n\t\t\t\t hintsp->ai_socktype != SOCK_DGRAM &&\n\t\t\t\t hintsp->ai_socktype != SOCK_RAW))\n\t\t\t\treturn(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\tcase AF_INET6:\n\t\t\tif (hintsp->ai_socktype != 0 &&\n\t\t\t\t(hintsp->ai_socktype != SOCK_STREAM &&\n\t\t\t\t hintsp->ai_socktype != SOCK_DGRAM &&\n\t\t\t\t hintsp->ai_socktype != SOCK_RAW))\n\t\t\t\treturn(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\tbreak;\n#endif\n#ifdef\tUNIXDOMAIN\n\t\tcase AF_LOCAL:\n\t\t\tif (hintsp->ai_socktype != 0 &&\n\t\t\t\t(hintsp->ai_socktype != SOCK_STREAM &&\n\t\t\t\t hintsp->ai_socktype != SOCK_DGRAM))\n\t\t\t\treturn(EAI_SOCKTYPE);\t/* invalid socket type */\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\treturn(EAI_FAMILY);\t\t/* unknown protocol family */\n\t}\n\treturn(0);\n}\n\n/*\n * Set up the search[] array with the hostnames and address families\n * that we are to look up.\n */\n\nstatic int\nga_nsearch(const char *hostname, const struct addrinfo *hintsp,\n\t\t   struct search *search)\n{\n\tint\t\tnsearch = 0;\n\n\tif (hostname == NULL || hostname[0] == '\\0') {\n\t\tif (hintsp->ai_flags & AI_PASSIVE) {\n\t\t\t\t/* 4no hostname and AI_PASSIVE: implies wildcard bind */\n\t\t\tswitch (hintsp->ai_family) {\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\n\t\t\t\tsearch[nsearch].host = \"0.0.0.0\";\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\n\t\t\t\tsearch[nsearch].host = \"0::0\";\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n\t\t\tcase AF_UNSPEC:\n#ifdef\tIPV6\n\t\t\t\tsearch[nsearch].host = \"0::0\";\t/* IPv6 first, then IPv4 */\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n#endif\n#ifdef\tIPV4\n\t\t\t\tsearch[nsearch].host = \"0.0.0.0\";\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\t\t/* 4no host and not AI_PASSIVE: connect to local host */\n\t\t\tswitch (hintsp->ai_family) {\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\n\t\t\t\tsearch[nsearch].host = \"localhost\";\t/* 127.0.0.1 */\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\n\t\t\t\tsearch[nsearch].host = \"0::1\";\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n\t\t\t\tbreak;\n#endif\n\t\t\tcase AF_UNSPEC:\n#ifdef\tIPV6\n\t\t\t\tsearch[nsearch].host = \"0::1\";\t/* IPv6 first, then IPv4 */\n\t\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\t\tnsearch++;\n#endif\n#ifdef\tIPV4\n\t\t\t\tsearch[nsearch].host = \"localhost\";\n\t\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\t\tnsearch++;\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\t/* host is specified */\n\t\tswitch (hintsp->ai_family) {\n#ifdef\tIPV4\n\t\tcase AF_INET:\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET;\n\t\t\tnsearch++;\n\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\tcase AF_INET6:\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET6;\n\t\t\tnsearch++;\n\t\t\tbreak;\n#endif\n\t\tcase AF_UNSPEC:\n#ifdef\tIPV6\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET6;\t/* IPv6 first */\n\t\t\tnsearch++;\n#endif\n#ifdef\tIPV4\n\t\t\tsearch[nsearch].host = hostname;\n\t\t\tsearch[nsearch].family = AF_INET;\t/* then IPv4 */\n\t\t\tnsearch++;\n#endif\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (nsearch < 1 || nsearch > 2)\n\t\terr_quit(\"nsearch = %d\", nsearch);\n\treturn(nsearch);\n}\n\n/*\n * Create and fill in a addrinfo{}.\n */\n\nstatic int\nga_aistruct(struct addrinfo ***paipnext, const struct addrinfo *hintsp,\n\t\t\tvoid *addr, int family)\n{\n\tstruct addrinfo\t*ai;\n\n\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(EAI_MEMORY);\n\tai->ai_next = NULL;\n\tai->ai_canonname = NULL;\n\t**paipnext = ai;\n\t*paipnext = &ai->ai_next;\n\n\tif ( (ai->ai_socktype = hintsp->ai_socktype) == 0)\n\t\tai->ai_flags |= AI_CLONE;\n\n\tai->ai_protocol = hintsp->ai_protocol;\n\t\n\tswitch ((ai->ai_family = family)) {\n#ifdef\tIPV4\n\t\tcase AF_INET: {\n\t\t\tstruct sockaddr_in\t*sinptr;\n\n\t\t\t\t/* 4allocate sockaddr_in{} and fill in all but port */\n\t\t\tif ( (sinptr = calloc(1, sizeof(struct sockaddr_in))) == NULL)\n\t\t\t\treturn(EAI_MEMORY);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\tsinptr->sin_len = sizeof(struct sockaddr_in);\n#endif\n\t\t\tsinptr->sin_family = AF_INET;\n\t\t\tmemcpy(&sinptr->sin_addr, addr, sizeof(struct in_addr));\n\t\t\tai->ai_addr = (struct sockaddr *) sinptr;\n\t\t\tai->ai_addrlen = sizeof(struct sockaddr_in);\n\t\t\tbreak;\n\t\t}\n#endif\t/* IPV4 */\n\t\n#ifdef\tIPV6\n\t\t\t\t/* 4allocate sockaddr_in6{} and fill in all but port */\n\t\tcase AF_INET6: {\n\t\t\tstruct sockaddr_in6\t*sin6ptr;\n\n\t\t\tif ( (sin6ptr = calloc(1, sizeof(struct sockaddr_in6))) == NULL)\n\t\t\t\treturn(EAI_MEMORY);\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\t\t\tsin6ptr->sin6_len = sizeof(struct sockaddr_in6);\n#endif\n\t\t\tsin6ptr->sin6_family = AF_INET6;\n\t\t\tmemcpy(&sin6ptr->sin6_addr, addr, sizeof(struct in6_addr));\n\t\t\tai->ai_addr = (struct sockaddr *) sin6ptr;\n\t\t\tai->ai_addrlen = sizeof(struct sockaddr_in6);\n\t\t\tbreak;\n\t\t}\n#endif\t/* IPV6 */\n\t}\n\treturn(0);\n}\n\n/*\n * This function handles the service string.\n */\n\nstatic int\nga_serv(struct addrinfo *aihead, const struct addrinfo *hintsp,\n\t\tconst char *serv)\n{\n\tint\t\t\t\tport, rc, nfound;\n\tstruct servent\t*sptr;\n\n\t\t/* 4check for port number first */\n\tif (isdigit(serv[0]) && hintsp->ai_socktype != 0) {\n\t\tport = htons(atoi(serv));\n\t\tif ( (rc = ga_port(aihead, port, hintsp->ai_socktype)) == 0)\n\t\t\treturn(EAI_NONAME);\n\t\telse if (rc < 0)\n\t\t\treturn(EAI_MEMORY);\n\t\telse\n\t\t\treturn(0);\n\t}\n\n\t\t/* 4try TCP first */\n\tnfound = 0;\n\tif (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_STREAM) {\n\t\tif ( (sptr = getservbyname(serv, \"tcp\")) != NULL) {\n\t\t\tif ( (rc = ga_port(aihead, sptr->s_port, SOCK_STREAM)) < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t}\n\t}\n\n\t\t/* 4try UDP */\n\tif (hintsp->ai_socktype == 0 || hintsp->ai_socktype == SOCK_DGRAM) {\n\t\tif ( (sptr = getservbyname(serv, \"udp\")) != NULL) {\n\t\t\tif ( (rc = ga_port(aihead, sptr->s_port, SOCK_DGRAM)) < 0)\n\t\t\t\treturn(EAI_MEMORY);\n\t\t\tnfound += rc;\n\t\t}\n\t}\n\n\tif (nfound == 0) {\n\t\tif (hintsp->ai_socktype == 0)\n\t\t\treturn(EAI_NONAME);\t/* all calls to getservbyname() failed */\n\t\telse\n\t\t\treturn(EAI_SERVICE);/* service not supported for socket type */\n\t}\n\treturn(0);\n}\n\n/*\n * Go through all the addrinfo structures, checking for a match of the\n * socket type and filling in the socket type, and then the port number\n * in the corresponding socket address structures.\n *\n * The AI_CLONE flag works as follows.  Consider a multihomed host with\n * two IP addresses and no socket type specified by the caller.  After\n * the \"host\" search there are two addrinfo structures, one per IP address.\n * Assuming a service supported by both TCP and UDP (say the daytime\n * service) we need to return *four* addrinfo structures:\n *\t\tIP#1, SOCK_STREAM, TCP port,\n *\t\tIP#1, SOCK_DGRAM, UDP port,\n *\t\tIP#2, SOCK_STREAM, TCP port,\n *\t\tIP#2, SOCK_DGRAM, UDP port.\n * To do this, when the \"host\" loop creates an addrinfo structure, if the\n * caller has not specified a socket type (hintsp->ai_socktype == 0), the\n * AI_CLONE flag is set.  When the following function finds an entry like\n * this it is handled as follows: If the entry's ai_socktype is still 0,\n * this is the first use of the structure, and the ai_socktype field is set.\n * But, if the entry's ai_socktype is nonzero, then we clone a new addrinfo\n * structure and set it's ai_socktype to the new value.  Although we only\n * need two socket types today (SOCK_STREAM and SOCK_DGRAM) this algorithm\n * will handle any number.  Also notice that Posix.1g requires all socket\n * types to be nonzero.\n */\n\nstatic int\nga_port(struct addrinfo *aihead, int port, int socktype)\n\t\t/* port must be in network byte order */\n{\n\tint\t\t\t\tnfound = 0;\n\tstruct addrinfo\t*ai;\n\n\tfor (ai = aihead; ai != NULL; ai = ai->ai_next) {\n\t\tif (ai->ai_flags & AI_CLONE) {\n\t\t\tif (ai->ai_socktype != 0) {\n\t\t\t\tif ( (ai = ga_clone(ai)) == NULL)\n\t\t\t\t\treturn(-1);\t\t/* memory allocation error */\n\t\t\t\t/* ai points to newly cloned entry, which is what we want */\n\t\t\t}\n\t\t} else if (ai->ai_socktype != socktype)\n\t\t\tcontinue;\t\t/* ignore if mismatch on socket type */\n\n\t\tai->ai_socktype = socktype;\n\n\t\tswitch (ai->ai_family) {\n#ifdef\tIPV4\n\t\t\tcase AF_INET:\n\t\t\t\t((struct sockaddr_in *) ai->ai_addr)->sin_port = port;\n\t\t\t\tnfound++;\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPV6\n\t\t\tcase AF_INET6:\n\t\t\t\t((struct sockaddr_in6 *) ai->ai_addr)->sin6_port = port;\n\t\t\t\tnfound++;\n\t\t\t\tbreak;\n#endif\n\t\t}\n\t}\n\treturn(nfound);\n}\n\n/*\n * Clone a new addrinfo structure from an existing one.\n */\n\nstatic struct addrinfo *\nga_clone(struct addrinfo *ai)\n{\n\tstruct addrinfo\t*new;\n\n\tif ( (new = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(NULL);\n\n\tnew->ai_next = ai->ai_next;\n\tai->ai_next = new;\n\n\tnew->ai_flags = 0;\t\t\t\t/* make sure AI_CLONE is off */\n\tnew->ai_family = ai->ai_family;\n\tnew->ai_socktype = ai->ai_socktype;\n\tnew->ai_protocol = ai->ai_protocol;\n\tnew->ai_canonname = NULL;\n\tnew->ai_addrlen = ai->ai_addrlen;\n\tif ( (new->ai_addr = malloc(ai->ai_addrlen)) == NULL)\n\t\treturn(NULL);\n\tmemcpy(new->ai_addr, ai->ai_addr, ai->ai_addrlen);\n\n\treturn(new);\n}\n\n#ifdef\tUNIXDOMAIN\n/*\n * Do everything for a Unix domain socket.\n * Only one addrinfo{} is returned.\n */\n\nstatic int\nga_unix(const char *path, struct addrinfo *hintsp, struct addrinfo **result)\n{\n\tstruct addrinfo\t\t*ai;\n\tstruct sockaddr_un\t*unp;\n\n\tif (hintsp->ai_socktype == 0)\n\t\treturn(EAI_SOCKTYPE);\t/* we cannot tell socket type from service */\n\n\tif ( (ai = calloc(1, sizeof(struct addrinfo))) == NULL)\n\t\treturn(NULL);\n\n\tai->ai_flags = 0;\n\tai->ai_family = AF_LOCAL;\n\tai->ai_socktype = hintsp->ai_socktype;\n\tai->ai_protocol = 0;\n\n\t\t/* allocate and fill in a socket address structure */\n\tai->ai_addrlen = sizeof(struct sockaddr_un);\n\tif ( (ai->ai_addr = malloc(ai->ai_addrlen)) == NULL)\n\t\treturn(EAI_MEMORY);\n\tunp = (struct sockaddr_un *) ai->ai_addr;\n\tunp->sun_family = AF_UNIX;\n\tstrncpy(unp->sun_path, path, sizeof(unp->sun_path));\n\n\tai->ai_canonname = NULL;\t/* maybe return the i-node number :-) */\n\tai->ai_next = NULL;\n\t*result = ai;\n\n\tif (hintsp->ai_flags & AI_PASSIVE)\n\t\tunlink(path);\t\t/* OK if this fails */\n\n\treturn(0);\t\t/* success */\n}\n#endif\t/* UNIXDOMAIN */\n\nvoid\nfreeaddrinfo(struct addrinfo *aihead)\n{\n\tstruct addrinfo\t*ai, *ainext;\n\n\tfor (ai = aihead; ai != NULL; ai = ainext) {\n\t\tif (ai->ai_addr != NULL)\n\t\t\tfree(ai->ai_addr);\t\t/* the socket address structure */\n\t\tif (ai->ai_canonname != NULL)\n\t\t\tfree(ai->ai_canonname);\t/* the canonical name */\n\t\tainext = ai->ai_next;\t\t/* can't fetch ai_next after free() */\n\t\tfree(ai);\t\t\t\t\t/* the addrinfo{} itself */\n\t}\n}\n"
  },
  {
    "path": "libgai/test1.c",
    "content": "#include\t\"unp.h\"\n\n/*\n * See that gethostbyname2() with an address string as the first argument\n * is broken in BIND-8.1-REL.\n * gethostbyname2(\"127.0.0.1\", AF_INET6) -> OK!\n */\n\nint\nmain(int argc, char **argv)\n{\n\tstruct hostent\t*hptr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: test2 <IPaddress>\");\n\n\tprintf(\"gethostbyname2(%s, AF_INET): \", argv[1]);\n\thptr = gethostbyname2(argv[1], AF_INET);\n\tprintf(\"%s\\n\", (hptr == NULL) ? \"failed\" : \"OK\");\n\n#ifdef\tIPv6\n\tprintf(\"gethostbyname2(%s, AF_INET6): \", argv[1]);\n\thptr = gethostbyname2(argv[1], AF_INET6);\n\tprintf(\"%s\\n\", (hptr == NULL) ? \"failed\" : \"OK\");\n#endif\n\n\texit(0);\n}\n"
  },
  {
    "path": "libgai/testga.c",
    "content": "#include\t\"unp.h\"\n\n/*\n * Test program for getaddrinfo() and getnameinfo().\n */\n\n\t\t\t/* function prototypes for internal functions */\nstatic void\tdo_errtest(void);\nstatic void\tdo_funccall(const char *, const char *, int, int, int, int, int);\nstatic int\tdo_onetest(char *, char *, struct addrinfo *, int);\nstatic const char *str_fam(int);\nstatic const char *str_sock(int);\nstatic void\tusage(const char *);\n\n\t\t\t/* globals */\nint\t\tvflag;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tdoerrtest = 0;\n\tint\t\t\t\tloopcount = 1;\n\tint\t\t\t\tc, i;\n\tchar\t\t\t*host = NULL;\n\tchar\t\t\thostbuf[NI_MAXHOST];\n\tchar\t\t\t*serv = NULL;\n\tchar\t\t\tservbuf[NI_MAXSERV];\n\tstruct protoent\t*proto;\n\tstruct addrinfo\thints;\t\t/* set by command-line options */\n\n\tif (argc < 2)\n\t\tusage(\"\");\n\n\tmemset(&hints, 0, sizeof(struct addrinfo));\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"cef:h:l:pr:s:t:v\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 'c':\n\t\t\thints.ai_flags |= AI_CANONNAME;\n\t\t\tbreak;\n\n\t\tcase 'e':\n\t\t\tdoerrtest = 1;\n\t\t\tbreak;\n\n\t\tcase 'f':\t\t\t/* address family */\n#ifdef\tIPv4\n\t\t\tif (strcmp(optarg, \"inet\") == 0) {\n\t\t\t\thints.ai_family = AF_INET;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n#ifdef\tIPv6\n\t\t\tif (strcmp(optarg, \"inet6\") == 0) {\n\t\t\t\thints.ai_family = AF_INET6;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n#ifdef\tUNIXdomain\n\t\t\tif (strcmp(optarg, \"unix\") == 0) {\n\t\t\t\thints.ai_family = AF_LOCAL;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\t\t\tusage(\"invalid -f option\");\n\n\t\tcase 'h':\t\t\t/* host */\n\t\t\tstrncpy(hostbuf, optarg, NI_MAXHOST-1);\n\t\t\thost = hostbuf;\n\t\t\tbreak;\n\n\t\tcase 'l':\t\t\t/* loop count */\n\t\t\tloopcount = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'p':\n\t\t\thints.ai_flags |= AI_PASSIVE;\n\t\t\tbreak;\n\n\t\tcase 'r':\t\t\t/* protocol */\n\t\t\tif ((proto = getprotobyname(optarg)) == NULL) {\n\t\t\t\thints.ai_protocol = atoi(optarg);\n\t\t\t} else {\n\t\t\t\thints.ai_protocol = proto->p_proto;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 's':\n\t\t\tstrncpy(servbuf, optarg, NI_MAXSERV-1);\n\t\t\tserv = servbuf;\n\t\t\tbreak;\n\n\t\tcase 't':\t\t\t/* socket type */\n\t\t\tif (strcmp(optarg, \"stream\") == 0) {\n\t\t\t\thints.ai_socktype = SOCK_STREAM;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (strcmp(optarg, \"dgram\") == 0) {\n\t\t\t\thints.ai_socktype = SOCK_DGRAM;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (strcmp(optarg, \"raw\") == 0) {\n\t\t\t\thints.ai_socktype = SOCK_RAW;\n\t\t\t\tbreak;\n\t\t\t}\n\n#ifdef\tSOCK_RDM\n\t\t\tif (strcmp(optarg, \"rdm\") == 0) {\n\t\t\t\thints.ai_socktype = SOCK_RDM;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\n#ifdef\tSOCK_SEQPACKET\n\t\t\tif (strcmp(optarg, \"seqpacket\") == 0) {\n\t\t\t\thints.ai_socktype = SOCK_SEQPACKET;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\t\t\tusage(\"invalid -t option\");\n\n\t\tcase 'v':\n\t\t\tvflag = 1;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\tusage(\"unrecognized option\");\n\t\t}\n\t}\n\tif (optind < argc) {\n\t\tusage(\"extra args\");\n\t}\n\n\tif (doerrtest) {\n\t\tdo_errtest();\n\t\texit(0);\n\t}\n\n\tfor (i = 1; i <= loopcount; i++) {\n\t\tif (do_onetest(host, serv, &hints, i) > 0)\n\t\t\texit(1);\n\n\t\tif (i % 1000 == 0) {\n\t\t\tprintf(\" %d\", i);\n\t\t\tfflush(stdout);\n\t\t}\n\t}\n\n\texit(0);\n}\n\n/*\n * Check that the right error codes are returned for invalid input.\n * Test all the errors that are easy to test for.\n */\n\nstatic void\ndo_errtest(void)\n{\n\t\t/* passive open with no hostname and no address family */\n\tdo_funccall(NULL, \"ftp\", AI_PASSIVE, 0, 0, 0, 0);\n\n\t\t/* kind of hard to automatically test EAI_AGAIN ??? */\n\n\t\t/* invalid flags */\n\tdo_funccall(\"localhost\", NULL, 999999, 0, 0, 0, EAI_BADFLAGS);\n\n\t\t/* how to test EAI_FAIL ??? */\n\n\t\t/* invalid address family */\n\tdo_funccall(\"localhost\", NULL, 0, AF_SNA, 0, 0, EAI_FAMILY);\n\n\t\t/* hard to test for EAI_MEMORY: would have to malloc() until\n\t\t   failure, then give some back, then call getaddrinfo and\n\t\t   hope that its memory requests would not be satisfied. */\n\n\t\t/* to test for EAI_NODATA: would have to know of a host with\n\t\t   no A record in the DNS */\n\n#ifdef\tnotdef\t/* following depends on resolver, sigh */\n\t\t/* believe it or not, there is a registered domain \"bar.com\",\n\t\t   so the following should generate NO_DATA from the DNS */\n\tdo_funccall(\"foo.bar.foo.bar.foo.bar.com\", NULL, 0, 0, 0, 0, EAI_NODATA);\n#endif\n\n\t\t/* no hostname, no service name */\n\tdo_funccall(NULL, NULL, 0, 0, 0, 0, EAI_NONAME);\n\n\t\t/* invalid hostname (should be interpreted in local default domain) */\n\tdo_funccall(\"lkjjkhjhghgfgfd\", NULL, 0, 0, 0, 0, EAI_NONAME);\n\n\t\t/* invalid service name */\n\tdo_funccall(NULL, \"nosuchservice\", 0, 0, 0, 0, EAI_NONAME);\n\n\t\t/* service valid but not supported for socket type */\n\tdo_funccall(\"localhost\", \"telnet\", 0, 0, SOCK_DGRAM, 0, EAI_SERVICE);\n\n\t\t/* service valid but not supported for socket type */\n\tdo_funccall(\"localhost\", \"tftp\", 0, 0, SOCK_STREAM, 0, EAI_SERVICE);\n\n\t\t/* invalid socket type */\n\tdo_funccall(\"localhost\", NULL, 0, AF_INET, SOCK_SEQPACKET, 0, EAI_SOCKTYPE);\n\n\t\t/* EAI_SYSTEM not generated by my implementation */\n}\n\nstatic void\ndo_funccall(const char *host, const char *serv,\n\t\t\tint flags, int family, int socktype, int protocol, int exprc)\n{\n\tint\t\t\t\trc;\n\tstruct addrinfo\thints, *res;\n\n\tmemset(&hints, 0, sizeof(struct addrinfo));\n\thints.ai_flags = flags;\n\thints.ai_family = family;\n\thints.ai_socktype = socktype;\n\thints.ai_protocol = protocol;\n\n\trc = getaddrinfo(host, serv, &hints, &res);\n\tif (rc != exprc) {\n\t\tprintf(\"expected return = %d (%s),\\nactual return = %d (%s)\\n\",\n\t\t\t\texprc, gai_strerror(exprc), rc, gai_strerror(rc));\n\t\tif (host != NULL)\n\t\t\tprintf(\"  host = %s\\n\", host);\n\t\tif (serv != NULL)\n\t\t\tprintf(\"  serv = %s\\n\", serv);\n\t\tprintf(\"  flags = %d, family = %s, socktype = %s, protocol = %d\\n\",\n\t\t\t\tflags, str_fam(family), str_sock(socktype), protocol);\n\t\texit(2);\n\t}\n}\n\nstatic int\ndo_onetest(char *host, char *serv, struct addrinfo *hints, int iteration)\n{\n\tint\t\t\t\trc, fd, verbose;\n\tstruct addrinfo\t*res, *rescopy;\n\tchar\t\t\trhost[NI_MAXHOST], rserv[NI_MAXSERV];\n\n\tverbose = vflag && (iteration == 1);\t/* only first time */\n\n\tif (host != NULL && verbose)\n\t\tprintf(\"host = %s\\n\", host);\n\tif (serv != NULL && verbose)\n\t\tprintf(\"serv = %s\\n\", serv);\n\n\trc = getaddrinfo(host, serv, hints, &res);\n\tif (rc != 0) {\n\t\tprintf(\"getaddrinfo return code = %d (%s)\\n\", rc, gai_strerror(rc));\n\t\treturn(1);\n\t}\n\n\trescopy = res;\n\tdo {\n\t\tif (iteration == 1) {\t/* always print results first time */\n\t\t\tprintf(\"\\nsocket(%s, %s, %d)\", str_fam(res->ai_family),\n\t\t\t\t\tstr_sock(res->ai_socktype), res->ai_protocol);\n\n\t\t\t\t/* canonname should be set only in first addrinfo{} */\n\t\t\tif (hints->ai_flags & AI_CANONNAME) {\n\t\t\t\tif (res->ai_canonname)\n\t\t\t\t\tprintf(\", ai_canonname = %s\", res->ai_canonname);\n\t\t\t}\n\t\t\tprintf(\"\\n\");\n\n\t\t\tprintf(\"\\taddress: %s\\n\",\n\t\t\t\t   Sock_ntop(res->ai_addr, res->ai_addrlen));\n\t\t}\n\n\t\t\t/* Call socket() to make sure return values are valid */\n\t\tfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (fd < 0)\n\t\t\tprintf(\"call to socket() failed!\\n\");\n\t\telse\n\t\t\tclose(fd);\n\n\t\t/*\n\t\t * Call getnameinfo() to check the reverse mapping.\n\t\t */\n\n\t\trc = getnameinfo(res->ai_addr, res->ai_addrlen,\n\t\t\t\t\t\t rhost, NI_MAXHOST, rserv, NI_MAXSERV,\n\t\t\t\t\t\t (res->ai_socktype == SOCK_DGRAM) ? NI_DGRAM: 0);\n\t\tif (rc == 0) {\n\t\t\tif (verbose)\n\t\t\t\tprintf(\"\\tgetnameinfo: host = %s, serv = %s\\n\",\n\t\t\t\t\t   rhost, rserv);\n\t\t} else\n\t\t\tprintf(\"getnameinfo returned %d (%s)\\n\", rc, gai_strerror(rc));\n\n\t} while ( (res = res->ai_next) != NULL);\n\n\tfreeaddrinfo(rescopy);\n\treturn(0);\n}\n\nstatic void\nusage(const char *msg)\n{\n\tprintf(\n\"usage: testaddrinfo [ options ]\\n\"\n\"options: -h <host>    (can be hostname or address string)\\n\"\n\"         -s <service> (can be service name or decimal port number)\\n\"\n\"         -c    AI_CANONICAL flag\\n\"\n\"         -p    AI_PASSIVE flag\\n\"\n\"         -l N  loop N times (check for memory leaks with ps)\\n\"\n\"         -f X  address family, X = inet, inet6, unix\\n\"\n\"         -r X  protocol, X = tcp, udp, ... or number e.g. 6, 17, ...\\n\"\n\"         -t X  socket type, X = stream, dgram, raw, rdm, seqpacket\\n\"\n\"         -v    verbose\\n\"\n\"         -e    only do test of error returns (no options required)\\n\"\n\"  without -e, one or both of <host> and <service> must be specified.\\n\"\n);\n\n\tif (msg[0] != 0)\n\t\tprintf(\"%s\\n\", msg);\n\texit(1);\n}\n\nstatic const char *\nstr_fam(int family)\n{\n#ifdef\tIPv4\n\tif (family == AF_INET)\n\t\treturn(\"AF_INET\");\n#endif\n#ifdef\tIPv6\n\tif (family == AF_INET6)\n\t\treturn(\"AF_INET6\");\n#endif\n#ifdef\tUNIXdomain\n\tif (family == AF_LOCAL)\n\t\treturn(\"AF_LOCAL\");\n#endif\n\treturn(\"<unknown family>\");\n}\n\nstatic const char *\nstr_sock(int socktype)\n{\n\tswitch(socktype) {\n\tcase SOCK_STREAM:\treturn \"SOCK_STREAM\";\n\tcase SOCK_DGRAM:\treturn \"SOCK_DGRAM\";\n\tcase SOCK_RAW:\t\treturn \"SOCK_RAW\";\n#ifdef SOCK_RDM\n\tcase SOCK_RDM:\t\treturn \"SOCK_RDM\";\n#endif\n#ifdef SOCK_SEQPACKET\n\tcase SOCK_SEQPACKET:return \"SOCK_SEQPACKET\";\n#endif\n\tdefault:\t\treturn \"<unknown socktype>\";\n\t}\n}\n"
  },
  {
    "path": "libroute/Makefile",
    "content": "include ../Make.defines\n\nall:\t${LIBROUTE_OBJS}\n\t\tar rv ${LIBUNP_NAME} $?\n\t\t${RANLIB} ${LIBUNP_NAME}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "libroute/get_rtaddrs.c",
    "content": "#include\t\"unproute.h\"\n\n/*\n * Round up 'a' to next multiple of 'size', which must be a power of 2\n */\n#define ROUNDUP(a, size) (((a) & ((size)-1)) ? (1 + ((a) | ((size)-1))) : (a))\n\n/*\n * Step to next socket address structure;\n * if sa_len is 0, assume it is sizeof(u_long).\n */\n#define NEXT_SA(ap)\tap = (SA *) \\\n\t((caddr_t) ap + (ap->sa_len ? ROUNDUP(ap->sa_len, sizeof (u_long)) : \\\n\t\t\t\t\t\t\t\t\tsizeof(u_long)))\n\nvoid\nget_rtaddrs(int addrs, SA *sa, SA **rti_info)\n{\n\tint\t\ti;\n\n\tfor (i = 0; i < RTAX_MAX; i++) {\n\t\tif (addrs & (1 << i)) {\n\t\t\trti_info[i] = sa;\n\t\t\tNEXT_SA(sa);\n\t\t} else\n\t\t\trti_info[i] = NULL;\n\t}\n}\n"
  },
  {
    "path": "libroute/get_rtaddrs.lc",
    "content": "#include    \"unproute.h\"##  1 ##src/libroute/get_rtaddrs.c##\n\n/*##  2 ##src/libroute/get_rtaddrs.c##\n * Round up 'a' to next multiple of 'size'##  3 ##src/libroute/get_rtaddrs.c##\n */##  4 ##src/libroute/get_rtaddrs.c##\n#define ROUNDUP(a, size) (((a) & ((size)-1)) ? (1 + ((a) | ((size)-1))) : (a))##  5 ##src/libroute/get_rtaddrs.c##\n\n/*##  6 ##src/libroute/get_rtaddrs.c##\n * Step to next socket address structure;##  7 ##src/libroute/get_rtaddrs.c##\n * if sa_len is 0, assume it is sizeof(u_long).##  8 ##src/libroute/get_rtaddrs.c##\n */##  9 ##src/libroute/get_rtaddrs.c##\n#define NEXT_SA(ap) ap = (SA *) \\## 10 ##src/libroute/get_rtaddrs.c##\n    ((caddr_t) ap + (ap->sa_len ? ROUNDUP(ap->sa_len, sizeof (u_long)) : \\## 11 ##src/libroute/get_rtaddrs.c##\n                                    sizeof(u_long)))## 12 ##src/libroute/get_rtaddrs.c##\n\nvoid## 13 ##src/libroute/get_rtaddrs.c##\nget_rtaddrs(int addrs, SA *sa, SA **rti_info)## 14 ##src/libroute/get_rtaddrs.c##\n{## 15 ##src/libroute/get_rtaddrs.c##\n    int     i;## 16 ##src/libroute/get_rtaddrs.c##\n\n    for (i = 0; i < RTAX_MAX; i++) {## 17 ##src/libroute/get_rtaddrs.c##\n        if (addrs & (1 << i)) {## 18 ##src/libroute/get_rtaddrs.c##\n            rti_info[i] = sa;## 19 ##src/libroute/get_rtaddrs.c##\n            NEXT_SA(sa);## 20 ##src/libroute/get_rtaddrs.c##\n        } else## 21 ##src/libroute/get_rtaddrs.c##\n            rti_info[i] = NULL;## 22 ##src/libroute/get_rtaddrs.c##\n    }## 23 ##src/libroute/get_rtaddrs.c##\n}## 24 ##src/libroute/get_rtaddrs.c##\n"
  },
  {
    "path": "libroute/if_indextoname.c",
    "content": "/* include if_indextoname */\n#include\t\"unpifi.h\"\n#include\t\"unproute.h\"\n\nchar *\nif_indextoname(unsigned int idx, char *name)\n{\n\tchar\t\t\t\t*buf, *next, *lim;\n\tsize_t\t\t\t\tlen;\n\tstruct if_msghdr\t*ifm;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\tstruct sockaddr_dl\t*sdl;\n\n\tif ( (buf = net_rt_iflist(0, idx, &len)) == NULL)\n\t\treturn(NULL);\n\n\tlim = buf + len;\n\tfor (next = buf; next < lim; next += ifm->ifm_msglen) {\n\t\tifm = (struct if_msghdr *) next;\n\t\tif (ifm->ifm_type == RTM_IFINFO) {\n\t\t\tsa = (struct sockaddr *) (ifm + 1);\n\t\t\tget_rtaddrs(ifm->ifm_addrs, sa, rti_info);\n\t\t\tif ( (sa = rti_info[RTAX_IFP]) != NULL) {\n\t\t\t\tif (sa->sa_family == AF_LINK) {\n\t\t\t\t\tsdl = (struct sockaddr_dl *) sa;\n\t\t\t\t\tif (sdl->sdl_index == idx) {\n\t\t\t\t\t\tint slen = min(IFNAMSIZ - 1, sdl->sdl_nlen);\n\t\t\t\t\t\tstrncpy(name, sdl->sdl_data, slen);\n\t\t\t\t\t\tname[slen] = 0;\t/* null terminate */\n\t\t\t\t\t\tfree(buf);\n\t\t\t\t\t\treturn(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\tfree(buf);\n\treturn(NULL);\t\t/* no match for index */\n}\n/* end if_indextoname */\n\nchar *\nIf_indextoname(unsigned int idx, char *name)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = if_indextoname(idx, name)) == NULL)\n\t\terr_quit(\"if_indextoname error for %d\", idx);\n\treturn(ptr);\n}\n"
  },
  {
    "path": "libroute/if_indextoname.lc",
    "content": "/* include if_indextoname */\n#include    \"unpifi.h\"##  1 ##src/libroute/if_indextoname.c##\n#include    \"unproute.h\"##  2 ##src/libroute/if_indextoname.c##\n\nchar   *##  3 ##src/libroute/if_indextoname.c##\nif_indextoname(unsigned int index, char *name)##  4 ##src/libroute/if_indextoname.c##\n{##  5 ##src/libroute/if_indextoname.c##\n    char   *buf, *next, *lim;##  6 ##src/libroute/if_indextoname.c##\n    size_t  len;##  7 ##src/libroute/if_indextoname.c##\n    struct if_msghdr *ifm;##  8 ##src/libroute/if_indextoname.c##\n    struct sockaddr *sa, *rti_info[RTAX_MAX];##  9 ##src/libroute/if_indextoname.c##\n    struct sockaddr_dl *sdl;## 10 ##src/libroute/if_indextoname.c##\n\n    if ((buf = net_rt_iflist(0, index, &len)) == NULL)## 11 ##src/libroute/if_indextoname.c##\n        return (NULL);## 12 ##src/libroute/if_indextoname.c##\n\n    lim = buf + len;## 13 ##src/libroute/if_indextoname.c##\n    for (next = buf; next < lim; next += ifm->ifm_msglen) {## 14 ##src/libroute/if_indextoname.c##\n        ifm = (struct if_msghdr *) next;## 15 ##src/libroute/if_indextoname.c##\n        if (ifm->ifm_type == RTM_IFINFO) {## 16 ##src/libroute/if_indextoname.c##\n            sa = (struct sockaddr *) (ifm + 1);## 17 ##src/libroute/if_indextoname.c##\n            get_rtaddrs(ifm->ifm_addrs, sa, rti_info);## 18 ##src/libroute/if_indextoname.c##\n            if ((sa = rti_info[RTAX_IFP]) != NULL) {## 19 ##src/libroute/if_indextoname.c##\n                if (sa->sa_family == AF_LINK) {## 20 ##src/libroute/if_indextoname.c##\n                    sdl = (struct sockaddr_dl *) sa;## 21 ##src/libroute/if_indextoname.c##\n                    if (sdl->sdl_index == index) {## 22 ##src/libroute/if_indextoname.c##\n                        strncpy(name, sdl->sdl_data, sdl->sdl_nlen);## 23 ##src/libroute/if_indextoname.c##\n                        name[sdl->sdl_nlen] = 0;    /* null terminate */## 24 ##src/libroute/if_indextoname.c##\n                        free(buf);## 25 ##src/libroute/if_indextoname.c##\n                        return (name);## 26 ##src/libroute/if_indextoname.c##\n                    }## 27 ##src/libroute/if_indextoname.c##\n                }## 28 ##src/libroute/if_indextoname.c##\n            }## 29 ##src/libroute/if_indextoname.c##\n\n        }## 30 ##src/libroute/if_indextoname.c##\n    }## 31 ##src/libroute/if_indextoname.c##\n    free(buf);## 32 ##src/libroute/if_indextoname.c##\n    return (NULL);              /* no match for index */## 33 ##src/libroute/if_indextoname.c##\n}## 34 ##src/libroute/if_indextoname.c##\n/* end if_indextoname */\n\nchar   *## 35 ##src/libroute/if_indextoname.c##\nIf_indextoname(unsigned int index, char *name)## 36 ##src/libroute/if_indextoname.c##\n{## 37 ##src/libroute/if_indextoname.c##\n    char   *ptr;## 38 ##src/libroute/if_indextoname.c##\n\n    if ((ptr = if_indextoname(index, name)) == NULL)## 39 ##src/libroute/if_indextoname.c##\n        err_quit(\"if_indextoname error for %d\", index);## 40 ##src/libroute/if_indextoname.c##\n    return (ptr);## 41 ##src/libroute/if_indextoname.c##\n}## 42 ##src/libroute/if_indextoname.c##\n"
  },
  {
    "path": "libroute/if_nameindex.c",
    "content": "/* include if_nameindex */\n#include\t\"unpifi.h\"\n#include\t\"unproute.h\"\n\nstruct if_nameindex *\nif_nameindex(void)\n{\n\tchar\t\t\t\t*buf, *next, *lim;\n\tsize_t\t\t\t\tlen;\n\tstruct if_msghdr\t*ifm;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\tstruct sockaddr_dl\t*sdl;\n\tstruct if_nameindex\t*result, *ifptr;\n\tchar\t\t\t\t*namptr;\n\n\tif ( (buf = net_rt_iflist(0, 0, &len)) == NULL)\n\t\treturn(NULL);\n\n\tif ( (result = malloc(len)) == NULL)\t/* overestimate */\n\t\treturn(NULL);\n\tifptr = result;\n\tnamptr = (char *) result + len;\t/* names start at end of buffer */\n\n\tlim = buf + len;\n\tfor (next = buf; next < lim; next += ifm->ifm_msglen) {\n\t\tifm = (struct if_msghdr *) next;\n\t\tif (ifm->ifm_type == RTM_IFINFO) {\n\t\t\tsa = (struct sockaddr *) (ifm + 1);\n\t\t\tget_rtaddrs(ifm->ifm_addrs, sa, rti_info);\n\t\t\tif ( (sa = rti_info[RTAX_IFP]) != NULL) {\n\t\t\t\tif (sa->sa_family == AF_LINK) {\n\t\t\t\t\tsdl = (struct sockaddr_dl *) sa;\n\t\t\t\t\tnamptr -= sdl->sdl_nlen + 1;\n\t\t\t\t\tstrncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);\n\t\t\t\t\tnamptr[sdl->sdl_nlen] = 0;\t/* null terminate */\n\t\t\t\t\tifptr->if_name = namptr;\n\t\t\t\t\tifptr->if_index = sdl->sdl_index;\n\t\t\t\t\tifptr++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\tifptr->if_name = NULL;\t/* mark end of array of structs */\n\tifptr->if_index = 0;\n\tfree(buf);\n\treturn(result);\t\t\t/* caller must free() this when done */\n}\n/* end if_nameindex */\n\n/* include if_freenameindex */\nvoid\nif_freenameindex(struct if_nameindex *ptr)\n{\n\tfree(ptr);\n}\n/* end if_freenameindex */\n\nstruct if_nameindex *\nIf_nameindex(void)\n{\n\tstruct if_nameindex\t*ifptr;\n\n\tif ( (ifptr = if_nameindex()) == NULL)\n\t\terr_quit(\"if_nameindex error\");\n\treturn(ifptr);\n}\n"
  },
  {
    "path": "libroute/if_nameindex.lc",
    "content": "/* include if_nameindex */\n#include    \"unpifi.h\"##  1 ##src/libroute/if_nameindex.c##\n#include    \"unproute.h\"##  2 ##src/libroute/if_nameindex.c##\n\nstruct if_nameindex *##  3 ##src/libroute/if_nameindex.c##\nif_nameindex(void)##  4 ##src/libroute/if_nameindex.c##\n{##  5 ##src/libroute/if_nameindex.c##\n    char   *buf, *next, *lim;##  6 ##src/libroute/if_nameindex.c##\n    size_t  len;##  7 ##src/libroute/if_nameindex.c##\n    struct if_msghdr *ifm;##  8 ##src/libroute/if_nameindex.c##\n    struct sockaddr *sa, *rti_info[RTAX_MAX];##  9 ##src/libroute/if_nameindex.c##\n    struct sockaddr_dl *sdl;## 10 ##src/libroute/if_nameindex.c##\n    struct if_nameindex *result, *ifptr;## 11 ##src/libroute/if_nameindex.c##\n    char   *namptr;## 12 ##src/libroute/if_nameindex.c##\n\n    if ((buf = net_rt_iflist(0, 0, &len)) == NULL)## 13 ##src/libroute/if_nameindex.c##\n        return (NULL);## 14 ##src/libroute/if_nameindex.c##\n\n    if ((result = malloc(len)) == NULL) /* overestimate */## 15 ##src/libroute/if_nameindex.c##\n        return (NULL);## 16 ##src/libroute/if_nameindex.c##\n    ifptr = result;## 17 ##src/libroute/if_nameindex.c##\n    namptr = (char *) result + len; /* names start at end of buffer */## 18 ##src/libroute/if_nameindex.c##\n\n    lim = buf + len;## 19 ##src/libroute/if_nameindex.c##\n    for (next = buf; next < lim; next += ifm->ifm_msglen) {## 20 ##src/libroute/if_nameindex.c##\n        ifm = (struct if_msghdr *) next;## 21 ##src/libroute/if_nameindex.c##\n        if (ifm->ifm_type == RTM_IFINFO) {## 22 ##src/libroute/if_nameindex.c##\n            sa = (struct sockaddr *) (ifm + 1);## 23 ##src/libroute/if_nameindex.c##\n            get_rtaddrs(ifm->ifm_addrs, sa, rti_info);## 24 ##src/libroute/if_nameindex.c##\n            if ((sa = rti_info[RTAX_IFP]) != NULL) {## 25 ##src/libroute/if_nameindex.c##\n                if (sa->sa_family == AF_LINK) {## 26 ##src/libroute/if_nameindex.c##\n                    sdl = (struct sockaddr_dl *) sa;## 27 ##src/libroute/if_nameindex.c##\n                    namptr -= sdl->sdl_nlen + 1;## 28 ##src/libroute/if_nameindex.c##\n                    strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);## 29 ##src/libroute/if_nameindex.c##\n                    namptr[sdl->sdl_nlen] = 0;  /* null terminate */## 30 ##src/libroute/if_nameindex.c##\n                    ifptr->if_name = namptr;## 31 ##src/libroute/if_nameindex.c##\n                    ifptr->if_index = sdl->sdl_index;## 32 ##src/libroute/if_nameindex.c##\n                    ifptr++;## 33 ##src/libroute/if_nameindex.c##\n                }## 34 ##src/libroute/if_nameindex.c##\n            }## 35 ##src/libroute/if_nameindex.c##\n\n        }## 36 ##src/libroute/if_nameindex.c##\n    }## 37 ##src/libroute/if_nameindex.c##\n    ifptr->if_name = NULL;      /* mark end of array of structs */## 38 ##src/libroute/if_nameindex.c##\n    ifptr->if_index = 0;## 39 ##src/libroute/if_nameindex.c##\n    free(buf);## 40 ##src/libroute/if_nameindex.c##\n    return (result);            /* caller must free() this when done */## 41 ##src/libroute/if_nameindex.c##\n}## 42 ##src/libroute/if_nameindex.c##\n/* end if_nameindex */\n\n/* include if_freenameindex */\nvoid## 43 ##src/libroute/if_nameindex.c##\nif_freenameindex(struct if_nameindex *ptr)## 44 ##src/libroute/if_nameindex.c##\n{## 45 ##src/libroute/if_nameindex.c##\n    free(ptr);## 46 ##src/libroute/if_nameindex.c##\n}## 47 ##src/libroute/if_nameindex.c##\n/* end if_freenameindex */\n\nstruct if_nameindex *## 48 ##src/libroute/if_nameindex.c##\nIf_nameindex(void)## 49 ##src/libroute/if_nameindex.c##\n{## 50 ##src/libroute/if_nameindex.c##\n    struct if_nameindex *ifptr;## 51 ##src/libroute/if_nameindex.c##\n\n    if ((ifptr = if_nameindex()) == NULL)## 52 ##src/libroute/if_nameindex.c##\n        err_quit(\"if_nameindex error\");## 53 ##src/libroute/if_nameindex.c##\n    return (ifptr);## 54 ##src/libroute/if_nameindex.c##\n}## 55 ##src/libroute/if_nameindex.c##\n"
  },
  {
    "path": "libroute/if_nametoindex.c",
    "content": "/* include if_nametoindex */\n#include\t\"unpifi.h\"\n#include\t\"unproute.h\"\n\nunsigned int\nif_nametoindex(const char *name)\n{\n\tunsigned int\t\tidx, namelen;\n\tchar\t\t\t\t*buf, *next, *lim;\n\tsize_t\t\t\t\tlen;\n\tstruct if_msghdr\t*ifm;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\tstruct sockaddr_dl\t*sdl;\n\n\tif ( (buf = net_rt_iflist(0, 0, &len)) == NULL)\n\t\treturn(0);\n\n\tnamelen = strlen(name);\n\tlim = buf + len;\n\tfor (next = buf; next < lim; next += ifm->ifm_msglen) {\n\t\tifm = (struct if_msghdr *) next;\n\t\tif (ifm->ifm_type == RTM_IFINFO) {\n\t\t\tsa = (struct sockaddr *) (ifm + 1);\n\t\t\tget_rtaddrs(ifm->ifm_addrs, sa, rti_info);\n\t\t\tif ( (sa = rti_info[RTAX_IFP]) != NULL) {\n\t\t\t\tif (sa->sa_family == AF_LINK) {\n\t\t\t\t\tsdl = (struct sockaddr_dl *) sa;\n\t\t\t\t\tif (sdl->sdl_nlen == namelen && strncmp(&sdl->sdl_data[0], name, sdl->sdl_nlen) == 0) {\n\t\t\t\t\t\tidx = sdl->sdl_index;\t/* save before free() */\n\t\t\t\t\t\tfree(buf);\n\t\t\t\t\t\treturn(idx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\tfree(buf);\n\treturn(0);\t\t/* no match for name */\n}\n/* end if_nametoindex */\n\nunsigned int\nIf_nametoindex(const char *name)\n{\n\tint\t\tidx;\n\n\tif ( (idx = if_nametoindex(name)) == 0)\n\t\terr_quit(\"if_nametoindex error for %s\", name);\n\treturn(idx);\n}\n"
  },
  {
    "path": "libroute/if_nametoindex.lc",
    "content": "/* include if_nametoindex */\n#include    \"unpifi.h\"##  1 ##src/libroute/if_nametoindex.c##\n#include    \"unproute.h\"##  2 ##src/libroute/if_nametoindex.c##\n\nunsigned int##  3 ##src/libroute/if_nametoindex.c##\nif_nametoindex(const char *name)##  4 ##src/libroute/if_nametoindex.c##\n{##  5 ##src/libroute/if_nametoindex.c##\n    unsigned int index;##  6 ##src/libroute/if_nametoindex.c##\n    char   *buf, *next, *lim;##  7 ##src/libroute/if_nametoindex.c##\n    size_t  len;##  8 ##src/libroute/if_nametoindex.c##\n    struct if_msghdr *ifm;##  9 ##src/libroute/if_nametoindex.c##\n    struct sockaddr *sa, *rti_info[RTAX_MAX];## 10 ##src/libroute/if_nametoindex.c##\n    struct sockaddr_dl *sdl;## 11 ##src/libroute/if_nametoindex.c##\n\n    if ((buf = net_rt_iflist(0, 0, &len)) == NULL)## 12 ##src/libroute/if_nametoindex.c##\n        return (0);## 13 ##src/libroute/if_nametoindex.c##\n\n    lim = buf + len;## 14 ##src/libroute/if_nametoindex.c##\n    for (next = buf; next < lim; next += ifm->ifm_msglen) {## 15 ##src/libroute/if_nametoindex.c##\n        ifm = (struct if_msghdr *) next;## 16 ##src/libroute/if_nametoindex.c##\n        if (ifm->ifm_type == RTM_IFINFO) {## 17 ##src/libroute/if_nametoindex.c##\n            sa = (struct sockaddr *) (ifm + 1);## 18 ##src/libroute/if_nametoindex.c##\n            get_rtaddrs(ifm->ifm_addrs, sa, rti_info);## 19 ##src/libroute/if_nametoindex.c##\n            if ((sa = rti_info[RTAX_IFP]) != NULL) {## 20 ##src/libroute/if_nametoindex.c##\n                if (sa->sa_family == AF_LINK) {## 21 ##src/libroute/if_nametoindex.c##\n                    sdl = (struct sockaddr_dl *) sa;## 22 ##src/libroute/if_nametoindex.c##\n                    if (strncmp(&sdl->sdl_data[0], name, sdl->sdl_nlen) == 0) {## 23 ##src/libroute/if_nametoindex.c##\n                        index = sdl->sdl_index; /* save before free() */## 24 ##src/libroute/if_nametoindex.c##\n                        free(buf);## 25 ##src/libroute/if_nametoindex.c##\n                        return (index);## 26 ##src/libroute/if_nametoindex.c##\n                    }## 27 ##src/libroute/if_nametoindex.c##\n                }## 28 ##src/libroute/if_nametoindex.c##\n            }## 29 ##src/libroute/if_nametoindex.c##\n\n        }## 30 ##src/libroute/if_nametoindex.c##\n    }## 31 ##src/libroute/if_nametoindex.c##\n    free(buf);## 32 ##src/libroute/if_nametoindex.c##\n    return (0);                 /* no match for name */## 33 ##src/libroute/if_nametoindex.c##\n}## 34 ##src/libroute/if_nametoindex.c##\n/* end if_nametoindex */\n\nunsigned int## 35 ##src/libroute/if_nametoindex.c##\nIf_nametoindex(const char *name)## 36 ##src/libroute/if_nametoindex.c##\n{## 37 ##src/libroute/if_nametoindex.c##\n    int     index;## 38 ##src/libroute/if_nametoindex.c##\n\n    if ((index = if_nametoindex(name)) == 0)## 39 ##src/libroute/if_nametoindex.c##\n        err_quit(\"if_nametoindex error for %s\", name);## 40 ##src/libroute/if_nametoindex.c##\n    return (index);## 41 ##src/libroute/if_nametoindex.c##\n}## 42 ##src/libroute/if_nametoindex.c##\n"
  },
  {
    "path": "libroute/net_rt_dump.c",
    "content": "/* include net_rt_dump */\n#include\t\"unproute.h\"\n\nchar *\nnet_rt_dump(int family, int flags, size_t *lenp)\n{\n\tint\t\tmib[6];\n\tchar\t*buf;\n\n\tmib[0] = CTL_NET;\n\tmib[1] = AF_ROUTE;\n\tmib[2] = 0;\n\tmib[3] = family;\t\t/* only addresses of this family */\n\tmib[4] = NET_RT_DUMP;\n\tmib[5] = flags;\t\t\t/* not looked at with NET_RT_DUMP */\n\tif (sysctl(mib, 6, NULL, lenp, NULL, 0) < 0)\n\t\treturn(NULL);\n\n\tif ( (buf = malloc(*lenp)) == NULL)\n\t\treturn(NULL);\n\tif (sysctl(mib, 6, buf, lenp, NULL, 0) < 0)\n\t\treturn(NULL);\n\n\treturn(buf);\n}\n/* end net_rt_dump */\n\nchar *\nNet_rt_dump(int family, int flags, size_t *lenp)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = net_rt_dump(family, flags, lenp)) == NULL)\n\t\terr_sys(\"net_rt_dump error\");\n\treturn(ptr);\n}\n"
  },
  {
    "path": "libroute/net_rt_iflist.c",
    "content": "/* include net_rt_iflist */\n#include\t\"unproute.h\"\n\nchar *\nnet_rt_iflist(int family, int flags, size_t *lenp)\n{\n\tint\t\tmib[6];\n\tchar\t*buf;\n\n\tmib[0] = CTL_NET;\n\tmib[1] = AF_ROUTE;\n\tmib[2] = 0;\n\tmib[3] = family;\t\t/* only addresses of this family */\n\tmib[4] = NET_RT_IFLIST;\n\tmib[5] = flags;\t\t\t/* interface index or 0 */\n\tif (sysctl(mib, 6, NULL, lenp, NULL, 0) < 0)\n\t\treturn(NULL);\n\n\tif ( (buf = malloc(*lenp)) == NULL)\n\t\treturn(NULL);\n\tif (sysctl(mib, 6, buf, lenp, NULL, 0) < 0) {\n\t\tfree(buf);\n\t\treturn(NULL);\n\t}\n\n\treturn(buf);\n}\n/* end net_rt_iflist */\n\nchar *\nNet_rt_iflist(int family, int flags, size_t *lenp)\n{\n\tchar\t*ptr;\n\n\tif ( (ptr = net_rt_iflist(family, flags, lenp)) == NULL)\n\t\terr_sys(\"net_rt_iflist error\");\n\treturn(ptr);\n}\n"
  },
  {
    "path": "libroute/net_rt_iflist.lc",
    "content": "/* include net_rt_iflist */\n#include    \"unproute.h\"##  1 ##src/libroute/net_rt_iflist.c##\n\nchar   *##  2 ##src/libroute/net_rt_iflist.c##\nnet_rt_iflist(int family, int flags, size_t *lenp)##  3 ##src/libroute/net_rt_iflist.c##\n{##  4 ##src/libroute/net_rt_iflist.c##\n    int     mib[6];##  5 ##src/libroute/net_rt_iflist.c##\n    char   *buf;##  6 ##src/libroute/net_rt_iflist.c##\n\n    mib[0] = CTL_NET;##  7 ##src/libroute/net_rt_iflist.c##\n    mib[1] = AF_ROUTE;##  8 ##src/libroute/net_rt_iflist.c##\n    mib[2] = 0;##  9 ##src/libroute/net_rt_iflist.c##\n    mib[3] = family;            /* only addresses of this family */## 10 ##src/libroute/net_rt_iflist.c##\n    mib[4] = NET_RT_IFLIST;## 11 ##src/libroute/net_rt_iflist.c##\n    mib[5] = flags;             /* interface index, or 0 */## 12 ##src/libroute/net_rt_iflist.c##\n    if (sysctl(mib, 6, NULL, lenp, NULL, 0) < 0)## 13 ##src/libroute/net_rt_iflist.c##\n        return (NULL);## 14 ##src/libroute/net_rt_iflist.c##\n\n    if ((buf = malloc(*lenp)) == NULL)## 15 ##src/libroute/net_rt_iflist.c##\n        return (NULL);## 16 ##src/libroute/net_rt_iflist.c##\n    if (sysctl(mib, 6, buf, lenp, NULL, 0) < 0) {## 17 ##src/libroute/net_rt_iflist.c##\n        free(buf);## 18 ##src/libroute/net_rt_iflist.c##\n        return (NULL);## 19 ##src/libroute/net_rt_iflist.c##\n    }## 20 ##src/libroute/net_rt_iflist.c##\n\n    return (buf);## 21 ##src/libroute/net_rt_iflist.c##\n}## 22 ##src/libroute/net_rt_iflist.c##\n/* end net_rt_iflist */\n\nchar   *## 23 ##src/libroute/net_rt_iflist.c##\nNet_rt_iflist(int family, int flags, size_t *lenp)## 24 ##src/libroute/net_rt_iflist.c##\n{## 25 ##src/libroute/net_rt_iflist.c##\n    char   *ptr;## 26 ##src/libroute/net_rt_iflist.c##\n\n    if ((ptr = net_rt_iflist(family, flags, lenp)) == NULL)## 27 ##src/libroute/net_rt_iflist.c##\n        err_sys(\"net_rt_iflist error\");## 28 ##src/libroute/net_rt_iflist.c##\n    return (ptr);## 29 ##src/libroute/net_rt_iflist.c##\n}## 30 ##src/libroute/net_rt_iflist.c##\n"
  },
  {
    "path": "libroute/sock_masktop.c",
    "content": "#include\t\"unproute.h\"\n\nconst char *\nsock_masktop(SA *sa, socklen_t salen)\n{\n\tstatic char\t\tstr[INET6_ADDRSTRLEN];\n\tunsigned char\t*ptr = &sa->sa_data[2];\n\n\tif (sa->sa_len == 0)\n\t\treturn(\"0.0.0.0\");\n\telse if (sa->sa_len == 5)\n\t\tsnprintf(str, sizeof(str), \"%d.0.0.0\", *ptr);\n\telse if (sa->sa_len == 6)\n\t\tsnprintf(str, sizeof(str), \"%d.%d.0.0\", *ptr, *(ptr+1));\n\telse if (sa->sa_len == 7)\n\t\tsnprintf(str, sizeof(str), \"%d.%d.%d.0\", *ptr, *(ptr+1), *(ptr+2));\n\telse if (sa->sa_len == 8)\n\t\tsnprintf(str, sizeof(str), \"%d.%d.%d.%d\",\n\t\t\t\t *ptr, *(ptr+1), *(ptr+2), *(ptr+3));\n\telse\n\t\tsnprintf(str, sizeof(str), \"(unknown mask, len = %d, family = %d)\",\n\t\t\t\t sa->sa_len, sa->sa_family);\n\treturn(str);\n}\n"
  },
  {
    "path": "libroute/unproute.h",
    "content": "#include\t\"unp.h\"\n#include\t<net/if.h>\t\t\t/* if_msghdr{} */\n#include\t<net/if_dl.h>\t\t/* sockaddr_sdl{} */\n#include\t<net/route.h>\t\t/* RTA_xxx constants */\n#include\t<sys/param.h>\n\n#ifdef\tHAVE_SYS_SYSCTL_H\n#include\t<sys/sysctl.h>\t\t/* sysctl() */\n#endif\n\n\t\t\t/* function prototypes */\nvoid\t get_rtaddrs(int, struct sockaddr *, struct sockaddr **);\nchar\t*net_rt_iflist(int, int, size_t *);\nchar\t*net_rt_dump(int, int, size_t *);\nconst char\t*sock_masktop(struct sockaddr *, socklen_t);\n\n\t\t\t/* wrapper functions */\nchar\t*Net_rt_iflist(int, int, size_t *);\nchar\t*Net_rt_dump(int, int, size_t *);\n#define\tSock_masktop(a,b)\t\tsock_masktop((a), (b))\n"
  },
  {
    "path": "mcast/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tsendrecv udpcli05 udpcli06 udpserv01\n\nall:\t${PROGS}\n\nsendrecv:\tmain.o send.o recv.o\n\t\t${CC} ${CFLAGS} -o $@ main.o send.o recv.o ${LIBS}\n\n# Version in book.\nudpcli01:\tudpcli01.o dgclibcast1.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o dgclibcast1.o ${LIBS}\n\n# Correct version using sigsetjmp()/siglongjmp().\nudpcli05:\tudpcli05.o dgclimcast5.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli05.o dgclimcast5.o ${LIBS}\n\n# Try to bind multicast address and send.\nudpcli06:\tudpcli06.o dgclimcast6.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli06.o dgclimcast6.o ${LIBS}\n\nudpserv01:\tudpserv01.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv01.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "mcast/dgclibcast1.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_alarm(int);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tlen = servlen;\n\t\t\tn = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\tif (n == -1) {\n\t\t\t\tif (errno == EINTR)\n\t\t\t\t\tbreak;\t\t/* waited long enough for replies */\n\t\t\t\telse\n\t\t\t\t\terr_sys(\"recvfrom error\");\n\t\t\t} else {\n\t\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\t\tSock_ntop_host(preply_addr, servlen), recvline);\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\treturn;\t\t/* just interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "mcast/dgclimcast5.c",
    "content": "#include\t\"unp.h\"\n#include\t<setjmp.h>\n\nstatic void\t\t\trecvfrom_alarm(int);\nstatic sigjmp_buf\tjmpbuf;\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tif (sigsetjmp(jmpbuf, 1) != 0)\n\t\t\t\tbreak;\n\t\t\tlen = servlen;\n\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\tSock_ntop_host(preply_addr, servlen), recvline);\n\t\t}\n\t}\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\tsiglongjmp(jmpbuf, 1);\n}\n"
  },
  {
    "path": "mcast/dgclimcast6.c",
    "content": "#include\t\"unp.h\"\n#include\t<setjmp.h>\n\nstatic void\t\t\trecvfrom_alarm(int);\nstatic sigjmp_buf\tjmpbuf;\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n \n\tpreply_addr = Malloc(servlen);\n\n\tSignal(SIGALRM, recvfrom_alarm);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\talarm(5);\n\t\tfor ( ; ; ) {\n\t\t\tif (sigsetjmp(jmpbuf, 1) != 0)\n\t\t\t\tbreak;\n\t\t\tlen = servlen;\n\t\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\t\trecvline[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"from %s: %s\",\n\t\t\t\t\tSock_ntop_host(preply_addr, servlen), recvline);\n\t\t}\n\t}\n}\n\nstatic void\nrecvfrom_alarm(int signo)\n{\n\tsiglongjmp(jmpbuf, 1);\n}\n"
  },
  {
    "path": "mcast/main.c",
    "content": "#include\t\"unp.h\"\n\nvoid\trecv_all(int, socklen_t);\nvoid\tsend_all(int, SA *, socklen_t);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsendfd, recvfd;\n\tconst int\t\t\ton = 1;\n\tsocklen_t\t\t\tsalen;\n\tstruct sockaddr\t\t*sasend, *sarecv;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: sendrecv <IP-multicast-address> <port#>\");\n\n\tsendfd = Udp_client(argv[1], argv[2], (void **) &sasend, &salen);\n\n\trecvfd = Socket(sasend->sa_family, SOCK_DGRAM, 0);\n\n\tSetsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\n\tsarecv = Malloc(salen);\n\tmemcpy(sarecv, sasend, salen);\n\tBind(recvfd, sarecv, salen);\n\n\tMcast_join(recvfd, sasend, salen, NULL, 0);\n\tMcast_set_loop(sendfd, 0);\n\n\tif (Fork() == 0)\n\t\trecv_all(recvfd, salen);\t\t/* child -> receives */\n\n\tsend_all(sendfd, sasend, salen);\t/* parent -> sends */\n}\n"
  },
  {
    "path": "mcast/recv.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nrecv_all(int recvfd, socklen_t salen)\n{\n\tint\t\t\t\t\tn;\n\tchar\t\t\t\tline[MAXLINE+1];\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr\t\t*safrom;\n\n\tsafrom = Malloc(salen);\n\n\tfor ( ; ; ) {\n\t\tlen = salen;\n\t\tn = Recvfrom(recvfd, line, MAXLINE, 0, safrom, &len);\n\n\t\tline[n] = 0;\t/* null terminate */\n\t\tprintf(\"from %s: %s\", Sock_ntop(safrom, len), line);\n\t}\n}\n"
  },
  {
    "path": "mcast/send.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/utsname.h>\n\n#define\tSENDRATE\t5\t\t/* send one datagram every five seconds */\n\nvoid\nsend_all(int sendfd, SA *sadest, socklen_t salen)\n{\n\tchar\t\tline[MAXLINE];\t\t/* hostname and process ID */\n\tstruct utsname\tmyname;\n\n\tif (uname(&myname) < 0)\n\t\terr_sys(\"uname error\");;\n\tsnprintf(line, sizeof(line), \"%s, %d\\n\", myname.nodename, getpid());\n\n\tfor ( ; ; ) {\n\t\tSendto(sendfd, line, strlen(line), 0, sadest, salen);\n\n\t\tsleep(SENDRATE);\n\t}\n}\n"
  },
  {
    "path": "mcast/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli01 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "mcast/udpcli05.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli05 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* standard daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "mcast/udpcli06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd;\n\tsocklen_t\t\tsalen;\n\tstruct sockaddr\t*cli, *serv;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli06 <IPaddress>\");\n\n\tsockfd = Udp_client(argv[1], \"daytime\", (void **) &serv, &salen);\n\n\tcli = Malloc(salen);\n\tmemcpy(cli, serv, salen);\t\t/* copy socket address struct */\n\tsock_set_port(cli, salen, 0);\t/* and set port to 0 */\n\tBind(sockfd, cli, salen);\n\n\tdg_cli(stdin, sockfd, serv, salen);\n\n\texit(0);\n}\n"
  },
  {
    "path": "mcast/udpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr, grpaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tbzero(&grpaddr, sizeof(servaddr));\n\tgrpaddr.sin_family      = AF_INET;\n\tgrpaddr.sin_addr.s_addr = inet_addr(\"224.0.0.1\");\n\n\tmcast_join(sockfd, &grpaddr, sizeof(grpaddr), NULL, 0);\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "mysdr/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tmysdr\n\nall:\t${PROGS}\n\nmysdr:\tmain.o loop.o\n\t\t${CC} ${CFLAGS} -o $@ main.o loop.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "mysdr/loop.c",
    "content": "#include\t\"mysdr.h\"\n\nvoid\nloop(int sockfd, socklen_t salen)\n{\n\tsocklen_t\t\tlen;\n\tssize_t\t\t\tn;\n\tchar\t\t\t*p;\n\tstruct sockaddr\t*sa;\n\tstruct sap_packet {\n\t  uint32_t\tsap_header;\n\t  uint32_t\tsap_src;\n\t  char\t\tsap_data[BUFFSIZE];\n\t} buf;\n\n\tsa = Malloc(salen);\n\n\tfor ( ; ; ) {\n\t\tlen = salen;\n\t\tn = Recvfrom(sockfd, &buf, sizeof(buf) - 1, 0, sa, &len);\n\t\t((char *)&buf)[n] = 0;\t\t\t/* null terminate */\n\t\tbuf.sap_header = ntohl(buf.sap_header);\n\n\t\tprintf(\"From %s hash 0x%04x\\n\", Sock_ntop(sa, len),\n\t\t\t\tbuf.sap_header & SAP_HASH_MASK);\n\t\tif (((buf.sap_header & SAP_VERSION_MASK) >> SAP_VERSION_SHIFT) > 1) {\n\t\t\terr_msg(\"... version field not 1 (0x%08x)\", buf.sap_header);\n\t\t\tcontinue;\n\t\t}\n\t\tif (buf.sap_header & SAP_IPV6) {\n\t\t\terr_msg(\"... IPv6\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (buf.sap_header & (SAP_DELETE|SAP_ENCRYPTED|SAP_COMPRESSED)) {\n\t\t\terr_msg(\"... can't parse this packet type (0x%08x)\", buf.sap_header);\n\t\t\tcontinue;\n\t\t}\n\t\tp = buf.sap_data + ((buf.sap_header & SAP_AUTHLEN_MASK)\n\t\t\t\t\t\t\t>> SAP_AUTHLEN_SHIFT);\n\t\tif (strcmp(p, \"application/sdp\") == 0)\n\t\t\tp += 16;\n\t\tprintf(\"%s\\n\", p);\n\t}\n}\n"
  },
  {
    "path": "mysdr/loop.lc",
    "content": "#include    \"unp.h\"##  1 ##src/mysdr/loop.c##\n\nvoid##  2 ##src/mysdr/loop.c##\nloop(int sockfd, socklen_t salen)##  3 ##src/mysdr/loop.c##\n{##  4 ##src/mysdr/loop.c##\n    char    buf[MAXLINE + 1];##  5 ##src/mysdr/loop.c##\n    socklen_t len;##  6 ##src/mysdr/loop.c##\n    ssize_t n;##  7 ##src/mysdr/loop.c##\n    struct sockaddr *sa;##  8 ##src/mysdr/loop.c##\n    struct sap_packet {##  9 ##src/mysdr/loop.c##\n        uint32_t sap_header;## 10 ##src/mysdr/loop.c##\n        uint32_t sap_src;## 11 ##src/mysdr/loop.c##\n        char    sap_data[1];## 12 ##src/mysdr/loop.c##\n    }      *sapptr;## 13 ##src/mysdr/loop.c##\n\n    sa = Malloc(salen);## 14 ##src/mysdr/loop.c##\n\n    for (;;) {## 15 ##src/mysdr/loop.c##\n        len = salen;## 16 ##src/mysdr/loop.c##\n        n = Recvfrom(sockfd, buf, MAXLINE, 0, sa, &len);## 17 ##src/mysdr/loop.c##\n        buf[n] = 0;             /* null terminate */## 18 ##src/mysdr/loop.c##\n\n        sapptr = (struct sap_packet *) buf;## 19 ##src/mysdr/loop.c##\n        if ((n -= 2 * sizeof(uint32_t)) <= 0)## 20 ##src/mysdr/loop.c##\n            err_quit(\"n = %d\", n);## 21 ##src/mysdr/loop.c##\n        printf(\"From %s\\n%s\\n\", Sock_ntop(sa, len), sapptr->sap_data);## 22 ##src/mysdr/loop.c##\n    }## 23 ##src/mysdr/loop.c##\n}## 24 ##src/mysdr/loop.c##\n"
  },
  {
    "path": "mysdr/main.c",
    "content": "#include\t\"unp.h\"\n\n#define\tSAP_NAME\t\"sap.mcast.net\"\t/* default group name and port */\n#define\tSAP_PORT\t\"9875\"\n\nvoid\tloop(int, socklen_t);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tconst int\t\t\ton = 1;\n\tsocklen_t\t\t\tsalen;\n\tstruct sockaddr\t\t*sa;\n\n\tif (argc == 1)\n\t\tsockfd = Udp_client(SAP_NAME, SAP_PORT, (void **) &sa, &salen);\n\telse if (argc == 4)\n\t\tsockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);\n\telse\n\t\terr_quit(\"usage: mysdr <mcast-addr> <port#> <interface-name>\");\n\n\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\tBind(sockfd, sa, salen);\n\n\tMcast_join(sockfd, sa, salen, (argc == 4) ? argv[3] : NULL, 0);\n\n\tloop(sockfd, salen);\t/* receive and print */\n\n\texit(0);\n}\n"
  },
  {
    "path": "mysdr/main.lc",
    "content": "#include    \"unp.h\"##  1 ##src/mysdr/main.c##\n\n#define SAP_NAME    \"sap.mcast.net\" /* default group name and port */##  2 ##src/mysdr/main.c##\n#define SAP_PORT    \"9875\"##  3 ##src/mysdr/main.c##\n\nvoid    loop(int, socklen_t);##  4 ##src/mysdr/main.c##\n\nint##  5 ##src/mysdr/main.c##\nmain(int argc, char **argv)##  6 ##src/mysdr/main.c##\n{##  7 ##src/mysdr/main.c##\n    int     sockfd;##  8 ##src/mysdr/main.c##\n    const int on = 1;##  9 ##src/mysdr/main.c##\n    socklen_t salen;## 10 ##src/mysdr/main.c##\n    struct sockaddr *sa;## 11 ##src/mysdr/main.c##\n\n    if (argc == 1)## 12 ##src/mysdr/main.c##\n        sockfd = Udp_client(SAP_NAME, SAP_PORT, (void **) &sa, &salen);## 13 ##src/mysdr/main.c##\n    else if (argc == 4)## 14 ##src/mysdr/main.c##\n        sockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);## 15 ##src/mysdr/main.c##\n    else## 16 ##src/mysdr/main.c##\n        err_quit(\"usage: mysdr <mcast-addr> <port#> <interface-name>\");## 17 ##src/mysdr/main.c##\n\n    Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 18 ##src/mysdr/main.c##\n    Bind(sockfd, sa, salen);## 19 ##src/mysdr/main.c##\n\n    Mcast_join(sockfd, sa, salen, (argc == 4) ? argv[3] : NULL, 0);## 20 ##src/mysdr/main.c##\n\n    loop(sockfd, salen);        /* receive and print */## 21 ##src/mysdr/main.c##\n\n    exit(0);## 22 ##src/mysdr/main.c##\n}## 23 ##src/mysdr/main.c##\n"
  },
  {
    "path": "mysdr/mysdr.h",
    "content": "#include\t\"unp.h\"\n\n#define\tSAP_VERSION\t\t\t1\n#define SAP_VERSION_MASK\t0xe0000000\n#define\tSAP_VERSION_SHIFT\t29\n#define\tSAP_IPV6\t\t\t0x10000000\n#define\tSAP_DELETE\t\t\t0x04000000\n#define\tSAP_ENCRYPTED\t\t0x02000000\n#define\tSAP_COMPRESSED\t\t0x01000000\n#define\tSAP_AUTHLEN_MASK\t0x00ff0000\n#define\tSAP_AUTHLEN_SHIFT\t16\n#define\tSAP_HASH_MASK\t\t0x0000ffff\n"
  },
  {
    "path": "mysdr/script.1",
    "content": "kohala % ./sdr\nFrom 128.102.84.134/2840\nv=0\no=shuttle 3050400397 3051818822 IN IP4 128.102.84.134\ns=NASA - Shuttle STS-79 Mission Coverage\ni=Pre-launch and mission coverage of    Shuttle Mission STS-79.  Launch    expected 9/16/96 with a mission    duration anticipated of 9-10 days.       STS-79 is the 4th in a series of joint   docking missions between the Shuttle   and the MIR Space Station.  This   session is being offered by NASA - Ames  Research Center as a public service to   the MBone community.\nu=http://www-pao.ksc.nasa.gov/kscpao/kscpao.htm\np=NASA ARC Digital Video Lab (415) 604-6145\ne=NASA ARC Digital Video Lab <mallard@mail.arc.nasa.gov>\nc=IN IP4 224.2.86.28/127\nt=3051608400 3052472400\nm=audio 19432 RTP/AVP 0\nm=video 61192 RTP/AVP 31\n \nFrom 143.106.13.10/1119\nv=0\no=vazquez 3051812968 3051813242 IN IP4 143.106.13.10\ns=Test IQ/Unicamp\ni=Video Test/IQ Unic\np=Pedro A M Vazquez +55 019 239 7253\ne=Pedro A M Vazquez <vazquez@kalypso.iqm.unicamp.br>\nt=3051811800 3052416600\nm=video 58960 rtp nv\nc=IN IP4 224.2.60.105/127\nm=whiteboard 43591 udp wb\nc=IN IP4 224.2.29.88/127\n \nFrom 131.202.70.81/47880\nv=0\no=spencer 3050069099 3050069347 IN IP4 131.202.70.81\ns=UNB / CSpace\ni=This is a low rate video transmission sent from the University of New Brunswick, in Fredericton, New Brunswick, from CSpace, offices for the Community Access Program.  Video is sent at ~20kbps, and audio is (usually) monitored as well.  This feed is coming through from the host breakers.educ.unb.ca.  If this is interferring with a scheduled broadcast, please let me know, and I will stop the transmission.  dwight (spencer@unb.ca)\nu=http://cspace.unb.ca/~spencer/\ne=Dwight E. Spencer <spencer@unb.ca>\np=Dwight E. Spencer +1 (506) 447 3153\nc=IN IP4 224.2.246.116/127\nt=3050019000 3052524600\nr=86400 86400 0\nm=audio 22378 RTP/AVP 5\nc=IN IP4 224.2.246.116/127\nm=video 61338 RTP/AVP 31\nc=IN IP4 224.2.210.189/127\nm=text 61044 udp nt\nc=IN IP4 224.2.147.133/127\n \n"
  },
  {
    "path": "mysdr/script.2",
    "content": "Script started on Sat Jul 12 15:51:28 1997\nkohala % ./mysdr\nFrom 140.247.157.193.1047\nv=0\no=karp 3077576976 3077577964 IN IP4 140.247.157.193\ns=Harvard's Aiken Computation Lab DEMOLITION\ni=Live broadcast of the demolition of Harvard University's Aiken Computation Lab, to make way for the new Computer Science building, Maxwell-Dworkin. Broadcast will include commentary on the event by Harvard faculty, administrators, and students. Filmed in Destruct-O-Vision, from an unmanned camera INSIDE Aiken.\nu=http://www.eecs.harvard.edu/aiken-go-boom\ne=Brad Karp <karp@eecs.harvard.edu>\np=Brad Karp +1 617-661-4979\nc=IN IP4 224.2.156.29/127\nt=3078820800 3080030400\na=tool:sdr v2.4a6\na=type:broadcast\nm=audio 21226 RTP/AVP 5\nc=IN IP4 224.2.156.29/127\na=ptime:40\nm=video 49998 RTP/AVP 31\nc=IN IP4 224.2.237.48/127\n\nFrom 140.247.157.193.1047\nv=0\no=karp 3077576976 3077577964 IN IP4 140.247.157.193\ns=Harvard's Aiken Computation Lab DEMOLITION\ni=Live broadcast of the demolition of Harvard University's Aiken Computation Lab, to make way for the new Computer Science building, Maxwell-Dworkin. Broadcast will include commentary on the event by Harvard faculty, administrators, and students. Filmed in Destruct-O-Vision, from an unmanned camera INSIDE Aiken.\nu=http://www.eecs.harvard.edu/aiken-go-boom\ne=Brad Karp <karp@eecs.harvard.edu>\np=Brad Karp +1 617-661-4979\nc=IN IP4 224.2.156.29/127\nt=3078820800 3080030400\na=tool:sdr v2.4a6\na=type:broadcast\nm=audio 21226 RTP/AVP 5\nc=IN IP4 224.2.156.29/127\na=ptime:40\nm=video 49998 RTP/AVP 31\nc=IN IP4 224.2.237.48/127\n\nFrom 128.223.32.151.40710\nv=0\no=llynch 3073936480 3075057183 IN IP4 128.223.32.151\ns=UO Presents KWVA Campus Radio\ni=University of Oregon alternative radio\nu=http://gladstone.uoregon.edu/~kwva/\ne=Lucy Lynch (University of Oregon) <llynch@darkwing.uoregon.edu>\np=Lucy Lynch (University of Oregon) (541) 346-1774\nc=IN IP4 224.2.240.123/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 24676 RTP/AVP 0\nc=IN IP4 224.2.240.123/127\na=ptime:40\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 141.213.8.193.32800\nv=0\no=sugih 3066072073 3066072112 IN IP4 141.213.8.193\ns=UMich IRL (private)\ni=UMich private use\nu=http://irl.eecs.umich.edu/jamin/\ne=UMich IRL <jamin@eecs.umich.edu>\np=UMich IRL +1 313 763 1583\nc=IN IP4 224.2.143.56/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 21690 RTP/AVP 0\nc=IN IP4 224.2.143.56/127\na=ptime:40\nm=video 51990 RTP/AVP 31\nc=IN IP4 224.2.200.96/127\nm=whiteboard 47284 udp wb\nc=IN IP4 224.2.239.141/127\nm=text 54906 udp nt\nc=IN IP4 224.2.242.3/127\n\nFrom 141.213.8.193.32800\nv=0\no=sugih 3066072073 3066072112 IN IP4 141.213.8.193\ns=UMich IRL (private)\ni=UMich private use\nu=http://irl.eecs.umich.edu/jamin/\ne=UMich IRL <jamin@eecs.umich.edu>\np=UMich IRL +1 313 763 1583\nc=IN IP4 224.2.143.56/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 21690 RTP/AVP 0\nc=IN IP4 224.2.143.56/127\na=ptime:40\nm=video 51990 RTP/AVP 31\nc=IN IP4 224.2.200.96/127\nm=whiteboard 47284 udp wb\nc=IN IP4 224.2.239.141/127\nm=text 54906 udp nt\nc=IN IP4 224.2.242.3/127\n\nFrom 146.246.238.52.33095\nv=0\no=dgomes 3076197571 3076936543 IN IP4 146.246.238.52\ns=Diesel Combustion Collaboratory\ni=This is a research MBone session initiated from the Sandia National Laboratory, California site.  This session will facilitate collaboration among the participants in a distributed research project, specifically the Heavy Duty Diesel Combustion CRADA using standard MBone A/V tools. For more information, http://www-collab.ca.sandia.gov/\nu=www-collab.ca.sandia.gov/\ne=Diesel Combustion Collaboratory <dgomes@ca.sandia.gov>\np=Diesel Combustion Collaboratory 510-294-1479\nc=IN IP4 239.32.1.200/127\nt=3076142400 3078648000\nr=86400 86400 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 23164 RTP/AVP 0\nc=IN IP4 239.32.1.200/127\na=ptime:40\nm=video 53626 RTP/AVP 31\nc=IN IP4 239.32.1.200/127\nm=whiteboard 33870 udp wb\nc=IN IP4 239.32.1.200/127\na=orient:portrait\n\nFrom 209.1.118.230.9875\nv=0\no=Administrator 868490998 868548530 IN IP4 209.1.118.230 \ns=Ginacarlo's TV\ni=Giancarlo's TV Feed from ICAST in Los Gatos\nu=http://www.icast.com/\ne=sales@icast.com\np=+01 408 8740700\nt=3080337120 3080689920\nr=79200 7200 0\na=recvonly\na=tool:ICAST TCC Server V1.0/Build 1-1010\nm=audio 4640 RTP/AVP 0\nc=IN IP4 224.2.100.120/127\nm=video 4920 RTP/AVP 31\nc=IN IP4 224.2.100.120/127\nb=AS:123\na=framerate:20\na=quality:7\na=grayed:0\n\nFrom 209.1.118.230.9875\nv=0\no=Administrator 868490998 868548530 IN IP4 209.1.118.230 \ns=Ginacarlo's TV\ni=Giancarlo's TV Feed from ICAST in Los Gatos\nu=http://www.icast.com/\ne=sales@icast.com\np=+01 408 8740700\nt=3080337120 3080689920\nr=79200 7200 0\na=recvonly\na=tool:ICAST TCC Server V1.0/Build 1-1010\nm=audio 4640 RTP/AVP 0\nc=IN IP4 224.2.100.120/127\nm=video 4920 RTP/AVP 31\nc=IN IP4 224.2.100.120/127\nb=AS:123\na=framerate:20\na=quality:7\na=grayed:0\n\nFrom 128.146.222.100.32915\nv=0\no=maf 3076346251 3077639429 IN IP4 128.146.222.100\ns=Recent Advances in Networking Seminar at OSU\ni=Live Transmission of Professor Raj Jain's class CIS788.08q:  Recent Advances in Networking every Tuesday and Thursday at 17:30 to 18:45 EDT, Open to public.  E-mail questions to mbone@netlab.ohio-state.edu.  See URL for list of topics. \nu=http://www.cis.ohio-state.edu/~jain/cis788-97/schedule.htm\np=Mark Fullmer (Ohio State) 614-292-6159\ne=Mark Fullmer (Ohio State) <maf@net.ohio-state.edu>\nt=3078163800 3079380600\nr=604800 7200 0\na=tool:sdr v2.3a1\na=type:broadcast\nm=audio 19922 RTP/AVP 0\nc=IN IP4 224.2.232.28/127\na=ptime:40\nm=video 60266 RTP/AVP 31\nc=IN IP4 224.2.159.63/127\n\nFrom 128.146.222.100.32915\nv=0\no=maf 3076346251 3077639429 IN IP4 128.146.222.100\ns=Recent Advances in Networking Seminar at OSU\ni=Live Transmission of Professor Raj Jain's class CIS788.08q:  Recent Advances in Networking every Tuesday and Thursday at 17:30 to 18:45 EDT, Open to public.  E-mail questions to mbone@netlab.ohio-state.edu.  See URL for list of topics. \nu=http://www.cis.ohio-state.edu/~jain/cis788-97/schedule.htm\np=Mark Fullmer (Ohio State) 614-292-6159\ne=Mark Fullmer (Ohio State) <maf@net.ohio-state.edu>\nt=3078163800 3079380600\nr=604800 7200 0\na=tool:sdr v2.3a1\na=type:broadcast\nm=audio 19922 RTP/AVP 0\nc=IN IP4 224.2.232.28/127\na=ptime:40\nm=video 60266 RTP/AVP 31\nc=IN IP4 224.2.159.63/127\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 36.24.0.23.35912\nv=0\no=- 19357 1 IN IP4 171.64.2.89\ns=The Stanford Channel\ni=In order to support testing and to provide a consistent source of audio and video material, Stanford University is transmitting the Stanford Channel, M-F, 1-5p PDT. \nu=http://tsc.stanford.edu/tsc/\na=admin:Jim Knox\ne=Jim Knox <mbone-support@lists.stanford.edu>\np=Jim Knox <415-723-5100>\nt=3076084800 3084048000\nr=7d 4h 0 1d 2d 3d 4d\na=type:broadcast\na=live\na=channel:External Stanford Channel\na=tool:IP/TV Program Guide 1.5.97\nm=video 62970 RTP/AVP 31 32 96\nc=IN IP4 224.2.205.145/127\nb=AS:2500\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 17754 RTP/AVP 3\nc=IN IP4 224.2.170.73/127\n\nFrom 210.115.193.22.32819\nv=0\no=root 3076799605 3076799657 IN IP4 210.115.193.22\ns=KBS 1 TV\ni=Korean Broadcasting System TV\nu=www.kbs.co.kr\np=KBS 1 TV 82-2-781-2562\ne=KBS 1 TV <webmaster@kbsnt.kbs.co.kr>\nt=3076799400 3079225800\nr=1209600 7200 0\nm=audio 20698 RTP/AVP 0\nc=IN IP4 224.2.235.192/127\nm=video 58150 RTP/AVP 31\nc=IN IP4 224.2.202.109/127\n\nFrom 36.24.0.23.35912\nv=0\no=- 9787 3 IN IP4 36.85.0.135\ns=45th Annual SIAM Meeting\ni=MSRI, with the cooperation of Stanford University and SIAM, will broadcast six of the principal lectures from the 45th annual SIAM meeting. Notes available at http://www.msri.org/lecturenotes/97/SIAM/ \nu=http://www.siam.org\na=admin:David Hoffman\ne=David Hoffman <mbone@msri.org>\np=David Hoffman <510-643-6071>\nt=3077967600 3078183600\nr=7d 12h 0 1d 2d\na=type:broadcast\na=live\na=channel:MSRI Channel\na=tool:IP/TV Program Guide 1.5.97\nm=video 52704 RTP/AVP 31 32 96\nc=IN IP4 224.2.220.253/127\nb=AS:128\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30372 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.141.197/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 146.139.72.5.32924\nv=0\no=root 3077452673 3077455201 IN IP4 146.139.72.5\ns=ANL TelePresence Microscopy Site/Materials MicroCharacterization Collaboratory\ni=This is  ANL TelePresence Microscopy Site which is  part of the DoE 2000 Materials Microcharacterization Collaboratory. It facilitates  on-line access to unique resourses at the ANL AAEM and through the MMC, other resources in the Collaboratory at member sites (ORNL, LBNL, Univ. of Illinois and NIST).  More information about the TPM and the MMC can be found at http://tpm.amc.anl.gov/mmc\nu=http://tpm.amc.anl.gov\np=Nestor J. Zaluzec 630-252-7901\ne=Nestor J. Zaluzec <Zaluzec@aaem.amc.anl.gov>\nt=3077445600 3079900800\nr=86400 36000 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 27028 RTP/AVP 0\nc=IN IP4 224.2.222.131/127\na=ptime:40\nm=video 58800 RTP/AVP 31\nc=IN IP4 224.2.141.204/127\n\nFrom 146.139.72.5.32924\nv=0\no=root 3077452673 3077455201 IN IP4 146.139.72.5\ns=ANL TelePresence Microscopy Site/Materials MicroCharacterization Collaboratory\ni=This is  ANL TelePresence Microscopy Site which is  part of the DoE 2000 Materials Microcharacterization Collaboratory. It facilitates  on-line access to unique resourses at the ANL AAEM and through the MMC, other resources in the Collaboratory at member sites (ORNL, LBNL, Univ. of Illinois and NIST).  More information about the TPM and the MMC can be found at http://tpm.amc.anl.gov/mmc\nu=http://tpm.amc.anl.gov\np=Nestor J. Zaluzec 630-252-7901\ne=Nestor J. Zaluzec <Zaluzec@aaem.amc.anl.gov>\nt=3077445600 3079900800\nr=86400 36000 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 27028 RTP/AVP 0\nc=IN IP4 224.2.222.131/127\na=ptime:40\nm=video 58800 RTP/AVP 31\nc=IN IP4 224.2.141.204/127\n\nFrom 128.102.84.134.1085\nv=0\no=shuttle 3075630923 3075633526 IN IP4 128.102.84.134\ns=NASA Space Shuttle STS-94\ni=Video/Audio broadcast of NASA space shuttle mission STS-94, Microgravity Science Laboratory-1.  This session is being broadcast as a service to the MBONE community by NASA-Ames Reseach Center.\nu=http://www-pao.ksc.nasa.gov/kscpao/kscpao.htm\ne=NASA - ARC Digital Video Lab <mallard@mail.arc.nasa.gov\ne=Brian Tonner (UWM) <tonner@csd.uwm.edu>\ne=Referenzzentrum __ <mmt-ref@tu-dresden.de>       \ne=IN IP4 224.2.212.30/75\np=NASA - ARC Digital Video Lab (415) 604-6145\np=Brian Tonner (at LBL) 510-486-5590\np=Brian Tonner (at UWM) 414-229-4626\nc=IN IP4 224.2.210.20/127\nt=3076354800 3078774000\nm=audio 24680 RTP/AVP 0\nc=IN IP4 224.2.210.20/127\nm=video 56062 RTP/AVP 31\nc=IN IP4 224.2.210.20/127\n\nFrom 129.89.142.50.1175\nv=0\no=james 3054298051 3054298223 IN IP4 129.89.142.50\ns=FreeBSD Lounge\ni=Channel to discuss FreeBSD related issues.  Please keep video bandwidth below 64kbps.\ne=Jim Lowe <james@cs.uwm.edu>\np=Jim Lowe (414) 229-6634\nc=IN IP4 224.2.100.100/127\nt=0 0\na=tool:sdr v2.2a23\na=type:test\nm=audio 16400 RTP/AVP 0\nc=IN IP4 224.2.100.100/127\na=ptime:40\nm=video 49200 RTP/AVP 31\nc=IN IP4 224.2.100.102/127\nm=whiteboard 32800 udp wb\nc=IN IP4 224.2.100.101/127\na=orient:portrait\nm=text 32900 udp nt\nc=IN IP4 224.2.100.103/127\n\nFrom 129.89.142.50.1175\nv=0\no=james 3054298051 3054298223 IN IP4 129.89.142.50\ns=FreeBSD Lounge\ni=Channel to discuss FreeBSD related issues.  Please keep video bandwidth below 64kbps.\ne=Jim Lowe <james@cs.uwm.edu>\np=Jim Lowe (414) 229-6634\nc=IN IP4 224.2.100.100/127\nt=0 0\na=tool:sdr v2.2a23\na=type:test\nm=audio 16400 RTP/AVP 0\nc=IN IP4 224.2.100.100/127\na=ptime:40\nm=video 49200 RTP/AVP 31\nc=IN IP4 224.2.100.102/127\nm=whiteboard 32800 udp wb\nc=IN IP4 224.2.100.101/127\na=orient:portrait\nm=text 32900 udp nt\nc=IN IP4 224.2.100.103/127\n\nFrom 209.1.118.230.9875\nv=0\no=Administrator 868490998 868548530 IN IP4 209.1.118.230 \ns=Ginacarlo's TV\ni=Giancarlo's TV Feed from ICAST in Los Gatos\nu=http://www.icast.com/\ne=sales@icast.com\np=+01 408 8740700\nt=3080337120 3080689920\nr=79200 7200 0\na=recvonly\na=tool:ICAST TCC Server V1.0/Build 1-1010\nm=audio 4640 RTP/AVP 0\nc=IN IP4 224.2.100.120/127\nm=video 4920 RTP/AVP 31\nc=IN IP4 224.2.100.120/127\nb=AS:123\na=framerate:20\na=quality:7\na=grayed:0\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 198.147.175.43.5434\nv=0\no=- 53099 27 IN IP4 198.147.175.59\ns=The World\ni=live feed of daily global radio news show \na=admin:Bob Lyons\ne=Bob Lyons <feedback@wgbh.org>\nt=3076945200 3079465200\nr=1d 4h 0\na=type:broadcast\na=live\na=channel:WGBH\na=tool:IP/TV Program Guide 1.5.93\nm=video 65036 RTP/AVP 31 32 96\nc=IN IP4 224.2.227.248/127\nb=AS:100\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30970 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.140.132/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 198.147.175.43.5434\nv=0\no=- 53099 27 IN IP4 198.147.175.59\ns=The World\ni=live feed of daily global radio news show \na=admin:Bob Lyons\ne=Bob Lyons <feedback@wgbh.org>\nt=3076945200 3079465200\nr=1d 4h 0\na=type:broadcast\na=live\na=channel:WGBH\na=tool:IP/TV Program Guide 1.5.93\nm=video 65036 RTP/AVP 31 32 96\nc=IN IP4 224.2.227.248/127\nb=AS:100\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30970 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.140.132/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 128.223.32.151.40710\nv=0\no=llynch 3075129061 3075129246 IN IP4 128.223.32.151\ns=UO Presents KWAX Classical Radio\ni=University of Oregon sponsored classical radio station KWAX-FM\nu=http://darkwing.uoregon.edu/~uocomm/\ne=Lucy Lynch (University of Oregon) <llynch@darkwing.uoegon.edu>\np=Lucy Lynch (University of Oregon) (541) 346-1774\nc=IN IP4 224.2.246.13/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 30554 RTP/AVP 0\nc=IN IP4 224.2.246.13/127\na=ptime:40\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 199.94.220.184.1277\nv=0\no=jhawk 3048365419 3049230379 IN IP4 199.94.220.184\ns=MBone RTP Audio\ni=Audio conference on vat's former default multicast address. This replaces sd's \"MBone Audio\".\ne=John Hawkinson <jhawk@bbnplanet.com>\np=John Hawkinson +1 617 873 3180\nc=IN IP4 224.2.0.1/191\nt=3048724800 3082593600\na=tool:sdr v2.3a1+jhawk's gdb script\na=type:meeting\nm=audio 23456 RTP/AVP 0\nc=IN IP4 224.2.0.1/191\na=ptime:40\n\nFrom 199.94.220.184.1277\nv=0\no=jhawk 3048365419 3049230379 IN IP4 199.94.220.184\ns=MBone RTP Audio\ni=Audio conference on vat's former default multicast address. This replaces sd's \"MBone Audio\".\ne=John Hawkinson <jhawk@bbnplanet.com>\np=John Hawkinson +1 617 873 3180\nc=IN IP4 224.2.0.1/191\nt=3048724800 3082593600\na=tool:sdr v2.3a1+jhawk's gdb script\na=type:meeting\nm=audio 23456 RTP/AVP 0\nc=IN IP4 224.2.0.1/191\na=ptime:40\n\nFrom 36.24.0.23.35920\nv=0\no=- 19357 1 IN IP4 171.64.2.89\ns=The Stanford Channel\ni=In order to support testing and to provide a consistent source of audio and video material, Stanford University is transmitting the Stanford Channel, M-F, 1-5p PDT. \nu=http://tsc.stanford.edu/tsc/\na=admin:Jim Knox\ne=Jim Knox <mbone-support@lists.stanford.edu>\np=Jim Knox <415-723-5100>\nt=3076084800 3084048000\nr=7d 4h 0 1d 2d 3d 4d\na=type:broadcast\na=live\na=channel:External Stanford Channel\na=tool:IP/TV Program Guide 1.5.97\nm=video 62970 RTP/AVP 31 32 96\nc=IN IP4 224.2.205.145/127\nb=AS:2500\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 17754 RTP/AVP 3\nc=IN IP4 224.2.170.73/127\n\nFrom 146.246.238.52.33095\nv=0\no=dgomes 3076197571 3076936543 IN IP4 146.246.238.52\ns=Diesel Combustion Collaboratory\ni=This is a research MBone session initiated from the Sandia National Laboratory, California site.  This session will facilitate collaboration among the participants in a distributed research project, specifically the Heavy Duty Diesel Combustion CRADA using standard MBone A/V tools. For more information, http://www-collab.ca.sandia.gov/\nu=www-collab.ca.sandia.gov/\ne=Diesel Combustion Collaboratory <dgomes@ca.sandia.gov>\np=Diesel Combustion Collaboratory 510-294-1479\nc=IN IP4 239.32.1.200/127\nt=3076142400 3078648000\nr=86400 86400 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 23164 RTP/AVP 0\nc=IN IP4 239.32.1.200/127\na=ptime:40\nm=video 53626 RTP/AVP 31\nc=IN IP4 239.32.1.200/127\nm=whiteboard 33870 udp wb\nc=IN IP4 239.32.1.200/127\na=orient:portrait\n\nFrom 36.24.0.23.35920\nv=0\no=- 9787 3 IN IP4 36.85.0.135\ns=45th Annual SIAM Meeting\ni=MSRI, with the cooperation of Stanford University and SIAM, will broadcast six of the principal lectures from the 45th annual SIAM meeting. Notes available at http://www.msri.org/lecturenotes/97/SIAM/ \nu=http://www.siam.org\na=admin:David Hoffman\ne=David Hoffman <mbone@msri.org>\np=David Hoffman <510-643-6071>\nt=3077967600 3078183600\nr=7d 12h 0 1d 2d\na=type:broadcast\na=live\na=channel:MSRI Channel\na=tool:IP/TV Program Guide 1.5.97\nm=video 52704 RTP/AVP 31 32 96\nc=IN IP4 224.2.220.253/127\nb=AS:128\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30372 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.141.197/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 128.9.160.43.1290\nv=0\no=estrin 3077287048 3077287168 IN IP4 128.9.160.43\ns=PIM\ni=Weekly discussion of PIM and related issues\np=310 822 1511 x253\ne=estrin@isi.edu\nt=3077287200 3079713600\nr=604800 7200 0\na=tool:sdr v2.2a23\na=type:test\nm=audio 26446 RTP/AVP 5\nc=IN IP4 224.2.237.137/127\na=ptime:40\nm=whiteboard 48894 udp wb\nc=IN IP4 224.2.213.254/127\nm=text 60262 udp nt\nc=IN IP4 224.2.186.221/127\n\nFrom 210.115.193.22.32819\nv=0\no=root 3076799605 3076799657 IN IP4 210.115.193.22\ns=KBS 1 TV\ni=Korean Broadcasting System TV\nu=www.kbs.co.kr\np=KBS 1 TV 82-2-781-2562\ne=KBS 1 TV <webmaster@kbsnt.kbs.co.kr>\nt=3076799400 3079225800\nr=1209600 7200 0\nm=audio 20698 RTP/AVP 0\nc=IN IP4 224.2.235.192/127\nm=video 58150 RTP/AVP 31\nc=IN IP4 224.2.202.109/127\n\nFrom 141.213.8.193.32800\nv=0\no=sugih 3066072073 3066072112 IN IP4 141.213.8.193\ns=UMich IRL (private)\ni=UMich private use\nu=http://irl.eecs.umich.edu/jamin/\ne=UMich IRL <jamin@eecs.umich.edu>\np=UMich IRL +1 313 763 1583\nc=IN IP4 224.2.143.56/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 21690 RTP/AVP 0\nc=IN IP4 224.2.143.56/127\na=ptime:40\nm=video 51990 RTP/AVP 31\nc=IN IP4 224.2.200.96/127\nm=whiteboard 47284 udp wb\nc=IN IP4 224.2.239.141/127\nm=text 54906 udp nt\nc=IN IP4 224.2.242.3/127\n\nFrom 141.213.8.193.32800\nv=0\no=sugih 3066072073 3066072112 IN IP4 141.213.8.193\ns=UMich IRL (private)\ni=UMich private use\nu=http://irl.eecs.umich.edu/jamin/\ne=UMich IRL <jamin@eecs.umich.edu>\np=UMich IRL +1 313 763 1583\nc=IN IP4 224.2.143.56/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 21690 RTP/AVP 0\nc=IN IP4 224.2.143.56/127\na=ptime:40\nm=video 51990 RTP/AVP 31\nc=IN IP4 224.2.200.96/127\nm=whiteboard 47284 udp wb\nc=IN IP4 224.2.239.141/127\nm=text 54906 udp nt\nc=IN IP4 224.2.242.3/127\n\nFrom 209.1.118.230.9875\nv=0\no=Administrator 868490998 868548530 IN IP4 209.1.118.230 \ns=Ginacarlo's TV\ni=Giancarlo's TV Feed from ICAST in Los Gatos\nu=http://www.icast.com/\ne=sales@icast.com\np=+01 408 8740700\nt=3080337120 3080689920\nr=79200 7200 0\na=recvonly\na=tool:ICAST TCC Server V1.0/Build 1-1010\nm=audio 4640 RTP/AVP 0\nc=IN IP4 224.2.100.120/127\nm=video 4920 RTP/AVP 31\nc=IN IP4 224.2.100.120/127\nb=AS:123\na=framerate:20\na=quality:7\na=grayed:0\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 128.223.32.151.40710\nv=0\no=llynch 3073936480 3075057183 IN IP4 128.223.32.151\ns=UO Presents KWVA Campus Radio\ni=University of Oregon alternative radio\nu=http://gladstone.uoregon.edu/~kwva/\ne=Lucy Lynch (University of Oregon) <llynch@darkwing.uoregon.edu>\np=Lucy Lynch (University of Oregon) (541) 346-1774\nc=IN IP4 224.2.240.123/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 24676 RTP/AVP 0\nc=IN IP4 224.2.240.123/127\na=ptime:40\n\nFrom 128.102.84.134.1085\nv=0\no=shuttle 3075630923 3075633526 IN IP4 128.102.84.134\ns=NASA Space Shuttle STS-94\ni=Video/Audio broadcast of NASA space shuttle mission STS-94, Microgravity Science Laboratory-1.  This session is being broadcast as a service to the MBONE community by NASA-Ames Reseach Center.\nu=http://www-pao.ksc.nasa.gov/kscpao/kscpao.htm\ne=NASA - ARC Digital Video Lab <mallard@mail.arc.nasa.gov\ne=Brian Tonner (UWM) <tonner@csd.uwm.edu>\ne=Referenzzentrum __ <mmt-ref@tu-dresden.de>       \ne=IN IP4 224.2.212.30/75\np=NASA - ARC Digital Video Lab (415) 604-6145\np=Brian Tonner (at LBL) 510-486-5590\np=Brian Tonner (at UWM) 414-229-4626\nc=IN IP4 224.2.210.20/127\nt=3076354800 3078774000\nm=audio 24680 RTP/AVP 0\nc=IN IP4 224.2.210.20/127\nm=video 56062 RTP/AVP 31\nc=IN IP4 224.2.210.20/127\n\nFrom 134.95.100.200.58695\nv=0\no=maho 3077528617 3077529148 IN IP4 134.95.19.9\ns=Munich IETF Meeting - 1\nc=IN IP4 224.2.224.236/127\ni=The thirty-nineth IETF meeting will be held in Munich, Germany, 11-15 August 1997. Channel 1 contains sessions in room Congress AB.\nu=http://www.ietf.org/meetings/Munich.html\ne=Martin Horneffer (RRZK) <Horneffer@rrz.Uni-Koeln.DE>\np=Martin Horneffer (RRZK) +49-221-4785587\nk=\nt=3080271600 3080617200\na=tool:CDT sapAnnouncer 1.1\na=type:test\nm=audio 30284 RTP/AVP 0\nc=IN IP4 224.2.224.236/127\na=ptime:40\nm=video 64318 RTP/AVP 31\nc=IN IP4 224.2.191.28/127\nm=whiteboard 43063 udp wb\nc=IN IP4 224.2.164.26/127\nm=text 65035 udp nt\nc=IN IP4 224.2.148.199/127\n\nFrom 134.95.100.200.58695\nv=0\no=maho 3077529159 3077529337 IN IP4 134.95.19.9\ns=Munich IETF Meeting - 2\nc=IN IP4 224.2.128.106/127\ni=The thirty-nineth IETF meeting will be held in Munich, Germany, 11-15 August 1997. Channel 1 contains sessions in room Congress 1.\nu=http://www.ietf.org/meetings/Munich.html\ne=Martin Horneffer (RRZK) <Horneffer@rrz.Uni-Koeln.DE>\np=Martin Horneffer (RRZK) +49-221-4785587\nk=\nt=3080271600 3080617200\na=tool:CDT sapAnnouncer 1.1\na=type:test\nm=audio 25056 RTP/AVP 0\nc=IN IP4 224.2.128.106/127\na=ptime:40\nm=video 55020 RTP/AVP 31\nc=IN IP4 224.2.216.39/127\nm=whiteboard 47819 udp wb\nc=IN IP4 224.2.139.138/127\nm=text 50930 udp nt\nc=IN IP4 224.2.161.177/127\n\nFrom 134.95.100.200.58695\nv=0\no=maho 3077528617 3077529148 IN IP4 134.95.19.9\ns=Munich IETF Meeting - 1\nc=IN IP4 224.2.224.236/127\ni=The thirty-nineth IETF meeting will be held in Munich, Germany, 11-15 August 1997. Channel 1 contains sessions in room Congress AB.\nu=http://www.ietf.org/meetings/Munich.html\ne=Martin Horneffer (RRZK) <Horneffer@rrz.Uni-Koeln.DE>\np=Martin Horneffer (RRZK) +49-221-4785587\nk=\nt=3080271600 3080617200\na=tool:CDT sapAnnouncer 1.1\na=type:test\nm=audio 30284 RTP/AVP 0\nc=IN IP4 224.2.224.236/127\na=ptime:40\nm=video 64318 RTP/AVP 31\nc=IN IP4 224.2.191.28/127\nm=whiteboard 43063 udp wb\nc=IN IP4 224.2.164.26/127\nm=text 65035 udp nt\nc=IN IP4 224.2.148.199/127\n\nFrom 128.9.160.67.1286\nv=0\no=kannan 3077640111 3077640271 IN IP4 128.9.160.67\ns=VINT (private)\ni=Virtual conference room for VINT developers\nu=http://netweb.usc.edu/vint\ne=Kannan Varadhan <kannan@catarina.usc.edu>\np=Kannan Varadhan +1 310 822 1511 x742\nc=IN IP4 224.2.211.93/127\nt=0 0\na=tool:sdr v2.4a6\na=type:meeting\nm=audio 32390 RTP/AVP 5\nc=IN IP4 224.2.211.93/127\na=ptime:40\nm=whiteboard 44600 udp wb\nc=IN IP4 224.2.163.53/127\na=orient:landscape\nm=text 51493 udp nt\nc=IN IP4 224.2.208.110/127\n\nFrom 128.146.222.100.32915\nv=0\no=maf 3076346251 3077639429 IN IP4 128.146.222.100\ns=Recent Advances in Networking Seminar at OSU\ni=Live Transmission of Professor Raj Jain's class CIS788.08q:  Recent Advances in Networking every Tuesday and Thursday at 17:30 to 18:45 EDT, Open to public.  E-mail questions to mbone@netlab.ohio-state.edu.  See URL for list of topics. \nu=http://www.cis.ohio-state.edu/~jain/cis788-97/schedule.htm\np=Mark Fullmer (Ohio State) 614-292-6159\ne=Mark Fullmer (Ohio State) <maf@net.ohio-state.edu>\nt=3078163800 3079380600\nr=604800 7200 0\na=tool:sdr v2.3a1\na=type:broadcast\nm=audio 19922 RTP/AVP 0\nc=IN IP4 224.2.232.28/127\na=ptime:40\nm=video 60266 RTP/AVP 31\nc=IN IP4 224.2.159.63/127\n\nFrom 128.146.222.100.32915\nv=0\no=maf 3076346251 3077639429 IN IP4 128.146.222.100\ns=Recent Advances in Networking Seminar at OSU\ni=Live Transmission of Professor Raj Jain's class CIS788.08q:  Recent Advances in Networking every Tuesday and Thursday at 17:30 to 18:45 EDT, Open to public.  E-mail questions to mbone@netlab.ohio-state.edu.  See URL for list of topics. \nu=http://www.cis.ohio-state.edu/~jain/cis788-97/schedule.htm\np=Mark Fullmer (Ohio State) 614-292-6159\ne=Mark Fullmer (Ohio State) <maf@net.ohio-state.edu>\nt=3078163800 3079380600\nr=604800 7200 0\na=tool:sdr v2.3a1\na=type:broadcast\nm=audio 19922 RTP/AVP 0\nc=IN IP4 224.2.232.28/127\na=ptime:40\nm=video 60266 RTP/AVP 31\nc=IN IP4 224.2.159.63/127\n\nFrom 128.9.160.67.1286\nv=0\no=kannan 3076332385 3076332494 IN IP4 128.9.160.67\ns=USC-CS dgroup VR conference room (private)\ni=Watering hole for the USC-NIL lab members\nu=http://netweb.usc.edu/\ne=Kannan Varadhan <kannan@catarina.usc.edu>\np=Kannan Varadhan +1 310 822 1511 x742\nc=IN IP4 224.2.212.30/75\nt=0 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 45144 RTP/AVP 5\nc=IN IP4 224.2.212.30/75\na=ptime:40\nm=whiteboard 65304 udp wb\nc=IN IP4 224.2.212.30/75\na=orient:landscape\n\nFrom 198.147.175.43.5435\nv=0\no=- 53099 27 IN IP4 198.147.175.59\ns=The World\ni=live feed of daily global radio news show \na=admin:Bob Lyons\ne=Bob Lyons <feedback@wgbh.org>\nt=3076945200 3079465200\nr=1d 4h 0\na=type:broadcast\na=live\na=channel:WGBH\na=tool:IP/TV Program Guide 1.5.93\nm=video 65036 RTP/AVP 31 32 96\nc=IN IP4 224.2.227.248/127\nb=AS:100\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30970 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.140.132/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 198.147.175.43.5435\nv=0\no=- 53099 27 IN IP4 198.147.175.59\ns=The World\ni=live feed of daily global radio news show \na=admin:Bob Lyons\ne=Bob Lyons <feedback@wgbh.org>\nt=3076945200 3079465200\nr=1d 4h 0\na=type:broadcast\na=live\na=channel:WGBH\na=tool:IP/TV Program Guide 1.5.93\nm=video 65036 RTP/AVP 31 32 96\nc=IN IP4 224.2.227.248/127\nb=AS:100\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30970 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.140.132/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 146.139.72.5.32924\nv=0\no=root 3077452673 3077455201 IN IP4 146.139.72.5\ns=ANL TelePresence Microscopy Site/Materials MicroCharacterization Collaboratory\ni=This is  ANL TelePresence Microscopy Site which is  part of the DoE 2000 Materials Microcharacterization Collaboratory. It facilitates  on-line access to unique resourses at the ANL AAEM and through the MMC, other resources in the Collaboratory at member sites (ORNL, LBNL, Univ. of Illinois and NIST).  More information about the TPM and the MMC can be found at http://tpm.amc.anl.gov/mmc\nu=http://tpm.amc.anl.gov\np=Nestor J. Zaluzec 630-252-7901\ne=Nestor J. Zaluzec <Zaluzec@aaem.amc.anl.gov>\nt=3077445600 3079900800\nr=86400 36000 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 27028 RTP/AVP 0\nc=IN IP4 224.2.222.131/127\na=ptime:40\nm=video 58800 RTP/AVP 31\nc=IN IP4 224.2.141.204/127\n\nFrom 146.139.72.5.32924\nv=0\no=root 3077452673 3077455201 IN IP4 146.139.72.5\ns=ANL TelePresence Microscopy Site/Materials MicroCharacterization Collaboratory\ni=This is  ANL TelePresence Microscopy Site which is  part of the DoE 2000 Materials Microcharacterization Collaboratory. It facilitates  on-line access to unique resourses at the ANL AAEM and through the MMC, other resources in the Collaboratory at member sites (ORNL, LBNL, Univ. of Illinois and NIST).  More information about the TPM and the MMC can be found at http://tpm.amc.anl.gov/mmc\nu=http://tpm.amc.anl.gov\np=Nestor J. Zaluzec 630-252-7901\ne=Nestor J. Zaluzec <Zaluzec@aaem.amc.anl.gov>\nt=3077445600 3079900800\nr=86400 36000 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 27028 RTP/AVP 0\nc=IN IP4 224.2.222.131/127\na=ptime:40\nm=video 58800 RTP/AVP 31\nc=IN IP4 224.2.141.204/127\n\nFrom 140.247.157.193.1047\nv=0\no=karp 3077576976 3077577964 IN IP4 140.247.157.193\ns=Harvard's Aiken Computation Lab DEMOLITION\ni=Live broadcast of the demolition of Harvard University's Aiken Computation Lab, to make way for the new Computer Science building, Maxwell-Dworkin. Broadcast will include commentary on the event by Harvard faculty, administrators, and students. Filmed in Destruct-O-Vision, from an unmanned camera INSIDE Aiken.\nu=http://www.eecs.harvard.edu/aiken-go-boom\ne=Brad Karp <karp@eecs.harvard.edu>\np=Brad Karp +1 617-661-4979\nc=IN IP4 224.2.156.29/127\nt=3078820800 3080030400\na=tool:sdr v2.4a6\na=type:broadcast\nm=audio 21226 RTP/AVP 5\nc=IN IP4 224.2.156.29/127\na=ptime:40\nm=video 49998 RTP/AVP 31\nc=IN IP4 224.2.237.48/127\n\nFrom 140.247.157.193.1047\nv=0\no=karp 3077576976 3077577964 IN IP4 140.247.157.193\ns=Harvard's Aiken Computation Lab DEMOLITION\ni=Live broadcast of the demolition of Harvard University's Aiken Computation Lab, to make way for the new Computer Science building, Maxwell-Dworkin. Broadcast will include commentary on the event by Harvard faculty, administrators, and students. Filmed in Destruct-O-Vision, from an unmanned camera INSIDE Aiken.\nu=http://www.eecs.harvard.edu/aiken-go-boom\ne=Brad Karp <karp@eecs.harvard.edu>\np=Brad Karp +1 617-661-4979\nc=IN IP4 224.2.156.29/127\nt=3078820800 3080030400\na=tool:sdr v2.4a6\na=type:broadcast\nm=audio 21226 RTP/AVP 5\nc=IN IP4 224.2.156.29/127\na=ptime:40\nm=video 49998 RTP/AVP 31\nc=IN IP4 224.2.237.48/127\n\nFrom 209.1.118.230.9875\nv=0\no=Administrator 868490998 868548530 IN IP4 209.1.118.230 \ns=Ginacarlo's TV\ni=Giancarlo's TV Feed from ICAST in Los Gatos\nu=http://www.icast.com/\ne=sales@icast.com\np=+01 408 8740700\nt=3080337120 3080689920\nr=79200 7200 0\na=recvonly\na=tool:ICAST TCC Server V1.0/Build 1-1010\nm=audio 4640 RTP/AVP 0\nc=IN IP4 224.2.100.120/127\nm=video 4920 RTP/AVP 31\nc=IN IP4 224.2.100.120/127\nb=AS:123\na=framerate:20\na=quality:7\na=grayed:0\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 128.93.25.32.9875\nv=0\no=mbone 1782678111 3077454111 IN IP4 128.93.25.32\ns=WebCanal Test Channel\ni=Test of WebCanal push channel. For more information, please refer to http://webcanal.inria.fr/\nu=http://webcanal.inria.fr/\ne=mbone@monet.inria.fr\nt=0 0\na=tool:WCaster1.0b\na=pub:mbone\na=logo:http://webcanal.inria.fr/icons/webcanal.gif\na=cat:Test\na=aud:All\na=subs:Public Free\nm=midp 47130/2 MIDP/LRMP 0\nc=IN IP4 224.3.88.205/127/2\nb=AS:64\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 129.89.142.50.1175\nv=0\no=james 3054298051 3054298223 IN IP4 129.89.142.50\ns=FreeBSD Lounge\ni=Channel to discuss FreeBSD related issues.  Please keep video bandwidth below 64kbps.\ne=Jim Lowe <james@cs.uwm.edu>\np=Jim Lowe (414) 229-6634\nc=IN IP4 224.2.100.100/127\nt=0 0\na=tool:sdr v2.2a23\na=type:test\nm=audio 16400 RTP/AVP 0\nc=IN IP4 224.2.100.100/127\na=ptime:40\nm=video 49200 RTP/AVP 31\nc=IN IP4 224.2.100.102/127\nm=whiteboard 32800 udp wb\nc=IN IP4 224.2.100.101/127\na=orient:portrait\nm=text 32900 udp nt\nc=IN IP4 224.2.100.103/127\n\nFrom 129.89.142.50.1175\nv=0\no=james 3054298051 3054298223 IN IP4 129.89.142.50\ns=FreeBSD Lounge\ni=Channel to discuss FreeBSD related issues.  Please keep video bandwidth below 64kbps.\ne=Jim Lowe <james@cs.uwm.edu>\np=Jim Lowe (414) 229-6634\nc=IN IP4 224.2.100.100/127\nt=0 0\na=tool:sdr v2.2a23\na=type:test\nm=audio 16400 RTP/AVP 0\nc=IN IP4 224.2.100.100/127\na=ptime:40\nm=video 49200 RTP/AVP 31\nc=IN IP4 224.2.100.102/127\nm=whiteboard 32800 udp wb\nc=IN IP4 224.2.100.101/127\na=orient:portrait\nm=text 32900 udp nt\nc=IN IP4 224.2.100.103/127\n\nFrom 36.24.0.23.35921\nv=0\no=- 19357 1 IN IP4 171.64.2.89\ns=The Stanford Channel\ni=In order to support testing and to provide a consistent source of audio and video material, Stanford University is transmitting the Stanford Channel, M-F, 1-5p PDT. \nu=http://tsc.stanford.edu/tsc/\na=admin:Jim Knox\ne=Jim Knox <mbone-support@lists.stanford.edu>\np=Jim Knox <415-723-5100>\nt=3076084800 3084048000\nr=7d 4h 0 1d 2d 3d 4d\na=type:broadcast\na=live\na=channel:External Stanford Channel\na=tool:IP/TV Program Guide 1.5.97\nm=video 62970 RTP/AVP 31 32 96\nc=IN IP4 224.2.205.145/127\nb=AS:2500\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 17754 RTP/AVP 3\nc=IN IP4 224.2.170.73/127\n\nFrom 36.24.0.23.35921\nv=0\no=- 9787 3 IN IP4 36.85.0.135\ns=45th Annual SIAM Meeting\ni=MSRI, with the cooperation of Stanford University and SIAM, will broadcast six of the principal lectures from the 45th annual SIAM meeting. Notes available at http://www.msri.org/lecturenotes/97/SIAM/ \nu=http://www.siam.org\na=admin:David Hoffman\ne=David Hoffman <mbone@msri.org>\np=David Hoffman <510-643-6071>\nt=3077967600 3078183600\nr=7d 12h 0 1d 2d\na=type:broadcast\na=live\na=channel:MSRI Channel\na=tool:IP/TV Program Guide 1.5.97\nm=video 52704 RTP/AVP 31 32 96\nc=IN IP4 224.2.220.253/127\nb=AS:128\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30372 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.141.197/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 128.102.84.134.1085\nv=0\no=shuttle 3075630923 3075633526 IN IP4 128.102.84.134\ns=NASA Space Shuttle STS-94\ni=Video/Audio broadcast of NASA space shuttle mission STS-94, Microgravity Science Laboratory-1.  This session is being broadcast as a service to the MBONE community by NASA-Ames Reseach Center.\nu=http://www-pao.ksc.nasa.gov/kscpao/kscpao.htm\ne=NASA - ARC Digital Video Lab <mallard@mail.arc.nasa.gov\ne=Brian Tonner (UWM) <tonner@csd.uwm.edu>\ne=Referenzzentrum __ <mmt-ref@tu-dresden.de>       \ne=IN IP4 224.2.212.30/75\np=NASA - ARC Digital Video Lab (415) 604-6145\np=Brian Tonner (at LBL) 510-486-5590\np=Brian Tonner (at UWM) 414-229-4626\nc=IN IP4 224.2.210.20/127\nt=3076354800 3078774000\nm=audio 24680 RTP/AVP 0\nc=IN IP4 224.2.210.20/127\nm=video 56062 RTP/AVP 31\nc=IN IP4 224.2.210.20/127\n\nFrom 146.246.238.52.33095\nv=0\no=dgomes 3076197571 3076936543 IN IP4 146.246.238.52\ns=Diesel Combustion Collaboratory\ni=This is a research MBone session initiated from the Sandia National Laboratory, California site.  This session will facilitate collaboration among the participants in a distributed research project, specifically the Heavy Duty Diesel Combustion CRADA using standard MBone A/V tools. For more information, http://www-collab.ca.sandia.gov/\nu=www-collab.ca.sandia.gov/\ne=Diesel Combustion Collaboratory <dgomes@ca.sandia.gov>\np=Diesel Combustion Collaboratory 510-294-1479\nc=IN IP4 239.32.1.200/127\nt=3076142400 3078648000\nr=86400 86400 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 23164 RTP/AVP 0\nc=IN IP4 239.32.1.200/127\na=ptime:40\nm=video 53626 RTP/AVP 31\nc=IN IP4 239.32.1.200/127\nm=whiteboard 33870 udp wb\nc=IN IP4 239.32.1.200/127\na=orient:portrait\n\nFrom 210.115.193.22.32819\nv=0\no=root 3076799605 3076799657 IN IP4 210.115.193.22\ns=KBS 1 TV\ni=Korean Broadcasting System TV\nu=www.kbs.co.kr\np=KBS 1 TV 82-2-781-2562\ne=KBS 1 TV <webmaster@kbsnt.kbs.co.kr>\nt=3076799400 3079225800\nr=1209600 7200 0\nm=audio 20698 RTP/AVP 0\nc=IN IP4 224.2.235.192/127\nm=video 58150 RTP/AVP 31\nc=IN IP4 224.2.202.109/127\n\nFrom 199.94.220.184.1277\nv=0\no=jhawk 3048365419 3049230379 IN IP4 199.94.220.184\ns=MBone RTP Audio\ni=Audio conference on vat's former default multicast address. This replaces sd's \"MBone Audio\".\ne=John Hawkinson <jhawk@bbnplanet.com>\np=John Hawkinson +1 617 873 3180\nc=IN IP4 224.2.0.1/191\nt=3048724800 3082593600\na=tool:sdr v2.3a1+jhawk's gdb script\na=type:meeting\nm=audio 23456 RTP/AVP 0\nc=IN IP4 224.2.0.1/191\na=ptime:40\n\nFrom 199.94.220.184.1277\nv=0\no=jhawk 3048365419 3049230379 IN IP4 199.94.220.184\ns=MBone RTP Audio\ni=Audio conference on vat's former default multicast address. This replaces sd's \"MBone Audio\".\ne=John Hawkinson <jhawk@bbnplanet.com>\np=John Hawkinson +1 617 873 3180\nc=IN IP4 224.2.0.1/191\nt=3048724800 3082593600\na=tool:sdr v2.3a1+jhawk's gdb script\na=type:meeting\nm=audio 23456 RTP/AVP 0\nc=IN IP4 224.2.0.1/191\na=ptime:40\n\nFrom 128.223.32.151.40710\nv=0\no=llynch 3075129061 3075129246 IN IP4 128.223.32.151\ns=UO Presents KWAX Classical Radio\ni=University of Oregon sponsored classical radio station KWAX-FM\nu=http://darkwing.uoregon.edu/~uocomm/\ne=Lucy Lynch (University of Oregon) <llynch@darkwing.uoegon.edu>\np=Lucy Lynch (University of Oregon) (541) 346-1774\nc=IN IP4 224.2.246.13/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 30554 RTP/AVP 0\nc=IN IP4 224.2.246.13/127\na=ptime:40\n\nFrom 209.1.118.230.9875\nv=0\no=Administrator 868490998 868548530 IN IP4 209.1.118.230 \ns=Ginacarlo's TV\ni=Giancarlo's TV Feed from ICAST in Los Gatos\nu=http://www.icast.com/\ne=sales@icast.com\np=+01 408 8740700\nt=3080337120 3080689920\nr=79200 7200 0\na=recvonly\na=tool:ICAST TCC Server V1.0/Build 1-1010\nm=audio 4640 RTP/AVP 0\nc=IN IP4 224.2.100.120/127\nm=video 4920 RTP/AVP 31\nc=IN IP4 224.2.100.120/127\nb=AS:123\na=framerate:20\na=quality:7\na=grayed:0\n\nFrom 198.147.175.43.5436\nv=0\no=- 53099 27 IN IP4 198.147.175.59\ns=The World\ni=live feed of daily global radio news show \na=admin:Bob Lyons\ne=Bob Lyons <feedback@wgbh.org>\nt=3076945200 3079465200\nr=1d 4h 0\na=type:broadcast\na=live\na=channel:WGBH\na=tool:IP/TV Program Guide 1.5.93\nm=video 65036 RTP/AVP 31 32 96\nc=IN IP4 224.2.227.248/127\nb=AS:100\na=quality:7\na=framerate:15\na=rtpmap:96 WBIH/90000\nm=audio 30970 RTP/AVP 0 14 3 5 96 97 98 99 100 101 102 103\nc=IN IP4 224.2.140.132/127\na=rtpmap:96 L8/22050/2\na=rtpmap:97 L8/22050\na=rtpmap:98 L8/11025/2\na=rtpmap:99 L8/11025\na=rtpmap:100 L16/22050/2\na=rtpmap:101 L16/22050\na=rtpmap:102 L16/11025/2\na=rtpmap:103 L16/11025\n\nFrom 141.213.8.193.32800\nv=0\no=sugih 3066072073 3066072112 IN IP4 141.213.8.193\ns=UMich IRL (private)\ni=UMich private use\nu=http://irl.eecs.umich.edu/jamin/\ne=UMich IRL <jamin@eecs.umich.edu>\np=UMich IRL +1 313 763 1583\nc=IN IP4 224.2.143.56/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 21690 RTP/AVP 0\nc=IN IP4 224.2.143.56/127\na=ptime:40\nm=video 51990 RTP/AVP 31\nc=IN IP4 224.2.200.96/127\nm=whiteboard 47284 udp wb\nc=IN IP4 224.2.239.141/127\nm=text 54906 udp nt\nc=IN IP4 224.2.242.3/127\n\nFrom 141.213.8.193.32800\nv=0\no=sugih 3066072073 3066072112 IN IP4 141.213.8.193\ns=UMich IRL (private)\ni=UMich private use\nu=http://irl.eecs.umich.edu/jamin/\ne=UMich IRL <jamin@eecs.umich.edu>\np=UMich IRL +1 313 763 1583\nc=IN IP4 224.2.143.56/127\nt=0 0\na=tool:sdr v2.3a1\na=type:test\nm=audio 21690 RTP/AVP 0\nc=IN IP4 224.2.143.56/127\na=ptime:40\nm=video 51990 RTP/AVP 31\nc=IN IP4 224.2.200.96/127\nm=whiteboard 47284 udp wb\nc=IN IP4 224.2.239.141/127\nm=text 54906 udp nt\nc=IN IP4 224.2.242.3/127\n\nFrom 128.9.160.67.1286\nv=0\no=kannan 3076332385 3076332494 IN IP4 128.9.160.67\ns=USC-CS dgroup VR conference room (private)\ni=Watering hole for the USC-NIL lab members\nu=http://netweb.usc.edu/\ne=Kannan Varadhan <kannan@catarina.usc.edu>\np=Kannan Varadhan +1 310 822 1511 x742\nc=IN IP4 224.2.212.30/75\nt=0 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 45144 RTP/AVP 5\nc=IN IP4 224.2.212.30/75\na=ptime:40\nm=whiteboard 65304 udp wb\nc=IN IP4 224.2.212.30/75\na=orient:landscape\n\nFrom 146.139.72.5.32924\nv=0\no=root 3077452673 3077455201 IN IP4 146.139.72.5\ns=ANL TelePresence Microscopy Site/Materials MicroCharacterization Collaboratory\ni=This is  ANL TelePresence Microscopy Site which is  part of the DoE 2000 Materials Microcharacterization Collaboratory. It facilitates  on-line access to unique resourses at the ANL AAEM and through the MMC, other resources in the Collaboratory at member sites (ORNL, LBNL, Univ. of Illinois and NIST).  More information about the TPM and the MMC can be found at http://tpm.amc.anl.gov/mmc\nu=http://tpm.amc.anl.gov\np=Nestor J. Zaluzec 630-252-7901\ne=Nestor J. Zaluzec <Zaluzec@aaem.amc.anl.gov>\nt=3077445600 3079900800\nr=86400 36000 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 27028 RTP/AVP 0\nc=IN IP4 224.2.222.131/127\na=ptime:40\nm=video 58800 RTP/AVP 31\nc=IN IP4 224.2.141.204/127\n\nFrom 146.139.72.5.32924\nv=0\no=root 3077452673 3077455201 IN IP4 146.139.72.5\ns=ANL TelePresence Microscopy Site/Materials MicroCharacterization Collaboratory\ni=This is  ANL TelePresence Microscopy Site which is  part of the DoE 2000 Materials Microcharacterization Collaboratory. It facilitates  on-line access to unique resourses at the ANL AAEM and through the MMC, other resources in the Collaboratory at member sites (ORNL, LBNL, Univ. of Illinois and NIST).  More information about the TPM and the MMC can be found at http://tpm.amc.anl.gov/mmc\nu=http://tpm.amc.anl.gov\np=Nestor J. Zaluzec 630-252-7901\ne=Nestor J. Zaluzec <Zaluzec@aaem.amc.anl.gov>\nt=3077445600 3079900800\nr=86400 36000 0\na=tool:sdr v2.3a1\na=type:meeting\nm=audio 27028 RTP/AVP 0\nc=IN IP4 224.2.222.131/127\na=ptime:40\nm=video 58800 RTP/AVP 31\nc=IN IP4 224.2.141.204/127\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 130.240.64.67.32877\nv=0\no=demo 3066564173 3066564269 IN IP4 130.240.64.67\ns=Places all over the world\ni=Low bandwidth video (10 kb/s) with views from all over the world. It is probably wise to limit the overall bandwidth to 100 kb/s (that is, a maximum of ten 10 kb/s streams).  Audio is primarily for feedback for the senders of video.\ne=Hakan Lennestal <hakanl@cdt.luth.se>\nc=IN IP4 224.2.172.238/127\nt=0 0\na=tool:CDT mAnnouncer 1.1.1\na=type:broadcast\nm=video 51482 RTP/AVP 31\nc=IN IP4 224.2.172.238/127\nm=audio 20154 RTP/AVP 121\nc=IN IP4 224.2.213.113/127\na=rtpred1:5\na=ptime:40\na=rtpred2:5\na=rtpmap:121 red/8000\n\nFrom 128.102.84.134.1085\nv=0\no=shuttle 3075630923 3075633526 IN IP4 128.102.84.134\ns=NASA Space Shuttle STS-94\ni=Video/Audio broadcast of NASA space shuttle mission STS-94, Microgravity Science Laboratory-1.  This session is being broadcast as a service to the MBONE community by NASA-Ames Reseach Center.\nu=http://www-pao.ksc.nasa.gov/kscpao/kscpao.htm\ne=NASA - ARC Digital Video Lab <mallard@mail.arc.nasa.gov\ne=Brian Tonner (UWM) <tonner@csd.uwm.edu>\ne=Referenzzentrum __ <mmt-ref@tu-dresden.de>       \ne=IN IP4 224.2.212.30/75\np=NASA - ARC Digital Video Lab (415) 604-6145\np=Brian Tonner (at LBL) 510-486-5590\np=Brian Tonner (at UWM) 414-229-4626\nc=IN IP4 224.2.210.20/127\nt=3076354800 3078774000\nm=audio 24680 RTP/AVP 0\nc=IN IP4 224.2.210.20/127\nm=video 56062 RTP/AVP 31\nc=IN IP4 224.2.210.20/127\n\n^?kohala % exit\n\nscript done on Sat Jul 12 16:08:04 1997\n"
  },
  {
    "path": "names/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tdaytimetcpcli daytimetcpcli1 daytimetcpsrv1 daytimetcpsrv2 \\\n\t\tdaytimetcpsrv3 daytimetcpsrv4 \\\n\t\tdaytimeudpcli1 daytimetcpcli2 daytimetcpcli3 \\\n\t\tdaytimeudpcli2 daytimeudpsrv2 daytimeudpsrv3 \\\n\t\thostent hostent2 hostent3 \\\n\t\tnetent prmyaddrs prmyaddrs1 test1\n\nall:\t${PROGS}\n\ndaytimetcpcli:\tdaytimetcpcli.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}\n\ndaytimetcpcli1:\tdaytimetcpcli1.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli1.o ${LIBS}\n\ndaytimetcpcli2:\tdaytimetcpcli2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli2.o ${LIBS}\n\ndaytimetcpcli3:\tdaytimetcpcli3.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli3.o ${LIBS}\n\ndaytimetcpsrv1:\tdaytimetcpsrv1.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv1.o ${LIBS}\n\ndaytimetcpsrv2:\tdaytimetcpsrv2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}\n\ndaytimetcpsrv3:\tdaytimetcpsrv3.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS}\n\ndaytimetcpsrv4:\tdaytimetcpsrv4.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv4.o ${LIBS}\n\ndaytimeudpcli1:\tdaytimeudpcli1.o\n\t\t${CC} ${CFLAGS} -o $@ daytimeudpcli1.o ${LIBS}\n\ndaytimeudpcli2:\tdaytimeudpcli2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimeudpcli2.o ${LIBS}\n\ndaytimeudpsrv2:\tdaytimeudpsrv2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimeudpsrv2.o ${LIBS}\n\ndaytimeudpsrv3:\tdaytimeudpsrv3.o udp_server_reuseaddr.o\n\t\t${CC} ${CFLAGS} -o $@ daytimeudpsrv3.o udp_server_reuseaddr.o \\\n\t\t\t${LIBS}\n\nhostent:\thostent.o\n\t\t${CC} ${CFLAGS} -o $@ hostent.o ${LIBS}\n\nhostent2:\thostent2.o\n\t\t${CC} ${CFLAGS} -o $@ hostent2.o ${LIBS}\n\nhostent3:\thostent3.o\n\t\t${CC} ${CFLAGS} -o $@ hostent3.o ${LIBS}\n\nnetent:\tnetent.o\n\t\t${CC} ${CFLAGS} -o $@ netent.o ${LIBS}\n\nprmyaddrs:\tprmyaddrs.o\n\t\t${CC} ${CFLAGS} -o $@ prmyaddrs.o ${LIBS}\n\nprmyaddrs1:\tprmyaddrs1.o myaddrs1.o\n\t\t${CC} ${CFLAGS} -o $@ prmyaddrs1.o myaddrs1.o ${LIBS}\n\ntest1:\ttest1.o\n\t\t${CC} ${CFLAGS} -o $@ test1.o ${LIBS}\n\ntest2:\ttest2.o\n\t\t${CC} ${CFLAGS} -o $@ test2.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "names/daytimetcpcli.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd, n;\n\tchar\t\t\trecvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr_storage\tss;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimetcpcli <hostname/IPaddress> <service/port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tlen = sizeof(ss);\n\tGetpeername(sockfd, (SA *)&ss, &len);\n\tprintf(\"connected to %s\\n\", Sock_ntop_host((SA *)&ss, len));\n\n\twhile ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/daytimetcpcli1.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr;\n\tstruct in_addr\t\t**pptr;\n\tstruct in_addr\t\t*inetaddrp[2];\n\tstruct in_addr\t\tinetaddr;\n\tstruct hostent\t\t*hp;\n\tstruct servent\t\t*sp;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimetcpcli1 <hostname> <service>\");\n\n\tif ( (hp = gethostbyname(argv[1])) == NULL) {\n\t\tif (inet_aton(argv[1], &inetaddr) == 0) {\n\t\t\terr_quit(\"hostname error for %s: %s\", argv[1], hstrerror(h_errno));\n\t\t} else {\n\t\t\tinetaddrp[0] = &inetaddr;\n\t\t\tinetaddrp[1] = NULL;\n\t\t\tpptr = inetaddrp;\n\t\t}\n\t} else {\n\t\tpptr = (struct in_addr **) hp->h_addr_list;\n\t}\n\n\tif ( (sp = getservbyname(argv[2], \"tcp\")) == NULL)\n\t\terr_quit(\"getservbyname error for %s\", argv[2]);\n\n\tfor ( ; *pptr != NULL; pptr++) {\n\t\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\t\tbzero(&servaddr, sizeof(servaddr));\n\t\tservaddr.sin_family = AF_INET;\n\t\tservaddr.sin_port = sp->s_port;\n\t\tmemcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));\n\t\tprintf(\"trying %s\\n\",\n\t\t\t   Sock_ntop((SA *) &servaddr, sizeof(servaddr)));\n\n\t\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0)\n\t\t\tbreak;\t\t/* success */\n\t\terr_ret(\"connect error\");\n\t\tclose(sockfd);\n\t}\n\tif (*pptr == NULL)\n\t\terr_quit(\"unable to connect\");\n\n\twhile ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/daytimetcpcli1.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/daytimetcpcli1.c##\n\nint##  2 ##src/names/daytimetcpcli1.c##\nmain(int argc, char **argv)##  3 ##src/names/daytimetcpcli1.c##\n{##  4 ##src/names/daytimetcpcli1.c##\n    int     sockfd, n;##  5 ##src/names/daytimetcpcli1.c##\n    char    recvline[MAXLINE + 1];##  6 ##src/names/daytimetcpcli1.c##\n    struct sockaddr_in servaddr;##  7 ##src/names/daytimetcpcli1.c##\n    struct in_addr **pptr;##  8 ##src/names/daytimetcpcli1.c##\n    struct in_addr *inetaddrp[2];##  9 ##src/names/daytimetcpcli1.c##\n    struct in_addr inetaddr;## 10 ##src/names/daytimetcpcli1.c##\n    struct hostent *hp;## 11 ##src/names/daytimetcpcli1.c##\n    struct servent *sp;## 12 ##src/names/daytimetcpcli1.c##\n\n    if (argc != 3)## 13 ##src/names/daytimetcpcli1.c##\n        err_quit(\"usage: daytimetcpcli1 <hostname> <service>\");## 14 ##src/names/daytimetcpcli1.c##\n\n    if ((hp = gethostbyname(argv[1])) == NULL) {## 15 ##src/names/daytimetcpcli1.c##\n        if (inet_aton(argv[1], &inetaddr) == 0) {## 16 ##src/names/daytimetcpcli1.c##\n            err_quit(\"hostname error for %s: %s\", argv[1],## 17 ##src/names/daytimetcpcli1.c##\n                     hstrerror(h_errno));## 18 ##src/names/daytimetcpcli1.c##\n        } else {## 19 ##src/names/daytimetcpcli1.c##\n            inetaddrp[0] = &inetaddr;## 20 ##src/names/daytimetcpcli1.c##\n            inetaddrp[1] = NULL;## 21 ##src/names/daytimetcpcli1.c##\n            pptr = inetaddrp;## 22 ##src/names/daytimetcpcli1.c##\n        }## 23 ##src/names/daytimetcpcli1.c##\n    } else {## 24 ##src/names/daytimetcpcli1.c##\n        pptr = (struct in_addr **) hp->h_addr_list;## 25 ##src/names/daytimetcpcli1.c##\n    }## 26 ##src/names/daytimetcpcli1.c##\n\n    if ((sp = getservbyname(argv[2], \"tcp\")) == NULL)## 27 ##src/names/daytimetcpcli1.c##\n        err_quit(\"getservbyname error for %s\", argv[2]);## 28 ##src/names/daytimetcpcli1.c##\n\n    for (; *pptr != NULL; pptr++) {## 29 ##src/names/daytimetcpcli1.c##\n        sockfd = Socket(AF_INET, SOCK_STREAM, 0);## 30 ##src/names/daytimetcpcli1.c##\n\n        bzero(&servaddr, sizeof(servaddr));## 31 ##src/names/daytimetcpcli1.c##\n        servaddr.sin_family = AF_INET;## 32 ##src/names/daytimetcpcli1.c##\n        servaddr.sin_port = sp->s_port;## 33 ##src/names/daytimetcpcli1.c##\n        memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));## 34 ##src/names/daytimetcpcli1.c##\n        printf(\"trying %s\\n\", Sock_ntop((SA *) &servaddr, sizeof(servaddr)));## 35 ##src/names/daytimetcpcli1.c##\n\n        if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0)## 36 ##src/names/daytimetcpcli1.c##\n            break;              /* success */## 37 ##src/names/daytimetcpcli1.c##\n        err_ret(\"connect error\");## 38 ##src/names/daytimetcpcli1.c##\n        close(sockfd);## 39 ##src/names/daytimetcpcli1.c##\n    }## 40 ##src/names/daytimetcpcli1.c##\n    if (*pptr == NULL)## 41 ##src/names/daytimetcpcli1.c##\n        err_quit(\"unable to connect\");## 42 ##src/names/daytimetcpcli1.c##\n\n    while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {## 43 ##src/names/daytimetcpcli1.c##\n        recvline[n] = 0;        /* null terminate */## 44 ##src/names/daytimetcpcli1.c##\n        Fputs(recvline, stdout);## 45 ##src/names/daytimetcpcli1.c##\n    }## 46 ##src/names/daytimetcpcli1.c##\n    exit(0);## 47 ##src/names/daytimetcpcli1.c##\n}## 48 ##src/names/daytimetcpcli1.c##\n"
  },
  {
    "path": "names/daytimetcpcli2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr;\n\tstruct in_addr\t\t**pptr, *addrs[2];\n\tstruct hostent\t\t*hp;\n\tstruct servent\t\t*sp;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimetcpcli2 <hostname> <service>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\n\tif (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) == 1) {\n\t\taddrs[0] = &servaddr.sin_addr;\n\t\taddrs[1] = NULL;\n\t\tpptr = &addrs[0];\n\t} else if ( (hp = gethostbyname(argv[1])) != NULL) {\n\t\tpptr = (struct in_addr **) hp->h_addr_list;\n\t} else\n\t\terr_quit(\"hostname error for %s: %s\", argv[1], hstrerror(h_errno));\n\n\tif ( (n = atoi(argv[2])) > 0)\n\t\tservaddr.sin_port = htons(n);\n\telse if ( (sp = getservbyname(argv[2], \"tcp\")) != NULL)\n\t\tservaddr.sin_port = sp->s_port;\n\telse\n\t\terr_quit(\"getservbyname error for %s\", argv[2]);\n\n\tfor ( ; *pptr != NULL; pptr++) {\n\t\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\t\tmemmove(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));\n\t\tprintf(\"trying %s\\n\",\n\t\t\t   Sock_ntop((SA *) &servaddr, sizeof(servaddr)));\n\n\t\tif (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0)\n\t\t\tbreak;\t\t/* success */\n\t\terr_ret(\"connect error\");\n\t\tclose(sockfd);\n\t}\n\tif (*pptr == NULL)\n\t\terr_quit(\"unable to connect\");\n\n\twhile ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/daytimetcpcli2.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/daytimetcpcli2.c##\n\nint##  2 ##src/names/daytimetcpcli2.c##\nmain(int argc, char **argv)##  3 ##src/names/daytimetcpcli2.c##\n{##  4 ##src/names/daytimetcpcli2.c##\n    int     sockfd, n;##  5 ##src/names/daytimetcpcli2.c##\n    char    recvline[MAXLINE + 1];##  6 ##src/names/daytimetcpcli2.c##\n    struct sockaddr_in servaddr;##  7 ##src/names/daytimetcpcli2.c##\n    struct in_addr **pptr, *addrs[2];##  8 ##src/names/daytimetcpcli2.c##\n    struct hostent *hp;##  9 ##src/names/daytimetcpcli2.c##\n    struct servent *sp;## 10 ##src/names/daytimetcpcli2.c##\n\n    if (argc != 3)## 11 ##src/names/daytimetcpcli2.c##\n        err_quit(\"usage: daytimetcpcli2 <hostname> <service>\");## 12 ##src/names/daytimetcpcli2.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 13 ##src/names/daytimetcpcli2.c##\n    servaddr.sin_family = AF_INET;## 14 ##src/names/daytimetcpcli2.c##\n\n    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) == 1) {## 15 ##src/names/daytimetcpcli2.c##\n        addrs[0] = &servaddr.sin_addr;## 16 ##src/names/daytimetcpcli2.c##\n        addrs[1] = NULL;## 17 ##src/names/daytimetcpcli2.c##\n        pptr = &addrs[0];## 18 ##src/names/daytimetcpcli2.c##\n    } else if ((hp = gethostbyname(argv[1])) != NULL) {## 19 ##src/names/daytimetcpcli2.c##\n        pptr = (struct in_addr **) hp->h_addr_list;## 20 ##src/names/daytimetcpcli2.c##\n    } else## 21 ##src/names/daytimetcpcli2.c##\n        err_quit(\"hostname error for %s: %s\", argv[1], hstrerror(h_errno));## 22 ##src/names/daytimetcpcli2.c##\n\n    if ((n = atoi(argv[2])) > 0)## 23 ##src/names/daytimetcpcli2.c##\n        servaddr.sin_port = htons(n);## 24 ##src/names/daytimetcpcli2.c##\n    else if ((sp = getservbyname(argv[2], \"tcp\")) != NULL)## 25 ##src/names/daytimetcpcli2.c##\n        servaddr.sin_port = sp->s_port;## 26 ##src/names/daytimetcpcli2.c##\n    else## 27 ##src/names/daytimetcpcli2.c##\n        err_quit(\"getservbyname error for %s\", argv[2]);## 28 ##src/names/daytimetcpcli2.c##\n\n    for (; *pptr != NULL; pptr++) {## 29 ##src/names/daytimetcpcli2.c##\n        sockfd = Socket(AF_INET, SOCK_STREAM, 0);## 30 ##src/names/daytimetcpcli2.c##\n\n        memmove(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));## 31 ##src/names/daytimetcpcli2.c##\n        printf(\"trying %s\\n\", Sock_ntop((SA *) &servaddr, sizeof(servaddr)));## 32 ##src/names/daytimetcpcli2.c##\n\n        if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) == 0)## 33 ##src/names/daytimetcpcli2.c##\n            break;              /* success */## 34 ##src/names/daytimetcpcli2.c##\n        err_ret(\"connect error\");## 35 ##src/names/daytimetcpcli2.c##\n        close(sockfd);## 36 ##src/names/daytimetcpcli2.c##\n    }## 37 ##src/names/daytimetcpcli2.c##\n    if (*pptr == NULL)## 38 ##src/names/daytimetcpcli2.c##\n        err_quit(\"unable to connect\");## 39 ##src/names/daytimetcpcli2.c##\n\n    while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {## 40 ##src/names/daytimetcpcli2.c##\n        recvline[n] = 0;        /* null terminate */## 41 ##src/names/daytimetcpcli2.c##\n        Fputs(recvline, stdout);## 42 ##src/names/daytimetcpcli2.c##\n    }## 43 ##src/names/daytimetcpcli2.c##\n    exit(0);## 44 ##src/names/daytimetcpcli2.c##\n}## 45 ##src/names/daytimetcpcli2.c##\n"
  },
  {
    "path": "names/daytimetcpcli3.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tservaddr;\n\tstruct sockaddr_in6\tservaddr6;\n\tstruct sockaddr\t\t*sa;\n\tsocklen_t\t\t\tsalen;\n\tstruct in_addr\t\t**pptr;\n\tstruct hostent\t\t*hp;\n\tstruct servent\t\t*sp;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimetcpcli3 <hostname> <service>\");\n\n\tif ( (hp = gethostbyname(argv[1])) == NULL)\n\t\terr_quit(\"hostname error for %s: %s\", argv[1], hstrerror(h_errno));\n\n\tif ( (sp = getservbyname(argv[2], \"tcp\")) == NULL)\n\t\terr_quit(\"getservbyname error for %s\", argv[2]);\n\n\tpptr = (struct in_addr **) hp->h_addr_list;\n\tfor ( ; *pptr != NULL; pptr++) {\n\t\tsockfd = Socket(hp->h_addrtype, SOCK_STREAM, 0);\n\n\t\tif (hp->h_addrtype == AF_INET) {\n\t\t\tsa = (SA *) &servaddr;\n\t\t\tsalen = sizeof(servaddr);\n\t\t} else if (hp->h_addrtype == AF_INET6) {\n\t\t\tsa = (SA *) &servaddr6;\n\t\t\tsalen = sizeof(servaddr6);\n\t\t} else\n\t\t\terr_quit(\"unknown addrtype %d\", hp->h_addrtype);\n\n\t\tbzero(sa, salen);\n\t\tsa->sa_family = hp->h_addrtype;\n\t\tsock_set_port(sa, salen, sp->s_port);\n\t\tsock_set_addr(sa, salen, *pptr);\n\n\t\tprintf(\"trying %s\\n\", Sock_ntop(sa, salen));\n\n\t\tif (connect(sockfd, sa, salen) == 0)\n\t\t\tbreak;\t\t/* success */\n\t\terr_ret(\"connect error\");\n\t\tclose(sockfd);\n\t}\n\tif (*pptr == NULL)\n\t\terr_quit(\"unable to connect\");\n\n\twhile ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/daytimetcpcli3.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/daytimetcpcli3.c##\n\nint##  2 ##src/names/daytimetcpcli3.c##\nmain(int argc, char **argv)##  3 ##src/names/daytimetcpcli3.c##\n{##  4 ##src/names/daytimetcpcli3.c##\n    int     sockfd, n;##  5 ##src/names/daytimetcpcli3.c##\n    char    recvline[MAXLINE + 1];##  6 ##src/names/daytimetcpcli3.c##\n    struct sockaddr_in servaddr;##  7 ##src/names/daytimetcpcli3.c##\n    struct sockaddr_in6 servaddr6;##  8 ##src/names/daytimetcpcli3.c##\n    struct sockaddr *sa;##  9 ##src/names/daytimetcpcli3.c##\n    socklen_t salen;## 10 ##src/names/daytimetcpcli3.c##\n    struct in_addr **pptr;## 11 ##src/names/daytimetcpcli3.c##\n    struct hostent *hp;## 12 ##src/names/daytimetcpcli3.c##\n    struct servent *sp;## 13 ##src/names/daytimetcpcli3.c##\n\n    if (argc != 3)## 14 ##src/names/daytimetcpcli3.c##\n        err_quit(\"usage: daytimetcpcli3 <hostname> <service>\");## 15 ##src/names/daytimetcpcli3.c##\n\n    if ((hp = gethostbyname(argv[1])) == NULL)## 16 ##src/names/daytimetcpcli3.c##\n        err_quit(\"hostname error for %s: %s\", argv[1], hstrerror(h_errno));## 17 ##src/names/daytimetcpcli3.c##\n\n    if ((sp = getservbyname(argv[2], \"tcp\")) == NULL)## 18 ##src/names/daytimetcpcli3.c##\n        err_quit(\"getservbyname error for %s\", argv[2]);## 19 ##src/names/daytimetcpcli3.c##\n\n    pptr = (struct in_addr **) hp->h_addr_list;## 20 ##src/names/daytimetcpcli3.c##\n    for (; *pptr != NULL; pptr++) {## 21 ##src/names/daytimetcpcli3.c##\n        sockfd = Socket(hp->h_addrtype, SOCK_STREAM, 0);## 22 ##src/names/daytimetcpcli3.c##\n\n        if (hp->h_addrtype == AF_INET) {## 23 ##src/names/daytimetcpcli3.c##\n            sa = (SA *) &servaddr;## 24 ##src/names/daytimetcpcli3.c##\n            salen = sizeof(servaddr);## 25 ##src/names/daytimetcpcli3.c##\n        } else if (hp->h_addrtype == AF_INET6) {## 26 ##src/names/daytimetcpcli3.c##\n            sa = (SA *) &servaddr6;## 27 ##src/names/daytimetcpcli3.c##\n            salen = sizeof(servaddr6);## 28 ##src/names/daytimetcpcli3.c##\n        } else## 29 ##src/names/daytimetcpcli3.c##\n            err_quit(\"unknown addrtype %d\", hp->h_addrtype);## 30 ##src/names/daytimetcpcli3.c##\n\n        bzero(sa, salen);## 31 ##src/names/daytimetcpcli3.c##\n        sa->sa_family = hp->h_addrtype;## 32 ##src/names/daytimetcpcli3.c##\n        sock_set_port(sa, salen, sp->s_port);## 33 ##src/names/daytimetcpcli3.c##\n        sock_set_addr(sa, salen, *pptr);## 34 ##src/names/daytimetcpcli3.c##\n\n        printf(\"trying %s\\n\", Sock_ntop(sa, salen));## 35 ##src/names/daytimetcpcli3.c##\n\n        if (connect(sockfd, sa, salen) == 0)## 36 ##src/names/daytimetcpcli3.c##\n            break;              /* success */## 37 ##src/names/daytimetcpcli3.c##\n        err_ret(\"connect error\");## 38 ##src/names/daytimetcpcli3.c##\n        close(sockfd);## 39 ##src/names/daytimetcpcli3.c##\n    }## 40 ##src/names/daytimetcpcli3.c##\n    if (*pptr == NULL)## 41 ##src/names/daytimetcpcli3.c##\n        err_quit(\"unable to connect\");## 42 ##src/names/daytimetcpcli3.c##\n\n    while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {## 43 ##src/names/daytimetcpcli3.c##\n        recvline[n] = 0;        /* null terminate */## 44 ##src/names/daytimetcpcli3.c##\n        Fputs(recvline, stdout);## 45 ##src/names/daytimetcpcli3.c##\n    }## 46 ##src/names/daytimetcpcli3.c##\n    exit(0);## 47 ##src/names/daytimetcpcli3.c##\n}## 48 ##src/names/daytimetcpcli3.c##\n"
  },
  {
    "path": "names/daytimetcpsrv1.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\tlen;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\tstruct sockaddr_storage\tcliaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: daytimetcpsrv1 <service or port#>\");\n\n\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *)&cliaddr, &len);\n\t\tprintf(\"connection from %s\\n\", Sock_ntop((SA *)&cliaddr, len));\n\n\t\tticks = time(NULL);\n\t\tsnprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tWrite(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "names/daytimetcpsrv2.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\tlen, addrlen;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\tstruct sockaddr_storage\tcliaddr;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: daytimetcpsrv2 [ <host> ] <service or port>\");\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *)&cliaddr, &len);\n\t\tprintf(\"connection from %s\\n\", Sock_ntop((SA *)&cliaddr, len));\n\n\t\tticks = time(NULL);\n\t\tsnprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tWrite(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "names/daytimetcpsrv3.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\taddrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\tstruct linger\tling;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: daytimetcpsrv3 [ <host> ] <service or port>\");\n\n\tcliaddr = Malloc(addrlen);\n\n\tfor ( ; ; ) {\n\t\tlen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &len);\n\t\tprintf(\"connection from %s\\n\", Sock_ntop(cliaddr, len));\n\n\t\t\t/* force RST instead of FIN after data */\n\t\tling.l_onoff = 1;\n\t\tling.l_linger = 0;\n\t\tSetsockopt(connfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Write(connfd, buff, strlen(buff));\n\n\t\tsleep(2);\t/* let data get across before RST */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "names/daytimetcpsrv4.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\taddrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\tchar\t\t\tbuff[MAXLINE], host[NI_MAXHOST], serv[NI_MAXSERV];\n\ttime_t\t\t\tticks;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: daytimetcpsrv4 [ <host> ] <service or port>\");\n\n\tcliaddr = Malloc(addrlen);\n\n\tfor ( ; ; ) {\n\t\tlen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &len);\n\t\tif (getnameinfo(cliaddr, len, host, NI_MAXHOST, serv, NI_MAXSERV,\n\t\t\t\t\t\tNI_NUMERICHOST | NI_NUMERICSERV) == 0)\n\t\t\tprintf(\"connection from %s.%s\\n\", host, serv);\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n        Write(connfd, buff, strlen(buff));\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "names/daytimeudpcli1.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd, n;\n\tchar\t\t\trecvline[MAXLINE + 1];\n\tsocklen_t\t\tsalen;\n\tstruct sockaddr\t*sa;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimeudpcli1 <hostname/IPaddress> <service/port#>\");\n\n\tsockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);\n\n\tprintf(\"sending to %s\\n\", Sock_ntop_host(sa, salen));\n\n\tSendto(sockfd, \"\", 1, 0, sa, salen);\t/* send 1-byte datagram */\n\n\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\trecvline[n] = '\\0';\t/* null terminate */\n\tFputs(recvline, stdout);\n\n\texit(0);\n}\n"
  },
  {
    "path": "names/daytimeudpcli1.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/daytimeudpcli1.c##\n\nint##  2 ##src/names/daytimeudpcli1.c##\nmain(int argc, char **argv)##  3 ##src/names/daytimeudpcli1.c##\n{##  4 ##src/names/daytimeudpcli1.c##\n    int     sockfd, n;##  5 ##src/names/daytimeudpcli1.c##\n    char    recvline[MAXLINE + 1];##  6 ##src/names/daytimeudpcli1.c##\n    socklen_t salen;##  7 ##src/names/daytimeudpcli1.c##\n    struct sockaddr *sa;##  8 ##src/names/daytimeudpcli1.c##\n\n    if (argc != 3)##  9 ##src/names/daytimeudpcli1.c##\n        err_quit## 10 ##src/names/daytimeudpcli1.c##\n            (\"usage: daytimeudpcli1 <hostname/IPaddress> <service/port#>\");## 11 ##src/names/daytimeudpcli1.c##\n\n    sockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);## 12 ##src/names/daytimeudpcli1.c##\n\n    printf(\"sending to %s\\n\", Sock_ntop_host(sa, salen));## 13 ##src/names/daytimeudpcli1.c##\n\n    Sendto(sockfd, \"\", 1, 0, sa, salen);    /* send 1-byte datagram */## 14 ##src/names/daytimeudpcli1.c##\n\n    n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);## 15 ##src/names/daytimeudpcli1.c##\n    recvline[n] = '\\0';         /* null terminate */## 16 ##src/names/daytimeudpcli1.c##\n    Fputs(recvline, stdout);## 17 ##src/names/daytimeudpcli1.c##\n\n    exit(0);## 18 ##src/names/daytimeudpcli1.c##\n}## 19 ##src/names/daytimeudpcli1.c##\n"
  },
  {
    "path": "names/daytimeudpcli2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd, n;\n\tchar\trecvline[MAXLINE + 1];\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimeudpcli2 <hostname/IPaddress> <service/port#>\");\n\n\tsockfd = Udp_connect(argv[1], argv[2]);\n\n\tWrite(sockfd, \"\", 1);\t/* send 1-byte datagram */\n\n\tn = Read(sockfd, recvline, MAXLINE);\n\trecvline[n] = '\\0';\t/* null terminate */\n\tFputs(recvline, stdout);\n\n\texit(0);\n}\n"
  },
  {
    "path": "names/daytimeudpsrv2.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd;\n\tssize_t\t\t\tn;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\tsocklen_t\t\tlen;\n\tstruct sockaddr_storage\tcliaddr;\n\n\tif (argc == 2)\n\t\tsockfd = Udp_server(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tsockfd = Udp_server(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: daytimeudpsrv [ <host> ] <service or port>\");\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tn = Recvfrom(sockfd, buff, MAXLINE, 0, (SA *)&cliaddr, &len);\n\t\tprintf(\"datagram from %s\\n\", Sock_ntop((SA *)&cliaddr, len));\n\n\t\tticks = time(NULL);\n\t\tsnprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tSendto(sockfd, buff, strlen(buff), 0, (SA *)&cliaddr, len);\n\t}\n}\n"
  },
  {
    "path": "names/daytimeudpsrv3.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd;\n\tssize_t\t\t\tn;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\tsocklen_t\t\tlen;\n\tstruct sockaddr_storage\tcliaddr;\n\n\tif (argc == 2)\n\t\tsockfd = Udp_server_reuseaddr(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tsockfd = Udp_server_reuseaddr(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: daytimeudpsrv [ <host> ] <service or port>\");\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(cliaddr);\n\t\tn = Recvfrom(sockfd, buff, MAXLINE, 0, (SA *)&cliaddr, &len);\n\t\tprintf(\"datagram from %s\\n\", Sock_ntop((SA *)&cliaddr, len));\n\n\t\tticks = time(NULL);\n\t\tsnprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tSendto(sockfd, buff, strlen(buff), 0, (SA *)&cliaddr, len);\n\t}\n}\n"
  },
  {
    "path": "names/hostent.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tchar\t\t\t*ptr, **pptr;\n\tchar\t\t\tstr[INET_ADDRSTRLEN];\n\tstruct hostent\t*hptr;\n\n\twhile (--argc > 0) {\n\t\tptr = *++argv;\n\t\tif ( (hptr = gethostbyname(ptr)) == NULL) {\n\t\t\terr_msg(\"gethostbyname error for host: %s: %s\",\n\t\t\t\t\tptr, hstrerror(h_errno));\n\t\t\tcontinue;\n\t\t}\n\t\tprintf(\"official hostname: %s\\n\", hptr->h_name);\n\n\t\tfor (pptr = hptr->h_aliases; *pptr != NULL; pptr++)\n\t\t\tprintf(\"\\talias: %s\\n\", *pptr);\n\n\t\tswitch (hptr->h_addrtype) {\n\t\tcase AF_INET:\n\t\t\tpptr = hptr->h_addr_list;\n\t\t\tfor ( ; *pptr != NULL; pptr++)\n\t\t\t\tprintf(\"\\taddress: %s\\n\",\n\t\t\t\t\tInet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\terr_ret(\"unknown address type\");\n\t\t\tbreak;\n\t\t}\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/hostent.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/hostent.c##\n\nint##  2 ##src/names/hostent.c##\nmain(int argc, char **argv)##  3 ##src/names/hostent.c##\n{##  4 ##src/names/hostent.c##\n    char   *ptr, **pptr;##  5 ##src/names/hostent.c##\n    char    str[INET_ADDRSTRLEN];##  6 ##src/names/hostent.c##\n    struct hostent *hptr;##  7 ##src/names/hostent.c##\n\n    while (--argc > 0) {##  8 ##src/names/hostent.c##\n        ptr = *++argv;##  9 ##src/names/hostent.c##\n        if ((hptr = gethostbyname(ptr)) == NULL) {## 10 ##src/names/hostent.c##\n            err_msg(\"gethostbyname error for host: %s: %s\",## 11 ##src/names/hostent.c##\n                    ptr, hstrerror(h_errno));## 12 ##src/names/hostent.c##\n            continue;## 13 ##src/names/hostent.c##\n        }## 14 ##src/names/hostent.c##\n        printf(\"official hostname: %s\\n\", hptr->h_name);## 15 ##src/names/hostent.c##\n\n        for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)## 16 ##src/names/hostent.c##\n            printf(\"\\talias: %s\\n\", *pptr);## 17 ##src/names/hostent.c##\n\n        switch (hptr->h_addrtype) {## 18 ##src/names/hostent.c##\n        case AF_INET:## 19 ##src/names/hostent.c##\n            pptr = hptr->h_addr_list;## 20 ##src/names/hostent.c##\n            for (; *pptr != NULL; pptr++)## 21 ##src/names/hostent.c##\n                printf(\"\\taddress: %s\\n\",## 22 ##src/names/hostent.c##\n                       Inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));## 23 ##src/names/hostent.c##\n            break;## 24 ##src/names/hostent.c##\n\n        default:## 25 ##src/names/hostent.c##\n            err_ret(\"unknown address type\");## 26 ##src/names/hostent.c##\n            break;## 27 ##src/names/hostent.c##\n        }## 28 ##src/names/hostent.c##\n    }## 29 ##src/names/hostent.c##\n    exit(0);## 30 ##src/names/hostent.c##\n}## 31 ##src/names/hostent.c##\n"
  },
  {
    "path": "names/hostent2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tchar\t\t\t*ptr, **pptr;\n\tchar\t\t\tstr[INET6_ADDRSTRLEN];\n\tstruct hostent\t*hptr;\n\n\twhile (--argc > 0) {\n\t\tptr = *++argv;\n\t\tif ( (hptr = gethostbyname(ptr)) == NULL) {\n\t\t\terr_msg(\"gethostbyname error for host: %s: %s\",\n\t\t\t\t\tptr, hstrerror(h_errno));\n\t\t\tcontinue;\n\t\t}\n\t\tprintf(\"official hostname: %s\\n\", hptr->h_name);\n\n\t\tfor (pptr = hptr->h_aliases; *pptr != NULL; pptr++)\n\t\t\tprintf(\"\talias: %s\\n\", *pptr);\n\n\t\tswitch (hptr->h_addrtype) {\n\t\tcase AF_INET:\n#ifdef\tAF_INET6\n\t\tcase AF_INET6:\n#endif\n\t\t\tpptr = hptr->h_addr_list;\n\t\t\tfor ( ; *pptr != NULL; pptr++) {\n\t\t\t\tprintf(\"\\taddress: %s\\n\",\n\t\t\t\t\tInet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));\n\n\t\t\t\tif ( (hptr = gethostbyaddr(*pptr, hptr->h_length,\n\t\t\t\t\t\t\t\t\t\t   hptr->h_addrtype)) == NULL)\n\t\t\t\t\tprintf(\"\\t(gethostbyaddr failed)\\n\");\n\t\t\t\telse if (hptr->h_name != NULL)\n\t\t\t\t\tprintf(\"\\tname = %s\\n\", hptr->h_name);\n\t\t\t\telse\n\t\t\t\t\tprintf(\"\\t(no hostname returned by gethostbyaddr)\\n\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\terr_ret(\"unknown address type\");\n\t\t\tbreak;\n\t\t}\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/hostent2.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/hostent2.c##\n\nint##  2 ##src/names/hostent2.c##\nmain(int argc, char **argv)##  3 ##src/names/hostent2.c##\n{##  4 ##src/names/hostent2.c##\n    char   *ptr, **pptr;##  5 ##src/names/hostent2.c##\n    char    str[INET6_ADDRSTRLEN];##  6 ##src/names/hostent2.c##\n    struct hostent *hptr;##  7 ##src/names/hostent2.c##\n\n    while (--argc > 0) {##  8 ##src/names/hostent2.c##\n        ptr = *++argv;##  9 ##src/names/hostent2.c##\n        if ((hptr = gethostbyname(ptr)) == NULL) {## 10 ##src/names/hostent2.c##\n            err_msg(\"gethostbyname error for host: %s: %s\",## 11 ##src/names/hostent2.c##\n                    ptr, hstrerror(h_errno));## 12 ##src/names/hostent2.c##\n            continue;## 13 ##src/names/hostent2.c##\n        }## 14 ##src/names/hostent2.c##\n        printf(\"official hostname: %s\\n\", hptr->h_name);## 15 ##src/names/hostent2.c##\n\n        for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)## 16 ##src/names/hostent2.c##\n            printf(\"    alias: %s\\n\", *pptr);## 17 ##src/names/hostent2.c##\n\n        switch (hptr->h_addrtype) {## 18 ##src/names/hostent2.c##\n        case AF_INET:## 19 ##src/names/hostent2.c##\n#ifdef  AF_INET6## 20 ##src/names/hostent2.c##\n        case AF_INET6:## 21 ##src/names/hostent2.c##\n#endif## 22 ##src/names/hostent2.c##\n            pptr = hptr->h_addr_list;## 23 ##src/names/hostent2.c##\n            for (; *pptr != NULL; pptr++) {## 24 ##src/names/hostent2.c##\n                printf(\"\\taddress: %s\\n\",## 25 ##src/names/hostent2.c##\n                       Inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));## 26 ##src/names/hostent2.c##\n\n                if ((hptr = gethostbyaddr(*pptr, hptr->h_length,## 27 ##src/names/hostent2.c##\n                                          hptr->h_addrtype)) == NULL)## 28 ##src/names/hostent2.c##\n                    printf(\"\\t(gethostbyaddr failed)\\n\");## 29 ##src/names/hostent2.c##\n                else if (hptr->h_name != NULL)## 30 ##src/names/hostent2.c##\n                    printf(\"\\tname = %s\\n\", hptr->h_name);## 31 ##src/names/hostent2.c##\n                else## 32 ##src/names/hostent2.c##\n                    printf(\"\\t(no hostname returned by gethostbyaddr)\\n\");## 33 ##src/names/hostent2.c##\n            }## 34 ##src/names/hostent2.c##\n            break;## 35 ##src/names/hostent2.c##\n\n        default:## 36 ##src/names/hostent2.c##\n            err_ret(\"unknown address type\");## 37 ##src/names/hostent2.c##\n            break;## 38 ##src/names/hostent2.c##\n        }## 39 ##src/names/hostent2.c##\n    }## 40 ##src/names/hostent2.c##\n    exit(0);## 41 ##src/names/hostent2.c##\n}## 42 ##src/names/hostent2.c##\n"
  },
  {
    "path": "names/hostent3.c",
    "content": "#include\t\"unp.h\"\n\nvoid\tpr_ipv4(char **);\n\nint\nmain(int argc, char **argv)\n{\n\tchar\t\t\t*ptr, **pptr;\n\tstruct hostent\t*hptr;\n\n\twhile (--argc > 0) {\n\t\tptr = *++argv;\n\t\tif ( (hptr = gethostbyname(ptr)) == NULL) {\n\t\t\terr_msg(\"gethostbyname error for host: %s: %s\",\n\t\t\t\t\tptr, hstrerror(h_errno));\n\t\t\tcontinue;\n\t\t}\n\t\tprintf(\"official host name: %s\\n\", hptr->h_name);\n\n\t\tfor (pptr = hptr->h_aliases; *pptr != NULL; pptr++)\n\t\t\tprintf(\"\talias: %s\\n\", *pptr);\n\n\t\tswitch (hptr->h_addrtype) {\n\t\tcase AF_INET:\n\t\t\tpr_ipv4(hptr->h_addr_list);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\terr_ret(\"unknown address type\");\n\t\t\tbreak;\n\t\t}\n\t}\n\texit(0);\n}\n\n/*\n * Print the array of IPv4 addresses that is returned.\n * Also call gethostbyaddr_r() for each IP address and print the name.\n */\n\n/* begin pr_ipv4 */\nvoid\npr_ipv4(char **listptr)\n{\n\tstruct in_addr\tinaddr;\n\tstruct hostent\t*hptr, hent;\n\tchar\t\t\tbuf[8192];\n\tint\t\t\t\th_errno;\n\n\tfor ( ; *listptr != NULL; listptr++) {\n\t\tinaddr = *((struct in_addr *) (*listptr));\n\t\tprintf(\"\tIPv4 address: %s\", Inet_ntoa(inaddr));\n\n\t\tif ( (hptr = gethostbyaddr_r((char *) &inaddr, sizeof(struct in_addr),\n\t\t\t\t\t\t\t\t\t AF_INET, &hent,\n\t\t\t\t\t\t\t\t\t buf, sizeof(buf), &h_errno)) == NULL)\n\t\t\tprintf(\"    (gethostbyaddr failed: %s)\\n\", hstrerror(h_errno));\n\t\telse if (hptr->h_name != NULL)\n\t\t\tprintf(\"    name = %s\\n\", hptr->h_name);\n\t\telse\n\t\t\tprintf(\"    (no hostname returned by gethostbyaddr)\\n\");\n\t}\n}\n/* end pr_ipv4 */\n"
  },
  {
    "path": "names/myaddrs1.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/param.h>\n\nchar **\nmy_addrs(int *addrtype)\n{\n\tstruct hostent\t*hptr;\n\tchar\t\t\tmyname[MAXHOSTNAMELEN];\n\n\tif (gethostname(myname, sizeof(myname)) < 0)\n\t\treturn(NULL);\n\n\tif ( (hptr = gethostbyname(myname)) == NULL)\n\t\treturn(NULL);\n\n\t*addrtype = hptr->h_addrtype;\n\treturn(hptr->h_addr_list);\n}\n"
  },
  {
    "path": "names/myaddrs1.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/myaddrs1.c##\n#include    <sys/param.h>##  2 ##src/names/myaddrs1.c##\n\nchar  **##  3 ##src/names/myaddrs1.c##\nmy_addrs(int *addrtype)##  4 ##src/names/myaddrs1.c##\n{##  5 ##src/names/myaddrs1.c##\n    struct hostent *hptr;##  6 ##src/names/myaddrs1.c##\n    char    myname[MAXHOSTNAMELEN];##  7 ##src/names/myaddrs1.c##\n\n    if (gethostname(myname, sizeof(myname)) < 0)##  8 ##src/names/myaddrs1.c##\n        return (NULL);##  9 ##src/names/myaddrs1.c##\n\n    if ((hptr = gethostbyname(myname)) == NULL)## 10 ##src/names/myaddrs1.c##\n        return (NULL);## 11 ##src/names/myaddrs1.c##\n\n    *addrtype = hptr->h_addrtype;## 12 ##src/names/myaddrs1.c##\n    return (hptr->h_addr_list);## 13 ##src/names/myaddrs1.c##\n}## 14 ##src/names/myaddrs1.c##\n"
  },
  {
    "path": "names/netent.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tchar\t\t\t*ptr, **pptr;\n\tstruct netent\t*nptr;\n\n\twhile (--argc > 0) {\n\t\tptr = *++argv;\n\t\tif ( (nptr = getnetbyname(ptr)) == NULL) {\n\t\t\terr_msg(\"getnetbyname error for net: %s: %s\",\n\t\t\t\t\tptr, hstrerror(h_errno));\n\t\t\tcontinue;\n\t\t}\n\t\tprintf(\"official netname: %s\\n\", nptr->n_name);\n\n\t\tfor (pptr = nptr->n_aliases; *pptr != NULL; pptr++)\n\t\t\tprintf(\"\talias: %s\\n\", *pptr);\n\n\t\tswitch (nptr->n_addrtype) {\n\t\tcase AF_INET:\n#ifdef\tAF_INET6\n\t\tcase AF_INET6:\n#endif\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\terr_ret(\"unknown address type\");\n\t\t\tbreak;\n\t\t}\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "names/prmyaddrs.c",
    "content": "#include\t\"unp.h\"\n\nchar\t**my_addrs(int *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\taddrtype;\n\tchar\t**pptr, buf[INET6_ADDRSTRLEN];\n\n\tif ( (pptr = my_addrs(&addrtype)) == NULL)\n\t\terr_quit(\"my_addrs error\");\n\n\tfor ( ; *pptr != NULL; pptr++)\n\t\tprintf(\"\\taddress: %s\\n\",\n\t\t\t   Inet_ntop(addrtype, *pptr, buf, sizeof(buf)));\n\n\texit(0);\n}\n"
  },
  {
    "path": "names/prmyaddrs1.c",
    "content": "#include\t\"unp.h\"\n\nchar\t**my_addrs(int *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\taddrtype;\n\tchar\t**pptr, buf[INET6_ADDRSTRLEN];\n\n\tif ( (pptr = my_addrs(&addrtype)) == NULL)\n\t\terr_quit(\"my_addrs error\");\n\n\tfor ( ; *pptr != NULL; pptr++)\n\t\tprintf(\"\\taddress: %s\\n\",\n\t\t\t   Inet_ntop(addrtype, *pptr, buf, sizeof(buf)));\n\n\texit(0);\n}\n"
  },
  {
    "path": "names/prmyaddrs1.lc",
    "content": "#include    \"unp.h\"##  1 ##src/names/prmyaddrs1.c##\n\nchar  **my_addrs(int *);##  2 ##src/names/prmyaddrs1.c##\n\nint##  3 ##src/names/prmyaddrs1.c##\nmain(int argc, char **argv)##  4 ##src/names/prmyaddrs1.c##\n{##  5 ##src/names/prmyaddrs1.c##\n    int     addrtype;##  6 ##src/names/prmyaddrs1.c##\n    char  **pptr, buf[INET6_ADDRSTRLEN];##  7 ##src/names/prmyaddrs1.c##\n\n    if ((pptr = my_addrs(&addrtype)) == NULL)##  8 ##src/names/prmyaddrs1.c##\n        err_quit(\"my_addrs error\");##  9 ##src/names/prmyaddrs1.c##\n\n    for (; *pptr != NULL; pptr++)## 10 ##src/names/prmyaddrs1.c##\n        printf(\"\\taddress: %s\\n\",## 11 ##src/names/prmyaddrs1.c##\n               Inet_ntop(addrtype, *pptr, buf, sizeof(buf)));## 12 ##src/names/prmyaddrs1.c##\n\n    exit(0);## 13 ##src/names/prmyaddrs1.c##\n}## 14 ##src/names/prmyaddrs1.c##\n"
  },
  {
    "path": "names/test1.c",
    "content": "#include\t\"unp.h\"\n\nvoid\tpr_ipv4(char **);\n\nint\nmain(int argc, char **argv)\n{\n\tchar\t\t\t*ptr, **pptr, **listptr, buf[INET6_ADDRSTRLEN];\n\tchar\t\t\t*list[100];\n\tint\t\t\t\ti, addrtype, addrlen;\n\tstruct hostent\t*hptr;\n\n\twhile (--argc > 0) {\n\t\tptr = *++argv;\n\t\tif ( (hptr = gethostbyname(ptr)) == NULL) {\n\t\t\terr_msg(\"gethostbyname error for host: %s: %s\",\n\t\t\t\t\tptr, hstrerror(h_errno));\n\t\t\tcontinue;\n\t\t}\n\t\tprintf(\"official host name: %s\\n\", hptr->h_name);\n\n\t\tfor (pptr = hptr->h_aliases; *pptr != NULL; pptr++)\n\t\t\tprintf(\"\talias: %s\\n\", *pptr);\n\t\taddrtype = hptr->h_addrtype;\n\t\taddrlen = hptr->h_length;\n\n\t\t\t/* copy array of pointers, so we can call gethostbyaddr() */\n\t\tfor (i = 0, listptr = hptr->h_addr_list; *listptr != NULL; listptr++) {\n\t\t\tlist[i++] = *listptr;\n\t\t}\n\t\tlist[i] = NULL;\n\n\t\tfor (listptr = list; *listptr != NULL; listptr++) {\n\t\t\tprintf(\"\\taddress: %s\\n\",\n\t\t\t\t   Inet_ntop(addrtype, *listptr, buf, sizeof(buf)));\n\n\t\t\tif ( (hptr = gethostbyaddr(*listptr, addrlen, addrtype)) == NULL)\n\t\t\t\tprintf(\"\\t\\t(gethostbyaddr failed)\\n\");\n\t\t\telse if (hptr->h_name != NULL)\n\t\t\t\tprintf(\"\\t\\tname = %s\\n\", hptr->h_name);\n\t\t\telse\n\t\t\t\tprintf(\"\\t\\t(no hostname returned by gethostbyaddr)\\n\");\n\n\t\t\tprintf(\"\\t\\tofficial host name: %s\\n\", hptr->h_name);\n\n\t\t\tfor (pptr = hptr->h_aliases; *pptr != NULL; pptr++)\n\t\t\t\tprintf(\"\\t\\talias: %s\\n\", *pptr);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "names/test2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd, n;\n\tchar\t\t\trecvline[MAXLINE + 1];\n\tsocklen_t\t\tsalen;\n\tstruct sockaddr\t*sa, *sabind;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: test2 <hostname/IPaddress> <service/port#>\");\n\n\tsockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);\n\n\t/* Same as daytimeudpcli1, but we explicitly bind the wildcard */\n\tsabind = Malloc(salen);\n\tbzero(sabind, salen);\n\tsabind->sa_family = sa->sa_family;\n\tBind(sockfd, sabind, salen);\n\tprintf(\"bound %s\\n\", Sock_ntop(sabind, salen));\n\n\tprintf(\"sending to %s\\n\", Sock_ntop_host(sa, salen));\n\n\tSendto(sockfd, \"\", 1, 0, sa, salen);\t/* send 1-byte datagram */\n\n\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\trecvline[n] = 0;\t/* null terminate */\n\tFputs(recvline, stdout);\n\n\texit(0);\n}\n"
  },
  {
    "path": "names/udp_server_reuseaddr.c",
    "content": "/* include udp_server */\n#include\t\"unp.h\"\n\nint\nudp_server_reuseaddr(const char *host, const char *serv, socklen_t *addrlenp)\n{\n\tint\t\t\t\tsockfd, n;\n\tconst int\t\ton = 1;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_flags = AI_PASSIVE;\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_DGRAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"udp_server error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tsockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (sockfd < 0)\n\t\t\tcontinue;\t\t/* error, try next one */\n\n\t\tSetsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\t\tif (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0)\n\t\t\tbreak;\t\t\t/* success */\n\n\t\tClose(sockfd);\t\t/* bind error, close and try next one */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno from final socket() or bind() */\n\t\terr_sys(\"udp_server error for %s, %s\", host, serv);\n\n\tif (addrlenp)\n\t\t*addrlenp = res->ai_addrlen;\t/* return size of protocol address */\n\n\tfreeaddrinfo(ressave);\n\n\treturn(sockfd);\n}\n/* end udp_server */\n\nint\nUdp_server_reuseaddr(const char *host, const char *serv, socklen_t *addrlenp)\n{\n\treturn(udp_server_reuseaddr(host, serv, addrlenp));\n}\n"
  },
  {
    "path": "nonblock/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tdaytimetcpcli tcpcli01 tcpcli02 tcpcli03 tcpcli04 tcpservselect02 web\n\nall:\t${PROGS}\n\ndaytimetcpcli:\tdaytimetcpcli.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}\n\ntcpcli01:\ttcpcli01.o strclifork.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli01.o strclifork.o ${LIBS}\n\ntcpcli02:\ttcpcli02.o strclinonb.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli02.o strclinonb.o ${LIBS}\n\ntcpcli03:\ttcpcli03.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli03.o ${LIBS}\n\ntcpcli04:\ttcpcli04.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli04.o ${LIBS}\n\ntcpservselect03:\ttcpservselect03.o\n\t\t${CC} ${CFLAGS} -o $@ tcpservselect03.o ${LIBS}\n\nweb:\tweb.o home_page.o start_connect.o write_get_cmd.o\n\t\t${CC} ${CFLAGS} -o $@ web.o home_page.o start_connect.o \\\n\t\t\twrite_get_cmd.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "nonblock/daytimetcpcli.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, n;\n\tstruct sockaddr_in\tservaddr;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\n\tif ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket error\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = inet_addr(argv[1]);\n\tservaddr.sin_port        = htons(13);\t/* daytime server */\n\n\tif (connect_nonb(sockfd, (SA *) &servaddr, sizeof(servaddr), 0) < 0)\n\t\terr_sys(\"connect error\");\n\n\tfor ( ; ; ) {\n\t\tif ( (n = read(sockfd, recvline, MAXLINE)) <= 0) {\n\t\t\tif (n == 0)\n\t\t\t\tbreak;\t\t/* server closed connection */\n\t\t\telse\n\t\t\t\terr_sys(\"read error\");\n\t\t}\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "nonblock/doit.1",
    "content": "#!/bin/sh\n\ncase $# in\n1)\tbreak ;;\n*)\techo \"one argument (#simultaneous connections) required\" 1>&2\n\texit 1 ;;\nesac\n\ntime ./web $1 192.207.117.2 / \\\n\t/img/logo/awl_logo_blue_50x40.gif \\\n\t/img/a_world_of_learning.gif \\\n\t/img/toolbar_soptions.gif \\\n\t/img/toolbar_purchase.gif \\\n\t/img/toolbar_feedback.gif \\\n\t/img/toolbar_top_hilite.gif \\\n\t/img/toolbar_qsearch.gif \\\n\t/img/blue_dot.gif \\\n\t/img/logo/pearson_logo_50.gif\n"
  },
  {
    "path": "nonblock/home_page.c",
    "content": "#include\t\"web.h\"\n\nvoid\nhome_page(const char *host, const char *fname)\n{\n\tint\t\tfd, n;\n\tchar\tline[MAXLINE];\n\n\tfd = Tcp_connect(host, SERV);\t/* blocking connect() */\n\n\tn = snprintf(line, sizeof(line), GET_CMD, fname);\n\tWriten(fd, line, n);\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Read(fd, line, MAXLINE)) == 0)\n\t\t\tbreak;\t\t/* server closed connection */\n\n\t\tprintf(\"read %d bytes of home page\\n\", n);\n\t\t/* do whatever with data */\n\t}\n\tprintf(\"end-of-file on home page\\n\");\n\tClose(fd);\n}\n"
  },
  {
    "path": "nonblock/script.1.sh",
    "content": "10:18:34.491482: read 4096 bytes from stdin\n10:18:34.519016: wrote 4096 bytes to socket\n10:18:34.544636: read 4096 bytes from stdin\n10:18:34.568505: read 3508 bytes from socket\n10:18:34.593354: wrote 3508 bytes to stdout\n10:18:34.618062: wrote 4096 bytes to socket\n10:18:34.643524: read 4096 bytes from stdin\n10:18:34.667305: read 2636 bytes from socket\n10:18:34.691039: wrote 2636 bytes to stdout\n10:18:34.697238: wrote 4096 bytes to socket\n10:18:34.700582: read 4096 bytes from stdin\n10:18:34.703809: read 2048 bytes from socket\n10:18:34.708440: wrote 2048 bytes to stdout\n10:18:34.712738: wrote 4096 bytes to socket\n10:18:34.716194: read 4096 bytes from stdin\n10:18:34.719832: read 4096 bytes from socket\n10:18:34.724106: wrote 4096 bytes to stdout\n10:18:34.728503: wrote 4096 bytes to socket\n10:18:34.731839: read 3649 bytes from stdin\n10:18:34.735129: read 4096 bytes from socket\n10:18:34.778481: wrote 4096 bytes to stdout\n10:18:34.803742: wrote 3649 bytes to socket\n10:18:34.829483: EOF on stdin\n10:18:34.849752: read 4096 bytes from socket\n10:18:34.874733: wrote 4096 bytes to stdout\n10:18:34.898581: read 3649 bytes from socket\n10:18:34.923059: wrote 3649 bytes to stdout\n10:18:34.946892: EOF on socket\n"
  },
  {
    "path": "nonblock/script.1.tcpd",
    "content": "10:18:34.486392 kohala.33621 > kalae.echo: S 1802738644:1802738644(0) win 8760 <mss 1460> (DF)\n10:18:34.488278 kalae.echo > kohala.33621: S 3212986316:3212986316(0) ack 1802738645 win 8760 <mss 1460>\n10:18:34.488490 kohala.33621 > kalae.echo: . ack 1 win 8760 (DF)\n10:18:34.518663 kohala.33621 > kalae.echo: P 1:1461(1460) ack 1 win 8760 (DF)\n10:18:34.528529 kalae.echo > kohala.33621: P 1:1461(1460) ack 1461 win 8760\n10:18:34.528785 kohala.33621 > kalae.echo: . 1461:2921(1460) ack 1461 win 8760 (DF)\n10:18:34.528900 kohala.33621 > kalae.echo: P 2921:4097(1176) ack 1461 win 8760 (DF)\n10:18:34.528958 kohala.33621 > kalae.echo: . ack 1461 win 8760 (DF)\n10:18:34.536193 kalae.echo > kohala.33621: . 1461:2921(1460) ack 4097 win 8760\n10:18:34.536697 kalae.echo > kohala.33621: P 2921:3509(588) ack 4097 win 8760\n10:18:34.580373 kohala.33621 > kalae.echo: . ack 3509 win 8760 (DF)\n10:18:34.582244 kalae.echo > kohala.33621: P 3509:4097(588) ack 4097 win 8760\n10:18:34.617272 kohala.33621 > kalae.echo: P 4097:5557(1460) ack 4097 win 8760 (DF)\n10:18:34.617610 kohala.33621 > kalae.echo: P 5557:7017(1460) ack 4097 win 8760 (DF)\n10:18:34.617908 kohala.33621 > kalae.echo: P 7017:8193(1176) ack 4097 win 8760 (DF)\n10:18:34.623310 kalae.echo > kohala.33621: . ack 8193 win 8760\n10:18:34.626129 kalae.echo > kohala.33621: . 4097:5557(1460) ack 8193 win 8760\n10:18:34.626339 kohala.33621 > kalae.echo: . ack 5557 win 8760 (DF)\n10:18:34.626611 kalae.echo > kohala.33621: P 5557:6145(588) ack 8193 win 8760\n10:18:34.628396 kalae.echo > kohala.33621: . 6145:7605(1460) ack 8193 win 8760\n10:18:34.670324 kohala.33621 > kalae.echo: . ack 7605 win 8760 (DF)\n10:18:34.672221 kalae.echo > kohala.33621: P 7605:8193(588) ack 8193 win 8760\n10:18:34.696426 kohala.33621 > kalae.echo: P 8193:9653(1460) ack 8193 win 8760 (DF)\n10:18:34.696768 kohala.33621 > kalae.echo: P 9653:11113(1460) ack 8193 win 8760 (DF)\n10:18:34.697077 kohala.33621 > kalae.echo: P 11113:12289(1176) ack 8193 win 8760 (DF)\n10:18:34.702449 kalae.echo > kohala.33621: . ack 12289 win 8760\n10:18:34.705393 kalae.echo > kohala.33621: . 8193:9653(1460) ack 12289 win 8760\n10:18:34.705795 kalae.echo > kohala.33621: P 9653:10241(588) ack 12289 win 8760\n10:18:34.705908 kohala.33621 > kalae.echo: . ack 9653 win 8760 (DF)\n10:18:34.707441 kalae.echo > kohala.33621: . 10241:11701(1460) ack 12289 win 8760\n10:18:34.711917 kohala.33621 > kalae.echo: P 12289:13749(1460) ack 11701 win 8760 (DF)\n10:18:34.712264 kohala.33621 > kalae.echo: P 13749:15209(1460) ack 11701 win 8760 (DF)\n10:18:34.712579 kohala.33621 > kalae.echo: P 15209:16385(1176) ack 11701 win 8760 (DF)\n10:18:34.717363 kalae.echo > kohala.33621: P 11701:12289(588) ack 13749 win 7300\n10:18:34.718793 kalae.echo > kohala.33621: . ack 16385 win 8760\n10:18:34.721546 kalae.echo > kohala.33621: . 12289:13749(1460) ack 16385 win 8760\n10:18:34.723149 kalae.echo > kohala.33621: . 13749:15209(1460) ack 16385 win 8760\n10:18:34.723343 kohala.33621 > kalae.echo: . ack 15209 win 8760 (DF)\n10:18:34.726008 kalae.echo > kohala.33621: P 15209:16385(1176) ack 16385 win 8760\n10:18:34.727659 kohala.33621 > kalae.echo: P 16385:17845(1460) ack 16385 win 8760 (DF)\n10:18:34.728011 kohala.33621 > kalae.echo: P 17845:19305(1460) ack 16385 win 8760 (DF)\n10:18:34.728337 kohala.33621 > kalae.echo: P 19305:20481(1176) ack 16385 win 8760 (DF)\n10:18:34.733691 kalae.echo > kohala.33621: . ack 20481 win 8760\n10:18:34.736411 kalae.echo > kohala.33621: . 16385:17845(1460) ack 20481 win 8760\n10:18:34.736942 kalae.echo > kohala.33621: P 17845:18433(588) ack 20481 win 8760\n10:18:34.738753 kalae.echo > kohala.33621: . 18433:19893(1460) ack 20481 win 8760\n10:18:34.738968 kohala.33621 > kalae.echo: . ack 19893 win 8760 (DF)\n10:18:34.740856 kalae.echo > kohala.33621: P 19893:20481(588) ack 20481 win 8760\n10:18:34.790367 kohala.33621 > kalae.echo: . ack 20481 win 8760 (DF)\n10:18:34.802928 kohala.33621 > kalae.echo: P 20481:21941(1460) ack 20481 win 8760 (DF)\n10:18:34.803290 kohala.33621 > kalae.echo: P 21941:23401(1460) ack 20481 win 8760 (DF)\n10:18:34.803575 kohala.33621 > kalae.echo: P 23401:24130(729) ack 20481 win 8760 (DF)\n10:18:34.808732 kalae.echo > kohala.33621: . ack 24130 win 8760\n10:18:34.811468 kalae.echo > kohala.33621: . 20481:21941(1460) ack 24130 win 8760\n10:18:34.811994 kalae.echo > kohala.33621: P 21941:22529(588) ack 24130 win 8760\n10:18:34.813713 kalae.echo > kohala.33621: . 22529:23989(1460) ack 24130 win 8760\n10:18:34.813937 kohala.33621 > kalae.echo: . ack 23989 win 8760 (DF)\n10:18:34.815274 kalae.echo > kohala.33621: P 23989:24130(141) ack 24130 win 8760\n10:18:34.849338 kohala.33621 > kalae.echo: F 24130:24130(0) ack 24130 win 8760 (DF)\n10:18:34.850471 kalae.echo > kohala.33621: . ack 24131 win 8760\n10:18:34.852790 kalae.echo > kohala.33621: F 24130:24130(0) ack 24131 win 8760\n10:18:34.853086 kohala.33621 > kalae.echo: . ack 24131 win 8760 (DF)\n"
  },
  {
    "path": "nonblock/start_connect.c",
    "content": "#include\t\"web.h\"\n\nvoid\nstart_connect(struct file *fptr)\n{\n\tint\t\t\t\tfd, flags, n;\n\tstruct addrinfo\t*ai;\n\n\tai = Host_serv(fptr->f_host, SERV, 0, SOCK_STREAM);\n\n\tfd = Socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);\n\tfptr->f_fd = fd;\n\tprintf(\"start_connect for %s, fd %d\\n\", fptr->f_name, fd);\n\n\t\t/* 4Set socket nonblocking */\n\tflags = Fcntl(fd, F_GETFL, 0);\n\tFcntl(fd, F_SETFL, flags | O_NONBLOCK);\n\n\t\t/* 4Initiate nonblocking connect to the server. */\n\tif ( (n = connect(fd, ai->ai_addr, ai->ai_addrlen)) < 0) {\n\t\tif (errno != EINPROGRESS)\n\t\t\terr_sys(\"nonblocking connect error\");\n\t\tfptr->f_flags = F_CONNECTING;\n\t\tFD_SET(fd, &rset);\t\t\t/* select for reading and writing */\n\t\tFD_SET(fd, &wset);\n\t\tif (fd > maxfd)\n\t\t\tmaxfd = fd;\n\n\t} else if (n >= 0)\t\t\t\t/* connect is already done */\n\t\twrite_get_cmd(fptr);\t/* write() the GET command */\n}\n"
  },
  {
    "path": "nonblock/strclifork.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tpid_t\tpid;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE];\n\n\tif ( (pid = Fork()) == 0) {\t\t/* child: server -> stdout */\n\t\twhile (Readline(sockfd, recvline, MAXLINE) > 0)\n\t\t\tFputs(recvline, stdout);\n\n\t\tkill(getppid(), SIGTERM);\t/* in case parent still running */\n\t\texit(0);\n\t}\n\n\t\t/* parent: stdin -> server */\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL)\n\t\tWriten(sockfd, sendline, strlen(sendline));\n\n\tShutdown(sockfd, SHUT_WR);\t/* EOF on stdin, send FIN */\n\tpause();\n\treturn;\n}\n"
  },
  {
    "path": "nonblock/strclinonb.c",
    "content": "/* include nonb1 */\n#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\t\tmaxfdp1, val, stdineof;\n\tssize_t\t\tn, nwritten;\n\tfd_set\t\trset, wset;\n\tchar\t\tto[MAXLINE], fr[MAXLINE];\n\tchar\t\t*toiptr, *tooptr, *friptr, *froptr;\n\n\tval = Fcntl(sockfd, F_GETFL, 0);\n\tFcntl(sockfd, F_SETFL, val | O_NONBLOCK);\n\n\tval = Fcntl(STDIN_FILENO, F_GETFL, 0);\n\tFcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);\n\n\tval = Fcntl(STDOUT_FILENO, F_GETFL, 0);\n\tFcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);\n\n\ttoiptr = tooptr = to;\t/* initialize buffer pointers */\n\tfriptr = froptr = fr;\n\tstdineof = 0;\n\n\tmaxfdp1 = max(max(STDIN_FILENO, STDOUT_FILENO), sockfd) + 1;\n\tfor ( ; ; ) {\n\t\tFD_ZERO(&rset);\n\t\tFD_ZERO(&wset);\n\t\tif (stdineof == 0 && toiptr < &to[MAXLINE])\n\t\t\tFD_SET(STDIN_FILENO, &rset);\t/* read from stdin */\n\t\tif (friptr < &fr[MAXLINE])\n\t\t\tFD_SET(sockfd, &rset);\t\t\t/* read from socket */\n\t\tif (tooptr != toiptr)\n\t\t\tFD_SET(sockfd, &wset);\t\t\t/* data to write to socket */\n\t\tif (froptr != friptr)\n\t\t\tFD_SET(STDOUT_FILENO, &wset);\t/* data to write to stdout */\n\n\t\tSelect(maxfdp1, &rset, &wset, NULL, NULL);\n/* end nonb1 */\n/* include nonb2 */\n\t\tif (FD_ISSET(STDIN_FILENO, &rset)) {\n\t\t\tif ( (n = read(STDIN_FILENO, toiptr, &to[MAXLINE] - toiptr)) < 0) {\n\t\t\t\tif (errno != EWOULDBLOCK)\n\t\t\t\t\terr_sys(\"read error on stdin\");\n\n\t\t\t} else if (n == 0) {\n#ifdef\tVOL2\n\t\t\t\tfprintf(stderr, \"%s: EOF on stdin\\n\", gf_time());\n#endif\n\t\t\t\tstdineof = 1;\t\t\t/* all done with stdin */\n\t\t\t\tif (tooptr == toiptr)\n\t\t\t\t\tShutdown(sockfd, SHUT_WR);/* send FIN */\n\n\t\t\t} else {\n#ifdef\tVOL2\n\t\t\t\tfprintf(stderr, \"%s: read %d bytes from stdin\\n\", gf_time(), n);\n#endif\n\t\t\t\ttoiptr += n;\t\t\t/* # just read */\n\t\t\t\tFD_SET(sockfd, &wset);\t/* try and write to socket below */\n\t\t\t}\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\n\t\t\tif ( (n = read(sockfd, friptr, &fr[MAXLINE] - friptr)) < 0) {\n\t\t\t\tif (errno != EWOULDBLOCK)\n\t\t\t\t\terr_sys(\"read error on socket\");\n\n\t\t\t} else if (n == 0) {\n#ifdef\tVOL2\n\t\t\t\tfprintf(stderr, \"%s: EOF on socket\\n\", gf_time());\n#endif\n\t\t\t\tif (stdineof)\n\t\t\t\t\treturn;\t\t/* normal termination */\n\t\t\t\telse\n\t\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\n\t\t\t} else {\n#ifdef\tVOL2\n\t\t\t\tfprintf(stderr, \"%s: read %d bytes from socket\\n\",\n\t\t\t\t\t\t\t\tgf_time(), n);\n#endif\n\t\t\t\tfriptr += n;\t\t/* # just read */\n\t\t\t\tFD_SET(STDOUT_FILENO, &wset);\t/* try and write below */\n\t\t\t}\n\t\t}\n/* end nonb2 */\n/* include nonb3 */\n\t\tif (FD_ISSET(STDOUT_FILENO, &wset) && ( (n = friptr - froptr) > 0)) {\n\t\t\tif ( (nwritten = write(STDOUT_FILENO, froptr, n)) < 0) {\n\t\t\t\tif (errno != EWOULDBLOCK)\n\t\t\t\t\terr_sys(\"write error to stdout\");\n\n\t\t\t} else {\n#ifdef\tVOL2\n\t\t\t\tfprintf(stderr, \"%s: wrote %d bytes to stdout\\n\",\n\t\t\t\t\t\t\t\tgf_time(), nwritten);\n#endif\n\t\t\t\tfroptr += nwritten;\t\t/* # just written */\n\t\t\t\tif (froptr == friptr)\n\t\t\t\t\tfroptr = friptr = fr;\t/* back to beginning of buffer */\n\t\t\t}\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &wset) && ( (n = toiptr - tooptr) > 0)) {\n\t\t\tif ( (nwritten = write(sockfd, tooptr, n)) < 0) {\n\t\t\t\tif (errno != EWOULDBLOCK)\n\t\t\t\t\terr_sys(\"write error to socket\");\n\n\t\t\t} else {\n#ifdef\tVOL2\n\t\t\t\tfprintf(stderr, \"%s: wrote %d bytes to socket\\n\",\n\t\t\t\t\t\t\t\tgf_time(), nwritten);\n#endif\n\t\t\t\ttooptr += nwritten;\t/* # just written */\n\t\t\t\tif (tooptr == toiptr) {\n\t\t\t\t\ttoiptr = tooptr = to;\t/* back to beginning of buffer */\n\t\t\t\t\tif (stdineof)\n\t\t\t\t\t\tShutdown(sockfd, SHUT_WR);\t/* send FIN */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n/* end nonb3 */\n"
  },
  {
    "path": "nonblock/strclinonb.lc",
    "content": "/* include nonb1 */\n#include    \"unp.h\"##  1 ##src/nonblock/strclinonb.c##\n\nvoid##  2 ##src/nonblock/strclinonb.c##\nstr_cli(FILE *fp, int sockfd)##  3 ##src/nonblock/strclinonb.c##\n{##  4 ##src/nonblock/strclinonb.c##\n    int     maxfdp1, val, stdineof;##  5 ##src/nonblock/strclinonb.c##\n    ssize_t n, nwritten;##  6 ##src/nonblock/strclinonb.c##\n    fd_set  rset, wset;##  7 ##src/nonblock/strclinonb.c##\n    char    to[MAXLINE], fr[MAXLINE];##  8 ##src/nonblock/strclinonb.c##\n    char   *toiptr, *tooptr, *friptr, *froptr;##  9 ##src/nonblock/strclinonb.c##\n\n    val = Fcntl(sockfd, F_GETFL, 0);## 10 ##src/nonblock/strclinonb.c##\n    Fcntl(sockfd, F_SETFL, val | O_NONBLOCK);## 11 ##src/nonblock/strclinonb.c##\n\n    val = Fcntl(STDIN_FILENO, F_GETFL, 0);## 12 ##src/nonblock/strclinonb.c##\n    Fcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);## 13 ##src/nonblock/strclinonb.c##\n\n    val = Fcntl(STDOUT_FILENO, F_GETFL, 0);## 14 ##src/nonblock/strclinonb.c##\n    Fcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);## 15 ##src/nonblock/strclinonb.c##\n\n    toiptr = tooptr = to;       /* initialize buffer pointers */## 16 ##src/nonblock/strclinonb.c##\n    friptr = froptr = fr;## 17 ##src/nonblock/strclinonb.c##\n    stdineof = 0;## 18 ##src/nonblock/strclinonb.c##\n\n    maxfdp1 = max(max(STDIN_FILENO, STDOUT_FILENO), sockfd) + 1;## 19 ##src/nonblock/strclinonb.c##\n    for (;;) {## 20 ##src/nonblock/strclinonb.c##\n        FD_ZERO(&rset);## 21 ##src/nonblock/strclinonb.c##\n        FD_ZERO(&wset);## 22 ##src/nonblock/strclinonb.c##\n        if (stdineof == 0 && toiptr < &to[MAXLINE])## 23 ##src/nonblock/strclinonb.c##\n            FD_SET(STDIN_FILENO, &rset);    /* read from stdin */## 24 ##src/nonblock/strclinonb.c##\n        if (friptr < &fr[MAXLINE])## 25 ##src/nonblock/strclinonb.c##\n            FD_SET(sockfd, &rset);  /* read from socket */## 26 ##src/nonblock/strclinonb.c##\n        if (tooptr != toiptr)## 27 ##src/nonblock/strclinonb.c##\n            FD_SET(sockfd, &wset);  /* data to write to socket */## 28 ##src/nonblock/strclinonb.c##\n        if (froptr != friptr)## 29 ##src/nonblock/strclinonb.c##\n            FD_SET(STDOUT_FILENO, &wset);   /* data to write to stdout */## 30 ##src/nonblock/strclinonb.c##\n\n        Select(maxfdp1, &rset, &wset, NULL, NULL);## 31 ##src/nonblock/strclinonb.c##\n/* end nonb1 */\n/* include nonb2 */\n        if (FD_ISSET(STDIN_FILENO, &rset)) {## 32 ##src/nonblock/strclinonb.c##\n            if ((n = read(STDIN_FILENO, toiptr, &to[MAXLINE] - toiptr)) < 0) {## 33 ##src/nonblock/strclinonb.c##\n                if (errno != EWOULDBLOCK)## 34 ##src/nonblock/strclinonb.c##\n                    err_sys(\"read error on stdin\");## 35 ##src/nonblock/strclinonb.c##\n\n            } else if (n == 0) {## 36 ##src/nonblock/strclinonb.c##\n                fprintf(stderr, \"%s: EOF on stdin\\n\", gf_time());## 37 ##src/nonblock/strclinonb.c##\n                stdineof = 1;   /* all done with stdin */## 38 ##src/nonblock/strclinonb.c##\n                if (tooptr == toiptr)## 39 ##src/nonblock/strclinonb.c##\n                    Shutdown(sockfd, SHUT_WR);  /* send FIN */## 40 ##src/nonblock/strclinonb.c##\n\n            } else {## 41 ##src/nonblock/strclinonb.c##\n                fprintf(stderr, \"%s: read %d bytes from stdin\\n\", gf_time(),## 42 ##src/nonblock/strclinonb.c##\n                        n);## 43 ##src/nonblock/strclinonb.c##\n                toiptr += n;    /* # just read */## 44 ##src/nonblock/strclinonb.c##\n                FD_SET(sockfd, &wset);  /* try and write to socket below */## 45 ##src/nonblock/strclinonb.c##\n            }## 46 ##src/nonblock/strclinonb.c##\n        }## 47 ##src/nonblock/strclinonb.c##\n\n        if (FD_ISSET(sockfd, &rset)) {## 48 ##src/nonblock/strclinonb.c##\n            if ((n = read(sockfd, friptr, &fr[MAXLINE] - friptr)) < 0) {## 49 ##src/nonblock/strclinonb.c##\n                if (errno != EWOULDBLOCK)## 50 ##src/nonblock/strclinonb.c##\n                    err_sys(\"read error on socket\");## 51 ##src/nonblock/strclinonb.c##\n\n            } else if (n == 0) {## 52 ##src/nonblock/strclinonb.c##\n                fprintf(stderr, \"%s: EOF on socket\\n\", gf_time());## 53 ##src/nonblock/strclinonb.c##\n                if (stdineof)## 54 ##src/nonblock/strclinonb.c##\n                    return;     /* normal termination */## 55 ##src/nonblock/strclinonb.c##\n                else## 56 ##src/nonblock/strclinonb.c##\n                    err_quit(\"str_cli: server terminated prematurely\");## 57 ##src/nonblock/strclinonb.c##\n\n            } else {## 58 ##src/nonblock/strclinonb.c##\n                fprintf(stderr, \"%s: read %d bytes from socket\\n\",## 59 ##src/nonblock/strclinonb.c##\n                        gf_time(), n);## 60 ##src/nonblock/strclinonb.c##\n                friptr += n;    /* # just read */## 61 ##src/nonblock/strclinonb.c##\n                FD_SET(STDOUT_FILENO, &wset);   /* try and write below */## 62 ##src/nonblock/strclinonb.c##\n            }## 63 ##src/nonblock/strclinonb.c##\n        }## 64 ##src/nonblock/strclinonb.c##\n/* end nonb2 */\n/* include nonb3 */\n        if (FD_ISSET(STDOUT_FILENO, &wset) && ((n = friptr - froptr) > 0)) {## 65 ##src/nonblock/strclinonb.c##\n            if ((nwritten = write(STDOUT_FILENO, froptr, n)) < 0) {## 66 ##src/nonblock/strclinonb.c##\n                if (errno != EWOULDBLOCK)## 67 ##src/nonblock/strclinonb.c##\n                    err_sys(\"write error to stdout\");## 68 ##src/nonblock/strclinonb.c##\n\n            } else {## 69 ##src/nonblock/strclinonb.c##\n                fprintf(stderr, \"%s: wrote %d bytes to stdout\\n\",## 70 ##src/nonblock/strclinonb.c##\n                        gf_time(), nwritten);## 71 ##src/nonblock/strclinonb.c##\n                froptr += nwritten; /* # just written */## 72 ##src/nonblock/strclinonb.c##\n                if (froptr == friptr)## 73 ##src/nonblock/strclinonb.c##\n                    froptr = friptr = fr;   /* back to beginning of buffer */## 74 ##src/nonblock/strclinonb.c##\n            }## 75 ##src/nonblock/strclinonb.c##\n        }## 76 ##src/nonblock/strclinonb.c##\n\n        if (FD_ISSET(sockfd, &wset) && ((n = toiptr - tooptr) > 0)) {## 77 ##src/nonblock/strclinonb.c##\n            if ((nwritten = write(sockfd, tooptr, n)) < 0) {## 78 ##src/nonblock/strclinonb.c##\n                if (errno != EWOULDBLOCK)## 79 ##src/nonblock/strclinonb.c##\n                    err_sys(\"write error to socket\");## 80 ##src/nonblock/strclinonb.c##\n\n            } else {## 81 ##src/nonblock/strclinonb.c##\n                fprintf(stderr, \"%s: wrote %d bytes to socket\\n\",## 82 ##src/nonblock/strclinonb.c##\n                        gf_time(), nwritten);## 83 ##src/nonblock/strclinonb.c##\n                tooptr += nwritten; /* # just written */## 84 ##src/nonblock/strclinonb.c##\n                if (tooptr == toiptr) {## 85 ##src/nonblock/strclinonb.c##\n                    toiptr = tooptr = to;   /* back to beginning of buffer */## 86 ##src/nonblock/strclinonb.c##\n                    if (stdineof)## 87 ##src/nonblock/strclinonb.c##\n                        Shutdown(sockfd, SHUT_WR);  /* send FIN */## 88 ##src/nonblock/strclinonb.c##\n                }## 89 ##src/nonblock/strclinonb.c##\n            }## 90 ##src/nonblock/strclinonb.c##\n        }## 91 ##src/nonblock/strclinonb.c##\n    }## 92 ##src/nonblock/strclinonb.c##\n}## 93 ##src/nonblock/strclinonb.c##\n/* end nonb3 */\n"
  },
  {
    "path": "nonblock/tcpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "nonblock/tcpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "nonblock/tcpcli03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct linger\t\tling;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tling.l_onoff = 1;\t\t/* cause RST to be sent on close() */\n\tling.l_linger = 0;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));\n\tClose(sockfd);\n\n\texit(0);\n}\n"
  },
  {
    "path": "nonblock/tcpcli03.lc",
    "content": "#include    \"unp.h\"##  1 ##src/nonblock/tcpcli03.c##\n\nint##  2 ##src/nonblock/tcpcli03.c##\nmain(int argc, char **argv)##  3 ##src/nonblock/tcpcli03.c##\n{##  4 ##src/nonblock/tcpcli03.c##\n    int     sockfd;##  5 ##src/nonblock/tcpcli03.c##\n    struct linger ling;##  6 ##src/nonblock/tcpcli03.c##\n    struct sockaddr_in servaddr;##  7 ##src/nonblock/tcpcli03.c##\n\n    if (argc != 2)##  8 ##src/nonblock/tcpcli03.c##\n        err_quit(\"usage: tcpcli <IPaddress>\");##  9 ##src/nonblock/tcpcli03.c##\n\n    sockfd = Socket(AF_INET, SOCK_STREAM, 0);## 10 ##src/nonblock/tcpcli03.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 11 ##src/nonblock/tcpcli03.c##\n    servaddr.sin_family = AF_INET;## 12 ##src/nonblock/tcpcli03.c##\n    servaddr.sin_port = htons(SERV_PORT);## 13 ##src/nonblock/tcpcli03.c##\n    Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);## 14 ##src/nonblock/tcpcli03.c##\n\n    Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));## 15 ##src/nonblock/tcpcli03.c##\n\n    ling.l_onoff = 1;           /* cause RST to be sent on close() */## 16 ##src/nonblock/tcpcli03.c##\n    ling.l_linger = 0;## 17 ##src/nonblock/tcpcli03.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));## 18 ##src/nonblock/tcpcli03.c##\n    Close(sockfd);## 19 ##src/nonblock/tcpcli03.c##\n\n    exit(0);## 20 ##src/nonblock/tcpcli03.c##\n}## 21 ##src/nonblock/tcpcli03.c##\n"
  },
  {
    "path": "nonblock/tcpcli04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct linger\t\tling;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tling.l_onoff = 1;\t\t/* cause RST to be sent on close() */\n\tling.l_linger = 0;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "nonblock/tcpservselect03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\ti, maxi, maxfd, listenfd, connfd, sockfd;\n\tint\t\t\t\t\tnready, client[FD_SETSIZE];\n\tssize_t\t\t\t\tn;\n\tfd_set\t\t\t\trset, allset;\n\tchar\t\t\t\tline[MAXLINE];\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tmaxfd = listenfd;\t\t\t/* initialize */\n\tmaxi = -1;\t\t\t\t\t/* index into client[] array */\n\tfor (i = 0; i < FD_SETSIZE; i++)\n\t\tclient[i] = -1;\t\t\t/* -1 indicates available entry */\n\tFD_ZERO(&allset);\n\tFD_SET(listenfd, &allset);\n\n\tfor ( ; ; ) {\n\t\trset = allset;\n\t\tnready = Select(maxfd+1, &rset, NULL, NULL, NULL);\n\n\t\tif (FD_ISSET(listenfd, &rset)) {\t/* new client connection */\n\t\t\tprintf(\"listening socket readable\\n\");\n\t\t\tsleep(5);\n\t\t\tclilen = sizeof(cliaddr);\n\t\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &clilen);\n#ifdef\tNOTDEF\n\t\t\tprintf(\"new client: %s, port %d\\n\",\n\t\t\t\t\tInet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),\n\t\t\t\t\tntohs(cliaddr.sin_port));\n#endif\n\n\t\t\tfor (i = 0; i < FD_SETSIZE; i++)\n\t\t\t\tif (client[i] < 0) {\n\t\t\t\t\tclient[i] = connfd;\t/* save descriptor */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tif (i == FD_SETSIZE)\n\t\t\t\terr_quit(\"too many clients\");\n\n\t\t\tFD_SET(connfd, &allset);\t/* add new descriptor to set */\n\t\t\tif (connfd > maxfd)\n\t\t\t\tmaxfd = connfd;\t\t\t/* for select */\n\t\t\tif (i > maxi)\n\t\t\t\tmaxi = i;\t\t\t\t/* max index in client[] array */\n\n\t\t\tif (--nready <= 0)\n\t\t\t\tcontinue;\t\t\t\t/* no more readable descriptors */\n\t\t}\n\n\t\tfor (i = 0; i <= maxi; i++) {\t/* check all clients for data */\n\t\t\tif ( (sockfd = client[i]) < 0)\n\t\t\t\tcontinue;\n\t\t\tif (FD_ISSET(sockfd, &rset)) {\n\t\t\t\tif ( (n = Readline(sockfd, line, MAXLINE)) == 0) {\n\t\t\t\t\t\t /* connection closed by client */\n\t\t\t\t\tClose(sockfd);\n\t\t\t\t\tFD_CLR(sockfd, &allset);\n\t\t\t\t\tclient[i] = -1;\n\t\t\t\t}\n\t\t\t\tWriten(sockfd, line, n);\n\n\t\t\t\tif (--nready <= 0)\n\t\t\t\t\tbreak;\t\t\t\t/* no more readable descriptors */\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "nonblock/web.c",
    "content": "/* include web1 */\n#include\t\"web.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti, fd, n, maxnconn, flags, error;\n\tchar\tbuf[MAXLINE];\n\tfd_set\trs, ws;\n\n\tif (argc < 5)\n\t\terr_quit(\"usage: web <#conns> <hostname> <homepage> <file1> ...\");\n\tmaxnconn = atoi(argv[1]);\n\n\tnfiles = min(argc - 4, MAXFILES);\n\tfor (i = 0; i < nfiles; i++) {\n\t\tfile[i].f_name = argv[i + 4];\n\t\tfile[i].f_host = argv[2];\n\t\tfile[i].f_flags = 0;\n\t}\n\tprintf(\"nfiles = %d\\n\", nfiles);\n\n\thome_page(argv[2], argv[3]);\n\n\tFD_ZERO(&rset);\n\tFD_ZERO(&wset);\n\tmaxfd = -1;\n\tnlefttoread = nlefttoconn = nfiles;\n\tnconn = 0;\n/* end web1 */\n/* include web2 */\n\twhile (nlefttoread > 0) {\n\t\twhile (nconn < maxnconn && nlefttoconn > 0) {\n\t\t\t\t/* 4find a file to read */\n\t\t\tfor (i = 0 ; i < nfiles; i++)\n\t\t\t\tif (file[i].f_flags == 0)\n\t\t\t\t\tbreak;\n\t\t\tif (i == nfiles)\n\t\t\t\terr_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);\n\t\t\tstart_connect(&file[i]);\n\t\t\tnconn++;\n\t\t\tnlefttoconn--;\n\t\t}\n\n\t\trs = rset;\n\t\tws = wset;\n\t\tn = Select(maxfd+1, &rs, &ws, NULL, NULL);\n\n\t\tfor (i = 0; i < nfiles; i++) {\n\t\t\tflags = file[i].f_flags;\n\t\t\tif (flags == 0 || flags & F_DONE)\n\t\t\t\tcontinue;\n\t\t\tfd = file[i].f_fd;\n\t\t\tif (flags & F_CONNECTING &&\n\t\t\t\t(FD_ISSET(fd, &rs) || FD_ISSET(fd, &ws))) {\n\t\t\t\tn = sizeof(error);\n\t\t\t\tif (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &n) < 0 ||\n\t\t\t\t\terror != 0) {\n\t\t\t\t\terr_ret(\"nonblocking connect failed for %s\",\n\t\t\t\t\t\t\tfile[i].f_name);\n\t\t\t\t}\n\t\t\t\t\t/* 4connection established */\n\t\t\t\tprintf(\"connection established for %s\\n\", file[i].f_name);\n\t\t\t\tFD_CLR(fd, &wset);\t\t/* no more writeability test */\n\t\t\t\twrite_get_cmd(&file[i]);/* write() the GET command */\n\n\t\t\t} else if (flags & F_READING && FD_ISSET(fd, &rs)) {\n\t\t\t\tif ( (n = Read(fd, buf, sizeof(buf))) == 0) {\n\t\t\t\t\tprintf(\"end-of-file on %s\\n\", file[i].f_name);\n\t\t\t\t\tClose(fd);\n\t\t\t\t\tfile[i].f_flags = F_DONE;\t/* clears F_READING */\n\t\t\t\t\tFD_CLR(fd, &rset);\n\t\t\t\t\tnconn--;\n\t\t\t\t\tnlefttoread--;\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\"read %d bytes from %s\\n\", n, file[i].f_name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\texit(0);\n}\n/* end web2 */\n"
  },
  {
    "path": "nonblock/web.h",
    "content": "#include\t\"unp.h\"\n\n#define\tMAXFILES\t20\n#define\tSERV\t\t\"80\"\t/* port number or service name */\n\nstruct file {\n  char\t*f_name;\t\t\t/* filename */\n  char\t*f_host;\t\t\t/* hostname or IPv4/IPv6 address */\n  int    f_fd;\t\t\t\t/* descriptor */\n  int\t f_flags;\t\t\t/* F_xxx below */\n} file[MAXFILES];\n\n#define\tF_CONNECTING\t1\t/* connect() in progress */\n#define\tF_READING\t\t2\t/* connect() complete; now reading */\n#define\tF_DONE\t\t\t4\t/* all done */\n\n#define\tGET_CMD\t\t\"GET %s HTTP/1.0\\r\\n\\r\\n\"\n\n\t\t\t/* globals */\nint\t\tnconn, nfiles, nlefttoconn, nlefttoread, maxfd;\nfd_set\trset, wset;\n\n\t\t\t/* function prototypes */\nvoid\thome_page(const char *, const char *);\nvoid\tstart_connect(struct file *);\nvoid\twrite_get_cmd(struct file *);\n"
  },
  {
    "path": "nonblock/web.lc",
    "content": "/* include web1 */\n#include    \"web.h\"##  1 ##src/nonblock/web.c##\n\nint##  2 ##src/nonblock/web.c##\nmain(int argc, char **argv)##  3 ##src/nonblock/web.c##\n{##  4 ##src/nonblock/web.c##\n    int     i, fd, n, maxnconn, flags, error;##  5 ##src/nonblock/web.c##\n    char    buf[MAXLINE];##  6 ##src/nonblock/web.c##\n    fd_set  rs, ws;##  7 ##src/nonblock/web.c##\n\n    if (argc < 5)##  8 ##src/nonblock/web.c##\n        err_quit(\"usage: web <#conns> <hostname> <homepage> <file1> ...\");##  9 ##src/nonblock/web.c##\n    maxnconn = atoi(argv[1]);## 10 ##src/nonblock/web.c##\n\n    nfiles = min(argc - 4, MAXFILES);## 11 ##src/nonblock/web.c##\n    for (i = 0; i < nfiles; i++) {## 12 ##src/nonblock/web.c##\n        file[i].f_name = argv[i + 4];## 13 ##src/nonblock/web.c##\n        file[i].f_host = argv[2];## 14 ##src/nonblock/web.c##\n        file[i].f_flags = 0;## 15 ##src/nonblock/web.c##\n    }## 16 ##src/nonblock/web.c##\n    printf(\"nfiles = %d\\n\", nfiles);## 17 ##src/nonblock/web.c##\n\n    home_page(argv[2], argv[3]);## 18 ##src/nonblock/web.c##\n\n    FD_ZERO(&rset);## 19 ##src/nonblock/web.c##\n    FD_ZERO(&wset);## 20 ##src/nonblock/web.c##\n    maxfd = -1;## 21 ##src/nonblock/web.c##\n    nlefttoread = nlefttoconn = nfiles;## 22 ##src/nonblock/web.c##\n    nconn = 0;## 23 ##src/nonblock/web.c##\n/* end web1 */\n/* include web2 */\n    while (nlefttoread > 0) {## 24 ##src/nonblock/web.c##\n        while (nconn < maxnconn && nlefttoconn > 0) {## 25 ##src/nonblock/web.c##\n            /* 4find a file to read */## 26 ##src/nonblock/web.c##\n            for (i = 0; i < nfiles; i++)## 27 ##src/nonblock/web.c##\n                if (file[i].f_flags == 0)## 28 ##src/nonblock/web.c##\n                    break;## 29 ##src/nonblock/web.c##\n            if (i == nfiles)## 30 ##src/nonblock/web.c##\n                err_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);## 31 ##src/nonblock/web.c##\n            start_connect(&file[i]);## 32 ##src/nonblock/web.c##\n            nconn++;## 33 ##src/nonblock/web.c##\n            nlefttoconn--;## 34 ##src/nonblock/web.c##\n        }## 35 ##src/nonblock/web.c##\n\n        rs = rset;## 36 ##src/nonblock/web.c##\n        ws = wset;## 37 ##src/nonblock/web.c##\n        n = Select(maxfd + 1, &rs, &ws, NULL, NULL);## 38 ##src/nonblock/web.c##\n\n        for (i = 0; i < nfiles; i++) {## 39 ##src/nonblock/web.c##\n            flags = file[i].f_flags;## 40 ##src/nonblock/web.c##\n            if (flags == 0 || flags & F_DONE)## 41 ##src/nonblock/web.c##\n                continue;## 42 ##src/nonblock/web.c##\n            fd = file[i].f_fd;## 43 ##src/nonblock/web.c##\n            if (flags & F_CONNECTING &&## 44 ##src/nonblock/web.c##\n                (FD_ISSET(fd, &rs) || FD_ISSET(fd, &ws))) {## 45 ##src/nonblock/web.c##\n                n = sizeof(error);## 46 ##src/nonblock/web.c##\n                if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &n) < 0 ||## 47 ##src/nonblock/web.c##\n                    error != 0) {## 48 ##src/nonblock/web.c##\n                    err_ret(\"nonblocking connect failed for %s\",## 49 ##src/nonblock/web.c##\n                            file[i].f_name);## 50 ##src/nonblock/web.c##\n                }## 51 ##src/nonblock/web.c##\n                /* 4connection established */## 52 ##src/nonblock/web.c##\n                printf(\"connection established for %s\\n\", file[i].f_name);## 53 ##src/nonblock/web.c##\n                FD_CLR(fd, &wset);  /* no more writeability test */## 54 ##src/nonblock/web.c##\n                write_get_cmd(&file[i]);    /* write() the GET command */## 55 ##src/nonblock/web.c##\n\n            } else if (flags & F_READING && FD_ISSET(fd, &rs)) {## 56 ##src/nonblock/web.c##\n                if ((n = Read(fd, buf, sizeof(buf))) == 0) {## 57 ##src/nonblock/web.c##\n                    printf(\"end-of-file on %s\\n\", file[i].f_name);## 58 ##src/nonblock/web.c##\n                    Close(fd);## 59 ##src/nonblock/web.c##\n                    file[i].f_flags = F_DONE;   /* clears F_READING */## 60 ##src/nonblock/web.c##\n                    FD_CLR(fd, &rset);## 61 ##src/nonblock/web.c##\n                    nconn--;## 62 ##src/nonblock/web.c##\n                    nlefttoread--;## 63 ##src/nonblock/web.c##\n                } else {## 64 ##src/nonblock/web.c##\n                    printf(\"read %d bytes from %s\\n\", n, file[i].f_name);## 65 ##src/nonblock/web.c##\n                }## 66 ##src/nonblock/web.c##\n            }## 67 ##src/nonblock/web.c##\n        }## 68 ##src/nonblock/web.c##\n    }## 69 ##src/nonblock/web.c##\n    exit(0);## 70 ##src/nonblock/web.c##\n}## 71 ##src/nonblock/web.c##\n/* end web2 */\n"
  },
  {
    "path": "nonblock/write_get_cmd.c",
    "content": "#include\t\"web.h\"\n\nvoid\nwrite_get_cmd(struct file *fptr)\n{\n\tint\t\tn;\n\tchar\tline[MAXLINE];\n\n\tn = snprintf(line, sizeof(line), GET_CMD, fptr->f_name);\n\tWriten(fptr->f_fd, line, n);\n\tprintf(\"wrote %d bytes for %s\\n\", n, fptr->f_name);\n\n\tfptr->f_flags = F_READING;\t\t\t/* clears F_CONNECTING */\n\n\tFD_SET(fptr->f_fd, &rset);\t\t\t/* will read server's reply */\n\tif (fptr->f_fd > maxfd)\n\t\tmaxfd = fptr->f_fd;\n}\n"
  },
  {
    "path": "oob/Makefile",
    "content": "include ../Make.defines\n\n# XXX get autoconf to put tcprecv03p in here if the system supports poll\nPROGS =\ttcprecv01 tcprecv02 tcprecv03 tcprecv04 tcprecv05 tcprecv06 \\\n\t tcpsend01 tcpsend02 tcpsend03 tcpsend04 tcpsend05 tcpsend06 \\\n\t tcpcli02 tcpserv02\n\nall:\t${PROGS}\n\ntcprecv01:\ttcprecv01.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv01.o ${LIBS}\n\ntcpsend01:\ttcpsend01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpsend01.o ${LIBS}\n\ntcprecv02:\ttcprecv02.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv02.o ${LIBS}\n\ntcpsend02:\ttcpsend02.o\n\t\t${CC} ${CFLAGS} -o $@ tcpsend02.o ${LIBS}\n\ntcprecv03:\ttcprecv03.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv03.o ${LIBS}\n\ntcprecv03p:\ttcprecv03p.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv03p.o ${LIBS}\n\ntcpsend03:\ttcpsend03.o\n\t\t${CC} ${CFLAGS} -o $@ tcpsend03.o ${LIBS}\n\ntcprecv04:\ttcprecv04.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv04.o ${LIBS}\n\ntcpsend04:\ttcpsend04.o\n\t\t${CC} ${CFLAGS} -o $@ tcpsend04.o ${LIBS}\n\ntcprecv05:\ttcprecv05.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv05.o ${LIBS}\n\ntcpsend05:\ttcpsend05.o\n\t\t${CC} ${CFLAGS} -o $@ tcpsend05.o ${LIBS}\n\ntcprecv06:\ttcprecv06.o\n\t\t${CC} ${CFLAGS} -o $@ tcprecv06.o ${LIBS}\n\ntcpsend06:\ttcpsend06.o\n\t\t${CC} ${CFLAGS} -o $@ tcpsend06.o ${LIBS}\n\ntcpcli02:\ttcpcli02.o strcliselect02.o heartbeatcli.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli02.o strcliselect02.o heartbeatcli.o ${LIBS}\n\ntcpserv02:\ttcpserv02.o strecho02.o heartbeatserv.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv02.o strecho02.o heartbeatserv.o sigchldwaitpid.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "oob/heartbeatcli.c",
    "content": "#include\t\"unp.h\"\n\nstatic int\t\tservfd;\nstatic int\t\tnsec;\t\t\t/* #seconds betweeen each alarm */\nstatic int\t\tmaxnprobes;\t\t/* #probes w/no response before quit */\nstatic int\t\tnprobes;\t\t/* #probes since last server response */\nstatic void\tsig_urg(int), sig_alrm(int);\n\nvoid\nheartbeat_cli(int servfd_arg, int nsec_arg, int maxnprobes_arg)\n{\n\tservfd = servfd_arg;\t\t/* set globals for signal handlers */\n\tif ( (nsec = nsec_arg) < 1)\n\t\tnsec = 1;\n\tif ( (maxnprobes = maxnprobes_arg) < nsec)\n\t\tmaxnprobes = nsec;\n\tnprobes = 0;\n\n\tSignal(SIGURG, sig_urg);\n\tFcntl(servfd, F_SETOWN, getpid());\n\n\tSignal(SIGALRM, sig_alrm);\n\talarm(nsec);\n}\n\nstatic void\nsig_urg(int signo)\n{\n\tint\t\tn;\n\tchar\tc;\n \n\tif ( (n = recv(servfd, &c, 1, MSG_OOB)) < 0) {\n\t\tif (errno != EWOULDBLOCK)\n\t\t\terr_sys(\"recv error\");\n\t}\n\tnprobes = 0;\t\t\t/* reset counter */\n\treturn;\t\t\t\t\t/* may interrupt client code */\n}\n\nstatic void\nsig_alrm(int signo)\n{\n\tif (++nprobes > maxnprobes) {\n\t\tfprintf(stderr, \"server is unreachable\\n\");\n\t\texit(0);\n\t}\n\tSend(servfd, \"1\", 1, MSG_OOB);\n\talarm(nsec);\n\treturn;\t\t\t\t\t/* may interrupt client code */\n}\n"
  },
  {
    "path": "oob/heartbeatserv.c",
    "content": "#include\t\"unp.h\"\n\nstatic int\tservfd;\nstatic int\tnsec;\t\t\t/* #seconds between each alarm */\nstatic int\tmaxnalarms;\t\t/* #alarms w/no client probe before quit */\nstatic int\tnprobes;\t\t/* #alarms since last client probe */\nstatic void\tsig_urg(int), sig_alrm(int);\n\nvoid\nheartbeat_serv(int servfd_arg, int nsec_arg, int maxnalarms_arg)\n{\n\tservfd = servfd_arg;\t\t/* set globals for signal handlers */\n\tif ( (nsec = nsec_arg) < 1)\n\t\tnsec = 1;\n\tif ( (maxnalarms = maxnalarms_arg) < nsec)\n\t\tmaxnalarms = nsec;\n\n\tSignal(SIGURG, sig_urg);\n\tFcntl(servfd, F_SETOWN, getpid());\n\n\tSignal(SIGALRM, sig_alrm);\n\talarm(nsec);\n}\n\nstatic void\nsig_urg(int signo)\n{\n\tint\t\tn;\n\tchar\tc;\n \n\tif ( (n = recv(servfd, &c, 1, MSG_OOB)) < 0) {\n\t\tif (errno != EWOULDBLOCK)\n\t\t\terr_sys(\"recv error\");\n\t}\n\tSend(servfd, &c, 1, MSG_OOB);\t/* echo back out-of-band byte */\n\n\tnprobes = 0;\t\t\t/* reset counter */\n\treturn;\t\t\t\t\t/* may interrupt server code */\n}\n\nstatic void\nsig_alrm(int signo)\n{\n\tif (++nprobes > maxnalarms) {\n\t\tprintf(\"no probes from client\\n\");\n\t\texit(0);\n\t}\n\talarm(nsec);\n\treturn;\t\t\t\t\t/* may interrupt server code */\n}\n"
  },
  {
    "path": "oob/sigchldwaitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {\n\t\tprintf(\"child %d terminated\\n\", pid);\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "oob/strcliselect02.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\t\tmaxfdp1, stdineof = 0;\n\tfd_set\t\trset;\n\tchar\t\tsendline[MAXLINE], recvline[MAXLINE];\n\n\theartbeat_cli(sockfd, 1, 5);\n\n\tFD_ZERO(&rset);\n\tfor ( ; ; ) {\n\t\tif (stdineof == 0)\n\t\t\tFD_SET(fileno(fp), &rset);\n\t\tFD_SET(sockfd, &rset);\n\t\tmaxfdp1 = max(fileno(fp), sockfd) + 1;\n\t\tif (select(maxfdp1, &rset, NULL, NULL, NULL) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\n\t\t\telse\n\t\t\t\terr_sys(\"select error\");\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* socket is readable */\n\t\t\tif (Readline(sockfd, recvline, MAXLINE) == 0) {\n\t\t\t\tif (stdineof == 1)\n\t\t\t\t\treturn;\t\t/* normal termination */\n\t\t\t\telse\n\t\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\t\t\t}\n\n\t\t\tWriten(STDOUT_FILENO, recvline, strlen(recvline));\n\t\t}\n\n\t\tif (FD_ISSET(fileno(fp), &rset)) {  /* input is readable */\n\t\t\tif (Fgets(sendline, MAXLINE, fp) == NULL) {\n\t\t\t\tstdineof = 1;\n\t\t\t\talarm(0);\t\t\t/* turn off heartbeat */\n\t\t\t\tShutdown(sockfd, SHUT_WR);\t/* send FIN */\n\t\t\t\tFD_CLR(fileno(fp), &rset);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tWriten(sockfd, sendline, strlen(sendline));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "oob/strecho02.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_echo(int sockfd)\n{\n\tssize_t\t\tn;\n\tchar\t\tline[MAXLINE];\n\n\theartbeat_serv(sockfd, 1, 5);\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Readline(sockfd, line, MAXLINE)) == 0)\n\t\t\treturn;\t\t/* connection closed by other end */\n\n\t\tWriten(sockfd, line, n);\n\t}\n}\n"
  },
  {
    "path": "oob/tcpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcprecv01.c",
    "content": "#include\t\"unp.h\"\n\nint\t\tlistenfd, connfd;\n\nvoid\tsig_urg(int);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tn;\n\tchar\tbuff[100];\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv01 [ <host> ] <port#>\");\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\n\tSignal(SIGURG, sig_urg);\n\tFcntl(connfd, F_SETOWN, getpid());\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Read(connfd, buff, sizeof(buff)-1)) == 0) {\n\t\t\tprintf(\"received EOF\\n\");\n\t\t\texit(0);\n\t\t}\n\t\tbuff[n] = 0;\t/* null terminate */\n\t\tprintf(\"read %d bytes: %s\\n\", n, buff);\n\t}\n}\n\nvoid\nsig_urg(int signo)\n{\n\tint\t\tn;\n\tchar\tbuff[100];\n\n\tprintf(\"SIGURG received\\n\");\n\tn = Recv(connfd, buff, sizeof(buff)-1, MSG_OOB);\n\tbuff[n] = 0;\t\t/* null terminate */\n\tprintf(\"read %d OOB byte: %s\\n\", n, buff);\n}\n"
  },
  {
    "path": "oob/tcprecv01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcprecv01.c##\n\nint     listenfd, connfd;##  2 ##src/oob/tcprecv01.c##\n\nvoid    sig_urg(int);##  3 ##src/oob/tcprecv01.c##\n\nint##  4 ##src/oob/tcprecv01.c##\nmain(int argc, char **argv)##  5 ##src/oob/tcprecv01.c##\n{##  6 ##src/oob/tcprecv01.c##\n    int     n;##  7 ##src/oob/tcprecv01.c##\n    char    buff[100];##  8 ##src/oob/tcprecv01.c##\n\n    if (argc == 2)##  9 ##src/oob/tcprecv01.c##\n        listenfd = Tcp_listen(NULL, argv[1], NULL);## 10 ##src/oob/tcprecv01.c##\n    else if (argc == 3)## 11 ##src/oob/tcprecv01.c##\n        listenfd = Tcp_listen(argv[1], argv[2], NULL);## 12 ##src/oob/tcprecv01.c##\n    else## 13 ##src/oob/tcprecv01.c##\n        err_quit(\"usage: tcprecv01 [ <host> ] <port#>\");## 14 ##src/oob/tcprecv01.c##\n\n    connfd = Accept(listenfd, NULL, NULL);## 15 ##src/oob/tcprecv01.c##\n\n    Signal(SIGURG, sig_urg);## 16 ##src/oob/tcprecv01.c##\n    Fcntl(connfd, F_SETOWN, getpid());## 17 ##src/oob/tcprecv01.c##\n\n    for (;;) {## 18 ##src/oob/tcprecv01.c##\n        if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {## 19 ##src/oob/tcprecv01.c##\n            printf(\"received EOF\\n\");## 20 ##src/oob/tcprecv01.c##\n            exit(0);## 21 ##src/oob/tcprecv01.c##\n        }## 22 ##src/oob/tcprecv01.c##\n        buff[n] = 0;            /* null terminate */## 23 ##src/oob/tcprecv01.c##\n        printf(\"read %d bytes: %s\\n\", n, buff);## 24 ##src/oob/tcprecv01.c##\n    }## 25 ##src/oob/tcprecv01.c##\n}## 26 ##src/oob/tcprecv01.c##\n\nvoid## 27 ##src/oob/tcprecv01.c##\nsig_urg(int signo)## 28 ##src/oob/tcprecv01.c##\n{## 29 ##src/oob/tcprecv01.c##\n    int     n;## 30 ##src/oob/tcprecv01.c##\n    char    buff[100];## 31 ##src/oob/tcprecv01.c##\n\n    printf(\"SIGURG received\\n\");## 32 ##src/oob/tcprecv01.c##\n    n = Recv(connfd, buff, sizeof(buff) - 1, MSG_OOB);## 33 ##src/oob/tcprecv01.c##\n    buff[n] = 0;                /* null terminate */## 34 ##src/oob/tcprecv01.c##\n    printf(\"read %d OOB byte: %s\\n\", n, buff);## 35 ##src/oob/tcprecv01.c##\n}## 36 ##src/oob/tcprecv01.c##\n"
  },
  {
    "path": "oob/tcprecv02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tlistenfd, connfd, n;\n\tchar\tbuff[100];\n\tfd_set\trset, xset;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv02 [ <host> ] <port#>\");\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\n\tFD_ZERO(&rset);\n\tFD_ZERO(&xset);\n\tfor ( ; ; ) {\n\t\tFD_SET(connfd, &rset);\n\t\tFD_SET(connfd, &xset);\n\n\t\tSelect(connfd + 1, &rset, NULL, &xset, NULL);\n\n\t\tif (FD_ISSET(connfd, &xset)) {\n\t\t\tn = Recv(connfd, buff, sizeof(buff)-1, MSG_OOB);\n\t\t\tbuff[n] = 0;\t\t/* null terminate */\n\t\t\tprintf(\"read %d OOB byte: %s\\n\", n, buff);\n\t\t}\n\n\t\tif (FD_ISSET(connfd, &rset)) {\n\t\t\tif ( (n = Read(connfd, buff, sizeof(buff)-1)) == 0) {\n\t\t\t\tprintf(\"received EOF\\n\");\n\t\t\t\texit(0);\n\t\t\t}\n\t\t\tbuff[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"read %d bytes: %s\\n\", n, buff);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "oob/tcprecv02.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcprecv02.c##\n\nint##  2 ##src/oob/tcprecv02.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcprecv02.c##\n{##  4 ##src/oob/tcprecv02.c##\n    int     listenfd, connfd, n;##  5 ##src/oob/tcprecv02.c##\n    char    buff[100];##  6 ##src/oob/tcprecv02.c##\n    fd_set  rset, xset;##  7 ##src/oob/tcprecv02.c##\n\n    if (argc == 2)##  8 ##src/oob/tcprecv02.c##\n        listenfd = Tcp_listen(NULL, argv[1], NULL);##  9 ##src/oob/tcprecv02.c##\n    else if (argc == 3)## 10 ##src/oob/tcprecv02.c##\n        listenfd = Tcp_listen(argv[1], argv[2], NULL);## 11 ##src/oob/tcprecv02.c##\n    else## 12 ##src/oob/tcprecv02.c##\n        err_quit(\"usage: tcprecv02 [ <host> ] <port#>\");## 13 ##src/oob/tcprecv02.c##\n\n    connfd = Accept(listenfd, NULL, NULL);## 14 ##src/oob/tcprecv02.c##\n\n    FD_ZERO(&rset);## 15 ##src/oob/tcprecv02.c##\n    FD_ZERO(&xset);## 16 ##src/oob/tcprecv02.c##\n    for (;;) {## 17 ##src/oob/tcprecv02.c##\n        FD_SET(connfd, &rset);## 18 ##src/oob/tcprecv02.c##\n        FD_SET(connfd, &xset);## 19 ##src/oob/tcprecv02.c##\n\n        Select(connfd + 1, &rset, NULL, &xset, NULL);## 20 ##src/oob/tcprecv02.c##\n\n        if (FD_ISSET(connfd, &xset)) {## 21 ##src/oob/tcprecv02.c##\n            n = Recv(connfd, buff, sizeof(buff) - 1, MSG_OOB);## 22 ##src/oob/tcprecv02.c##\n            buff[n] = 0;        /* null terminate */## 23 ##src/oob/tcprecv02.c##\n            printf(\"read %d OOB byte: %s\\n\", n, buff);## 24 ##src/oob/tcprecv02.c##\n        }## 25 ##src/oob/tcprecv02.c##\n\n        if (FD_ISSET(connfd, &rset)) {## 26 ##src/oob/tcprecv02.c##\n            if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {## 27 ##src/oob/tcprecv02.c##\n                printf(\"received EOF\\n\");## 28 ##src/oob/tcprecv02.c##\n                exit(0);## 29 ##src/oob/tcprecv02.c##\n            }## 30 ##src/oob/tcprecv02.c##\n            buff[n] = 0;        /* null terminate */## 31 ##src/oob/tcprecv02.c##\n            printf(\"read %d bytes: %s\\n\", n, buff);## 32 ##src/oob/tcprecv02.c##\n        }## 33 ##src/oob/tcprecv02.c##\n    }## 34 ##src/oob/tcprecv02.c##\n}## 35 ##src/oob/tcprecv02.c##\n"
  },
  {
    "path": "oob/tcprecv03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tlistenfd, connfd, n, justreadoob = 0;\n\tchar\tbuff[100];\n\tfd_set\trset, xset;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv03 [ <host> ] <port#>\");\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\n\tFD_ZERO(&rset);\n\tFD_ZERO(&xset);\n\tfor ( ; ; ) {\n\t\tFD_SET(connfd, &rset);\n\t\tif (justreadoob == 0)\n\t\t\tFD_SET(connfd, &xset);\n\n\t\tSelect(connfd + 1, &rset, NULL, &xset, NULL);\n\n\t\tif (FD_ISSET(connfd, &xset)) {\n\t\t\tn = Recv(connfd, buff, sizeof(buff)-1, MSG_OOB);\n\t\t\tbuff[n] = 0;\t\t/* null terminate */\n\t\t\tprintf(\"read %d OOB byte: %s\\n\", n, buff);\n\t\t\tjustreadoob = 1;\n\t\t\tFD_CLR(connfd, &xset);\n\t\t}\n\n\t\tif (FD_ISSET(connfd, &rset)) {\n\t\t\tif ( (n = Read(connfd, buff, sizeof(buff)-1)) == 0) {\n\t\t\t\tprintf(\"received EOF\\n\");\n\t\t\t\texit(0);\n\t\t\t}\n\t\t\tbuff[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"read %d bytes: %s\\n\", n, buff);\n\t\t\tjustreadoob = 0;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "oob/tcprecv03p.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tlistenfd, connfd, n, justreadoob = 0;\n\tchar\tbuff[100];\n\tstruct pollfd\tpollfd[1];\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv03p [ <host> ] <port#>\");\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\n\tpollfd[0].fd = connfd;\n\tpollfd[0].events = POLLRDNORM;\n\tfor ( ; ; ) {\n\t\tif (justreadoob == 0)\n\t\t\tpollfd[0].events |= POLLRDBAND;\n\n\t\tPoll(pollfd, 1, INFTIM);\n\n\t\tif (pollfd[0].revents & POLLRDBAND) {\n\t\t\tn = Recv(connfd, buff, sizeof(buff)-1, MSG_OOB);\n\t\t\tbuff[n] = 0;\t\t/* null terminate */\n\t\t\tprintf(\"read %d OOB byte: %s\\n\", n, buff);\n\t\t\tjustreadoob = 1;\n\t\t\tpollfd[0].events &= ~POLLRDBAND;\t/* turn bit off */\n\t\t}\n\n\t\tif (pollfd[0].revents & POLLRDNORM) {\n\t\t\tif ( (n = Read(connfd, buff, sizeof(buff)-1)) == 0) {\n\t\t\t\tprintf(\"received EOF\\n\");\n\t\t\t\texit(0);\n\t\t\t}\n\t\t\tbuff[n] = 0;\t/* null terminate */\n\t\t\tprintf(\"read %d bytes: %s\\n\", n, buff);\n\t\t\tjustreadoob = 0;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "oob/tcprecv03p.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcprecv03p.c##\n\nint##  2 ##src/oob/tcprecv03p.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcprecv03p.c##\n{##  4 ##src/oob/tcprecv03p.c##\n    int     listenfd, connfd, n, justreadoob = 0;##  5 ##src/oob/tcprecv03p.c##\n    char    buff[100];##  6 ##src/oob/tcprecv03p.c##\n    struct pollfd pollfd[1];##  7 ##src/oob/tcprecv03p.c##\n\n    if (argc == 2)##  8 ##src/oob/tcprecv03p.c##\n        listenfd = Tcp_listen(NULL, argv[1], NULL);##  9 ##src/oob/tcprecv03p.c##\n    else if (argc == 3)## 10 ##src/oob/tcprecv03p.c##\n        listenfd = Tcp_listen(argv[1], argv[2], NULL);## 11 ##src/oob/tcprecv03p.c##\n    else## 12 ##src/oob/tcprecv03p.c##\n        err_quit(\"usage: tcprecv03p [ <host> ] <port#>\");## 13 ##src/oob/tcprecv03p.c##\n\n    connfd = Accept(listenfd, NULL, NULL);## 14 ##src/oob/tcprecv03p.c##\n\n    pollfd[0].fd = connfd;## 15 ##src/oob/tcprecv03p.c##\n    pollfd[0].events = POLLRDNORM;## 16 ##src/oob/tcprecv03p.c##\n    for (;;) {## 17 ##src/oob/tcprecv03p.c##\n        if (justreadoob == 0)## 18 ##src/oob/tcprecv03p.c##\n            pollfd[0].events |= POLLRDBAND;## 19 ##src/oob/tcprecv03p.c##\n\n        Poll(pollfd, 1, INFTIM);## 20 ##src/oob/tcprecv03p.c##\n\n        if (pollfd[0].revents & POLLRDBAND) {## 21 ##src/oob/tcprecv03p.c##\n            n = Recv(connfd, buff, sizeof(buff) - 1, MSG_OOB);## 22 ##src/oob/tcprecv03p.c##\n            buff[n] = 0;        /* null terminate */## 23 ##src/oob/tcprecv03p.c##\n            printf(\"read %d OOB byte: %s\\n\", n, buff);## 24 ##src/oob/tcprecv03p.c##\n            justreadoob = 1;## 25 ##src/oob/tcprecv03p.c##\n            pollfd[0].events &= ~POLLRDBAND;    /* turn bit off */## 26 ##src/oob/tcprecv03p.c##\n        }## 27 ##src/oob/tcprecv03p.c##\n\n        if (pollfd[0].revents & POLLRDNORM) {## 28 ##src/oob/tcprecv03p.c##\n            if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {## 29 ##src/oob/tcprecv03p.c##\n                printf(\"received EOF\\n\");## 30 ##src/oob/tcprecv03p.c##\n                exit(0);## 31 ##src/oob/tcprecv03p.c##\n            }## 32 ##src/oob/tcprecv03p.c##\n            buff[n] = 0;        /* null terminate */## 33 ##src/oob/tcprecv03p.c##\n            printf(\"read %d bytes: %s\\n\", n, buff);## 34 ##src/oob/tcprecv03p.c##\n            justreadoob = 0;## 35 ##src/oob/tcprecv03p.c##\n        }## 36 ##src/oob/tcprecv03p.c##\n    }## 37 ##src/oob/tcprecv03p.c##\n}## 38 ##src/oob/tcprecv03p.c##\n"
  },
  {
    "path": "oob/tcprecv04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tlistenfd, connfd, n, on=1;\n\tchar\tbuff[100];\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv04 [ <host> ] <port#>\");\n\n\tSetsockopt(listenfd, SOL_SOCKET, SO_OOBINLINE, &on, sizeof(on));\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\tsleep(5);\n\n\tfor ( ; ; ) {\n\t\tif (Sockatmark(connfd))\n\t\t\tprintf(\"at OOB mark\\n\");\n\n\t\tif ( (n = Read(connfd, buff, sizeof(buff)-1)) == 0) {\n\t\t\tprintf(\"received EOF\\n\");\n\t\t\texit(0);\n\t\t}\n\t\tbuff[n] = 0;\t/* null terminate */\n\t\tprintf(\"read %d bytes: %s\\n\", n, buff);\n\t}\n}\n"
  },
  {
    "path": "oob/tcprecv04.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcprecv04.c##\n\nint##  2 ##src/oob/tcprecv04.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcprecv04.c##\n{##  4 ##src/oob/tcprecv04.c##\n    int     listenfd, connfd, n, on = 1;##  5 ##src/oob/tcprecv04.c##\n    char    buff[100];##  6 ##src/oob/tcprecv04.c##\n\n    if (argc == 2)##  7 ##src/oob/tcprecv04.c##\n        listenfd = Tcp_listen(NULL, argv[1], NULL);##  8 ##src/oob/tcprecv04.c##\n    else if (argc == 3)##  9 ##src/oob/tcprecv04.c##\n        listenfd = Tcp_listen(argv[1], argv[2], NULL);## 10 ##src/oob/tcprecv04.c##\n    else## 11 ##src/oob/tcprecv04.c##\n        err_quit(\"usage: tcprecv04 [ <host> ] <port#>\");## 12 ##src/oob/tcprecv04.c##\n\n    Setsockopt(listenfd, SOL_SOCKET, SO_OOBINLINE, &on, sizeof(on));## 13 ##src/oob/tcprecv04.c##\n\n    connfd = Accept(listenfd, NULL, NULL);## 14 ##src/oob/tcprecv04.c##\n    sleep(5);## 15 ##src/oob/tcprecv04.c##\n\n    for (;;) {## 16 ##src/oob/tcprecv04.c##\n        if (Sockatmark(connfd))## 17 ##src/oob/tcprecv04.c##\n            printf(\"at OOB mark\\n\");## 18 ##src/oob/tcprecv04.c##\n\n        if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {## 19 ##src/oob/tcprecv04.c##\n            printf(\"received EOF\\n\");## 20 ##src/oob/tcprecv04.c##\n            exit(0);## 21 ##src/oob/tcprecv04.c##\n        }## 22 ##src/oob/tcprecv04.c##\n        buff[n] = 0;            /* null terminate */## 23 ##src/oob/tcprecv04.c##\n        printf(\"read %d bytes: %s\\n\", n, buff);## 24 ##src/oob/tcprecv04.c##\n    }## 25 ##src/oob/tcprecv04.c##\n}## 26 ##src/oob/tcprecv04.c##\n"
  },
  {
    "path": "oob/tcprecv05.c",
    "content": "#include\t\"unp.h\"\n\nint\t\tlistenfd, connfd;\n\nvoid\tsig_urg(int);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsize;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv05 [ <host> ] <port#>\");\n\n\tsize = 4096;\n\tSetsockopt(listenfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\n\tSignal(SIGURG, sig_urg);\n\tFcntl(connfd, F_SETOWN, getpid());\n\n\tfor ( ; ; )\n\t\tpause();\n}\n\nvoid\nsig_urg(int signo)\n{\n\tint\t\tn;\n\tchar\tbuff[2048];\n\n\tprintf(\"SIGURG received\\n\");\n\tn = Recv(connfd, buff, sizeof(buff)-1, MSG_OOB);\n\tbuff[n] = 0;\t\t/* null terminate */\n\tprintf(\"read %d OOB byte\\n\", n);\n}\n"
  },
  {
    "path": "oob/tcprecv06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tlistenfd, connfd, n, on=1;\n\tchar\tbuff[100];\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], NULL);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], NULL);\n\telse\n\t\terr_quit(\"usage: tcprecv06 [ <host> ] <port#>\");\n\n\tSetsockopt(listenfd, SOL_SOCKET, SO_OOBINLINE, &on, sizeof(on));\n\n\tconnfd = Accept(listenfd, NULL, NULL);\n\tsleep(5);\n\n\tfor ( ; ; ) {\n\t\tif (Sockatmark(connfd))\n\t\t\tprintf(\"at OOB mark\\n\");\n\n\t\tif ( (n = Read(connfd, buff, sizeof(buff)-1)) == 0) {\n\t\t\tprintf(\"received EOF\\n\");\n\t\t\texit(0);\n\t\t}\n\t\tbuff[n] = 0;\t/* null terminate */\n\t\tprintf(\"read %d bytes: %s\\n\", n, buff);\n\t}\n}\n"
  },
  {
    "path": "oob/tcpsend01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpsend01 <host> <port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tWrite(sockfd, \"123\", 3);\n\tprintf(\"wrote 3 bytes of normal data\\n\");\n\tsleep(1);\n\n\tSend(sockfd, \"4\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\tsleep(1);\n\n\tWrite(sockfd, \"56\", 2);\n\tprintf(\"wrote 2 bytes of normal data\\n\");\n\tsleep(1);\n\n\tSend(sockfd, \"7\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\tsleep(1);\n\n\tWrite(sockfd, \"89\", 2);\n\tprintf(\"wrote 2 bytes of normal data\\n\");\n\tsleep(1);\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcpsend01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcpsend01.c##\n\nint##  2 ##src/oob/tcpsend01.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcpsend01.c##\n{##  4 ##src/oob/tcpsend01.c##\n    int     sockfd;##  5 ##src/oob/tcpsend01.c##\n\n    if (argc != 3)##  6 ##src/oob/tcpsend01.c##\n        err_quit(\"usage: tcpsend01 <host> <port#>\");##  7 ##src/oob/tcpsend01.c##\n\n    sockfd = Tcp_connect(argv[1], argv[2]);##  8 ##src/oob/tcpsend01.c##\n\n    Write(sockfd, \"123\", 3);##  9 ##src/oob/tcpsend01.c##\n    printf(\"wrote 3 bytes of normal data\\n\");## 10 ##src/oob/tcpsend01.c##\n    sleep(1);## 11 ##src/oob/tcpsend01.c##\n\n    Send(sockfd, \"4\", 1, MSG_OOB);## 12 ##src/oob/tcpsend01.c##\n    printf(\"wrote 1 byte of OOB data\\n\");## 13 ##src/oob/tcpsend01.c##\n    sleep(1);## 14 ##src/oob/tcpsend01.c##\n\n    Write(sockfd, \"56\", 2);## 15 ##src/oob/tcpsend01.c##\n    printf(\"wrote 2 bytes of normal data\\n\");## 16 ##src/oob/tcpsend01.c##\n    sleep(1);## 17 ##src/oob/tcpsend01.c##\n\n    Send(sockfd, \"7\", 1, MSG_OOB);## 18 ##src/oob/tcpsend01.c##\n    printf(\"wrote 1 byte of OOB data\\n\");## 19 ##src/oob/tcpsend01.c##\n    sleep(1);## 20 ##src/oob/tcpsend01.c##\n\n    Write(sockfd, \"89\", 2);## 21 ##src/oob/tcpsend01.c##\n    printf(\"wrote 2 bytes of normal data\\n\");## 22 ##src/oob/tcpsend01.c##\n    sleep(1);## 23 ##src/oob/tcpsend01.c##\n\n    exit(0);## 24 ##src/oob/tcpsend01.c##\n}## 25 ##src/oob/tcpsend01.c##\n"
  },
  {
    "path": "oob/tcpsend02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpsend02 <host> <port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tWrite(sockfd, \"123\", 3);\n\tprintf(\"wrote 3 bytes of normal data\\n\");\n\tsleep(1);\n\n\tSend(sockfd, \"4\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\tsleep(1);\n\n\tWrite(sockfd, \"56\", 2);\n\tprintf(\"wrote 2 bytes of normal data\\n\");\n\tsleep(1);\n\n\tSend(sockfd, \"7\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\tsleep(1);\n\n\tWrite(sockfd, \"89\", 2);\n\tprintf(\"wrote 2 bytes of normal data\\n\");\n\tsleep(1);\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcpsend03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpsend03 <host> <port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tWrite(sockfd, \"123\", 3);\n\tprintf(\"wrote 3 bytes of normal data\\n\");\n\tsleep(1);\n\n\tSend(sockfd, \"4\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\tsleep(1);\n\n\tWrite(sockfd, \"56\", 2);\n\tprintf(\"wrote 2 bytes of normal data\\n\");\n\tsleep(1);\n\n\tSend(sockfd, \"7\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\tsleep(1);\n\n\tWrite(sockfd, \"89\", 2);\n\tprintf(\"wrote 2 bytes of normal data\\n\");\n\tsleep(1);\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcpsend04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpsend04 <host> <port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tWrite(sockfd, \"123\", 3);\n\tprintf(\"wrote 3 bytes of normal data\\n\");\n\n\tSend(sockfd, \"4\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\n\tWrite(sockfd, \"5\", 1);\n\tprintf(\"wrote 1 byte of normal data\\n\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcpsend04.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcpsend04.c##\n\nint##  2 ##src/oob/tcpsend04.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcpsend04.c##\n{##  4 ##src/oob/tcpsend04.c##\n    int     sockfd;##  5 ##src/oob/tcpsend04.c##\n\n    if (argc != 3)##  6 ##src/oob/tcpsend04.c##\n        err_quit(\"usage: tcpsend04 <host> <port#>\");##  7 ##src/oob/tcpsend04.c##\n\n    sockfd = Tcp_connect(argv[1], argv[2]);##  8 ##src/oob/tcpsend04.c##\n\n    Write(sockfd, \"123\", 3);##  9 ##src/oob/tcpsend04.c##\n    printf(\"wrote 3 bytes of normal data\\n\");## 10 ##src/oob/tcpsend04.c##\n\n    Send(sockfd, \"4\", 1, MSG_OOB);## 11 ##src/oob/tcpsend04.c##\n    printf(\"wrote 1 byte of OOB data\\n\");## 12 ##src/oob/tcpsend04.c##\n\n    Write(sockfd, \"5\", 1);## 13 ##src/oob/tcpsend04.c##\n    printf(\"wrote 1 byte of normal data\\n\");## 14 ##src/oob/tcpsend04.c##\n\n    exit(0);## 15 ##src/oob/tcpsend04.c##\n}## 16 ##src/oob/tcpsend04.c##\n"
  },
  {
    "path": "oob/tcpsend05.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd, size;\n\tchar\tbuff[16384];\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpsend05 <host> <port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tsize = 32768;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));\n\n\tWrite(sockfd, buff, 16384);\n\tprintf(\"wrote 16384 bytes of normal data\\n\");\n\tsleep(5);\n\n\tSend(sockfd, \"a\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\n\tWrite(sockfd, buff, 1024);\n\tprintf(\"wrote 1024 bytes of normal data\\n\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcpsend05.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcpsend05.c##\n\nint##  2 ##src/oob/tcpsend05.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcpsend05.c##\n{##  4 ##src/oob/tcpsend05.c##\n    int     sockfd, size;##  5 ##src/oob/tcpsend05.c##\n    char    buff[16384];##  6 ##src/oob/tcpsend05.c##\n\n    if (argc != 3)##  7 ##src/oob/tcpsend05.c##\n        err_quit(\"usage: tcpsend05 <host> <port#>\");##  8 ##src/oob/tcpsend05.c##\n\n    sockfd = Tcp_connect(argv[1], argv[2]);##  9 ##src/oob/tcpsend05.c##\n\n    size = 32768;## 10 ##src/oob/tcpsend05.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));## 11 ##src/oob/tcpsend05.c##\n\n    Write(sockfd, buff, 16384);## 12 ##src/oob/tcpsend05.c##\n    printf(\"wrote 16384 bytes of normal data\\n\");## 13 ##src/oob/tcpsend05.c##\n    sleep(5);## 14 ##src/oob/tcpsend05.c##\n\n    Send(sockfd, \"a\", 1, MSG_OOB);## 15 ##src/oob/tcpsend05.c##\n    printf(\"wrote 1 byte of OOB data\\n\");## 16 ##src/oob/tcpsend05.c##\n\n    Write(sockfd, buff, 1024);## 17 ##src/oob/tcpsend05.c##\n    printf(\"wrote 1024 bytes of normal data\\n\");## 18 ##src/oob/tcpsend05.c##\n\n    exit(0);## 19 ##src/oob/tcpsend05.c##\n}## 20 ##src/oob/tcpsend05.c##\n"
  },
  {
    "path": "oob/tcpsend06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpsend06 <host> <port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tWrite(sockfd, \"123\", 3);\n\tprintf(\"wrote 3 bytes of normal data\\n\");\n\n\tSend(sockfd, \"4\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\n\tWrite(sockfd, \"5\", 1);\n\tprintf(\"wrote 1 byte of normal data\\n\");\n\n\tSend(sockfd, \"6\", 1, MSG_OOB);\n\tprintf(\"wrote 1 byte of OOB data\\n\");\n\n\tWrite(sockfd, \"7\", 1);\n\tprintf(\"wrote 1 byte of normal data\\n\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "oob/tcpsend06.lc",
    "content": "#include    \"unp.h\"##  1 ##src/oob/tcpsend06.c##\n\nint##  2 ##src/oob/tcpsend06.c##\nmain(int argc, char **argv)##  3 ##src/oob/tcpsend06.c##\n{##  4 ##src/oob/tcpsend06.c##\n    int     sockfd;##  5 ##src/oob/tcpsend06.c##\n\n    if (argc != 3)##  6 ##src/oob/tcpsend06.c##\n        err_quit(\"usage: tcpsend06 <host> <port#>\");##  7 ##src/oob/tcpsend06.c##\n\n    sockfd = Tcp_connect(argv[1], argv[2]);##  8 ##src/oob/tcpsend06.c##\n\n    Write(sockfd, \"123\", 3);##  9 ##src/oob/tcpsend06.c##\n    printf(\"wrote 3 bytes of normal data\\n\");## 10 ##src/oob/tcpsend06.c##\n\n    Send(sockfd, \"4\", 1, MSG_OOB);## 11 ##src/oob/tcpsend06.c##\n    printf(\"wrote 1 byte of OOB data\\n\");## 12 ##src/oob/tcpsend06.c##\n\n    Write(sockfd, \"5\", 1);## 13 ##src/oob/tcpsend06.c##\n    printf(\"wrote 1 byte of normal data\\n\");## 14 ##src/oob/tcpsend06.c##\n\n    Send(sockfd, \"6\", 1, MSG_OOB);## 15 ##src/oob/tcpsend06.c##\n    printf(\"wrote 1 byte of OOB data\\n\");## 16 ##src/oob/tcpsend06.c##\n\n    Write(sockfd, \"7\", 1);## 17 ##src/oob/tcpsend06.c##\n    printf(\"wrote 1 byte of normal data\\n\");## 18 ##src/oob/tcpsend06.c##\n\n    exit(0);## 19 ##src/oob/tcpsend06.c##\n}## 20 ##src/oob/tcpsend06.c##\n"
  },
  {
    "path": "oob/tcpserv02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "ping/Makefile",
    "content": "include ../Make.defines\n\nOBJS = init_v6.o main.o proc_v4.o proc_v6.o readloop.o \\\n\t\tsend_v4.o send_v6.o sig_alrm.o tv_sub.o\nPROGS =\tping\n\nall:\t${PROGS}\n\nping:\t${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ ${OBJS} ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "ping/bsdping.c",
    "content": "/*\tBSDI\tping.c,v 2.3 1996/01/21 17:56:50 jch Exp\t*/\n\n/*\n * Copyright (c) 1989, 1993\n *\tThe Regents of the University of California.  All rights reserved.\n *\n * This code is derived from software contributed to Berkeley by\n * Mike Muuss.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *\tThis product includes software developed by the University of\n *\tCalifornia, Berkeley and its contributors.\n * 4. Neither the name of the University nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef lint\nstatic char copyright[] =\n\"@(#) Copyright (c) 1989, 1993\\n\\\n\tThe Regents of the University of California.  All rights reserved.\\n\";\n#endif /* not lint */\n\n#ifndef lint\nstatic char sccsid[] = \"@(#)ping.c\t8.1 (Berkeley) 6/5/93\";\n#endif /* not lint */\n\n/*\n * Using the InterNet Control Message Protocol (ICMP) \"ECHO\" facility,\n * measure round-trip-delays and packet loss across network paths.\n *\n * Author -\n *\tMike Muuss\n *\tU. S. Army Ballistic Research Laboratory\n *\tDecember, 1983\n *\n * Status -\n *\tPublic Domain.  Distribution Unlimited.\n * Bugs -\n *\tMore statistics could always be gathered.\n *\tThis program has to run SUID to ROOT to access the ICMP socket.\n */\n\n#include <sys/param.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n\n#include <netinet/in_systm.h>\n#include <netinet/in.h>\n#include <netinet/ip.h>\n#include <netinet/ip_icmp.h>\n#include <netinet/ip_var.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n\n#include <ctype.h>\n#include <err.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#define\tDEFDATALEN\t(64 - 8)\t/* default data length */\n#define\tMAXIPLEN\t60\n#define\tMAXICMPLEN\t76\n#define\tMAXPACKET\t(65536 - 60 - 8)/* max packet size */\n#define\tNROUTES\t\t9\t\t/* number of record route slots */\n\n#define\tA(bit)\t\trcvd_tbl[(bit)>>3]\t/* identify byte in array */\n#define\tB(bit)\t\t(1 << ((bit) & 0x07))\t/* identify bit in byte */\n#define\tSET(bit)\t(A(bit) |= B(bit))\n#define\tCLR(bit)\t(A(bit) &= (~B(bit)))\n#define\tTST(bit)\t(A(bit) & B(bit))\n\n#define\tF_FLOOD\t\t0x0001\n#define\tF_INTERVAL\t0x0002\n#define\tF_NUMERIC\t0x0004\n#define\tF_PINGFILLED\t0x0008\n#define\tF_QUIET\t\t0x0010\n#define\tF_RROUTE\t0x0020\n#define\tF_SO_DEBUG\t0x0040\n#define\tF_SO_DONTROUTE\t0x0080\n#define\tF_VERBOSE\t0x0100\nu_int options;\n\n/*\n * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum\n * number of received sequence numbers we can keep track of.  Change 128\n * to 8192 for complete accuracy...\n */\n#define\tMAX_DUP_CHK\t(8 * 8192)\nint mx_dup_ck = MAX_DUP_CHK;\nchar rcvd_tbl[MAX_DUP_CHK / 8];\n\nstruct sockaddr whereto;\t/* who to ping */\nint datalen = DEFDATALEN;\nint s;\t\t\t\t/* socket file descriptor */\nu_char outpack[MAXPACKET];\nchar BSPACE = '\\b';\t\t/* characters written for flood */\nchar DOT = '.';\nchar *hostname;\nint ident;\t\t\t/* process id to identify our packets */\n\n/* counters */\nlong npackets;\t\t\t/* max packets to transmit */\nlong nreceived;\t\t\t/* # of packets we got back */\nlong nrepeats;\t\t\t/* number of duplicates */\nlong ntransmitted;\t\t/* sequence # for outbound packets = #sent */\nint interval = 1;\t\t/* interval between packets */\n\n/* timing */\nint timing;\t\t\t/* flag to do timing */\ndouble tmin = 999999999.0;\t/* minimum round trip time */\ndouble tmax = 0.0;\t\t/* maximum round trip time */\ndouble tsum = 0.0;\t\t/* sum of all times, for doing average */\n\nvoid\t fill __P((char *, char *));\nu_short\t in_cksum __P((u_short *, int));\nvoid\t onalrm __P((int));\nvoid\t oninfo __P((int));\nvoid\t onint __P((int));\nvoid\t pinger __P((void));\nchar\t*pr_addr __P((u_long));\nvoid\t pr_icmph __P((struct icmp *));\nvoid\t pr_iph __P((struct ip *));\nvoid\t pr_pack __P((char *, int, struct sockaddr_in *));\nvoid\t pr_retip __P((struct ip *));\nvoid\t summary __P((void));\nvoid\t tvsub __P((struct timeval *, struct timeval *));\nvoid\t usage __P((void));\n\nint\nmain(argc, argv)\n\tint argc;\n\tchar *argv[];\n{\n\textern int errno, optind;\n\textern char *optarg;\n\tstruct hostent *hp;\n\tstruct itimerval itimer;\n\tstruct protoent *proto;\n\tstruct sockaddr_in *to, from;\n\tstruct timeval timeout;\n\tfd_set fdset;\n\tregister int cc, i;\n\tint ch, fromlen, hold, packlen, preload;\n\tu_char *datap, *packet;\n\tchar *e, *target, hnamebuf[MAXHOSTNAMELEN];\n#ifdef IP_OPTIONS\n\tchar rspace[3 + 4 * NROUTES + 1];\t/* record route space */\n#endif\n\n\tpreload = 0;\n\tdatap = &outpack[8 + sizeof(struct timeval)];\n\twhile ((ch = getopt(argc, argv, \"c:dfi:l:np:qRrs:v\")) != -1)\n\t\tswitch(ch) {\n\t\tcase 'c':\n\t\t\tnpackets = strtol(optarg, &e, 10);\n\t\t\tif (npackets <= 0 || *optarg == '\\0' || *e != '\\0')\n\t\t\t\terrx(1,\n\t\t\t\t    \"illegal number of packets -- %s\", optarg);\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\toptions |= F_SO_DEBUG;\n\t\t\tbreak;\n\t\tcase 'f':\n\t\t\tif (getuid()) {\n\t\t\t\terrno = EPERM;\n\t\t\t\terr(1, NULL);\n\t\t\t}\n\t\t\toptions |= F_FLOOD;\n\t\t\tsetbuf(stdout, (char *)NULL);\n\t\t\tbreak;\n\t\tcase 'i':\t\t/* wait between sending packets */\n\t\t\tinterval = strtol(optarg, &e, 10);\n\t\t\tif (interval <= 0 || *optarg == '\\0' || *e != '\\0')\n\t\t\t\terrx(1,\n\t\t\t\t    \"illegal timing interval -- %s\", optarg);\n\t\t\toptions |= F_INTERVAL;\n\t\t\tbreak;\n\t\tcase 'l':\n\t\t\tpreload = strtol(optarg, &e, 10);\n\t\t\tif (preload < 0 || *optarg == '\\0' || *e != '\\0')\n\t\t\t\terrx(1, \"illegal preload value -- %s\", optarg);\n\t\t\tbreak;\n\t\tcase 'n':\n\t\t\toptions |= F_NUMERIC;\n\t\t\tbreak;\n\t\tcase 'p':\t\t/* fill buffer with user pattern */\n\t\t\toptions |= F_PINGFILLED;\n\t\t\tfill((char *)datap, optarg);\n\t\t\t\tbreak;\n\t\tcase 'q':\n\t\t\toptions |= F_QUIET;\n\t\t\tbreak;\n\t\tcase 'R':\n\t\t\toptions |= F_RROUTE;\n\t\t\tbreak;\n\t\tcase 'r':\n\t\t\toptions |= F_SO_DONTROUTE;\n\t\t\tbreak;\n\t\tcase 's':\t\t/* size of packet to send */\n\t\t\tdatalen = strtol(optarg, &e, 10);\n\t\t\tif (datalen <= 0 || *optarg == '\\0' || *e != '\\0')\n\t\t\t\terrx(1, \"illegal datalen value -- %s\", optarg);\n\t\t\tif (datalen > MAXPACKET)\n\t\t\t\terrx(1,\n\t\t\t\t    \"datalen value too large, maximum is %d\",\n\t\t\t\t    MAXPACKET);\n\t\t\tbreak;\n\t\tcase 'v':\n\t\t\toptions |= F_VERBOSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tusage();\n\t\t}\n\targc -= optind;\n\targv += optind;\n\n\tif (argc != 1)\n\t\tusage();\n\ttarget = *argv;\n\n\tmemset(&whereto, 0, sizeof(struct sockaddr));\n\tto = (struct sockaddr_in *)&whereto;\n\tto->sin_family = AF_INET;\n\tto->sin_addr.s_addr = inet_addr(target);\n\tif (to->sin_addr.s_addr != (u_int)-1)\n\t\thostname = target;\n\telse {\n\t\thp = gethostbyname(target);\n\t\tif (!hp)\n\t\t\terrx(1, \"unknown host %s\", target);\n\t\tto->sin_family = hp->h_addrtype;\n\t\tmemmove(&to->sin_addr, hp->h_addr, hp->h_length);\n\t\t(void)strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1);\n\t\thostname = hnamebuf;\n\t}\n\n\tif (options & F_FLOOD && options & F_INTERVAL)\n\t\terrx(1, \"-f and -i incompatible options\");\n\n\tif (datalen >= sizeof(struct timeval))\t/* can we time transfer */\n\t\ttiming = 1;\n\tpacklen = datalen + MAXIPLEN + MAXICMPLEN;\n\tif (!(packet = (u_char *)malloc((u_int)packlen)))\n\t\terr(1, NULL);\n\tif (!(options & F_PINGFILLED))\n\t\tfor (i = 8; i < datalen; ++i)\n\t\t\t*datap++ = i;\n\n\tident = getpid() & 0xFFFF;\n\n\tif (!(proto = getprotobyname(\"icmp\")))\n\t\terrx(1, \"unknown protocol icmp\");\n\tif ((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)\n\t\terr(1, \"socket\");\n\thold = 1;\n\tif (options & F_SO_DEBUG)\n\t\t(void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&hold,\n\t\t    sizeof(hold));\n\tif (options & F_SO_DONTROUTE)\n\t\t(void)setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)&hold,\n\t\t    sizeof(hold));\n\n\t/* record route option */\n\tif (options & F_RROUTE) {\n#ifdef IP_OPTIONS\n\t\trspace[IPOPT_OPTVAL] = IPOPT_RR;\n\t\trspace[IPOPT_OLEN] = sizeof(rspace)-1;\n\t\trspace[IPOPT_OFFSET] = IPOPT_MINOFF;\n\t\tif (setsockopt(s, IPPROTO_IP, IP_OPTIONS, rspace,\n\t\t    sizeof(rspace)) < 0)\n\t\t\terr(1, \"record route\");\n#else\n\t\terrx(1, \"record route not available in this implementation\");\n#endif\n\t}\n\n\t/*\n\t * When pinging the broadcast address, you can get a lot of answers.\n\t * Doing something so evil is useful if you are trying to stress the\n\t * ethernet, or just want to fill the arp cache to get some stuff for\n\t * /etc/ethers.\n\t */\n\thold = 48 * 1024;\n\t(void)setsockopt(s,\n\t    SOL_SOCKET, SO_RCVBUF, (char *)&hold, sizeof(hold));\n\n\tif (to->sin_family == AF_INET)\n\t\t(void)printf(\"PING %s (%s): %d data bytes\\n\", hostname,\n\t\t    inet_ntoa(*(struct in_addr *)&to->sin_addr.s_addr),\n\t\t    datalen);\n\telse\n\t\t(void)printf(\"PING %s: %d data bytes\\n\", hostname, datalen);\n\n\twhile (preload--)\t\t/* Fire off them quickies. */\n\t\tpinger();\n\n\t(void)signal(SIGINT, onint);\n\t(void)signal(SIGINFO, oninfo);\n\n\tif ((options & F_FLOOD) == 0) {\n\t\t(void)signal(SIGALRM, onalrm);\n\t\titimer.it_interval.tv_sec = interval;\n\t\titimer.it_interval.tv_usec = 0;\n\t\titimer.it_value.tv_sec = 0;\n\t\titimer.it_value.tv_usec = 1;\n\t\t(void)setitimer(ITIMER_REAL, &itimer, NULL);\n\t}\n\n\tFD_ZERO(&fdset);\n\ttimeout.tv_sec = 0;\n\ttimeout.tv_usec = 10000;\n\tfor (;;) {\n\t\tif (options & F_FLOOD) {\n\t\t\tpinger();\n\t\t\tFD_SET(s, &fdset);\n\t\t\tif (select(s + 1, &fdset, NULL, NULL, &timeout) < 1)\n\t\t\t\tcontinue;\n\t\t}\n\t\tfromlen = sizeof(from);\n\t\tif ((cc = recvfrom(s, (char *)packet, packlen, 0,\n\t\t    (struct sockaddr *)&from, &fromlen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\n\t\t\twarn(\"recvfrom\");\n\t\t\tcontinue;\n\t\t}\n\t\tpr_pack((char *)packet, cc, &from);\n\t\tif (npackets && nreceived >= npackets)\n\t\t\tbreak;\n\t}\n\tsummary();\n\texit(nreceived == 0);\n}\n\n/*\n * onalrm --\n *\tThis routine transmits another ping.\n */\nvoid\nonalrm(signo)\n\tint signo;\n{\n\tstruct itimerval itimer;\n\n\tif (!npackets || ntransmitted < npackets) {\n\t\tpinger();\n\t\treturn;\n\t}\n\n\t/*\n\t * If we're not transmitting any more packets, change the timer\n\t * to wait two round-trip times if we've received any packets or\n\t * ten seconds if we haven't.\n\t */\n#define\tMAXWAIT\t\t10\n\tif (nreceived) {\n\t\titimer.it_value.tv_sec =  2 * tmax / 1000;\n\t\tif (itimer.it_value.tv_sec == 0)\n\t\t\titimer.it_value.tv_sec = 1;\n\t} else\n\t\titimer.it_value.tv_sec = MAXWAIT;\n\titimer.it_interval.tv_sec = 0;\n\titimer.it_interval.tv_usec = 0;\n\titimer.it_value.tv_usec = 0;\n\n\t(void)signal(SIGALRM, onint);\n\t(void)setitimer(ITIMER_REAL, &itimer, NULL);\n}\n\n/*\n * pinger --\n *\tCompose and transmit an ICMP ECHO REQUEST packet.  The IP packet\n * will be added on by the kernel.  The ID field is our UNIX process ID,\n * and the sequence number is an ascending integer.  The first 8 bytes\n * of the data portion are used to hold a UNIX \"timeval\" struct in VAX\n * byte-order, to compute the round-trip time.\n */\nvoid\npinger()\n{\n\tregister struct icmp *icp;\n\tregister int cc;\n\tint i;\n\n\ticp = (struct icmp *)outpack;\n\ticp->icmp_type = ICMP_ECHO;\n\ticp->icmp_code = 0;\n\ticp->icmp_cksum = 0;\n\ticp->icmp_seq = ntransmitted++;\n\ticp->icmp_id = ident;\t\t\t/* ID */\n\n\tCLR(icp->icmp_seq % mx_dup_ck);\n\n\tif (timing)\n\t\t(void)gettimeofday((struct timeval *)&outpack[8], NULL);\n\n\tcc = datalen + 8;\t\t\t/* skips ICMP portion */\n\n\t/* compute ICMP checksum here */\n\ticp->icmp_cksum = in_cksum((u_short *)icp, cc);\n\n\ti = sendto(s, (char *)outpack, cc, 0, &whereto,\n\t    sizeof(struct sockaddr));\n\n\tif (i < 0 || i != cc)  {\n\t\tif (i < 0)\n\t\t\twarn(\"sendto\");\n\t\t(void)printf(\"ping: wrote %s %d chars, ret=%d\\n\",\n\t\t    hostname, cc, i);\n\t}\n\tif (!(options & F_QUIET) && options & F_FLOOD)\n\t\t(void)write(STDOUT_FILENO, &DOT, 1);\n}\n\n/*\n * pr_pack --\n *\tPrint out the packet, if it came from us.  This logic is necessary\n * because ALL readers of the ICMP socket get a copy of ALL ICMP packets\n * which arrive ('tis only fair).  This permits multiple copies of this\n * program to be run without having intermingled output (or statistics!).\n */\nvoid\npr_pack(buf, cc, from)\n\tchar *buf;\n\tint cc;\n\tstruct sockaddr_in *from;\n{\n\tregister struct icmp *icp;\n\tregister u_long l;\n\tregister int i, j;\n\tregister u_char *cp,*dp;\n\tstatic int old_rrlen;\n\tstatic char old_rr[MAX_IPOPTLEN];\n\tstruct ip *ip;\n\tstruct timeval tv, *tp;\n\tdouble triptime;\n\tint hlen, dupflag;\n\n\t(void)gettimeofday(&tv, NULL);\n\n\t/* Check the IP header */\n\tip = (struct ip *)buf;\n\thlen = ip->ip_hl << 2;\n\tif (cc < hlen + ICMP_MINLEN) {\n\t\tif (options & F_VERBOSE)\n\t\t\twarnx(\"packet too short (%d bytes) from %s\\n\", cc,\n\t\t\t  inet_ntoa(*(struct in_addr *)&from->sin_addr.s_addr));\n\t\treturn;\n\t}\n\n\t/* Now the ICMP part */\n\tcc -= hlen;\n\ticp = (struct icmp *)(buf + hlen);\n\tif (icp->icmp_type == ICMP_ECHOREPLY) {\n\t\tif (icp->icmp_id != ident)\n\t\t\treturn;\t\t\t/* 'Twas not our ECHO */\n\t\t++nreceived;\n\t\tif (timing) {\n#ifndef icmp_data\n\t\t\ttp = (struct timeval *)&icp->icmp_ip;\n#else\n\t\t\ttp = (struct timeval *)icp->icmp_data;\n#endif\n\t\t\ttvsub(&tv, tp);\n\t\t\ttriptime = ((double)tv.tv_sec) * 1000.0 +\n\t\t\t    ((double)tv.tv_usec) / 1000.0;\n\t\t\ttsum += triptime;\n\t\t\tif (triptime < tmin)\n\t\t\t\ttmin = triptime;\n\t\t\tif (triptime > tmax)\n\t\t\t\ttmax = triptime;\n\t\t}\n\n\t\tif (TST(icp->icmp_seq % mx_dup_ck)) {\n\t\t\t++nrepeats;\n\t\t\t--nreceived;\n\t\t\tdupflag = 1;\n\t\t} else {\n\t\t\tSET(icp->icmp_seq % mx_dup_ck);\n\t\t\tdupflag = 0;\n\t\t}\n\n\t\tif (options & F_QUIET)\n\t\t\treturn;\n\n\t\tif (options & F_FLOOD)\n\t\t\t(void)write(STDOUT_FILENO, &BSPACE, 1);\n\t\telse {\n\t\t\t(void)printf(\"%d bytes from %s: icmp_seq=%u\", cc,\n\t\t\t   inet_ntoa(*(struct in_addr *)&from->sin_addr.s_addr),\n\t\t\t   icp->icmp_seq);\n\t\t\t(void)printf(\" ttl=%d\", ip->ip_ttl);\n\t\t\tif (timing)\n\t\t\t\t(void)printf(\" time=%g ms\", triptime);\n\t\t\tif (dupflag)\n\t\t\t\t(void)printf(\" (DUP!)\");\n\t\t\t/* check the data */\n\t\t\tcp = (u_char*)&icp->icmp_data[8];\n\t\t\tdp = &outpack[8 + sizeof(struct timeval)];\n\t\t\tfor (i = 8; i < datalen; ++i, ++cp, ++dp) {\n\t\t\t\tif (*cp != *dp) {\n\t(void)printf(\"\\nwrong data byte #%d should be 0x%x but was 0x%x\",\n\t    i, *dp, *cp);\n\t\t\t\t\tcp = (u_char*)&icp->icmp_data[0];\n\t\t\t\t\tfor (i = 8; i < datalen; ++i, ++cp) {\n\t\t\t\t\t\tif ((i % 32) == 8)\n\t\t\t\t\t\t\t(void)printf(\"\\n\\t\");\n\t\t\t\t\t\t(void)printf(\"%x \", *cp);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t/* We've got something other than an ECHOREPLY */\n\t\tif (!(options & F_VERBOSE))\n\t\t\treturn;\n\t\t(void)printf(\"%d bytes from %s: \", cc,\n\t\t    pr_addr(from->sin_addr.s_addr));\n\t\tpr_icmph(icp);\n\t}\n\n\t/* Display any IP options */\n\tcp = (u_char *)buf + sizeof(struct ip);\n\n\tfor (; hlen > (int)sizeof(struct ip); --hlen, ++cp)\n\t\tswitch (*cp) {\n\t\tcase IPOPT_EOL:\n\t\t\thlen = 0;\n\t\t\tbreak;\n\t\tcase IPOPT_LSRR:\n\t\t\t(void)printf(\"\\nLSRR: \");\n\t\t\thlen -= 2;\n\t\t\tj = *++cp;\n\t\t\t++cp;\n\t\t\tif (j > IPOPT_MINOFF)\n\t\t\t\tfor (;;) {\n\t\t\t\t\tl = *++cp;\n\t\t\t\t\tl = (l<<8) + *++cp;\n\t\t\t\t\tl = (l<<8) + *++cp;\n\t\t\t\t\tl = (l<<8) + *++cp;\n\t\t\t\t\tif (l == 0)\n\t\t\t\t\t\t(void)printf(\"\\t0.0.0.0\");\n\t\t\t\telse\n\t\t\t\t\t(void)printf(\"\\t%s\", pr_addr(ntohl(l)));\n\t\t\t\thlen -= 4;\n\t\t\t\tj -= 4;\n\t\t\t\tif (j <= IPOPT_MINOFF)\n\t\t\t\t\tbreak;\n\t\t\t\t(void)putchar('\\n');\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IPOPT_RR:\n\t\t\tj = *++cp;\t\t/* get length */\n\t\t\ti = *++cp;\t\t/* and pointer */\n\t\t\thlen -= 2;\n\t\t\tif (i > j)\n\t\t\t\ti = j;\n\t\t\ti -= IPOPT_MINOFF;\n\t\t\tif (i <= 0)\n\t\t\t\tcontinue;\n\t\t\tif (i == old_rrlen\n\t\t\t    && cp == (u_char *)buf + sizeof(struct ip) + 2\n\t\t\t    && !memcmp((char *)cp, old_rr, i)\n\t\t\t    && !(options & F_FLOOD)) {\n\t\t\t\t(void)printf(\"\\t(same route)\");\n\t\t\t\ti = ((i + 3) / 4) * 4;\n\t\t\t\thlen -= i;\n\t\t\t\tcp += i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\told_rrlen = i;\n\t\t\tmemmove(old_rr, cp, i);\n\t\t\t(void)printf(\"\\nRR: \");\n\t\t\tfor (;;) {\n\t\t\t\tl = *++cp;\n\t\t\t\tl = (l<<8) + *++cp;\n\t\t\t\tl = (l<<8) + *++cp;\n\t\t\t\tl = (l<<8) + *++cp;\n\t\t\t\tif (l == 0)\n\t\t\t\t\t(void)printf(\"\\t0.0.0.0\");\n\t\t\t\telse\n\t\t\t\t\t(void)printf(\"\\t%s\", pr_addr(ntohl(l)));\n\t\t\t\thlen -= 4;\n\t\t\t\ti -= 4;\n\t\t\t\tif (i <= 0)\n\t\t\t\t\tbreak;\n\t\t\t\t(void)putchar('\\n');\n\t\t\t}\n\t\t\tbreak;\n\t\tcase IPOPT_NOP:\n\t\t\t(void)printf(\"\\nNOP\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t(void)printf(\"\\nunknown option %x\", *cp);\n\t\t\tbreak;\n\t\t}\n\tif (!(options & F_FLOOD)) {\n\t\t(void)putchar('\\n');\n\t\t(void)fflush(stdout);\n\t}\n}\n\n/*\n * in_cksum --\n *\tChecksum routine for Internet Protocol family headers (C Version)\n */\nu_short\nin_cksum(addr, len)\n\tu_short *addr;\n\tint len;\n{\n\tregister int nleft = len;\n\tregister u_short *w = addr;\n\tregister int sum = 0;\n\tu_short answer = 0;\n\n\t/*\n\t * Our algorithm is simple, using a 32 bit accumulator (sum), we add\n\t * sequential 16 bit words to it, and at the end, fold back all the\n\t * carry bits from the top 16 bits into the lower 16 bits.\n\t */\n\twhile (nleft > 1)  {\n\t\tsum += *w++;\n\t\tnleft -= 2;\n\t}\n\n\t/* mop up an odd byte, if necessary */\n\tif (nleft == 1) {\n\t\t*(u_char *)(&answer) = *(u_char *)w ;\n\t\tsum += answer;\n\t}\n\n\t/* add back carry outs from top 16 bits to low 16 bits */\n\tsum = (sum >> 16) + (sum & 0xffff);\t/* add hi 16 to low 16 */\n\tsum += (sum >> 16);\t\t\t/* add carry */\n\tanswer = ~sum;\t\t\t\t/* truncate to 16 bits */\n\treturn (answer);\n}\n\n/*\n * tvsub --\n *\tSubtract 2 timeval structs:  out = out - in.  Out is assumed to\n * be >= in.\n */\nvoid\ntvsub(out, in)\n\tregister struct timeval *out, *in;\n{\n\tif ((out->tv_usec -= in->tv_usec) < 0) {\n\t\t--out->tv_sec;\n\t\tout->tv_usec += 1000000;\n\t}\n\tout->tv_sec -= in->tv_sec;\n}\n\n/*\n * oninfo --\n *\tSIGINFO handler.\n */\nvoid\noninfo(notused)\n\tint notused;\n{\n\tsummary();\n}\n\n/*\n * onint --\n *\tSIGINT handler.\n */\nvoid\nonint(notused)\n\tint notused;\n{\n\tsummary();\n\n\t(void)signal(SIGINT, SIG_DFL);\n\t(void)kill(getpid(), SIGINT);\n\n\t/* NOTREACHED */\n\texit(1);\n}\n\n/*\n * summary --\n *\tPrint out statistics.\n */\nvoid\nsummary()\n{\n\tregister int i;\n\n\t(void)printf(\"\\n--- %s ping statistics ---\\n\", hostname);\n\t(void)printf(\"%ld packets transmitted, \", ntransmitted);\n\t(void)printf(\"%ld packets received, \", nreceived);\n\tif (nrepeats)\n\t\t(void)printf(\"+%ld duplicates, \", nrepeats);\n\tif (ntransmitted)\n\t\tif (nreceived > ntransmitted)\n\t\t\t(void)printf(\"-- somebody's printing up packets!\");\n\t\telse\n\t\t\t(void)printf(\"%d%% packet loss\",\n\t\t\t    (int) (((ntransmitted - nreceived) * 100) /\n\t\t\t    ntransmitted));\n\t(void)putchar('\\n');\n\tif (nreceived && timing) {\n\t\t/* Only display average to microseconds */\n\t\ti = 1000.0 * tsum / (nreceived + nrepeats);\n\t\t(void)printf(\"round-trip min/avg/max = %g/%g/%g ms\\n\",\n\t\t    tmin, ((double)i) / 1000.0, tmax);\n\t}\n}\n\n#ifdef notdef\nstatic char *ttab[] = {\n\t\"Echo Reply\",\t\t/* ip + seq + udata */\n\t\"Dest Unreachable\",\t/* net, host, proto, port, frag, sr + IP */\n\t\"Source Quench\",\t/* IP */\n\t\"Redirect\",\t\t/* redirect type, gateway, + IP  */\n\t\"Echo\",\n\t\"Time Exceeded\",\t/* transit, frag reassem + IP */\n\t\"Parameter Problem\",\t/* pointer + IP */\n\t\"Timestamp\",\t\t/* id + seq + three timestamps */\n\t\"Timestamp Reply\",\t/* \" */\n\t\"Info Request\",\t\t/* id + sq */\n\t\"Info Reply\"\t\t/* \" */\n};\n#endif\n\n/*\n * pr_icmph --\n *\tPrint a descriptive string about an ICMP header.\n */\nvoid\npr_icmph(icp)\n\tstruct icmp *icp;\n{\n\tswitch(icp->icmp_type) {\n\tcase ICMP_ECHOREPLY:\n\t\t(void)printf(\"Echo Reply\\n\");\n\t\t/* XXX ID + Seq + Data */\n\t\tbreak;\n\tcase ICMP_UNREACH:\n\t\tswitch(icp->icmp_code) {\n\t\tcase ICMP_UNREACH_NET:\n\t\t\t(void)printf(\"Destination Net Unreachable\\n\");\n\t\t\tbreak;\n\t\tcase ICMP_UNREACH_HOST:\n\t\t\t(void)printf(\"Destination Host Unreachable\\n\");\n\t\t\tbreak;\n\t\tcase ICMP_UNREACH_PROTOCOL:\n\t\t\t(void)printf(\"Destination Protocol Unreachable\\n\");\n\t\t\tbreak;\n\t\tcase ICMP_UNREACH_PORT:\n\t\t\t(void)printf(\"Destination Port Unreachable\\n\");\n\t\t\tbreak;\n\t\tcase ICMP_UNREACH_NEEDFRAG:\n\t\t\t(void)printf(\"frag needed and DF set\\n\");\n\t\t\tbreak;\n\t\tcase ICMP_UNREACH_SRCFAIL:\n\t\t\t(void)printf(\"Source Route Failed\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t(void)printf(\"Dest Unreachable, Bad Code: %d\\n\",\n\t\t\t    icp->icmp_code);\n\t\t\tbreak;\n\t\t}\n\t\t/* Print returned IP header information */\n#ifndef icmp_data\n\t\tpr_retip(&icp->icmp_ip);\n#else\n\t\tpr_retip((struct ip *)icp->icmp_data);\n#endif\n\t\tbreak;\n\tcase ICMP_SOURCEQUENCH:\n\t\t(void)printf(\"Source Quench\\n\");\n#ifndef icmp_data\n\t\tpr_retip(&icp->icmp_ip);\n#else\n\t\tpr_retip((struct ip *)icp->icmp_data);\n#endif\n\t\tbreak;\n\tcase ICMP_REDIRECT:\n\t\tswitch(icp->icmp_code) {\n\t\tcase ICMP_REDIRECT_NET:\n\t\t\t(void)printf(\"Redirect Network\");\n\t\t\tbreak;\n\t\tcase ICMP_REDIRECT_HOST:\n\t\t\t(void)printf(\"Redirect Host\");\n\t\t\tbreak;\n\t\tcase ICMP_REDIRECT_TOSNET:\n\t\t\t(void)printf(\"Redirect Type of Service and Network\");\n\t\t\tbreak;\n\t\tcase ICMP_REDIRECT_TOSHOST:\n\t\t\t(void)printf(\"Redirect Type of Service and Host\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t(void)printf(\"Redirect, Bad Code: %d\", icp->icmp_code);\n\t\t\tbreak;\n\t\t}\n\t\t(void)printf(\"(New addr: 0x%08lx)\\n\", icp->icmp_gwaddr.s_addr);\n#ifndef icmp_data\n\t\tpr_retip(&icp->icmp_ip);\n#else\n\t\tpr_retip((struct ip *)icp->icmp_data);\n#endif\n\t\tbreak;\n\tcase ICMP_ECHO:\n\t\t(void)printf(\"Echo Request\\n\");\n\t\t/* XXX ID + Seq + Data */\n\t\tbreak;\n\tcase ICMP_TIMXCEED:\n\t\tswitch(icp->icmp_code) {\n\t\tcase ICMP_TIMXCEED_INTRANS:\n\t\t\t(void)printf(\"Time to live exceeded\\n\");\n\t\t\tbreak;\n\t\tcase ICMP_TIMXCEED_REASS:\n\t\t\t(void)printf(\"Frag reassembly time exceeded\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t(void)printf(\"Time exceeded, Bad Code: %d\\n\",\n\t\t\t    icp->icmp_code);\n\t\t\tbreak;\n\t\t}\n#ifndef icmp_data\n\t\tpr_retip(&icp->icmp_ip);\n#else\n\t\tpr_retip((struct ip *)icp->icmp_data);\n#endif\n\t\tbreak;\n\tcase ICMP_PARAMPROB:\n\t\t(void)printf(\"Parameter problem: pointer = 0x%02x\\n\",\n\t\t    icp->icmp_hun.ih_pptr);\n#ifndef icmp_data\n\t\tpr_retip(&icp->icmp_ip);\n#else\n\t\tpr_retip((struct ip *)icp->icmp_data);\n#endif\n\t\tbreak;\n\tcase ICMP_TSTAMP:\n\t\t(void)printf(\"Timestamp\\n\");\n\t\t/* XXX ID + Seq + 3 timestamps */\n\t\tbreak;\n\tcase ICMP_TSTAMPREPLY:\n\t\t(void)printf(\"Timestamp Reply\\n\");\n\t\t/* XXX ID + Seq + 3 timestamps */\n\t\tbreak;\n\tcase ICMP_IREQ:\n\t\t(void)printf(\"Information Request\\n\");\n\t\t/* XXX ID + Seq */\n\t\tbreak;\n\tcase ICMP_IREQREPLY:\n\t\t(void)printf(\"Information Reply\\n\");\n\t\t/* XXX ID + Seq */\n\t\tbreak;\n#ifdef ICMP_MASKREQ\n\tcase ICMP_MASKREQ:\n\t\t(void)printf(\"Address Mask Request\\n\");\n\t\tbreak;\n#endif\n#ifdef ICMP_MASKREPLY\n\tcase ICMP_MASKREPLY:\n\t\t(void)printf(\"Address Mask Reply\\n\");\n\t\tbreak;\n#endif\n\tdefault:\n\t\t(void)printf(\"Bad ICMP type: %d\\n\", icp->icmp_type);\n\t}\n}\n\n/*\n * pr_iph --\n *\tPrint an IP header with options.\n */\nvoid\npr_iph(ip)\n\tstruct ip *ip;\n{\n\tint hlen;\n\tu_char *cp;\n\n\thlen = ip->ip_hl << 2;\n\tcp = (u_char *)ip + 20;\t\t/* point to options */\n\n\t(void)printf(\"Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst Data\\n\");\n\t(void)printf(\" %1x  %1x  %02x %04x %04x\",\n\t    ip->ip_v, ip->ip_hl, ip->ip_tos, ip->ip_len, ip->ip_id);\n\t(void)printf(\"   %1x %04x\", ((ip->ip_off) & 0xe000) >> 13,\n\t    (ip->ip_off) & 0x1fff);\n\t(void)printf(\"  %02x  %02x %04x\", ip->ip_ttl, ip->ip_p, ip->ip_sum);\n\t(void)printf(\" %s \", inet_ntoa(*(struct in_addr *)&ip->ip_src.s_addr));\n\t(void)printf(\" %s \", inet_ntoa(*(struct in_addr *)&ip->ip_dst.s_addr));\n\t/* dump and option bytes */\n\twhile (hlen-- > 20)\n\t\t(void)printf(\"%02x\", *cp++);\n\t(void)putchar('\\n');\n}\n\n/*\n * pr_addr --\n *\tReturn an ascii host address as a dotted quad and optionally with\n * a hostname.\n */\nchar *\npr_addr(l)\n\tu_long l;\n{\n\tstruct hostent *hp;\n\tstatic char buf[80];\n\n\tif ((options & F_NUMERIC) ||\n\t    !(hp = gethostbyaddr((char *)&l, 4, AF_INET)))\n\t\t(void)sprintf(buf, \"%s\", inet_ntoa(*(struct in_addr *)&l));\n\telse\n\t\t(void)snprintf(buf, sizeof(buf),\n\t\t    \"%s (%s)\", hp->h_name, inet_ntoa(*(struct in_addr *)&l));\n\treturn (buf);\n}\n\n/*\n * pr_retip --\n *\tDump some info on a returned (via ICMP) IP packet.\n */\nvoid\npr_retip(ip)\n\tstruct ip *ip;\n{\n\tint hlen;\n\tu_char *cp;\n\n\tpr_iph(ip);\n\thlen = ip->ip_hl << 2;\n\tcp = (u_char *)ip + hlen;\n\n\tif (ip->ip_p == 6)\n\t\t(void)printf(\"TCP: from port %u, to port %u (decimal)\\n\",\n\t\t    (*cp * 256 + *(cp + 1)), (*(cp + 2) * 256 + *(cp + 3)));\n\telse if (ip->ip_p == 17)\n\t\t(void)printf(\"UDP: from port %u, to port %u (decimal)\\n\",\n\t\t\t(*cp * 256 + *(cp + 1)), (*(cp + 2) * 256 + *(cp + 3)));\n}\n\nvoid\nfill(bp, patp)\n\tchar *bp, *patp;\n{\n\tregister int ii, jj, kk;\n\tint pat[16];\n\tchar *cp;\n\n\tfor (cp = patp; *cp; cp++)\n\t\tif (!isxdigit(*cp))\n\t\t\terrx(1, \"patterns must be specified as hex digits\");\n\tii = sscanf(patp,\n\t    \"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x\",\n\t    &pat[0], &pat[1], &pat[2], &pat[3], &pat[4], &pat[5], &pat[6],\n\t    &pat[7], &pat[8], &pat[9], &pat[10], &pat[11], &pat[12],\n\t    &pat[13], &pat[14], &pat[15]);\n\n\tif (ii > 0)\n\t\tfor (kk = 0;\n\t\t    kk <= MAXPACKET - (8 + sizeof(struct timeval) + ii);\n\t\t    kk += ii)\n\t\t\tfor (jj = 0; jj < ii; ++jj)\n\t\t\t\tbp[jj + kk] = pat[jj];\n\tif (!(options & F_QUIET)) {\n\t\t(void)printf(\"PATTERN: 0x\");\n\t\tfor (jj = 0; jj < ii; ++jj)\n\t\t\t(void)printf(\"%02x\", bp[jj] & 0xFF);\n\t\t(void)printf(\"\\n\");\n\t}\n}\n\nvoid\nusage()\n{\n\t(void)fprintf(stderr,\n\"usage: ping [-dfnqRrv] [-c count] [-i wait] [-l preload] [-p pattern]\\n\\\n            [-s packetsize] host\\n\");\n\texit(1);\n}\n"
  },
  {
    "path": "ping/init_v6.c",
    "content": "#include \"ping.h\"\n\nvoid\ninit_v6()\n{\n#ifdef IPV6\n\tint on = 1;\n\n\tif (verbose == 0) {\n\t\t/* install a filter that only passes ICMP6_ECHO_REPLY unless verbose */\n\t\tstruct icmp6_filter myfilt;\n\t\tICMP6_FILTER_SETBLOCKALL(&myfilt);\n\t\tICMP6_FILTER_SETPASS(ICMP6_ECHO_REPLY, &myfilt);\n\t\tsetsockopt(sockfd, IPPROTO_IPV6, ICMP6_FILTER, &myfilt, sizeof(myfilt));\n\t\t/* ignore error return; the filter is an optimization */\n\t}\n\n\t/* ignore error returned below; we just won't receive the hop limit */\n#ifdef IPV6_RECVHOPLIMIT\n\t/* RFC 3542 */\n\tsetsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof(on));\n#else\n\t/* RFC 2292 */\n\tsetsockopt(sockfd, IPPROTO_IPV6, IPV6_HOPLIMIT, &on, sizeof(on));\n#endif\n#endif\n}\n"
  },
  {
    "path": "ping/main.c",
    "content": "#include\t\"ping.h\"\n\nstruct proto\tproto_v4 = { proc_v4, send_v4, NULL, NULL, NULL, 0, IPPROTO_ICMP };\n\n#ifdef\tIPV6\nstruct proto\tproto_v6 = { proc_v6, send_v6, init_v6, NULL, NULL, 0, IPPROTO_ICMPV6 };\n#endif\n\nint\tdatalen = 56;\t\t/* data that goes with ICMP echo request */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tc;\n\tstruct addrinfo\t*ai;\n\tchar *h;\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"v\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 'v':\n\t\t\tverbose++;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\terr_quit(\"unrecognized option: %c\", c);\n\t\t}\n\t}\n\n\tif (optind != argc-1)\n\t\terr_quit(\"usage: ping [ -v ] <hostname>\");\n\thost = argv[optind];\n\n\tpid = getpid() & 0xffff;\t/* ICMP ID field is 16 bits */\n\tSignal(SIGALRM, sig_alrm);\n\n\tai = Host_serv(host, NULL, 0, 0);\n\n\th = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);\n\tprintf(\"PING %s (%s): %d data bytes\\n\",\n\t\t\tai->ai_canonname ? ai->ai_canonname : h,\n\t\t\th, datalen);\n\n\t\t/* 4initialize according to protocol */\n\tif (ai->ai_family == AF_INET) {\n\t\tpr = &proto_v4;\n#ifdef\tIPV6\n\t} else if (ai->ai_family == AF_INET6) {\n\t\tpr = &proto_v6;\n\t\tif (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)\n\t\t\t\t\t\t\t\t ai->ai_addr)->sin6_addr)))\n\t\t\terr_quit(\"cannot ping IPv4-mapped IPv6 address\");\n#endif\n\t} else\n\t\terr_quit(\"unknown address family %d\", ai->ai_family);\n\n\tpr->sasend = ai->ai_addr;\n\tpr->sarecv = Calloc(1, ai->ai_addrlen);\n\tpr->salen = ai->ai_addrlen;\n\n\treadloop();\n\n\texit(0);\n}\n"
  },
  {
    "path": "ping/main.lc",
    "content": "#include    \"ping.h\"##  1 ##src/ping/main.c##\n\nstruct proto proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };##  2 ##src/ping/main.c##\n\n#ifdef  IPV6##  3 ##src/ping/main.c##\nstruct proto proto_v6 = { proc_v6, send_v6, NULL, NULL, 0, IPPROTO_ICMPV6 };##  4 ##src/ping/main.c##\n#endif##  5 ##src/ping/main.c##\n\nint     datalen = 56;           /* data that goes with ICMP echo request */##  6 ##src/ping/main.c##\n\nint##  7 ##src/ping/main.c##\nmain(int argc, char **argv)##  8 ##src/ping/main.c##\n{##  9 ##src/ping/main.c##\n    int     c;## 10 ##src/ping/main.c##\n    struct addrinfo *ai;## 11 ##src/ping/main.c##\n\n    opterr = 0;                 /* don't want getopt() writing to stderr */## 12 ##src/ping/main.c##\n    while ((c = getopt(argc, argv, \"v\")) != -1) {## 13 ##src/ping/main.c##\n        switch (c) {## 14 ##src/ping/main.c##\n        case 'v':## 15 ##src/ping/main.c##\n            verbose++;## 16 ##src/ping/main.c##\n            break;## 17 ##src/ping/main.c##\n\n        case '?':## 18 ##src/ping/main.c##\n            err_quit(\"unrecognized option: %c\", c);## 19 ##src/ping/main.c##\n        }## 20 ##src/ping/main.c##\n    }## 21 ##src/ping/main.c##\n\n    if (optind != argc - 1)## 22 ##src/ping/main.c##\n        err_quit(\"usage: ping [ -v ] <hostname>\");## 23 ##src/ping/main.c##\n    host = argv[optind];## 24 ##src/ping/main.c##\n\n    pid = getpid();## 25 ##src/ping/main.c##\n    Signal(SIGALRM, sig_alrm);## 26 ##src/ping/main.c##\n\n    ai = Host_serv(host, NULL, 0, 0);## 27 ##src/ping/main.c##\n\n    printf(\"PING %s (%s): %d data bytes\\n\", ai->ai_canonname,## 28 ##src/ping/main.c##\n           Sock_ntop_host(ai->ai_addr, ai->ai_addrlen), datalen);## 29 ##src/ping/main.c##\n\n    /* 4initialize according to protocol */## 30 ##src/ping/main.c##\n    if (ai->ai_family == AF_INET) {## 31 ##src/ping/main.c##\n        pr = &proto_v4;## 32 ##src/ping/main.c##\n#ifdef  IPV6## 33 ##src/ping/main.c##\n    } else if (ai->ai_family == AF_INET6) {## 34 ##src/ping/main.c##\n        pr = &proto_v6;## 35 ##src/ping/main.c##\n        if (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)## 36 ##src/ping/main.c##\n                                    ai->ai_addr)->sin6_addr)))## 37 ##src/ping/main.c##\n            err_quit(\"cannot ping IPv4-mapped IPv6 address\");## 38 ##src/ping/main.c##\n#endif## 39 ##src/ping/main.c##\n    } else## 40 ##src/ping/main.c##\n        err_quit(\"unknown address family %d\", ai->ai_family);## 41 ##src/ping/main.c##\n\n    pr->sasend = ai->ai_addr;## 42 ##src/ping/main.c##\n    pr->sarecv = Calloc(1, ai->ai_addrlen);## 43 ##src/ping/main.c##\n    pr->salen = ai->ai_addrlen;## 44 ##src/ping/main.c##\n\n    readloop();## 45 ##src/ping/main.c##\n\n    exit(0);## 46 ##src/ping/main.c##\n}## 47 ##src/ping/main.c##\n"
  },
  {
    "path": "ping/old/icmp6.h",
    "content": "struct icmp6hdr {\n    u_int8_t\ticmp6_type;\t\t/* Type field */\n    u_int8_t\ticmp6_code;\t\t/* Code field */\n    u_int16_t\ticmp6_cksum;\t\t/* Checksum field */\n    union {\n\tu_int32_t\tun_data32[1];\t/* Type-specific field */\n\tu_int16_t\tun_data16[2];\t/* Type-specific field */\n\tu_int8_t\tun_data8[4];\t/* Type-specific field */\n    } icmp6_dataun;\n};\n\n#define\ticmp6_data32\ticmp6_dataun.un_data32\n#define\ticmp6_data16\ticmp6_dataun.un_data16\n#define\ticmp6_data8\ticmp6_dataun.un_data8\n#define\ticmp6_pptr\ticmp6_data32[0]\t\t/* PARAMPROB */\n#define\ticmp6_mtu\ticmp6_data32[0]\t\t/* PKT_TOOBIG */\n#define\ticmp6_id\ticmp6_data16[0]\t\t/* ECHO */\n#define\ticmp6_seq\ticmp6_data16[1]\t\t/* ECHO */\n#define\ticmp6_maxdelay\ticmp6_data16[0]\t\t/* MGM_xxx */\n\n#define\tICMPV6_DEST_UNREACH\t1\n#define\tICMPV6_PKT_TOOBIG\t2\n#define\tICMPV6_TIME_EXCEED\t3\n#define\tICMPV6_PARAMPROB\t4\n\n#define\tICMPV6_INFOMSG_MASK\t0x80\t/* all informational messages */\n\n#define\tICMPV6_ECHORQST\t\t128\n#define\tICMPV6_ECHORPLY\t\t129\n#define\tICMPV6_MGM_QUERY\t130\n#define\tICMPV6_MGM_REPORT\t131\n#define\tICMPV6_MGM_REDUCTION\t132\n\n#define\tICMPV6_DEST_UNREACH_NOROUTE\t0 /* no route to destination */\n#define\tICMPV6_DEST_UNREACH_ADMIN \t1 /* communication with destination */\n\t\t\t\t\t  /*  administratively prohibited */\n#define\tICMPV6_DEST_UNREACH_NOTNEIGHBOR\t2 /* not a neighbor */\n#define\tICMPV6_DEST_UNREACH_ADDR \t3 /* address unreachable */\n#define\tICMPV6_DEST_UNREACH_NOPORT\t4 /* bad port */\n\n#define\tICMPV6_TIME_EXCEED_HOPS\t\t0 /* Hop Limit == 0 in transit */\n#define\tICMPV6_TIME_EXCEED_REASSEMBLY\t1 /* Reassembly time out */\n\n#define\tICMPV6_PARAMPROB_HDR\t\t0 /* erroneous header field */\n#define\tICMPV6_PARAMPROB_NXT_HDR\t1 /* unrecognized Next Header */\n#define\tICMPV6_PARAMPROB_OPTS\t\t2 /* unrecognized IPv6 option */\n"
  },
  {
    "path": "ping/old/ip6.h",
    "content": "struct ip6hdr {\n    union {\n\tstruct ip6hdrctl {\n\t    u_int32_t ctl6_flow;\t/* 24 bits of flow-ID */\n\t    u_int16_t ctl6_plen;        /* payload length */\n\t    u_int8_t  ctl6_nxt;         /* next header */\n\t    u_int8_t  ctl6_hlim;        /* hop limit */\n\t} un_ctl6;\n\tu_int8_t un_vfc;\t\t/* 4 bits version, 4 bits reserved */\n    } ip6_ctlun;\n    struct in6_addr ip6_src;\t\t/* source address */\n    struct in6_addr ip6_dst;\t\t/* destination address */\n};\n\n#define ip6_vfc\t\tip6_ctlun.un_vfc\n#define ip6_flow\tip6_ctlun.un_ctl6.ctl6_flow\n#define\tip6_plen\tip6_ctlun.un_ctl6.ctl6_plen\n#define\tip6_nxt\t\tip6_ctlun.un_ctl6.ctl6_nxt\n#define\tip6_hlim\tip6_ctlun.un_ctl6.ctl6_hlim\n#define\tip6_hops\tip6_ctlun.un_ctl6.ctl6_hlim\n"
  },
  {
    "path": "ping/ping.h",
    "content": "#include\t\"unp.h\"\n#include\t<netinet/in_systm.h>\n#include\t<netinet/ip.h>\n#include\t<netinet/ip_icmp.h>\n\n#define\tBUFSIZE\t\t1500\n\n\t\t\t/* globals */\nchar\t sendbuf[BUFSIZE];\n\nint\t\t datalen;\t\t\t/* # bytes of data following ICMP header */\nchar\t*host;\nint\t\t nsent;\t\t\t\t/* add 1 for each sendto() */\npid_t\t pid;\t\t\t\t/* our PID */\nint\t\t sockfd;\nint\t\t verbose;\n\n\t\t\t/* function prototypes */\nvoid\t init_v6(void);\nvoid\t proc_v4(char *, ssize_t, struct msghdr *, struct timeval *);\nvoid\t proc_v6(char *, ssize_t, struct msghdr *, struct timeval *);\nvoid\t send_v4(void);\nvoid\t send_v6(void);\nvoid\t readloop(void);\nvoid\t sig_alrm(int);\nvoid\t tv_sub(struct timeval *, struct timeval *);\n\nstruct proto {\n  void\t (*fproc)(char *, ssize_t, struct msghdr *, struct timeval *);\n  void\t (*fsend)(void);\n  void\t (*finit)(void);\n  struct sockaddr  *sasend;\t/* sockaddr{} for send, from getaddrinfo */\n  struct sockaddr  *sarecv;\t/* sockaddr{} for receiving */\n  socklen_t\t    salen;\t\t/* length of sockaddr{}s */\n  int\t   \t    icmpproto;\t/* IPPROTO_xxx value for ICMP */\n} *pr;\n\n#ifdef\tIPV6\n\n#include\t<netinet/ip6.h>\n#include\t<netinet/icmp6.h>\n\n#endif\n"
  },
  {
    "path": "ping/ping_v4.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nping_v4(struct hostent *hptr)\n{\n\tint\t\t\t\tsize;\n\tchar\t\t\trecvbuf[BUFSIZE];\n\tsocklen_t\t\tlen;\n\tssize_t\t\t\tn;\n\tstruct timeval\ttval;\n\n\tsetuid(getuid());\t\t/* don't need special permissions any more */\n\n\tsize = 60 * 1024;\t\t/* OK if setsockopt fails */\n\tsetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));\n\n\n\tsig_alrm(SIGALRM);\t\t/* send first packet */\n\n\tfor ( ; ; ) {\n\t\tlen = salen;\n\t\tn = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, sarecv, &len);\n\t\tif (n < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\n\t\t\telse\n\t\t\t\terr_sys(\"recvfrom error\");\n\t\t}\n\n\t\tGettimeofday(&tval, NULL);\n\t\t(*fptrs.proc_f)(recvbuf, n, &tval);\n\t}\n}\n"
  },
  {
    "path": "ping/proc_v4.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nproc_v4(char *ptr, ssize_t len, struct msghdr *msg, struct timeval *tvrecv)\n{\n\tint\t\t\t\thlen1, icmplen;\n\tdouble\t\t\trtt;\n\tstruct ip\t\t*ip;\n\tstruct icmp\t\t*icmp;\n\tstruct timeval\t*tvsend;\n\n\tip = (struct ip *) ptr;\t\t/* start of IP header */\n\thlen1 = ip->ip_hl << 2;\t\t/* length of IP header */\n\tif (ip->ip_p != IPPROTO_ICMP)\n\t\treturn;\t\t\t\t/* not ICMP */\n\n\ticmp = (struct icmp *) (ptr + hlen1);\t/* start of ICMP header */\n\tif ( (icmplen = len - hlen1) < 8)\n\t\treturn;\t\t\t\t/* malformed packet */\n\n\tif (icmp->icmp_type == ICMP_ECHOREPLY) {\n\t\tif (icmp->icmp_id != pid)\n\t\t\treturn;\t\t\t/* not a response to our ECHO_REQUEST */\n\t\tif (icmplen < 16)\n\t\t\treturn;\t\t\t/* not enough data to use */\n\n\t\ttvsend = (struct timeval *) icmp->icmp_data;\n\t\ttv_sub(tvrecv, tvsend);\n\t\trtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;\n\n\t\tprintf(\"%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f ms\\n\",\n\t\t\t\ticmplen, Sock_ntop_host(pr->sarecv, pr->salen),\n\t\t\t\ticmp->icmp_seq, ip->ip_ttl, rtt);\n\n\t} else if (verbose) {\n\t\tprintf(\"  %d bytes from %s: type = %d, code = %d\\n\",\n\t\t\t\ticmplen, Sock_ntop_host(pr->sarecv, pr->salen),\n\t\t\t\ticmp->icmp_type, icmp->icmp_code);\n\t}\n}\n"
  },
  {
    "path": "ping/proc_v4.lc",
    "content": "#include    \"ping.h\"##  1 ##src/ping/proc_v4.c##\n\nvoid##  2 ##src/ping/proc_v4.c##\nproc_v4(char *ptr, ssize_t len, struct timeval *tvrecv)##  3 ##src/ping/proc_v4.c##\n{##  4 ##src/ping/proc_v4.c##\n    int     hlen1, icmplen;##  5 ##src/ping/proc_v4.c##\n    double  rtt;##  6 ##src/ping/proc_v4.c##\n    struct ip *ip;##  7 ##src/ping/proc_v4.c##\n    struct icmp *icmp;##  8 ##src/ping/proc_v4.c##\n    struct timeval *tvsend;##  9 ##src/ping/proc_v4.c##\n\n    ip = (struct ip *) ptr;     /* start of IP header */## 10 ##src/ping/proc_v4.c##\n    hlen1 = ip->ip_hl << 2;     /* length of IP header */## 11 ##src/ping/proc_v4.c##\n\n    icmp = (struct icmp *) (ptr + hlen1);   /* start of ICMP header */## 12 ##src/ping/proc_v4.c##\n    if ((icmplen = len - hlen1) < 8)## 13 ##src/ping/proc_v4.c##\n        err_quit(\"icmplen (%d) < 8\", icmplen);## 14 ##src/ping/proc_v4.c##\n\n    if (icmp->icmp_type == ICMP_ECHOREPLY) {## 15 ##src/ping/proc_v4.c##\n        if (icmp->icmp_id != pid)## 16 ##src/ping/proc_v4.c##\n            return;             /* not a response to our ECHO_REQUEST */## 17 ##src/ping/proc_v4.c##\n        if (icmplen < 16)## 18 ##src/ping/proc_v4.c##\n            err_quit(\"icmplen (%d) < 16\", icmplen);## 19 ##src/ping/proc_v4.c##\n\n        tvsend = (struct timeval *) icmp->icmp_data;## 20 ##src/ping/proc_v4.c##\n        tv_sub(tvrecv, tvsend);## 21 ##src/ping/proc_v4.c##\n        rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;## 22 ##src/ping/proc_v4.c##\n\n        printf(\"%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f ms\\n\",## 23 ##src/ping/proc_v4.c##\n               icmplen, Sock_ntop_host(pr->sarecv, pr->salen),## 24 ##src/ping/proc_v4.c##\n               icmp->icmp_seq, ip->ip_ttl, rtt);## 25 ##src/ping/proc_v4.c##\n\n    } else if (verbose) {## 26 ##src/ping/proc_v4.c##\n        printf(\"  %d bytes from %s: type = %d, code = %d\\n\",## 27 ##src/ping/proc_v4.c##\n               icmplen, Sock_ntop_host(pr->sarecv, pr->salen),## 28 ##src/ping/proc_v4.c##\n               icmp->icmp_type, icmp->icmp_code);## 29 ##src/ping/proc_v4.c##\n    }## 30 ##src/ping/proc_v4.c##\n}## 31 ##src/ping/proc_v4.c##\n"
  },
  {
    "path": "ping/proc_v6.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nproc_v6(char *ptr, ssize_t len, struct msghdr *msg, struct timeval* tvrecv)\n{\n#ifdef\tIPV6\n\tdouble\t\t\t\trtt;\n\tstruct icmp6_hdr\t*icmp6;\n\tstruct timeval\t\t*tvsend;\n\tstruct cmsghdr\t\t*cmsg;\n\tint\t\t\t\t\thlim;\n\n\ticmp6 = (struct icmp6_hdr *) ptr;\n\tif (len < 8)\n\t\treturn;\t\t\t\t/* malformed packet */\n\n\tif (icmp6->icmp6_type == ICMP6_ECHO_REPLY) {\n\t\tif (icmp6->icmp6_id != pid)\n\t\t\treturn;\t\t\t/* not a response to our ECHO_REQUEST */\n\t\tif (len < 16)\n\t\t\treturn;\t\t\t/* not enough data to use */\n\n\t\ttvsend = (struct timeval *) (icmp6 + 1);\n\t\ttv_sub(tvrecv, tvsend);\n\t\trtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;\n\n\t\thlim = -1;\n\t\tfor (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) {\n\t\t\tif (cmsg->cmsg_level == IPPROTO_IPV6 &&\n\t\t\t\tcmsg->cmsg_type == IPV6_HOPLIMIT) {\n\t\t\t\thlim = *(u_int32_t *)CMSG_DATA(cmsg);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tprintf(\"%d bytes from %s: seq=%u, hlim=\",\n\t\t\t\tlen, Sock_ntop_host(pr->sarecv, pr->salen),\n\t\t\t\ticmp6->icmp6_seq);\n\t\tif (hlim == -1)\n\t\t\tprintf(\"???\");\t/* ancillary data missing */\n\t\telse\n\t\t\tprintf(\"%d\", hlim);\n\t\tprintf(\", rtt=%.3f ms\\n\", rtt);\n\t} else if (verbose) {\n\t\tprintf(\"  %d bytes from %s: type = %d, code = %d\\n\",\n\t\t\t\tlen, Sock_ntop_host(pr->sarecv, pr->salen),\n\t\t\t\ticmp6->icmp6_type, icmp6->icmp6_code);\n\t}\n#endif\t/* IPV6 */\n}\n"
  },
  {
    "path": "ping/proc_v6.lc",
    "content": "#include    \"ping.h\"##  1 ##src/ping/proc_v6.c##\n\nvoid##  2 ##src/ping/proc_v6.c##\nproc_v6(char *ptr, ssize_t len, struct timeval *tvrecv)##  3 ##src/ping/proc_v6.c##\n{##  4 ##src/ping/proc_v6.c##\n#ifdef  IPV6##  5 ##src/ping/proc_v6.c##\n    int     hlen1, icmp6len;##  6 ##src/ping/proc_v6.c##\n    double  rtt;##  7 ##src/ping/proc_v6.c##\n    struct ip6_hdr *ip6;##  8 ##src/ping/proc_v6.c##\n    struct icmp6_hdr *icmp6;##  9 ##src/ping/proc_v6.c##\n    struct timeval *tvsend;## 10 ##src/ping/proc_v6.c##\n\n    ip6 = (struct ip6_hdr *) ptr;   /* start of IPv6 header */## 11 ##src/ping/proc_v6.c##\n    hlen1 = sizeof(struct ip6_hdr);## 12 ##src/ping/proc_v6.c##\n    if (ip6->ip6_nxt != IPPROTO_ICMPV6)## 13 ##src/ping/proc_v6.c##\n        err_quit(\"next header not IPPROTO_ICMPV6\");## 14 ##src/ping/proc_v6.c##\n\n    icmp6 = (struct icmp6_hdr *) (ptr + hlen1);## 15 ##src/ping/proc_v6.c##\n    if ((icmp6len = len - hlen1) < 8)## 16 ##src/ping/proc_v6.c##\n        err_quit(\"icmp6len (%d) < 8\", icmp6len);## 17 ##src/ping/proc_v6.c##\n\n    if (icmp6->icmp6_type == ICMP6_ECHO_REPLY) {## 18 ##src/ping/proc_v6.c##\n        if (icmp6->icmp6_id != pid)## 19 ##src/ping/proc_v6.c##\n            return;             /* not a response to our ECHO_REQUEST */## 20 ##src/ping/proc_v6.c##\n        if (icmp6len < 16)## 21 ##src/ping/proc_v6.c##\n            err_quit(\"icmp6len (%d) < 16\", icmp6len);## 22 ##src/ping/proc_v6.c##\n\n        tvsend = (struct timeval *) (icmp6 + 1);## 23 ##src/ping/proc_v6.c##\n        tv_sub(tvrecv, tvsend);## 24 ##src/ping/proc_v6.c##\n        rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;## 25 ##src/ping/proc_v6.c##\n\n        printf(\"%d bytes from %s: seq=%u, hlim=%d, rtt=%.3f ms\\n\",## 26 ##src/ping/proc_v6.c##\n               icmp6len, Sock_ntop_host(pr->sarecv, pr->salen),## 27 ##src/ping/proc_v6.c##\n               icmp6->icmp6_seq, ip6->ip6_hlim, rtt);## 28 ##src/ping/proc_v6.c##\n\n    } else if (verbose) {## 29 ##src/ping/proc_v6.c##\n        printf(\"  %d bytes from %s: type = %d, code = %d\\n\",## 30 ##src/ping/proc_v6.c##\n               icmp6len, Sock_ntop_host(pr->sarecv, pr->salen),## 31 ##src/ping/proc_v6.c##\n               icmp6->icmp6_type, icmp6->icmp6_code);## 32 ##src/ping/proc_v6.c##\n    }## 33 ##src/ping/proc_v6.c##\n#endif  /* IPV6 */## 34 ##src/ping/proc_v6.c##\n}## 35 ##src/ping/proc_v6.c##\n"
  },
  {
    "path": "ping/readloop.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nreadloop(void)\n{\n\tint\t\t\t\tsize;\n\tchar\t\t\trecvbuf[BUFSIZE];\n\tchar\t\t\tcontrolbuf[BUFSIZE];\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov;\n\tssize_t\t\t\tn;\n\tstruct timeval\ttval;\n\n\tsockfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);\n\tsetuid(getuid());\t\t/* don't need special permissions any more */\n\tif (pr->finit)\n\t\t(*pr->finit)();\n\n\tsize = 60 * 1024;\t\t/* OK if setsockopt fails */\n\tsetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));\n\n\tsig_alrm(SIGALRM);\t\t/* send first packet */\n\n\tiov.iov_base = recvbuf;\n\tiov.iov_len = sizeof(recvbuf);\n\tmsg.msg_name = pr->sarecv;\n\tmsg.msg_iov = &iov;\n\tmsg.msg_iovlen = 1;\n\tmsg.msg_control = controlbuf;\n\tfor ( ; ; ) {\n\t\tmsg.msg_namelen = pr->salen;\n\t\tmsg.msg_controllen = sizeof(controlbuf);\n\t\tn = recvmsg(sockfd, &msg, 0);\n\t\tif (n < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\n\t\t\telse\n\t\t\t\terr_sys(\"recvmsg error\");\n\t\t}\n\n\t\tGettimeofday(&tval, NULL);\n\t\t(*pr->fproc)(recvbuf, n, &msg, &tval);\n\t}\n}\n"
  },
  {
    "path": "ping/send_v4.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nsend_v4(void)\n{\n\tint\t\t\tlen;\n\tstruct icmp\t*icmp;\n\n\ticmp = (struct icmp *) sendbuf;\n\ticmp->icmp_type = ICMP_ECHO;\n\ticmp->icmp_code = 0;\n\ticmp->icmp_id = pid;\n\ticmp->icmp_seq = nsent++;\n\tmemset(icmp->icmp_data, 0xa5, datalen);\t/* fill with pattern */\n\tGettimeofday((struct timeval *) icmp->icmp_data, NULL);\n\n\tlen = 8 + datalen;\t\t/* checksum ICMP header and data */\n\ticmp->icmp_cksum = 0;\n\ticmp->icmp_cksum = in_cksum((u_short *) icmp, len);\n\n\tSendto(sockfd, sendbuf, len, 0, pr->sasend, pr->salen);\n}\n"
  },
  {
    "path": "ping/send_v6.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nsend_v6()\n{\n#ifdef\tIPV6\n\tint\t\t\t\t\tlen;\n\tstruct icmp6_hdr\t*icmp6;\n\n\ticmp6 = (struct icmp6_hdr *) sendbuf;\n\ticmp6->icmp6_type = ICMP6_ECHO_REQUEST;\n\ticmp6->icmp6_code = 0;\n\ticmp6->icmp6_id = pid;\n\ticmp6->icmp6_seq = nsent++;\n\tmemset((icmp6 + 1), 0xa5, datalen);\t/* fill with pattern */\n\tGettimeofday((struct timeval *) (icmp6 + 1), NULL);\n\n\tlen = 8 + datalen;\t\t/* 8-byte ICMPv6 header */\n\n\tSendto(sockfd, sendbuf, len, 0, pr->sasend, pr->salen);\n\t\t/* 4kernel calculates and stores checksum for us */\n#endif\t/* IPV6 */\n}\n"
  },
  {
    "path": "ping/sig_alrm.c",
    "content": "#include\t\"ping.h\"\n\nvoid\nsig_alrm(int signo)\n{\n\t(*pr->fsend)();\n\n\talarm(1);\n\treturn;\n}\n"
  },
  {
    "path": "ping/sig_alrm.lc",
    "content": "#include    \"ping.h\"##  1 ##src/ping/sig_alrm.c##\n\nvoid##  2 ##src/ping/sig_alrm.c##\nsig_alrm(int signo)##  3 ##src/ping/sig_alrm.c##\n{##  4 ##src/ping/sig_alrm.c##\n    (*pr->fsend) ();##  5 ##src/ping/sig_alrm.c##\n\n    alarm(1);##  6 ##src/ping/sig_alrm.c##\n    return;                     /* probably interrupts recvfrom() */##  7 ##src/ping/sig_alrm.c##\n}##  8 ##src/ping/sig_alrm.c##\n"
  },
  {
    "path": "ping/tv_sub.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ntv_sub(struct timeval *out, struct timeval *in)\n{\n\tif ( (out->tv_usec -= in->tv_usec) < 0) {\t/* out -= in */\n\t\t--out->tv_sec;\n\t\tout->tv_usec += 1000000;\n\t}\n\tout->tv_sec -= in->tv_sec;\n}\n"
  },
  {
    "path": "route/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tcheckudpsum getrt mynetstat \\\n\t\tprifinfo prifindex prifname prifnameindex\n\nall:\t${PROGS}\n\ncheckudpsum:\tcheckudpsum.o\n\t\t${CC} ${CFLAGS} -o $@ checkudpsum.o ${LIBS}\n\ngetrt:\tgetrt.o\n\t\t${CC} ${CFLAGS} -o $@ getrt.o ${LIBS}\n\nprifinfo:\tprifinfo.o get_ifi_info.o\n\t\t${CC} ${CFLAGS} -o $@ prifinfo.o get_ifi_info.o ${LIBS}\n\nprifindex:\tprifindex.o\n\t\t${CC} ${CFLAGS} -o $@ prifindex.o ${LIBS}\n\nprifname:\tprifname.o\n\t\t${CC} ${CFLAGS} -o $@ prifname.o ${LIBS}\n\nprifnameindex:\tprifnameindex.o\n\t\t${CC} ${CFLAGS} -o $@ prifnameindex.o ${LIBS}\n\nmynetstat:\tmynetstat.o\n\t\t${CC} ${CFLAGS} -o $@ mynetstat.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "route/checkudpsum.c",
    "content": "#include\t\"unproute.h\"\n#include\t<netinet/udp.h>\n#include\t<netinet/ip_var.h>\n#include\t<netinet/udp_var.h>\t\t/* for UDPCTL_xxx constants */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tmib[4], val;\n\tsize_t\tlen;\n\n\tmib[0] = CTL_NET;\n\tmib[1] = AF_INET;\n\tmib[2] = IPPROTO_UDP;\n\tmib[3] = UDPCTL_CHECKSUM;\n\n\tlen = sizeof(val);\n\tSysctl(mib, 4, &val, &len, NULL, 0);\n\tprintf(\"udp checksum flag: %d\\n\", val);\n\n\texit(0);\n}\n"
  },
  {
    "path": "route/get_ifi_info.c",
    "content": "#include\t\"unpifi.h\"\n#include\t\"unproute.h\"\n\n/* include get_ifi_info1 */\nstruct ifi_info *\nget_ifi_info(int family, int doaliases)\n{\n\tint \t\t\t\tflags;\n\tchar\t\t\t\t*buf, *next, *lim;\n\tsize_t\t\t\t\tlen;\n\tstruct if_msghdr\t*ifm;\n\tstruct ifa_msghdr\t*ifam;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\tstruct sockaddr_dl\t*sdl;\n\tstruct ifi_info\t\t*ifi, *ifisave, *ifihead, **ifipnext;\n\n\tbuf = Net_rt_iflist(family, 0, &len);\n\n\tifihead = NULL;\n\tifipnext = &ifihead;\n\n\tlim = buf + len;\n\tfor (next = buf; next < lim; next += ifm->ifm_msglen) {\n\t\tifm = (struct if_msghdr *) next;\n\t\tif (ifm->ifm_type == RTM_IFINFO) {\n\t\t\tif ( ((flags = ifm->ifm_flags) & IFF_UP) == 0)\n\t\t\t\tcontinue;\t/* ignore if interface not up */\n\n\t\t\tsa = (struct sockaddr *) (ifm + 1);\n\t\t\tget_rtaddrs(ifm->ifm_addrs, sa, rti_info);\n\t\t\tif ( (sa = rti_info[RTAX_IFP]) != NULL) {\n\t\t\t\tifi = Calloc(1, sizeof(struct ifi_info));\n\t\t\t\t*ifipnext = ifi;\t\t\t/* prev points to this new one */\n\t\t\t\tifipnext = &ifi->ifi_next;\t/* ptr to next one goes here */\n\n\t\t\t\tifi->ifi_flags = flags;\n\t\t\t\tif (sa->sa_family == AF_LINK) {\n\t\t\t\t\tsdl = (struct sockaddr_dl *) sa;\n\t\t\t\t\tifi->ifi_index = sdl->sdl_index;\n\t\t\t\t\tif (sdl->sdl_nlen > 0)\n\t\t\t\t\t\tsnprintf(ifi->ifi_name, IFI_NAME, \"%*s\",\n\t\t\t\t\t\t\t\t sdl->sdl_nlen, &sdl->sdl_data[0]);\n\t\t\t\t\telse\n\t\t\t\t\t\tsnprintf(ifi->ifi_name, IFI_NAME, \"index %d\",\n\t\t\t\t\t\t\t\t sdl->sdl_index);\n\n\t\t\t\t\tif ( (ifi->ifi_hlen = sdl->sdl_alen) > 0)\n\t\t\t\t\t\tmemcpy(ifi->ifi_haddr, LLADDR(sdl),\n\t\t\t\t\t\t\t   min(IFI_HADDR, sdl->sdl_alen));\n\t\t\t\t}\n\t\t\t}\n/* end get_ifi_info1 */\n\n/* include get_ifi_info3 */\n\t\t} else if (ifm->ifm_type == RTM_NEWADDR) {\n\t\t\tif (ifi->ifi_addr) {\t/* already have an IP addr for i/f */\n\t\t\t\tif (doaliases == 0)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t\t/* 4we have a new IP addr for existing interface */\n\t\t\t\tifisave = ifi;\n\t\t\t\tifi = Calloc(1, sizeof(struct ifi_info));\n\t\t\t\t*ifipnext = ifi;\t\t\t/* prev points to this new one */\n\t\t\t\tifipnext = &ifi->ifi_next;\t/* ptr to next one goes here */\n\t\t\t\tifi->ifi_flags = ifisave->ifi_flags;\n\t\t\t\tifi->ifi_index = ifisave->ifi_index;\n\t\t\t\tifi->ifi_hlen = ifisave->ifi_hlen;\n\t\t\t\tmemcpy(ifi->ifi_name, ifisave->ifi_name, IFI_NAME);\n\t\t\t\tmemcpy(ifi->ifi_haddr, ifisave->ifi_haddr, IFI_HADDR);\n\t\t\t}\n\n\t\t\tifam = (struct ifa_msghdr *) next;\n\t\t\tsa = (struct sockaddr *) (ifam + 1);\n\t\t\tget_rtaddrs(ifam->ifam_addrs, sa, rti_info);\n\n\t\t\tif ( (sa = rti_info[RTAX_IFA]) != NULL) {\n\t\t\t\tifi->ifi_addr = Calloc(1, sa->sa_len);\n\t\t\t\tmemcpy(ifi->ifi_addr, sa, sa->sa_len);\n\t\t\t}\n\n\t\t\tif ((flags & IFF_BROADCAST) &&\n\t\t\t\t(sa = rti_info[RTAX_BRD]) != NULL) {\n\t\t\t\tifi->ifi_brdaddr = Calloc(1, sa->sa_len);\n\t\t\t\tmemcpy(ifi->ifi_brdaddr, sa, sa->sa_len);\n\t\t\t}\n\n\t\t\tif ((flags & IFF_POINTOPOINT) &&\n\t\t\t\t(sa = rti_info[RTAX_BRD]) != NULL) {\n\t\t\t\tifi->ifi_dstaddr = Calloc(1, sa->sa_len);\n\t\t\t\tmemcpy(ifi->ifi_dstaddr, sa, sa->sa_len);\n\t\t\t}\n\n\t\t} else\n\t\t\terr_quit(\"unexpected message type %d\", ifm->ifm_type);\n\t}\n\t/* \"ifihead\" points to the first structure in the linked list */\n\treturn(ifihead);\t/* ptr to first structure in linked list */\n}\n/* end get_ifi_info3 */\n\nvoid\nfree_ifi_info(struct ifi_info *ifihead)\n{\n\tstruct ifi_info\t*ifi, *ifinext;\n\n\tfor (ifi = ifihead; ifi != NULL; ifi = ifinext) {\n\t\tif (ifi->ifi_addr != NULL)\n\t\t\tfree(ifi->ifi_addr);\n\t\tif (ifi->ifi_brdaddr != NULL)\n\t\t\tfree(ifi->ifi_brdaddr);\n\t\tif (ifi->ifi_dstaddr != NULL)\n\t\t\tfree(ifi->ifi_dstaddr);\n\t\tifinext = ifi->ifi_next;\t\t/* can't fetch ifi_next after free() */\n\t\tfree(ifi);\t\t\t\t\t/* the ifi_info{} itself */\n\t}\n}\n\nstruct ifi_info *\nGet_ifi_info(int family, int doaliases)\n{\n\tstruct ifi_info\t*ifi;\n\n\tif ( (ifi = get_ifi_info(family, doaliases)) == NULL)\n\t\terr_quit(\"get_ifi_info error\");\n\treturn(ifi);\n}\n"
  },
  {
    "path": "route/get_ifi_info.lc",
    "content": "#include    \"unpifi.h\"##  1 ##src/route/get_ifi_info.c##\n#include    \"unproute.h\"##  2 ##src/route/get_ifi_info.c##\n\n/* include get_ifi_info1 */\nstruct ifi_info *##  3 ##src/route/get_ifi_info.c##\nget_ifi_info(int family, int doaliases)##  4 ##src/route/get_ifi_info.c##\n{##  5 ##src/route/get_ifi_info.c##\n    int     flags;##  6 ##src/route/get_ifi_info.c##\n    char   *buf, *next, *lim;##  7 ##src/route/get_ifi_info.c##\n    size_t  len;##  8 ##src/route/get_ifi_info.c##\n    struct if_msghdr *ifm;##  9 ##src/route/get_ifi_info.c##\n    struct ifa_msghdr *ifam;## 10 ##src/route/get_ifi_info.c##\n    struct sockaddr *sa, *rti_info[RTAX_MAX];## 11 ##src/route/get_ifi_info.c##\n    struct sockaddr_dl *sdl;## 12 ##src/route/get_ifi_info.c##\n    struct ifi_info *ifi, *ifisave, *ifihead, **ifipnext;## 13 ##src/route/get_ifi_info.c##\n\n    buf = Net_rt_iflist(family, 0, &len);## 14 ##src/route/get_ifi_info.c##\n\n    ifihead = NULL;## 15 ##src/route/get_ifi_info.c##\n    ifipnext = &ifihead;## 16 ##src/route/get_ifi_info.c##\n\n    lim = buf + len;## 17 ##src/route/get_ifi_info.c##\n    for (next = buf; next < lim; next += ifm->ifm_msglen) {## 18 ##src/route/get_ifi_info.c##\n        ifm = (struct if_msghdr *) next;## 19 ##src/route/get_ifi_info.c##\n        if (ifm->ifm_type == RTM_IFINFO) {## 20 ##src/route/get_ifi_info.c##\n            if (((flags = ifm->ifm_flags) & IFF_UP) == 0)## 21 ##src/route/get_ifi_info.c##\n                continue;       /* ignore if interface not up */## 22 ##src/route/get_ifi_info.c##\n\n            sa = (struct sockaddr *) (ifm + 1);## 23 ##src/route/get_ifi_info.c##\n            get_rtaddrs(ifm->ifm_addrs, sa, rti_info);## 24 ##src/route/get_ifi_info.c##\n            if ((sa = rti_info[RTAX_IFP]) != NULL) {## 25 ##src/route/get_ifi_info.c##\n                ifi = Calloc(1, sizeof(struct ifi_info));## 26 ##src/route/get_ifi_info.c##\n                *ifipnext = ifi;    /* prev points to this new one */## 27 ##src/route/get_ifi_info.c##\n                ifipnext = &ifi->ifi_next;  /* ptr to next one goes here */## 28 ##src/route/get_ifi_info.c##\n\n                ifi->ifi_flags = flags;## 29 ##src/route/get_ifi_info.c##\n                if (sa->sa_family == AF_LINK) {## 30 ##src/route/get_ifi_info.c##\n                    sdl = (struct sockaddr_dl *) sa;## 31 ##src/route/get_ifi_info.c##\n                    if (sdl->sdl_nlen > 0)## 32 ##src/route/get_ifi_info.c##\n                        snprintf(ifi->ifi_name, IFI_NAME, \"%*s\",## 33 ##src/route/get_ifi_info.c##\n                                 sdl->sdl_nlen, &sdl->sdl_data[0]);## 34 ##src/route/get_ifi_info.c##\n                    else## 35 ##src/route/get_ifi_info.c##\n                        snprintf(ifi->ifi_name, IFI_NAME, \"index %d\",## 36 ##src/route/get_ifi_info.c##\n                                 sdl->sdl_index);## 37 ##src/route/get_ifi_info.c##\n\n                    if ((ifi->ifi_hlen = sdl->sdl_alen) > 0)## 38 ##src/route/get_ifi_info.c##\n                        memcpy(ifi->ifi_haddr, LLADDR(sdl),## 39 ##src/route/get_ifi_info.c##\n                               min(IFI_HADDR, sdl->sdl_alen));## 40 ##src/route/get_ifi_info.c##\n                }## 41 ##src/route/get_ifi_info.c##\n            }## 42 ##src/route/get_ifi_info.c##\n/* end get_ifi_info1 */\n\n/* include get_ifi_info3 */\n        } else if (ifm->ifm_type == RTM_NEWADDR) {## 43 ##src/route/get_ifi_info.c##\n            if (ifi->ifi_addr) {    /* already have an IP addr for i/f */## 44 ##src/route/get_ifi_info.c##\n                if (doaliases == 0)## 45 ##src/route/get_ifi_info.c##\n                    continue;## 46 ##src/route/get_ifi_info.c##\n\n                /* 4we have a new IP addr for existing interface */## 47 ##src/route/get_ifi_info.c##\n                ifisave = ifi;## 48 ##src/route/get_ifi_info.c##\n                ifi = Calloc(1, sizeof(struct ifi_info));## 49 ##src/route/get_ifi_info.c##\n                *ifipnext = ifi;    /* prev points to this new one */## 50 ##src/route/get_ifi_info.c##\n                ifipnext = &ifi->ifi_next;  /* ptr to next one goes here */## 51 ##src/route/get_ifi_info.c##\n                ifi->ifi_flags = ifisave->ifi_flags;## 52 ##src/route/get_ifi_info.c##\n                ifi->ifi_hlen = ifisave->ifi_hlen;## 53 ##src/route/get_ifi_info.c##\n                memcpy(ifi->ifi_name, ifisave->ifi_name, IFI_NAME);## 54 ##src/route/get_ifi_info.c##\n                memcpy(ifi->ifi_haddr, ifisave->ifi_haddr, IFI_HADDR);## 55 ##src/route/get_ifi_info.c##\n            }## 56 ##src/route/get_ifi_info.c##\n\n            ifam = (struct ifa_msghdr *) next;## 57 ##src/route/get_ifi_info.c##\n            sa = (struct sockaddr *) (ifam + 1);## 58 ##src/route/get_ifi_info.c##\n            get_rtaddrs(ifam->ifam_addrs, sa, rti_info);## 59 ##src/route/get_ifi_info.c##\n\n            if ((sa = rti_info[RTAX_IFA]) != NULL) {## 60 ##src/route/get_ifi_info.c##\n                ifi->ifi_addr = Calloc(1, sa->sa_len);## 61 ##src/route/get_ifi_info.c##\n                memcpy(ifi->ifi_addr, sa, sa->sa_len);## 62 ##src/route/get_ifi_info.c##\n            }## 63 ##src/route/get_ifi_info.c##\n\n            if ((flags & IFF_BROADCAST) && (sa = rti_info[RTAX_BRD]) != NULL) {## 64 ##src/route/get_ifi_info.c##\n                ifi->ifi_brdaddr = Calloc(1, sa->sa_len);## 65 ##src/route/get_ifi_info.c##\n                memcpy(ifi->ifi_brdaddr, sa, sa->sa_len);## 66 ##src/route/get_ifi_info.c##\n            }## 67 ##src/route/get_ifi_info.c##\n\n            if ((flags & IFF_POINTOPOINT) &&## 68 ##src/route/get_ifi_info.c##\n                (sa = rti_info[RTAX_BRD]) != NULL) {## 69 ##src/route/get_ifi_info.c##\n                ifi->ifi_dstaddr = Calloc(1, sa->sa_len);## 70 ##src/route/get_ifi_info.c##\n                memcpy(ifi->ifi_dstaddr, sa, sa->sa_len);## 71 ##src/route/get_ifi_info.c##\n            }## 72 ##src/route/get_ifi_info.c##\n\n        } else## 73 ##src/route/get_ifi_info.c##\n            err_quit(\"unexpected message type %d\", ifm->ifm_type);## 74 ##src/route/get_ifi_info.c##\n    }## 75 ##src/route/get_ifi_info.c##\n    /* \"ifihead\" points to the first structure in the linked list */## 76 ##src/route/get_ifi_info.c##\n    return (ifihead);           /* ptr to first structure in linked list */## 77 ##src/route/get_ifi_info.c##\n}## 78 ##src/route/get_ifi_info.c##\n/* end get_ifi_info3 */\n\nvoid## 79 ##src/route/get_ifi_info.c##\nfree_ifi_info(struct ifi_info *ifihead)## 80 ##src/route/get_ifi_info.c##\n{## 81 ##src/route/get_ifi_info.c##\n    struct ifi_info *ifi, *ifinext;## 82 ##src/route/get_ifi_info.c##\n\n    for (ifi = ifihead; ifi != NULL; ifi = ifinext) {## 83 ##src/route/get_ifi_info.c##\n        if (ifi->ifi_addr != NULL)## 84 ##src/route/get_ifi_info.c##\n            free(ifi->ifi_addr);## 85 ##src/route/get_ifi_info.c##\n        if (ifi->ifi_brdaddr != NULL)## 86 ##src/route/get_ifi_info.c##\n            free(ifi->ifi_brdaddr);## 87 ##src/route/get_ifi_info.c##\n        if (ifi->ifi_dstaddr != NULL)## 88 ##src/route/get_ifi_info.c##\n            free(ifi->ifi_dstaddr);## 89 ##src/route/get_ifi_info.c##\n        ifinext = ifi->ifi_next;    /* can't fetch ifi_next after free() */## 90 ##src/route/get_ifi_info.c##\n        free(ifi);              /* the ifi_info{} itself */## 91 ##src/route/get_ifi_info.c##\n    }## 92 ##src/route/get_ifi_info.c##\n}## 93 ##src/route/get_ifi_info.c##\n\nstruct ifi_info *## 94 ##src/route/get_ifi_info.c##\nGet_ifi_info(int family, int doaliases)## 95 ##src/route/get_ifi_info.c##\n{## 96 ##src/route/get_ifi_info.c##\n    struct ifi_info *ifi;## 97 ##src/route/get_ifi_info.c##\n\n    if ((ifi = get_ifi_info(family, doaliases)) == NULL)## 98 ##src/route/get_ifi_info.c##\n        err_quit(\"get_ifi_info error\");## 99 ##src/route/get_ifi_info.c##\n    return (ifi);##100 ##src/route/get_ifi_info.c##\n}##101 ##src/route/get_ifi_info.c##\n"
  },
  {
    "path": "route/getrt.c",
    "content": "/* include getrt1 */\n#include\t\"unproute.h\"\n\n#define\tBUFLEN\t(sizeof(struct rt_msghdr) + 512)\n\t\t\t\t\t/* sizeof(struct sockaddr_in6) * 8 = 192 */\n#define\tSEQ\t\t9999\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tchar\t\t\t\t*buf;\n\tpid_t\t\t\t\tpid;\n\tssize_t\t\t\t\tn;\n\tstruct rt_msghdr\t*rtm;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\tstruct sockaddr_in\t*sin;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: getrt <IPaddress>\");\n\n\tsockfd = Socket(AF_ROUTE, SOCK_RAW, 0);\t/* need superuser privileges */\n\n\tbuf = Calloc(1, BUFLEN);\t/* and initialized to 0 */\n\n\trtm = (struct rt_msghdr *) buf;\n\trtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);\n\trtm->rtm_version = RTM_VERSION;\n\trtm->rtm_type = RTM_GET;\n\trtm->rtm_addrs = RTA_DST;\n\trtm->rtm_pid = pid = getpid();\n\trtm->rtm_seq = SEQ;\n\n\tsin = (struct sockaddr_in *) (rtm + 1);\n\tsin->sin_len = sizeof(struct sockaddr_in);\n\tsin->sin_family = AF_INET;\n    Inet_pton(AF_INET, argv[1], &sin->sin_addr);\n\n\tWrite(sockfd, rtm, rtm->rtm_msglen);\n\n\tdo {\n\t\tn = Read(sockfd, rtm, BUFLEN);\n\t} while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != SEQ ||\n\t\t\t rtm->rtm_pid != pid);\n/* end getrt1 */\n\n/* include getrt2 */\n\trtm = (struct rt_msghdr *) buf;\n\tsa = (struct sockaddr *) (rtm + 1);\n\tget_rtaddrs(rtm->rtm_addrs, sa, rti_info);\n\tif ( (sa = rti_info[RTAX_DST]) != NULL)\n\t\tprintf(\"dest: %s\\n\", Sock_ntop_host(sa, sa->sa_len));\n\n\tif ( (sa = rti_info[RTAX_GATEWAY]) != NULL)\n\t\tprintf(\"gateway: %s\\n\", Sock_ntop_host(sa, sa->sa_len));\n\n\tif ( (sa = rti_info[RTAX_NETMASK]) != NULL)\n\t\tprintf(\"netmask: %s\\n\", Sock_masktop(sa, sa->sa_len));\n\n\tif ( (sa = rti_info[RTAX_GENMASK]) != NULL)\n\t\tprintf(\"genmask: %s\\n\", Sock_masktop(sa, sa->sa_len));\n\n\texit(0);\n}\n/* end getrt2 */\n"
  },
  {
    "path": "route/getrt.lc",
    "content": "/* include getrt1 */\n#include    \"unproute.h\"##  1 ##src/route/getrt.c##\n\n#define BUFLEN  (sizeof(struct rt_msghdr) + 512)##  2 ##src/route/getrt.c##\n                    /* sizeof(struct sockaddr_in6) * 8 = 192 */##  3 ##src/route/getrt.c##\n#define SEQ     9999##  4 ##src/route/getrt.c##\n\nint##  5 ##src/route/getrt.c##\nmain(int argc, char **argv)##  6 ##src/route/getrt.c##\n{##  7 ##src/route/getrt.c##\n    int     sockfd;##  8 ##src/route/getrt.c##\n    char   *buf;##  9 ##src/route/getrt.c##\n    pid_t   pid;## 10 ##src/route/getrt.c##\n    ssize_t n;## 11 ##src/route/getrt.c##\n    struct rt_msghdr *rtm;## 12 ##src/route/getrt.c##\n    struct sockaddr *sa, *rti_info[RTAX_MAX];## 13 ##src/route/getrt.c##\n    struct sockaddr_in *sin;## 14 ##src/route/getrt.c##\n\n    if (argc != 2)## 15 ##src/route/getrt.c##\n        err_quit(\"usage: getrt <IPaddress>\");## 16 ##src/route/getrt.c##\n\n    sockfd = Socket(AF_ROUTE, SOCK_RAW, 0); /* need superuser privileges */## 17 ##src/route/getrt.c##\n\n    buf = Calloc(1, BUFLEN);    /* and initialized to 0 */## 18 ##src/route/getrt.c##\n\n    rtm = (struct rt_msghdr *) buf;## 19 ##src/route/getrt.c##\n    rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);## 20 ##src/route/getrt.c##\n    rtm->rtm_version = RTM_VERSION;## 21 ##src/route/getrt.c##\n    rtm->rtm_type = RTM_GET;## 22 ##src/route/getrt.c##\n    rtm->rtm_addrs = RTA_DST;## 23 ##src/route/getrt.c##\n    rtm->rtm_pid = pid = getpid();## 24 ##src/route/getrt.c##\n    rtm->rtm_seq = SEQ;## 25 ##src/route/getrt.c##\n\n    sin = (struct sockaddr_in *) (rtm + 1);## 26 ##src/route/getrt.c##\n    sin->sin_len = sizeof(struct sockaddr_in);## 27 ##src/route/getrt.c##\n    sin->sin_family = AF_INET;## 28 ##src/route/getrt.c##\n    Inet_pton(AF_INET, argv[1], &sin->sin_addr);## 29 ##src/route/getrt.c##\n\n    Write(sockfd, rtm, rtm->rtm_msglen);## 30 ##src/route/getrt.c##\n\n    do {## 31 ##src/route/getrt.c##\n        n = Read(sockfd, rtm, BUFLEN);## 32 ##src/route/getrt.c##\n    } while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != SEQ ||## 33 ##src/route/getrt.c##\n             rtm->rtm_pid != pid);## 34 ##src/route/getrt.c##\n/* end getrt1 */\n\n/* include getrt2 */\n    rtm = (struct rt_msghdr *) buf;## 35 ##src/route/getrt.c##\n    sa = (struct sockaddr *) (rtm + 1);## 36 ##src/route/getrt.c##\n    get_rtaddrs(rtm->rtm_addrs, sa, rti_info);## 37 ##src/route/getrt.c##\n    if ((sa = rti_info[RTAX_DST]) != NULL)## 38 ##src/route/getrt.c##\n        printf(\"dest: %s\\n\", Sock_ntop_host(sa, sa->sa_len));## 39 ##src/route/getrt.c##\n\n    if ((sa = rti_info[RTAX_GATEWAY]) != NULL)## 40 ##src/route/getrt.c##\n        printf(\"gateway: %s\\n\", Sock_ntop_host(sa, sa->sa_len));## 41 ##src/route/getrt.c##\n\n    if ((sa = rti_info[RTAX_NETMASK]) != NULL)## 42 ##src/route/getrt.c##\n        printf(\"netmask: %s\\n\", Sock_masktop(sa, sa->sa_len));## 43 ##src/route/getrt.c##\n\n    if ((sa = rti_info[RTAX_GENMASK]) != NULL)## 44 ##src/route/getrt.c##\n        printf(\"genmask: %s\\n\", Sock_masktop(sa, sa->sa_len));## 45 ##src/route/getrt.c##\n\n    exit(0);## 46 ##src/route/getrt.c##\n}## 47 ##src/route/getrt.c##\n/* end getrt2 */\n"
  },
  {
    "path": "route/mynetstat.c",
    "content": "#include\t\"unproute.h\"\n\nvoid\tpr_rtable(int);\nvoid\tpr_iflist(int);\n\nint\nmain(int argc, char **argv)\n{\n\tint family;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: mynetstat <inet4|inet6|all>\");\n\tif (strcmp(argv[1], \"inet4\") == 0)\n\t\tfamily = AF_INET;\n#ifdef\tAF_INET6\n\telse if (strcmp(argv[1], \"inet6\") == 0)\n\t\tfamily = AF_INET6;\n#endif\n\telse if (strcmp(argv[1], \"all\") == 0)\n\t\tfamily = 0;\n\telse\n\t\terr_quit(\"invalid <address-family>\");\n\n\tpr_rtable(family);\n\n\tpr_iflist(family);\n\n\texit(0);\n}\n\nvoid\npr_rtable(int family)\n{\n\tchar\t\t\t\t*buf, *next, *lim;\n\tsize_t\t\t\t\tlen;\n\tstruct rt_msghdr\t*rtm;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\n\tbuf = Net_rt_dump(family, 0, &len);\n\n\tlim = buf + len;\n\tfor (next = buf; next < lim; next += rtm->rtm_msglen) {\n\t\trtm = (struct rt_msghdr *) next;\n\t\tsa = (struct sockaddr *)(rtm + 1);\n\t\tget_rtaddrs(rtm->rtm_addrs, sa, rti_info);\n\t\tif ( (sa = rti_info[RTAX_DST]) != NULL)\n\t\t\tprintf(\"dest: %s\", sock_ntop(sa, sa->sa_len));\n\n\t\tif ( (sa = rti_info[RTAX_GATEWAY]) != NULL)\n\t\t\tprintf(\", gateway: %s\", sock_ntop(sa, sa->sa_len));\n\n\t\tprintf(\"\\n\");\n\t}\n}\n\nvoid\npr_iflist(int family)\n{\n\tint \t\t\t\tflags;\n\tchar\t\t\t\t*buf, *next, *lim;\n\tu_char\t\t\t\t*ptr;\n\tsize_t\t\t\t\tlen;\n\tstruct if_msghdr\t*ifm;\n\tstruct ifa_msghdr\t*ifam;\n\tstruct sockaddr\t\t*sa, *rti_info[RTAX_MAX];\n\tstruct sockaddr_dl\t*sdl;\n\n\tbuf = Net_rt_iflist(family, 0, &len);\n\n\tlim = buf + len;\n\tfor (next = buf; next < lim; next += ifm->ifm_msglen) {\n\t\tifm = (struct if_msghdr *) next;\n\t\tif (ifm->ifm_type == RTM_IFINFO) {\n\t\t\tsa = (struct sockaddr *)(ifm + 1);\n\t\t\tget_rtaddrs(ifm->ifm_addrs, sa, rti_info);\n\t\t\tif ( (sa = rti_info[RTAX_IFP]) != NULL) {\n\t\t\t\tif (((flags = ifm->ifm_flags) & IFF_UP) == 0)\n\t\t\t\t\tcontinue;\n\t\t\t\tprintf(\"interface: %s: <\", Sock_ntop(sa, sa->sa_len));\n\t\t\t\tif (flags & IFF_UP)\t\t\t\tprintf(\"UP \");\n\t\t\t\tif (flags & IFF_BROADCAST)\t\tprintf(\"BCAST \");\n\t\t\t\tif (flags & IFF_MULTICAST)\t\tprintf(\"MCAST \");\n\t\t\t\tif (flags & IFF_LOOPBACK)\t\tprintf(\"LOOP \");\n\t\t\t\tif (flags & IFF_POINTOPOINT)\tprintf(\"P2P \");\n\t\t\t\tprintf(\">\\n\");\n\n\t\t\t\tif (sa->sa_family == AF_LINK &&\n\t\t\t\t\t(sdl = (struct sockaddr_dl *) sa) &&\n\t\t\t\t\t(sdl->sdl_alen > 0)) {\n\t\t\t\t\tptr = (u_char *) &sdl->sdl_data[sdl->sdl_nlen];\n\t\t\t\t\tprintf(\"  %x:%x:%x:%x:%x:%x\\n\", *ptr, *(ptr+1),\n\t\t\t\t\t\t\t*(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (ifm->ifm_type == RTM_NEWADDR) {\n\t\t\tifam = (struct ifa_msghdr *) next;\n\t\t\tsa = (struct sockaddr *)(ifam + 1);\n\t\t\tget_rtaddrs(ifam->ifam_addrs, sa, rti_info);\n\t\t\tif ( (sa = rti_info[RTAX_IFA]) != NULL)\n\t\t\t\tprintf(\"  IP addr: %s\\n\", Sock_ntop(sa, sa->sa_len));\n\t\t\tif ((flags & IFF_BROADCAST) && (sa = rti_info[RTAX_BRD]))\n\t\t\t\tprintf(\"  bcast addr: %s\\n\", Sock_ntop(sa, sa->sa_len));\n\n\t\t} else\n\t\t\terr_quit(\"unexpected message type %d\", ifm->ifm_type);\n\t}\n}\n"
  },
  {
    "path": "route/prifindex.c",
    "content": "#include\t\"unpifi.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tif (argc != 2)\n\t\terr_quit(\"usage: prifname <interface-name>\");\n\n\tprintf(\"interface index = %d\\n\", If_nametoindex(argv[1]));\n\texit(0);\n}\n"
  },
  {
    "path": "route/prifinfo.c",
    "content": "#include\t\"unpifi.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tstruct ifi_info\t*ifi, *ifihead;\n\tstruct sockaddr\t*sa;\n\tu_char\t\t\t*ptr;\n\tint\t\t\t\ti, family, doaliases;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: prifinfo <inet4|inet6> <doaliases>\");\n\tif (strcmp(argv[1], \"inet4\") == 0)\n\t\tfamily = AF_INET;\n#ifdef\tAF_INET6\n\telse if (strcmp(argv[1], \"inet6\") == 0)\n\t\tfamily = AF_INET6;\n#endif\n\telse\n\t\terr_quit(\"invalid <address-family>\");\n\tdoaliases = atoi(argv[2]);\n\n\tfor (ifihead = ifi = Get_ifi_info(family, doaliases);\n\t\t ifi != NULL; ifi = ifi->ifi_next) {\n\t\tprintf(\"%s: <\", ifi->ifi_name);\n\t\tif (ifi->ifi_flags & IFF_UP)\t\t\tprintf(\"UP \");\n\t\tif (ifi->ifi_flags & IFF_BROADCAST)\t\tprintf(\"BCAST \");\n\t\tif (ifi->ifi_flags & IFF_MULTICAST)\t\tprintf(\"MCAST \");\n\t\tif (ifi->ifi_flags & IFF_LOOPBACK)\t\tprintf(\"LOOP \");\n\t\tif (ifi->ifi_flags & IFF_POINTOPOINT)\tprintf(\"P2P \");\n\t\tprintf(\">\\n\");\n\n\t\tif ( (i = ifi->ifi_hlen) > 0) {\n\t\t\tptr = ifi->ifi_haddr;\n\t\t\tdo {\n\t\t\t\tprintf(\"%s%x\", (i == ifi->ifi_hlen) ? \"  \" : \":\", *ptr++);\n\t\t\t} while (--i > 0);\n\t\t\tprintf(\"\\n\");\n\t\t}\n\n\t\tif ( (sa = ifi->ifi_addr) != NULL)\n\t\t\tprintf(\"  IP addr: %s\\n\", Sock_ntop(sa, sa->sa_len));\n\t\tif ( (sa = ifi->ifi_brdaddr) != NULL)\n\t\t\tprintf(\"  broadcast addr: %s\\n\", Sock_ntop(sa, sa->sa_len));\n\t\tif ( (sa = ifi->ifi_dstaddr) != NULL)\n\t\t\tprintf(\"  destination addr: %s\\n\", Sock_ntop(sa, sa->sa_len));\n\t}\n\tfree_ifi_info(ifihead);\n\texit(0);\n}\n"
  },
  {
    "path": "route/prifname.c",
    "content": "#include\t\"unpifi.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tchar\tname[16];\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: prifname <interface-index>\");\n\n\tprintf(\"interface name = %s\\n\", If_indextoname(atoi(argv[1]), name));\n\texit(0);\n}\n"
  },
  {
    "path": "route/prifnameindex.c",
    "content": "#include\t\"unpifi.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tn;\n\tchar\t\t\t\tifname[IFNAMSIZ];\n\tstruct if_nameindex\t*ifptr, *save;\n\n\tif (argc != 1)\n\t\terr_quit(\"usage: prifnameindex\");\n\n\t\t/* print all the interface names and indexes */\n\tfor (save = ifptr = If_nameindex(); ifptr->if_index > 0; ifptr++) {\n\t\tprintf(\"name = %s, index = %d\\n\", ifptr->if_name, ifptr->if_index);;\n\n\t\tif ( (n = If_nametoindex(ifptr->if_name)) != ifptr->if_index)\n\t\t\terr_quit(\"if_nametoindex returned %d, expected %d, for %s\",\n\t\t\t\t\t n, ifptr->if_index, ifptr->if_name);\n\n\t\tIf_indextoname(ifptr->if_index, ifname);\n\t\tif (strcmp(ifname, ifptr->if_name) != 0)\n\t\t\terr_quit(\"if_indextoname returned %s, expected %s, for %d\",\n\t\t\t\t\t ifname, ifptr->if_name, ifptr->if_index);\n\t}\n\n\tn = if_nametoindex(\"fkjhkjhgjhgjhgdjhguyetiuyiuyhkjhkjdh\");\n\tif (n != 0)\n\t\terr_quit(\"if_nametoindex returned %d for fkjh...\", n);\n\tn = if_nametoindex(\"\");\n\tif (n != 0)\n\t\terr_quit(\"if_nametoindex returned %d for (null)\", n);\n\n\tif (if_indextoname(0, ifname) != NULL)\n\t\terr_quit(\"if_indextoname error for 0\");\n\tif (if_indextoname(888888, ifname) != NULL)\n\t\terr_quit(\"if_indextoname error for 888888\");\n\n\tif_freenameindex(save);\n\texit(0);\n}\n"
  },
  {
    "path": "route/unproute.h",
    "content": "#include\t\"unp.h\"\n#include\t<net/if.h>\t\t\t/* if_msghdr{} */\n#include\t<net/if_dl.h>\t\t/* sockaddr_sdl{} */\n#include\t<net/route.h>\t\t/* RTA_xxx constants */\n#include\t<sys/param.h>\n\n#ifdef\tHAVE_SYS_SYSCTL_H\n#include\t<sys/sysctl.h>\t\t/* sysctl() */\n#endif\n\n\t\t\t/* function prototypes */\nvoid\t get_rtaddrs(int, struct sockaddr *, struct sockaddr **);\nchar\t*net_rt_iflist(int, int, size_t *);\nchar\t*net_rt_dump(int, int, size_t *);\nchar\t*sock_masktop(struct sockaddr *, socklen_t);\n\n\t\t\t/* wrapper functions */\nchar\t*Net_rt_iflist(int, int, size_t *);\nchar\t*Net_rt_dump(int, int, size_t *);\n#define\tSock_masktop(a,b)\t\tsock_masktop((a), (b))\n"
  },
  {
    "path": "rtt/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tudpcli01\n\nall:\t${PROGS}\n\nudpcli01:\tudpcli01.o dg_cli.o dg_send_recv.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o dg_cli.o dg_send_recv.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "rtt/dg_cli.c",
    "content": "#include\t\"unp.h\"\n\nssize_t\tDg_send_recv(int, const void *, size_t, void *, size_t,\n\t\t\t\t   const SA *, socklen_t);\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tssize_t\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tn = Dg_send_recv(sockfd, sendline, strlen(sendline),\n\t\t\t\t\t\t recvline, MAXLINE, pservaddr, servlen);\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "rtt/dg_cli.lc",
    "content": "#include    \"unp.h\"##  1 ##src/rtt/dg_cli.c##\n\nssize_t Dg_send_recv(int, const void *, size_t, void *, size_t,##  2 ##src/rtt/dg_cli.c##\n                     const SA *, socklen_t);##  3 ##src/rtt/dg_cli.c##\n\nvoid##  4 ##src/rtt/dg_cli.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  5 ##src/rtt/dg_cli.c##\n{##  6 ##src/rtt/dg_cli.c##\n    ssize_t n;##  7 ##src/rtt/dg_cli.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  8 ##src/rtt/dg_cli.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {##  9 ##src/rtt/dg_cli.c##\n\n        n = Dg_send_recv(sockfd, sendline, strlen(sendline),## 10 ##src/rtt/dg_cli.c##\n                         recvline, MAXLINE, pservaddr, servlen);## 11 ##src/rtt/dg_cli.c##\n\n        recvline[n] = 0;        /* null terminate */## 12 ##src/rtt/dg_cli.c##\n        Fputs(recvline, stdout);## 13 ##src/rtt/dg_cli.c##\n    }## 14 ##src/rtt/dg_cli.c##\n}## 15 ##src/rtt/dg_cli.c##\n"
  },
  {
    "path": "rtt/dg_echo.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tint\t\t\tn;\n\tsocklen_t\tlen;\n\tchar\t\tmesg[MAXLINE];\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tn = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);\n\n\t\tSendto(sockfd, mesg, n, 0, pcliaddr, clilen);\n\t}\n}\n"
  },
  {
    "path": "rtt/dg_send_recv.c",
    "content": "/* include dgsendrecv1 */\n#include\t\"unprtt.h\"\n#include\t<setjmp.h>\n\n#define\tRTT_DEBUG\n\nstatic struct rtt_info   rttinfo;\nstatic int\trttinit = 0;\nstatic struct msghdr\tmsgsend, msgrecv;\t/* assumed init to 0 */\nstatic struct hdr {\n  uint32_t\tseq;\t/* sequence # */\n  uint32_t\tts;\t\t/* timestamp when sent */\n} sendhdr, recvhdr;\n\nstatic void\tsig_alrm(int signo);\nstatic sigjmp_buf\tjmpbuf;\n\nssize_t\ndg_send_recv(int fd, const void *outbuff, size_t outbytes,\n\t\t\t void *inbuff, size_t inbytes,\n\t\t\t const SA *destaddr, socklen_t destlen)\n{\n\tssize_t\t\t\tn;\n\tstruct iovec\tiovsend[2], iovrecv[2];\n\n\tif (rttinit == 0) {\n\t\trtt_init(&rttinfo);\t\t/* first time we're called */\n\t\trttinit = 1;\n\t\trtt_d_flag = 1;\n\t}\n\n\tsendhdr.seq++;\n\tmsgsend.msg_name = destaddr;\n\tmsgsend.msg_namelen = destlen;\n\tmsgsend.msg_iov = iovsend;\n\tmsgsend.msg_iovlen = 2;\n\tiovsend[0].iov_base = &sendhdr;\n\tiovsend[0].iov_len = sizeof(struct hdr);\n\tiovsend[1].iov_base = outbuff;\n\tiovsend[1].iov_len = outbytes;\n\n\tmsgrecv.msg_name = NULL;\n\tmsgrecv.msg_namelen = 0;\n\tmsgrecv.msg_iov = iovrecv;\n\tmsgrecv.msg_iovlen = 2;\n\tiovrecv[0].iov_base = &recvhdr;\n\tiovrecv[0].iov_len = sizeof(struct hdr);\n\tiovrecv[1].iov_base = inbuff;\n\tiovrecv[1].iov_len = inbytes;\n/* end dgsendrecv1 */\n\n/* include dgsendrecv2 */\n\tSignal(SIGALRM, sig_alrm);\n\trtt_newpack(&rttinfo);\t\t/* initialize for this packet */\n\nsendagain:\n#ifdef\tRTT_DEBUG\n\tfprintf(stderr, \"send %4d: \", sendhdr.seq);\n#endif\n\tsendhdr.ts = rtt_ts(&rttinfo);\n\tSendmsg(fd, &msgsend, 0);\n\n\talarm(rtt_start(&rttinfo));\t/* calc timeout value & start timer */\n#ifdef\tRTT_DEBUG\n\trtt_debug(&rttinfo);\n#endif\n\n\tif (sigsetjmp(jmpbuf, 1) != 0) {\n\t\tif (rtt_timeout(&rttinfo) < 0) {\n\t\t\terr_msg(\"dg_send_recv: no response from server, giving up\");\n\t\t\trttinit = 0;\t/* reinit in case we're called again */\n\t\t\terrno = ETIMEDOUT;\n\t\t\treturn(-1);\n\t\t}\n#ifdef\tRTT_DEBUG\n\t\terr_msg(\"dg_send_recv: timeout, retransmitting\");\n#endif\n\t\tgoto sendagain;\n\t}\n\n\tdo {\n\t\tn = Recvmsg(fd, &msgrecv, 0);\n#ifdef\tRTT_DEBUG\n\t\tfprintf(stderr, \"recv %4d\\n\", recvhdr.seq);\n#endif\n\t} while (n < sizeof(struct hdr) || recvhdr.seq != sendhdr.seq);\n\n\talarm(0);\t\t\t/* stop SIGALRM timer */\n\t\t/* 4calculate & store new RTT estimator values */\n\trtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts);\n\n\treturn(n - sizeof(struct hdr));\t/* return size of received datagram */\n}\n\nstatic void\nsig_alrm(int signo)\n{\n\tsiglongjmp(jmpbuf, 1);\n}\n/* end dgsendrecv2 */\n\nssize_t\nDg_send_recv(int fd, const void *outbuff, size_t outbytes,\n\t\t\t void *inbuff, size_t inbytes,\n\t\t\t const SA *destaddr, socklen_t destlen)\n{\n\tssize_t\tn;\n\n\tn = dg_send_recv(fd, outbuff, outbytes, inbuff, inbytes,\n\t\t\t\t\t destaddr, destlen);\n\tif (n < 0)\n\t\terr_quit(\"dg_send_recv error\");\n\n\treturn(n);\n}\n"
  },
  {
    "path": "rtt/dg_send_recv.lc",
    "content": "/* include dgsendrecv1 */\n#include    \"unprtt.h\"##  1 ##src/rtt/dg_send_recv.c##\n#include    <setjmp.h>##  2 ##src/rtt/dg_send_recv.c##\n\n#define RTT_DEBUG##  3 ##src/rtt/dg_send_recv.c##\n\nstatic struct rtt_info rttinfo;##  4 ##src/rtt/dg_send_recv.c##\nstatic int rttinit = 0;##  5 ##src/rtt/dg_send_recv.c##\nstatic struct msghdr msgsend, msgrecv;  /* assumed init to 0 */##  6 ##src/rtt/dg_send_recv.c##\nstatic struct hdr {##  7 ##src/rtt/dg_send_recv.c##\n    uint32_t seq;               /* sequence # */##  8 ##src/rtt/dg_send_recv.c##\n    uint32_t ts;                /* timestamp when sent */##  9 ##src/rtt/dg_send_recv.c##\n} sendhdr, recvhdr;## 10 ##src/rtt/dg_send_recv.c##\n\nstatic void sig_alrm(int signo);## 11 ##src/rtt/dg_send_recv.c##\nstatic sigjmp_buf jmpbuf;## 12 ##src/rtt/dg_send_recv.c##\n\nssize_t## 13 ##src/rtt/dg_send_recv.c##\ndg_send_recv(int fd, const void *outbuff, size_t outbytes,## 14 ##src/rtt/dg_send_recv.c##\n             void *inbuff, size_t inbytes,## 15 ##src/rtt/dg_send_recv.c##\n             const SA *destaddr, socklen_t destlen)## 16 ##src/rtt/dg_send_recv.c##\n{## 17 ##src/rtt/dg_send_recv.c##\n    ssize_t n;## 18 ##src/rtt/dg_send_recv.c##\n    struct iovec iovsend[2], iovrecv[2];## 19 ##src/rtt/dg_send_recv.c##\n\n    if (rttinit == 0) {## 20 ##src/rtt/dg_send_recv.c##\n        rtt_init(&rttinfo);     /* first time we're called */## 21 ##src/rtt/dg_send_recv.c##\n        rttinit = 1;## 22 ##src/rtt/dg_send_recv.c##\n        rtt_d_flag = 1;## 23 ##src/rtt/dg_send_recv.c##\n    }## 24 ##src/rtt/dg_send_recv.c##\n\n    sendhdr.seq++;## 25 ##src/rtt/dg_send_recv.c##\n    msgsend.msg_name = destaddr;## 26 ##src/rtt/dg_send_recv.c##\n    msgsend.msg_namelen = destlen;## 27 ##src/rtt/dg_send_recv.c##\n    msgsend.msg_iov = iovsend;## 28 ##src/rtt/dg_send_recv.c##\n    msgsend.msg_iovlen = 2;## 29 ##src/rtt/dg_send_recv.c##\n    iovsend[0].iov_base = &sendhdr;## 30 ##src/rtt/dg_send_recv.c##\n    iovsend[0].iov_len = sizeof(struct hdr);## 31 ##src/rtt/dg_send_recv.c##\n    iovsend[1].iov_base = outbuff;## 32 ##src/rtt/dg_send_recv.c##\n    iovsend[1].iov_len = outbytes;## 33 ##src/rtt/dg_send_recv.c##\n\n    msgrecv.msg_name = NULL;## 34 ##src/rtt/dg_send_recv.c##\n    msgrecv.msg_namelen = 0;## 35 ##src/rtt/dg_send_recv.c##\n    msgrecv.msg_iov = iovrecv;## 36 ##src/rtt/dg_send_recv.c##\n    msgrecv.msg_iovlen = 2;## 37 ##src/rtt/dg_send_recv.c##\n    iovrecv[0].iov_base = &recvhdr;## 38 ##src/rtt/dg_send_recv.c##\n    iovrecv[0].iov_len = sizeof(struct hdr);## 39 ##src/rtt/dg_send_recv.c##\n    iovrecv[1].iov_base = inbuff;## 40 ##src/rtt/dg_send_recv.c##\n    iovrecv[1].iov_len = inbytes;## 41 ##src/rtt/dg_send_recv.c##\n/* end dgsendrecv1 */\n\n/* include dgsendrecv2 */\n    Signal(SIGALRM, sig_alrm);## 42 ##src/rtt/dg_send_recv.c##\n    rtt_newpack(&rttinfo);      /* initialize for this packet */## 43 ##src/rtt/dg_send_recv.c##\n\n  sendagain:## 44 ##src/rtt/dg_send_recv.c##\n    sendhdr.ts = rtt_ts(&rttinfo);## 45 ##src/rtt/dg_send_recv.c##\n    Sendmsg(fd, &msgsend, 0);## 46 ##src/rtt/dg_send_recv.c##\n\n    alarm(rtt_start(&rttinfo)); /* calc timeout value & start timer */## 47 ##src/rtt/dg_send_recv.c##\n\n    if (sigsetjmp(jmpbuf, 1) != 0) {## 48 ##src/rtt/dg_send_recv.c##\n        if (rtt_timeout(&rttinfo) < 0) {## 49 ##src/rtt/dg_send_recv.c##\n            err_msg(\"dg_send_recv: no response from server, giving up\");## 50 ##src/rtt/dg_send_recv.c##\n            rttinit = 0;        /* reinit in case we're called again */## 51 ##src/rtt/dg_send_recv.c##\n            errno = ETIMEDOUT;## 52 ##src/rtt/dg_send_recv.c##\n            return (-1);## 53 ##src/rtt/dg_send_recv.c##\n        }## 54 ##src/rtt/dg_send_recv.c##\n        goto sendagain;## 55 ##src/rtt/dg_send_recv.c##\n    }## 56 ##src/rtt/dg_send_recv.c##\n\n    do {## 57 ##src/rtt/dg_send_recv.c##\n        n = Recvmsg(fd, &msgrecv, 0);## 58 ##src/rtt/dg_send_recv.c##\n    } while (n < sizeof(struct hdr) || recvhdr.seq != sendhdr.seq);## 59 ##src/rtt/dg_send_recv.c##\n\n    alarm(0);                   /* stop SIGALRM timer */## 60 ##src/rtt/dg_send_recv.c##\n    /* 4calculate & store new RTT estimator values */## 61 ##src/rtt/dg_send_recv.c##\n    rtt_stop(&rttinfo, rtt_ts(&rttinfo) - recvhdr.ts);## 62 ##src/rtt/dg_send_recv.c##\n\n    return (n - sizeof(struct hdr));    /* return size of received datagram */## 63 ##src/rtt/dg_send_recv.c##\n}## 64 ##src/rtt/dg_send_recv.c##\n\nstatic void## 65 ##src/rtt/dg_send_recv.c##\nsig_alrm(int signo)## 66 ##src/rtt/dg_send_recv.c##\n{## 67 ##src/rtt/dg_send_recv.c##\n    siglongjmp(jmpbuf, 1);## 68 ##src/rtt/dg_send_recv.c##\n}## 69 ##src/rtt/dg_send_recv.c##\n/* end dgsendrecv2 */\n\nssize_t## 70 ##src/rtt/dg_send_recv.c##\nDg_send_recv(int fd, const void *outbuff, size_t outbytes,## 71 ##src/rtt/dg_send_recv.c##\n             void *inbuff, size_t inbytes,## 72 ##src/rtt/dg_send_recv.c##\n             const SA *destaddr, socklen_t destlen)## 73 ##src/rtt/dg_send_recv.c##\n{## 74 ##src/rtt/dg_send_recv.c##\n    ssize_t n;## 75 ##src/rtt/dg_send_recv.c##\n\n    n = dg_send_recv(fd, outbuff, outbytes, inbuff, inbytes,## 76 ##src/rtt/dg_send_recv.c##\n                     destaddr, destlen);## 77 ##src/rtt/dg_send_recv.c##\n    if (n < 0)## 78 ##src/rtt/dg_send_recv.c##\n        err_quit(\"dg_send_recv error\");## 79 ##src/rtt/dg_send_recv.c##\n\n    return (n);## 80 ##src/rtt/dg_send_recv.c##\n}## 81 ##src/rtt/dg_send_recv.c##\n"
  },
  {
    "path": "rtt/rtt.out.kumba.1",
    "content": "send    1: rtt = 0.000, srtt = 0.000, rttvar = 0.750, rto = 3.000\nrecv    1\nupdated rto\nsend    2: rtt = 0.366, srtt = 0.046, rttvar = 0.654, rto = 2.662\nrecv    2\nupdated rto\nsend    3: rtt = 0.309, srtt = 0.079, rttvar = 0.556, rto = 2.304\nrecv    3\nupdated rto\nsend    4: rtt = 0.298, srtt = 0.106, rttvar = 0.472, rto = 2.000\nrecv    4\nupdated rto\nsend    5: rtt = 0.360, srtt = 0.138, rttvar = 0.418, rto = 2.000\nrecv    5\nupdated rto\nsend    6: rtt = 0.360, srtt = 0.166, rttvar = 0.369, rto = 2.000\nrecv    6\nupdated rto\nsend    7: rtt = 0.320, srtt = 0.185, rttvar = 0.315, rto = 2.000\nrecv    7\nupdated rto\nsend    8: rtt = 0.340, srtt = 0.204, rttvar = 0.275, rto = 2.000\nrecv    8\nupdated rto\nsend    9: rtt = 0.330, srtt = 0.220, rttvar = 0.238, rto = 2.000\nrecv    9\nupdated rto\nsend   10: rtt = 0.350, srtt = 0.236, rttvar = 0.211, rto = 2.000\nrecv   10\nupdated rto\nsend   11: rtt = 0.349, srtt = 0.250, rttvar = 0.186, rto = 2.000\nrecv   11\nupdated rto\nsend   12: rtt = 0.380, srtt = 0.267, rttvar = 0.172, rto = 2.000\nrecv   12\nupdated rto\nsend   13: rtt = 0.349, srtt = 0.277, rttvar = 0.150, rto = 2.000\nrecv   13\nupdated rto\nsend   14: rtt = 0.340, srtt = 0.285, rttvar = 0.128, rto = 2.000\nrecv   14\nupdated rto\nsend   15: rtt = 0.280, srtt = 0.284, rttvar = 0.097, rto = 2.000\nrecv   15\nupdated rto\nsend   16: rtt = 0.330, srtt = 0.290, rttvar = 0.084, rto = 2.000\nrecv   16\nupdated rto\nsend   17: rtt = 0.340, srtt = 0.296, rttvar = 0.076, rto = 2.000\nrecv   17\nupdated rto\nsend   18: rtt = 0.340, srtt = 0.302, rttvar = 0.068, rto = 2.000\nrecv   18\nupdated rto\nsend   19: rtt = 0.349, srtt = 0.308, rttvar = 0.063, rto = 2.000\nrecv   19\nupdated rto\nsend   20: rtt = 0.310, srtt = 0.308, rttvar = 0.048, rto = 2.000\nrecv   20\nupdated rto\nsend   21: rtt = 0.350, srtt = 0.313, rttvar = 0.046, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   21: rtt = 0.350, srtt = 0.313, rttvar = 0.046, rto = 4.000\nrecv   21\nupdated rto\nsend   22: rtt = 0.340, srtt = 0.316, rttvar = 0.041, rto = 2.000\nrecv   22\nupdated rto\nsend   23: rtt = 0.350, srtt = 0.321, rttvar = 0.039, rto = 2.000\nrecv   23\nupdated rto\nsend   24: rtt = 0.319, srtt = 0.320, rttvar = 0.030, rto = 2.000\nrecv   24\nupdated rto\nsend   25: rtt = 0.360, srtt = 0.325, rttvar = 0.032, rto = 2.000\nrecv   25\nupdated rto\nsend   26: rtt = 0.290, srtt = 0.321, rttvar = 0.033, rto = 2.000\nrecv   26\nupdated rto\nsend   27: rtt = 0.310, srtt = 0.320, rttvar = 0.028, rto = 2.000\nrecv   27\nupdated rto\nsend   28: rtt = 0.340, srtt = 0.322, rttvar = 0.026, rto = 2.000\nrecv   28\nupdated rto\nsend   29: rtt = 0.371, srtt = 0.328, rttvar = 0.032, rto = 2.000\nrecv   29\nupdated rto\nsend   30: rtt = 0.368, srtt = 0.333, rttvar = 0.034, rto = 2.000\nrecv   30\nupdated rto\nsend   31: rtt = 0.350, srtt = 0.335, rttvar = 0.029, rto = 2.000\nrecv   31\nupdated rto\nsend   32: rtt = 0.364, srtt = 0.339, rttvar = 0.029, rto = 2.000\nrecv   32\nupdated rto\nsend   33: rtt = 0.335, srtt = 0.338, rttvar = 0.023, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   33: rtt = 0.335, srtt = 0.338, rttvar = 0.023, rto = 4.000\nrecv   33\nupdated rto\nsend   34: rtt = 0.330, srtt = 0.337, rttvar = 0.019, rto = 2.000\nrecv   34\nupdated rto\nsend   35: rtt = 0.290, srtt = 0.331, rttvar = 0.026, rto = 2.000\nrecv   35\nupdated rto\nsend   36: rtt = 0.390, srtt = 0.339, rttvar = 0.034, rto = 2.000\nrecv   36\nupdated rto\nsend   37: rtt = 0.355, srtt = 0.341, rttvar = 0.030, rto = 2.000\nrecv   37\nupdated rto\nsend   38: rtt = 0.334, srtt = 0.340, rttvar = 0.024, rto = 2.000\nrecv   38\nupdated rto\nsend   39: rtt = 0.320, srtt = 0.337, rttvar = 0.023, rto = 2.000\nrecv   39\nupdated rto\nsend   40: rtt = 0.344, srtt = 0.338, rttvar = 0.019, rto = 2.000\nrecv   40\nupdated rto\nsend   41: rtt = 0.345, srtt = 0.339, rttvar = 0.016, rto = 2.000\nrecv   41\nupdated rto\nsend   42: rtt = 0.349, srtt = 0.340, rttvar = 0.014, rto = 2.000\nrecv   42\nupdated rto\nsend   43: rtt = 0.305, srtt = 0.336, rttvar = 0.020, rto = 2.000\nrecv   43\nupdated rto\nsend   44: rtt = 0.284, srtt = 0.329, rttvar = 0.028, rto = 2.000\nrecv   44\nupdated rto\nsend   45: rtt = 0.320, srtt = 0.328, rttvar = 0.023, rto = 2.000\nrecv   45\nupdated rto\nsend   46: rtt = 0.320, srtt = 0.327, rttvar = 0.019, rto = 2.000\nrecv   46\nupdated rto\nsend   47: rtt = 0.340, srtt = 0.329, rttvar = 0.018, rto = 2.000\nrecv   47\nupdated rto\nsend   48: rtt = 0.309, srtt = 0.326, rttvar = 0.018, rto = 2.000\nrecv   48\nupdated rto\nsend   49: rtt = 0.310, srtt = 0.324, rttvar = 0.018, rto = 2.000\nrecv   49\nupdated rto\nsend   50: rtt = 0.320, srtt = 0.324, rttvar = 0.014, rto = 2.000\nrecv   50\nupdated rto\nsend   51: rtt = 0.320, srtt = 0.323, rttvar = 0.012, rto = 2.000\nrecv   51\nupdated rto\nsend   52: rtt = 0.300, srtt = 0.320, rttvar = 0.015, rto = 2.000\nrecv   52\nupdated rto\nsend   53: rtt = 0.320, srtt = 0.320, rttvar = 0.011, rto = 2.000\nrecv   53\nupdated rto\nsend   54: rtt = 0.350, srtt = 0.324, rttvar = 0.016, rto = 2.000\nrecv   54\nupdated rto\nsend   55: rtt = 0.349, srtt = 0.327, rttvar = 0.018, rto = 2.000\nrecv   55\nupdated rto\nsend   56: rtt = 0.339, srtt = 0.329, rttvar = 0.016, rto = 2.000\nrecv   56\nupdated rto\nsend   57: rtt = 0.350, srtt = 0.331, rttvar = 0.018, rto = 2.000\nrecv   57\nupdated rto\nsend   58: rtt = 0.319, srtt = 0.330, rttvar = 0.016, rto = 2.000\nrecv   58\nupdated rto\nsend   59: rtt = 0.309, srtt = 0.327, rttvar = 0.017, rto = 2.000\nrecv   59\nupdated rto\nsend   60: rtt = 0.310, srtt = 0.325, rttvar = 0.017, rto = 2.000\nrecv   60\nupdated rto\nsend   61: rtt = 0.320, srtt = 0.324, rttvar = 0.014, rto = 2.000\nrecv   61\nupdated rto\nsend   62: rtt = 0.300, srtt = 0.321, rttvar = 0.017, rto = 2.000\nrecv   62\nupdated rto\nsend   63: rtt = 0.309, srtt = 0.320, rttvar = 0.016, rto = 2.000\nrecv   63\nupdated rto\nsend   64: rtt = 0.290, srtt = 0.316, rttvar = 0.019, rto = 2.000\nrecv   64\nupdated rto\nsend   65: rtt = 0.320, srtt = 0.317, rttvar = 0.015, rto = 2.000\nrecv   65\nupdated rto\nsend   66: rtt = 0.280, srtt = 0.312, rttvar = 0.021, rto = 2.000\nrecv   66\nupdated rto\nsend   67: rtt = 0.339, srtt = 0.315, rttvar = 0.022, rto = 2.000\nrecv   67\nupdated rto\nsend   68: rtt = 0.330, srtt = 0.317, rttvar = 0.020, rto = 2.000\nrecv   68\nupdated rto\nsend   69: rtt = 0.320, srtt = 0.318, rttvar = 0.016, rto = 2.000\nrecv   69\nupdated rto\nsend   70: rtt = 0.280, srtt = 0.313, rttvar = 0.021, rto = 2.000\nrecv   70\nupdated rto\nsend   71: rtt = 0.319, srtt = 0.314, rttvar = 0.018, rto = 2.000\nrecv   71\nupdated rto\nsend   72: rtt = 0.339, srtt = 0.317, rttvar = 0.020, rto = 2.000\nrecv   72\nupdated rto\nsend   73: rtt = 0.309, srtt = 0.316, rttvar = 0.017, rto = 2.000\nrecv   73\nupdated rto\nsend   74: rtt = 0.340, srtt = 0.319, rttvar = 0.018, rto = 2.000\nrecv   74\nupdated rto\nsend   75: rtt = 0.330, srtt = 0.320, rttvar = 0.017, rto = 2.000\nrecv   75\nupdated rto\nsend   76: rtt = 0.280, srtt = 0.315, rttvar = 0.023, rto = 2.000\nrecv   76\nupdated rto\nsend   77: rtt = 0.320, srtt = 0.316, rttvar = 0.018, rto = 2.000\nrecv   77\nupdated rto\nsend   78: rtt = 0.280, srtt = 0.311, rttvar = 0.023, rto = 2.000\nrecv   78\nupdated rto\nsend   79: rtt = 0.330, srtt = 0.314, rttvar = 0.022, rto = 2.000\nrecv   79\nupdated rto\nsend   80: rtt = 0.349, srtt = 0.318, rttvar = 0.025, rto = 2.000\nrecv   80\nupdated rto\nsend   81: rtt = 0.320, srtt = 0.318, rttvar = 0.019, rto = 2.000\nrecv   81\nupdated rto\nsend   82: rtt = 0.320, srtt = 0.319, rttvar = 0.015, rto = 2.000\nrecv   82\nupdated rto\nsend   83: rtt = 0.329, srtt = 0.320, rttvar = 0.014, rto = 2.000\nrecv   83\nupdated rto\nsend   84: rtt = 0.320, srtt = 0.320, rttvar = 0.010, rto = 2.000\nrecv   84\nupdated rto\nsend   85: rtt = 0.329, srtt = 0.321, rttvar = 0.010, rto = 2.000\nrecv   85\nupdated rto\nsend   86: rtt = 0.330, srtt = 0.322, rttvar = 0.010, rto = 2.000\nrecv   86\nupdated rto\nsend   87: rtt = 0.339, srtt = 0.324, rttvar = 0.012, rto = 2.000\nrecv   87\nupdated rto\nsend   88: rtt = 0.360, srtt = 0.329, rttvar = 0.018, rto = 2.000\nrecv   88\nupdated rto\nsend   89: rtt = 0.320, srtt = 0.328, rttvar = 0.015, rto = 2.000\nrecv   89\nupdated rto\nsend   90: rtt = 0.319, srtt = 0.327, rttvar = 0.014, rto = 2.000\nrecv   90\nupdated rto\nsend   91: rtt = 0.330, srtt = 0.327, rttvar = 0.011, rto = 2.000\nrecv   91\nupdated rto\nsend   92: rtt = 0.304, srtt = 0.324, rttvar = 0.014, rto = 2.000\nrecv   92\nupdated rto\nsend   93: rtt = 0.316, srtt = 0.323, rttvar = 0.013, rto = 2.000\nrecv   93\nupdated rto\nsend   94: rtt = 0.319, srtt = 0.323, rttvar = 0.010, rto = 2.000\nrecv   94\nupdated rto\nsend   95: rtt = 0.360, srtt = 0.327, rttvar = 0.017, rto = 2.000\nrecv   95\nupdated rto\nsend   96: rtt = 0.316, srtt = 0.326, rttvar = 0.016, rto = 2.000\nrecv   96\nupdated rto\nsend   97: rtt = 0.314, srtt = 0.324, rttvar = 0.015, rto = 2.000\nrecv   97\nupdated rto\nsend   98: rtt = 0.330, srtt = 0.325, rttvar = 0.012, rto = 2.000\nrecv   98\nupdated rto\nsend   99: rtt = 0.330, srtt = 0.326, rttvar = 0.011, rto = 2.000\nrecv   99\nupdated rto\nsend  100: rtt = 0.360, srtt = 0.330, rttvar = 0.017, rto = 2.000\nrecv  100\nupdated rto\nsend  101: rtt = 0.330, srtt = 0.330, rttvar = 0.012, rto = 2.000\nrecv  101\nupdated rto\nsend  102: rtt = 0.350, srtt = 0.332, rttvar = 0.014, rto = 2.000\nrecv  102\nupdated rto\nsend  103: rtt = 0.320, srtt = 0.331, rttvar = 0.014, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  103: rtt = 0.320, srtt = 0.331, rttvar = 0.014, rto = 4.000\nrecv  103\nupdated rto\nsend  104: rtt = 0.340, srtt = 0.332, rttvar = 0.013, rto = 2.000\nrecv  104\nupdated rto\nsend  105: rtt = 0.340, srtt = 0.333, rttvar = 0.011, rto = 2.000\nrecv  105\nupdated rto\nsend  106: rtt = 0.320, srtt = 0.331, rttvar = 0.012, rto = 2.000\nrecv  106\nupdated rto\nsend  107: rtt = 0.340, srtt = 0.332, rttvar = 0.011, rto = 2.000\nrecv  107\nupdated rto\nsend  108: rtt = 0.340, srtt = 0.333, rttvar = 0.010, rto = 2.000\nrecv  108\nupdated rto\nsend  109: rtt = 0.340, srtt = 0.334, rttvar = 0.009, rto = 2.000\nrecv  109\nupdated rto\nsend  110: rtt = 0.369, srtt = 0.339, rttvar = 0.016, rto = 2.000\nrecv  110\nupdated rto\nsend  111: rtt = 0.350, srtt = 0.340, rttvar = 0.015, rto = 2.000\nrecv  111\nupdated rto\nsend  112: rtt = 0.369, srtt = 0.344, rttvar = 0.018, rto = 2.000\nrecv  112\nupdated rto\nsend  113: rtt = 0.339, srtt = 0.343, rttvar = 0.015, rto = 2.000\nrecv  113\nupdated rto\nsend  114: rtt = 0.349, srtt = 0.344, rttvar = 0.013, rto = 2.000\nrecv  114\nupdated rto\nsend  115: rtt = 0.319, srtt = 0.341, rttvar = 0.016, rto = 2.000\nrecv  115\nupdated rto\nsend  116: rtt = 0.340, srtt = 0.341, rttvar = 0.012, rto = 2.000\nrecv  116\nupdated rto\nsend  117: rtt = 0.319, srtt = 0.338, rttvar = 0.014, rto = 2.000\nrecv  117\nupdated rto\nsend  118: rtt = 0.340, srtt = 0.338, rttvar = 0.011, rto = 2.000\nrecv  118\nupdated rto\nsend  119: rtt = 0.380, srtt = 0.343, rttvar = 0.019, rto = 2.000\nrecv  119\nupdated rto\nsend  120: rtt = 0.340, srtt = 0.343, rttvar = 0.015, rto = 2.000\nrecv  120\nupdated rto\nsend  121: rtt = 0.320, srtt = 0.340, rttvar = 0.017, rto = 2.000\nrecv  121\nupdated rto\nsend  122: rtt = 0.340, srtt = 0.340, rttvar = 0.013, rto = 2.000\nrecv  122\nupdated rto\nsend  123: rtt = 0.360, srtt = 0.343, rttvar = 0.015, rto = 2.000\nrecv  123\nupdated rto\nsend  124: rtt = 0.359, srtt = 0.345, rttvar = 0.015, rto = 2.000\nrecv  124\nupdated rto\nsend  125: rtt = 0.330, srtt = 0.343, rttvar = 0.015, rto = 2.000\nrecv  125\nupdated rto\nsend  126: rtt = 0.329, srtt = 0.341, rttvar = 0.015, rto = 2.000\nrecv  126\nupdated rto\nsend  127: rtt = 0.340, srtt = 0.341, rttvar = 0.011, rto = 2.000\nrecv  127\nupdated rto\nsend  128: rtt = 0.360, srtt = 0.343, rttvar = 0.013, rto = 2.000\nrecv  128\nupdated rto\nsend  129: rtt = 0.320, srtt = 0.340, rttvar = 0.016, rto = 2.000\nrecv  129\nupdated rto\nsend  130: rtt = 0.340, srtt = 0.340, rttvar = 0.012, rto = 2.000\nrecv  130\nupdated rto\nsend  131: rtt = 0.350, srtt = 0.342, rttvar = 0.011, rto = 2.000\nrecv  131\nupdated rto\nsend  132: rtt = 0.340, srtt = 0.341, rttvar = 0.009, rto = 2.000\nrecv  132\nupdated rto\nsend  133: rtt = 0.370, srtt = 0.345, rttvar = 0.014, rto = 2.000\nrecv  133\nupdated rto\nsend  134: rtt = 0.339, srtt = 0.344, rttvar = 0.012, rto = 2.000\nrecv  134\nupdated rto\nsend  135: rtt = 0.330, srtt = 0.342, rttvar = 0.012, rto = 2.000\nrecv  135\nupdated rto\nsend  136: rtt = 0.340, srtt = 0.342, rttvar = 0.010, rto = 2.000\nrecv  136\nupdated rto\nsend  137: rtt = 0.300, srtt = 0.337, rttvar = 0.018, rto = 2.000\nrecv  137\nupdated rto\nsend  138: rtt = 0.340, srtt = 0.337, rttvar = 0.014, rto = 2.000\nrecv  138\nupdated rto\nsend  139: rtt = 0.340, srtt = 0.338, rttvar = 0.011, rto = 2.000\nrecv  139\nupdated rto\nsend  140: rtt = 0.380, srtt = 0.343, rttvar = 0.019, rto = 2.000\nrecv  140\nupdated rto\nsend  141: rtt = 0.450, srtt = 0.356, rttvar = 0.041, rto = 2.000\nrecv  141\nupdated rto\nsend  142: rtt = 0.370, srtt = 0.358, rttvar = 0.034, rto = 2.000\nrecv  142\nupdated rto\nsend  143: rtt = 0.309, srtt = 0.352, rttvar = 0.038, rto = 2.000\nrecv  143\nupdated rto\nsend  144: rtt = 0.290, srtt = 0.344, rttvar = 0.044, rto = 2.000\nrecv  144\nupdated rto\nsend  145: rtt = 0.390, srtt = 0.350, rttvar = 0.044, rto = 2.000\nrecv  145\nupdated rto\nsend  146: rtt = 0.329, srtt = 0.347, rttvar = 0.039, rto = 2.000\nrecv  146\nupdated rto\nsend  147: rtt = 0.330, srtt = 0.345, rttvar = 0.033, rto = 2.000\nrecv  147\nupdated rto\nsend  148: rtt = 0.320, srtt = 0.342, rttvar = 0.031, rto = 2.000\nrecv  148\nupdated rto\nsend  149: rtt = 0.340, srtt = 0.342, rttvar = 0.024, rto = 2.000\nrecv  149\nupdated rto\nsend  150: rtt = 0.359, srtt = 0.344, rttvar = 0.022, rto = 2.000\nrecv  150\nupdated rto\nsend  151: rtt = 0.350, srtt = 0.345, rttvar = 0.018, rto = 2.000\nrecv  151\nupdated rto\nsend  152: rtt = 0.349, srtt = 0.345, rttvar = 0.015, rto = 2.000\nrecv  152\nupdated rto\nsend  153: rtt = 0.400, srtt = 0.352, rttvar = 0.025, rto = 2.000\nrecv  153\nupdated rto\nsend  154: rtt = 0.350, srtt = 0.352, rttvar = 0.019, rto = 2.000\nrecv  154\nupdated rto\nsend  155: rtt = 0.370, srtt = 0.354, rttvar = 0.019, rto = 2.000\nrecv  155\nupdated rto\nsend  156: rtt = 0.359, srtt = 0.355, rttvar = 0.015, rto = 2.000\nrecv  156\nupdated rto\nsend  157: rtt = 0.349, srtt = 0.354, rttvar = 0.013, rto = 2.000\nrecv  157\nupdated rto\nsend  158: rtt = 0.360, srtt = 0.355, rttvar = 0.011, rto = 2.000\nrecv  158\nupdated rto\nsend  159: rtt = 0.319, srtt = 0.350, rttvar = 0.017, rto = 2.000\nrecv  159\nupdated rto\nsend  160: rtt = 0.320, srtt = 0.346, rttvar = 0.021, rto = 2.000\nrecv  160\nupdated rto\nsend  161: rtt = 0.330, srtt = 0.344, rttvar = 0.020, rto = 2.000\nrecv  161\nupdated rto\nsend  162: rtt = 0.340, srtt = 0.344, rttvar = 0.016, rto = 2.000\nrecv  162\nupdated rto\nsend  163: rtt = 0.350, srtt = 0.345, rttvar = 0.013, rto = 2.000\nrecv  163\nupdated rto\nsend  164: rtt = 0.350, srtt = 0.345, rttvar = 0.011, rto = 2.000\nrecv  164\nupdated rto\nsend  165: rtt = 0.339, srtt = 0.345, rttvar = 0.010, rto = 2.000\nrecv  165\nupdated rto\nsend  166: rtt = 0.339, srtt = 0.344, rttvar = 0.009, rto = 2.000\nrecv  166\nupdated rto\nsend  167: rtt = 0.330, srtt = 0.342, rttvar = 0.010, rto = 2.000\nrecv  167\nupdated rto\nsend  168: rtt = 0.310, srtt = 0.338, rttvar = 0.016, rto = 2.000\nrecv  168\nupdated rto\nsend  169: rtt = 0.310, srtt = 0.335, rttvar = 0.019, rto = 2.000\nrecv  169\nupdated rto\nsend  170: rtt = 0.320, srtt = 0.333, rttvar = 0.018, rto = 2.000\nrecv  170\nupdated rto\nsend  171: rtt = 0.339, srtt = 0.334, rttvar = 0.015, rto = 2.000\nrecv  171\nupdated rto\nsend  172: rtt = 0.320, srtt = 0.332, rttvar = 0.015, rto = 2.000\nrecv  172\nupdated rto\nsend  173: rtt = 0.319, srtt = 0.330, rttvar = 0.014, rto = 2.000\nrecv  173\nupdated rto\nsend  174: rtt = 0.320, srtt = 0.329, rttvar = 0.013, rto = 2.000\nrecv  174\nupdated rto\nsend  175: rtt = 0.319, srtt = 0.328, rttvar = 0.012, rto = 2.000\nrecv  175\nupdated rto\nsend  176: rtt = 0.309, srtt = 0.325, rttvar = 0.014, rto = 2.000\nrecv  176\nupdated rto\nsend  177: rtt = 0.340, srtt = 0.327, rttvar = 0.014, rto = 2.000\nrecv  177\nupdated rto\nsend  178: rtt = 0.334, srtt = 0.328, rttvar = 0.012, rto = 2.000\nrecv  178\nupdated rto\nsend  179: rtt = 0.315, srtt = 0.326, rttvar = 0.012, rto = 2.000\nrecv  179\nupdated rto\nsend  180: rtt = 0.309, srtt = 0.324, rttvar = 0.014, rto = 2.000\nrecv  180\nupdated rto\nsend  181: rtt = 0.309, srtt = 0.322, rttvar = 0.014, rto = 2.000\nrecv  181\nupdated rto\nsend  182: rtt = 0.330, srtt = 0.323, rttvar = 0.012, rto = 2.000\nrecv  182\nupdated rto\nsend  183: rtt = 0.370, srtt = 0.329, rttvar = 0.021, rto = 2.000\nrecv  183\nupdated rto\nsend  184: rtt = 0.320, srtt = 0.328, rttvar = 0.018, rto = 2.000\nrecv  184\nupdated rto\nsend  185: rtt = 0.380, srtt = 0.334, rttvar = 0.027, rto = 2.000\nrecv  185\nupdated rto\nsend  186: rtt = 0.350, srtt = 0.336, rttvar = 0.024, rto = 2.000\nrecv  186\nupdated rto\nsend  187: rtt = 0.309, srtt = 0.333, rttvar = 0.025, rto = 2.000\nrecv  187\nupdated rto\nsend  188: rtt = 0.330, srtt = 0.333, rttvar = 0.019, rto = 2.000\nrecv  188\nupdated rto\nsend  189: rtt = 0.320, srtt = 0.331, rttvar = 0.018, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  189: rtt = 0.320, srtt = 0.331, rttvar = 0.018, rto = 4.000\nrecv  189\nupdated rto\nsend  190: rtt = 0.329, srtt = 0.331, rttvar = 0.014, rto = 2.000\nrecv  190\nupdated rto\nsend  191: rtt = 0.310, srtt = 0.328, rttvar = 0.015, rto = 2.000\nrecv  191\nupdated rto\nsend  192: rtt = 0.319, srtt = 0.327, rttvar = 0.014, rto = 2.000\nrecv  192\nupdated rto\nsend  193: rtt = 0.310, srtt = 0.325, rttvar = 0.015, rto = 2.000\nrecv  193\nupdated rto\nsend  194: rtt = 0.300, srtt = 0.322, rttvar = 0.017, rto = 2.000\nrecv  194\nupdated rto\nsend  195: rtt = 0.309, srtt = 0.320, rttvar = 0.016, rto = 2.000\nrecv  195\nupdated rto\nsend  196: rtt = 0.319, srtt = 0.320, rttvar = 0.012, rto = 2.000\nrecv  196\nupdated rto\nsend  197: rtt = 0.310, srtt = 0.319, rttvar = 0.012, rto = 2.000\nrecv  197\nupdated rto\nsend  198: rtt = 0.309, srtt = 0.318, rttvar = 0.011, rto = 2.000\nrecv  198\nupdated rto\nsend  199: rtt = 0.330, srtt = 0.319, rttvar = 0.012, rto = 2.000\nrecv  199\nupdated rto\nsend  200: rtt = 0.299, srtt = 0.317, rttvar = 0.014, rto = 2.000\nrecv  200\nupdated rto\nsend  201: rtt = 0.310, srtt = 0.316, rttvar = 0.012, rto = 2.000\nrecv  201\nupdated rto\nsend  202: rtt = 0.354, srtt = 0.321, rttvar = 0.019, rto = 2.000\nrecv  202\nupdated rto\nsend  203: rtt = 0.312, srtt = 0.319, rttvar = 0.016, rto = 2.000\nrecv  203\nupdated rto\nsend  204: rtt = 0.303, srtt = 0.317, rttvar = 0.016, rto = 2.000\nrecv  204\nupdated rto\nsend  205: rtt = 0.329, srtt = 0.319, rttvar = 0.015, rto = 2.000\nrecv  205\nupdated rto\nsend  206: rtt = 0.319, srtt = 0.319, rttvar = 0.011, rto = 2.000\nrecv  206\nupdated rto\nsend  207: rtt = 0.339, srtt = 0.321, rttvar = 0.013, rto = 2.000\nrecv  207\nupdated rto\nsend  208: rtt = 0.310, srtt = 0.320, rttvar = 0.013, rto = 2.000\nrecv  208\nupdated rto\nsend  209: rtt = 0.321, srtt = 0.320, rttvar = 0.010, rto = 2.000\nrecv  209\nupdated rto\nsend  210: rtt = 0.308, srtt = 0.319, rttvar = 0.011, rto = 2.000\nrecv  210\nupdated rto\nsend  211: rtt = 0.350, srtt = 0.323, rttvar = 0.016, rto = 2.000\nrecv  211\nupdated rto\nsend  212: rtt = 0.359, srtt = 0.327, rttvar = 0.021, rto = 2.000\nrecv  212\nupdated rto\nsend  213: rtt = 0.310, srtt = 0.325, rttvar = 0.020, rto = 2.000\nrecv  213\nupdated rto\nsend  214: rtt = 0.329, srtt = 0.325, rttvar = 0.016, rto = 2.000\nrecv  214\nupdated rto\nsend  215: rtt = 0.310, srtt = 0.324, rttvar = 0.016, rto = 2.000\nrecv  215\nupdated rto\nsend  216: rtt = 0.772, srtt = 0.380, rttvar = 0.124, rto = 2.000\nrecv  216\nupdated rto\nsend  217: rtt = 0.317, srtt = 0.372, rttvar = 0.109, rto = 2.000\nrecv  217\nupdated rto\nsend  218: rtt = 0.379, srtt = 0.373, rttvar = 0.083, rto = 2.000\nrecv  218\nupdated rto\nsend  219: rtt = 0.310, srtt = 0.365, rttvar = 0.078, rto = 2.000\nrecv  219\nupdated rto\nsend  220: rtt = 0.304, srtt = 0.357, rttvar = 0.074, rto = 2.000\nrecv  220\nupdated rto\nsend  221: rtt = 0.315, srtt = 0.352, rttvar = 0.066, rto = 2.000\nrecv  221\nupdated rto\nsend  222: rtt = 0.340, srtt = 0.350, rttvar = 0.052, rto = 2.000\nrecv  222\nupdated rto\nsend  223: rtt = 0.329, srtt = 0.348, rttvar = 0.045, rto = 2.000\nrecv  223\nupdated rto\nsend  224: rtt = 0.349, srtt = 0.348, rttvar = 0.034, rto = 2.000\nrecv  224\nupdated rto\nsend  225: rtt = 0.350, srtt = 0.348, rttvar = 0.026, rto = 2.000\nrecv  225\nupdated rto\nsend  226: rtt = 0.360, srtt = 0.350, rttvar = 0.022, rto = 2.000\nrecv  226\nupdated rto\nsend  227: rtt = 0.380, srtt = 0.353, rttvar = 0.024, rto = 2.000\nrecv  227\nupdated rto\nsend  228: rtt = 0.320, srtt = 0.349, rttvar = 0.027, rto = 2.000\nrecv  228\nupdated rto\nsend  229: rtt = 0.319, srtt = 0.345, rttvar = 0.028, rto = 2.000\nrecv  229\nupdated rto\nsend  230: rtt = 0.370, srtt = 0.349, rttvar = 0.027, rto = 2.000\nrecv  230\nupdated rto\nsend  231: rtt = 0.358, srtt = 0.350, rttvar = 0.022, rto = 2.000\nrecv  231\nupdated rto\nsend  232: rtt = 0.340, srtt = 0.349, rttvar = 0.019, rto = 2.000\nrecv  232\nupdated rto\nsend  233: rtt = 0.360, srtt = 0.350, rttvar = 0.017, rto = 2.000\nrecv  233\nupdated rto\nsend  234: rtt = 0.289, srtt = 0.342, rttvar = 0.028, rto = 2.000\nrecv  234\nupdated rto\nsend  235: rtt = 0.350, srtt = 0.343, rttvar = 0.023, rto = 2.000\nrecv  235\nupdated rto\nsend  236: rtt = 0.310, srtt = 0.339, rttvar = 0.026, rto = 2.000\nrecv  236\nupdated rto\nsend  237: rtt = 0.319, srtt = 0.337, rttvar = 0.024, rto = 2.000\nrecv  237\nupdated rto\nsend  238: rtt = 0.330, srtt = 0.336, rttvar = 0.020, rto = 2.000\nrecv  238\nupdated rto\nsend  239: rtt = 0.308, srtt = 0.332, rttvar = 0.022, rto = 2.000\nrecv  239\nupdated rto\nsend  240: rtt = 0.320, srtt = 0.331, rttvar = 0.019, rto = 2.000\nrecv  240\nupdated rto\nsend  241: rtt = 0.290, srtt = 0.326, rttvar = 0.025, rto = 2.000\nrecv  241\nupdated rto\nsend  242: rtt = 0.360, srtt = 0.330, rttvar = 0.027, rto = 2.000\nrecv  242\nupdated rto\nsend  243: rtt = 0.330, srtt = 0.330, rttvar = 0.020, rto = 2.000\nrecv  243\nupdated rto\nsend  244: rtt = 0.339, srtt = 0.331, rttvar = 0.018, rto = 2.000\nrecv  244\nupdated rto\nsend  245: rtt = 0.350, srtt = 0.333, rttvar = 0.018, rto = 2.000\nrecv  245\nupdated rto\nsend  246: rtt = 0.330, srtt = 0.333, rttvar = 0.014, rto = 2.000\nrecv  246\nupdated rto\nsend  247: rtt = 0.309, srtt = 0.330, rttvar = 0.017, rto = 2.000\nrecv  247\nupdated rto\nsend  248: rtt = 0.329, srtt = 0.330, rttvar = 0.013, rto = 2.000\nrecv  248\nupdated rto\nsend  249: rtt = 0.360, srtt = 0.334, rttvar = 0.017, rto = 2.000\nrecv  249\nupdated rto\nsend  250: rtt = 0.350, srtt = 0.336, rttvar = 0.017, rto = 2.000\nrecv  250\nupdated rto\nsend  251: rtt = 0.340, srtt = 0.336, rttvar = 0.014, rto = 2.000\nrecv  251\nupdated rto\nsend  252: rtt = 0.410, srtt = 0.345, rttvar = 0.029, rto = 2.000\nrecv  252\nupdated rto\nsend  253: rtt = 0.339, srtt = 0.345, rttvar = 0.023, rto = 2.000\nrecv  253\nupdated rto\nsend  254: rtt = 0.335, srtt = 0.343, rttvar = 0.020, rto = 2.000\nrecv  254\nupdated rto\nsend  255: rtt = 0.335, srtt = 0.342, rttvar = 0.017, rto = 2.000\nrecv  255\nupdated rto\nsend  256: rtt = 0.319, srtt = 0.339, rttvar = 0.019, rto = 2.000\nrecv  256\nupdated rto\nsend  257: rtt = 0.350, srtt = 0.341, rttvar = 0.017, rto = 2.000\nrecv  257\nupdated rto\nsend  258: rtt = 0.310, srtt = 0.337, rttvar = 0.020, rto = 2.000\nrecv  258\nupdated rto\nsend  259: rtt = 0.320, srtt = 0.335, rttvar = 0.019, rto = 2.000\nrecv  259\nupdated rto\nsend  260: rtt = 0.319, srtt = 0.333, rttvar = 0.018, rto = 2.000\nrecv  260\nupdated rto\nsend  261: rtt = 0.300, srtt = 0.329, rttvar = 0.022, rto = 2.000\nrecv  261\nupdated rto\nsend  262: rtt = 0.389, srtt = 0.336, rttvar = 0.032, rto = 2.000\nrecv  262\nupdated rto\nsend  263: rtt = 1.259, srtt = 0.452, rttvar = 0.254, rto = 2.000\nrecv  263\nupdated rto\nsend  264: rtt = 0.819, srtt = 0.498, rttvar = 0.283, rto = 2.000\nrecv  264\nupdated rto\nsend  265: rtt = 0.809, srtt = 0.536, rttvar = 0.290, rto = 2.000\nrecv  265\nupdated rto\nsend  266: rtt = 0.809, srtt = 0.571, rttvar = 0.286, rto = 2.000\nrecv  266\nupdated rto\nsend  267: rtt = 0.819, srtt = 0.602, rttvar = 0.276, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  267: rtt = 0.819, srtt = 0.602, rttvar = 0.276, rto = 4.000\nrecv  267\nupdated rto\nsend  268: rtt = 0.748, srtt = 0.620, rttvar = 0.244, rto = 2.000\nrecv  268\nupdated rto\nsend  269: rtt = 0.819, srtt = 0.645, rttvar = 0.233, rto = 2.000\nrecv  269\nupdated rto\nsend  270: rtt = 0.819, srtt = 0.667, rttvar = 0.218, rto = 2.000\nrecv  270\nupdated rto\nsend  271: rtt = 0.819, srtt = 0.686, rttvar = 0.202, rto = 2.000\nrecv  271\nupdated rto\nsend  272: rtt = 0.799, srtt = 0.700, rttvar = 0.180, rto = 2.000\nrecv  272\nupdated rto\nsend  273: rtt = 1.059, srtt = 0.745, rttvar = 0.224, rto = 2.000\nrecv  273\nupdated rto\nsend  274: rtt = 0.370, srtt = 0.698, rttvar = 0.262, rto = 2.000\nrecv  274\nupdated rto\nsend  275: rtt = 0.370, srtt = 0.657, rttvar = 0.278, rto = 2.000\nrecv  275\nupdated rto\nsend  276: rtt = 0.380, srtt = 0.622, rttvar = 0.278, rto = 2.000\nrecv  276\nupdated rto\nsend  277: rtt = 0.340, srtt = 0.587, rttvar = 0.279, rto = 2.000\nrecv  277\nupdated rto\nsend  278: rtt = 0.400, srtt = 0.564, rttvar = 0.256, rto = 2.000\nrecv  278\nupdated rto\nsend  279: rtt = 0.350, srtt = 0.537, rttvar = 0.245, rto = 2.000\nrecv  279\nupdated rto\nsend  280: rtt = 0.320, srtt = 0.510, rttvar = 0.238, rto = 2.000\nrecv  280\nupdated rto\nsend  281: rtt = 0.390, srtt = 0.495, rttvar = 0.209, rto = 2.000\nrecv  281\nupdated rto\nsend  282: rtt = 0.329, srtt = 0.474, rttvar = 0.198, rto = 2.000\nrecv  282\nupdated rto\nsend  283: rtt = 0.280, srtt = 0.450, rttvar = 0.197, rto = 2.000\nrecv  283\nupdated rto\nsend  284: rtt = 0.330, srtt = 0.435, rttvar = 0.178, rto = 2.000\nrecv  284\nupdated rto\nsend  285: rtt = 0.310, srtt = 0.419, rttvar = 0.164, rto = 2.000\nrecv  285\nupdated rto\nsend  286: rtt = 0.370, srtt = 0.413, rttvar = 0.136, rto = 2.000\nrecv  286\nupdated rto\nsend  287: rtt = 0.379, srtt = 0.409, rttvar = 0.110, rto = 2.000\nrecv  287\nupdated rto\nsend  288: rtt = 0.329, srtt = 0.399, rttvar = 0.103, rto = 2.000\nrecv  288\nupdated rto\nsend  289: rtt = 0.320, srtt = 0.389, rttvar = 0.097, rto = 2.000\nrecv  289\nupdated rto\nsend  290: rtt = 0.410, srtt = 0.392, rttvar = 0.078, rto = 2.000\nrecv  290\nupdated rto\nsend  291: rtt = 0.340, srtt = 0.385, rttvar = 0.071, rto = 2.000\nrecv  291\nupdated rto\nsend  292: rtt = 0.360, srtt = 0.382, rttvar = 0.060, rto = 2.000\nrecv  292\nupdated rto\nsend  293: rtt = 0.349, srtt = 0.378, rttvar = 0.053, rto = 2.000\nrecv  293\nupdated rto\nsend  294: rtt = 0.360, srtt = 0.376, rttvar = 0.044, rto = 2.000\nrecv  294\nupdated rto\nsend  295: rtt = 0.360, srtt = 0.374, rttvar = 0.037, rto = 2.000\nrecv  295\nupdated rto\nsend  296: rtt = 0.329, srtt = 0.368, rttvar = 0.039, rto = 2.000\nrecv  296\nupdated rto\nsend  297: rtt = 0.360, srtt = 0.367, rttvar = 0.031, rto = 2.000\nrecv  297\nupdated rto\nsend  298: rtt = 0.340, srtt = 0.364, rttvar = 0.030, rto = 2.000\nrecv  298\nupdated rto\nsend  299: rtt = 0.359, srtt = 0.363, rttvar = 0.024, rto = 2.000\nrecv  299\nupdated rto\nsend  300: rtt = 0.369, srtt = 0.364, rttvar = 0.019, rto = 2.000\nrecv  300\nupdated rto\nsend  301: rtt = 0.330, srtt = 0.360, rttvar = 0.023, rto = 2.000\nrecv  301\nupdated rto\nsend  302: rtt = 0.320, srtt = 0.355, rttvar = 0.027, rto = 2.000\nrecv  302\nupdated rto\nsend  303: rtt = 0.320, srtt = 0.350, rttvar = 0.029, rto = 2.000\nrecv  303\nupdated rto\nsend  304: rtt = 0.313, srtt = 0.346, rttvar = 0.031, rto = 2.000\nrecv  304\nupdated rto\nsend  305: rtt = 0.337, srtt = 0.345, rttvar = 0.025, rto = 2.000\nrecv  305\nupdated rto\nsend  306: rtt = 0.320, srtt = 0.342, rttvar = 0.025, rto = 2.000\nrecv  306\nupdated rto\nsend  307: rtt = 0.319, srtt = 0.339, rttvar = 0.025, rto = 2.000\nrecv  307\nupdated rto\nsend  308: rtt = 0.680, srtt = 0.381, rttvar = 0.104, rto = 2.000\nrecv  308\nupdated rto\nsend  309: rtt = 0.380, srtt = 0.381, rttvar = 0.078, rto = 2.000\nrecv  309\nupdated rto\nsend  310: rtt = 0.319, srtt = 0.373, rttvar = 0.074, rto = 2.000\nrecv  310\nupdated rto\nsend  311: rtt = 0.330, srtt = 0.368, rttvar = 0.066, rto = 2.000\nrecv  311\nupdated rto\nsend  312: rtt = 0.330, srtt = 0.363, rttvar = 0.059, rto = 2.000\nrecv  312\nupdated rto\nsend  313: rtt = 0.310, srtt = 0.357, rttvar = 0.058, rto = 2.000\nrecv  313\nupdated rto\nsend  314: rtt = 0.300, srtt = 0.350, rttvar = 0.058, rto = 2.000\nrecv  314\nupdated rto\nsend  315: rtt = 0.340, srtt = 0.348, rttvar = 0.046, rto = 2.000\nrecv  315\nupdated rto\nsend  316: rtt = 0.350, srtt = 0.349, rttvar = 0.035, rto = 2.000\nrecv  316\nupdated rto\nsend  317: rtt = 0.350, srtt = 0.349, rttvar = 0.026, rto = 2.000\nrecv  317\nupdated rto\nsend  318: rtt = 0.340, srtt = 0.348, rttvar = 0.022, rto = 2.000\nrecv  318\nupdated rto\nsend  319: rtt = 0.309, srtt = 0.343, rttvar = 0.026, rto = 2.000\nrecv  319\nupdated rto\nsend  320: rtt = 0.343, srtt = 0.343, rttvar = 0.020, rto = 2.000\nrecv  320\nupdated rto\nsend  321: rtt = 0.326, srtt = 0.341, rttvar = 0.019, rto = 2.000\nrecv  321\nupdated rto\nsend  322: rtt = 0.319, srtt = 0.338, rttvar = 0.020, rto = 2.000\nrecv  322\nupdated rto\nsend  323: rtt = 1.178, srtt = 0.443, rttvar = 0.225, rto = 2.000\nrecv  323\nupdated rto\nsend  324: rtt = 0.320, srtt = 0.428, rttvar = 0.199, rto = 2.000\nrecv  324\nupdated rto\nsend  325: rtt = 0.309, srtt = 0.413, rttvar = 0.179, rto = 2.000\nrecv  325\nupdated rto\nsend  326: rtt = 0.330, srtt = 0.402, rttvar = 0.155, rto = 2.000\nrecv  326\nupdated rto\nsend  327: rtt = 0.300, srtt = 0.390, rttvar = 0.142, rto = 2.000\nrecv  327\nupdated rto\nsend  328: rtt = 0.300, srtt = 0.378, rttvar = 0.129, rto = 2.000\nrecv  328\nupdated rto\nsend  329: rtt = 0.310, srtt = 0.370, rttvar = 0.114, rto = 2.000\nrecv  329\nupdated rto\nsend  330: rtt = 0.290, srtt = 0.360, rttvar = 0.105, rto = 2.000\nrecv  330\nupdated rto\nsend  331: rtt = 0.310, srtt = 0.354, rttvar = 0.091, rto = 2.000\nrecv  331\nupdated rto\nsend  332: rtt = 0.300, srtt = 0.347, rttvar = 0.082, rto = 2.000\nrecv  332\nupdated rto\nsend  333: rtt = 0.300, srtt = 0.341, rttvar = 0.073, rto = 2.000\nrecv  333\nupdated rto\nsend  334: rtt = 0.340, srtt = 0.341, rttvar = 0.055, rto = 2.000\nrecv  334\nupdated rto\nsend  335: rtt = 0.339, srtt = 0.341, rttvar = 0.042, rto = 2.000\nrecv  335\nupdated rto\nsend  336: rtt = 0.310, srtt = 0.337, rttvar = 0.039, rto = 2.000\nrecv  336\nupdated rto\nsend  337: rtt = 0.320, srtt = 0.335, rttvar = 0.034, rto = 2.000\nrecv  337\nupdated rto\nsend  338: rtt = 0.330, srtt = 0.334, rttvar = 0.026, rto = 2.000\nrecv  338\nupdated rto\nsend  339: rtt = 0.320, srtt = 0.332, rttvar = 0.023, rto = 2.000\nrecv  339\nupdated rto\nsend  340: rtt = 0.315, srtt = 0.330, rttvar = 0.022, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  340: rtt = 0.315, srtt = 0.330, rttvar = 0.022, rto = 4.000\nrecv  340\nupdated rto\nsend  341: rtt = 0.338, srtt = 0.331, rttvar = 0.018, rto = 2.000\nrecv  341\nupdated rto\nsend  342: rtt = 0.320, srtt = 0.330, rttvar = 0.017, rto = 2.000\nrecv  342\nupdated rto\nsend  343: rtt = 0.309, srtt = 0.327, rttvar = 0.018, rto = 2.000\nrecv  343\nupdated rto\nsend  344: rtt = 0.320, srtt = 0.326, rttvar = 0.015, rto = 2.000\nrecv  344\nupdated rto\nsend  345: rtt = 0.349, srtt = 0.329, rttvar = 0.017, rto = 2.000\nrecv  345\nupdated rto\nsend  346: rtt = 0.339, srtt = 0.330, rttvar = 0.015, rto = 2.000\nrecv  346\nupdated rto\nsend  347: rtt = 0.300, srtt = 0.327, rttvar = 0.019, rto = 2.000\nrecv  347\nupdated rto\nsend  348: rtt = 0.300, srtt = 0.323, rttvar = 0.021, rto = 2.000\nrecv  348\nupdated rto\nsend  349: rtt = 0.289, srtt = 0.319, rttvar = 0.024, rto = 2.000\nrecv  349\nupdated rto\nsend  350: rtt = 0.329, srtt = 0.320, rttvar = 0.021, rto = 2.000\nrecv  350\nupdated rto\nsend  351: rtt = 0.340, srtt = 0.323, rttvar = 0.020, rto = 2.000\nrecv  351\nupdated rto\nsend  352: rtt = 0.329, srtt = 0.323, rttvar = 0.017, rto = 2.000\nrecv  352\nupdated rto\nsend  353: rtt = 0.320, srtt = 0.323, rttvar = 0.014, rto = 2.000\nrecv  353\nupdated rto\nsend  354: rtt = 0.410, srtt = 0.334, rttvar = 0.032, rto = 2.000\nrecv  354\nupdated rto\nsend  355: rtt = 0.300, srtt = 0.330, rttvar = 0.032, rto = 2.000\nrecv  355\nupdated rto\nsend  356: rtt = 0.389, srtt = 0.337, rttvar = 0.039, rto = 2.000\nrecv  356\nupdated rto\nsend  357: rtt = 0.299, srtt = 0.332, rttvar = 0.039, rto = 2.000\nrecv  357\nupdated rto\nsend  358: rtt = 1.280, srtt = 0.451, rttvar = 0.266, rto = 2.000\nrecv  358\nupdated rto\nsend  359: rtt = 0.809, srtt = 0.496, rttvar = 0.289, rto = 2.000\nrecv  359\nupdated rto\nsend  360: rtt = 0.818, srtt = 0.536, rttvar = 0.297, rto = 2.000\nrecv  360\nupdated rto\nsend  361: rtt = 0.819, srtt = 0.571, rttvar = 0.294, rto = 2.000\nrecv  361\nupdated rto\nsend  362: rtt = 0.829, srtt = 0.603, rttvar = 0.285, rto = 2.000\nrecv  362\nupdated rto\nsend  363: rtt = 0.819, srtt = 0.630, rttvar = 0.268, rto = 2.000\nrecv  363\nupdated rto\nsend  364: rtt = 0.809, srtt = 0.653, rttvar = 0.245, rto = 2.000\nrecv  364\nupdated rto\nsend  365: rtt = 0.819, srtt = 0.674, rttvar = 0.226, rto = 2.000\nrecv  365\nupdated rto\nsend  366: rtt = 0.999, srtt = 0.714, rttvar = 0.251, rto = 2.000\nrecv  366\nupdated rto\nsend  367: rtt = 0.999, srtt = 0.750, rttvar = 0.259, rto = 2.000\nrecv  367\nupdated rto\nsend  368: rtt = 1.479, srtt = 0.841, rttvar = 0.377, rto = 2.347\nrecv  368\nupdated rto\nsend  369: rtt = 1.010, srtt = 0.862, rttvar = 0.325, rto = 2.161\nrecv  369\nupdated rto\nsend  370: rtt = 0.998, srtt = 0.879, rttvar = 0.278, rto = 2.000\nrecv  370\nupdated rto\nsend  371: rtt = 0.999, srtt = 0.894, rttvar = 0.238, rto = 2.000\nrecv  371\nupdated rto\nsend  372: rtt = 0.999, srtt = 0.907, rttvar = 0.205, rto = 2.000\nrecv  372\nupdated rto\nsend  373: rtt = 0.999, srtt = 0.919, rttvar = 0.177, rto = 2.000\nrecv  373\nupdated rto\nsend  374: rtt = 0.989, srtt = 0.927, rttvar = 0.150, rto = 2.000\nrecv  374\nupdated rto\nsend  375: rtt = 0.989, srtt = 0.935, rttvar = 0.128, rto = 2.000\nrecv  375\nupdated rto\nsend  376: rtt = 1.009, srtt = 0.944, rttvar = 0.114, rto = 2.000\nrecv  376\nupdated rto\nsend  377: rtt = 0.999, srtt = 0.951, rttvar = 0.099, rto = 2.000\nrecv  377\nupdated rto\nsend  378: rtt = 1.009, srtt = 0.958, rttvar = 0.089, rto = 2.000\nrecv  378\nupdated rto\nsend  379: rtt = 0.939, srtt = 0.956, rttvar = 0.072, rto = 2.000\nrecv  379\nupdated rto\nsend  380: rtt = 0.809, srtt = 0.938, rttvar = 0.090, rto = 2.000\nrecv  380\nupdated rto\nsend  381: rtt = 0.821, srtt = 0.923, rttvar = 0.097, rto = 2.000\nrecv  381\nupdated rto\nsend  382: rtt = 0.827, srtt = 0.911, rttvar = 0.097, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  382: rtt = 0.827, srtt = 0.911, rttvar = 0.097, rto = 4.000\nrecv  382\nupdated rto\nsend  383: rtt = 0.809, srtt = 0.898, rttvar = 0.098, rto = 2.000\nrecv  383\nupdated rto\nsend  384: rtt = 0.839, srtt = 0.891, rttvar = 0.088, rto = 2.000\nrecv  384\nupdated rto\nsend  385: rtt = 0.819, srtt = 0.882, rttvar = 0.084, rto = 2.000\nrecv  385\nupdated rto\nsend  386: rtt = 0.809, srtt = 0.873, rttvar = 0.081, rto = 2.000\nrecv  386\nupdated rto\nsend  387: rtt = 0.819, srtt = 0.866, rttvar = 0.075, rto = 2.000\nrecv  387\nupdated rto\nsend  388: rtt = 0.819, srtt = 0.860, rttvar = 0.068, rto = 2.000\nrecv  388\nupdated rto\nsend  389: rtt = 0.809, srtt = 0.854, rttvar = 0.064, rto = 2.000\nrecv  389\nupdated rto\nsend  390: rtt = 0.811, srtt = 0.848, rttvar = 0.058, rto = 2.000\nrecv  390\nupdated rto\nsend  391: rtt = 0.827, srtt = 0.846, rttvar = 0.049, rto = 2.000\nrecv  391\nupdated rto\nsend  392: rtt = 0.813, srtt = 0.842, rttvar = 0.045, rto = 2.000\nrecv  392\nupdated rto\nsend  393: rtt = 1.205, srtt = 0.887, rttvar = 0.125, rto = 2.000\nrecv  393\nupdated rto\nsend  394: rtt = 0.829, srtt = 0.880, rttvar = 0.108, rto = 2.000\nrecv  394\nupdated rto\nsend  395: rtt = 0.819, srtt = 0.872, rttvar = 0.096, rto = 2.000\nrecv  395\nupdated rto\nsend  396: rtt = 0.819, srtt = 0.866, rttvar = 0.085, rto = 2.000\nrecv  396\nupdated rto\nsend  397: rtt = 0.819, srtt = 0.860, rttvar = 0.076, rto = 2.000\nrecv  397\nupdated rto\nsend  398: rtt = 0.819, srtt = 0.855, rttvar = 0.067, rto = 2.000\nrecv  398\nupdated rto\nsend  399: rtt = 0.819, srtt = 0.850, rttvar = 0.059, rto = 2.000\nrecv  399\nupdated rto\nsend  400: rtt = 0.819, srtt = 0.846, rttvar = 0.052, rto = 2.000\nrecv  400\nupdated rto\nsend  401: rtt = 0.829, srtt = 0.844, rttvar = 0.043, rto = 2.000\nrecv  401\nupdated rto\nsend  402: rtt = 0.819, srtt = 0.841, rttvar = 0.039, rto = 2.000\nrecv  402\nupdated rto\nsend  403: rtt = 0.809, srtt = 0.837, rttvar = 0.037, rto = 2.000\nrecv  403\nupdated rto\nsend  404: rtt = 0.819, srtt = 0.835, rttvar = 0.032, rto = 2.000\nrecv  404\nupdated rto\nsend  405: rtt = 0.809, srtt = 0.832, rttvar = 0.031, rto = 2.000\nrecv  405\nupdated rto\nsend  406: rtt = 0.819, srtt = 0.830, rttvar = 0.026, rto = 2.000\nrecv  406\nupdated rto\nsend  407: rtt = 0.819, srtt = 0.829, rttvar = 0.022, rto = 2.000\nrecv  407\nupdated rto\nsend  408: rtt = 0.799, srtt = 0.825, rttvar = 0.024, rto = 2.000\nrecv  408\nupdated rto\nsend  409: rtt = 0.819, srtt = 0.824, rttvar = 0.020, rto = 2.000\nrecv  409\nupdated rto\nsend  410: rtt = 0.819, srtt = 0.824, rttvar = 0.016, rto = 2.000\nrecv  410\nupdated rto\nsend  411: rtt = 0.829, srtt = 0.824, rttvar = 0.013, rto = 2.000\nrecv  411\nupdated rto\nsend  412: rtt = 0.820, srtt = 0.824, rttvar = 0.011, rto = 2.000\nrecv  412\nupdated rto\nsend  413: rtt = 0.809, srtt = 0.822, rttvar = 0.012, rto = 2.000\nrecv  413\nupdated rto\nsend  414: rtt = 0.819, srtt = 0.821, rttvar = 0.010, rto = 2.000\nrecv  414\nupdated rto\nsend  415: rtt = 1.209, srtt = 0.870, rttvar = 0.104, rto = 2.000\nrecv  415\nupdated rto\nsend  416: rtt = 0.809, srtt = 0.862, rttvar = 0.093, rto = 2.000\nrecv  416\nupdated rto\nsend  417: rtt = 0.824, srtt = 0.858, rttvar = 0.080, rto = 2.000\nrecv  417\nupdated rto\nsend  418: rtt = 0.814, srtt = 0.852, rttvar = 0.071, rto = 2.000\nrecv  418\nupdated rto\nsend  419: rtt = 0.809, srtt = 0.847, rttvar = 0.064, rto = 2.000\nrecv  419\nupdated rto\nsend  420: rtt = 0.819, srtt = 0.843, rttvar = 0.055, rto = 2.000\nrecv  420\nupdated rto\nsend  421: rtt = 0.819, srtt = 0.840, rttvar = 0.047, rto = 2.000\nrecv  421\nupdated rto\nsend  422: rtt = 0.809, srtt = 0.836, rttvar = 0.043, rto = 2.000\nrecv  422\nupdated rto\nsend  423: rtt = 0.819, srtt = 0.834, rttvar = 0.037, rto = 2.000\nrecv  423\nupdated rto\nsend  424: rtt = 0.821, srtt = 0.832, rttvar = 0.031, rto = 2.000\nrecv  424\nupdated rto\nsend  425: rtt = 0.808, srtt = 0.829, rttvar = 0.029, rto = 2.000\nrecv  425\nupdated rto\nsend  426: rtt = 0.819, srtt = 0.828, rttvar = 0.025, rto = 2.000\nrecv  426\nupdated rto\nsend  427: rtt = 0.819, srtt = 0.827, rttvar = 0.021, rto = 2.000\nrecv  427\nupdated rto\nsend  428: rtt = 0.819, srtt = 0.826, rttvar = 0.017, rto = 2.000\nrecv  428\nupdated rto\nsend  429: rtt = 0.819, srtt = 0.825, rttvar = 0.015, rto = 2.000\nrecv  429\nupdated rto\nsend  430: rtt = 0.819, srtt = 0.824, rttvar = 0.013, rto = 2.000\nrecv  430\nupdated rto\nsend  431: rtt = 0.819, srtt = 0.824, rttvar = 0.011, rto = 2.000\nrecv  431\nupdated rto\nsend  432: rtt = 0.609, srtt = 0.797, rttvar = 0.062, rto = 2.000\nrecv  432\nupdated rto\nsend  433: rtt = 0.309, srtt = 0.736, rttvar = 0.168, rto = 2.000\nrecv  433\nupdated rto\nsend  434: rtt = 0.330, srtt = 0.685, rttvar = 0.228, rto = 2.000\nrecv  434\nupdated rto\nsend  435: rtt = 0.300, srtt = 0.637, rttvar = 0.267, rto = 2.000\nrecv  435\nupdated rto\nsend  436: rtt = 0.319, srtt = 0.597, rttvar = 0.280, rto = 2.000\nrecv  436\nupdated rto\nsend  437: rtt = 0.310, srtt = 0.561, rttvar = 0.282, rto = 2.000\nrecv  437\nupdated rto\nsend  438: rtt = 0.320, srtt = 0.531, rttvar = 0.272, rto = 2.000\nrecv  438\nupdated rto\nsend  439: rtt = 0.350, srtt = 0.509, rttvar = 0.249, rto = 2.000\nrecv  439\nupdated rto\nsend  440: rtt = 0.290, srtt = 0.481, rttvar = 0.241, rto = 2.000\nrecv  440\nupdated rto\nsend  441: rtt = 0.290, srtt = 0.457, rttvar = 0.229, rto = 2.000\nrecv  441\nupdated rto\nsend  442: rtt = 0.300, srtt = 0.438, rttvar = 0.211, rto = 2.000\nrecv  442\nupdated rto\nsend  443: rtt = 0.360, srtt = 0.428, rttvar = 0.178, rto = 2.000\nrecv  443\nupdated rto\nsend  444: rtt = 0.310, srtt = 0.413, rttvar = 0.163, rto = 2.000\nrecv  444\nupdated rto\nsend  445: rtt = 0.360, srtt = 0.407, rttvar = 0.135, rto = 2.000\nrecv  445\nupdated rto\nsend  446: rtt = 0.319, srtt = 0.396, rttvar = 0.123, rto = 2.000\nrecv  446\nupdated rto\nsend  447: rtt = 0.320, srtt = 0.386, rttvar = 0.111, rto = 2.000\nrecv  447\nupdated rto\nsend  448: rtt = 0.330, srtt = 0.379, rttvar = 0.098, rto = 2.000\nrecv  448\nupdated rto\nsend  449: rtt = 0.329, srtt = 0.373, rttvar = 0.086, rto = 2.000\nrecv  449\nupdated rto\nsend  450: rtt = 0.370, srtt = 0.373, rttvar = 0.065, rto = 2.000\nrecv  450\nupdated rto\nsend  451: rtt = 0.340, srtt = 0.368, rttvar = 0.057, rto = 2.000\nrecv  451\nupdated rto\nsend  452: rtt = 0.340, srtt = 0.365, rttvar = 0.050, rto = 2.000\nrecv  452\nupdated rto\nsend  453: rtt = 0.719, srtt = 0.409, rttvar = 0.126, rto = 2.000\nrecv  453\nupdated rto\nsend  454: rtt = 0.339, srtt = 0.400, rttvar = 0.112, rto = 2.000\nrecv  454\nupdated rto\nsend  455: rtt = 0.320, srtt = 0.390, rttvar = 0.104, rto = 2.000\nrecv  455\nupdated rto\nsend  456: rtt = 0.310, srtt = 0.380, rttvar = 0.098, rto = 2.000\nrecv  456\nupdated rto\nsend  457: rtt = 0.320, srtt = 0.373, rttvar = 0.089, rto = 2.000\nrecv  457\nupdated rto\nsend  458: rtt = 0.330, srtt = 0.367, rttvar = 0.077, rto = 2.000\nrecv  458\nupdated rto\nsend  459: rtt = 0.313, srtt = 0.361, rttvar = 0.071, rto = 2.000\nrecv  459\nupdated rto\nsend  460: rtt = 0.377, srtt = 0.363, rttvar = 0.058, rto = 2.000\nrecv  460\nupdated rto\nsend  461: rtt = 0.440, srtt = 0.372, rttvar = 0.063, rto = 2.000\nrecv  461\nupdated rto\nsend  462: rtt = 0.340, srtt = 0.368, rttvar = 0.055, rto = 2.000\nrecv  462\nupdated rto\nsend  463: rtt = 0.330, srtt = 0.364, rttvar = 0.051, rto = 2.000\nrecv  463\nupdated rto\nsend  464: rtt = 0.360, srtt = 0.363, rttvar = 0.039, rto = 2.000\nrecv  464\nupdated rto\nsend  465: rtt = 0.380, srtt = 0.365, rttvar = 0.033, rto = 2.000\nrecv  465\nupdated rto\nsend  466: rtt = 0.320, srtt = 0.360, rttvar = 0.036, rto = 2.000\nrecv  466\nupdated rto\nsend  467: rtt = 0.309, srtt = 0.353, rttvar = 0.040, rto = 2.000\nrecv  467\nupdated rto\nsend  468: rtt = 0.360, srtt = 0.354, rttvar = 0.032, rto = 2.000\nrecv  468\nupdated rto\nsend  469: rtt = 0.330, srtt = 0.351, rttvar = 0.030, rto = 2.000\nrecv  469\nupdated rto\nsend  470: rtt = 0.290, srtt = 0.343, rttvar = 0.038, rto = 2.000\nrecv  470\nupdated rto\nsend  471: rtt = 0.329, srtt = 0.342, rttvar = 0.032, rto = 2.000\nrecv  471\nupdated rto\nsend  472: rtt = 0.319, srtt = 0.339, rttvar = 0.030, rto = 2.000\nrecv  472\nupdated rto\nsend  473: rtt = 0.320, srtt = 0.336, rttvar = 0.027, rto = 2.000\nrecv  473\nupdated rto\nsend  474: rtt = 0.349, srtt = 0.338, rttvar = 0.023, rto = 2.000\nrecv  474\nupdated rto\nsend  475: rtt = 0.330, srtt = 0.337, rttvar = 0.019, rto = 2.000\nrecv  475\nupdated rto\nsend  476: rtt = 0.360, srtt = 0.340, rttvar = 0.020, rto = 2.000\nrecv  476\nupdated rto\nsend  477: rtt = 0.310, srtt = 0.336, rttvar = 0.023, rto = 2.000\nrecv  477\nupdated rto\nsend  478: rtt = 0.320, srtt = 0.334, rttvar = 0.021, rto = 2.000\nrecv  478\nupdated rto\nsend  479: rtt = 0.320, srtt = 0.332, rttvar = 0.019, rto = 2.000\nrecv  479\nupdated rto\nsend  480: rtt = 0.410, srtt = 0.342, rttvar = 0.034, rto = 2.000\nrecv  480\nupdated rto\nsend  481: rtt = 0.340, srtt = 0.342, rttvar = 0.026, rto = 2.000\nrecv  481\nupdated rto\nsend  482: rtt = 0.409, srtt = 0.350, rttvar = 0.036, rto = 2.000\nrecv  482\nupdated rto\nsend  483: rtt = 0.330, srtt = 0.348, rttvar = 0.032, rto = 2.000\nrecv  483\nupdated rto\nsend  484: rtt = 0.280, srtt = 0.339, rttvar = 0.041, rto = 2.000\nrecv  484\nupdated rto\nsend  485: rtt = 0.320, srtt = 0.337, rttvar = 0.036, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  485: rtt = 0.320, srtt = 0.337, rttvar = 0.036, rto = 4.000\nrecv  485\nupdated rto\nsend  486: rtt = 0.339, srtt = 0.337, rttvar = 0.027, rto = 2.000\nrecv  486\nupdated rto\nsend  487: rtt = 0.360, srtt = 0.340, rttvar = 0.026, rto = 2.000\nrecv  487\nupdated rto\nsend  488: rtt = 0.300, srtt = 0.335, rttvar = 0.030, rto = 2.000\nrecv  488\nupdated rto\nsend  489: rtt = 0.320, srtt = 0.333, rttvar = 0.026, rto = 2.000\nrecv  489\nupdated rto\nsend  490: rtt = 0.410, srtt = 0.343, rttvar = 0.039, rto = 2.000\nrecv  490\nupdated rto\nsend  491: rtt = 0.320, srtt = 0.340, rttvar = 0.035, rto = 2.000\nrecv  491\nupdated rto\nsend  492: rtt = 0.320, srtt = 0.337, rttvar = 0.031, rto = 2.000\nrecv  492\nupdated rto\nsend  493: rtt = 0.319, srtt = 0.335, rttvar = 0.028, rto = 2.000\nrecv  493\nupdated rto\nsend  494: rtt = 0.330, srtt = 0.334, rttvar = 0.022, rto = 2.000\nrecv  494\nupdated rto\nsend  495: rtt = 0.320, srtt = 0.333, rttvar = 0.020, rto = 2.000\nrecv  495\nupdated rto\nsend  496: rtt = 0.314, srtt = 0.330, rttvar = 0.020, rto = 2.000\nrecv  496\nupdated rto\nsend  497: rtt = 0.325, srtt = 0.330, rttvar = 0.016, rto = 2.000\nrecv  497\nupdated rto\nsend  498: rtt = 0.330, srtt = 0.330, rttvar = 0.012, rto = 2.000\nrecv  498\nupdated rto\nsend  499: rtt = 0.290, srtt = 0.325, rttvar = 0.019, rto = 2.000\nrecv  499\nupdated rto\nsend  500: rtt = 0.340, srtt = 0.327, rttvar = 0.018, rto = 2.000\nrecv  500\nupdated rto\n"
  },
  {
    "path": "rtt/rtt.out.kumba.2",
    "content": "send    1: rtt = 0.000, srtt = 0.000, rttvar = 0.750, rto = 3.000\nrecv    1\nupdated rto\nsend    2: rtt = 0.369, srtt = 0.046, rttvar = 0.655, rto = 2.665\nrecv    2\nupdated rto\nsend    3: rtt = 0.318, srtt = 0.080, rttvar = 0.559, rto = 2.316\nrecv    3\nupdated rto\nsend    4: rtt = 0.300, srtt = 0.108, rttvar = 0.474, rto = 2.005\nrecv    4\nupdated rto\nsend    5: rtt = 0.360, srtt = 0.139, rttvar = 0.419, rto = 2.000\nrecv    5\nupdated rto\nsend    6: rtt = 0.298, srtt = 0.159, rttvar = 0.354, rto = 2.000\nrecv    6\nupdated rto\nsend    7: rtt = 0.300, srtt = 0.177, rttvar = 0.301, rto = 2.000\nrecv    7\nupdated rto\nsend    8: rtt = 0.315, srtt = 0.194, rttvar = 0.260, rto = 2.000\nrecv    8\nupdated rto\nsend    9: rtt = 0.285, srtt = 0.205, rttvar = 0.218, rto = 2.000\nrecv    9\nupdated rto\nsend   10: rtt = 0.349, srtt = 0.223, rttvar = 0.199, rto = 2.000\nrecv   10\nupdated rto\nsend   11: rtt = 0.309, srtt = 0.234, rttvar = 0.171, rto = 2.000\nrecv   11\nupdated rto\nsend   12: rtt = 0.330, srtt = 0.246, rttvar = 0.152, rto = 2.000\nrecv   12\nupdated rto\nsend   13: rtt = 0.350, srtt = 0.259, rttvar = 0.140, rto = 2.000\nrecv   13\nupdated rto\nsend   14: rtt = 0.320, srtt = 0.267, rttvar = 0.120, rto = 2.000\nrecv   14\nupdated rto\nsend   15: rtt = 0.320, srtt = 0.273, rttvar = 0.104, rto = 2.000\nrecv   15\nupdated rto\nsend   16: rtt = 0.340, srtt = 0.282, rttvar = 0.094, rto = 2.000\nrecv   16\nupdated rto\nsend   17: rtt = 0.439, srtt = 0.301, rttvar = 0.110, rto = 2.000\nrecv   17\nupdated rto\nsend   18: rtt = 0.340, srtt = 0.306, rttvar = 0.092, rto = 2.000\nrecv   18\nupdated rto\nsend   19: rtt = 0.350, srtt = 0.312, rttvar = 0.080, rto = 2.000\nrecv   19\nupdated rto\nsend   20: rtt = 0.300, srtt = 0.310, rttvar = 0.063, rto = 2.000\nrecv   20\nupdated rto\nsend   21: rtt = 0.320, srtt = 0.311, rttvar = 0.050, rto = 2.000\nrecv   21\nupdated rto\nsend   22: rtt = 0.319, srtt = 0.312, rttvar = 0.039, rto = 2.000\nrecv   22\nupdated rto\nsend   23: rtt = 0.349, srtt = 0.317, rttvar = 0.039, rto = 2.000\nrecv   23\nupdated rto\nsend   24: rtt = 0.320, srtt = 0.317, rttvar = 0.030, rto = 2.000\nrecv   24\nupdated rto\nsend   25: rtt = 0.330, srtt = 0.319, rttvar = 0.025, rto = 2.000\nrecv   25\nupdated rto\nsend   26: rtt = 0.299, srtt = 0.316, rttvar = 0.024, rto = 2.000\nrecv   26\nupdated rto\nsend   27: rtt = 0.310, srtt = 0.316, rttvar = 0.020, rto = 2.000\nrecv   27\nupdated rto\nsend   28: rtt = 0.320, srtt = 0.316, rttvar = 0.016, rto = 2.000\nrecv   28\nupdated rto\nsend   29: rtt = 0.320, srtt = 0.317, rttvar = 0.013, rto = 2.000\nrecv   29\nupdated rto\nsend   30: rtt = 0.329, srtt = 0.318, rttvar = 0.013, rto = 2.000\nrecv   30\nupdated rto\nsend   31: rtt = 0.340, srtt = 0.321, rttvar = 0.015, rto = 2.000\nrecv   31\nupdated rto\nsend   32: rtt = 0.320, srtt = 0.321, rttvar = 0.011, rto = 2.000\nrecv   32\nupdated rto\nsend   33: rtt = 0.320, srtt = 0.321, rttvar = 0.009, rto = 2.000\nrecv   33\nupdated rto\nsend   34: rtt = 0.310, srtt = 0.319, rttvar = 0.009, rto = 2.000\nrecv   34\nupdated rto\nsend   35: rtt = 0.300, srtt = 0.317, rttvar = 0.012, rto = 2.000\nrecv   35\nupdated rto\nsend   36: rtt = 0.330, srtt = 0.319, rttvar = 0.012, rto = 2.000\nrecv   36\nupdated rto\nsend   37: rtt = 0.429, srtt = 0.332, rttvar = 0.037, rto = 2.000\nrecv   37\nupdated rto\nsend   38: rtt = 0.330, srtt = 0.332, rttvar = 0.028, rto = 2.000\nrecv   38\nupdated rto\nsend   39: rtt = 0.310, srtt = 0.329, rttvar = 0.027, rto = 2.000\nrecv   39\nupdated rto\nsend   40: rtt = 0.310, srtt = 0.327, rttvar = 0.025, rto = 2.000\nrecv   40\nupdated rto\nsend   41: rtt = 0.390, srtt = 0.335, rttvar = 0.034, rto = 2.000\nrecv   41\nupdated rto\nsend   42: rtt = 0.319, srtt = 0.333, rttvar = 0.030, rto = 2.000\nrecv   42\nupdated rto\nsend   43: rtt = 0.300, srtt = 0.329, rttvar = 0.030, rto = 2.000\nrecv   43\nupdated rto\nsend   44: rtt = 0.270, srtt = 0.321, rttvar = 0.038, rto = 2.000\nrecv   44\nupdated rto\nsend   45: rtt = 0.370, srtt = 0.327, rttvar = 0.040, rto = 2.000\nrecv   45\nupdated rto\nsend   46: rtt = 0.329, srtt = 0.328, rttvar = 0.031, rto = 2.000\nrecv   46\nupdated rto\nsend   47: rtt = 0.329, srtt = 0.328, rttvar = 0.023, rto = 2.000\nrecv   47\nupdated rto\nsend   48: rtt = 0.320, srtt = 0.327, rttvar = 0.019, rto = 2.000\nrecv   48\nupdated rto\nsend   49: rtt = 0.330, srtt = 0.327, rttvar = 0.015, rto = 2.000\nrecv   49\nupdated rto\nsend   50: rtt = 0.319, srtt = 0.326, rttvar = 0.014, rto = 2.000\nrecv   50\nupdated rto\nsend   51: rtt = 0.320, srtt = 0.325, rttvar = 0.012, rto = 2.000\nrecv   51\nupdated rto\nsend   52: rtt = 0.300, srtt = 0.322, rttvar = 0.015, rto = 2.000\nrecv   52\nupdated rto\nsend   53: rtt = 0.340, srtt = 0.324, rttvar = 0.016, rto = 2.000\nrecv   53\nupdated rto\nsend   54: rtt = 0.330, srtt = 0.325, rttvar = 0.013, rto = 2.000\nrecv   54\nupdated rto\nsend   55: rtt = 0.339, srtt = 0.327, rttvar = 0.013, rto = 2.000\nrecv   55\nupdated rto\nsend   56: rtt = 0.340, srtt = 0.329, rttvar = 0.013, rto = 2.000\nrecv   56\nupdated rto\nsend   57: rtt = 0.359, srtt = 0.332, rttvar = 0.018, rto = 2.000\nrecv   57\nupdated rto\nsend   58: rtt = 0.309, srtt = 0.329, rttvar = 0.019, rto = 2.000\nrecv   58\nupdated rto\nsend   59: rtt = 0.340, srtt = 0.331, rttvar = 0.017, rto = 2.000\nrecv   59\nupdated rto\nsend   60: rtt = 0.300, srtt = 0.327, rttvar = 0.020, rto = 2.000\nrecv   60\nupdated rto\nsend   61: rtt = 0.300, srtt = 0.324, rttvar = 0.022, rto = 2.000\nrecv   61\nupdated rto\nsend   62: rtt = 0.330, srtt = 0.324, rttvar = 0.018, rto = 2.000\nrecv   62\nupdated rto\nsend   63: rtt = 0.329, srtt = 0.325, rttvar = 0.015, rto = 2.000\nrecv   63\nupdated rto\nsend   64: rtt = 0.290, srtt = 0.321, rttvar = 0.020, rto = 2.000\nrecv   64\nupdated rto\nsend   65: rtt = 0.300, srtt = 0.318, rttvar = 0.020, rto = 2.000\nrecv   65\nupdated rto\nsend   66: rtt = 0.290, srtt = 0.314, rttvar = 0.022, rto = 2.000\nrecv   66\nupdated rto\nsend   67: rtt = 0.350, srtt = 0.319, rttvar = 0.025, rto = 2.000\nrecv   67\nupdated rto\nsend   68: rtt = 0.320, srtt = 0.319, rttvar = 0.019, rto = 2.000\nrecv   68\nupdated rto\nsend   69: rtt = 0.340, srtt = 0.322, rttvar = 0.020, rto = 2.000\nrecv   69\nupdated rto\nsend   70: rtt = 0.299, srtt = 0.319, rttvar = 0.020, rto = 2.000\nrecv   70\nupdated rto\nsend   71: rtt = 0.320, srtt = 0.319, rttvar = 0.016, rto = 2.000\nrecv   71\nupdated rto\nsend   72: rtt = 0.359, srtt = 0.324, rttvar = 0.022, rto = 2.000\nrecv   72\nupdated rto\nsend   73: rtt = 0.330, srtt = 0.325, rttvar = 0.018, rto = 2.000\nrecv   73\nupdated rto\nsend   74: rtt = 0.300, srtt = 0.322, rttvar = 0.020, rto = 2.000\nrecv   74\nupdated rto\nsend   75: rtt = 0.370, srtt = 0.328, rttvar = 0.027, rto = 2.000\nrecv   75\nupdated rto\nsend   76: rtt = 0.300, srtt = 0.324, rttvar = 0.027, rto = 2.000\nrecv   76\nupdated rto\nsend   77: rtt = 0.330, srtt = 0.325, rttvar = 0.022, rto = 2.000\nrecv   77\nupdated rto\nsend   78: rtt = 0.270, srtt = 0.318, rttvar = 0.030, rto = 2.000\nrecv   78\nupdated rto\nsend   79: rtt = 0.350, srtt = 0.322, rttvar = 0.030, rto = 2.000\nrecv   79\nupdated rto\nsend   80: rtt = 0.329, srtt = 0.323, rttvar = 0.025, rto = 2.000\nrecv   80\nupdated rto\nsend   81: rtt = 0.320, srtt = 0.323, rttvar = 0.019, rto = 2.000\nrecv   81\nupdated rto\nsend   82: rtt = 0.329, srtt = 0.323, rttvar = 0.016, rto = 2.000\nrecv   82\nupdated rto\nsend   83: rtt = 0.330, srtt = 0.324, rttvar = 0.014, rto = 2.000\nrecv   83\nupdated rto\nsend   84: rtt = 0.309, srtt = 0.322, rttvar = 0.014, rto = 2.000\nrecv   84\nupdated rto\nsend   85: rtt = 0.350, srtt = 0.326, rttvar = 0.017, rto = 2.000\nrecv   85\nupdated rto\nsend   86: rtt = 0.350, srtt = 0.329, rttvar = 0.019, rto = 2.000\nrecv   86\nupdated rto\nsend   87: rtt = 0.330, srtt = 0.329, rttvar = 0.015, rto = 2.000\nrecv   87\nupdated rto\nsend   88: rtt = 0.310, srtt = 0.327, rttvar = 0.016, rto = 2.000\nrecv   88\nupdated rto\nsend   89: rtt = 0.330, srtt = 0.327, rttvar = 0.013, rto = 2.000\nrecv   89\nupdated rto\nsend   90: rtt = 0.350, srtt = 0.330, rttvar = 0.015, rto = 2.000\nrecv   90\nupdated rto\nsend   91: rtt = 0.300, srtt = 0.326, rttvar = 0.019, rto = 2.000\nrecv   91\nupdated rto\nsend   92: rtt = 0.310, srtt = 0.324, rttvar = 0.018, rto = 2.000\nrecv   92\nupdated rto\nsend   93: rtt = 0.290, srtt = 0.320, rttvar = 0.022, rto = 2.000\nrecv   93\nupdated rto\nsend   94: rtt = 0.319, srtt = 0.320, rttvar = 0.017, rto = 2.000\nrecv   94\nupdated rto\nsend   95: rtt = 0.319, srtt = 0.320, rttvar = 0.013, rto = 2.000\nrecv   95\nupdated rto\nsend   96: rtt = 0.330, srtt = 0.321, rttvar = 0.012, rto = 2.000\nrecv   96\nupdated rto\nsend   97: rtt = 0.310, srtt = 0.320, rttvar = 0.012, rto = 2.000\nrecv   97\nupdated rto\nsend   98: rtt = 0.289, srtt = 0.316, rttvar = 0.017, rto = 2.000\nrecv   98\nupdated rto\nsend   99: rtt = 0.310, srtt = 0.315, rttvar = 0.014, rto = 2.000\nrecv   99\nupdated rto\nsend  100: rtt = 0.340, srtt = 0.318, rttvar = 0.017, rto = 2.000\nrecv  100\nupdated rto\nsend  101: rtt = 0.340, srtt = 0.321, rttvar = 0.018, rto = 2.000\nrecv  101\nupdated rto\nsend  102: rtt = 0.320, srtt = 0.321, rttvar = 0.014, rto = 2.000\nrecv  102\nupdated rto\nsend  103: rtt = 0.310, srtt = 0.319, rttvar = 0.013, rto = 2.000\nrecv  103\nupdated rto\nsend  104: rtt = 0.430, srtt = 0.333, rttvar = 0.037, rto = 2.000\nrecv  104\nupdated rto\nsend  105: rtt = 0.329, srtt = 0.333, rttvar = 0.029, rto = 2.000\nrecv  105\nupdated rto\nsend  106: rtt = 0.330, srtt = 0.332, rttvar = 0.022, rto = 2.000\nrecv  106\nupdated rto\nsend  107: rtt = 0.430, srtt = 0.345, rttvar = 0.041, rto = 2.000\nrecv  107\nupdated rto\nsend  108: rtt = 0.350, srtt = 0.345, rttvar = 0.032, rto = 2.000\nrecv  108\nupdated rto\nsend  109: rtt = 0.339, srtt = 0.344, rttvar = 0.026, rto = 2.000\nrecv  109\nupdated rto\nsend  110: rtt = 0.350, srtt = 0.345, rttvar = 0.021, rto = 2.000\nrecv  110\nupdated rto\nsend  111: rtt = 0.370, srtt = 0.348, rttvar = 0.022, rto = 2.000\nrecv  111\nupdated rto\nsend  112: rtt = 0.329, srtt = 0.346, rttvar = 0.021, rto = 2.000\nrecv  112\nupdated rto\nsend  113: rtt = 0.340, srtt = 0.345, rttvar = 0.017, rto = 2.000\nrecv  113\nupdated rto\nsend  114: rtt = 0.330, srtt = 0.343, rttvar = 0.017, rto = 2.000\nrecv  114\nupdated rto\nsend  115: rtt = 0.290, srtt = 0.337, rttvar = 0.026, rto = 2.000\nrecv  115\nupdated rto\nsend  116: rtt = 0.329, srtt = 0.336, rttvar = 0.021, rto = 2.000\nrecv  116\nupdated rto\nsend  117: rtt = 0.300, srtt = 0.331, rttvar = 0.025, rto = 2.000\nrecv  117\nupdated rto\nsend  118: rtt = 0.339, srtt = 0.332, rttvar = 0.021, rto = 2.000\nrecv  118\nupdated rto\nsend  119: rtt = 0.350, srtt = 0.334, rttvar = 0.020, rto = 2.000\nrecv  119\nupdated rto\nsend  120: rtt = 0.330, srtt = 0.334, rttvar = 0.016, rto = 2.000\nrecv  120\nupdated rto\nsend  121: rtt = 0.329, srtt = 0.333, rttvar = 0.013, rto = 2.000\nrecv  121\nupdated rto\nsend  122: rtt = 0.310, srtt = 0.330, rttvar = 0.016, rto = 2.000\nrecv  122\nupdated rto\nsend  123: rtt = 0.320, srtt = 0.329, rttvar = 0.014, rto = 2.000\nrecv  123\nupdated rto\nsend  124: rtt = 0.289, srtt = 0.324, rttvar = 0.021, rto = 2.000\nrecv  124\nupdated rto\nsend  125: rtt = 0.320, srtt = 0.324, rttvar = 0.017, rto = 2.000\nrecv  125\nupdated rto\nsend  126: rtt = 0.300, srtt = 0.321, rttvar = 0.018, rto = 2.000\nrecv  126\nupdated rto\nsend  127: rtt = 0.336, srtt = 0.323, rttvar = 0.018, rto = 2.000\nrecv  127\nupdated rto\nsend  128: rtt = 0.334, srtt = 0.324, rttvar = 0.016, rto = 2.000\nrecv  128\nupdated rto\nsend  129: rtt = 0.290, srtt = 0.320, rttvar = 0.021, rto = 2.000\nrecv  129\nupdated rto\nsend  130: rtt = 0.319, srtt = 0.320, rttvar = 0.016, rto = 2.000\nrecv  130\nupdated rto\nsend  131: rtt = 0.410, srtt = 0.331, rttvar = 0.034, rto = 2.000\nrecv  131\nupdated rto\nsend  132: rtt = 0.320, srtt = 0.330, rttvar = 0.028, rto = 2.000\nrecv  132\nupdated rto\nsend  133: rtt = 0.349, srtt = 0.332, rttvar = 0.026, rto = 2.000\nrecv  133\nupdated rto\nsend  134: rtt = 0.370, srtt = 0.337, rttvar = 0.029, rto = 2.000\nrecv  134\nupdated rto\nsend  135: rtt = 0.359, srtt = 0.340, rttvar = 0.027, rto = 2.000\nrecv  135\nupdated rto\nsend  136: rtt = 0.320, srtt = 0.337, rttvar = 0.025, rto = 2.000\nrecv  136\nupdated rto\nsend  137: rtt = 0.290, srtt = 0.331, rttvar = 0.031, rto = 2.000\nrecv  137\nupdated rto\nsend  138: rtt = 0.330, srtt = 0.331, rttvar = 0.023, rto = 2.000\nrecv  138\nupdated rto\nsend  139: rtt = 0.330, srtt = 0.331, rttvar = 0.018, rto = 2.000\nrecv  139\nupdated rto\nsend  140: rtt = 0.310, srtt = 0.328, rttvar = 0.019, rto = 2.000\nrecv  140\nupdated rto\nsend  141: rtt = 0.320, srtt = 0.327, rttvar = 0.016, rto = 2.000\nrecv  141\nupdated rto\nsend  142: rtt = 0.289, srtt = 0.322, rttvar = 0.022, rto = 2.000\nrecv  142\nupdated rto\nsend  143: rtt = 0.299, srtt = 0.320, rttvar = 0.022, rto = 2.000\nrecv  143\nupdated rto\nsend  144: rtt = 0.329, srtt = 0.321, rttvar = 0.019, rto = 2.000\nrecv  144\nupdated rto\nsend  145: rtt = 0.310, srtt = 0.319, rttvar = 0.017, rto = 2.000\nrecv  145\nupdated rto\nsend  146: rtt = 0.290, srtt = 0.316, rttvar = 0.020, rto = 2.000\nrecv  146\nupdated rto\nsend  147: rtt = 0.310, srtt = 0.315, rttvar = 0.016, rto = 2.000\nrecv  147\nupdated rto\nsend  148: rtt = 0.310, srtt = 0.314, rttvar = 0.014, rto = 2.000\nrecv  148\nupdated rto\nsend  149: rtt = 0.319, srtt = 0.315, rttvar = 0.011, rto = 2.000\nrecv  149\nupdated rto\nsend  150: rtt = 0.339, srtt = 0.318, rttvar = 0.015, rto = 2.000\nrecv  150\nupdated rto\nsend  151: rtt = 0.309, srtt = 0.317, rttvar = 0.013, rto = 2.000\nrecv  151\nupdated rto\nsend  152: rtt = 0.299, srtt = 0.315, rttvar = 0.014, rto = 2.000\nrecv  152\nupdated rto\nsend  153: rtt = 0.410, srtt = 0.327, rttvar = 0.035, rto = 2.000\nrecv  153\nupdated rto\nsend  154: rtt = 0.340, srtt = 0.328, rttvar = 0.029, rto = 2.000\nrecv  154\nupdated rto\nsend  155: rtt = 0.330, srtt = 0.328, rttvar = 0.022, rto = 2.000\nrecv  155\nupdated rto\nsend  156: rtt = 0.369, srtt = 0.334, rttvar = 0.027, rto = 2.000\nrecv  156\nupdated rto\nsend  157: rtt = 0.320, srtt = 0.332, rttvar = 0.024, rto = 2.000\nrecv  157\nupdated rto\nsend  158: rtt = 0.350, srtt = 0.334, rttvar = 0.022, rto = 2.000\nrecv  158\nupdated rto\nsend  159: rtt = 0.360, srtt = 0.337, rttvar = 0.023, rto = 2.000\nrecv  159\nupdated rto\nsend  160: rtt = 0.290, srtt = 0.331, rttvar = 0.029, rto = 2.000\nrecv  160\nupdated rto\nsend  161: rtt = 0.360, srtt = 0.335, rttvar = 0.029, rto = 2.000\nrecv  161\nupdated rto\nsend  162: rtt = 0.310, srtt = 0.332, rttvar = 0.028, rto = 2.000\nrecv  162\nupdated rto\nsend  163: rtt = 0.309, srtt = 0.329, rttvar = 0.027, rto = 2.000\nrecv  163\nupdated rto\nsend  164: rtt = 0.320, srtt = 0.328, rttvar = 0.022, rto = 2.000\nrecv  164\nupdated rto\nsend  165: rtt = 0.319, srtt = 0.327, rttvar = 0.019, rto = 2.000\nrecv  165\nupdated rto\nsend  166: rtt = 0.309, srtt = 0.325, rttvar = 0.019, rto = 2.000\nrecv  166\nupdated rto\nsend  167: rtt = 0.329, srtt = 0.325, rttvar = 0.015, rto = 2.000\nrecv  167\nupdated rto\nsend  168: rtt = 0.688, srtt = 0.370, rttvar = 0.102, rto = 2.000\nrecv  168\nupdated rto\nsend  169: rtt = 0.322, srtt = 0.364, rttvar = 0.089, rto = 2.000\nrecv  169\nupdated rto\nsend  170: rtt = 0.310, srtt = 0.358, rttvar = 0.080, rto = 2.000\nrecv  170\nupdated rto\nsend  171: rtt = 0.299, srtt = 0.350, rttvar = 0.075, rto = 2.000\nrecv  171\nupdated rto\nsend  172: rtt = 0.339, srtt = 0.349, rttvar = 0.059, rto = 2.000\nrecv  172\nupdated rto\nsend  173: rtt = 0.329, srtt = 0.346, rttvar = 0.049, rto = 2.000\nrecv  173\nupdated rto\nsend  174: rtt = 0.309, srtt = 0.342, rttvar = 0.046, rto = 2.000\nrecv  174\nupdated rto\nsend  175: rtt = 0.308, srtt = 0.337, rttvar = 0.043, rto = 2.000\nrecv  175\nupdated rto\nsend  176: rtt = 0.299, srtt = 0.333, rttvar = 0.042, rto = 2.000\nrecv  176\nupdated rto\nsend  177: rtt = 0.349, srtt = 0.335, rttvar = 0.036, rto = 2.000\nrecv  177\nupdated rto\nsend  178: rtt = 0.346, srtt = 0.336, rttvar = 0.029, rto = 2.000\nrecv  178\nupdated rto\nsend  179: rtt = 0.333, srtt = 0.336, rttvar = 0.023, rto = 2.000\nrecv  179\nupdated rto\nsend  180: rtt = 0.370, srtt = 0.340, rttvar = 0.026, rto = 2.000\nrecv  180\nupdated rto\nsend  181: rtt = 0.300, srtt = 0.335, rttvar = 0.029, rto = 2.000\nrecv  181\nupdated rto\nsend  182: rtt = 0.329, srtt = 0.334, rttvar = 0.023, rto = 2.000\nrecv  182\nupdated rto\nsend  183: rtt = 0.309, srtt = 0.331, rttvar = 0.024, rto = 2.000\nrecv  183\nupdated rto\nsend  184: rtt = 0.330, srtt = 0.331, rttvar = 0.018, rto = 2.000\nrecv  184\nupdated rto\nsend  185: rtt = 0.330, srtt = 0.331, rttvar = 0.014, rto = 2.000\nrecv  185\nupdated rto\nsend  186: rtt = 0.340, srtt = 0.332, rttvar = 0.013, rto = 2.000\nrecv  186\nupdated rto\nsend  187: rtt = 0.353, srtt = 0.335, rttvar = 0.015, rto = 2.000\nrecv  187\nupdated rto\nsend  188: rtt = 0.415, srtt = 0.345, rttvar = 0.031, rto = 2.000\nrecv  188\nupdated rto\nsend  189: rtt = 0.329, srtt = 0.343, rttvar = 0.027, rto = 2.000\nrecv  189\nupdated rto\nsend  190: rtt = 0.334, srtt = 0.342, rttvar = 0.023, rto = 2.000\nrecv  190\nupdated rto\nsend  191: rtt = 0.335, srtt = 0.341, rttvar = 0.019, rto = 2.000\nrecv  191\nupdated rto\nsend  192: rtt = 0.310, srtt = 0.337, rttvar = 0.022, rto = 2.000\nrecv  192\nupdated rto\nsend  193: rtt = 0.350, srtt = 0.339, rttvar = 0.020, rto = 2.000\nrecv  193\nupdated rto\nsend  194: rtt = 0.320, srtt = 0.336, rttvar = 0.019, rto = 2.000\nrecv  194\nupdated rto\nsend  195: rtt = 0.360, srtt = 0.339, rttvar = 0.020, rto = 2.000\nrecv  195\nupdated rto\nsend  196: rtt = 0.320, srtt = 0.337, rttvar = 0.020, rto = 2.000\nrecv  196\nupdated rto\nsend  197: rtt = 0.310, srtt = 0.333, rttvar = 0.022, rto = 2.000\nrecv  197\nupdated rto\nsend  198: rtt = 0.350, srtt = 0.336, rttvar = 0.020, rto = 2.000\nrecv  198\nupdated rto\nsend  199: rtt = 0.370, srtt = 0.340, rttvar = 0.024, rto = 2.000\nrecv  199\nupdated rto\nsend  200: rtt = 0.309, srtt = 0.336, rttvar = 0.026, rto = 2.000\nrecv  200\nupdated rto\nsend  201: rtt = 0.329, srtt = 0.335, rttvar = 0.021, rto = 2.000\nrecv  201\nupdated rto\nsend  202: rtt = 0.322, srtt = 0.333, rttvar = 0.019, rto = 2.000\nrecv  202\nupdated rto\nsend  203: rtt = 0.287, srtt = 0.328, rttvar = 0.026, rto = 2.000\nrecv  203\nupdated rto\nsend  204: rtt = 0.290, srtt = 0.323, rttvar = 0.029, rto = 2.000\nrecv  204\nupdated rto\nsend  205: rtt = 0.284, srtt = 0.318, rttvar = 0.031, rto = 2.000\nrecv  205\nupdated rto\nsend  206: rtt = 0.335, srtt = 0.320, rttvar = 0.028, rto = 2.000\nrecv  206\nupdated rto\nsend  207: rtt = 0.331, srtt = 0.322, rttvar = 0.024, rto = 2.000\nrecv  207\nupdated rto\nsend  208: rtt = 0.338, srtt = 0.324, rttvar = 0.022, rto = 2.000\nrecv  208\nupdated rto\nsend  209: rtt = 0.320, srtt = 0.323, rttvar = 0.017, rto = 2.000\nrecv  209\nupdated rto\nsend  210: rtt = 0.349, srtt = 0.326, rttvar = 0.019, rto = 2.000\nrecv  210\nupdated rto\nsend  211: rtt = 0.339, srtt = 0.328, rttvar = 0.018, rto = 2.000\nrecv  211\nupdated rto\nsend  212: rtt = 0.379, srtt = 0.334, rttvar = 0.026, rto = 2.000\nrecv  212\nupdated rto\nsend  213: rtt = 0.380, srtt = 0.340, rttvar = 0.031, rto = 2.000\nrecv  213\nupdated rto\nsend  214: rtt = 0.400, srtt = 0.348, rttvar = 0.038, rto = 2.000\nrecv  214\nupdated rto\nsend  215: rtt = 0.329, srtt = 0.345, rttvar = 0.033, rto = 2.000\nrecv  215\nupdated rto\nsend  216: rtt = 0.360, srtt = 0.347, rttvar = 0.029, rto = 2.000\nrecv  216\nupdated rto\nsend  217: rtt = 0.329, srtt = 0.345, rttvar = 0.026, rto = 2.000\nrecv  217\nupdated rto\nsend  218: rtt = 0.350, srtt = 0.345, rttvar = 0.021, rto = 2.000\nrecv  218\nupdated rto\nsend  219: rtt = 0.352, srtt = 0.346, rttvar = 0.017, rto = 2.000\nrecv  219\nupdated rto\nsend  220: rtt = 0.321, srtt = 0.343, rttvar = 0.019, rto = 2.000\nrecv  220\nupdated rto\nsend  221: rtt = 0.306, srtt = 0.338, rttvar = 0.024, rto = 2.000\nrecv  221\nupdated rto\nsend  222: rtt = 0.339, srtt = 0.339, rttvar = 0.018, rto = 2.000\nrecv  222\nupdated rto\nsend  223: rtt = 0.319, srtt = 0.336, rttvar = 0.018, rto = 2.000\nrecv  223\nupdated rto\nsend  224: rtt = 0.320, srtt = 0.334, rttvar = 0.018, rto = 2.000\nrecv  224\nupdated rto\nsend  225: rtt = 0.320, srtt = 0.332, rttvar = 0.017, rto = 2.000\nrecv  225\nupdated rto\nsend  226: rtt = 0.339, srtt = 0.333, rttvar = 0.014, rto = 2.000\nrecv  226\nupdated rto\nsend  227: rtt = 0.380, srtt = 0.339, rttvar = 0.022, rto = 2.000\nrecv  227\nupdated rto\nsend  228: rtt = 0.309, srtt = 0.335, rttvar = 0.024, rto = 2.000\nrecv  228\nupdated rto\nsend  229: rtt = 0.319, srtt = 0.333, rttvar = 0.022, rto = 2.000\nrecv  229\nupdated rto\nsend  230: rtt = 0.342, srtt = 0.334, rttvar = 0.019, rto = 2.000\nrecv  230\nupdated rto\nsend  231: rtt = 0.346, srtt = 0.336, rttvar = 0.017, rto = 2.000\nrecv  231\nupdated rto\nsend  232: rtt = 0.339, srtt = 0.336, rttvar = 0.014, rto = 2.000\nrecv  232\nupdated rto\nsend  233: rtt = 0.350, srtt = 0.338, rttvar = 0.014, rto = 2.000\nrecv  233\nupdated rto\nsend  234: rtt = 0.292, srtt = 0.332, rttvar = 0.022, rto = 2.000\nrecv  234\nupdated rto\nsend  235: rtt = 0.336, srtt = 0.333, rttvar = 0.017, rto = 2.000\nrecv  235\nupdated rto\nsend  236: rtt = 0.310, srtt = 0.330, rttvar = 0.019, rto = 2.000\nrecv  236\nupdated rto\nsend  237: rtt = 0.319, srtt = 0.328, rttvar = 0.017, rto = 2.000\nrecv  237\nupdated rto\nsend  238: rtt = 0.323, srtt = 0.328, rttvar = 0.014, rto = 2.000\nrecv  238\nupdated rto\nsend  239: rtt = 0.286, srtt = 0.323, rttvar = 0.021, rto = 2.000\nrecv  239\nupdated rto\nsend  240: rtt = 0.290, srtt = 0.318, rttvar = 0.024, rto = 2.000\nrecv  240\nupdated rto\nsend  241: rtt = 0.280, srtt = 0.314, rttvar = 0.027, rto = 2.000\nrecv  241\nupdated rto\nsend  242: rtt = 0.330, srtt = 0.316, rttvar = 0.025, rto = 2.000\nrecv  242\nupdated rto\nsend  243: rtt = 0.354, srtt = 0.321, rttvar = 0.028, rto = 2.000\nrecv  243\nupdated rto\nsend  244: rtt = 0.315, srtt = 0.320, rttvar = 0.022, rto = 2.000\nrecv  244\nupdated rto\nsend  245: rtt = 0.349, srtt = 0.323, rttvar = 0.024, rto = 2.000\nrecv  245\nupdated rto\nsend  246: rtt = 0.420, srtt = 0.336, rttvar = 0.042, rto = 2.000\nrecv  246\nupdated rto\nsend  247: rtt = 0.309, srtt = 0.332, rttvar = 0.038, rto = 2.000\nrecv  247\nupdated rto\nsend  248: rtt = 0.309, srtt = 0.329, rttvar = 0.035, rto = 2.000\nrecv  248\nupdated rto\nsend  249: rtt = 0.322, srtt = 0.328, rttvar = 0.028, rto = 2.000\nrecv  249\nupdated rto\nsend  250: rtt = 0.327, srtt = 0.328, rttvar = 0.021, rto = 2.000\nrecv  250\nupdated rto\nsend  251: rtt = 0.309, srtt = 0.326, rttvar = 0.021, rto = 2.000\nrecv  251\nupdated rto\nsend  252: rtt = 0.300, srtt = 0.323, rttvar = 0.022, rto = 2.000\nrecv  252\nupdated rto\nsend  253: rtt = 0.309, srtt = 0.321, rttvar = 0.020, rto = 2.000\nrecv  253\nupdated rto\nsend  254: rtt = 0.310, srtt = 0.320, rttvar = 0.018, rto = 2.000\nrecv  254\nupdated rto\nsend  255: rtt = 0.310, srtt = 0.318, rttvar = 0.016, rto = 2.000\nrecv  255\nupdated rto\nsend  256: rtt = 0.309, srtt = 0.317, rttvar = 0.014, rto = 2.000\nrecv  256\nupdated rto\nsend  257: rtt = 0.340, srtt = 0.320, rttvar = 0.016, rto = 2.000\nrecv  257\nupdated rto\nsend  258: rtt = 0.322, srtt = 0.320, rttvar = 0.013, rto = 2.000\nrecv  258\nupdated rto\nsend  259: rtt = 0.377, srtt = 0.327, rttvar = 0.024, rto = 2.000\nrecv  259\nupdated rto\nsend  260: rtt = 0.363, srtt = 0.332, rttvar = 0.027, rto = 2.000\nrecv  260\nupdated rto\nsend  261: rtt = 0.367, srtt = 0.336, rttvar = 0.029, rto = 2.000\nrecv  261\nupdated rto\nsend  262: rtt = 0.360, srtt = 0.339, rttvar = 0.028, rto = 2.000\nrecv  262\nupdated rto\nsend  263: rtt = 0.321, srtt = 0.337, rttvar = 0.025, rto = 2.000\nrecv  263\nupdated rto\nsend  264: rtt = 0.308, srtt = 0.333, rttvar = 0.026, rto = 2.000\nrecv  264\nupdated rto\nsend  265: rtt = 0.280, srtt = 0.327, rttvar = 0.033, rto = 2.000\nrecv  265\nupdated rto\nsend  266: rtt = 0.319, srtt = 0.326, rttvar = 0.027, rto = 2.000\nrecv  266\nupdated rto\nsend  267: rtt = 0.322, srtt = 0.325, rttvar = 0.021, rto = 2.000\nrecv  267\nupdated rto\nsend  268: rtt = 0.297, srtt = 0.322, rttvar = 0.023, rto = 2.000\nrecv  268\nupdated rto\nsend  269: rtt = 0.319, srtt = 0.321, rttvar = 0.018, rto = 2.000\nrecv  269\nupdated rto\nsend  270: rtt = 0.340, srtt = 0.324, rttvar = 0.018, rto = 2.000\nrecv  270\nupdated rto\nsend  271: rtt = 0.370, srtt = 0.329, rttvar = 0.025, rto = 2.000\nrecv  271\nupdated rto\nsend  272: rtt = 0.310, srtt = 0.327, rttvar = 0.024, rto = 2.000\nrecv  272\nupdated rto\nsend  273: rtt = 0.310, srtt = 0.325, rttvar = 0.022, rto = 2.000\nrecv  273\nupdated rto\nsend  274: rtt = 0.309, srtt = 0.323, rttvar = 0.020, rto = 2.000\nrecv  274\nupdated rto\nsend  275: rtt = 0.370, srtt = 0.329, rttvar = 0.027, rto = 2.000\nrecv  275\nupdated rto\nsend  276: rtt = 0.320, srtt = 0.328, rttvar = 0.023, rto = 2.000\nrecv  276\nupdated rto\nsend  277: rtt = 0.332, srtt = 0.328, rttvar = 0.018, rto = 2.000\nrecv  277\nupdated rto\nsend  278: rtt = 0.337, srtt = 0.329, rttvar = 0.016, rto = 2.000\nrecv  278\nupdated rto\nsend  279: rtt = 0.309, srtt = 0.327, rttvar = 0.017, rto = 2.000\nrecv  279\nupdated rto\nsend  280: rtt = 0.310, srtt = 0.325, rttvar = 0.017, rto = 2.000\nrecv  280\nupdated rto\nsend  281: rtt = 0.289, srtt = 0.320, rttvar = 0.022, rto = 2.000\nrecv  281\nupdated rto\nsend  282: rtt = 0.300, srtt = 0.318, rttvar = 0.021, rto = 2.000\nrecv  282\nupdated rto\nsend  283: rtt = 0.279, srtt = 0.313, rttvar = 0.026, rto = 2.000\nrecv  283\nupdated rto\nsend  284: rtt = 0.339, srtt = 0.316, rttvar = 0.026, rto = 2.000\nrecv  284\nupdated rto\nsend  285: rtt = 0.303, srtt = 0.314, rttvar = 0.023, rto = 2.000\nrecv  285\nupdated rto\nsend  286: rtt = 0.335, srtt = 0.317, rttvar = 0.022, rto = 2.000\nrecv  286\nupdated rto\nsend  287: rtt = 0.322, srtt = 0.318, rttvar = 0.018, rto = 2.000\nrecv  287\nupdated rto\nsend  288: rtt = 0.327, srtt = 0.319, rttvar = 0.016, rto = 2.000\nrecv  288\nupdated rto\nsend  289: rtt = 0.309, srtt = 0.318, rttvar = 0.014, rto = 2.000\nrecv  289\nupdated rto\nsend  290: rtt = 0.320, srtt = 0.318, rttvar = 0.011, rto = 2.000\nrecv  290\nupdated rto\nsend  291: rtt = 0.329, srtt = 0.319, rttvar = 0.011, rto = 2.000\nrecv  291\nupdated rto\nsend  292: rtt = 0.320, srtt = 0.319, rttvar = 0.009, rto = 2.000\nrecv  292\nupdated rto\nsend  293: rtt = 0.309, srtt = 0.318, rttvar = 0.009, rto = 2.000\nrecv  293\nupdated rto\nsend  294: rtt = 0.314, srtt = 0.318, rttvar = 0.008, rto = 2.000\nrecv  294\nupdated rto\nsend  295: rtt = 0.315, srtt = 0.317, rttvar = 0.006, rto = 2.000\nrecv  295\nupdated rto\nsend  296: rtt = 0.300, srtt = 0.315, rttvar = 0.009, rto = 2.000\nrecv  296\nupdated rto\nsend  297: rtt = 0.314, srtt = 0.315, rttvar = 0.007, rto = 2.000\nrecv  297\nupdated rto\nsend  298: rtt = 0.327, srtt = 0.316, rttvar = 0.008, rto = 2.000\nrecv  298\nupdated rto\nsend  299: rtt = 0.307, srtt = 0.315, rttvar = 0.009, rto = 2.000\nrecv  299\nupdated rto\nsend  300: rtt = 0.370, srtt = 0.322, rttvar = 0.020, rto = 2.000\nrecv  300\nupdated rto\nsend  301: rtt = 0.368, srtt = 0.328, rttvar = 0.027, rto = 2.000\nrecv  301\nupdated rto\nsend  302: rtt = 0.330, srtt = 0.328, rttvar = 0.020, rto = 2.000\nrecv  302\nupdated rto\nsend  303: rtt = 0.310, srtt = 0.326, rttvar = 0.020, rto = 2.000\nrecv  303\nupdated rto\nsend  304: rtt = 0.319, srtt = 0.325, rttvar = 0.017, rto = 2.000\nrecv  304\nupdated rto\nsend  305: rtt = 0.339, srtt = 0.327, rttvar = 0.016, rto = 2.000\nrecv  305\nupdated rto\nsend  306: rtt = 0.320, srtt = 0.326, rttvar = 0.014, rto = 2.000\nrecv  306\nupdated rto\nsend  307: rtt = 0.330, srtt = 0.326, rttvar = 0.011, rto = 2.000\nrecv  307\nupdated rto\nsend  308: rtt = 0.350, srtt = 0.329, rttvar = 0.014, rto = 2.000\nrecv  308\nupdated rto\nsend  309: rtt = 0.320, srtt = 0.328, rttvar = 0.013, rto = 2.000\nrecv  309\nupdated rto\nsend  310: rtt = 0.340, srtt = 0.330, rttvar = 0.013, rto = 2.000\nrecv  310\nupdated rto\nsend  311: rtt = 0.320, srtt = 0.328, rttvar = 0.012, rto = 2.000\nrecv  311\nupdated rto\nsend  312: rtt = 0.310, srtt = 0.326, rttvar = 0.014, rto = 2.000\nrecv  312\nupdated rto\nsend  313: rtt = 0.320, srtt = 0.325, rttvar = 0.012, rto = 2.000\nrecv  313\nupdated rto\nsend  314: rtt = 0.340, srtt = 0.327, rttvar = 0.012, rto = 2.000\nrecv  314\nupdated rto\nsend  315: rtt = 0.304, srtt = 0.324, rttvar = 0.015, rto = 2.000\nrecv  315\nupdated rto\nsend  316: rtt = 0.324, srtt = 0.324, rttvar = 0.011, rto = 2.000\nrecv  316\nupdated rto\nsend  317: rtt = 0.330, srtt = 0.325, rttvar = 0.010, rto = 2.000\nrecv  317\nupdated rto\nsend  318: rtt = 0.344, srtt = 0.327, rttvar = 0.012, rto = 2.000\nrecv  318\nupdated rto\nsend  319: rtt = 0.305, srtt = 0.325, rttvar = 0.015, rto = 2.000\nrecv  319\nupdated rto\nsend  320: rtt = 0.299, srtt = 0.321, rttvar = 0.017, rto = 2.000\nrecv  320\nupdated rto\nsend  321: rtt = 0.320, srtt = 0.321, rttvar = 0.013, rto = 2.000\nrecv  321\nupdated rto\nsend  322: rtt = 0.319, srtt = 0.321, rttvar = 0.011, rto = 2.000\nrecv  322\nupdated rto\nsend  323: rtt = 0.320, srtt = 0.321, rttvar = 0.008, rto = 2.000\nrecv  323\nupdated rto\nsend  324: rtt = 0.320, srtt = 0.321, rttvar = 0.006, rto = 2.000\nrecv  324\nupdated rto\nsend  325: rtt = 0.320, srtt = 0.321, rttvar = 0.005, rto = 2.000\nrecv  325\nupdated rto\nsend  326: rtt = 0.329, srtt = 0.322, rttvar = 0.006, rto = 2.000\nrecv  326\nupdated rto\nsend  327: rtt = 0.340, srtt = 0.324, rttvar = 0.009, rto = 2.000\nrecv  327\nupdated rto\nsend  328: rtt = 0.289, srtt = 0.320, rttvar = 0.015, rto = 2.000\nrecv  328\nupdated rto\nsend  329: rtt = 0.329, srtt = 0.321, rttvar = 0.014, rto = 2.000\nrecv  329\nupdated rto\nsend  330: rtt = 0.310, srtt = 0.319, rttvar = 0.013, rto = 2.000\nrecv  330\nupdated rto\nsend  331: rtt = 0.330, srtt = 0.321, rttvar = 0.013, rto = 2.000\nrecv  331\nupdated rto\nsend  332: rtt = 0.290, srtt = 0.317, rttvar = 0.017, rto = 2.000\nrecv  332\nupdated rto\nsend  333: rtt = 0.293, srtt = 0.314, rttvar = 0.019, rto = 2.000\nrecv  333\nupdated rto\nsend  334: rtt = 0.317, srtt = 0.314, rttvar = 0.015, rto = 2.000\nrecv  334\nupdated rto\nsend  335: rtt = 0.332, srtt = 0.317, rttvar = 0.016, rto = 2.000\nrecv  335\nupdated rto\nsend  336: rtt = 0.307, srtt = 0.315, rttvar = 0.014, rto = 2.000\nrecv  336\nupdated rto\nsend  337: rtt = 0.299, srtt = 0.313, rttvar = 0.015, rto = 2.000\nrecv  337\nupdated rto\nsend  338: rtt = 0.313, srtt = 0.313, rttvar = 0.011, rto = 2.000\nrecv  338\nupdated rto\nsend  339: rtt = 0.326, srtt = 0.315, rttvar = 0.011, rto = 2.000\nrecv  339\nupdated rto\nsend  340: rtt = 0.303, srtt = 0.313, rttvar = 0.012, rto = 2.000\nrecv  340\nupdated rto\nsend  341: rtt = 0.297, srtt = 0.311, rttvar = 0.013, rto = 2.000\nrecv  341\nupdated rto\nsend  342: rtt = 0.309, srtt = 0.311, rttvar = 0.010, rto = 2.000\nrecv  342\nupdated rto\nsend  343: rtt = 0.310, srtt = 0.311, rttvar = 0.008, rto = 2.000\nrecv  343\nupdated rto\nsend  344: rtt = 0.329, srtt = 0.313, rttvar = 0.010, rto = 2.000\nrecv  344\nupdated rto\nsend  345: rtt = 0.310, srtt = 0.313, rttvar = 0.009, rto = 2.000\nrecv  345\nupdated rto\nsend  346: rtt = 0.299, srtt = 0.311, rttvar = 0.010, rto = 2.000\nrecv  346\nupdated rto\nsend  347: rtt = 0.350, srtt = 0.316, rttvar = 0.017, rto = 2.000\nrecv  347\nupdated rto\nsend  348: rtt = 0.299, srtt = 0.314, rttvar = 0.017, rto = 2.000\nrecv  348\nupdated rto\nsend  349: rtt = 0.329, srtt = 0.316, rttvar = 0.017, rto = 2.000\nrecv  349\nupdated rto\nsend  350: rtt = 0.430, srtt = 0.330, rttvar = 0.041, rto = 2.000\nrecv  350\nupdated rto\nsend  351: rtt = 0.319, srtt = 0.329, rttvar = 0.034, rto = 2.000\nrecv  351\nupdated rto\nsend  352: rtt = 0.340, srtt = 0.330, rttvar = 0.028, rto = 2.000\nrecv  352\nupdated rto\nsend  353: rtt = 0.300, srtt = 0.326, rttvar = 0.029, rto = 2.000\nrecv  353\nupdated rto\nsend  354: rtt = 0.323, srtt = 0.326, rttvar = 0.022, rto = 2.000\nrecv  354\nupdated rto\nsend  355: rtt = 0.295, srtt = 0.322, rttvar = 0.024, rto = 2.000\nrecv  355\nupdated rto\nsend  356: rtt = 0.346, srtt = 0.325, rttvar = 0.024, rto = 2.000\nrecv  356\nupdated rto\nsend  357: rtt = 0.366, srtt = 0.330, rttvar = 0.028, rto = 2.000\nrecv  357\nupdated rto\nsend  358: rtt = 0.400, srtt = 0.339, rttvar = 0.039, rto = 2.000\nrecv  358\nupdated rto\nsend  359: rtt = 0.316, srtt = 0.336, rttvar = 0.035, rto = 2.000\nrecv  359\nupdated rto\nsend  360: rtt = 0.341, srtt = 0.337, rttvar = 0.027, rto = 2.000\nrecv  360\nupdated rto\nsend  361: rtt = 0.305, srtt = 0.333, rttvar = 0.028, rto = 2.000\nrecv  361\nupdated rto\nsend  362: rtt = 0.310, srtt = 0.330, rttvar = 0.027, rto = 2.000\nrecv  362\nupdated rto\nsend  363: rtt = 0.319, srtt = 0.328, rttvar = 0.023, rto = 2.000\nrecv  363\nupdated rto\nsend  364: rtt = 0.320, srtt = 0.327, rttvar = 0.019, rto = 2.000\nrecv  364\nupdated rto\nsend  365: rtt = 0.340, srtt = 0.329, rttvar = 0.018, rto = 2.000\nrecv  365\nupdated rto\nsend  366: rtt = 0.318, srtt = 0.328, rttvar = 0.016, rto = 2.000\nrecv  366\nupdated rto\nsend  367: rtt = 0.330, srtt = 0.328, rttvar = 0.013, rto = 2.000\nrecv  367\nupdated rto\nsend  368: rtt = 0.319, srtt = 0.327, rttvar = 0.012, rto = 2.000\nrecv  368\nupdated rto\nsend  369: rtt = 0.329, srtt = 0.327, rttvar = 0.009, rto = 2.000\nrecv  369\nupdated rto\nsend  370: rtt = 0.320, srtt = 0.326, rttvar = 0.009, rto = 2.000\nrecv  370\nupdated rto\nsend  371: rtt = 0.288, srtt = 0.321, rttvar = 0.016, rto = 2.000\nrecv  371\nupdated rto\nsend  372: rtt = 0.340, srtt = 0.324, rttvar = 0.017, rto = 2.000\nrecv  372\nupdated rto\nsend  373: rtt = 0.290, srtt = 0.320, rttvar = 0.021, rto = 2.000\nrecv  373\nupdated rto\nsend  374: rtt = 0.324, srtt = 0.320, rttvar = 0.017, rto = 2.000\nrecv  374\nupdated rto\nsend  375: rtt = 0.294, srtt = 0.317, rttvar = 0.019, rto = 2.000\nrecv  375\nupdated rto\nsend  376: rtt = 0.329, srtt = 0.318, rttvar = 0.017, rto = 2.000\nrecv  376\nupdated rto\nsend  377: rtt = 0.339, srtt = 0.321, rttvar = 0.018, rto = 2.000\nrecv  377\nupdated rto\nsend  378: rtt = 0.329, srtt = 0.322, rttvar = 0.016, rto = 2.000\nrecv  378\nupdated rto\nsend  379: rtt = 0.309, srtt = 0.320, rttvar = 0.015, rto = 2.000\nrecv  379\nupdated rto\nsend  380: rtt = 0.320, srtt = 0.320, rttvar = 0.011, rto = 2.000\nrecv  380\nupdated rto\nsend  381: rtt = 0.310, srtt = 0.319, rttvar = 0.011, rto = 2.000\nrecv  381\nupdated rto\nsend  382: rtt = 0.340, srtt = 0.322, rttvar = 0.014, rto = 2.000\nrecv  382\nupdated rto\nsend  383: rtt = 0.329, srtt = 0.323, rttvar = 0.012, rto = 2.000\nrecv  383\nupdated rto\nsend  384: rtt = 0.320, srtt = 0.322, rttvar = 0.010, rto = 2.000\nrecv  384\nupdated rto\nsend  385: rtt = 0.330, srtt = 0.323, rttvar = 0.009, rto = 2.000\nrecv  385\nupdated rto\nsend  386: rtt = 0.320, srtt = 0.323, rttvar = 0.008, rto = 2.000\nrecv  386\nupdated rto\nsend  387: rtt = 0.339, srtt = 0.325, rttvar = 0.010, rto = 2.000\nrecv  387\nupdated rto\nsend  388: rtt = 0.306, srtt = 0.322, rttvar = 0.012, rto = 2.000\nrecv  388\nupdated rto\nsend  389: rtt = 0.313, srtt = 0.321, rttvar = 0.011, rto = 2.000\nrecv  389\nupdated rto\nsend  390: rtt = 0.289, srtt = 0.317, rttvar = 0.017, rto = 2.000\nrecv  390\nupdated rto\nsend  391: rtt = 0.360, srtt = 0.323, rttvar = 0.023, rto = 2.000\nrecv  391\nupdated rto\nsend  392: rtt = 0.329, srtt = 0.323, rttvar = 0.019, rto = 2.000\nrecv  392\nupdated rto\nsend  393: rtt = 0.402, srtt = 0.333, rttvar = 0.034, rto = 2.000\nrecv  393\nupdated rto\nsend  394: rtt = 0.327, srtt = 0.332, rttvar = 0.027, rto = 2.000\nrecv  394\nupdated rto\nsend  395: rtt = 0.340, srtt = 0.333, rttvar = 0.022, rto = 2.000\nrecv  395\nupdated rto\nsend  396: rtt = 0.330, srtt = 0.333, rttvar = 0.017, rto = 2.000\nrecv  396\nupdated rto\nsend  397: rtt = 0.344, srtt = 0.334, rttvar = 0.016, rto = 2.000\nrecv  397\nupdated rto\nsend  398: rtt = 0.345, srtt = 0.336, rttvar = 0.015, rto = 2.000\nrecv  398\nupdated rto\nsend  399: rtt = 0.379, srtt = 0.341, rttvar = 0.022, rto = 2.000\nrecv  399\nupdated rto\nsend  400: rtt = 0.349, srtt = 0.342, rttvar = 0.018, rto = 2.000\nrecv  400\nupdated rto\nsend  401: rtt = 0.339, srtt = 0.342, rttvar = 0.014, rto = 2.000\nrecv  401\nupdated rto\nsend  402: rtt = 0.329, srtt = 0.340, rttvar = 0.014, rto = 2.000\nrecv  402\nupdated rto\nsend  403: rtt = 0.320, srtt = 0.338, rttvar = 0.016, rto = 2.000\nrecv  403\nupdated rto\nsend  404: rtt = 0.374, srtt = 0.342, rttvar = 0.021, rto = 2.000\nrecv  404\nupdated rto\nsend  405: rtt = 0.337, srtt = 0.342, rttvar = 0.017, rto = 2.000\nrecv  405\nupdated rto\nsend  406: rtt = 0.347, srtt = 0.342, rttvar = 0.014, rto = 2.000\nrecv  406\nupdated rto\nsend  407: rtt = 0.339, srtt = 0.342, rttvar = 0.011, rto = 2.000\nrecv  407\nupdated rto\nsend  408: rtt = 0.340, srtt = 0.342, rttvar = 0.009, rto = 2.000\nrecv  408\nupdated rto\nsend  409: rtt = 0.410, srtt = 0.350, rttvar = 0.024, rto = 2.000\nrecv  409\nupdated rto\nsend  410: rtt = 0.339, srtt = 0.349, rttvar = 0.021, rto = 2.000\nrecv  410\nupdated rto\nsend  411: rtt = 0.430, srtt = 0.359, rttvar = 0.036, rto = 2.000\nrecv  411\nupdated rto\nsend  412: rtt = 0.380, srtt = 0.362, rttvar = 0.032, rto = 2.000\nrecv  412\nupdated rto\nsend  413: rtt = 0.310, srtt = 0.355, rttvar = 0.037, rto = 2.000\nrecv  413\nupdated rto\nsend  414: rtt = 0.319, srtt = 0.351, rttvar = 0.037, rto = 2.000\nrecv  414\nupdated rto\nsend  415: rtt = 0.319, srtt = 0.347, rttvar = 0.035, rto = 2.000\nrecv  415\nupdated rto\nsend  416: rtt = 0.309, srtt = 0.342, rttvar = 0.036, rto = 2.000\nrecv  416\nupdated rto\nsend  417: rtt = 0.320, srtt = 0.339, rttvar = 0.032, rto = 2.000\nrecv  417\nupdated rto\nsend  418: rtt = 0.320, srtt = 0.337, rttvar = 0.029, rto = 2.000\nrecv  418\nupdated rto\nsend  419: rtt = 0.329, srtt = 0.336, rttvar = 0.024, rto = 2.000\nrecv  419\nupdated rto\nsend  420: rtt = 0.349, srtt = 0.337, rttvar = 0.021, rto = 2.000\nrecv  420\nupdated rto\nsend  421: rtt = 0.309, srtt = 0.334, rttvar = 0.023, rto = 2.000\nrecv  421\nupdated rto\nsend  422: rtt = 0.309, srtt = 0.331, rttvar = 0.023, rto = 2.000\nrecv  422\nupdated rto\nsend  423: rtt = 0.319, srtt = 0.329, rttvar = 0.021, rto = 2.000\nrecv  423\nupdated rto\nsend  424: rtt = 0.380, srtt = 0.336, rttvar = 0.028, rto = 2.000\nrecv  424\nupdated rto\nsend  425: rtt = 0.302, srtt = 0.331, rttvar = 0.029, rto = 2.000\nrecv  425\nupdated rto\nsend  426: rtt = 0.347, srtt = 0.333, rttvar = 0.026, rto = 2.000\nrecv  426\nupdated rto\nsend  427: rtt = 0.340, srtt = 0.334, rttvar = 0.021, rto = 2.000\nrecv  427\nupdated rto\nsend  428: rtt = 0.350, srtt = 0.336, rttvar = 0.020, rto = 2.000\nrecv  428\nupdated rto\nsend  429: rtt = 0.336, srtt = 0.336, rttvar = 0.015, rto = 2.000\nrecv  429\nupdated rto\nsend  430: rtt = 0.324, srtt = 0.335, rttvar = 0.014, rto = 2.000\nrecv  430\nupdated rto\nsend  431: rtt = 0.328, srtt = 0.334, rttvar = 0.012, rto = 2.000\nrecv  431\nupdated rto\nsend  432: rtt = 0.320, srtt = 0.332, rttvar = 0.013, rto = 2.000\nrecv  432\nupdated rto\nsend  433: rtt = 0.301, srtt = 0.328, rttvar = 0.017, rto = 2.000\nrecv  433\nupdated rto\nsend  434: rtt = 0.317, srtt = 0.327, rttvar = 0.016, rto = 2.000\nrecv  434\nupdated rto\nsend  435: rtt = 0.309, srtt = 0.325, rttvar = 0.016, rto = 2.000\nrecv  435\nupdated rto\nsend  436: rtt = 0.330, srtt = 0.325, rttvar = 0.014, rto = 2.000\nrecv  436\nupdated rto\nsend  437: rtt = 0.300, srtt = 0.322, rttvar = 0.016, rto = 2.000\nrecv  437\nupdated rto\nsend  438: rtt = 0.320, srtt = 0.322, rttvar = 0.013, rto = 2.000\nrecv  438\nupdated rto\nsend  439: rtt = 0.319, srtt = 0.321, rttvar = 0.010, rto = 2.000\nrecv  439\nupdated rto\nsend  440: rtt = 0.323, srtt = 0.322, rttvar = 0.008, rto = 2.000\nrecv  440\nupdated rto\nsend  441: rtt = 0.295, srtt = 0.318, rttvar = 0.013, rto = 2.000\nrecv  441\nupdated rto\nsend  442: rtt = 0.340, srtt = 0.321, rttvar = 0.015, rto = 2.000\nrecv  442\nupdated rto\nsend  443: rtt = 0.340, srtt = 0.323, rttvar = 0.016, rto = 2.000\nrecv  443\nupdated rto\nsend  444: rtt = 0.310, srtt = 0.322, rttvar = 0.015, rto = 2.000\nrecv  444\nupdated rto\nsend  445: rtt = 0.300, srtt = 0.319, rttvar = 0.017, rto = 2.000\nrecv  445\nupdated rto\nsend  446: rtt = 0.349, srtt = 0.323, rttvar = 0.020, rto = 2.000\nrecv  446\nupdated rto\nsend  447: rtt = 0.409, srtt = 0.334, rttvar = 0.037, rto = 2.000\nrecv  447\nupdated rto\nsend  448: rtt = 0.360, srtt = 0.337, rttvar = 0.034, rto = 2.000\nrecv  448\nupdated rto\nsend  449: rtt = 0.300, srtt = 0.332, rttvar = 0.035, rto = 2.000\nrecv  449\nupdated rto\nsend  450: rtt = 0.323, srtt = 0.331, rttvar = 0.028, rto = 2.000\nrecv  450\nupdated rto\nsend  451: rtt = 0.326, srtt = 0.330, rttvar = 0.023, rto = 2.000\nrecv  451\nupdated rto\nsend  452: rtt = 0.348, srtt = 0.333, rttvar = 0.021, rto = 2.000\nrecv  452\nupdated rto\nsend  453: rtt = 0.672, srtt = 0.375, rttvar = 0.101, rto = 2.000\nrecv  453\nupdated rto\nsend  454: rtt = 0.337, srtt = 0.370, rttvar = 0.085, rto = 2.000\nrecv  454\nupdated rto\nsend  455: rtt = 0.298, srtt = 0.361, rttvar = 0.082, rto = 2.000\nrecv  455\nupdated rto\nsend  456: rtt = 0.335, srtt = 0.358, rttvar = 0.068, rto = 2.000\nrecv  456\nupdated rto\nsend  457: rtt = 0.334, srtt = 0.355, rttvar = 0.057, rto = 2.000\nrecv  457\nupdated rto\nsend  458: rtt = 0.329, srtt = 0.352, rttvar = 0.049, rto = 2.000\nrecv  458\nupdated rto\nsend  459: rtt = 0.343, srtt = 0.351, rttvar = 0.039, rto = 2.000\nrecv  459\nupdated rto\nsend  460: rtt = 0.325, srtt = 0.347, rttvar = 0.036, rto = 2.000\nrecv  460\nupdated rto\nsend  461: rtt = 0.309, srtt = 0.343, rttvar = 0.036, rto = 2.000\nrecv  461\nupdated rto\nsend  462: rtt = 0.459, srtt = 0.357, rttvar = 0.056, rto = 2.000\nrecv  462\nupdated rto\nsend  463: rtt = 0.350, srtt = 0.356, rttvar = 0.044, rto = 2.000\nrecv  463\nupdated rto\nsend  464: rtt = 0.350, srtt = 0.355, rttvar = 0.035, rto = 2.000\nrecv  464\nupdated rto\nsend  465: rtt = 0.352, srtt = 0.355, rttvar = 0.027, rto = 2.000\nrecv  465\nupdated rto\nsend  466: rtt = 0.327, srtt = 0.352, rttvar = 0.027, rto = 2.000\nrecv  466\nupdated rto\nsend  467: rtt = 0.320, srtt = 0.348, rttvar = 0.028, rto = 2.000\nrecv  467\nupdated rto\nsend  468: rtt = 0.340, srtt = 0.347, rttvar = 0.023, rto = 2.000\nrecv  468\nupdated rto\nsend  469: rtt = 0.357, srtt = 0.348, rttvar = 0.020, rto = 2.000\nrecv  469\nupdated rto\nsend  470: rtt = 0.301, srtt = 0.342, rttvar = 0.027, rto = 2.000\nrecv  470\nupdated rto\nsend  471: rtt = 0.410, srtt = 0.351, rttvar = 0.037, rto = 2.000\nrecv  471\nupdated rto\nsend  472: rtt = 0.360, srtt = 0.352, rttvar = 0.030, rto = 2.000\nrecv  472\nupdated rto\nsend  473: rtt = 0.350, srtt = 0.352, rttvar = 0.023, rto = 2.000\nrecv  473\nupdated rto\nsend  474: rtt = 0.329, srtt = 0.349, rttvar = 0.023, rto = 2.000\nrecv  474\nupdated rto\nsend  475: rtt = 0.359, srtt = 0.350, rttvar = 0.020, rto = 2.000\nrecv  475\nupdated rto\nsend  476: rtt = 0.330, srtt = 0.348, rttvar = 0.020, rto = 2.000\nrecv  476\nupdated rto\nsend  477: rtt = 0.300, srtt = 0.342, rttvar = 0.027, rto = 2.000\nrecv  477\nupdated rto\nsend  478: rtt = 0.339, srtt = 0.341, rttvar = 0.021, rto = 2.000\nrecv  478\nupdated rto\nsend  479: rtt = 0.319, srtt = 0.338, rttvar = 0.021, rto = 2.000\nrecv  479\nupdated rto\nsend  480: rtt = 0.310, srtt = 0.335, rttvar = 0.023, rto = 2.000\nrecv  480\nupdated rto\nsend  481: rtt = 0.330, srtt = 0.334, rttvar = 0.018, rto = 2.000\nrecv  481\nupdated rto\nsend  482: rtt = 0.379, srtt = 0.340, rttvar = 0.025, rto = 2.000\nrecv  482\nupdated rto\nsend  483: rtt = 0.360, srtt = 0.342, rttvar = 0.024, rto = 2.000\nrecv  483\nupdated rto\nsend  484: rtt = 0.310, srtt = 0.338, rttvar = 0.026, rto = 2.000\nrecv  484\nupdated rto\nsend  485: rtt = 0.330, srtt = 0.337, rttvar = 0.022, rto = 2.000\nrecv  485\nupdated rto\nsend  486: rtt = 0.340, srtt = 0.338, rttvar = 0.017, rto = 2.000\nrecv  486\nupdated rto\nsend  487: rtt = 0.311, srtt = 0.334, rttvar = 0.019, rto = 2.000\nrecv  487\nupdated rto\nsend  488: rtt = 0.308, srtt = 0.331, rttvar = 0.021, rto = 2.000\nrecv  488\nupdated rto\nsend  489: rtt = 0.390, srtt = 0.338, rttvar = 0.031, rto = 2.000\nrecv  489\nupdated rto\nsend  490: rtt = 0.389, srtt = 0.345, rttvar = 0.036, rto = 2.000\nrecv  490\nupdated rto\nsend  491: rtt = 0.300, srtt = 0.339, rttvar = 0.038, rto = 2.000\nrecv  491\nupdated rto\nsend  492: rtt = 0.300, srtt = 0.334, rttvar = 0.038, rto = 2.000\nrecv  492\nupdated rto\nsend  493: rtt = 0.319, srtt = 0.332, rttvar = 0.032, rto = 2.000\nrecv  493\nupdated rto\nsend  494: rtt = 0.323, srtt = 0.331, rttvar = 0.027, rto = 2.000\nrecv  494\nupdated rto\nsend  495: rtt = 0.337, srtt = 0.332, rttvar = 0.021, rto = 2.000\nrecv  495\nupdated rto\nsend  496: rtt = 0.320, srtt = 0.330, rttvar = 0.019, rto = 2.000\nrecv  496\nupdated rto\nsend  497: rtt = 0.320, srtt = 0.329, rttvar = 0.017, rto = 2.000\nrecv  497\nupdated rto\nsend  498: rtt = 0.319, srtt = 0.328, rttvar = 0.015, rto = 2.000\nrecv  498\nupdated rto\nsend  499: rtt = 0.300, srtt = 0.324, rttvar = 0.018, rto = 2.000\nrecv  499\nupdated rto\nsend  500: rtt = 0.339, srtt = 0.326, rttvar = 0.017, rto = 2.000\nrecv  500\nupdated rto\n"
  },
  {
    "path": "rtt/rtt.out.vangogh.1",
    "content": "send    1: rtt = 0.000, srtt = 0.000, rttvar = 0.750, rto = 3.000\nrecv    1\nupdated rto\nsend    2: rtt = 0.316, srtt = 0.040, rttvar = 0.641, rto = 2.605\nrecv    2\nupdated rto\nsend    3: rtt = 0.218, srtt = 0.062, rttvar = 0.526, rto = 2.165\nrecv    3\nupdated rto\nsend    4: rtt = 0.225, srtt = 0.082, rttvar = 0.435, rto = 2.000\nrecv    4\nupdated rto\nsend    5: rtt = 0.264, srtt = 0.105, rttvar = 0.372, rto = 2.000\nrecv    5\nupdated rto\nsend    6: rtt = 0.228, srtt = 0.120, rttvar = 0.310, rto = 2.000\nrecv    6\nupdated rto\nsend    7: rtt = 0.221, srtt = 0.133, rttvar = 0.257, rto = 2.000\nrecv    7\nupdated rto\nsend    8: rtt = 0.228, srtt = 0.145, rttvar = 0.217, rto = 2.000\nrecv    8\nupdated rto\nsend    9: rtt = 0.200, srtt = 0.152, rttvar = 0.176, rto = 2.000\nrecv    9\nupdated rto\nsend   10: rtt = 0.240, srtt = 0.163, rttvar = 0.154, rto = 2.000\nrecv   10\nupdated rto\nsend   11: rtt = 0.210, srtt = 0.169, rttvar = 0.128, rto = 2.000\nrecv   11\nupdated rto\nsend   12: rtt = 0.249, srtt = 0.179, rttvar = 0.116, rto = 2.000\nrecv   12\nupdated rto\nsend   13: rtt = 0.240, srtt = 0.186, rttvar = 0.102, rto = 2.000\nrecv   13\nupdated rto\nsend   14: rtt = 0.260, srtt = 0.196, rttvar = 0.095, rto = 2.000\nrecv   14\nupdated rto\nsend   15: rtt = 0.201, srtt = 0.196, rttvar = 0.073, rto = 2.000\nrecv   15\nupdated rto\nsend   16: rtt = 0.248, srtt = 0.203, rttvar = 0.067, rto = 2.000\nrecv   16\nupdated rto\nsend   17: rtt = 0.261, srtt = 0.210, rttvar = 0.065, rto = 2.000\nrecv   17\nupdated rto\nsend   18: rtt = 0.248, srtt = 0.215, rttvar = 0.058, rto = 2.000\nrecv   18\nupdated rto\nsend   19: rtt = 0.260, srtt = 0.220, rttvar = 0.055, rto = 2.000\nrecv   19\nupdated rto\nsend   20: rtt = 0.210, srtt = 0.219, rttvar = 0.044, rto = 2.000\nrecv   20\nupdated rto\nsend   21: rtt = 0.240, srtt = 0.222, rttvar = 0.038, rto = 2.000\nrecv   21\nupdated rto\nsend   22: rtt = 0.240, srtt = 0.224, rttvar = 0.033, rto = 2.000\nrecv   22\nupdated rto\nsend   23: rtt = 0.249, srtt = 0.227, rttvar = 0.031, rto = 2.000\nrecv   23\nupdated rto\nsend   24: rtt = 0.230, srtt = 0.227, rttvar = 0.024, rto = 2.000\nrecv   24\nupdated rto\nsend   25: rtt = 0.240, srtt = 0.229, rttvar = 0.021, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   25: rtt = 0.240, srtt = 0.229, rttvar = 0.021, rto = 4.000\nrecv   25\nupdated rto\nsend   26: rtt = 0.190, srtt = 0.224, rttvar = 0.026, rto = 2.000\nrecv   26\nupdated rto\nsend   27: rtt = 0.220, srtt = 0.224, rttvar = 0.020, rto = 2.000\nrecv   27\nupdated rto\nsend   28: rtt = 0.259, srtt = 0.228, rttvar = 0.024, rto = 2.000\nrecv   28\nupdated rto\nsend   29: rtt = 0.243, srtt = 0.230, rttvar = 0.022, rto = 2.000\nrecv   29\nupdated rto\nsend   30: rtt = 0.257, srtt = 0.233, rttvar = 0.023, rto = 2.000\nrecv   30\nupdated rto\nsend   31: rtt = 0.260, srtt = 0.237, rttvar = 0.024, rto = 2.000\nrecv   31\nupdated rto\nsend   32: rtt = 0.240, srtt = 0.237, rttvar = 0.019, rto = 2.000\nrecv   32\nupdated rto\nsend   33: rtt = 0.240, srtt = 0.237, rttvar = 0.015, rto = 2.000\nrecv   33\nupdated rto\nsend   34: rtt = 0.249, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv   34\nupdated rto\nsend   35: rtt = 0.210, srtt = 0.235, rttvar = 0.018, rto = 2.000\nrecv   35\nupdated rto\nsend   36: rtt = 0.239, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv   36\nupdated rto\nsend   37: rtt = 0.240, srtt = 0.236, rttvar = 0.012, rto = 2.000\nrecv   37\nupdated rto\nsend   38: rtt = 0.260, srtt = 0.239, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   38: rtt = 0.260, srtt = 0.239, rttvar = 0.015, rto = 4.000\nrecv   38\nupdated rto\nsend   39: rtt = 0.220, srtt = 0.237, rttvar = 0.016, rto = 2.000\nrecv   39\nupdated rto\nsend   40: rtt = 0.230, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv   40\nupdated rto\nsend   41: rtt = 0.250, srtt = 0.238, rttvar = 0.014, rto = 2.000\nrecv   41\nupdated rto\nsend   42: rtt = 0.240, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv   42\nupdated rto\nsend   43: rtt = 0.240, srtt = 0.238, rttvar = 0.009, rto = 2.000\nrecv   43\nupdated rto\nsend   44: rtt = 0.210, srtt = 0.235, rttvar = 0.014, rto = 2.000\nrecv   44\nupdated rto\nsend   45: rtt = 0.240, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv   45\nupdated rto\nsend   46: rtt = 0.239, srtt = 0.236, rttvar = 0.010, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   46: rtt = 0.239, srtt = 0.236, rttvar = 0.010, rto = 4.000\nrecv   46\nupdated rto\nsend   47: rtt = 0.240, srtt = 0.236, rttvar = 0.008, rto = 2.000\nrecv   47\nupdated rto\nsend   48: rtt = 0.250, srtt = 0.238, rttvar = 0.010, rto = 2.000\nrecv   48\nupdated rto\nsend   49: rtt = 0.239, srtt = 0.238, rttvar = 0.007, rto = 2.000\nrecv   49\nupdated rto\nsend   50: rtt = 0.220, srtt = 0.236, rttvar = 0.010, rto = 2.000\nrecv   50\nupdated rto\nsend   51: rtt = 0.229, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv   51\nupdated rto\nsend   52: rtt = 0.210, srtt = 0.232, rttvar = 0.013, rto = 2.000\nrecv   52\nupdated rto\nsend   53: rtt = 0.259, srtt = 0.235, rttvar = 0.017, rto = 2.000\nrecv   53\nupdated rto\nsend   54: rtt = 0.240, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv   54\nupdated rto\nsend   55: rtt = 0.260, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv   55\nupdated rto\nsend   56: rtt = 0.249, srtt = 0.240, rttvar = 0.015, rto = 2.000\nrecv   56\nupdated rto\nsend   57: rtt = 0.249, srtt = 0.241, rttvar = 0.013, rto = 2.000\nrecv   57\nupdated rto\nsend   58: rtt = 0.240, srtt = 0.241, rttvar = 0.010, rto = 2.000\nrecv   58\nupdated rto\nsend   59: rtt = 0.209, srtt = 0.237, rttvar = 0.016, rto = 2.000\nrecv   59\nupdated rto\nsend   60: rtt = 0.190, srtt = 0.231, rttvar = 0.024, rto = 2.000\nrecv   60\nupdated rto\nsend   61: rtt = 0.230, srtt = 0.231, rttvar = 0.018, rto = 2.000\nrecv   61\nupdated rto\nsend   62: rtt = 0.229, srtt = 0.231, rttvar = 0.014, rto = 2.000\nrecv   62\nupdated rto\nsend   63: rtt = 0.229, srtt = 0.231, rttvar = 0.011, rto = 2.000\nrecv   63\nupdated rto\nsend   64: rtt = 0.210, srtt = 0.228, rttvar = 0.013, rto = 2.000\nrecv   64\nupdated rto\nsend   65: rtt = 0.230, srtt = 0.228, rttvar = 0.011, rto = 2.000\nrecv   65\nupdated rto\nsend   66: rtt = 0.200, srtt = 0.225, rttvar = 0.015, rto = 2.000\nrecv   66\nupdated rto\nsend   67: rtt = 0.240, srtt = 0.227, rttvar = 0.015, rto = 2.000\nrecv   67\nupdated rto\nsend   68: rtt = 0.260, srtt = 0.231, rttvar = 0.020, rto = 2.000\nrecv   68\nupdated rto\nsend   69: rtt = 0.240, srtt = 0.232, rttvar = 0.017, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   69: rtt = 0.240, srtt = 0.232, rttvar = 0.017, rto = 4.000\nrecv   69\nupdated rto\nsend   70: rtt = 0.200, srtt = 0.228, rttvar = 0.021, rto = 2.000\nrecv   70\nupdated rto\nsend   71: rtt = 0.250, srtt = 0.231, rttvar = 0.021, rto = 2.000\nrecv   71\nupdated rto\nsend   72: rtt = 0.220, srtt = 0.229, rttvar = 0.018, rto = 2.000\nrecv   72\nupdated rto\nsend   73: rtt = 0.239, srtt = 0.231, rttvar = 0.016, rto = 2.000\nrecv   73\nupdated rto\nsend   74: rtt = 0.229, srtt = 0.230, rttvar = 0.013, rto = 2.000\nrecv   74\nupdated rto\nsend   75: rtt = 0.210, srtt = 0.228, rttvar = 0.015, rto = 2.000\nrecv   75\nupdated rto\nsend   76: rtt = 0.199, srtt = 0.224, rttvar = 0.018, rto = 2.000\nrecv   76\nupdated rto\nsend   77: rtt = 0.250, srtt = 0.227, rttvar = 0.020, rto = 2.000\nrecv   77\nupdated rto\nsend   78: rtt = 0.199, srtt = 0.224, rttvar = 0.022, rto = 2.000\nrecv   78\nupdated rto\nsend   79: rtt = 0.249, srtt = 0.227, rttvar = 0.023, rto = 2.000\nrecv   79\nupdated rto\nsend   80: rtt = 0.239, srtt = 0.229, rttvar = 0.020, rto = 2.000\nrecv   80\nupdated rto\nsend   81: rtt = 0.230, srtt = 0.229, rttvar = 0.015, rto = 2.000\nrecv   81\nupdated rto\nsend   82: rtt = 0.259, srtt = 0.232, rttvar = 0.019, rto = 2.000\nrecv   82\nupdated rto\nsend   83: rtt = 0.240, srtt = 0.233, rttvar = 0.016, rto = 2.000\nrecv   83\nupdated rto\nsend   84: rtt = 0.240, srtt = 0.234, rttvar = 0.014, rto = 2.000\nrecv   84\nupdated rto\nsend   85: rtt = 0.250, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv   85\nupdated rto\nsend   86: rtt = 0.230, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv   86\nupdated rto\nsend   87: rtt = 0.259, srtt = 0.238, rttvar = 0.015, rto = 2.000\nrecv   87\nupdated rto\nsend   88: rtt = 0.220, srtt = 0.236, rttvar = 0.016, rto = 2.000\nrecv   88\nupdated rto\nsend   89: rtt = 0.239, srtt = 0.236, rttvar = 0.013, rto = 2.000\nrecv   89\nupdated rto\nsend   90: rtt = 0.250, srtt = 0.238, rttvar = 0.013, rto = 2.000\nrecv   90\nupdated rto\nsend   91: rtt = 0.230, srtt = 0.237, rttvar = 0.012, rto = 2.000\nrecv   91\nupdated rto\nsend   92: rtt = 0.219, srtt = 0.235, rttvar = 0.013, rto = 2.000\nrecv   92\nupdated rto\nsend   93: rtt = 0.220, srtt = 0.233, rttvar = 0.014, rto = 2.000\nrecv   93\nupdated rto\nsend   94: rtt = 0.229, srtt = 0.233, rttvar = 0.011, rto = 2.000\nrecv   94\nupdated rto\nsend   95: rtt = 0.239, srtt = 0.233, rttvar = 0.010, rto = 2.000\nrecv   95\nupdated rto\nsend   96: rtt = 0.250, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv   96\nupdated rto\nsend   97: rtt = 0.250, srtt = 0.237, rttvar = 0.012, rto = 2.000\nrecv   97\nupdated rto\nsend   98: rtt = 0.220, srtt = 0.235, rttvar = 0.014, rto = 2.000\nrecv   98\nupdated rto\nsend   99: rtt = 0.230, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv   99\nupdated rto\nsend  100: rtt = 0.249, srtt = 0.236, rttvar = 0.012, rto = 2.000\nrecv  100\nupdated rto\nsend  101: rtt = 0.240, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  101\nupdated rto\nsend  102: rtt = 0.239, srtt = 0.237, rttvar = 0.008, rto = 2.000\nrecv  102\nupdated rto\nsend  103: rtt = 0.249, srtt = 0.239, rttvar = 0.009, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  103: rtt = 0.249, srtt = 0.239, rttvar = 0.009, rto = 4.000\nrecv  103\nupdated rto\nsend  104: rtt = 0.250, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv  104\nupdated rto\nsend  105: rtt = 0.260, srtt = 0.242, rttvar = 0.012, rto = 2.000\nrecv  105\nupdated rto\nsend  106: rtt = 0.250, srtt = 0.243, rttvar = 0.011, rto = 2.000\nrecv  106\nupdated rto\nsend  107: rtt = 0.241, srtt = 0.243, rttvar = 0.009, rto = 2.000\nrecv  107\nupdated rto\nsend  108: rtt = 0.248, srtt = 0.244, rttvar = 0.008, rto = 2.000\nrecv  108\nupdated rto\nsend  109: rtt = 0.249, srtt = 0.244, rttvar = 0.007, rto = 2.000\nrecv  109\nupdated rto\nsend  110: rtt = 0.240, srtt = 0.244, rttvar = 0.007, rto = 2.000\nrecv  110\nupdated rto\nsend  111: rtt = 0.259, srtt = 0.246, rttvar = 0.009, rto = 2.000\nrecv  111\nupdated rto\nsend  112: rtt = 0.310, srtt = 0.254, rttvar = 0.023, rto = 2.000\nrecv  112\nupdated rto\nsend  113: rtt = 0.250, srtt = 0.253, rttvar = 0.018, rto = 2.000\nrecv  113\nupdated rto\nsend  114: rtt = 0.250, srtt = 0.253, rttvar = 0.014, rto = 2.000\nrecv  114\nupdated rto\nsend  115: rtt = 0.230, srtt = 0.250, rttvar = 0.016, rto = 2.000\nrecv  115\nupdated rto\nsend  116: rtt = 0.220, srtt = 0.246, rttvar = 0.020, rto = 2.000\nrecv  116\nupdated rto\nsend  117: rtt = 0.230, srtt = 0.244, rttvar = 0.019, rto = 2.000\nrecv  117\nupdated rto\nsend  118: rtt = 0.240, srtt = 0.244, rttvar = 0.015, rto = 2.000\nrecv  118\nupdated rto\nsend  119: rtt = 0.240, srtt = 0.243, rttvar = 0.012, rto = 2.000\nrecv  119\nupdated rto\nsend  120: rtt = 0.250, srtt = 0.244, rttvar = 0.011, rto = 2.000\nrecv  120\nupdated rto\nsend  121: rtt = 0.250, srtt = 0.245, rttvar = 0.010, rto = 2.000\nrecv  121\nupdated rto\nsend  122: rtt = 0.220, srtt = 0.242, rttvar = 0.013, rto = 2.000\nrecv  122\nupdated rto\nsend  123: rtt = 0.219, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv  123\nupdated rto\nsend  124: rtt = 0.219, srtt = 0.236, rttvar = 0.017, rto = 2.000\nrecv  124\nupdated rto\nsend  125: rtt = 0.240, srtt = 0.237, rttvar = 0.014, rto = 2.000\nrecv  125\nupdated rto\nsend  126: rtt = 0.220, srtt = 0.235, rttvar = 0.014, rto = 2.000\nrecv  126\nupdated rto\nsend  127: rtt = 0.230, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv  127\nupdated rto\nsend  128: rtt = 0.229, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  128\nupdated rto\nsend  129: rtt = 0.239, srtt = 0.234, rttvar = 0.009, rto = 2.000\nrecv  129\nupdated rto\nsend  130: rtt = 0.230, srtt = 0.234, rttvar = 0.008, rto = 2.000\nrecv  130\nupdated rto\nsend  131: rtt = 0.259, srtt = 0.237, rttvar = 0.012, rto = 2.000\nrecv  131\nupdated rto\nsend  132: rtt = 0.230, srtt = 0.236, rttvar = 0.011, rto = 2.000\nrecv  132\nupdated rto\nsend  133: rtt = 0.249, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  133\nupdated rto\nsend  134: rtt = 0.250, srtt = 0.239, rttvar = 0.012, rto = 2.000\nrecv  134\nupdated rto\nsend  135: rtt = 0.240, srtt = 0.239, rttvar = 0.009, rto = 2.000\nrecv  135\nupdated rto\nsend  136: rtt = 0.248, srtt = 0.240, rttvar = 0.009, rto = 2.000\nrecv  136\nupdated rto\nsend  137: rtt = 0.200, srtt = 0.235, rttvar = 0.017, rto = 2.000\nrecv  137\nupdated rto\nsend  138: rtt = 0.260, srtt = 0.238, rttvar = 0.019, rto = 2.000\nrecv  138\nupdated rto\nsend  139: rtt = 0.230, srtt = 0.237, rttvar = 0.016, rto = 2.000\nrecv  139\nupdated rto\nsend  140: rtt = 0.230, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv  140\nupdated rto\nsend  141: rtt = 0.230, srtt = 0.236, rttvar = 0.012, rto = 2.000\nrecv  141\nupdated rto\nsend  142: rtt = 0.349, srtt = 0.250, rttvar = 0.037, rto = 2.000\nrecv  142\nupdated rto\nsend  143: rtt = 0.230, srtt = 0.247, rttvar = 0.033, rto = 2.000\nrecv  143\nupdated rto\nsend  144: rtt = 0.230, srtt = 0.245, rttvar = 0.029, rto = 2.000\nrecv  144\nupdated rto\nsend  145: rtt = 0.250, srtt = 0.246, rttvar = 0.023, rto = 2.000\nrecv  145\nupdated rto\nsend  146: rtt = 0.239, srtt = 0.245, rttvar = 0.019, rto = 2.000\nrecv  146\nupdated rto\nsend  147: rtt = 0.220, srtt = 0.242, rttvar = 0.020, rto = 2.000\nrecv  147\nupdated rto\nsend  148: rtt = 0.240, srtt = 0.242, rttvar = 0.016, rto = 2.000\nrecv  148\nupdated rto\nsend  149: rtt = 0.240, srtt = 0.241, rttvar = 0.012, rto = 2.000\nrecv  149\nupdated rto\nsend  150: rtt = 0.249, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  150\nupdated rto\nsend  151: rtt = 0.219, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv  151\nupdated rto\nsend  152: rtt = 0.220, srtt = 0.237, rttvar = 0.015, rto = 2.000\nrecv  152\nupdated rto\nsend  153: rtt = 0.229, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv  153\nupdated rto\nsend  154: rtt = 0.260, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv  154\nupdated rto\nsend  155: rtt = 0.259, srtt = 0.241, rttvar = 0.017, rto = 2.000\nrecv  155\nupdated rto\nsend  156: rtt = 0.260, srtt = 0.244, rttvar = 0.017, rto = 2.000\nrecv  156\nupdated rto\nsend  157: rtt = 0.239, srtt = 0.243, rttvar = 0.014, rto = 2.000\nrecv  157\nupdated rto\nsend  158: rtt = 0.249, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  158\nupdated rto\nsend  159: rtt = 0.229, srtt = 0.242, rttvar = 0.013, rto = 2.000\nrecv  159\nupdated rto\nsend  160: rtt = 0.220, srtt = 0.239, rttvar = 0.015, rto = 2.000\nrecv  160\nupdated rto\nsend  161: rtt = 0.240, srtt = 0.239, rttvar = 0.012, rto = 2.000\nrecv  161\nupdated rto\nsend  162: rtt = 0.230, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  162\nupdated rto\nsend  163: rtt = 0.230, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  163\nupdated rto\nsend  164: rtt = 0.239, srtt = 0.237, rttvar = 0.008, rto = 2.000\nrecv  164\nupdated rto\nsend  165: rtt = 0.269, srtt = 0.241, rttvar = 0.014, rto = 2.000\nrecv  165\nupdated rto\nsend  166: rtt = 0.220, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv  166\nupdated rto\nsend  167: rtt = 0.219, srtt = 0.236, rttvar = 0.017, rto = 2.000\nrecv  167\nupdated rto\nsend  168: rtt = 0.220, srtt = 0.234, rttvar = 0.017, rto = 2.000\nrecv  168\nupdated rto\nsend  169: rtt = 0.220, srtt = 0.232, rttvar = 0.016, rto = 2.000\nrecv  169\nupdated rto\nsend  170: rtt = 0.240, srtt = 0.233, rttvar = 0.014, rto = 2.000\nrecv  170\nupdated rto\nsend  171: rtt = 0.239, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv  171\nupdated rto\nsend  172: rtt = 0.240, srtt = 0.235, rttvar = 0.010, rto = 2.000\nrecv  172\nupdated rto\nsend  173: rtt = 0.240, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  173\nupdated rto\nsend  174: rtt = 0.240, srtt = 0.236, rttvar = 0.008, rto = 2.000\nrecv  174\nupdated rto\nsend  175: rtt = 0.229, srtt = 0.235, rttvar = 0.008, rto = 2.000\nrecv  175\nupdated rto\nsend  176: rtt = 0.199, srtt = 0.231, rttvar = 0.015, rto = 2.000\nrecv  176\nupdated rto\nsend  177: rtt = 0.249, srtt = 0.233, rttvar = 0.016, rto = 2.000\nrecv  177\nupdated rto\nsend  178: rtt = 0.239, srtt = 0.234, rttvar = 0.013, rto = 2.000\nrecv  178\nupdated rto\nsend  179: rtt = 0.220, srtt = 0.232, rttvar = 0.013, rto = 2.000\nrecv  179\nupdated rto\nsend  180: rtt = 0.240, srtt = 0.233, rttvar = 0.012, rto = 2.000\nrecv  180\nupdated rto\nsend  181: rtt = 0.219, srtt = 0.231, rttvar = 0.013, rto = 2.000\nrecv  181\nupdated rto\nsend  182: rtt = 0.240, srtt = 0.232, rttvar = 0.012, rto = 2.000\nrecv  182\nupdated rto\nsend  183: rtt = 0.240, srtt = 0.233, rttvar = 0.011, rto = 2.000\nrecv  183\nupdated rto\nsend  184: rtt = 0.230, srtt = 0.233, rttvar = 0.009, rto = 2.000\nrecv  184\nupdated rto\nsend  185: rtt = 0.240, srtt = 0.234, rttvar = 0.008, rto = 2.000\nrecv  185\nupdated rto\nsend  186: rtt = 0.230, srtt = 0.233, rttvar = 0.007, rto = 2.000\nrecv  186\nupdated rto\nsend  187: rtt = 0.240, srtt = 0.234, rttvar = 0.007, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  187: rtt = 0.240, srtt = 0.234, rttvar = 0.007, rto = 4.000\nrecv  187\nupdated rto\nsend  188: rtt = 0.229, srtt = 0.233, rttvar = 0.007, rto = 2.000\nrecv  188\nupdated rto\nsend  189: rtt = 0.250, srtt = 0.236, rttvar = 0.009, rto = 2.000\nrecv  189\nupdated rto\nsend  190: rtt = 0.248, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  190\nupdated rto\nsend  191: rtt = 0.230, srtt = 0.236, rttvar = 0.009, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  191: rtt = 0.230, srtt = 0.236, rttvar = 0.009, rto = 4.000\nrecv  191\nupdated rto\nsend  192: rtt = 0.230, srtt = 0.235, rttvar = 0.008, rto = 2.000\nrecv  192\nupdated rto\nsend  193: rtt = 0.230, srtt = 0.235, rttvar = 0.008, rto = 2.000\nrecv  193\nupdated rto\nsend  194: rtt = 0.200, srtt = 0.230, rttvar = 0.014, rto = 2.000\nrecv  194\nupdated rto\nsend  195: rtt = 0.210, srtt = 0.228, rttvar = 0.016, rto = 2.000\nrecv  195\nupdated rto\nsend  196: rtt = 0.200, srtt = 0.224, rttvar = 0.019, rto = 2.000\nrecv  196\nupdated rto\nsend  197: rtt = 0.209, srtt = 0.222, rttvar = 0.018, rto = 2.000\nrecv  197\nupdated rto\nsend  198: rtt = 0.200, srtt = 0.220, rttvar = 0.019, rto = 2.000\nrecv  198\nupdated rto\nsend  199: rtt = 0.231, srtt = 0.221, rttvar = 0.017, rto = 2.000\nrecv  199\nupdated rto\nsend  200: rtt = 0.247, srtt = 0.224, rttvar = 0.019, rto = 2.000\nrecv  200\nupdated rto\nsend  201: rtt = 0.240, srtt = 0.226, rttvar = 0.018, rto = 2.000\nrecv  201\nupdated rto\nsend  202: rtt = 0.220, srtt = 0.225, rttvar = 0.015, rto = 2.000\nrecv  202\nupdated rto\nsend  203: rtt = 0.200, srtt = 0.222, rttvar = 0.018, rto = 2.000\nrecv  203\nupdated rto\nsend  204: rtt = 0.210, srtt = 0.221, rttvar = 0.017, rto = 2.000\nrecv  204\nupdated rto\nsend  205: rtt = 0.200, srtt = 0.218, rttvar = 0.018, rto = 2.000\nrecv  205\nupdated rto\nsend  206: rtt = 0.230, srtt = 0.220, rttvar = 0.016, rto = 2.000\nrecv  206\nupdated rto\nsend  207: rtt = 0.250, srtt = 0.223, rttvar = 0.020, rto = 2.000\nrecv  207\nupdated rto\nsend  208: rtt = 0.239, srtt = 0.225, rttvar = 0.019, rto = 2.000\nrecv  208\nupdated rto\nsend  209: rtt = 0.230, srtt = 0.226, rttvar = 0.015, rto = 2.000\nrecv  209\nupdated rto\nsend  210: rtt = 0.249, srtt = 0.229, rttvar = 0.017, rto = 2.000\nrecv  210\nupdated rto\nsend  211: rtt = 0.230, srtt = 0.229, rttvar = 0.013, rto = 2.000\nrecv  211\nupdated rto\nsend  212: rtt = 0.240, srtt = 0.230, rttvar = 0.013, rto = 2.000\nrecv  212\nupdated rto\nsend  213: rtt = 0.240, srtt = 0.232, rttvar = 0.012, rto = 2.000\nrecv  213\nupdated rto\nsend  214: rtt = 0.218, srtt = 0.230, rttvar = 0.012, rto = 2.000\nrecv  214\nupdated rto\nsend  215: rtt = 0.229, srtt = 0.230, rttvar = 0.009, rto = 2.000\nrecv  215\nupdated rto\nsend  216: rtt = 0.230, srtt = 0.230, rttvar = 0.007, rto = 2.000\nrecv  216\nupdated rto\nsend  217: rtt = 0.250, srtt = 0.232, rttvar = 0.010, rto = 2.000\nrecv  217\nupdated rto\nsend  218: rtt = 0.229, srtt = 0.232, rttvar = 0.009, rto = 2.000\nrecv  218\nupdated rto\nsend  219: rtt = 0.229, srtt = 0.232, rttvar = 0.007, rto = 2.000\nrecv  219\nupdated rto\nsend  220: rtt = 0.220, srtt = 0.230, rttvar = 0.008, rto = 2.000\nrecv  220\nupdated rto\nsend  221: rtt = 0.220, srtt = 0.229, rttvar = 0.009, rto = 2.000\nrecv  221\nupdated rto\nsend  222: rtt = 0.240, srtt = 0.230, rttvar = 0.009, rto = 2.000\nrecv  222\nupdated rto\nsend  223: rtt = 0.240, srtt = 0.231, rttvar = 0.009, rto = 2.000\nrecv  223\nupdated rto\nsend  224: rtt = 0.249, srtt = 0.234, rttvar = 0.011, rto = 2.000\nrecv  224\nupdated rto\nsend  225: rtt = 0.239, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  225\nupdated rto\nsend  226: rtt = 0.240, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  226\nupdated rto\nsend  227: rtt = 0.279, srtt = 0.241, rttvar = 0.018, rto = 2.000\nrecv  227\nupdated rto\nsend  228: rtt = 0.229, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv  228\nupdated rto\nsend  229: rtt = 0.229, srtt = 0.238, rttvar = 0.015, rto = 2.000\nrecv  229\nupdated rto\nsend  230: rtt = 0.239, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  230\nupdated rto\nsend  231: rtt = 0.239, srtt = 0.238, rttvar = 0.009, rto = 2.000\nrecv  231\nupdated rto\nsend  232: rtt = 0.250, srtt = 0.240, rttvar = 0.009, rto = 2.000\nrecv  232\nupdated rto\nsend  233: rtt = 0.249, srtt = 0.241, rttvar = 0.009, rto = 2.000\nrecv  233\nupdated rto\nsend  234: rtt = 0.239, srtt = 0.241, rttvar = 0.008, rto = 2.000\nrecv  234\nupdated rto\nsend  235: rtt = 0.240, srtt = 0.240, rttvar = 0.006, rto = 2.000\nrecv  235\nupdated rto\nsend  236: rtt = 0.230, srtt = 0.239, rttvar = 0.007, rto = 2.000\nrecv  236\nupdated rto\nsend  237: rtt = 0.240, srtt = 0.239, rttvar = 0.005, rto = 2.000\nrecv  237\nupdated rto\nsend  238: rtt = 0.219, srtt = 0.237, rttvar = 0.009, rto = 2.000\nrecv  238\nupdated rto\nsend  239: rtt = 0.199, srtt = 0.232, rttvar = 0.016, rto = 2.000\nrecv  239\nupdated rto\nsend  240: rtt = 0.220, srtt = 0.231, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  240: rtt = 0.220, srtt = 0.231, rttvar = 0.015, rto = 4.000\ndgsendrecv: timeout, retransmitting\nsend  240: rtt = 0.220, srtt = 0.231, rttvar = 0.015, rto = 8.000\nrecv  240\nupdated rto\nsend  241: rtt = 0.210, srtt = 0.228, rttvar = 0.017, rto = 2.000\nrecv  241\nupdated rto\nsend  242: rtt = 0.250, srtt = 0.231, rttvar = 0.018, rto = 2.000\nrecv  242\nupdated rto\nsend  243: rtt = 0.240, srtt = 0.232, rttvar = 0.016, rto = 2.000\nrecv  243\nupdated rto\nsend  244: rtt = 0.242, srtt = 0.233, rttvar = 0.014, rto = 2.000\nrecv  244\nupdated rto\nsend  245: rtt = 0.237, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv  245\nupdated rto\nsend  246: rtt = 0.250, srtt = 0.236, rttvar = 0.013, rto = 2.000\nrecv  246\nupdated rto\nsend  247: rtt = 0.221, srtt = 0.234, rttvar = 0.013, rto = 2.000\nrecv  247\nupdated rto\nsend  248: rtt = 0.229, srtt = 0.233, rttvar = 0.011, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  248: rtt = 0.229, srtt = 0.233, rttvar = 0.011, rto = 4.000\nrecv  248\nupdated rto\nsend  249: rtt = 0.270, srtt = 0.238, rttvar = 0.018, rto = 2.000\nrecv  249\nupdated rto\nsend  250: rtt = 0.260, srtt = 0.241, rttvar = 0.019, rto = 2.000\nrecv  250\nupdated rto\nsend  251: rtt = 0.240, srtt = 0.241, rttvar = 0.014, rto = 2.000\nrecv  251\nupdated rto\nsend  252: rtt = 0.229, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv  252\nupdated rto\nsend  253: rtt = 0.230, srtt = 0.238, rttvar = 0.012, rto = 2.000\nrecv  253\nupdated rto\nsend  254: rtt = 0.240, srtt = 0.238, rttvar = 0.010, rto = 2.000\nrecv  254\nupdated rto\nsend  255: rtt = 0.229, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  255\nupdated rto\nsend  256: rtt = 0.230, srtt = 0.236, rttvar = 0.009, rto = 2.000\nrecv  256\nupdated rto\nsend  257: rtt = 0.269, srtt = 0.240, rttvar = 0.015, rto = 2.000\nrecv  257\nupdated rto\nsend  258: rtt = 0.219, srtt = 0.238, rttvar = 0.017, rto = 2.000\nrecv  258\nupdated rto\nsend  259: rtt = 0.239, srtt = 0.238, rttvar = 0.013, rto = 2.000\nrecv  259\nupdated rto\nsend  260: rtt = 0.229, srtt = 0.237, rttvar = 0.012, rto = 2.000\nrecv  260\nupdated rto\nsend  261: rtt = 0.219, srtt = 0.234, rttvar = 0.013, rto = 2.000\nrecv  261\nupdated rto\nsend  262: rtt = 0.260, srtt = 0.238, rttvar = 0.016, rto = 2.000\nrecv  262\nupdated rto\nsend  263: rtt = 0.260, srtt = 0.240, rttvar = 0.018, rto = 2.000\nrecv  263\nupdated rto\nsend  264: rtt = 0.240, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv  264\nupdated rto\nsend  265: rtt = 0.220, srtt = 0.238, rttvar = 0.015, rto = 2.000\nrecv  265\nupdated rto\nsend  266: rtt = 0.250, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv  266\nupdated rto\nsend  267: rtt = 0.250, srtt = 0.241, rttvar = 0.013, rto = 2.000\nrecv  267\nupdated rto\nsend  268: rtt = 0.230, srtt = 0.239, rttvar = 0.013, rto = 2.000\nrecv  268\nupdated rto\nsend  269: rtt = 0.249, srtt = 0.241, rttvar = 0.012, rto = 2.000\nrecv  269\nupdated rto\nsend  270: rtt = 0.250, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  270\nupdated rto\nsend  271: rtt = 0.279, srtt = 0.246, rttvar = 0.018, rto = 2.000\nrecv  271\nupdated rto\nsend  272: rtt = 0.220, srtt = 0.243, rttvar = 0.020, rto = 2.000\nrecv  272\nupdated rto\nsend  273: rtt = 0.230, srtt = 0.241, rttvar = 0.018, rto = 2.000\nrecv  273\nupdated rto\nsend  274: rtt = 0.229, srtt = 0.240, rttvar = 0.017, rto = 2.000\nrecv  274\nupdated rto\nsend  275: rtt = 0.270, srtt = 0.244, rttvar = 0.020, rto = 2.000\nrecv  275\nupdated rto\nsend  276: rtt = 0.260, srtt = 0.246, rttvar = 0.019, rto = 2.000\nrecv  276\nupdated rto\nsend  277: rtt = 0.220, srtt = 0.242, rttvar = 0.021, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  277: rtt = 0.220, srtt = 0.242, rttvar = 0.021, rto = 4.000\nrecv  277\nupdated rto\nsend  278: rtt = 0.250, srtt = 0.243, rttvar = 0.017, rto = 2.000\nrecv  278\nupdated rto\nsend  279: rtt = 0.240, srtt = 0.243, rttvar = 0.014, rto = 2.000\nrecv  279\nupdated rto\nsend  280: rtt = 0.249, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  280\nupdated rto\nsend  281: rtt = 0.211, srtt = 0.240, rttvar = 0.017, rto = 2.000\nrecv  281\nupdated rto\nsend  282: rtt = 0.240, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv  282\nupdated rto\nsend  283: rtt = 0.210, srtt = 0.236, rttvar = 0.017, rto = 2.000\nrecv  283\nupdated rto\nsend  284: rtt = 0.240, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv  284\nupdated rto\nsend  285: rtt = 0.199, srtt = 0.232, rttvar = 0.020, rto = 2.000\nrecv  285\nupdated rto\nsend  286: rtt = 0.239, srtt = 0.233, rttvar = 0.017, rto = 2.000\nrecv  286\nupdated rto\nsend  287: rtt = 0.230, srtt = 0.232, rttvar = 0.013, rto = 2.000\nrecv  287\nupdated rto\nsend  288: rtt = 0.229, srtt = 0.232, rttvar = 0.011, rto = 2.000\nrecv  288\nupdated rto\nsend  289: rtt = 0.250, srtt = 0.234, rttvar = 0.013, rto = 2.000\nrecv  289\nupdated rto\nsend  290: rtt = 0.239, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv  290\nupdated rto\nsend  291: rtt = 0.230, srtt = 0.234, rttvar = 0.009, rto = 2.000\nrecv  291\nupdated rto\nsend  292: rtt = 0.239, srtt = 0.235, rttvar = 0.008, rto = 2.000\nrecv  292\nupdated rto\nsend  293: rtt = 0.240, srtt = 0.235, rttvar = 0.007, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  293: rtt = 0.240, srtt = 0.235, rttvar = 0.007, rto = 4.000\nrecv  293\nupdated rto\nsend  294: rtt = 0.220, srtt = 0.234, rttvar = 0.009, rto = 2.000\nrecv  294\nupdated rto\nsend  295: rtt = 0.240, srtt = 0.234, rttvar = 0.009, rto = 2.000\nrecv  295\nupdated rto\nsend  296: rtt = 0.219, srtt = 0.232, rttvar = 0.010, rto = 2.000\nrecv  296\nupdated rto\nsend  297: rtt = 0.230, srtt = 0.232, rttvar = 0.008, rto = 2.000\nrecv  297\nupdated rto\nsend  298: rtt = 0.240, srtt = 0.233, rttvar = 0.008, rto = 2.000\nrecv  298\nupdated rto\nsend  299: rtt = 0.240, srtt = 0.234, rttvar = 0.008, rto = 2.000\nrecv  299\nupdated rto\nsend  300: rtt = 0.259, srtt = 0.237, rttvar = 0.012, rto = 2.000\nrecv  300\nupdated rto\nsend  301: rtt = 0.230, srtt = 0.236, rttvar = 0.011, rto = 2.000\nrecv  301\nupdated rto\nsend  302: rtt = 0.230, srtt = 0.235, rttvar = 0.010, rto = 2.000\nrecv  302\nupdated rto\nsend  303: rtt = 0.240, srtt = 0.236, rttvar = 0.008, rto = 2.000\nrecv  303\nupdated rto\nsend  304: rtt = 0.250, srtt = 0.238, rttvar = 0.010, rto = 2.000\nrecv  304\nupdated rto\nsend  305: rtt = 0.230, srtt = 0.237, rttvar = 0.009, rto = 2.000\nrecv  305\nupdated rto\nsend  306: rtt = 0.230, srtt = 0.236, rttvar = 0.009, rto = 2.000\nrecv  306\nupdated rto\nsend  307: rtt = 0.209, srtt = 0.233, rttvar = 0.013, rto = 2.000\nrecv  307\nupdated rto\nsend  308: rtt = 0.232, srtt = 0.232, rttvar = 0.010, rto = 2.000\nrecv  308\nupdated rto\nsend  309: rtt = 0.247, srtt = 0.234, rttvar = 0.011, rto = 2.000\nrecv  309\nupdated rto\nsend  310: rtt = 0.250, srtt = 0.236, rttvar = 0.012, rto = 2.000\nrecv  310\nupdated rto\nsend  311: rtt = 0.229, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv  311\nupdated rto\nsend  312: rtt = 0.230, srtt = 0.235, rttvar = 0.010, rto = 2.000\nrecv  312\nupdated rto\nsend  313: rtt = 0.210, srtt = 0.232, rttvar = 0.013, rto = 2.000\nrecv  313\nupdated rto\nsend  314: rtt = 0.249, srtt = 0.234, rttvar = 0.014, rto = 2.000\nrecv  314\nupdated rto\nsend  315: rtt = 0.220, srtt = 0.232, rttvar = 0.014, rto = 2.000\nrecv  315\nupdated rto\nsend  316: rtt = 0.249, srtt = 0.234, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  316: rtt = 0.249, srtt = 0.234, rttvar = 0.015, rto = 4.000\nrecv  316\nupdated rto\nsend  317: rtt = 0.230, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv  317\nupdated rto\nsend  318: rtt = 0.229, srtt = 0.233, rttvar = 0.010, rto = 2.000\nrecv  318\nupdated rto\nsend  319: rtt = 0.229, srtt = 0.233, rttvar = 0.009, rto = 2.000\nrecv  319\nupdated rto\nsend  320: rtt = 0.230, srtt = 0.232, rttvar = 0.007, rto = 2.000\nrecv  320\nupdated rto\nsend  321: rtt = 0.250, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  321\nupdated rto\nsend  322: rtt = 0.249, srtt = 0.236, rttvar = 0.011, rto = 2.000\nrecv  322\nupdated rto\nsend  323: rtt = 0.230, srtt = 0.235, rttvar = 0.010, rto = 2.000\nrecv  323\nupdated rto\nsend  324: rtt = 0.220, srtt = 0.234, rttvar = 0.011, rto = 2.000\nrecv  324\nupdated rto\nsend  325: rtt = 0.229, srtt = 0.233, rttvar = 0.010, rto = 2.000\nrecv  325\nupdated rto\nsend  326: rtt = 0.250, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv  326\nupdated rto\nsend  327: rtt = 0.220, srtt = 0.233, rttvar = 0.012, rto = 2.000\nrecv  327\nupdated rto\nsend  328: rtt = 0.210, srtt = 0.230, rttvar = 0.015, rto = 2.000\nrecv  328\nupdated rto\nsend  329: rtt = 0.229, srtt = 0.230, rttvar = 0.012, rto = 2.000\nrecv  329\nupdated rto\nsend  330: rtt = 0.210, srtt = 0.228, rttvar = 0.014, rto = 2.000\nrecv  330\nupdated rto\nsend  331: rtt = 0.220, srtt = 0.227, rttvar = 0.012, rto = 2.000\nrecv  331\nupdated rto\nsend  332: rtt = 0.220, srtt = 0.226, rttvar = 0.011, rto = 2.000\nrecv  332\nupdated rto\nsend  333: rtt = 0.220, srtt = 0.225, rttvar = 0.010, rto = 2.000\nrecv  333\nupdated rto\nsend  334: rtt = 0.250, srtt = 0.228, rttvar = 0.013, rto = 2.000\nrecv  334\nupdated rto\nsend  335: rtt = 0.250, srtt = 0.231, rttvar = 0.016, rto = 2.000\nrecv  335\nupdated rto\nsend  336: rtt = 0.229, srtt = 0.231, rttvar = 0.012, rto = 2.000\nrecv  336\nupdated rto\nsend  337: rtt = 0.239, srtt = 0.232, rttvar = 0.011, rto = 2.000\nrecv  337\nupdated rto\nsend  338: rtt = 0.230, srtt = 0.232, rttvar = 0.009, rto = 2.000\nrecv  338\nupdated rto\nsend  339: rtt = 0.230, srtt = 0.231, rttvar = 0.007, rto = 2.000\nrecv  339\nupdated rto\nsend  340: rtt = 0.219, srtt = 0.230, rttvar = 0.008, rto = 2.000\nrecv  340\nupdated rto\nsend  341: rtt = 0.240, srtt = 0.231, rttvar = 0.009, rto = 2.000\nrecv  341\nupdated rto\nsend  342: rtt = 0.229, srtt = 0.231, rttvar = 0.007, rto = 2.000\nrecv  342\nupdated rto\nsend  343: rtt = 0.220, srtt = 0.229, rttvar = 0.008, rto = 2.000\nrecv  343\nupdated rto\nsend  344: rtt = 0.259, srtt = 0.233, rttvar = 0.013, rto = 2.000\nrecv  344\nupdated rto\nsend  345: rtt = 0.230, srtt = 0.233, rttvar = 0.011, rto = 2.000\nrecv  345\nupdated rto\nsend  346: rtt = 0.219, srtt = 0.231, rttvar = 0.012, rto = 2.000\nrecv  346\nupdated rto\nsend  347: rtt = 0.219, srtt = 0.230, rttvar = 0.012, rto = 2.000\nrecv  347\nupdated rto\nsend  348: rtt = 0.230, srtt = 0.230, rttvar = 0.009, rto = 2.000\nrecv  348\nupdated rto\nsend  349: rtt = 0.240, srtt = 0.231, rttvar = 0.009, rto = 2.000\nrecv  349\nupdated rto\nsend  350: rtt = 0.239, srtt = 0.232, rttvar = 0.009, rto = 2.000\nrecv  350\nupdated rto\nsend  351: rtt = 0.250, srtt = 0.234, rttvar = 0.011, rto = 2.000\nrecv  351\nupdated rto\nsend  352: rtt = 0.250, srtt = 0.236, rttvar = 0.012, rto = 2.000\nrecv  352\nupdated rto\nsend  353: rtt = 0.220, srtt = 0.234, rttvar = 0.013, rto = 2.000\nrecv  353\nupdated rto\nsend  354: rtt = 0.239, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv  354\nupdated rto\nsend  355: rtt = 0.230, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  355\nupdated rto\nsend  356: rtt = 0.240, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  356\nupdated rto\nsend  357: rtt = 0.230, srtt = 0.234, rttvar = 0.008, rto = 2.000\nrecv  357\nupdated rto\nsend  358: rtt = 0.270, srtt = 0.239, rttvar = 0.015, rto = 2.000\nrecv  358\nupdated rto\nsend  359: rtt = 0.240, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  359\nupdated rto\nsend  360: rtt = 0.249, srtt = 0.240, rttvar = 0.011, rto = 2.000\nrecv  360\nupdated rto\nsend  361: rtt = 0.240, srtt = 0.240, rttvar = 0.008, rto = 2.000\nrecv  361\nupdated rto\nsend  362: rtt = 0.220, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  362\nupdated rto\nsend  363: rtt = 0.239, srtt = 0.238, rttvar = 0.009, rto = 2.000\nrecv  363\nupdated rto\nsend  364: rtt = 0.240, srtt = 0.238, rttvar = 0.007, rto = 2.000\nrecv  364\nupdated rto\nsend  365: rtt = 0.259, srtt = 0.241, rttvar = 0.011, rto = 2.000\nrecv  365\nupdated rto\nsend  366: rtt = 0.240, srtt = 0.241, rttvar = 0.008, rto = 2.000\nrecv  366\nupdated rto\nsend  367: rtt = 0.239, srtt = 0.240, rttvar = 0.006, rto = 2.000\nrecv  367\nupdated rto\nsend  368: rtt = 0.249, srtt = 0.241, rttvar = 0.007, rto = 2.000\nrecv  368\nupdated rto\nsend  369: rtt = 0.240, srtt = 0.241, rttvar = 0.006, rto = 2.000\nrecv  369\nupdated rto\nsend  370: rtt = 0.239, srtt = 0.241, rttvar = 0.005, rto = 2.000\nrecv  370\nupdated rto\nsend  371: rtt = 0.229, srtt = 0.240, rttvar = 0.007, rto = 2.000\nrecv  371\nupdated rto\nsend  372: rtt = 0.240, srtt = 0.240, rttvar = 0.005, rto = 2.000\nrecv  372\nupdated rto\nsend  373: rtt = 0.259, srtt = 0.242, rttvar = 0.009, rto = 2.000\nrecv  373\nupdated rto\nsend  374: rtt = 0.229, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv  374\nupdated rto\nsend  375: rtt = 0.230, srtt = 0.239, rttvar = 0.010, rto = 2.000\nrecv  375\nupdated rto\nsend  376: rtt = 0.239, srtt = 0.239, rttvar = 0.007, rto = 2.000\nrecv  376\nupdated rto\nsend  377: rtt = 0.259, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  377\nupdated rto\nsend  378: rtt = 0.250, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv  378\nupdated rto\nsend  379: rtt = 0.250, srtt = 0.244, rttvar = 0.009, rto = 2.000\nrecv  379\nupdated rto\nsend  380: rtt = 0.230, srtt = 0.242, rttvar = 0.010, rto = 2.000\nrecv  380\nupdated rto\nsend  381: rtt = 0.239, srtt = 0.241, rttvar = 0.009, rto = 2.000\nrecv  381\nupdated rto\nsend  382: rtt = 0.279, srtt = 0.246, rttvar = 0.016, rto = 2.000\nrecv  382\nupdated rto\nsend  383: rtt = 0.259, srtt = 0.248, rttvar = 0.015, rto = 2.000\nrecv  383\nupdated rto\nsend  384: rtt = 0.220, srtt = 0.244, rttvar = 0.018, rto = 2.000\nrecv  384\nupdated rto\nsend  385: rtt = 0.249, srtt = 0.245, rttvar = 0.015, rto = 2.000\nrecv  385\nupdated rto\nsend  386: rtt = 0.249, srtt = 0.245, rttvar = 0.012, rto = 2.000\nrecv  386\nupdated rto\nsend  387: rtt = 0.220, srtt = 0.242, rttvar = 0.015, rto = 2.000\nrecv  387\nupdated rto\nsend  388: rtt = 0.210, srtt = 0.238, rttvar = 0.020, rto = 2.000\nrecv  388\nupdated rto\nsend  389: rtt = 0.230, srtt = 0.237, rttvar = 0.017, rto = 2.000\nrecv  389\nupdated rto\nsend  390: rtt = 0.219, srtt = 0.235, rttvar = 0.017, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  390: rtt = 0.219, srtt = 0.235, rttvar = 0.017, rto = 4.000\nrecv  390\nupdated rto\nsend  391: rtt = 0.229, srtt = 0.234, rttvar = 0.014, rto = 2.000\nrecv  391\nupdated rto\nsend  392: rtt = 0.229, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv  392\nupdated rto\nsend  393: rtt = 0.239, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  393\nupdated rto\nsend  394: rtt = 0.240, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  394\nupdated rto\nsend  395: rtt = 0.249, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  395\nupdated rto\nsend  396: rtt = 0.250, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  396\nupdated rto\nsend  397: rtt = 0.230, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  397\nupdated rto\nsend  398: rtt = 0.260, srtt = 0.240, rttvar = 0.014, rto = 2.000\nrecv  398\nupdated rto\nsend  399: rtt = 0.270, srtt = 0.244, rttvar = 0.018, rto = 2.000\nrecv  399\nupdated rto\nsend  400: rtt = 0.240, srtt = 0.243, rttvar = 0.014, rto = 2.000\nrecv  400\nupdated rto\nsend  401: rtt = 0.250, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  401\nupdated rto\nsend  402: rtt = 0.259, srtt = 0.246, rttvar = 0.013, rto = 2.000\nrecv  402\nupdated rto\nsend  403: rtt = 0.229, srtt = 0.244, rttvar = 0.014, rto = 2.000\nrecv  403\nupdated rto\nsend  404: rtt = 0.249, srtt = 0.245, rttvar = 0.012, rto = 2.000\nrecv  404\nupdated rto\nsend  405: rtt = 0.229, srtt = 0.243, rttvar = 0.013, rto = 2.000\nrecv  405\nupdated rto\nsend  406: rtt = 0.250, srtt = 0.244, rttvar = 0.011, rto = 2.000\nrecv  406\nupdated rto\nsend  407: rtt = 0.230, srtt = 0.242, rttvar = 0.012, rto = 2.000\nrecv  407\nupdated rto\nsend  408: rtt = 0.230, srtt = 0.240, rttvar = 0.012, rto = 2.000\nrecv  408\nupdated rto\nsend  409: rtt = 0.220, srtt = 0.238, rttvar = 0.014, rto = 2.000\nrecv  409\nupdated rto\nsend  410: rtt = 0.229, srtt = 0.237, rttvar = 0.013, rto = 2.000\nrecv  410\nupdated rto\nsend  411: rtt = 0.249, srtt = 0.238, rttvar = 0.013, rto = 2.000\nrecv  411\nupdated rto\nsend  412: rtt = 0.249, srtt = 0.240, rttvar = 0.012, rto = 2.000\nrecv  412\nupdated rto\nsend  413: rtt = 0.210, srtt = 0.236, rttvar = 0.017, rto = 2.000\nrecv  413\nupdated rto\nsend  414: rtt = 0.220, srtt = 0.234, rttvar = 0.016, rto = 2.000\nrecv  414\nupdated rto\nsend  415: rtt = 0.220, srtt = 0.232, rttvar = 0.016, rto = 2.000\nrecv  415\nupdated rto\nsend  416: rtt = 0.219, srtt = 0.231, rttvar = 0.015, rto = 2.000\nrecv  416\nupdated rto\nsend  417: rtt = 0.239, srtt = 0.232, rttvar = 0.013, rto = 2.000\nrecv  417\nupdated rto\nsend  418: rtt = 0.260, srtt = 0.235, rttvar = 0.017, rto = 2.000\nrecv  418\nupdated rto\nsend  419: rtt = 0.240, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv  419\nupdated rto\nsend  420: rtt = 0.229, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv  420\nupdated rto\nsend  421: rtt = 0.220, srtt = 0.233, rttvar = 0.013, rto = 2.000\nrecv  421\nupdated rto\nsend  422: rtt = 0.229, srtt = 0.233, rttvar = 0.011, rto = 2.000\nrecv  422\nupdated rto\nsend  423: rtt = 0.249, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv  423\nupdated rto\nsend  424: rtt = 0.260, srtt = 0.238, rttvar = 0.015, rto = 2.000\nrecv  424\nupdated rto\nsend  425: rtt = 0.239, srtt = 0.238, rttvar = 0.012, rto = 2.000\nrecv  425\nupdated rto\nsend  426: rtt = 0.240, srtt = 0.238, rttvar = 0.009, rto = 2.000\nrecv  426\nupdated rto\nsend  427: rtt = 0.230, srtt = 0.237, rttvar = 0.009, rto = 2.000\nrecv  427\nupdated rto\nsend  428: rtt = 0.279, srtt = 0.242, rttvar = 0.017, rto = 2.000\nrecv  428\nupdated rto\nsend  429: rtt = 0.240, srtt = 0.242, rttvar = 0.014, rto = 2.000\nrecv  429\nupdated rto\nsend  430: rtt = 0.249, srtt = 0.243, rttvar = 0.012, rto = 2.000\nrecv  430\nupdated rto\nsend  431: rtt = 0.259, srtt = 0.245, rttvar = 0.013, rto = 2.000\nrecv  431\nupdated rto\nsend  432: rtt = 0.250, srtt = 0.246, rttvar = 0.011, rto = 2.000\nrecv  432\nupdated rto\nsend  433: rtt = 0.229, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  433\nupdated rto\nsend  434: rtt = 0.240, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv  434\nupdated rto\nsend  435: rtt = 0.230, srtt = 0.241, rttvar = 0.011, rto = 2.000\nrecv  435\nupdated rto\nsend  436: rtt = 0.249, srtt = 0.242, rttvar = 0.010, rto = 2.000\nrecv  436\nupdated rto\nsend  437: rtt = 0.240, srtt = 0.242, rttvar = 0.008, rto = 2.000\nrecv  437\nupdated rto\nsend  438: rtt = 0.240, srtt = 0.242, rttvar = 0.007, rto = 2.000\nrecv  438\nupdated rto\nsend  439: rtt = 0.249, srtt = 0.243, rttvar = 0.007, rto = 2.000\nrecv  439\nupdated rto\nsend  440: rtt = 0.220, srtt = 0.240, rttvar = 0.011, rto = 2.000\nrecv  440\nupdated rto\nsend  441: rtt = 0.219, srtt = 0.237, rttvar = 0.013, rto = 2.000\nrecv  441\nupdated rto\nsend  442: rtt = 0.239, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  442\nupdated rto\nsend  443: rtt = 0.250, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  443\nupdated rto\nsend  444: rtt = 0.240, srtt = 0.239, rttvar = 0.008, rto = 2.000\nrecv  444\nupdated rto\nsend  445: rtt = 0.230, srtt = 0.238, rttvar = 0.009, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  445: rtt = 0.230, srtt = 0.238, rttvar = 0.009, rto = 4.000\nrecv  445\nupdated rto\nsend  446: rtt = 0.489, srtt = 0.269, rttvar = 0.069, rto = 2.000\nrecv  446\nupdated rto\nsend  447: rtt = 0.230, srtt = 0.264, rttvar = 0.062, rto = 2.000\nrecv  447\nupdated rto\nsend  448: rtt = 0.240, srtt = 0.261, rttvar = 0.052, rto = 2.000\nrecv  448\nupdated rto\nsend  449: rtt = 0.250, srtt = 0.260, rttvar = 0.042, rto = 2.000\nrecv  449\nupdated rto\nsend  450: rtt = 0.239, srtt = 0.257, rttvar = 0.037, rto = 2.000\nrecv  450\nupdated rto\nsend  451: rtt = 0.260, srtt = 0.258, rttvar = 0.028, rto = 2.000\nrecv  451\nupdated rto\nsend  452: rtt = 0.240, srtt = 0.255, rttvar = 0.026, rto = 2.000\nrecv  452\nupdated rto\nsend  453: rtt = 0.599, srtt = 0.298, rttvar = 0.105, rto = 2.000\nrecv  453\nupdated rto\nsend  454: rtt = 0.249, srtt = 0.292, rttvar = 0.091, rto = 2.000\nrecv  454\nupdated rto\nsend  455: rtt = 0.220, srtt = 0.283, rttvar = 0.086, rto = 2.000\nrecv  455\nupdated rto\nsend  456: rtt = 0.230, srtt = 0.277, rttvar = 0.078, rto = 2.000\nrecv  456\nupdated rto\nsend  457: rtt = 0.220, srtt = 0.269, rttvar = 0.073, rto = 2.000\nrecv  457\nupdated rto\nsend  458: rtt = 0.239, srtt = 0.266, rttvar = 0.062, rto = 2.000\nrecv  458\nupdated rto\nsend  459: rtt = 0.230, srtt = 0.261, rttvar = 0.056, rto = 2.000\nrecv  459\nupdated rto\nsend  460: rtt = 0.249, srtt = 0.260, rttvar = 0.045, rto = 2.000\nrecv  460\nupdated rto\nsend  461: rtt = 0.240, srtt = 0.257, rttvar = 0.038, rto = 2.000\nrecv  461\nupdated rto\nsend  462: rtt = 0.230, srtt = 0.254, rttvar = 0.036, rto = 2.000\nrecv  462\nupdated rto\nsend  463: rtt = 0.230, srtt = 0.251, rttvar = 0.033, rto = 2.000\nrecv  463\nupdated rto\nsend  464: rtt = 0.240, srtt = 0.249, rttvar = 0.027, rto = 2.000\nrecv  464\nupdated rto\nsend  465: rtt = 0.249, srtt = 0.249, rttvar = 0.021, rto = 2.000\nrecv  465\nupdated rto\nsend  466: rtt = 0.240, srtt = 0.248, rttvar = 0.018, rto = 2.000\nrecv  466\nupdated rto\nsend  467: rtt = 0.229, srtt = 0.246, rttvar = 0.018, rto = 2.000\nrecv  467\nupdated rto\nsend  468: rtt = 0.249, srtt = 0.246, rttvar = 0.014, rto = 2.000\nrecv  468\nupdated rto\nsend  469: rtt = 0.249, srtt = 0.247, rttvar = 0.011, rto = 2.000\nrecv  469\nupdated rto\nsend  470: rtt = 0.230, srtt = 0.245, rttvar = 0.013, rto = 2.000\nrecv  470\nupdated rto\nsend  471: rtt = 0.250, srtt = 0.245, rttvar = 0.011, rto = 2.000\nrecv  471\nupdated rto\nsend  472: rtt = 0.240, srtt = 0.245, rttvar = 0.010, rto = 2.000\nrecv  472\nupdated rto\nsend  473: rtt = 0.250, srtt = 0.245, rttvar = 0.008, rto = 2.000\nrecv  473\nupdated rto\nsend  474: rtt = 0.250, srtt = 0.246, rttvar = 0.008, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  474: rtt = 0.250, srtt = 0.246, rttvar = 0.008, rto = 4.000\nrecv  474\nupdated rto\nsend  475: rtt = 0.240, srtt = 0.245, rttvar = 0.007, rto = 2.000\nrecv  475\nupdated rto\nsend  476: rtt = 0.250, srtt = 0.246, rttvar = 0.007, rto = 2.000\nrecv  476\nupdated rto\nsend  477: rtt = 0.220, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  477\nupdated rto\nsend  478: rtt = 0.250, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv  478\nupdated rto\nsend  479: rtt = 0.250, srtt = 0.244, rttvar = 0.009, rto = 2.000\nrecv  479\nupdated rto\nsend  480: rtt = 0.240, srtt = 0.244, rttvar = 0.008, rto = 2.000\nrecv  480\nupdated rto\nsend  481: rtt = 0.229, srtt = 0.242, rttvar = 0.010, rto = 2.000\nrecv  481\nupdated rto\nsend  482: rtt = 0.279, srtt = 0.247, rttvar = 0.017, rto = 2.000\nrecv  482\nupdated rto\nsend  483: rtt = 0.260, srtt = 0.248, rttvar = 0.016, rto = 2.000\nrecv  483\nupdated rto\nsend  484: rtt = 0.209, srtt = 0.243, rttvar = 0.022, rto = 2.000\nrecv  484\nupdated rto\nsend  485: rtt = 0.229, srtt = 0.242, rttvar = 0.020, rto = 2.000\nrecv  485\nupdated rto\nsend  486: rtt = 0.230, srtt = 0.240, rttvar = 0.018, rto = 2.000\nrecv  486\nupdated rto\nsend  487: rtt = 0.240, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv  487\nupdated rto\nsend  488: rtt = 0.220, srtt = 0.238, rttvar = 0.015, rto = 2.000\nrecv  488\nupdated rto\nsend  489: rtt = 0.229, srtt = 0.236, rttvar = 0.013, rto = 2.000\nrecv  489\nupdated rto\nsend  490: rtt = 0.309, srtt = 0.246, rttvar = 0.028, rto = 2.000\nrecv  490\nupdated rto\nsend  491: rtt = 0.219, srtt = 0.242, rttvar = 0.028, rto = 2.000\nrecv  491\nupdated rto\nsend  492: rtt = 0.240, srtt = 0.242, rttvar = 0.021, rto = 2.000\nrecv  492\nupdated rto\nsend  493: rtt = 0.220, srtt = 0.239, rttvar = 0.022, rto = 2.000\nrecv  493\nupdated rto\nsend  494: rtt = 0.239, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv  494\nupdated rto\nsend  495: rtt = 0.239, srtt = 0.239, rttvar = 0.012, rto = 2.000\nrecv  495\nupdated rto\nsend  496: rtt = 0.239, srtt = 0.239, rttvar = 0.009, rto = 2.000\nrecv  496\nupdated rto\nsend  497: rtt = 0.240, srtt = 0.239, rttvar = 0.007, rto = 2.000\nrecv  497\nupdated rto\nsend  498: rtt = 0.240, srtt = 0.239, rttvar = 0.006, rto = 2.000\nrecv  498\nupdated rto\nsend  499: rtt = 0.230, srtt = 0.238, rttvar = 0.006, rto = 2.000\nrecv  499\nupdated rto\nsend  500: rtt = 0.250, srtt = 0.240, rttvar = 0.008, rto = 2.000\nrecv  500\nupdated rto\n"
  },
  {
    "path": "rtt/rtt.out.vangogh.2",
    "content": "send    1: rtt = 0.000, srtt = 0.000, rttvar = 0.750, rto = 3.000\nrecv    1\nupdated rto\nsend    2: rtt = 0.279, srtt = 0.035, rttvar = 0.632, rto = 2.564\nrecv    2\nupdated rto\nsend    3: rtt = 0.238, srtt = 0.060, rttvar = 0.525, rto = 2.160\nrecv    3\nupdated rto\nsend    4: rtt = 0.229, srtt = 0.081, rttvar = 0.436, rto = 2.000\nrecv    4\nupdated rto\nsend    5: rtt = 0.298, srtt = 0.108, rttvar = 0.381, rto = 2.000\nrecv    5\nupdated rto\nsend    6: rtt = 0.280, srtt = 0.130, rttvar = 0.329, rto = 2.000\nrecv    6\nupdated rto\nsend    7: rtt = 0.230, srtt = 0.142, rttvar = 0.272, rto = 2.000\nrecv    7\nupdated rto\nsend    8: rtt = 0.230, srtt = 0.153, rttvar = 0.226, rto = 2.000\nrecv    8\nupdated rto\nsend    9: rtt = 0.219, srtt = 0.162, rttvar = 0.186, rto = 2.000\nrecv    9\nupdated rto\nsend   10: rtt = 0.255, srtt = 0.173, rttvar = 0.163, rto = 2.000\nrecv   10\nupdated rto\nsend   11: rtt = 0.224, srtt = 0.180, rttvar = 0.135, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   11: rtt = 0.224, srtt = 0.180, rttvar = 0.135, rto = 4.000\nrecv   11\nupdated rto\nsend   12: rtt = 0.259, srtt = 0.190, rttvar = 0.121, rto = 2.000\nrecv   12\nupdated rto\nsend   13: rtt = 0.249, srtt = 0.197, rttvar = 0.105, rto = 2.000\nrecv   13\nupdated rto\nsend   14: rtt = 0.273, srtt = 0.206, rttvar = 0.098, rto = 2.000\nrecv   14\nupdated rto\nsend   15: rtt = 0.217, srtt = 0.208, rttvar = 0.076, rto = 2.000\nrecv   15\nupdated rto\nsend   16: rtt = 0.260, srtt = 0.214, rttvar = 0.070, rto = 2.000\nrecv   16\nupdated rto\nsend   17: rtt = 0.270, srtt = 0.221, rttvar = 0.067, rto = 2.000\nrecv   17\nupdated rto\nsend   18: rtt = 0.240, srtt = 0.224, rttvar = 0.055, rto = 2.000\nrecv   18\nupdated rto\nsend   19: rtt = 0.250, srtt = 0.227, rttvar = 0.048, rto = 2.000\nrecv   19\nupdated rto\nsend   20: rtt = 0.210, srtt = 0.225, rttvar = 0.040, rto = 2.000\nrecv   20\nupdated rto\nsend   21: rtt = 0.269, srtt = 0.230, rttvar = 0.041, rto = 2.000\nrecv   21\nupdated rto\nsend   22: rtt = 0.260, srtt = 0.234, rttvar = 0.038, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   22: rtt = 0.260, srtt = 0.234, rttvar = 0.038, rto = 4.000\nrecv   22\nupdated rto\nsend   23: rtt = 0.250, srtt = 0.236, rttvar = 0.033, rto = 2.000\nrecv   23\nupdated rto\nsend   24: rtt = 0.280, srtt = 0.242, rttvar = 0.035, rto = 2.000\nrecv   24\nupdated rto\nsend   25: rtt = 0.250, srtt = 0.243, rttvar = 0.029, rto = 2.000\nrecv   25\nupdated rto\nsend   26: rtt = 0.219, srtt = 0.240, rttvar = 0.027, rto = 2.000\nrecv   26\nupdated rto\nsend   27: rtt = 0.230, srtt = 0.238, rttvar = 0.023, rto = 2.000\nrecv   27\nupdated rto\nsend   28: rtt = 0.249, srtt = 0.240, rttvar = 0.020, rto = 2.000\nrecv   28\nupdated rto\nsend   29: rtt = 0.250, srtt = 0.241, rttvar = 0.017, rto = 2.000\nrecv   29\nupdated rto\nsend   30: rtt = 0.250, srtt = 0.242, rttvar = 0.015, rto = 2.000\nrecv   30\nupdated rto\nsend   31: rtt = 0.271, srtt = 0.246, rttvar = 0.019, rto = 2.000\nrecv   31\nupdated rto\nsend   32: rtt = 0.247, srtt = 0.246, rttvar = 0.014, rto = 2.000\nrecv   32\nupdated rto\nsend   33: rtt = 0.282, srtt = 0.250, rttvar = 0.020, rto = 2.000\nrecv   33\nupdated rto\nsend   34: rtt = 0.249, srtt = 0.250, rttvar = 0.015, rto = 2.000\nrecv   34\nupdated rto\nsend   35: rtt = 0.228, srtt = 0.247, rttvar = 0.017, rto = 2.000\nrecv   35\nupdated rto\nsend   36: rtt = 0.220, srtt = 0.244, rttvar = 0.020, rto = 2.000\nrecv   36\nupdated rto\nsend   37: rtt = 0.239, srtt = 0.243, rttvar = 0.016, rto = 2.000\nrecv   37\nupdated rto\nsend   38: rtt = 0.240, srtt = 0.243, rttvar = 0.013, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   38: rtt = 0.240, srtt = 0.243, rttvar = 0.013, rto = 4.000\nrecv   38\nupdated rto\nsend   39: rtt = 0.220, srtt = 0.240, rttvar = 0.015, rto = 2.000\nrecv   39\nupdated rto\nsend   40: rtt = 0.230, srtt = 0.239, rttvar = 0.014, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   40: rtt = 0.230, srtt = 0.239, rttvar = 0.014, rto = 4.000\nrecv   40\nupdated rto\nsend   41: rtt = 0.250, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv   41\nupdated rto\nsend   42: rtt = 0.249, srtt = 0.241, rttvar = 0.012, rto = 2.000\nrecv   42\nupdated rto\nsend   43: rtt = 0.230, srtt = 0.240, rttvar = 0.012, rto = 2.000\nrecv   43\nupdated rto\nsend   44: rtt = 0.219, srtt = 0.237, rttvar = 0.014, rto = 2.000\nrecv   44\nupdated rto\nsend   45: rtt = 0.250, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv   45\nupdated rto\nsend   46: rtt = 0.250, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv   46\nupdated rto\nsend   47: rtt = 0.240, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv   47\nupdated rto\nsend   48: rtt = 0.270, srtt = 0.244, rttvar = 0.015, rto = 2.000\nrecv   48\nupdated rto\nsend   49: rtt = 0.249, srtt = 0.245, rttvar = 0.012, rto = 2.000\nrecv   49\nupdated rto\nsend   50: rtt = 0.240, srtt = 0.244, rttvar = 0.010, rto = 2.000\nrecv   50\nupdated rto\nsend   51: rtt = 0.240, srtt = 0.244, rttvar = 0.009, rto = 2.000\nrecv   51\nupdated rto\nsend   52: rtt = 0.230, srtt = 0.242, rttvar = 0.010, rto = 2.000\nrecv   52\nupdated rto\nsend   53: rtt = 0.260, srtt = 0.244, rttvar = 0.012, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   53: rtt = 0.260, srtt = 0.244, rttvar = 0.012, rto = 4.000\nrecv   53\nupdated rto\nsend   54: rtt = 0.290, srtt = 0.250, rttvar = 0.021, rto = 2.000\nrecv   54\nupdated rto\nsend   55: rtt = 0.260, srtt = 0.251, rttvar = 0.018, rto = 2.000\nrecv   55\nupdated rto\nsend   56: rtt = 0.250, srtt = 0.251, rttvar = 0.014, rto = 2.000\nrecv   56\nupdated rto\nsend   57: rtt = 0.250, srtt = 0.251, rttvar = 0.011, rto = 2.000\nrecv   57\nupdated rto\nsend   58: rtt = 0.339, srtt = 0.262, rttvar = 0.030, rto = 2.000\nrecv   58\nupdated rto\nsend   59: rtt = 0.210, srtt = 0.255, rttvar = 0.035, rto = 2.000\nrecv   59\nupdated rto\nsend   60: rtt = 0.210, srtt = 0.250, rttvar = 0.038, rto = 2.000\nrecv   60\nupdated rto\nsend   61: rtt = 0.240, srtt = 0.248, rttvar = 0.031, rto = 2.000\nrecv   61\nupdated rto\nsend   62: rtt = 0.230, srtt = 0.246, rttvar = 0.028, rto = 2.000\nrecv   62\nupdated rto\nsend   63: rtt = 0.219, srtt = 0.243, rttvar = 0.028, rto = 2.000\nrecv   63\nupdated rto\nsend   64: rtt = 0.230, srtt = 0.241, rttvar = 0.024, rto = 2.000\nrecv   64\nupdated rto\nsend   65: rtt = 0.250, srtt = 0.242, rttvar = 0.020, rto = 2.000\nrecv   65\nupdated rto\nsend   66: rtt = 0.234, srtt = 0.241, rttvar = 0.017, rto = 2.000\nrecv   66\nupdated rto\nsend   67: rtt = 0.255, srtt = 0.243, rttvar = 0.016, rto = 2.000\nrecv   67\nupdated rto\nsend   68: rtt = 0.280, srtt = 0.248, rttvar = 0.021, rto = 2.000\nrecv   68\nupdated rto\nsend   69: rtt = 0.270, srtt = 0.250, rttvar = 0.022, rto = 2.000\nrecv   69\nupdated rto\nsend   70: rtt = 0.210, srtt = 0.245, rttvar = 0.026, rto = 2.000\nrecv   70\nupdated rto\nsend   71: rtt = 0.240, srtt = 0.245, rttvar = 0.021, rto = 2.000\nrecv   71\nupdated rto\nsend   72: rtt = 0.250, srtt = 0.245, rttvar = 0.017, rto = 2.000\nrecv   72\nupdated rto\nsend   73: rtt = 0.260, srtt = 0.247, rttvar = 0.017, rto = 2.000\nrecv   73\nupdated rto\nsend   74: rtt = 0.250, srtt = 0.248, rttvar = 0.013, rto = 2.000\nrecv   74\nupdated rto\nsend   75: rtt = 0.240, srtt = 0.247, rttvar = 0.012, rto = 2.000\nrecv   75\nupdated rto\nsend   76: rtt = 0.210, srtt = 0.242, rttvar = 0.018, rto = 2.000\nrecv   76\nupdated rto\nsend   77: rtt = 0.260, srtt = 0.244, rttvar = 0.018, rto = 2.000\nrecv   77\nupdated rto\nsend   78: rtt = 0.210, srtt = 0.240, rttvar = 0.022, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend   78: rtt = 0.210, srtt = 0.240, rttvar = 0.022, rto = 4.000\nrecv   78\nupdated rto\nsend   79: rtt = 0.259, srtt = 0.242, rttvar = 0.021, rto = 2.000\nrecv   79\nupdated rto\nsend   80: rtt = 0.240, srtt = 0.242, rttvar = 0.017, rto = 2.000\nrecv   80\nupdated rto\nsend   81: rtt = 0.239, srtt = 0.242, rttvar = 0.013, rto = 2.000\nrecv   81\nupdated rto\nsend   82: rtt = 0.250, srtt = 0.243, rttvar = 0.012, rto = 2.000\nrecv   82\nupdated rto\nsend   83: rtt = 0.250, srtt = 0.244, rttvar = 0.011, rto = 2.000\nrecv   83\nupdated rto\nsend   84: rtt = 0.230, srtt = 0.242, rttvar = 0.012, rto = 2.000\nrecv   84\nupdated rto\nsend   85: rtt = 0.239, srtt = 0.242, rttvar = 0.009, rto = 2.000\nrecv   85\nupdated rto\nsend   86: rtt = 0.230, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv   86\nupdated rto\nsend   87: rtt = 0.270, srtt = 0.244, rttvar = 0.015, rto = 2.000\nrecv   87\nupdated rto\nsend   88: rtt = 0.240, srtt = 0.243, rttvar = 0.012, rto = 2.000\nrecv   88\nupdated rto\nsend   89: rtt = 0.240, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv   89\nupdated rto\nsend   90: rtt = 0.250, srtt = 0.244, rttvar = 0.009, rto = 2.000\nrecv   90\nupdated rto\nsend   91: rtt = 0.250, srtt = 0.245, rttvar = 0.008, rto = 2.000\nrecv   91\nupdated rto\nsend   92: rtt = 0.230, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv   92\nupdated rto\nsend   93: rtt = 0.220, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv   93\nupdated rto\nsend   94: rtt = 0.240, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv   94\nupdated rto\nsend   95: rtt = 0.249, srtt = 0.241, rttvar = 0.010, rto = 2.000\nrecv   95\nupdated rto\nsend   96: rtt = 0.230, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv   96\nupdated rto\nsend   97: rtt = 0.253, srtt = 0.241, rttvar = 0.011, rto = 2.000\nrecv   97\nupdated rto\nsend   98: rtt = 0.227, srtt = 0.240, rttvar = 0.012, rto = 2.000\nrecv   98\nupdated rto\nsend   99: rtt = 0.229, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv   99\nupdated rto\nsend  100: rtt = 0.259, srtt = 0.241, rttvar = 0.014, rto = 2.000\nrecv  100\nupdated rto\nsend  101: rtt = 0.240, srtt = 0.241, rttvar = 0.011, rto = 2.000\nrecv  101\nupdated rto\nsend  102: rtt = 0.240, srtt = 0.241, rttvar = 0.008, rto = 2.000\nrecv  102\nupdated rto\nsend  103: rtt = 0.240, srtt = 0.241, rttvar = 0.006, rto = 2.000\nrecv  103\nupdated rto\nsend  104: rtt = 0.255, srtt = 0.242, rttvar = 0.008, rto = 2.000\nrecv  104\nupdated rto\nsend  105: rtt = 0.273, srtt = 0.246, rttvar = 0.014, rto = 2.000\nrecv  105\nupdated rto\nsend  106: rtt = 0.260, srtt = 0.248, rttvar = 0.014, rto = 2.000\nrecv  106\nupdated rto\nsend  107: rtt = 0.250, srtt = 0.248, rttvar = 0.011, rto = 2.000\nrecv  107\nupdated rto\nsend  108: rtt = 0.254, srtt = 0.249, rttvar = 0.010, rto = 2.000\nrecv  108\nupdated rto\nsend  109: rtt = 0.269, srtt = 0.251, rttvar = 0.012, rto = 2.000\nrecv  109\nupdated rto\nsend  110: rtt = 0.277, srtt = 0.255, rttvar = 0.016, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  110: rtt = 0.277, srtt = 0.255, rttvar = 0.016, rto = 4.000\nrecv  110\nupdated rto\nsend  111: rtt = 0.250, srtt = 0.254, rttvar = 0.013, rto = 2.000\nrecv  111\nupdated rto\nsend  112: rtt = 0.249, srtt = 0.253, rttvar = 0.011, rto = 2.000\nrecv  112\nupdated rto\nsend  113: rtt = 0.260, srtt = 0.254, rttvar = 0.010, rto = 2.000\nrecv  113\nupdated rto\nsend  114: rtt = 0.260, srtt = 0.255, rttvar = 0.009, rto = 2.000\nrecv  114\nupdated rto\nsend  115: rtt = 0.239, srtt = 0.253, rttvar = 0.011, rto = 2.000\nrecv  115\nupdated rto\nsend  116: rtt = 0.230, srtt = 0.250, rttvar = 0.014, rto = 2.000\nrecv  116\nupdated rto\nsend  117: rtt = 0.230, srtt = 0.248, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  117: rtt = 0.230, srtt = 0.248, rttvar = 0.015, rto = 4.000\nrecv  117\nupdated rto\nsend  118: rtt = 0.240, srtt = 0.247, rttvar = 0.013, rto = 2.000\nrecv  118\nupdated rto\nsend  119: rtt = 0.260, srtt = 0.248, rttvar = 0.013, rto = 2.000\nrecv  119\nupdated rto\nsend  120: rtt = 0.270, srtt = 0.251, rttvar = 0.015, rto = 2.000\nrecv  120\nupdated rto\nsend  121: rtt = 0.260, srtt = 0.252, rttvar = 0.014, rto = 2.000\nrecv  121\nupdated rto\nsend  122: rtt = 0.230, srtt = 0.249, rttvar = 0.016, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  122: rtt = 0.230, srtt = 0.249, rttvar = 0.016, rto = 4.000\nrecv  122\nupdated rto\nsend  123: rtt = 0.220, srtt = 0.246, rttvar = 0.019, rto = 2.000\nrecv  123\nupdated rto\nsend  124: rtt = 0.220, srtt = 0.242, rttvar = 0.021, rto = 2.000\nrecv  124\nupdated rto\nsend  125: rtt = 0.250, srtt = 0.243, rttvar = 0.018, rto = 2.000\nrecv  125\nupdated rto\nsend  126: rtt = 0.220, srtt = 0.240, rttvar = 0.019, rto = 2.000\nrecv  126\nupdated rto\nsend  127: rtt = 0.229, srtt = 0.239, rttvar = 0.017, rto = 2.000\nrecv  127\nupdated rto\nsend  128: rtt = 0.240, srtt = 0.239, rttvar = 0.013, rto = 2.000\nrecv  128\nupdated rto\nsend  129: rtt = 0.229, srtt = 0.238, rttvar = 0.012, rto = 2.000\nrecv  129\nupdated rto\nsend  130: rtt = 0.233, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  130\nupdated rto\nsend  131: rtt = 0.256, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv  131\nupdated rto\nsend  132: rtt = 0.229, srtt = 0.238, rttvar = 0.012, rto = 2.000\nrecv  132\nupdated rto\nsend  133: rtt = 0.229, srtt = 0.237, rttvar = 0.011, rto = 2.000\nrecv  133\nupdated rto\nsend  134: rtt = 0.234, srtt = 0.237, rttvar = 0.009, rto = 2.000\nrecv  134\nupdated rto\nsend  135: rtt = 0.250, srtt = 0.238, rttvar = 0.010, rto = 2.000\nrecv  135\nupdated rto\nsend  136: rtt = 0.216, srtt = 0.236, rttvar = 0.013, rto = 2.000\nrecv  136\nupdated rto\nsend  137: rtt = 0.220, srtt = 0.234, rttvar = 0.014, rto = 2.000\nrecv  137\nupdated rto\nsend  138: rtt = 0.249, srtt = 0.236, rttvar = 0.014, rto = 2.000\nrecv  138\nupdated rto\nsend  139: rtt = 0.229, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv  139\nupdated rto\nsend  140: rtt = 0.230, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  140\nupdated rto\nsend  141: rtt = 0.250, srtt = 0.236, rttvar = 0.012, rto = 2.000\nrecv  141\nupdated rto\nsend  142: rtt = 0.230, srtt = 0.235, rttvar = 0.010, rto = 2.000\nrecv  142\nupdated rto\nsend  143: rtt = 0.259, srtt = 0.238, rttvar = 0.014, rto = 2.000\nrecv  143\nupdated rto\nsend  144: rtt = 0.240, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  144\nupdated rto\nsend  145: rtt = 0.250, srtt = 0.240, rttvar = 0.011, rto = 2.000\nrecv  145\nupdated rto\nsend  146: rtt = 0.230, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  146\nupdated rto\nsend  147: rtt = 0.220, srtt = 0.236, rttvar = 0.013, rto = 2.000\nrecv  147\nupdated rto\nsend  148: rtt = 0.239, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  148\nupdated rto\nsend  149: rtt = 0.230, srtt = 0.236, rttvar = 0.009, rto = 2.000\nrecv  149\nupdated rto\nsend  150: rtt = 0.260, srtt = 0.239, rttvar = 0.013, rto = 2.000\nrecv  150\nupdated rto\nsend  151: rtt = 0.230, srtt = 0.238, rttvar = 0.012, rto = 2.000\nrecv  151\nupdated rto\nsend  152: rtt = 0.250, srtt = 0.239, rttvar = 0.012, rto = 2.000\nrecv  152\nupdated rto\nsend  153: rtt = 0.230, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  153\nupdated rto\nsend  154: rtt = 0.280, srtt = 0.243, rttvar = 0.019, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  154: rtt = 0.280, srtt = 0.243, rttvar = 0.019, rto = 4.000\nrecv  154\nupdated rto\nsend  155: rtt = 0.270, srtt = 0.247, rttvar = 0.021, rto = 2.000\nrecv  155\nupdated rto\nsend  156: rtt = 0.260, srtt = 0.248, rttvar = 0.019, rto = 2.000\nrecv  156\nupdated rto\nsend  157: rtt = 0.229, srtt = 0.246, rttvar = 0.019, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  157: rtt = 0.229, srtt = 0.246, rttvar = 0.019, rto = 4.000\nrecv  157\nupdated rto\nsend  158: rtt = 0.250, srtt = 0.246, rttvar = 0.015, rto = 2.000\nrecv  158\nupdated rto\nsend  159: rtt = 0.240, srtt = 0.246, rttvar = 0.013, rto = 2.000\nrecv  159\nupdated rto\nsend  160: rtt = 0.230, srtt = 0.244, rttvar = 0.014, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  160: rtt = 0.230, srtt = 0.244, rttvar = 0.014, rto = 4.000\nrecv  160\nupdated rto\nsend  161: rtt = 0.240, srtt = 0.243, rttvar = 0.011, rto = 2.000\nrecv  161\nupdated rto\nsend  162: rtt = 0.230, srtt = 0.242, rttvar = 0.012, rto = 2.000\nrecv  162\nupdated rto\nsend  163: rtt = 0.239, srtt = 0.241, rttvar = 0.009, rto = 2.000\nrecv  163\nupdated rto\nsend  164: rtt = 0.250, srtt = 0.242, rttvar = 0.009, rto = 2.000\nrecv  164\nupdated rto\nsend  165: rtt = 0.249, srtt = 0.243, rttvar = 0.009, rto = 2.000\nrecv  165\nupdated rto\nsend  166: rtt = 0.245, srtt = 0.243, rttvar = 0.007, rto = 2.000\nrecv  166\nupdated rto\nsend  167: rtt = 0.224, srtt = 0.241, rttvar = 0.010, rto = 2.000\nrecv  167\nupdated rto\nsend  168: rtt = 0.240, srtt = 0.241, rttvar = 0.008, rto = 2.000\nrecv  168\nupdated rto\nsend  169: rtt = 0.230, srtt = 0.240, rttvar = 0.009, rto = 2.000\nrecv  169\nupdated rto\nsend  170: rtt = 0.230, srtt = 0.238, rttvar = 0.009, rto = 2.000\nrecv  170\nupdated rto\nsend  171: rtt = 0.239, srtt = 0.238, rttvar = 0.007, rto = 2.000\nrecv  171\nupdated rto\nsend  172: rtt = 0.260, srtt = 0.241, rttvar = 0.010, rto = 2.000\nrecv  172\nupdated rto\nsend  173: rtt = 0.260, srtt = 0.243, rttvar = 0.013, rto = 2.000\nrecv  173\nupdated rto\nsend  174: rtt = 0.250, srtt = 0.244, rttvar = 0.011, rto = 2.000\nrecv  174\nupdated rto\nsend  175: rtt = 0.239, srtt = 0.244, rttvar = 0.010, rto = 2.000\nrecv  175\nupdated rto\nsend  176: rtt = 0.220, srtt = 0.241, rttvar = 0.013, rto = 2.000\nrecv  176\nupdated rto\nsend  177: rtt = 0.280, srtt = 0.246, rttvar = 0.020, rto = 2.000\nrecv  177\nupdated rto\nsend  178: rtt = 0.230, srtt = 0.244, rttvar = 0.019, rto = 2.000\nrecv  178\nupdated rto\nsend  179: rtt = 0.230, srtt = 0.242, rttvar = 0.017, rto = 2.000\nrecv  179\nupdated rto\nsend  180: rtt = 0.240, srtt = 0.242, rttvar = 0.014, rto = 2.000\nrecv  180\nupdated rto\nsend  181: rtt = 0.230, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv  181\nupdated rto\nsend  182: rtt = 0.250, srtt = 0.241, rttvar = 0.012, rto = 2.000\nrecv  182\nupdated rto\nsend  183: rtt = 0.239, srtt = 0.241, rttvar = 0.010, rto = 2.000\nrecv  183\nupdated rto\nsend  184: rtt = 0.260, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  184\nupdated rto\nsend  185: rtt = 0.240, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv  185\nupdated rto\nsend  186: rtt = 0.239, srtt = 0.243, rttvar = 0.008, rto = 2.000\nrecv  186\nupdated rto\nsend  187: rtt = 0.245, srtt = 0.243, rttvar = 0.007, rto = 2.000\nrecv  187\nupdated rto\nsend  188: rtt = 0.274, srtt = 0.247, rttvar = 0.013, rto = 2.000\nrecv  188\nupdated rto\nsend  189: rtt = 0.240, srtt = 0.246, rttvar = 0.011, rto = 2.000\nrecv  189\nupdated rto\nsend  190: rtt = 0.239, srtt = 0.245, rttvar = 0.010, rto = 2.000\nrecv  190\nupdated rto\nsend  191: rtt = 0.230, srtt = 0.243, rttvar = 0.011, rto = 2.000\nrecv  191\nupdated rto\nsend  192: rtt = 0.260, srtt = 0.245, rttvar = 0.013, rto = 2.000\nrecv  192\nupdated rto\nsend  193: rtt = 0.240, srtt = 0.245, rttvar = 0.011, rto = 2.000\nrecv  193\nupdated rto\nsend  194: rtt = 0.210, srtt = 0.240, rttvar = 0.017, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  194: rtt = 0.210, srtt = 0.240, rttvar = 0.017, rto = 4.000\nrecv  194\nupdated rto\nsend  195: rtt = 0.230, srtt = 0.239, rttvar = 0.015, rto = 2.000\nrecv  195\nupdated rto\nsend  196: rtt = 0.210, srtt = 0.235, rttvar = 0.019, rto = 2.000\nrecv  196\nupdated rto\nsend  197: rtt = 0.240, srtt = 0.236, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  197: rtt = 0.240, srtt = 0.236, rttvar = 0.015, rto = 4.000\nrecv  197\nupdated rto\nsend  198: rtt = 0.250, srtt = 0.238, rttvar = 0.015, rto = 2.000\nrecv  198\nupdated rto\nsend  199: rtt = 0.250, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv  199\nupdated rto\nsend  200: rtt = 0.210, srtt = 0.236, rttvar = 0.018, rto = 2.000\nrecv  200\nupdated rto\nsend  201: rtt = 0.250, srtt = 0.237, rttvar = 0.017, rto = 2.000\nrecv  201\nupdated rto\nsend  202: rtt = 0.230, srtt = 0.236, rttvar = 0.015, rto = 2.000\nrecv  202\nupdated rto\nsend  203: rtt = 0.220, srtt = 0.234, rttvar = 0.015, rto = 2.000\nrecv  203\nupdated rto\nsend  204: rtt = 0.230, srtt = 0.234, rttvar = 0.012, rto = 2.000\nrecv  204\nupdated rto\nsend  205: rtt = 0.240, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv  205\nupdated rto\nsend  206: rtt = 0.240, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  206\nupdated rto\nsend  207: rtt = 0.249, srtt = 0.237, rttvar = 0.011, rto = 2.000\nrecv  207\nupdated rto\nsend  208: rtt = 0.230, srtt = 0.236, rttvar = 0.010, rto = 2.000\nrecv  208\nupdated rto\nsend  209: rtt = 0.250, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  209\nupdated rto\nsend  210: rtt = 0.229, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  210\nupdated rto\nsend  211: rtt = 0.230, srtt = 0.236, rttvar = 0.009, rto = 2.000\nrecv  211\nupdated rto\nsend  212: rtt = 0.230, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  212\nupdated rto\nsend  213: rtt = 0.249, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  213\nupdated rto\nsend  214: rtt = 0.240, srtt = 0.237, rttvar = 0.008, rto = 2.000\nrecv  214\nupdated rto\nsend  215: rtt = 0.230, srtt = 0.236, rttvar = 0.008, rto = 2.000\nrecv  215\nupdated rto\nsend  216: rtt = 0.229, srtt = 0.235, rttvar = 0.008, rto = 2.000\nrecv  216\nupdated rto\nsend  217: rtt = 0.245, srtt = 0.237, rttvar = 0.008, rto = 2.000\nrecv  217\nupdated rto\nsend  218: rtt = 0.254, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  218\nupdated rto\nsend  219: rtt = 0.229, srtt = 0.238, rttvar = 0.010, rto = 2.000\nrecv  219\nupdated rto\nsend  220: rtt = 0.230, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  220\nupdated rto\nsend  221: rtt = 0.220, srtt = 0.235, rttvar = 0.011, rto = 2.000\nrecv  221\nupdated rto\nsend  222: rtt = 0.230, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  222\nupdated rto\nsend  223: rtt = 0.229, srtt = 0.233, rttvar = 0.009, rto = 2.000\nrecv  223\nupdated rto\nsend  224: rtt = 0.240, srtt = 0.234, rttvar = 0.008, rto = 2.000\nrecv  224\nupdated rto\nsend  225: rtt = 0.240, srtt = 0.235, rttvar = 0.007, rto = 2.000\nrecv  225\nupdated rto\nsend  226: rtt = 0.260, srtt = 0.238, rttvar = 0.012, rto = 2.000\nrecv  226\nupdated rto\nsend  227: rtt = 0.280, srtt = 0.243, rttvar = 0.019, rto = 2.000\nrecv  227\nupdated rto\nsend  228: rtt = 0.240, srtt = 0.243, rttvar = 0.015, rto = 2.000\nrecv  228\nupdated rto\nsend  229: rtt = 0.240, srtt = 0.243, rttvar = 0.012, rto = 2.000\nrecv  229\nupdated rto\nsend  230: rtt = 0.250, srtt = 0.243, rttvar = 0.011, rto = 2.000\nrecv  230\nupdated rto\nsend  231: rtt = 0.239, srtt = 0.243, rttvar = 0.009, rto = 2.000\nrecv  231\nupdated rto\nsend  232: rtt = 0.250, srtt = 0.244, rttvar = 0.009, rto = 2.000\nrecv  232\nupdated rto\nsend  233: rtt = 0.260, srtt = 0.246, rttvar = 0.011, rto = 2.000\nrecv  233\nupdated rto\nsend  234: rtt = 0.230, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  234\nupdated rto\nsend  235: rtt = 0.240, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv  235\nupdated rto\nsend  236: rtt = 0.230, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  236\nupdated rto\nsend  237: rtt = 0.240, srtt = 0.241, rttvar = 0.009, rto = 2.000\nrecv  237\nupdated rto\nsend  238: rtt = 0.230, srtt = 0.240, rttvar = 0.009, rto = 2.000\nrecv  238\nupdated rto\nsend  239: rtt = 0.199, srtt = 0.235, rttvar = 0.017, rto = 2.000\nrecv  239\nupdated rto\nsend  240: rtt = 0.219, srtt = 0.233, rttvar = 0.017, rto = 2.000\nrecv  240\nupdated rto\nsend  241: rtt = 0.190, srtt = 0.228, rttvar = 0.023, rto = 2.000\nrecv  241\nupdated rto\nsend  242: rtt = 0.239, srtt = 0.229, rttvar = 0.020, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  242: rtt = 0.239, srtt = 0.229, rttvar = 0.020, rto = 4.000\nrecv  242\nupdated rto\nsend  243: rtt = 0.300, srtt = 0.238, rttvar = 0.033, rto = 2.000\nrecv  243\nupdated rto\nsend  244: rtt = 0.320, srtt = 0.248, rttvar = 0.045, rto = 2.000\nrecv  244\nupdated rto\nsend  245: rtt = 0.250, srtt = 0.248, rttvar = 0.034, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  245: rtt = 0.250, srtt = 0.248, rttvar = 0.034, rto = 4.000\nrecv  245\nupdated rto\nsend  246: rtt = 0.240, srtt = 0.247, rttvar = 0.028, rto = 2.000\nrecv  246\nupdated rto\nsend  247: rtt = 0.230, srtt = 0.245, rttvar = 0.025, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  247: rtt = 0.230, srtt = 0.245, rttvar = 0.025, rto = 4.000\nrecv  247\nupdated rto\nsend  248: rtt = 0.267, srtt = 0.248, rttvar = 0.024, rto = 2.000\nrecv  248\nupdated rto\nsend  249: rtt = 0.253, srtt = 0.249, rttvar = 0.020, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  249: rtt = 0.253, srtt = 0.249, rttvar = 0.020, rto = 4.000\nrecv  249\nupdated rto\nsend  250: rtt = 0.260, srtt = 0.250, rttvar = 0.018, rto = 2.000\nrecv  250\nupdated rto\nsend  251: rtt = 0.230, srtt = 0.247, rttvar = 0.018, rto = 2.000\nrecv  251\nupdated rto\nsend  252: rtt = 0.210, srtt = 0.243, rttvar = 0.023, rto = 2.000\nrecv  252\nupdated rto\nsend  253: rtt = 0.239, srtt = 0.242, rttvar = 0.018, rto = 2.000\nrecv  253\nupdated rto\nsend  254: rtt = 0.240, srtt = 0.242, rttvar = 0.014, rto = 2.000\nrecv  254\nupdated rto\nsend  255: rtt = 0.243, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  255\nupdated rto\nsend  256: rtt = 0.217, srtt = 0.239, rttvar = 0.014, rto = 2.000\nrecv  256\nupdated rto\nsend  257: rtt = 0.271, srtt = 0.243, rttvar = 0.019, rto = 2.000\nrecv  257\nupdated rto\nsend  258: rtt = 0.228, srtt = 0.241, rttvar = 0.018, rto = 2.000\nrecv  258\nupdated rto\nsend  259: rtt = 0.250, srtt = 0.242, rttvar = 0.016, rto = 2.000\nrecv  259\nupdated rto\nsend  260: rtt = 0.249, srtt = 0.243, rttvar = 0.013, rto = 2.000\nrecv  260\nupdated rto\nsend  261: rtt = 0.220, srtt = 0.240, rttvar = 0.016, rto = 2.000\nrecv  261\nupdated rto\nsend  262: rtt = 0.279, srtt = 0.245, rttvar = 0.022, rto = 2.000\nrecv  262\nupdated rto\nsend  263: rtt = 0.230, srtt = 0.243, rttvar = 0.020, rto = 2.000\nrecv  263\nupdated rto\nsend  264: rtt = 0.566, srtt = 0.284, rttvar = 0.096, rto = 2.000\nrecv  264\nupdated rto\nsend  265: rtt = 0.223, srtt = 0.276, rttvar = 0.087, rto = 2.000\nrecv  265\nupdated rto\nsend  266: rtt = 0.250, srtt = 0.273, rttvar = 0.072, rto = 2.000\nrecv  266\nupdated rto\nsend  267: rtt = 0.263, srtt = 0.271, rttvar = 0.056, rto = 2.000\nrecv  267\nupdated rto\nsend  268: rtt = 0.217, srtt = 0.265, rttvar = 0.056, rto = 2.000\nrecv  268\nupdated rto\nsend  269: rtt = 0.269, srtt = 0.265, rttvar = 0.043, rto = 2.000\nrecv  269\nupdated rto\nsend  270: rtt = 0.261, srtt = 0.265, rttvar = 0.033, rto = 2.000\nrecv  270\nupdated rto\nsend  271: rtt = 0.258, srtt = 0.264, rttvar = 0.027, rto = 2.000\nrecv  271\nupdated rto\nsend  272: rtt = 0.249, srtt = 0.262, rttvar = 0.024, rto = 2.000\nrecv  272\nupdated rto\nsend  273: rtt = 0.244, srtt = 0.260, rttvar = 0.022, rto = 2.000\nrecv  273\nupdated rto\nsend  274: rtt = 0.225, srtt = 0.255, rttvar = 0.025, rto = 2.000\nrecv  274\nupdated rto\nsend  275: rtt = 0.270, srtt = 0.257, rttvar = 0.023, rto = 2.000\nrecv  275\nupdated rto\nsend  276: rtt = 0.250, srtt = 0.256, rttvar = 0.019, rto = 2.000\nrecv  276\nupdated rto\nsend  277: rtt = 0.219, srtt = 0.252, rttvar = 0.023, rto = 2.000\nrecv  277\nupdated rto\nsend  278: rtt = 0.260, srtt = 0.253, rttvar = 0.020, rto = 2.000\nrecv  278\nupdated rto\nsend  279: rtt = 0.259, srtt = 0.253, rttvar = 0.016, rto = 2.000\nrecv  279\nupdated rto\nsend  280: rtt = 0.249, srtt = 0.253, rttvar = 0.013, rto = 2.000\nrecv  280\nupdated rto\nsend  281: rtt = 0.230, srtt = 0.250, rttvar = 0.016, rto = 2.000\nrecv  281\nupdated rto\nsend  282: rtt = 0.228, srtt = 0.247, rttvar = 0.017, rto = 2.000\nrecv  282\nupdated rto\nsend  283: rtt = 0.209, srtt = 0.243, rttvar = 0.023, rto = 2.000\nrecv  283\nupdated rto\nsend  284: rtt = 0.249, srtt = 0.243, rttvar = 0.019, rto = 2.000\nrecv  284\nupdated rto\nsend  285: rtt = 0.219, srtt = 0.240, rttvar = 0.020, rto = 2.000\nrecv  285\nupdated rto\nsend  286: rtt = 0.250, srtt = 0.242, rttvar = 0.017, rto = 2.000\nrecv  286\nupdated rto\nsend  287: rtt = 0.250, srtt = 0.243, rttvar = 0.015, rto = 2.000\nrecv  287\nupdated rto\nsend  288: rtt = 0.250, srtt = 0.243, rttvar = 0.013, rto = 2.000\nrecv  288\nupdated rto\nsend  289: rtt = 0.250, srtt = 0.244, rttvar = 0.012, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  289: rtt = 0.250, srtt = 0.244, rttvar = 0.012, rto = 4.000\nrecv  289\nupdated rto\nsend  290: rtt = 0.259, srtt = 0.246, rttvar = 0.012, rto = 2.000\nrecv  290\nupdated rto\nsend  291: rtt = 0.250, srtt = 0.247, rttvar = 0.010, rto = 2.000\nrecv  291\nupdated rto\nsend  292: rtt = 0.249, srtt = 0.247, rttvar = 0.008, rto = 2.000\nrecv  292\nupdated rto\nsend  293: rtt = 0.240, srtt = 0.246, rttvar = 0.008, rto = 2.000\nrecv  293\nupdated rto\nsend  294: rtt = 0.229, srtt = 0.244, rttvar = 0.010, rto = 2.000\nrecv  294\nupdated rto\nsend  295: rtt = 0.292, srtt = 0.250, rttvar = 0.020, rto = 2.000\nrecv  295\nupdated rto\nsend  296: rtt = 0.216, srtt = 0.246, rttvar = 0.023, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  296: rtt = 0.216, srtt = 0.246, rttvar = 0.023, rto = 4.000\nrecv  296\nupdated rto\nsend  297: rtt = 0.230, srtt = 0.244, rttvar = 0.021, rto = 2.000\nrecv  297\nupdated rto\nsend  298: rtt = 0.230, srtt = 0.242, rttvar = 0.019, rto = 2.000\nrecv  298\nupdated rto\nsend  299: rtt = 0.219, srtt = 0.239, rttvar = 0.020, rto = 2.000\nrecv  299\nupdated rto\nsend  300: rtt = 0.254, srtt = 0.241, rttvar = 0.019, rto = 2.000\nrecv  300\nupdated rto\nsend  301: rtt = 0.278, srtt = 0.246, rttvar = 0.023, rto = 2.000\nrecv  301\nupdated rto\nsend  302: rtt = 0.256, srtt = 0.247, rttvar = 0.020, rto = 2.000\nrecv  302\nupdated rto\nsend  303: rtt = 0.240, srtt = 0.246, rttvar = 0.017, rto = 2.000\nrecv  303\nupdated rto\nsend  304: rtt = 0.240, srtt = 0.245, rttvar = 0.014, rto = 2.000\nrecv  304\nupdated rto\nsend  305: rtt = 0.250, srtt = 0.246, rttvar = 0.012, rto = 2.000\nrecv  305\nupdated rto\nsend  306: rtt = 0.240, srtt = 0.245, rttvar = 0.010, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  306: rtt = 0.240, srtt = 0.245, rttvar = 0.010, rto = 4.000\nrecv  306\nupdated rto\nsend  307: rtt = 0.220, srtt = 0.242, rttvar = 0.014, rto = 2.000\nrecv  307\nupdated rto\nsend  308: rtt = 0.220, srtt = 0.239, rttvar = 0.016, rto = 2.000\nrecv  308\nupdated rto\nsend  309: rtt = 0.240, srtt = 0.239, rttvar = 0.012, rto = 2.000\nrecv  309\nupdated rto\nsend  310: rtt = 0.249, srtt = 0.241, rttvar = 0.012, rto = 2.000\nrecv  310\nupdated rto\nsend  311: rtt = 0.250, srtt = 0.242, rttvar = 0.011, rto = 2.000\nrecv  311\nupdated rto\nsend  312: rtt = 0.260, srtt = 0.244, rttvar = 0.013, rto = 2.000\nrecv  312\nupdated rto\nsend  313: rtt = 0.230, srtt = 0.242, rttvar = 0.013, rto = 2.000\nrecv  313\nupdated rto\nsend  314: rtt = 0.230, srtt = 0.241, rttvar = 0.013, rto = 2.000\nrecv  314\nupdated rto\nsend  315: rtt = 0.199, srtt = 0.236, rttvar = 0.020, rto = 2.000\nrecv  315\nupdated rto\nsend  316: rtt = 0.230, srtt = 0.235, rttvar = 0.016, rto = 2.000\nrecv  316\nupdated rto\nsend  317: rtt = 0.228, srtt = 0.234, rttvar = 0.014, rto = 2.000\nrecv  317\nupdated rto\nsend  318: rtt = 0.239, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv  318\nupdated rto\nsend  319: rtt = 0.230, srtt = 0.234, rttvar = 0.010, rto = 2.000\nrecv  319\nupdated rto\nsend  320: rtt = 0.240, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  320\nupdated rto\nsend  321: rtt = 0.249, srtt = 0.237, rttvar = 0.010, rto = 2.000\nrecv  321\nupdated rto\nsend  322: rtt = 0.250, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  322\nupdated rto\nsend  323: rtt = 0.220, srtt = 0.236, rttvar = 0.013, rto = 2.000\nrecv  323\nupdated rto\nsend  324: rtt = 0.226, srtt = 0.235, rttvar = 0.012, rto = 2.000\nrecv  324\nupdated rto\nsend  325: rtt = 0.234, srtt = 0.235, rttvar = 0.009, rto = 2.000\nrecv  325\nupdated rto\nsend  326: rtt = 0.260, srtt = 0.238, rttvar = 0.013, rto = 2.000\nrecv  326\nupdated rto\nsend  327: rtt = 0.309, srtt = 0.247, rttvar = 0.028, rto = 2.000\nrecv  327\nupdated rto\nsend  328: rtt = 0.220, srtt = 0.243, rttvar = 0.028, rto = 2.000\nrecv  328\nupdated rto\nsend  329: rtt = 0.229, srtt = 0.242, rttvar = 0.024, rto = 2.000\nrecv  329\nupdated rto\nsend  330: rtt = 0.230, srtt = 0.240, rttvar = 0.021, rto = 2.000\nrecv  330\nupdated rto\nsend  331: rtt = 0.240, srtt = 0.240, rttvar = 0.016, rto = 2.000\nrecv  331\nupdated rto\nsend  332: rtt = 0.276, srtt = 0.245, rttvar = 0.021, rto = 2.000\nrecv  332\nupdated rto\nsend  333: rtt = 0.213, srtt = 0.241, rttvar = 0.024, rto = 2.000\nrecv  333\nupdated rto\nsend  334: rtt = 0.251, srtt = 0.242, rttvar = 0.020, rto = 2.000\nrecv  334\nupdated rto\nsend  335: rtt = 0.238, srtt = 0.241, rttvar = 0.016, rto = 2.000\nrecv  335\nupdated rto\nsend  336: rtt = 0.240, srtt = 0.241, rttvar = 0.012, rto = 2.000\nrecv  336\nupdated rto\nsend  337: rtt = 0.230, srtt = 0.240, rttvar = 0.012, rto = 2.000\nrecv  337\nupdated rto\nsend  338: rtt = 0.229, srtt = 0.238, rttvar = 0.012, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  338: rtt = 0.229, srtt = 0.238, rttvar = 0.012, rto = 4.000\nrecv  338\nupdated rto\nsend  339: rtt = 0.250, srtt = 0.240, rttvar = 0.012, rto = 2.000\nrecv  339\nupdated rto\nsend  340: rtt = 0.230, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  340\nupdated rto\nsend  341: rtt = 0.230, srtt = 0.238, rttvar = 0.011, rto = 2.000\nrecv  341\nupdated rto\nsend  342: rtt = 0.290, srtt = 0.244, rttvar = 0.021, rto = 2.000\nrecv  342\nupdated rto\nsend  343: rtt = 0.240, srtt = 0.244, rttvar = 0.017, rto = 2.000\nrecv  343\nupdated rto\nsend  344: rtt = 0.260, srtt = 0.246, rttvar = 0.017, rto = 2.000\nrecv  344\nupdated rto\nsend  345: rtt = 0.230, srtt = 0.244, rttvar = 0.016, rto = 2.000\nrecv  345\nupdated rto\nsend  346: rtt = 0.268, srtt = 0.247, rttvar = 0.018, rto = 2.000\nrecv  346\nupdated rto\nsend  347: rtt = 0.303, srtt = 0.254, rttvar = 0.028, rto = 2.000\nrecv  347\nupdated rto\nsend  348: rtt = 0.237, srtt = 0.252, rttvar = 0.025, rto = 2.000\nrecv  348\nupdated rto\nsend  349: rtt = 0.219, srtt = 0.248, rttvar = 0.027, rto = 2.000\nrecv  349\nupdated rto\nsend  350: rtt = 0.229, srtt = 0.245, rttvar = 0.025, rto = 2.000\nrecv  350\nupdated rto\nsend  351: rtt = 0.250, srtt = 0.246, rttvar = 0.020, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  351: rtt = 0.250, srtt = 0.246, rttvar = 0.020, rto = 4.000\nrecv  351\nupdated rto\nsend  352: rtt = 0.240, srtt = 0.245, rttvar = 0.016, rto = 2.000\nrecv  352\nupdated rto\nsend  353: rtt = 0.230, srtt = 0.243, rttvar = 0.016, rto = 2.000\nrecv  353\nupdated rto\nsend  354: rtt = 0.260, srtt = 0.245, rttvar = 0.016, rto = 2.000\nrecv  354\nupdated rto\nsend  355: rtt = 0.219, srtt = 0.242, rttvar = 0.019, rto = 2.000\nrecv  355\nupdated rto\nsend  356: rtt = 0.240, srtt = 0.242, rttvar = 0.015, rto = 2.000\nrecv  356\nupdated rto\nsend  357: rtt = 0.230, srtt = 0.240, rttvar = 0.014, rto = 2.000\nrecv  357\nupdated rto\nsend  358: rtt = 0.260, srtt = 0.243, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  358: rtt = 0.260, srtt = 0.243, rttvar = 0.015, rto = 4.000\nrecv  358\nupdated rto\nsend  359: rtt = 0.240, srtt = 0.242, rttvar = 0.012, rto = 2.000\nrecv  359\nupdated rto\nsend  360: rtt = 0.239, srtt = 0.242, rttvar = 0.010, rto = 2.000\nrecv  360\nupdated rto\nsend  361: rtt = 0.240, srtt = 0.242, rttvar = 0.008, rto = 2.000\nrecv  361\nupdated rto\nsend  362: rtt = 0.250, srtt = 0.243, rttvar = 0.008, rto = 2.000\nrecv  362\nupdated rto\nsend  363: rtt = 0.250, srtt = 0.244, rttvar = 0.008, rto = 2.000\nrecv  363\nupdated rto\nsend  364: rtt = 0.299, srtt = 0.251, rttvar = 0.020, rto = 2.000\nrecv  364\nupdated rto\nsend  365: rtt = 0.259, srtt = 0.252, rttvar = 0.017, rto = 2.000\nrecv  365\nupdated rto\nsend  366: rtt = 0.240, srtt = 0.250, rttvar = 0.016, rto = 2.000\nrecv  366\nupdated rto\nsend  367: rtt = 0.260, srtt = 0.251, rttvar = 0.014, rto = 2.000\nrecv  367\nupdated rto\nsend  368: rtt = 0.250, srtt = 0.251, rttvar = 0.011, rto = 2.000\nrecv  368\nupdated rto\nsend  369: rtt = 0.239, srtt = 0.250, rttvar = 0.011, rto = 2.000\nrecv  369\nupdated rto\nsend  370: rtt = 0.249, srtt = 0.250, rttvar = 0.009, rto = 2.000\nrecv  370\nupdated rto\nsend  371: rtt = 0.264, srtt = 0.251, rttvar = 0.010, rto = 2.000\nrecv  371\nupdated rto\nsend  372: rtt = 0.465, srtt = 0.278, rttvar = 0.061, rto = 2.000\nrecv  372\nupdated rto\nsend  373: rtt = 0.259, srtt = 0.276, rttvar = 0.050, rto = 2.000\nrecv  373\nupdated rto\nsend  374: rtt = 0.230, srtt = 0.270, rttvar = 0.049, rto = 2.000\nrecv  374\nupdated rto\nsend  375: rtt = 0.240, srtt = 0.266, rttvar = 0.044, rto = 2.000\nrecv  375\nupdated rto\nsend  376: rtt = 0.250, srtt = 0.264, rttvar = 0.037, rto = 2.000\nrecv  376\nupdated rto\nsend  377: rtt = 0.260, srtt = 0.264, rttvar = 0.029, rto = 2.000\nrecv  377\nupdated rto\nsend  378: rtt = 0.239, srtt = 0.261, rttvar = 0.028, rto = 2.000\nrecv  378\nupdated rto\nsend  379: rtt = 0.229, srtt = 0.257, rttvar = 0.029, rto = 2.000\nrecv  379\nupdated rto\nsend  380: rtt = 0.240, srtt = 0.255, rttvar = 0.026, rto = 2.000\nrecv  380\nupdated rto\nsend  381: rtt = 0.230, srtt = 0.252, rttvar = 0.026, rto = 2.000\nrecv  381\nupdated rto\nsend  382: rtt = 0.250, srtt = 0.251, rttvar = 0.020, rto = 2.000\nrecv  382\nupdated rto\nsend  383: rtt = 0.280, srtt = 0.255, rttvar = 0.022, rto = 2.000\nrecv  383\nupdated rto\nsend  384: rtt = 0.240, srtt = 0.253, rttvar = 0.020, rto = 2.000\nrecv  384\nupdated rto\nsend  385: rtt = 0.250, srtt = 0.253, rttvar = 0.016, rto = 2.000\nrecv  385\nupdated rto\nsend  386: rtt = 0.220, srtt = 0.249, rttvar = 0.020, rto = 2.000\nrecv  386\nupdated rto\nsend  387: rtt = 0.239, srtt = 0.247, rttvar = 0.017, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  387: rtt = 0.239, srtt = 0.247, rttvar = 0.017, rto = 4.000\nrecv  387\nupdated rto\nsend  388: rtt = 0.220, srtt = 0.244, rttvar = 0.020, rto = 2.000\nrecv  388\nupdated rto\nsend  389: rtt = 0.230, srtt = 0.242, rttvar = 0.018, rto = 2.000\nrecv  389\nupdated rto\nsend  390: rtt = 0.220, srtt = 0.239, rttvar = 0.019, rto = 2.000\nrecv  390\nupdated rto\nsend  391: rtt = 0.240, srtt = 0.240, rttvar = 0.015, rto = 2.000\nrecv  391\nupdated rto\nsend  392: rtt = 0.249, srtt = 0.241, rttvar = 0.013, rto = 2.000\nrecv  392\nupdated rto\nsend  393: rtt = 0.260, srtt = 0.243, rttvar = 0.015, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  393: rtt = 0.260, srtt = 0.243, rttvar = 0.015, rto = 4.000\nrecv  393\nupdated rto\nsend  394: rtt = 0.270, srtt = 0.246, rttvar = 0.018, rto = 2.000\nrecv  394\nupdated rto\nsend  395: rtt = 0.250, srtt = 0.247, rttvar = 0.014, rto = 2.000\nrecv  395\nupdated rto\nsend  396: rtt = 0.250, srtt = 0.247, rttvar = 0.011, rto = 2.000\nrecv  396\nupdated rto\nsend  397: rtt = 0.230, srtt = 0.245, rttvar = 0.013, rto = 2.000\nrecv  397\nupdated rto\nsend  398: rtt = 0.259, srtt = 0.247, rttvar = 0.013, rto = 2.000\nrecv  398\nupdated rto\nsend  399: rtt = 0.249, srtt = 0.247, rttvar = 0.010, rto = 2.000\nrecv  399\nupdated rto\nsend  400: rtt = 0.240, srtt = 0.246, rttvar = 0.010, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  400: rtt = 0.240, srtt = 0.246, rttvar = 0.010, rto = 4.000\nrecv  400\nupdated rto\nsend  401: rtt = 0.250, srtt = 0.247, rttvar = 0.008, rto = 2.000\nrecv  401\nupdated rto\nsend  402: rtt = 0.250, srtt = 0.247, rttvar = 0.007, rto = 2.000\nrecv  402\nupdated rto\nsend  403: rtt = 0.230, srtt = 0.245, rttvar = 0.009, rto = 2.000\nrecv  403\nupdated rto\nsend  404: rtt = 0.240, srtt = 0.244, rttvar = 0.008, rto = 2.000\nrecv  404\nupdated rto\nsend  405: rtt = 0.240, srtt = 0.244, rttvar = 0.007, rto = 2.000\nrecv  405\nupdated rto\nsend  406: rtt = 0.260, srtt = 0.246, rttvar = 0.010, rto = 2.000\nrecv  406\nupdated rto\nsend  407: rtt = 0.239, srtt = 0.245, rttvar = 0.009, rto = 2.000\nrecv  407\nupdated rto\nsend  408: rtt = 0.229, srtt = 0.243, rttvar = 0.011, rto = 2.000\nrecv  408\nupdated rto\nsend  409: rtt = 0.240, srtt = 0.243, rttvar = 0.009, rto = 2.000\nrecv  409\nupdated rto\nsend  410: rtt = 0.250, srtt = 0.244, rttvar = 0.008, rto = 2.000\nrecv  410\nupdated rto\nsend  411: rtt = 0.249, srtt = 0.244, rttvar = 0.008, rto = 2.000\nrecv  411\nupdated rto\nsend  412: rtt = 0.270, srtt = 0.247, rttvar = 0.012, rto = 2.000\nrecv  412\nupdated rto\nsend  413: rtt = 0.209, srtt = 0.243, rttvar = 0.019, rto = 2.000\nrecv  413\nupdated rto\nsend  414: rtt = 0.230, srtt = 0.241, rttvar = 0.017, rto = 2.000\nrecv  414\nupdated rto\nsend  415: rtt = 0.229, srtt = 0.240, rttvar = 0.016, rto = 2.000\nrecv  415\nupdated rto\nsend  416: rtt = 0.230, srtt = 0.238, rttvar = 0.014, rto = 2.000\nrecv  416\nupdated rto\nsend  417: rtt = 0.267, srtt = 0.242, rttvar = 0.018, rto = 2.000\nrecv  417\nupdated rto\nsend  418: rtt = 0.262, srtt = 0.244, rttvar = 0.018, rto = 2.000\nrecv  418\nupdated rto\nsend  419: rtt = 0.240, srtt = 0.244, rttvar = 0.015, rto = 2.000\nrecv  419\nupdated rto\nsend  420: rtt = 0.239, srtt = 0.243, rttvar = 0.012, rto = 2.000\nrecv  420\nupdated rto\nsend  421: rtt = 0.242, srtt = 0.243, rttvar = 0.010, rto = 2.000\nrecv  421\nupdated rto\nsend  422: rtt = 0.237, srtt = 0.242, rttvar = 0.009, rto = 2.000\nrecv  422\nupdated rto\nsend  423: rtt = 0.240, srtt = 0.242, rttvar = 0.007, rto = 2.000\nrecv  423\nupdated rto\nsend  424: rtt = 0.250, srtt = 0.243, rttvar = 0.007, rto = 2.000\nrecv  424\nupdated rto\nsend  425: rtt = 0.269, srtt = 0.246, rttvar = 0.012, rto = 2.000\nrecv  425\nupdated rto\nsend  426: rtt = 0.250, srtt = 0.247, rttvar = 0.010, rto = 2.000\nrecv  426\nupdated rto\nsend  427: rtt = 0.230, srtt = 0.245, rttvar = 0.012, rto = 2.000\nrecv  427\nupdated rto\nsend  428: rtt = 0.269, srtt = 0.248, rttvar = 0.015, rto = 2.000\nrecv  428\nupdated rto\nsend  429: rtt = 0.259, srtt = 0.249, rttvar = 0.014, rto = 2.000\nrecv  429\nupdated rto\nsend  430: rtt = 0.270, srtt = 0.252, rttvar = 0.016, rto = 2.000\nrecv  430\nupdated rto\nsend  431: rtt = 0.249, srtt = 0.251, rttvar = 0.012, rto = 2.000\nrecv  431\nupdated rto\nsend  432: rtt = 0.220, srtt = 0.247, rttvar = 0.017, rto = 2.000\nrecv  432\nupdated rto\nsend  433: rtt = 0.260, srtt = 0.249, rttvar = 0.016, rto = 2.000\nrecv  433\nupdated rto\nsend  434: rtt = 0.250, srtt = 0.249, rttvar = 0.012, rto = 2.000\nrecv  434\nupdated rto\nsend  435: rtt = 0.220, srtt = 0.246, rttvar = 0.016, rto = 2.000\nrecv  435\nupdated rto\nsend  436: rtt = 0.230, srtt = 0.244, rttvar = 0.016, rto = 2.000\nrecv  436\nupdated rto\nsend  437: rtt = 0.240, srtt = 0.243, rttvar = 0.013, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  437: rtt = 0.240, srtt = 0.243, rttvar = 0.013, rto = 4.000\nrecv  437\nupdated rto\nsend  438: rtt = 0.250, srtt = 0.244, rttvar = 0.012, rto = 2.000\nrecv  438\nupdated rto\nsend  439: rtt = 0.260, srtt = 0.246, rttvar = 0.013, rto = 2.000\nrecv  439\nupdated rto\nsend  440: rtt = 0.220, srtt = 0.243, rttvar = 0.016, rto = 2.000\nrecv  440\nupdated rto\nsend  441: rtt = 0.210, srtt = 0.239, rttvar = 0.020, rto = 2.000\nrecv  441\nupdated rto\nsend  442: rtt = 0.240, srtt = 0.239, rttvar = 0.015, rto = 2.000\nrecv  442\nupdated rto\nsend  443: rtt = 0.250, srtt = 0.240, rttvar = 0.014, rto = 2.000\nrecv  443\nupdated rto\nsend  444: rtt = 0.241, srtt = 0.240, rttvar = 0.011, rto = 2.000\nrecv  444\nupdated rto\nsend  445: rtt = 0.228, srtt = 0.239, rttvar = 0.011, rto = 2.000\nrecv  445\nupdated rto\nsend  446: rtt = 0.240, srtt = 0.239, rttvar = 0.009, rto = 2.000\nrecv  446\nupdated rto\nsend  447: rtt = 0.230, srtt = 0.238, rttvar = 0.009, rto = 2.000\nrecv  447\nupdated rto\nsend  448: rtt = 0.240, srtt = 0.238, rttvar = 0.007, rto = 2.000\nrecv  448\nupdated rto\nsend  449: rtt = 0.220, srtt = 0.236, rttvar = 0.010, rto = 2.000\nrecv  449\nupdated rto\nsend  450: rtt = 0.260, srtt = 0.239, rttvar = 0.013, rto = 2.000\nrecv  450\nupdated rto\nsend  451: rtt = 0.250, srtt = 0.240, rttvar = 0.013, rto = 2.000\nrecv  451\nupdated rto\nsend  452: rtt = 0.240, srtt = 0.240, rttvar = 0.010, rto = 2.000\nrecv  452\nupdated rto\nsend  453: rtt = 0.589, srtt = 0.284, rttvar = 0.094, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  453: rtt = 0.589, srtt = 0.284, rttvar = 0.094, rto = 4.000\nrecv  453\nupdated rto\nsend  454: rtt = 0.257, srtt = 0.280, rttvar = 0.078, rto = 2.000\nrecv  454\nupdated rto\nsend  455: rtt = 0.230, srtt = 0.274, rttvar = 0.071, rto = 2.000\nrecv  455\nupdated rto\nsend  456: rtt = 0.230, srtt = 0.269, rttvar = 0.064, rto = 2.000\nrecv  456\nupdated rto\nsend  457: rtt = 0.239, srtt = 0.265, rttvar = 0.056, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  457: rtt = 0.239, srtt = 0.265, rttvar = 0.056, rto = 4.000\nrecv  457\nupdated rto\nsend  458: rtt = 0.260, srtt = 0.264, rttvar = 0.043, rto = 2.000\nrecv  458\nupdated rto\nsend  459: rtt = 0.240, srtt = 0.261, rttvar = 0.038, rto = 2.000\nrecv  459\nupdated rto\nsend  460: rtt = 0.260, srtt = 0.261, rttvar = 0.029, rto = 2.000\nrecv  460\nupdated rto\nsend  461: rtt = 0.280, srtt = 0.263, rttvar = 0.026, rto = 2.000\nrecv  461\nupdated rto\nsend  462: rtt = 0.249, srtt = 0.262, rttvar = 0.023, rto = 2.000\nrecv  462\nupdated rto\nsend  463: rtt = 0.240, srtt = 0.259, rttvar = 0.023, rto = 2.000\nrecv  463\nupdated rto\nsend  464: rtt = 0.250, srtt = 0.258, rttvar = 0.020, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  464: rtt = 0.250, srtt = 0.258, rttvar = 0.020, rto = 4.000\ndgsendrecv: timeout, retransmitting\nsend  464: rtt = 0.250, srtt = 0.258, rttvar = 0.020, rto = 8.000\nrecv  464\nupdated rto\nsend  465: rtt = 0.260, srtt = 0.258, rttvar = 0.015, rto = 2.000\nrecv  465\nupdated rto\nsend  466: rtt = 0.230, srtt = 0.255, rttvar = 0.018, rto = 2.000\nrecv  466\nupdated rto\nsend  467: rtt = 0.239, srtt = 0.253, rttvar = 0.018, rto = 2.000\nrecv  467\nupdated rto\nsend  468: rtt = 0.280, srtt = 0.256, rttvar = 0.020, rto = 2.000\nrecv  468\nupdated rto\nsend  469: rtt = 0.240, srtt = 0.254, rttvar = 0.019, rto = 2.000\nrecv  469\nupdated rto\nsend  470: rtt = 0.230, srtt = 0.251, rttvar = 0.020, rto = 2.000\nrecv  470\nupdated rto\nsend  471: rtt = 0.250, srtt = 0.251, rttvar = 0.016, rto = 2.000\nrecv  471\nupdated rto\nsend  472: rtt = 0.280, srtt = 0.255, rttvar = 0.019, rto = 2.000\nrecv  472\nupdated rto\nsend  473: rtt = 0.250, srtt = 0.254, rttvar = 0.015, rto = 2.000\nrecv  473\nupdated rto\nsend  474: rtt = 0.270, srtt = 0.256, rttvar = 0.015, rto = 2.000\nrecv  474\nupdated rto\nsend  475: rtt = 0.269, srtt = 0.258, rttvar = 0.015, rto = 2.000\nrecv  475\nupdated rto\nsend  476: rtt = 0.260, srtt = 0.258, rttvar = 0.012, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  476: rtt = 0.260, srtt = 0.258, rttvar = 0.012, rto = 4.000\nrecv  476\nupdated rto\nsend  477: rtt = 0.230, srtt = 0.254, rttvar = 0.016, rto = 2.000\nrecv  477\nupdated rto\nsend  478: rtt = 0.260, srtt = 0.255, rttvar = 0.013, rto = 2.000\nrecv  478\nupdated rto\nsend  479: rtt = 0.240, srtt = 0.253, rttvar = 0.014, rto = 2.000\nrecv  479\nupdated rto\nsend  480: rtt = 0.289, srtt = 0.258, rttvar = 0.019, rto = 2.000\nrecv  480\nupdated rto\nsend  481: rtt = 0.250, srtt = 0.257, rttvar = 0.016, rto = 2.000\nrecv  481\nupdated rto\nsend  482: rtt = 0.290, srtt = 0.261, rttvar = 0.021, rto = 2.000\ndgsendrecv: timeout, retransmitting\nsend  482: rtt = 0.290, srtt = 0.261, rttvar = 0.021, rto = 4.000\nrecv  482\nupdated rto\nsend  483: rtt = 0.270, srtt = 0.262, rttvar = 0.018, rto = 2.000\nrecv  483\nupdated rto\nsend  484: rtt = 0.248, srtt = 0.260, rttvar = 0.017, rto = 2.000\nrecv  484\nupdated rto\nsend  485: rtt = 0.291, srtt = 0.264, rttvar = 0.020, rto = 2.000\nrecv  485\nupdated rto\nsend  486: rtt = 0.250, srtt = 0.262, rttvar = 0.019, rto = 2.000\nrecv  486\nupdated rto\nsend  487: rtt = 0.250, srtt = 0.261, rttvar = 0.017, rto = 2.000\nrecv  487\nupdated rto\nsend  488: rtt = 0.230, srtt = 0.257, rttvar = 0.021, rto = 2.000\nrecv  488\nupdated rto\nsend  489: rtt = 0.240, srtt = 0.255, rttvar = 0.020, rto = 2.000\nrecv  489\nupdated rto\nsend  490: rtt = 0.310, srtt = 0.262, rttvar = 0.029, rto = 2.000\nrecv  490\nupdated rto\nsend  491: rtt = 0.220, srtt = 0.257, rttvar = 0.032, rto = 2.000\nrecv  491\nupdated rto\nsend  492: rtt = 0.250, srtt = 0.256, rttvar = 0.026, rto = 2.000\nrecv  492\nupdated rto\nsend  493: rtt = 0.220, srtt = 0.251, rttvar = 0.028, rto = 2.000\nrecv  493\nupdated rto\nsend  494: rtt = 0.260, srtt = 0.252, rttvar = 0.023, rto = 2.000\nrecv  494\nupdated rto\nsend  495: rtt = 0.270, srtt = 0.255, rttvar = 0.022, rto = 2.000\nrecv  495\nupdated rto\nsend  496: rtt = 0.240, srtt = 0.253, rttvar = 0.020, rto = 2.000\nrecv  496\nupdated rto\nsend  497: rtt = 0.239, srtt = 0.251, rttvar = 0.018, rto = 2.000\nrecv  497\nupdated rto\nsend  498: rtt = 0.239, srtt = 0.250, rttvar = 0.017, rto = 2.000\nrecv  498\nupdated rto\nsend  499: rtt = 0.210, srtt = 0.245, rttvar = 0.023, rto = 2.000\nrecv  499\nupdated rto\nsend  500: rtt = 0.278, srtt = 0.249, rttvar = 0.025, rto = 2.000\nrecv  500\nupdated rto\n"
  },
  {
    "path": "rtt/rtt.vals.kumba.1",
    "content": "1 0.000\n2 0.366\n3 0.309\n4 0.298\n5 0.360\n6 0.360\n7 0.320\n8 0.340\n9 0.330\n10 0.350\n11 0.349\n12 0.380\n13 0.349\n14 0.340\n15 0.280\n16 0.330\n17 0.340\n18 0.340\n19 0.349\n20 0.310\n21 0.350\n21 0.350\n22 0.340\n23 0.350\n24 0.319\n25 0.360\n26 0.290\n27 0.310\n28 0.340\n29 0.371\n30 0.368\n31 0.350\n32 0.364\n33 0.335\n33 0.335\n34 0.330\n35 0.290\n36 0.390\n37 0.355\n38 0.334\n39 0.320\n40 0.344\n41 0.345\n42 0.349\n43 0.305\n44 0.284\n45 0.320\n46 0.320\n47 0.340\n48 0.309\n49 0.310\n50 0.320\n51 0.320\n52 0.300\n53 0.320\n54 0.350\n55 0.349\n56 0.339\n57 0.350\n58 0.319\n59 0.309\n60 0.310\n61 0.320\n62 0.300\n63 0.309\n64 0.290\n65 0.320\n66 0.280\n67 0.339\n68 0.330\n69 0.320\n70 0.280\n71 0.319\n72 0.339\n73 0.309\n74 0.340\n75 0.330\n76 0.280\n77 0.320\n78 0.280\n79 0.330\n80 0.349\n81 0.320\n82 0.320\n83 0.329\n84 0.320\n85 0.329\n86 0.330\n87 0.339\n88 0.360\n89 0.320\n90 0.319\n91 0.330\n92 0.304\n93 0.316\n94 0.319\n95 0.360\n96 0.316\n97 0.314\n98 0.330\n99 0.330\n100 0.360\n101 0.330\n102 0.350\n103 0.320\n103 0.320\n104 0.340\n105 0.340\n106 0.320\n107 0.340\n108 0.340\n109 0.340\n110 0.369\n111 0.350\n112 0.369\n113 0.339\n114 0.349\n115 0.319\n116 0.340\n117 0.319\n118 0.340\n119 0.380\n120 0.340\n121 0.320\n122 0.340\n123 0.360\n124 0.359\n125 0.330\n126 0.329\n127 0.340\n128 0.360\n129 0.320\n130 0.340\n131 0.350\n132 0.340\n133 0.370\n134 0.339\n135 0.330\n136 0.340\n137 0.300\n138 0.340\n139 0.340\n140 0.380\n141 0.450\n142 0.370\n143 0.309\n144 0.290\n145 0.390\n146 0.329\n147 0.330\n148 0.320\n149 0.340\n150 0.359\n151 0.350\n152 0.349\n153 0.400\n154 0.350\n155 0.370\n156 0.359\n157 0.349\n158 0.360\n159 0.319\n160 0.320\n161 0.330\n162 0.340\n163 0.350\n164 0.350\n165 0.339\n166 0.339\n167 0.330\n168 0.310\n169 0.310\n170 0.320\n171 0.339\n172 0.320\n173 0.319\n174 0.320\n175 0.319\n176 0.309\n177 0.340\n178 0.334\n179 0.315\n180 0.309\n181 0.309\n182 0.330\n183 0.370\n184 0.320\n185 0.380\n186 0.350\n187 0.309\n188 0.330\n189 0.320\n189 0.320\n190 0.329\n191 0.310\n192 0.319\n193 0.310\n194 0.300\n195 0.309\n196 0.319\n197 0.310\n198 0.309\n199 0.330\n200 0.299\n201 0.310\n202 0.354\n203 0.312\n204 0.303\n205 0.329\n206 0.319\n207 0.339\n208 0.310\n209 0.321\n210 0.308\n211 0.350\n212 0.359\n213 0.310\n214 0.329\n215 0.310\n216 0.772\n217 0.317\n218 0.379\n219 0.310\n220 0.304\n221 0.315\n222 0.340\n223 0.329\n224 0.349\n225 0.350\n226 0.360\n227 0.380\n228 0.320\n229 0.319\n230 0.370\n231 0.358\n232 0.340\n233 0.360\n234 0.289\n235 0.350\n236 0.310\n237 0.319\n238 0.330\n239 0.308\n240 0.320\n241 0.290\n242 0.360\n243 0.330\n244 0.339\n245 0.350\n246 0.330\n247 0.309\n248 0.329\n249 0.360\n250 0.350\n251 0.340\n252 0.410\n253 0.339\n254 0.335\n255 0.335\n256 0.319\n257 0.350\n258 0.310\n259 0.320\n260 0.319\n261 0.300\n262 0.389\n263 1.259\n264 0.819\n265 0.809\n266 0.809\n267 0.819\n267 0.819\n268 0.748\n269 0.819\n270 0.819\n271 0.819\n272 0.799\n273 1.059\n274 0.370\n275 0.370\n276 0.380\n277 0.340\n278 0.400\n279 0.350\n280 0.320\n281 0.390\n282 0.329\n283 0.280\n284 0.330\n285 0.310\n286 0.370\n287 0.379\n288 0.329\n289 0.320\n290 0.410\n291 0.340\n292 0.360\n293 0.349\n294 0.360\n295 0.360\n296 0.329\n297 0.360\n298 0.340\n299 0.359\n300 0.369\n301 0.330\n302 0.320\n303 0.320\n304 0.313\n305 0.337\n306 0.320\n307 0.319\n308 0.680\n309 0.380\n310 0.319\n311 0.330\n312 0.330\n313 0.310\n314 0.300\n315 0.340\n316 0.350\n317 0.350\n318 0.340\n319 0.309\n320 0.343\n321 0.326\n322 0.319\n323 1.178\n324 0.320\n325 0.309\n326 0.330\n327 0.300\n328 0.300\n329 0.310\n330 0.290\n331 0.310\n332 0.300\n333 0.300\n334 0.340\n335 0.339\n336 0.310\n337 0.320\n338 0.330\n339 0.320\n340 0.315\n340 0.315\n341 0.338\n342 0.320\n343 0.309\n344 0.320\n345 0.349\n346 0.339\n347 0.300\n348 0.300\n349 0.289\n350 0.329\n351 0.340\n352 0.329\n353 0.320\n354 0.410\n355 0.300\n356 0.389\n357 0.299\n358 1.280\n359 0.809\n360 0.818\n361 0.819\n362 0.829\n363 0.819\n364 0.809\n365 0.819\n366 0.999\n367 0.999\n368 1.479\n369 1.010\n370 0.998\n371 0.999\n372 0.999\n373 0.999\n374 0.989\n375 0.989\n376 1.009\n377 0.999\n378 1.009\n379 0.939\n380 0.809\n381 0.821\n382 0.827\n382 0.827\n383 0.809\n384 0.839\n385 0.819\n386 0.809\n387 0.819\n388 0.819\n389 0.809\n390 0.811\n391 0.827\n392 0.813\n393 1.205\n394 0.829\n395 0.819\n396 0.819\n397 0.819\n398 0.819\n399 0.819\n400 0.819\n401 0.829\n402 0.819\n403 0.809\n404 0.819\n405 0.809\n406 0.819\n407 0.819\n408 0.799\n409 0.819\n410 0.819\n411 0.829\n412 0.820\n413 0.809\n414 0.819\n415 1.209\n416 0.809\n417 0.824\n418 0.814\n419 0.809\n420 0.819\n421 0.819\n422 0.809\n423 0.819\n424 0.821\n425 0.808\n426 0.819\n427 0.819\n428 0.819\n429 0.819\n430 0.819\n431 0.819\n432 0.609\n433 0.309\n434 0.330\n435 0.300\n436 0.319\n437 0.310\n438 0.320\n439 0.350\n440 0.290\n441 0.290\n442 0.300\n443 0.360\n444 0.310\n445 0.360\n446 0.319\n447 0.320\n448 0.330\n449 0.329\n450 0.370\n451 0.340\n452 0.340\n453 0.719\n454 0.339\n455 0.320\n456 0.310\n457 0.320\n458 0.330\n459 0.313\n460 0.377\n461 0.440\n462 0.340\n463 0.330\n464 0.360\n465 0.380\n466 0.320\n467 0.309\n468 0.360\n469 0.330\n470 0.290\n471 0.329\n472 0.319\n473 0.320\n474 0.349\n475 0.330\n476 0.360\n477 0.310\n478 0.320\n479 0.320\n480 0.410\n481 0.340\n482 0.409\n483 0.330\n484 0.280\n485 0.320\n485 0.320\n486 0.339\n487 0.360\n488 0.300\n489 0.320\n490 0.410\n491 0.320\n492 0.320\n493 0.319\n494 0.330\n495 0.320\n496 0.314\n497 0.325\n498 0.330\n499 0.290\n500 0.340\n"
  },
  {
    "path": "rtt/rtt.vals.vangogh.1",
    "content": "1 0.000\n2 0.316\n3 0.218\n4 0.225\n5 0.264\n6 0.228\n7 0.221\n8 0.228\n9 0.200\n10 0.240\n11 0.210\n12 0.249\n13 0.240\n14 0.260\n15 0.201\n16 0.248\n17 0.261\n18 0.248\n19 0.260\n20 0.210\n21 0.240\n22 0.240\n23 0.249\n24 0.230\n25 0.240\n25 0.240\n26 0.190\n27 0.220\n28 0.259\n29 0.243\n30 0.257\n31 0.260\n32 0.240\n33 0.240\n34 0.249\n35 0.210\n36 0.239\n37 0.240\n38 0.260\n38 0.260\n39 0.220\n40 0.230\n41 0.250\n42 0.240\n43 0.240\n44 0.210\n45 0.240\n46 0.239\n46 0.239\n47 0.240\n48 0.250\n49 0.239\n50 0.220\n51 0.229\n52 0.210\n53 0.259\n54 0.240\n55 0.260\n56 0.249\n57 0.249\n58 0.240\n59 0.209\n60 0.190\n61 0.230\n62 0.229\n63 0.229\n64 0.210\n65 0.230\n66 0.200\n67 0.240\n68 0.260\n69 0.240\n69 0.240\n70 0.200\n71 0.250\n72 0.220\n73 0.239\n74 0.229\n75 0.210\n76 0.199\n77 0.250\n78 0.199\n79 0.249\n80 0.239\n81 0.230\n82 0.259\n83 0.240\n84 0.240\n85 0.250\n86 0.230\n87 0.259\n88 0.220\n89 0.239\n90 0.250\n91 0.230\n92 0.219\n93 0.220\n94 0.229\n95 0.239\n96 0.250\n97 0.250\n98 0.220\n99 0.230\n100 0.249\n101 0.240\n102 0.239\n103 0.249\n103 0.249\n104 0.250\n105 0.260\n106 0.250\n107 0.241\n108 0.248\n109 0.249\n110 0.240\n111 0.259\n112 0.310\n113 0.250\n114 0.250\n115 0.230\n116 0.220\n117 0.230\n118 0.240\n119 0.240\n120 0.250\n121 0.250\n122 0.220\n123 0.219\n124 0.219\n125 0.240\n126 0.220\n127 0.230\n128 0.229\n129 0.239\n130 0.230\n131 0.259\n132 0.230\n133 0.249\n134 0.250\n135 0.240\n136 0.248\n137 0.200\n138 0.260\n139 0.230\n140 0.230\n141 0.230\n142 0.349\n143 0.230\n144 0.230\n145 0.250\n146 0.239\n147 0.220\n148 0.240\n149 0.240\n150 0.249\n151 0.219\n152 0.220\n153 0.229\n154 0.260\n155 0.259\n156 0.260\n157 0.239\n158 0.249\n159 0.229\n160 0.220\n161 0.240\n162 0.230\n163 0.230\n164 0.239\n165 0.269\n166 0.220\n167 0.219\n168 0.220\n169 0.220\n170 0.240\n171 0.239\n172 0.240\n173 0.240\n174 0.240\n175 0.229\n176 0.199\n177 0.249\n178 0.239\n179 0.220\n180 0.240\n181 0.219\n182 0.240\n183 0.240\n184 0.230\n185 0.240\n186 0.230\n187 0.240\n187 0.240\n188 0.229\n189 0.250\n190 0.248\n191 0.230\n191 0.230\n192 0.230\n193 0.230\n194 0.200\n195 0.210\n196 0.200\n197 0.209\n198 0.200\n199 0.231\n200 0.247\n201 0.240\n202 0.220\n203 0.200\n204 0.210\n205 0.200\n206 0.230\n207 0.250\n208 0.239\n209 0.230\n210 0.249\n211 0.230\n212 0.240\n213 0.240\n214 0.218\n215 0.229\n216 0.230\n217 0.250\n218 0.229\n219 0.229\n220 0.220\n221 0.220\n222 0.240\n223 0.240\n224 0.249\n225 0.239\n226 0.240\n227 0.279\n228 0.229\n229 0.229\n230 0.239\n231 0.239\n232 0.250\n233 0.249\n234 0.239\n235 0.240\n236 0.230\n237 0.240\n238 0.219\n239 0.199\n240 0.220\n240 0.220\n240 0.220\n241 0.210\n242 0.250\n243 0.240\n244 0.242\n245 0.237\n246 0.250\n247 0.221\n248 0.229\n248 0.229\n249 0.270\n250 0.260\n251 0.240\n252 0.229\n253 0.230\n254 0.240\n255 0.229\n256 0.230\n257 0.269\n258 0.219\n259 0.239\n260 0.229\n261 0.219\n262 0.260\n263 0.260\n264 0.240\n265 0.220\n266 0.250\n267 0.250\n268 0.230\n269 0.249\n270 0.250\n271 0.279\n272 0.220\n273 0.230\n274 0.229\n275 0.270\n276 0.260\n277 0.220\n277 0.220\n278 0.250\n279 0.240\n280 0.249\n281 0.211\n282 0.240\n283 0.210\n284 0.240\n285 0.199\n286 0.239\n287 0.230\n288 0.229\n289 0.250\n290 0.239\n291 0.230\n292 0.239\n293 0.240\n293 0.240\n294 0.220\n295 0.240\n296 0.219\n297 0.230\n298 0.240\n299 0.240\n300 0.259\n301 0.230\n302 0.230\n303 0.240\n304 0.250\n305 0.230\n306 0.230\n307 0.209\n308 0.232\n309 0.247\n310 0.250\n311 0.229\n312 0.230\n313 0.210\n314 0.249\n315 0.220\n316 0.249\n316 0.249\n317 0.230\n318 0.229\n319 0.229\n320 0.230\n321 0.250\n322 0.249\n323 0.230\n324 0.220\n325 0.229\n326 0.250\n327 0.220\n328 0.210\n329 0.229\n330 0.210\n331 0.220\n332 0.220\n333 0.220\n334 0.250\n335 0.250\n336 0.229\n337 0.239\n338 0.230\n339 0.230\n340 0.219\n341 0.240\n342 0.229\n343 0.220\n344 0.259\n345 0.230\n346 0.219\n347 0.219\n348 0.230\n349 0.240\n350 0.239\n351 0.250\n352 0.250\n353 0.220\n354 0.239\n355 0.230\n356 0.240\n357 0.230\n358 0.270\n359 0.240\n360 0.249\n361 0.240\n362 0.220\n363 0.239\n364 0.240\n365 0.259\n366 0.240\n367 0.239\n368 0.249\n369 0.240\n370 0.239\n371 0.229\n372 0.240\n373 0.259\n374 0.229\n375 0.230\n376 0.239\n377 0.259\n378 0.250\n379 0.250\n380 0.230\n381 0.239\n382 0.279\n383 0.259\n384 0.220\n385 0.249\n386 0.249\n387 0.220\n388 0.210\n389 0.230\n390 0.219\n390 0.219\n391 0.229\n392 0.229\n393 0.239\n394 0.240\n395 0.249\n396 0.250\n397 0.230\n398 0.260\n399 0.270\n400 0.240\n401 0.250\n402 0.259\n403 0.229\n404 0.249\n405 0.229\n406 0.250\n407 0.230\n408 0.230\n409 0.220\n410 0.229\n411 0.249\n412 0.249\n413 0.210\n414 0.220\n415 0.220\n416 0.219\n417 0.239\n418 0.260\n419 0.240\n420 0.229\n421 0.220\n422 0.229\n423 0.249\n424 0.260\n425 0.239\n426 0.240\n427 0.230\n428 0.279\n429 0.240\n430 0.249\n431 0.259\n432 0.250\n433 0.229\n434 0.240\n435 0.230\n436 0.249\n437 0.240\n438 0.240\n439 0.249\n440 0.220\n441 0.219\n442 0.239\n443 0.250\n444 0.240\n445 0.230\n445 0.230\n446 0.489\n447 0.230\n448 0.240\n449 0.250\n450 0.239\n451 0.260\n452 0.240\n453 0.599\n454 0.249\n455 0.220\n456 0.230\n457 0.220\n458 0.239\n459 0.230\n460 0.249\n461 0.240\n462 0.230\n463 0.230\n464 0.240\n465 0.249\n466 0.240\n467 0.229\n468 0.249\n469 0.249\n470 0.230\n471 0.250\n472 0.240\n473 0.250\n474 0.250\n474 0.250\n475 0.240\n476 0.250\n477 0.220\n478 0.250\n479 0.250\n480 0.240\n481 0.229\n482 0.279\n483 0.260\n484 0.209\n485 0.229\n486 0.230\n487 0.240\n488 0.220\n489 0.229\n490 0.309\n491 0.219\n492 0.240\n493 0.220\n494 0.239\n495 0.239\n496 0.239\n497 0.240\n498 0.240\n499 0.230\n500 0.250\n"
  },
  {
    "path": "rtt/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "rtt/unprtt.h",
    "content": "#ifndef\t__unp_rtt_h\n#define\t__unp_rtt_h\n\n#include\t\"unp.h\"\n\nstruct rtt_info {\n  float\t\trtt_rtt;\t/* most recent measured RTT, seconds */\n  float\t\trtt_srtt;\t/* smoothed RTT estimator, seconds */\n  float\t\trtt_rttvar;\t/* smoothed mean deviation, seconds */\n  float\t\trtt_rto;\t/* current RTO to use, seconds */\n  int\t\trtt_nrexmt;\t/* #times retransmitted: 0, 1, 2, ... */\n  uint32_t\trtt_base;\t/* #sec since 1/1/1970 at start */\n};\n\n#define\tRTT_RXTMIN      2\t/* min retransmit timeout value, seconds */\n#define\tRTT_RXTMAX     60\t/* max retransmit timeout value, seconds */\n#define\tRTT_MAXNREXMT \t3\t/* max #times to retransmit */\n\n\t\t\t\t/* function prototypes */\nvoid\t rtt_debug(struct rtt_info *);\nvoid\t rtt_init(struct rtt_info *);\nvoid\t rtt_newpack(struct rtt_info *);\nint\t\t rtt_start(struct rtt_info *);\nvoid\t rtt_stop(struct rtt_info *, uint32_t);\nint\t\t rtt_timeout(struct rtt_info *);\nuint32_t rtt_ts(struct rtt_info *);\n\nextern int\trtt_d_flag;\t/* can be set nonzero for addl info */\n\n#endif\t/* __unp_rtt_h */\n"
  },
  {
    "path": "sctp/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tsctpserv01 sctpclient01 sctpserv02 sctpserv03 sctpclient02 sctpserv04 \\\nsctpserv05 sctpclient03 sctpserv06 sctpserv07 sctpclient04 sctpserv_fork\n\nLIBS+= -L/usr/local/v6/lib -lm -lsctp\n\n.c.lc:\n\t../../troff/fixcode.sh $< > $@\n.h.lh:\n\t../../troff/fixcode.sh $< > $@\n\nCFLAGS+= -g\nall:\t${PROGS}\n\nsctpserv01:\tsctpserv01.o \n\t\t${CC} ${CFLAGS} -o $@ sctpserv01.o ${LIBS}\n\n\nsctpclient01:   sctpclient01.o sctp_strcli.o sctp_strcliecho.o\n\t\t${CC} ${CFLAGS} -o $@ sctpclient01.o sctp_strcli.o sctp_strcliecho.o ${LIBS}\n\n\nsctpserv02:\tsctpserv02.o \n\t\t${CC} ${CFLAGS} -o $@ sctpserv02.o ${LIBS}\n\nsctpserv03:\tsctpserv03.o \n\t\t${CC} ${CFLAGS} -o $@ sctpserv03.o ${LIBS}\n\nsctpserv04:\tsctpserv04.o \n\t\t${CC} ${CFLAGS} -o $@ sctpserv04.o ${LIBS}\n\nsctpserv05:\tsctpserv05.o sctp_pdapircv.o \n\t\t${CC} ${CFLAGS} -o $@ sctpserv05.o sctp_pdapircv.o  ${LIBS}\n\nsctpserv06:\tsctpserv06.o sctp_displayevents.o\n\t\t${CC} ${CFLAGS} -o $@ sctpserv06.o sctp_displayevents.o  ${LIBS}\n\nsctpclient02:\tsctpclient02.o sctp_strcli.o sctp_strcliecho.o\n\t\t${CC} ${CFLAGS} -o $@ sctpclient02.o sctp_strcli.o sctp_strcliecho.o ${LIBS}\n\nsctpclient03:  sctpclient01.o sctp_strcli_un.o sctp_strcliecho.o\n\t\t${CC} ${CFLAGS} -o $@ sctpclient01.o sctp_strcli_un.o sctp_strcliecho.o ${LIBS}\n\nsctpserv07:\tsctpserv07.o sctp_displayevents.o sctp_bindargs.o \n\t\t${CC} ${CFLAGS} -o $@ sctpserv07.o sctp_displayevents.o  sctp_bindargs.o ${LIBS}\n\n\nsctpclient04:\tsctpclient04.o sctp_strcli1.o sctp_check_notify.o sctp_print_addrs.o sctp_modify_hb.o\n\t\t${CC} ${CFLAGS} -o $@ sctpclient04.o sctp_strcli1.o sctp_check_notify.o sctp_print_addrs.o ${LIBS}\n\nsctpserv_fork:  sctpserv_fork.o sctp_addr_to_associd.o\n\t\t${CC} ${CFLAGS} -o $@ sctpserv_fork.o sctp_addr_to_associd.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "sctp/sctp_addr_to_associd.c",
    "content": "#include\t\"unp.h\"\n\nsctp_assoc_t\nsctp_address_to_associd(int sock_fd, struct sockaddr *sa, socklen_t salen)\n{\n\tstruct sctp_paddrparams sp;\n\tint siz;\n\n\tsiz = sizeof(struct sctp_paddrparams);\n\tbzero(&sp,siz);\n\tmemcpy(&sp.spp_address,sa,salen);\n\tsctp_opt_info(sock_fd,0,\n\t\t   SCTP_PEER_ADDR_PARAMS, &sp, &siz);\n\treturn(sp.spp_assoc_id);\n}\n"
  },
  {
    "path": "sctp/sctp_addr_to_associd.lc",
    "content": "\nsctp_assoc_t##  1 ##src/sctp/sctp_addr_to_associd.c##\nsctp_address_to_associd(int sock_fd, struct sockaddr *sa, socklen_t salen)##  2 ##src/sctp/sctp_addr_to_associd.c##\n{##  3 ##src/sctp/sctp_addr_to_associd.c##\n    struct sctp_paddrparams sp;##  4 ##src/sctp/sctp_addr_to_associd.c##\n    int     siz;##  5 ##src/sctp/sctp_addr_to_associd.c##\n\n    siz = sizeof(struct sctp_paddrparams);##  6 ##src/sctp/sctp_addr_to_associd.c##\n    bzero(&sp, siz);##  7 ##src/sctp/sctp_addr_to_associd.c##\n    memcpy(&sp.spp_address, sa, salen);##  8 ##src/sctp/sctp_addr_to_associd.c##\n    sctp_opt_info(sock_fd, 0, SCTP_PEER_ADDR_PARAMS, &sp, &siz);##  9 ##src/sctp/sctp_addr_to_associd.c##\n    return (sp.spp_assoc_id);## 10 ##src/sctp/sctp_addr_to_associd.c##\n}## 11 ##src/sctp/sctp_addr_to_associd.c##\n"
  },
  {
    "path": "sctp/sctp_bindargs.c",
    "content": "#include\t\"unp.h\"\n\nint\nsctp_bind_arg_list(int sock_fd, char **argv, int argc)\n{\n\tstruct addrinfo *addr;\n\tchar *bindbuf, *p, portbuf[10];\n\tint addrcnt=0;\n\tint i;\n\n\tbindbuf = (char *)Calloc(argc, sizeof(struct sockaddr_storage));\n\tp = bindbuf;\n\tsprintf(portbuf, \"%d\", SERV_PORT);\n\tfor( i=0; i<argc; i++ ) {\n\t\taddr = Host_serv(argv[i], portbuf, AF_UNSPEC, SOCK_SEQPACKET);\n\t\tmemcpy(p, addr->ai_addr, addr->ai_addrlen);\n\t\tfreeaddrinfo(addr);\n\t\taddrcnt++;\n\t\tp += addr->ai_addrlen;\n\t}\n\tSctp_bindx(sock_fd,(SA *)bindbuf,addrcnt,SCTP_BINDX_ADD_ADDR);\n\tfree(bindbuf);\n\treturn(0);\n}\n"
  },
  {
    "path": "sctp/sctp_bindargs.lc",
    "content": "\nint##  1 ##src/sctp/sctp_bindargs.c##\nsctp_bind_arg_list(int sock_fd, char **argv, int argc)##  2 ##src/sctp/sctp_bindargs.c##\n{##  3 ##src/sctp/sctp_bindargs.c##\n    struct addrinfo *addr;##  4 ##src/sctp/sctp_bindargs.c##\n    struct sockaddr_storage *at;##  5 ##src/sctp/sctp_bindargs.c##\n\n    char   *bindbuf, portbuf[10];##  6 ##src/sctp/sctp_bindargs.c##\n    int     addrcnt = 0;##  7 ##src/sctp/sctp_bindargs.c##\n    int     i, sz;##  8 ##src/sctp/sctp_bindargs.c##\n\n    sz = argc * sizeof(struct sockaddr_storage);##  9 ##src/sctp/sctp_bindargs.c##\n    bindbuf = (char *) Malloc(sz);## 10 ##src/sctp/sctp_bindargs.c##\n    bzero(bindbuf, sz);## 11 ##src/sctp/sctp_bindargs.c##\n    at = (struct sockaddr_storage *) bindbuf;## 12 ##src/sctp/sctp_bindargs.c##\n    sprintf(portbuf, \"%d\", SERV_PORT);## 13 ##src/sctp/sctp_bindargs.c##\n    for (i = 0; i < argc; i++) {## 14 ##src/sctp/sctp_bindargs.c##\n        addr = Host_serv(argv[i], portbuf, AF_UNSPEC, SOCK_SEQPACKET);## 15 ##src/sctp/sctp_bindargs.c##\n        memcpy(at, addr->ai_addr, addr->ai_addrlen);## 16 ##src/sctp/sctp_bindargs.c##\n        freeaddrinfo(addr);## 17 ##src/sctp/sctp_bindargs.c##\n        addrcnt++;## 18 ##src/sctp/sctp_bindargs.c##\n        at++;## 19 ##src/sctp/sctp_bindargs.c##\n    }## 20 ##src/sctp/sctp_bindargs.c##\n    at = (struct sockaddr_storage *) bindbuf;## 21 ##src/sctp/sctp_bindargs.c##\n    Sctp_bindx(sock_fd, at, addrcnt, SCTP_BINDX_ADD_ADDR);## 22 ##src/sctp/sctp_bindargs.c##\n    free(bindbuf);## 23 ##src/sctp/sctp_bindargs.c##\n    return (0);## 24 ##src/sctp/sctp_bindargs.c##\n}## 25 ##src/sctp/sctp_bindargs.c##\n"
  },
  {
    "path": "sctp/sctp_check_notify.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ncheck_notification(int sock_fd,char *recvline,int rd_len)\n{\n\tunion sctp_notification *snp;\n\tstruct sctp_assoc_change *sac;\n\tstruct sockaddr_storage *sal,*sar;\n\tint num_rem, num_loc;\n\n\tsnp = (union sctp_notification *)recvline;\n\tif(snp->sn_header.sn_type == SCTP_ASSOC_CHANGE) {\n\t\tsac = &snp->sn_assoc_change;\n\t\tif((sac->sac_state == SCTP_COMM_UP) ||\n\t\t   (sac->sac_state == SCTP_RESTART)) {\n\t\t\tnum_rem = sctp_getpaddrs(sock_fd,sac->sac_assoc_id,&sar);\n\t\t\tprintf(\"There are %d remote addresses and they are:\\n\",\n\t\t\t       num_rem);\n\t\t\tsctp_print_addresses(sar,num_rem);\n\t\t\tsctp_freepaddrs(sar);\n\n\t\t\tnum_loc = sctp_getladdrs(sock_fd,sac->sac_assoc_id,&sal);\n\t\t\tprintf(\"There are %d local addresses and they are:\\n\",\n\t\t\t       num_loc);\n\t\t\tsctp_print_addresses(sal,num_loc);\n\t\t\tsctp_freeladdrs(sal);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "sctp/sctp_check_notify.lc",
    "content": "\nvoid##  1 ##src/sctp/sctp_check_notify.c##\ncheck_notification(int sock_fd, char *recvline, int rd_len)##  2 ##src/sctp/sctp_check_notify.c##\n{##  3 ##src/sctp/sctp_check_notify.c##\n    union sctp_notification *snp;##  4 ##src/sctp/sctp_check_notify.c##\n    struct sctp_assoc_change *sac;##  5 ##src/sctp/sctp_check_notify.c##\n    struct sockaddr_storage *sal, *sar;##  6 ##src/sctp/sctp_check_notify.c##\n    int     num_rem, num_loc;##  7 ##src/sctp/sctp_check_notify.c##\n\n    snp = (union sctp_notification *) recvline;##  8 ##src/sctp/sctp_check_notify.c##\n    if (snp->sn_header.sn_type == SCTP_ASSOC_CHANGE) {##  9 ##src/sctp/sctp_check_notify.c##\n        sac = &snp->sn_assoc_change;## 10 ##src/sctp/sctp_check_notify.c##\n        if ((sac->sac_state == SCTP_COMM_UP) ||## 11 ##src/sctp/sctp_check_notify.c##\n            (sac->sac_state == SCTP_RESTART)) {## 12 ##src/sctp/sctp_check_notify.c##\n            num_rem = sctp_getpaddrs(sock_fd, sac->sac_assoc_id, &sar);## 13 ##src/sctp/sctp_check_notify.c##\n            printf(\"There are %d remote addresses and they are:\\n\", num_rem);## 14 ##src/sctp/sctp_check_notify.c##\n            sctp_print_addresses(sar, num_rem);## 15 ##src/sctp/sctp_check_notify.c##\n            sctp_freepaddrs(sar);## 16 ##src/sctp/sctp_check_notify.c##\n\n            num_loc = sctp_getladdrs(sock_fd, sac->sac_assoc_id, &sal);## 17 ##src/sctp/sctp_check_notify.c##\n            printf(\"There are %d local addresses and they are:\\n\", num_loc);## 18 ##src/sctp/sctp_check_notify.c##\n            sctp_print_addresses(sal, num_loc);## 19 ##src/sctp/sctp_check_notify.c##\n            sctp_freeladdrs(sal);## 20 ##src/sctp/sctp_check_notify.c##\n        }## 21 ##src/sctp/sctp_check_notify.c##\n    }## 22 ##src/sctp/sctp_check_notify.c##\n\n}## 23 ##src/sctp/sctp_check_notify.c##\n"
  },
  {
    "path": "sctp/sctp_displayevents.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nprint_notification(char *notify_buf)\n{\n\tunion sctp_notification *snp;\n\tstruct sctp_assoc_change *sac;\n\tstruct sctp_paddr_change *spc;\n\tstruct sctp_remote_error *sre;\n\tstruct sctp_send_failed *ssf;\n\tstruct sctp_shutdown_event *sse;\n\tstruct sctp_adaption_event *ae;\n\tstruct sctp_pdapi_event *pdapi;\n\tconst char *str;\n\n\tsnp = (union sctp_notification *)notify_buf;\n\tswitch(snp->sn_header.sn_type) {\n\tcase SCTP_ASSOC_CHANGE:\n\t\tsac = &snp->sn_assoc_change;\n\t\tswitch(sac->sac_state) {\n\t\tcase SCTP_COMM_UP:\n\t\t\tstr = \"COMMUNICATION UP\";\n\t\t\tbreak;\n\t\tcase SCTP_COMM_LOST:\n\t\t\tstr = \"COMMUNICATION LOST\";\n\t\t\tbreak;\n\t\tcase SCTP_RESTART:\n\t\t\tstr = \"RESTART\";\n\t\t\tbreak;\n\t\tcase SCTP_SHUTDOWN_COMP:\n\t\t\tstr = \"SHUTDOWN COMPLETE\";\n\t\t\tbreak;\n\t\tcase SCTP_CANT_STR_ASSOC:\n\t\t\tstr = \"CAN'T START ASSOC\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstr = \"UNKNOWN\";\n\t\t\tbreak;\n\t\t} /* end switch(sac->sac_state) */\n\t\tprintf(\"SCTP_ASSOC_CHANGE: %s, assoc=0x%x\\n\", str,\n\t\t       (uint32_t)sac->sac_assoc_id);\n\t\tbreak;\n\tcase SCTP_PEER_ADDR_CHANGE:\n\t\tspc = &snp->sn_paddr_change;\n\t\tswitch(spc->spc_state) {\n\t\tcase SCTP_ADDR_AVAILABLE:\n\t\t\tstr = \"ADDRESS AVAILABLE\";\n\t\t\tbreak;\n\t\tcase SCTP_ADDR_UNREACHABLE:\n\t\t\tstr = \"ADDRESS UNREACHABLE\";\n\t\t\tbreak;\n\t\tcase SCTP_ADDR_REMOVED:\n\t\t\tstr = \"ADDRESS REMOVED\";\n\t\t\tbreak;\n\t\tcase SCTP_ADDR_ADDED:\n\t\t\tstr = \"ADDRESS ADDED\";\n\t\t\tbreak;\n\t\tcase SCTP_ADDR_MADE_PRIM:\n\t\t\tstr = \"ADDRESS MADE PRIMARY\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstr = \"UNKNOWN\";\n\t\t\tbreak;\n\t\t} /* end switch(spc->spc_state) */\n\t\tprintf(\"SCTP_PEER_ADDR_CHANGE: %s, addr=%s, assoc=0x%x\\n\", str,\n\t\t       Sock_ntop((SA *)&spc->spc_aaddr, sizeof(spc->spc_aaddr)),\n\t\t       (uint32_t)spc->spc_assoc_id);\n\t\tbreak;\n\tcase SCTP_REMOTE_ERROR:\n\t\tsre = &snp->sn_remote_error;\n\t\tprintf(\"SCTP_REMOTE_ERROR: assoc=0x%x error=%d\\n\",\n\t\t       (uint32_t)sre->sre_assoc_id, sre->sre_error);\n\t\tbreak;\n\tcase SCTP_SEND_FAILED:\n\t\tssf = &snp->sn_send_failed;\n\t\tprintf(\"SCTP_SEND_FAILED: assoc=0x%x error=%d\\n\",\n\t\t       (uint32_t)ssf->ssf_assoc_id, ssf->ssf_error);\n\t\tbreak;\n\tcase SCTP_ADAPTION_INDICATION:\n\t\tae = &snp->sn_adaption_event;\n\t\tprintf(\"SCTP_ADAPTION_INDICATION: 0x%x\\n\",\n\t\t    (u_int)ae->sai_adaption_ind);\n\t\tbreak;\n\tcase SCTP_PARTIAL_DELIVERY_EVENT:\n\t    pdapi = &snp->sn_pdapi_event;\n\t    if(pdapi->pdapi_indication == SCTP_PARTIAL_DELIVERY_ABORTED)\n\t\t    printf(\"SCTP_PARTIAL_DELIEVERY_ABORTED\\n\");\n\t    else\n\t\t    printf(\"Unknown SCTP_PARTIAL_DELIVERY_EVENT 0x%x\\n\",\n\t\t\t   pdapi->pdapi_indication);\n\t    break;\n\tcase SCTP_SHUTDOWN_EVENT:\n\t\tsse = &snp->sn_shutdown_event;\n\t\tprintf(\"SCTP_SHUTDOWN_EVENT: assoc=0x%x\\n\",\n\t\t       (uint32_t)sse->sse_assoc_id);\n\t\tbreak;\n\tdefault:\n\t\tprintf(\"Unknown notification event type=0x%x\\n\", \n\t\t       snp->sn_header.sn_type);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_displayevents.lc",
    "content": "\nvoid##  1 ##src/sctp/sctp_displayevents.c##\nprint_notification(char *notify_buf)##  2 ##src/sctp/sctp_displayevents.c##\n{##  3 ##src/sctp/sctp_displayevents.c##\n    union sctp_notification *snp;##  4 ##src/sctp/sctp_displayevents.c##\n    struct sctp_assoc_change *sac;##  5 ##src/sctp/sctp_displayevents.c##\n    struct sctp_paddr_change *spc;##  6 ##src/sctp/sctp_displayevents.c##\n    struct sctp_remote_error *sre;##  7 ##src/sctp/sctp_displayevents.c##\n    struct sctp_send_failed *ssf;##  8 ##src/sctp/sctp_displayevents.c##\n    struct sctp_shutdown_event *sse;##  9 ##src/sctp/sctp_displayevents.c##\n    struct sctp_adaption_event *ae;## 10 ##src/sctp/sctp_displayevents.c##\n    struct sctp_pdapi_event *pdapi;## 11 ##src/sctp/sctp_displayevents.c##\n    const char *str;## 12 ##src/sctp/sctp_displayevents.c##\n\n    snp = (union sctp_notification *) notify_buf;## 13 ##src/sctp/sctp_displayevents.c##\n    switch (snp->sn_header.sn_type) {## 14 ##src/sctp/sctp_displayevents.c##\n    case SCTP_ASSOC_CHANGE:## 15 ##src/sctp/sctp_displayevents.c##\n        sac = &snp->sn_assoc_change;## 16 ##src/sctp/sctp_displayevents.c##\n        switch (sac->sac_state) {## 17 ##src/sctp/sctp_displayevents.c##\n        case SCTP_COMM_UP:## 18 ##src/sctp/sctp_displayevents.c##\n            str = \"COMMUNICATION UP\";## 19 ##src/sctp/sctp_displayevents.c##\n            break;## 20 ##src/sctp/sctp_displayevents.c##\n        case SCTP_COMM_LOST:## 21 ##src/sctp/sctp_displayevents.c##\n            str = \"COMMUNICATION LOST\";## 22 ##src/sctp/sctp_displayevents.c##\n            break;## 23 ##src/sctp/sctp_displayevents.c##\n        case SCTP_RESTART:## 24 ##src/sctp/sctp_displayevents.c##\n            str = \"RESTART\";## 25 ##src/sctp/sctp_displayevents.c##\n            break;## 26 ##src/sctp/sctp_displayevents.c##\n        case SCTP_SHUTDOWN_COMP:## 27 ##src/sctp/sctp_displayevents.c##\n            str = \"SHUTDOWN COMPLETE\";## 28 ##src/sctp/sctp_displayevents.c##\n            break;## 29 ##src/sctp/sctp_displayevents.c##\n        case SCTP_CANT_STR_ASSOC:## 30 ##src/sctp/sctp_displayevents.c##\n            str = \"CANT START ASSOC\";## 31 ##src/sctp/sctp_displayevents.c##\n            break;## 32 ##src/sctp/sctp_displayevents.c##\n        default:## 33 ##src/sctp/sctp_displayevents.c##\n            str = \"UNKNOWN\";## 34 ##src/sctp/sctp_displayevents.c##\n            break;## 35 ##src/sctp/sctp_displayevents.c##\n        }                       /* end switch(sac->sac_state) */## 36 ##src/sctp/sctp_displayevents.c##\n        printf(\"SCTP_ASSOC_CHANGE: %s, assoc=0x%x\\n\", str,## 37 ##src/sctp/sctp_displayevents.c##\n               (uint32_t) sac->sac_assoc_id);## 38 ##src/sctp/sctp_displayevents.c##\n        break;## 39 ##src/sctp/sctp_displayevents.c##\n    case SCTP_PEER_ADDR_CHANGE:## 40 ##src/sctp/sctp_displayevents.c##\n        spc = &snp->sn_paddr_change;## 41 ##src/sctp/sctp_displayevents.c##\n        switch (spc->spc_state) {## 42 ##src/sctp/sctp_displayevents.c##\n        case SCTP_ADDR_AVAILABLE:## 43 ##src/sctp/sctp_displayevents.c##\n            str = \"ADDRESS AVAILABLE\";## 44 ##src/sctp/sctp_displayevents.c##\n            break;## 45 ##src/sctp/sctp_displayevents.c##\n        case SCTP_ADDR_UNREACHABLE:## 46 ##src/sctp/sctp_displayevents.c##\n            str = \"ADDRESS UNAVAILABLE\";## 47 ##src/sctp/sctp_displayevents.c##\n            break;## 48 ##src/sctp/sctp_displayevents.c##\n        case SCTP_ADDR_REMOVED:## 49 ##src/sctp/sctp_displayevents.c##\n            str = \"ADDRESS REMOVED\";## 50 ##src/sctp/sctp_displayevents.c##\n            break;## 51 ##src/sctp/sctp_displayevents.c##\n        case SCTP_ADDR_ADDED:## 52 ##src/sctp/sctp_displayevents.c##\n            str = \"ADDRESS ADDED\";## 53 ##src/sctp/sctp_displayevents.c##\n            break;## 54 ##src/sctp/sctp_displayevents.c##\n        case SCTP_ADDR_MADE_PRIM:## 55 ##src/sctp/sctp_displayevents.c##\n            str = \"ADDRESS MADE PRIMARY\";## 56 ##src/sctp/sctp_displayevents.c##\n            break;## 57 ##src/sctp/sctp_displayevents.c##\n        default:## 58 ##src/sctp/sctp_displayevents.c##\n            str = \"UNKNOWN\";## 59 ##src/sctp/sctp_displayevents.c##\n            break;## 60 ##src/sctp/sctp_displayevents.c##\n        }                       /* end switch(spc->spc_state) */## 61 ##src/sctp/sctp_displayevents.c##\n        printf(\"SCTP_PEER_ADDR_CHANGE: %s, addr=%s, assoc=0x%x\\n\", str,## 62 ##src/sctp/sctp_displayevents.c##\n               Sock_ntop((SA *) &spc->spc_aaddr, sizeof(spc->spc_aaddr)),## 63 ##src/sctp/sctp_displayevents.c##\n               (uint32_t) spc->spc_assoc_id);## 64 ##src/sctp/sctp_displayevents.c##\n        break;## 65 ##src/sctp/sctp_displayevents.c##\n    case SCTP_REMOTE_ERROR:## 66 ##src/sctp/sctp_displayevents.c##\n        sre = &snp->sn_remote_error;## 67 ##src/sctp/sctp_displayevents.c##\n        printf(\"SCTP_REMOTE_ERROR: assoc=0x%x\\n\",## 68 ##src/sctp/sctp_displayevents.c##\n               (uint32_t) sre->sre_assoc_id);## 69 ##src/sctp/sctp_displayevents.c##\n        break;## 70 ##src/sctp/sctp_displayevents.c##\n    case SCTP_SEND_FAILED:## 71 ##src/sctp/sctp_displayevents.c##\n        ssf = &snp->sn_send_failed;## 72 ##src/sctp/sctp_displayevents.c##\n        printf(\"SCTP_SEND_FAILED: assoc=0x%x\\n\",## 73 ##src/sctp/sctp_displayevents.c##\n               (uint32_t) ssf->ssf_assoc_id);## 74 ##src/sctp/sctp_displayevents.c##\n        break;## 75 ##src/sctp/sctp_displayevents.c##\n    case SCTP_ADAPTION_INDICATION:## 76 ##src/sctp/sctp_displayevents.c##\n        ae = &snp->sn_adaption_event;## 77 ##src/sctp/sctp_displayevents.c##\n        printf(\"SCTP_adaption_indication:0x%x\\n\",## 78 ##src/sctp/sctp_displayevents.c##\n               (u_int) ae->sai_adaption_ind);## 79 ##src/sctp/sctp_displayevents.c##\n        break;## 80 ##src/sctp/sctp_displayevents.c##\n    case SCTP_PARTIAL_DELIVERY_EVENT:## 81 ##src/sctp/sctp_displayevents.c##\n        pdapi = &snp->sn_pdapi_event;## 82 ##src/sctp/sctp_displayevents.c##\n        if (pdapi->pdapi_indication == SCTP_PARTIAL_DELIVERY_ABORTED)## 83 ##src/sctp/sctp_displayevents.c##\n            printf(\"SCTP_PD-API ABORTED\\n\");## 84 ##src/sctp/sctp_displayevents.c##\n        else## 85 ##src/sctp/sctp_displayevents.c##\n            printf(\"Unknown SCTP_PD-API EVENT 0x%x\\n\",## 86 ##src/sctp/sctp_displayevents.c##\n                   pdapi->pdapi_indication);## 87 ##src/sctp/sctp_displayevents.c##\n        break;## 88 ##src/sctp/sctp_displayevents.c##\n    case SCTP_SHUTDOWN_EVENT:## 89 ##src/sctp/sctp_displayevents.c##\n        sse = &snp->sn_shutdown_event;## 90 ##src/sctp/sctp_displayevents.c##\n        printf(\"SCTP_SHUTDOWN_EVENT: assoc=0x%x\\n\",## 91 ##src/sctp/sctp_displayevents.c##\n               (uint32_t) sse->sse_assoc_id);## 92 ##src/sctp/sctp_displayevents.c##\n        break;## 93 ##src/sctp/sctp_displayevents.c##\n    default:## 94 ##src/sctp/sctp_displayevents.c##\n        printf(\"Unknown notification event type=0x%x\\n\",## 95 ##src/sctp/sctp_displayevents.c##\n               snp->sn_header.sn_type);## 96 ##src/sctp/sctp_displayevents.c##\n    }## 97 ##src/sctp/sctp_displayevents.c##\n}## 98 ##src/sctp/sctp_displayevents.c##\n"
  },
  {
    "path": "sctp/sctp_getnostrm.c",
    "content": "#include\t\"unp.h\"\n\nint \nsctp_get_no_strms(int sock_fd,struct sockaddr *to, socklen_t tolen)\n{\n\tint retsz;\n\tstruct sctp_status status;\n\tretsz = sizeof(status);\t\n\tbzero(&status,sizeof(status));\n\n\tstatus.sstat_assoc_id = sctp_address_to_associd(sock_fd,to,tolen);\n\tGetsockopt(sock_fd,IPPROTO_SCTP, SCTP_STATUS,\n\t\t   &status, &retsz);\n\treturn(status.sstat_outstrms);\n}\n"
  },
  {
    "path": "sctp/sctp_modify_hb.c",
    "content": "#include\t\"unp.h\"\n\nint heartbeat_action(int sock_fd, struct sockaddr *sa, socklen_t salen,\n\t\t\t  u_int value)\n{\n\tstruct sctp_paddrparams sp;\n\tint siz;\n\n\tbzero(&sp,sizeof(sp));\n\tsp.spp_hbinterval = value;\n\tmemcpy((caddr_t)&sp.spp_address,sa,salen);\n\tSetsockopt(sock_fd,IPPROTO_SCTP,\n\t\t   SCTP_PEER_ADDR_PARAMS, &sp, sizeof(sp));\n\treturn(0);\n}\n"
  },
  {
    "path": "sctp/sctp_modify_hb.lc",
    "content": "\nint##  1 ##src/sctp/sctp_modify_hb.c##\nheartbeat_action(int sock_fd, struct sockaddr *sa, socklen_t salen,##  2 ##src/sctp/sctp_modify_hb.c##\n                 int action, u_int value)##  3 ##src/sctp/sctp_modify_hb.c##\n{##  4 ##src/sctp/sctp_modify_hb.c##\n    struct sctp_paddrparams sp;##  5 ##src/sctp/sctp_modify_hb.c##\n    int     siz;##  6 ##src/sctp/sctp_modify_hb.c##\n    bzero(&sp, sizeof(sp));##  7 ##src/sctp/sctp_modify_hb.c##\n    if (action == SCTP_ON_DEMAND_HB) {##  8 ##src/sctp/sctp_modify_hb.c##\n        sp.spp_hbinterval = SCTP_ISSUE_HB;##  9 ##src/sctp/sctp_modify_hb.c##\n    } else if (action == SCTP_SET_HB_INTERVAL) {## 10 ##src/sctp/sctp_modify_hb.c##\n        if ((value == SCTP_NO_HB) || (value == SCTP_ISSUE_HB)) {## 11 ##src/sctp/sctp_modify_hb.c##\n            errno = EINVAL;## 12 ##src/sctp/sctp_modify_hb.c##\n            return (-1);## 13 ##src/sctp/sctp_modify_hb.c##\n        }## 14 ##src/sctp/sctp_modify_hb.c##\n        sp.spp_hbinterval = value;## 15 ##src/sctp/sctp_modify_hb.c##\n    } else if (action == SCTP_DISABLE_HB) {## 16 ##src/sctp/sctp_modify_hb.c##\n        sp.spp_hbinterval = SCTP_NO_HB;## 17 ##src/sctp/sctp_modify_hb.c##\n    } else {## 18 ##src/sctp/sctp_modify_hb.c##\n        errno = EINVAL;## 19 ##src/sctp/sctp_modify_hb.c##\n        return (-1);## 20 ##src/sctp/sctp_modify_hb.c##\n    }## 21 ##src/sctp/sctp_modify_hb.c##\n    siz = sizeof(struct sctp_paddrparams);## 22 ##src/sctp/sctp_modify_hb.c##\n    memcpy((caddr_t) & sp.spp_address, sa, salen);## 23 ##src/sctp/sctp_modify_hb.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &sp, siz);## 24 ##src/sctp/sctp_modify_hb.c##\n    return (0);## 25 ##src/sctp/sctp_modify_hb.c##\n}## 26 ##src/sctp/sctp_modify_hb.c##\n"
  },
  {
    "path": "sctp/sctp_pdapircv.c",
    "content": "#include\t\"unp.h\"\n\nstatic uint8_t *sctp_pdapi_readbuf=NULL;\nstatic int sctp_pdapi_rdbuf_sz=0;\n\n\nuint8_t *\npdapi_recvmsg(int sock_fd,\n\t      int *rdlen,\n\t      SA *from,\n\t      int *from_len,\n\t      struct sctp_sndrcvinfo *sri,\n\t      int *msg_flags)\n{\n\tint rdsz,left,at_in_buf;\n\tint frmlen=0;\n\n\tif (sctp_pdapi_readbuf == NULL) {\n\t\tsctp_pdapi_readbuf = (uint8_t *)Malloc(SCTP_PDAPI_INCR_SZ);\n\t\tsctp_pdapi_rdbuf_sz = SCTP_PDAPI_INCR_SZ;\n\t}\n\tat_in_buf = Sctp_recvmsg(sock_fd, sctp_pdapi_readbuf, sctp_pdapi_rdbuf_sz,\n\t\t\t\t from, from_len,\n\t\t\t\t sri,msg_flags);\n\tif(at_in_buf < 1){\n\t\t*rdlen = at_in_buf;\n\t\treturn(NULL);\n\t}\n\twhile((*msg_flags & MSG_EOR) == 0) {\n\t\tleft = sctp_pdapi_rdbuf_sz - at_in_buf;\n\t\tif(left < SCTP_PDAPI_NEED_MORE_THRESHOLD) {\n\t\t\tsctp_pdapi_readbuf = realloc(sctp_pdapi_readbuf, sctp_pdapi_rdbuf_sz+SCTP_PDAPI_INCR_SZ);\n\t\t\tif(sctp_pdapi_readbuf == NULL) {\n\t\t\t\terr_quit(\"sctp_pdapi ran out of memory\");\n\t\t\t}\n\t\t\tsctp_pdapi_rdbuf_sz += SCTP_PDAPI_INCR_SZ;\n\t\t\tleft = sctp_pdapi_rdbuf_sz - at_in_buf;\n\t\t}\n\t\trdsz = Sctp_recvmsg(sock_fd, &sctp_pdapi_readbuf[at_in_buf], \n\t\t\t     left, NULL, &frmlen, NULL, msg_flags);\n\t\tat_in_buf += rdsz;\n\t}\n\t*rdlen = at_in_buf;\n\treturn(sctp_pdapi_readbuf);\n}\n"
  },
  {
    "path": "sctp/sctp_pdapircv.lc",
    "content": "\nstatic uint8_t *sctp_pdapi_readbuf = NULL;##  1 ##src/sctp/sctp_pdapircv.c##\nstatic int sctp_pdapi_rdbuf_sz = 0;##  2 ##src/sctp/sctp_pdapircv.c##\n\nuint8_t *##  3 ##src/sctp/sctp_pdapircv.c##\npdapi_recvmsg(int sock_fd,##  4 ##src/sctp/sctp_pdapircv.c##\n              int *rdlen,##  5 ##src/sctp/sctp_pdapircv.c##\n              SA *from,##  6 ##src/sctp/sctp_pdapircv.c##\n              int *from_len, struct sctp_sndrcvinfo *sri, int *msg_flags)##  7 ##src/sctp/sctp_pdapircv.c##\n{##  8 ##src/sctp/sctp_pdapircv.c##\n    int     rdsz, left, at_in_buf;##  9 ##src/sctp/sctp_pdapircv.c##\n    int     frmlen = 0;## 10 ##src/sctp/sctp_pdapircv.c##\n\n    if (sctp_pdapi_readbuf == NULL) {## 11 ##src/sctp/sctp_pdapircv.c##\n        sctp_pdapi_readbuf = (uint8_t *) Malloc(SCTP_PDAPI_INCR_SZ);## 12 ##src/sctp/sctp_pdapircv.c##\n        sctp_pdapi_rdbuf_sz = SCTP_PDAPI_INCR_SZ;## 13 ##src/sctp/sctp_pdapircv.c##\n    }## 14 ##src/sctp/sctp_pdapircv.c##\n    at_in_buf =## 15 ##src/sctp/sctp_pdapircv.c##\n        Sctp_recvmsg(sock_fd, sctp_pdapi_readbuf, sctp_pdapi_rdbuf_sz, from,## 16 ##src/sctp/sctp_pdapircv.c##\n                     from_len, sri, msg_flags);## 17 ##src/sctp/sctp_pdapircv.c##\n    if (at_in_buf < 1) {## 18 ##src/sctp/sctp_pdapircv.c##\n        *rdlen = at_in_buf;## 19 ##src/sctp/sctp_pdapircv.c##\n        return (NULL);## 20 ##src/sctp/sctp_pdapircv.c##\n    }## 21 ##src/sctp/sctp_pdapircv.c##\n    while ((*msg_flags & MSG_EOR) == 0) {## 22 ##src/sctp/sctp_pdapircv.c##\n        left = sctp_pdapi_rdbuf_sz - at_in_buf;## 23 ##src/sctp/sctp_pdapircv.c##\n        if (left < SCTP_PDAPI_NEED_MORE_THRESHOLD) {## 24 ##src/sctp/sctp_pdapircv.c##\n            uint8_t *more;## 25 ##src/sctp/sctp_pdapircv.c##\n            more =## 26 ##src/sctp/sctp_pdapircv.c##\n                (uint8_t *) malloc(sctp_pdapi_rdbuf_sz + SCTP_PDAPI_INCR_SZ);## 27 ##src/sctp/sctp_pdapircv.c##\n            if (more == NULL) {## 28 ##src/sctp/sctp_pdapircv.c##\n                printf(\"Warning:memory exhausted - partial message loss\\n\");## 29 ##src/sctp/sctp_pdapircv.c##\n                left = sctp_pdapi_rdbuf_sz;## 30 ##src/sctp/sctp_pdapircv.c##\n                at_in_buf = 0;## 31 ##src/sctp/sctp_pdapircv.c##\n            } else {## 32 ##src/sctp/sctp_pdapircv.c##\n                memcpy(more, sctp_pdapi_readbuf, at_in_buf);## 33 ##src/sctp/sctp_pdapircv.c##\n                free(sctp_pdapi_readbuf);## 34 ##src/sctp/sctp_pdapircv.c##\n                sctp_pdapi_readbuf = more;## 35 ##src/sctp/sctp_pdapircv.c##\n                sctp_pdapi_rdbuf_sz += SCTP_PDAPI_INCR_SZ;## 36 ##src/sctp/sctp_pdapircv.c##\n                left = sctp_pdapi_rdbuf_sz - at_in_buf;## 37 ##src/sctp/sctp_pdapircv.c##\n            }## 38 ##src/sctp/sctp_pdapircv.c##\n        }## 39 ##src/sctp/sctp_pdapircv.c##\n        rdsz = Sctp_recvmsg(sock_fd, &sctp_pdapi_readbuf[at_in_buf],## 40 ##src/sctp/sctp_pdapircv.c##\n                            left, NULL, &frmlen, NULL, msg_flags);## 41 ##src/sctp/sctp_pdapircv.c##\n        at_in_buf += rdsz;## 42 ##src/sctp/sctp_pdapircv.c##\n    }## 43 ##src/sctp/sctp_pdapircv.c##\n    *rdlen = at_in_buf;## 44 ##src/sctp/sctp_pdapircv.c##\n    return (sctp_pdapi_readbuf);## 45 ##src/sctp/sctp_pdapircv.c##\n}## 46 ##src/sctp/sctp_pdapircv.c##\n"
  },
  {
    "path": "sctp/sctp_print_addrs.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsctp_print_addresses(struct sockaddr_storage *addrs, int num)\n{\n\tstruct sockaddr_storage *ss;\n\tint i,salen;\n\n\tss = addrs;\n\tfor(i=0; i<num; i++){\n\t\tprintf(\"%s\\n\", Sock_ntop((SA *)ss, salen));\n#ifdef HAVE_SOCKADDR_SA_LEN\n\t\tsalen = ss->ss_len;\n#else\n\t\tswitch(ss->ss_family) {\n\t\tcase AF_INET:\n\t\t\tsalen = sizeof(struct sockaddr_in);\n\t\t\tbreak;\n#ifdef IPV6\n\t\tcase AF_INET6:\n\t\t\tsalen = sizeof(struct sockaddr_in6);\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\terr_quit(\"sctp_print_addresses: unknown AF\");\n\t\t\tbreak;\n\t\t}\n#endif\n\t\tss = (struct sockaddr_storage *)((char *)ss + salen);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_print_addrs.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctp_print_addrs.c##\n\nvoid##  2 ##src/sctp/sctp_print_addrs.c##\nsctp_print_addresses(struct sockaddr_storage *addrs, int num)##  3 ##src/sctp/sctp_print_addrs.c##\n{##  4 ##src/sctp/sctp_print_addrs.c##\n    struct sockaddr_storage *ss;##  5 ##src/sctp/sctp_print_addrs.c##\n    int     i, salen;##  6 ##src/sctp/sctp_print_addrs.c##\n\n    ss = addrs;##  7 ##src/sctp/sctp_print_addrs.c##\n    for (i = 0; i < num; i++) {##  8 ##src/sctp/sctp_print_addrs.c##\n        printf(\"%s\\n\", Sock_ntop((SA *) ss, salen));##  9 ##src/sctp/sctp_print_addrs.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 10 ##src/sctp/sctp_print_addrs.c##\n        salen = ss->ss_len;## 11 ##src/sctp/sctp_print_addrs.c##\n#else## 12 ##src/sctp/sctp_print_addrs.c##\n        switch (ss->ss_family) {## 13 ##src/sctp/sctp_print_addrs.c##\n        case AF_INET:## 14 ##src/sctp/sctp_print_addrs.c##\n            salen = sizeof(struct sockaddr_in);## 15 ##src/sctp/sctp_print_addrs.c##\n            break;## 16 ##src/sctp/sctp_print_addrs.c##\n#ifdef IPV6## 17 ##src/sctp/sctp_print_addrs.c##\n        case AF_INET6:## 18 ##src/sctp/sctp_print_addrs.c##\n            salen = sizeof(struct sockaddr_in6);## 19 ##src/sctp/sctp_print_addrs.c##\n            break;## 20 ##src/sctp/sctp_print_addrs.c##\n#endif## 21 ##src/sctp/sctp_print_addrs.c##\n        default:## 22 ##src/sctp/sctp_print_addrs.c##\n            err_quit(\"sctp_print_addresses: unknown AF\");## 23 ##src/sctp/sctp_print_addrs.c##\n            break;## 24 ##src/sctp/sctp_print_addrs.c##\n        }## 25 ##src/sctp/sctp_print_addrs.c##\n#endif## 26 ##src/sctp/sctp_print_addrs.c##\n        ss = (struct sockaddr_storage *) ((char *) ss + salen);## 27 ##src/sctp/sctp_print_addrs.c##\n    }## 28 ##src/sctp/sctp_print_addrs.c##\n}## 29 ##src/sctp/sctp_print_addrs.c##\n"
  },
  {
    "path": "sctp/sctp_strcli.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)\n{\n\tstruct sockaddr_in peeraddr;\n\tstruct sctp_sndrcvinfo sri;\n\tchar sendline[MAXLINE], recvline[MAXLINE];\n\tsocklen_t len;\n\tint out_sz,rd_sz;\n\tint msg_flags;\n\n\tbzero(&sri,sizeof(sri));\n\twhile (fgets(sendline, MAXLINE, fp) != NULL) {\n\t\tif(sendline[0] != '[') {\n\t\t\tprintf(\"Error, line must be of the form '[streamnum]text'\\n\");\n\t\t\tcontinue;\n\t\t}\n\t\tsri.sinfo_stream = strtol(&sendline[1],NULL,0);\n\t\tout_sz = strlen(sendline);\n\t\tSctp_sendmsg(sock_fd, sendline, out_sz, \n\t\t\t     to, tolen, \n\t\t\t     0, 0,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\n\t\tlen = sizeof(peeraddr);\n\t\trd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),\n\t\t\t     (SA *)&peeraddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tprintf(\"From str:%d seq:%d (assoc:0x%x):\",\n\t\t       sri.sinfo_stream,sri.sinfo_ssn,\n\t\t       (u_int)sri.sinfo_assoc_id);\n\t\tprintf(\"%.*s\",rd_sz,recvline);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_strcli.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctp_strcli.c##\n\nvoid##  2 ##src/sctp/sctp_strcli.c##\nsctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)##  3 ##src/sctp/sctp_strcli.c##\n{##  4 ##src/sctp/sctp_strcli.c##\n    struct sockaddr_in peeraddr;##  5 ##src/sctp/sctp_strcli.c##\n    struct sctp_sndrcvinfo sri;##  6 ##src/sctp/sctp_strcli.c##\n    char    sendline[MAXLINE], recvline[MAXLINE];##  7 ##src/sctp/sctp_strcli.c##\n    socklen_t len;##  8 ##src/sctp/sctp_strcli.c##\n    int     out_sz, rd_sz;##  9 ##src/sctp/sctp_strcli.c##\n    int     msg_flags;## 10 ##src/sctp/sctp_strcli.c##\n\n    bzero(&sri, sizeof(sri));## 11 ##src/sctp/sctp_strcli.c##\n    while (fgets(sendline, MAXLINE, fp) != NULL) {## 12 ##src/sctp/sctp_strcli.c##\n        if (sendline[0] != '[') {## 13 ##src/sctp/sctp_strcli.c##\n            printf(\"Error, line must be of the form '[streamnum]text'\\n\");## 14 ##src/sctp/sctp_strcli.c##\n            continue;## 15 ##src/sctp/sctp_strcli.c##\n        }## 16 ##src/sctp/sctp_strcli.c##\n        sri.sinfo_stream = strtol(&sendline[1], NULL, 0);## 17 ##src/sctp/sctp_strcli.c##\n        out_sz = strlen(sendline);## 18 ##src/sctp/sctp_strcli.c##\n        Sctp_sendmsg(sock_fd, sendline, out_sz,## 19 ##src/sctp/sctp_strcli.c##\n                     to, tolen, 0, 0, sri.sinfo_stream, 0, 0);## 20 ##src/sctp/sctp_strcli.c##\n\n        len = sizeof(peeraddr);## 21 ##src/sctp/sctp_strcli.c##\n        rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),## 22 ##src/sctp/sctp_strcli.c##\n                             (SA *) &peeraddr, &len, &sri, &msg_flags);## 23 ##src/sctp/sctp_strcli.c##\n        printf(\"From str:%d seq:%d (assoc:0x%x):\",## 24 ##src/sctp/sctp_strcli.c##\n               sri.sinfo_stream, sri.sinfo_ssn, (u_int) sri.sinfo_assoc_id);## 25 ##src/sctp/sctp_strcli.c##\n        printf(\"%.*s\", rd_sz, recvline);## 26 ##src/sctp/sctp_strcli.c##\n    }## 27 ##src/sctp/sctp_strcli.c##\n}## 28 ##src/sctp/sctp_strcli.c##\n"
  },
  {
    "path": "sctp/sctp_strcli1.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)\n{\n\tstruct sockaddr_in peeraddr;\n\tstruct sctp_sndrcvinfo sri;\n\tchar sendline[MAXLINE], recvline[MAXLINE];\n\tsocklen_t len;\n\tint out_sz,rd_sz;\n\tint msg_flags;\n\n\tbzero(&sri,sizeof(sri));\n\twhile (fgets(sendline, MAXLINE, fp) != NULL) {\n\t\tif(sendline[0] != '[') {\n\t\t\tprintf(\"Error, line must be of the form '[streamnum]text'\\n\");\n\t\t\tcontinue;\n\t\t}\n\t\tsri.sinfo_stream = strtol(&sendline[1],NULL,0);\n\t\tout_sz = strlen(sendline);\n\t\tSctp_sendmsg(sock_fd, sendline, out_sz, \n\t\t\t     to, tolen, \n\t\t\t     0, 0,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n/* include mod_strcli1 */\t\t\n\t\tdo {\n\t\t\tlen = sizeof(peeraddr);\n\t\t\trd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),\n\t\t\t\t     (SA *)&peeraddr, &len,\n\t\t\t\t     &sri,&msg_flags);\n\t\t\tif(msg_flags & MSG_NOTIFICATION)\n\t\t\t\tcheck_notification(sock_fd,recvline,rd_sz);\n\t\t} while (msg_flags & MSG_NOTIFICATION);\n\t\tprintf(\"From str:%d seq:%d (assoc:0x%x):\",\n\t\t       sri.sinfo_stream,sri.sinfo_ssn,\n\t\t       (u_int)sri.sinfo_assoc_id);\n\t\tprintf(\"%.*s\",rd_sz,recvline);\n/* end mod_strcli1 */\t\t\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_strcli1.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctp_strcli1.c##\n\nvoid##  2 ##src/sctp/sctp_strcli1.c##\nsctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)##  3 ##src/sctp/sctp_strcli1.c##\n{##  4 ##src/sctp/sctp_strcli1.c##\n    struct sockaddr_in peeraddr;##  5 ##src/sctp/sctp_strcli1.c##\n    struct sctp_sndrcvinfo sri;##  6 ##src/sctp/sctp_strcli1.c##\n    char    sendline[MAXLINE], recvline[MAXLINE];##  7 ##src/sctp/sctp_strcli1.c##\n    socklen_t len;##  8 ##src/sctp/sctp_strcli1.c##\n    int     out_sz, rd_sz;##  9 ##src/sctp/sctp_strcli1.c##\n    int     msg_flags;## 10 ##src/sctp/sctp_strcli1.c##\n\n    bzero(&sri, sizeof(sri));## 11 ##src/sctp/sctp_strcli1.c##\n    while (fgets(sendline, MAXLINE, fp) != NULL) {## 12 ##src/sctp/sctp_strcli1.c##\n        if (sendline[0] != '[') {## 13 ##src/sctp/sctp_strcli1.c##\n            printf(\"Error, line must be of the form '[streamnum]text'\\n\");## 14 ##src/sctp/sctp_strcli1.c##\n            continue;## 15 ##src/sctp/sctp_strcli1.c##\n        }## 16 ##src/sctp/sctp_strcli1.c##\n        sri.sinfo_stream = strtol(&sendline[1], NULL, 0);## 17 ##src/sctp/sctp_strcli1.c##\n        out_sz = strlen(sendline);## 18 ##src/sctp/sctp_strcli1.c##\n        Sctp_sendmsg(sock_fd, sendline, out_sz,## 19 ##src/sctp/sctp_strcli1.c##\n                     to, tolen, 0, 0, sri.sinfo_stream, 0, 0);## 20 ##src/sctp/sctp_strcli1.c##\n        /* include mod_strcli1 */## 21 ##src/sctp/sctp_strcli1.c##\n        do {## 22 ##src/sctp/sctp_strcli1.c##\n            len = sizeof(peeraddr);## 23 ##src/sctp/sctp_strcli1.c##\n            rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),## 24 ##src/sctp/sctp_strcli1.c##\n                                 (SA *) &peeraddr, &len, &sri, &msg_flags);## 25 ##src/sctp/sctp_strcli1.c##\n            if (msg_flags & MSG_NOTIFICATION)## 26 ##src/sctp/sctp_strcli1.c##\n                check_notification(sock_fd, recvline, rd_sz);## 27 ##src/sctp/sctp_strcli1.c##\n        } while (msg_flags & MSG_NOTIFICATION);## 28 ##src/sctp/sctp_strcli1.c##\n        printf(\"From str:%d seq:%d (assoc:0x%x):\",## 29 ##src/sctp/sctp_strcli1.c##\n               sri.sinfo_stream, sri.sinfo_ssn, (u_int) sri.sinfo_assoc_id);## 30 ##src/sctp/sctp_strcli1.c##\n        printf(\"%.*s\", rd_sz, recvline);## 31 ##src/sctp/sctp_strcli1.c##\n        /* end mod_strcli1 */## 32 ##src/sctp/sctp_strcli1.c##\n    }## 33 ##src/sctp/sctp_strcli1.c##\n}## 34 ##src/sctp/sctp_strcli1.c##\n"
  },
  {
    "path": "sctp/sctp_strcli_un.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)\n{\n\tstruct sockaddr_in peeraddr;\n\tstruct sctp_sndrcvinfo sri;\n\tchar sendline[MAXLINE], recvline[MAXLINE];\n\tsocklen_t len;\n\tint out_sz,rd_sz;\n\tint msg_flags;\n\n\tbzero(&sri,sizeof(sri));\n\twhile (fgets(sendline, MAXLINE, fp) != NULL) {\n\t\tif(sendline[0] != '[') {\n\t\t\tprintf(\"Error, line must be of the form '[streamnum]text'\\n\");\n\t\t\tcontinue;\n\t\t}\n\t\tsri.sinfo_stream = strtol(&sendline[1],NULL,0);\n/* include mod_unordered */\n\t\tout_sz = strlen(sendline);\n\t\tSctp_sendmsg(sock_fd, sendline, out_sz, \n\t\t\t     to, tolen, \n\t\t\t     0,\n\t\t\t     MSG_UNORDERED,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n/* end mod_unordered */\n\t\tlen = sizeof(peeraddr);\n\t\trd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),\n\t\t\t     (SA *)&peeraddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tprintf(\"From str:%d seq:%d (assoc:0x%x):\",\n\t\t       sri.sinfo_stream,sri.sinfo_ssn,\n\t\t       (u_int)sri.sinfo_assoc_id);\n\t\tprintf(\"%.*s\",rd_sz,recvline);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_strcli_un.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctp_strcli_un.c##\n\nvoid##  2 ##src/sctp/sctp_strcli_un.c##\nsctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)##  3 ##src/sctp/sctp_strcli_un.c##\n{##  4 ##src/sctp/sctp_strcli_un.c##\n    struct sockaddr_in peeraddr;##  5 ##src/sctp/sctp_strcli_un.c##\n    struct sctp_sndrcvinfo sri;##  6 ##src/sctp/sctp_strcli_un.c##\n    char    sendline[MAXLINE], recvline[MAXLINE];##  7 ##src/sctp/sctp_strcli_un.c##\n    socklen_t len;##  8 ##src/sctp/sctp_strcli_un.c##\n    int     out_sz, rd_sz;##  9 ##src/sctp/sctp_strcli_un.c##\n    int     msg_flags;## 10 ##src/sctp/sctp_strcli_un.c##\n\n    bzero(&sri, sizeof(sri));## 11 ##src/sctp/sctp_strcli_un.c##\n    while (fgets(sendline, MAXLINE, fp) != NULL) {## 12 ##src/sctp/sctp_strcli_un.c##\n        if (sendline[0] != '[') {## 13 ##src/sctp/sctp_strcli_un.c##\n            printf(\"Error, line must be of the form '[streamnum]text'\\n\");## 14 ##src/sctp/sctp_strcli_un.c##\n            continue;## 15 ##src/sctp/sctp_strcli_un.c##\n        }## 16 ##src/sctp/sctp_strcli_un.c##\n        sri.sinfo_stream = strtol(&sendline[1], NULL, 0);## 17 ##src/sctp/sctp_strcli_un.c##\n        /* include mod_unordered */## 18 ##src/sctp/sctp_strcli_un.c##\n        out_sz = strlen(sendline);## 19 ##src/sctp/sctp_strcli_un.c##\n        Sctp_sendmsg(sock_fd, sendline, out_sz,## 20 ##src/sctp/sctp_strcli_un.c##\n                     to, tolen, 0, MSG_UNORDERED, sri.sinfo_stream, 0, 0);## 21 ##src/sctp/sctp_strcli_un.c##\n        /* end mod_unordered */## 22 ##src/sctp/sctp_strcli_un.c##\n        len = sizeof(peeraddr);## 23 ##src/sctp/sctp_strcli_un.c##\n        rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),## 24 ##src/sctp/sctp_strcli_un.c##\n                             (SA *) &peeraddr, &len, &sri, &msg_flags);## 25 ##src/sctp/sctp_strcli_un.c##\n        printf(\"From str:%d seq:%d (assoc:0x%x):\",## 26 ##src/sctp/sctp_strcli_un.c##\n               sri.sinfo_stream, sri.sinfo_ssn, (u_int) sri.sinfo_assoc_id);## 27 ##src/sctp/sctp_strcli_un.c##\n        printf(\"%.*s\", rd_sz, recvline);## 28 ##src/sctp/sctp_strcli_un.c##\n    }## 29 ##src/sctp/sctp_strcli_un.c##\n}## 30 ##src/sctp/sctp_strcli_un.c##\n"
  },
  {
    "path": "sctp/sctp_strcliecho.c",
    "content": "#include\t\"unp.h\"\n\n#define\tSCTP_MAXLINE\t800\n\nvoid\nsctpstr_cli_echoall(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)\n{\n\tstruct sockaddr_in peeraddr;\n\tstruct sctp_sndrcvinfo sri;\n\tchar sendline[SCTP_MAXLINE], recvline[SCTP_MAXLINE];\n\tsocklen_t len;\n\tint rd_sz,i,strsz;\n\tint msg_flags;\n\n\tbzero(sendline,sizeof(sendline));\n\tbzero(&sri,sizeof(sri));\n\twhile (fgets(sendline, SCTP_MAXLINE - 9, fp) != NULL) {\n\t\tstrsz = strlen(sendline);\n\t\tif(sendline[strsz-1] == '\\n') {\n\t\t\tsendline[strsz-1] = '\\0';\n\t\t\tstrsz--;\n\t\t}\n\t\tfor(i=0;i<SERV_MAX_SCTP_STRM;i++) {\n\t\t\tsnprintf(sendline + strsz, sizeof(sendline) - strsz,\n\t\t\t\t\".msg.%d\", i);\n\t\t\tSctp_sendmsg(sock_fd, sendline, sizeof(sendline), \n\t\t\t\t     to, tolen, \n\t\t\t\t     0, 0,\n\t\t\t\t     i,\n\t\t\t\t     0, 0);\n\t\t}\n\t\tfor(i=0;i<SERV_MAX_SCTP_STRM;i++) {\n\t\t\tlen = sizeof(peeraddr);\n\t\t\trd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),\n\t\t\t\t     (SA *)&peeraddr, &len,\n\t\t\t\t     &sri,&msg_flags);\n\t\t\tprintf(\"From str:%d seq:%d (assoc:0x%x):\",\n\t\t\t\tsri.sinfo_stream,sri.sinfo_ssn,\n\t\t\t\t(u_int)sri.sinfo_assoc_id);\n\t\t\tprintf(\"%.*s\\n\",rd_sz,recvline);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_strcliecho.lc",
    "content": "\n#define SCTP_MAXLINE    800##  1 ##src/sctp/sctp_strcliecho.c##\n\nvoid##  2 ##src/sctp/sctp_strcliecho.c##\nsctpstr_cli_echoall(FILE *fp, int sock_fd, struct sockaddr *to,##  3 ##src/sctp/sctp_strcliecho.c##\n                    socklen_t tolen)##  4 ##src/sctp/sctp_strcliecho.c##\n{##  5 ##src/sctp/sctp_strcliecho.c##\n    struct sockaddr_in peeraddr;##  6 ##src/sctp/sctp_strcliecho.c##\n    struct sctp_sndrcvinfo sri;##  7 ##src/sctp/sctp_strcliecho.c##\n    char    sendline[SCTP_MAXLINE], recvline[SCTP_MAXLINE];##  8 ##src/sctp/sctp_strcliecho.c##\n    socklen_t len;##  9 ##src/sctp/sctp_strcliecho.c##\n    int     rd_sz, i, strsz;## 10 ##src/sctp/sctp_strcliecho.c##\n    int     msg_flags;## 11 ##src/sctp/sctp_strcliecho.c##\n\n    bzero(sendline, sizeof(sendline));## 12 ##src/sctp/sctp_strcliecho.c##\n    bzero(&sri, sizeof(sri));## 13 ##src/sctp/sctp_strcliecho.c##\n    while (fgets(sendline, SCTP_MAXLINE - 9, fp) != NULL) {## 14 ##src/sctp/sctp_strcliecho.c##\n        strsz = strlen(sendline);## 15 ##src/sctp/sctp_strcliecho.c##\n        if (sendline[strsz - 1] == '\\n') {## 16 ##src/sctp/sctp_strcliecho.c##\n            sendline[strsz - 1] = '\\0';## 17 ##src/sctp/sctp_strcliecho.c##\n            strsz--;## 18 ##src/sctp/sctp_strcliecho.c##\n        }## 19 ##src/sctp/sctp_strcliecho.c##\n        for (i = 0; i < SERV_MAX_SCTP_STRM; i++) {## 20 ##src/sctp/sctp_strcliecho.c##\n            snprintf(sendline + strsz, sizeof(sendline) - strsz,## 21 ##src/sctp/sctp_strcliecho.c##\n                     \".msg.%d\", i);## 22 ##src/sctp/sctp_strcliecho.c##\n            Sctp_sendmsg(sock_fd, sendline, sizeof(sendline),## 23 ##src/sctp/sctp_strcliecho.c##\n                         to, tolen, 0, 0, i, 0, 0);## 24 ##src/sctp/sctp_strcliecho.c##\n        }## 25 ##src/sctp/sctp_strcliecho.c##\n        for (i = 0; i < SERV_MAX_SCTP_STRM; i++) {## 26 ##src/sctp/sctp_strcliecho.c##\n            len = sizeof(peeraddr);## 27 ##src/sctp/sctp_strcliecho.c##\n            rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),## 28 ##src/sctp/sctp_strcliecho.c##\n                                 (SA *) &peeraddr, &len, &sri, &msg_flags);## 29 ##src/sctp/sctp_strcliecho.c##\n            printf(\"From str:%d seq:%d (assoc:0x%x):\",## 30 ##src/sctp/sctp_strcliecho.c##\n                   sri.sinfo_stream, sri.sinfo_ssn,## 31 ##src/sctp/sctp_strcliecho.c##\n                   (u_int) sri.sinfo_assoc_id);## 32 ##src/sctp/sctp_strcliecho.c##\n            printf(\"%.*s\\n\", rd_sz, recvline);## 33 ##src/sctp/sctp_strcliecho.c##\n        }## 34 ##src/sctp/sctp_strcliecho.c##\n    }## 35 ##src/sctp/sctp_strcliecho.c##\n}## 36 ##src/sctp/sctp_strcliecho.c##\n"
  },
  {
    "path": "sctp/sctp_strcliecho2.c",
    "content": "#include\t\"unp.h\"\n\n#define\tSCTP_MAXLINE\t800\n\nvoid\nsctpstr_cli_echoall(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen)\n{\n\tstruct sockaddr_in peeraddr;\n\tstruct sctp_sndrcvinfo sri;\n\tchar sendline[SCTP_MAXLINE], recvline[SCTP_MAXLINE];\n\tsocklen_t len;\n\tint rd_sz,i,strsz;\n\tint msg_flags;\n\n\tbzero(sendline,sizeof(sendline));\n\tbzero(&sri,sizeof(sri));\n\twhile (fgets(sendline, SCTP_MAXLINE - 9, fp) != NULL) {\n\t\tstrsz = strlen(sendline);\n\t\tif(sendline[strsz-1] == '\\n') {\n\t\t\tsendline[strsz-1] = '\\0';\n\t\t\tstrsz--;\n\t\t}\n/* include modified_echo */\n\t\tfor(i=0;i<SERV_MAX_SCTP_STRM;i++) {\n\t\t\tsnprintf(sendline + strsz, sizeof(sendline) - strsz,\n\t\t\t\t\".msg.%d 1\", i);\n\t\t\tSctp_sendmsg(sock_fd, sendline, sizeof(sendline), \n\t\t\t\t     to, tolen, \n\t\t\t\t     0, 0,\n\t\t\t\t     i,\n\t\t\t\t     0, 0);\n\t\t\tsnprintf(sendline + strsz, sizeof(sendline) - strsz,\n\t\t\t\t\".msg.%d 2\", i);\n\t\t\tSctp_sendmsg(sock_fd, sendline, sizeof(sendline), \n\t\t\t\t     to, tolen, \n\t\t\t\t     0, 0,\n\t\t\t\t     i,\n\t\t\t\t     0, 0);\n\t\t}\n\t\tfor(i=0;i<SERV_MAX_SCTP_STRM*2;i++) {\n\t\t\tlen = sizeof(peeraddr);\n/* end modified_echo */\n\t\t\trd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),\n\t\t\t\t     (SA *)&peeraddr, &len,\n\t\t\t\t     &sri,&msg_flags);\n\t\t\tprintf(\"From str:%d seq:%d (assoc:0x%x):\",\n\t\t\t\tsri.sinfo_stream,sri.sinfo_ssn,\n\t\t\t\t(u_int)sri.sinfo_assoc_id);\n\t\t\tprintf(\"%.*s\\n\",rd_sz,recvline);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "sctp/sctp_strcliecho2.lc",
    "content": "\n#define SCTP_MAXLINE    800##  1 ##src/sctp/sctp_strcliecho2.c##\n\nvoid##  2 ##src/sctp/sctp_strcliecho2.c##\nsctpstr_cli_echoall(FILE *fp, int sock_fd, struct sockaddr *to,##  3 ##src/sctp/sctp_strcliecho2.c##\n                    socklen_t tolen)##  4 ##src/sctp/sctp_strcliecho2.c##\n{##  5 ##src/sctp/sctp_strcliecho2.c##\n    struct sockaddr_in peeraddr;##  6 ##src/sctp/sctp_strcliecho2.c##\n    struct sctp_sndrcvinfo sri;##  7 ##src/sctp/sctp_strcliecho2.c##\n    char    sendline[SCTP_MAXLINE], recvline[SCTP_MAXLINE];##  8 ##src/sctp/sctp_strcliecho2.c##\n    socklen_t len;##  9 ##src/sctp/sctp_strcliecho2.c##\n    int     rd_sz, i, strsz;## 10 ##src/sctp/sctp_strcliecho2.c##\n    int     msg_flags;## 11 ##src/sctp/sctp_strcliecho2.c##\n\n    bzero(sendline, sizeof(sendline));## 12 ##src/sctp/sctp_strcliecho2.c##\n    bzero(&sri, sizeof(sri));## 13 ##src/sctp/sctp_strcliecho2.c##\n    while (fgets(sendline, SCTP_MAXLINE - 9, fp) != NULL) {## 14 ##src/sctp/sctp_strcliecho2.c##\n        strsz = strlen(sendline);## 15 ##src/sctp/sctp_strcliecho2.c##\n        if (sendline[strsz - 1] == '\\n') {## 16 ##src/sctp/sctp_strcliecho2.c##\n            sendline[strsz - 1] = '\\0';## 17 ##src/sctp/sctp_strcliecho2.c##\n            strsz--;## 18 ##src/sctp/sctp_strcliecho2.c##\n        }## 19 ##src/sctp/sctp_strcliecho2.c##\n        /* include modified_echo */## 20 ##src/sctp/sctp_strcliecho2.c##\n        for (i = 0; i < SERV_MAX_SCTP_STRM; i++) {## 21 ##src/sctp/sctp_strcliecho2.c##\n            snprintf(sendline + strsz, sizeof(sendline) - strsz,## 22 ##src/sctp/sctp_strcliecho2.c##\n                     \".msg.%d 1\", i);## 23 ##src/sctp/sctp_strcliecho2.c##\n            Sctp_sendmsg(sock_fd, sendline, sizeof(sendline),## 24 ##src/sctp/sctp_strcliecho2.c##\n                         to, tolen, 0, 0, i, 0, 0);## 25 ##src/sctp/sctp_strcliecho2.c##\n            snprintf(sendline + strsz, sizeof(sendline) - strsz,## 26 ##src/sctp/sctp_strcliecho2.c##\n                     \".msg.%d 2\", i);## 27 ##src/sctp/sctp_strcliecho2.c##\n            Sctp_sendmsg(sock_fd, sendline, sizeof(sendline),## 28 ##src/sctp/sctp_strcliecho2.c##\n                         to, tolen, 0, 0, i, 0, 0);## 29 ##src/sctp/sctp_strcliecho2.c##\n        }## 30 ##src/sctp/sctp_strcliecho2.c##\n        for (i = 0; i < SERV_MAX_SCTP_STRM * 2; i++) {## 31 ##src/sctp/sctp_strcliecho2.c##\n            len = sizeof(peeraddr);## 32 ##src/sctp/sctp_strcliecho2.c##\n            /* end modified_echo */## 33 ##src/sctp/sctp_strcliecho2.c##\n            rd_sz = Sctp_recvmsg(sock_fd, recvline, sizeof(recvline),## 34 ##src/sctp/sctp_strcliecho2.c##\n                                 (SA *) &peeraddr, &len, &sri, &msg_flags);## 35 ##src/sctp/sctp_strcliecho2.c##\n            printf(\"From str:%d seq:%d (assoc:0x%x):\",## 36 ##src/sctp/sctp_strcliecho2.c##\n                   sri.sinfo_stream, sri.sinfo_ssn,## 37 ##src/sctp/sctp_strcliecho2.c##\n                   (u_int) sri.sinfo_assoc_id);## 38 ##src/sctp/sctp_strcliecho2.c##\n            printf(\"%.*s\\n\", rd_sz, recvline);## 39 ##src/sctp/sctp_strcliecho2.c##\n        }## 40 ##src/sctp/sctp_strcliecho2.c##\n    }## 41 ##src/sctp/sctp_strcliecho2.c##\n}## 42 ##src/sctp/sctp_strcliecho2.c##\n"
  },
  {
    "path": "sctp/sctp_wrapper.c",
    "content": "#include\t\"unp.h\"\n\n\nint\nSctp_recvmsg(int s, void *msg, size_t len,\n\t     struct sockaddr *from, socklen_t *fromlen,\n\t     struct sctp_sndrcvinfo *sinfo,\n\t     int *msg_flags)\n{\n\tint ret;\n\tret = sctp_recvmsg(s,msg,len,from,fromlen,sinfo,msg_flags);\n\tif(ret < 0){\n\t\terr_sys(\"sctp_recvmsg error\");\n\t}\n\treturn(ret);\n}\n\n\nint\nSctp_sendmsg (int s, void *data, size_t len, struct sockaddr *to,\n\t      socklen_t tolen, uint32_t ppid, uint32_t flags,\n\t      uint16_t stream_no, uint32_t timetolive, uint32_t context)\n{\n\tint ret;\n\tret = sctp_sendmsg(s,data,len,to,tolen,ppid,flags,stream_no,\n\t\t\t  timetolive,context);\n\tif(ret < 0){\n\t\terr_sys(\"sctp_sendmsg error\");\n\t}\n\treturn(ret);\n}\n\nint\nSctp_bindx(int sock_fd,struct sockaddr_storage *at,int num,int op)\n{\n\tint ret;\n\tret = sctp_bindx(sock_fd,at,num,op);\n\tif(ret < 0){\n\t\terr_sys(\"sctp_bindx error\");\n\t}\n\treturn(ret);\n}\n"
  },
  {
    "path": "sctp/sctpclient01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd;\n\tstruct sockaddr_in servaddr;\n\tstruct sctp_event_subscribe evnts;\n\tint echo_to_all=0;\n\n\tif(argc < 2)\n\t\terr_quit(\"Missing host argument - use '%s host [echo]'\\n\",\n\t\t       argv[0]);\n\tif(argc > 2) {\n\t\tprintf(\"Echoing messages to all streams\\n\");\n\t\techo_to_all = 1;\n\t}\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd,IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\tif(echo_to_all == 0)\n\t\tsctpstr_cli(stdin,sock_fd,(SA *)&servaddr,sizeof(servaddr));\n\telse\n\t\tsctpstr_cli_echoall(stdin,sock_fd,(SA *)&servaddr,sizeof(servaddr));\n\tClose(sock_fd);\n\treturn(0);\n}\n"
  },
  {
    "path": "sctp/sctpclient01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpclient01.c##\n\nint##  2 ##src/sctp/sctpclient01.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpclient01.c##\n{##  4 ##src/sctp/sctpclient01.c##\n    int     sock_fd;##  5 ##src/sctp/sctpclient01.c##\n    struct sockaddr_in servaddr;##  6 ##src/sctp/sctpclient01.c##\n    struct sctp_event_subscribe evnts;##  7 ##src/sctp/sctpclient01.c##\n    int     echo_to_all = 0;##  8 ##src/sctp/sctpclient01.c##\n\n    if (argc < 2)##  9 ##src/sctp/sctpclient01.c##\n        err_quit(\"Missing host argument - use '%s host [echo]'\\n\", argv[0]);## 10 ##src/sctp/sctpclient01.c##\n    if (argc > 2) {## 11 ##src/sctp/sctpclient01.c##\n        printf(\"Echoing messages to all streams\\n\");## 12 ##src/sctp/sctpclient01.c##\n        echo_to_all = 1;## 13 ##src/sctp/sctpclient01.c##\n    }## 14 ##src/sctp/sctpclient01.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 15 ##src/sctp/sctpclient01.c##\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/sctp/sctpclient01.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/sctp/sctpclient01.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 18 ##src/sctp/sctpclient01.c##\n    servaddr.sin_len = sizeof(servaddr);## 19 ##src/sctp/sctpclient01.c##\n#endif## 20 ##src/sctp/sctpclient01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 21 ##src/sctp/sctpclient01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 22 ##src/sctp/sctpclient01.c##\n    Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);## 23 ##src/sctp/sctpclient01.c##\n\n    bzero(&evnts, sizeof(evnts));## 24 ##src/sctp/sctpclient01.c##\n    evnts.sctp_data_io_event = 1;## 25 ##src/sctp/sctpclient01.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 26 ##src/sctp/sctpclient01.c##\n    if (echo_to_all == 0)## 27 ##src/sctp/sctpclient01.c##\n        sctpstr_cli(stdin, sock_fd, (SA *) &servaddr, sizeof(servaddr));## 28 ##src/sctp/sctpclient01.c##\n    else## 29 ##src/sctp/sctpclient01.c##\n        sctpstr_cli_echoall(stdin, sock_fd, (SA *) &servaddr,## 30 ##src/sctp/sctpclient01.c##\n                            sizeof(servaddr));## 31 ##src/sctp/sctpclient01.c##\n    Close(sock_fd);## 32 ##src/sctp/sctpclient01.c##\n    return (0);## 33 ##src/sctp/sctpclient01.c##\n}## 34 ##src/sctp/sctpclient01.c##\n"
  },
  {
    "path": "sctp/sctpclient02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd;\n\tstruct sockaddr_in servaddr;\n\tstruct sctp_event_subscribe evnts;\n\tint echo_to_all=0;\n\tchar byemsg[10];\n\n\tif(argc < 2)\n\t\terr_quit(\"Missing host argument - use '%s host [echo]'\\n\",\n\t\t       argv[0]);\n\tif(argc > 2) {\n\t\tprintf(\"Echoing messages to all streams\\n\");\n\t\techo_to_all = 1;\n\t}\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd,IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n/* include modified_client02 */\n\tif(echo_to_all == 0)\n\t\tsctpstr_cli(stdin,sock_fd,(SA *)&servaddr,sizeof(servaddr));\n\telse\n\t\tsctpstr_cli_echoall(stdin,sock_fd,(SA *)&servaddr,sizeof(servaddr));\n\tstrcpy(byemsg,\"goodbye\");\n\tSctp_sendmsg(sock_fd, byemsg, strlen(byemsg), \n\t\t     (SA *)&servaddr, sizeof(servaddr), \n\t\t     0,\n\t\t     MSG_ABORT,\n\t\t     0, 0, 0);\n\tClose(sock_fd);\n/* end modified_client02 */\n\treturn(0);\n}\n"
  },
  {
    "path": "sctp/sctpclient02.lc",
    "content": "\nint##  1 ##src/sctp/sctpclient02.c##\nmain(int argc, char **argv)##  2 ##src/sctp/sctpclient02.c##\n{##  3 ##src/sctp/sctpclient02.c##\n    int     sock_fd;##  4 ##src/sctp/sctpclient02.c##\n    struct sockaddr_in servaddr;##  5 ##src/sctp/sctpclient02.c##\n    struct sctp_event_subscribe evnts;##  6 ##src/sctp/sctpclient02.c##\n    int     echo_to_all = 0;##  7 ##src/sctp/sctpclient02.c##\n    char    byemsg[10];##  8 ##src/sctp/sctpclient02.c##\n\n    if (argc < 2)##  9 ##src/sctp/sctpclient02.c##\n        err_quit(\"Missing host argument - use '%s host [echo]'\\n\", argv[0]);## 10 ##src/sctp/sctpclient02.c##\n    if (argc > 2) {## 11 ##src/sctp/sctpclient02.c##\n        printf(\"Echoing messages to all streams\\n\");## 12 ##src/sctp/sctpclient02.c##\n        echo_to_all = 1;## 13 ##src/sctp/sctpclient02.c##\n    }## 14 ##src/sctp/sctpclient02.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 15 ##src/sctp/sctpclient02.c##\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/sctp/sctpclient02.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/sctp/sctpclient02.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 18 ##src/sctp/sctpclient02.c##\n    servaddr.sin_len = sizeof(servaddr);## 19 ##src/sctp/sctpclient02.c##\n#endif## 20 ##src/sctp/sctpclient02.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 21 ##src/sctp/sctpclient02.c##\n    servaddr.sin_port = htons(SERV_PORT);## 22 ##src/sctp/sctpclient02.c##\n    Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);## 23 ##src/sctp/sctpclient02.c##\n\n    bzero(&evnts, sizeof(evnts));## 24 ##src/sctp/sctpclient02.c##\n    evnts.sctp_data_io_event = 1;## 25 ##src/sctp/sctpclient02.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 26 ##src/sctp/sctpclient02.c##\n    /* include modified_client02 */## 27 ##src/sctp/sctpclient02.c##\n    if (echo_to_all == 0)## 28 ##src/sctp/sctpclient02.c##\n        sctpstr_cli(stdin, sock_fd, (SA *) &servaddr, sizeof(servaddr));## 29 ##src/sctp/sctpclient02.c##\n    else## 30 ##src/sctp/sctpclient02.c##\n        sctpstr_cli_echoall(stdin, sock_fd, (SA *) &servaddr,## 31 ##src/sctp/sctpclient02.c##\n                            sizeof(servaddr));## 32 ##src/sctp/sctpclient02.c##\n    strcpy(byemsg, \"goodbye\");## 33 ##src/sctp/sctpclient02.c##\n    Sctp_sendmsg(sock_fd, byemsg, strlen(byemsg),## 34 ##src/sctp/sctpclient02.c##\n                 (SA *) &servaddr, sizeof(servaddr), 0, MSG_ABORT, 0, 0, 0);## 35 ##src/sctp/sctpclient02.c##\n    Close(sock_fd);## 36 ##src/sctp/sctpclient02.c##\n    /* end modified_client02 */## 37 ##src/sctp/sctpclient02.c##\n    return (0);## 38 ##src/sctp/sctpclient02.c##\n}## 39 ##src/sctp/sctpclient02.c##\n"
  },
  {
    "path": "sctp/sctpclient04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd;\n\tstruct sockaddr_in servaddr;\n\tstruct sctp_event_subscribe evnts;\n\n\tif(argc != 2)\n\t\terr_quit(\"Missing host argument - use '%s host'\\n\",\n\t\t       argv[0]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n/* include mod_client04 */\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tevnts.sctp_association_event = 1;\n\tSetsockopt(sock_fd,IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tsctpstr_cli(stdin,sock_fd,(SA *)&servaddr,sizeof(servaddr));\n/* end mod_client04 */\n\tclose(sock_fd);\n\treturn(0);\n}\n"
  },
  {
    "path": "sctp/sctpclient04.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpclient04.c##\n\nint##  2 ##src/sctp/sctpclient04.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpclient04.c##\n{##  4 ##src/sctp/sctpclient04.c##\n    int     sock_fd;##  5 ##src/sctp/sctpclient04.c##\n    struct sockaddr_in servaddr;##  6 ##src/sctp/sctpclient04.c##\n    struct sctp_event_subscribe evnts;##  7 ##src/sctp/sctpclient04.c##\n\n    if (argc != 2)##  8 ##src/sctp/sctpclient04.c##\n        err_quit(\"Missing host argument - use '%s host'\\n\", argv[0]);##  9 ##src/sctp/sctpclient04.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 10 ##src/sctp/sctpclient04.c##\n    bzero(&servaddr, sizeof(servaddr));## 11 ##src/sctp/sctpclient04.c##\n    servaddr.sin_family = AF_INET;## 12 ##src/sctp/sctpclient04.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 13 ##src/sctp/sctpclient04.c##\n    servaddr.sin_len = sizeof(servaddr);## 14 ##src/sctp/sctpclient04.c##\n#endif## 15 ##src/sctp/sctpclient04.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 16 ##src/sctp/sctpclient04.c##\n    servaddr.sin_port = htons(SERV_PORT);## 17 ##src/sctp/sctpclient04.c##\n    Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);## 18 ##src/sctp/sctpclient04.c##\n    /* include mod_client04 */## 19 ##src/sctp/sctpclient04.c##\n    bzero(&evnts, sizeof(evnts));## 20 ##src/sctp/sctpclient04.c##\n    evnts.sctp_data_io_event = 1;## 21 ##src/sctp/sctpclient04.c##\n    evnts.sctp_association_event = 1;## 22 ##src/sctp/sctpclient04.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 23 ##src/sctp/sctpclient04.c##\n\n    sctpstr_cli(stdin, sock_fd, (SA *) &servaddr, sizeof(servaddr));## 24 ##src/sctp/sctpclient04.c##\n    /* end mod_client04 */## 25 ##src/sctp/sctpclient04.c##\n    close(sock_fd);## 26 ##src/sctp/sctpclient04.c##\n    return (0);## 27 ##src/sctp/sctpclient04.c##\n}## 28 ##src/sctp/sctpclient04.c##\n"
  },
  {
    "path": "sctp/sctpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tint stream_increment=1;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\n\tif (argc == 2)\n\t\tstream_increment = atoi(argv[1]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tif(stream_increment) {\n\t\t\tsri.sinfo_stream++;\n\t\t\tif(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) \n\t\t\t\tsri.sinfo_stream = 0;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctpserv01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv01.c##\n\nint##  2 ##src/sctp/sctpserv01.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv01.c##\n{##  4 ##src/sctp/sctpserv01.c##\n    int     sock_fd, msg_flags;##  5 ##src/sctp/sctpserv01.c##\n    char    readbuf[BUFFSIZE];##  6 ##src/sctp/sctpserv01.c##\n    struct sockaddr_in servaddr, cliaddr;##  7 ##src/sctp/sctpserv01.c##\n    struct sctp_sndrcvinfo sri;##  8 ##src/sctp/sctpserv01.c##\n    struct sctp_event_subscribe evnts;##  9 ##src/sctp/sctpserv01.c##\n    int     stream_increment = 1;## 10 ##src/sctp/sctpserv01.c##\n    socklen_t len;## 11 ##src/sctp/sctpserv01.c##\n    size_t  rd_sz;## 12 ##src/sctp/sctpserv01.c##\n\n    if (argc == 2)## 13 ##src/sctp/sctpserv01.c##\n        stream_increment = atoi(argv[1]);## 14 ##src/sctp/sctpserv01.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 15 ##src/sctp/sctpserv01.c##\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/sctp/sctpserv01.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/sctp/sctpserv01.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 18 ##src/sctp/sctpserv01.c##\n    servaddr.sin_len = sizeof(servaddr);## 19 ##src/sctp/sctpserv01.c##\n#endif## 20 ##src/sctp/sctpserv01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 21 ##src/sctp/sctpserv01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 22 ##src/sctp/sctpserv01.c##\n\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 23 ##src/sctp/sctpserv01.c##\n\n    bzero(&evnts, sizeof(evnts));## 24 ##src/sctp/sctpserv01.c##\n    evnts.sctp_data_io_event = 1;## 25 ##src/sctp/sctpserv01.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 26 ##src/sctp/sctpserv01.c##\n\n    Listen(sock_fd, LISTENQ);## 27 ##src/sctp/sctpserv01.c##\n    for (;;) {## 28 ##src/sctp/sctpserv01.c##\n        len = sizeof(struct sockaddr_in);## 29 ##src/sctp/sctpserv01.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 30 ##src/sctp/sctpserv01.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 31 ##src/sctp/sctpserv01.c##\n        if (stream_increment) {## 32 ##src/sctp/sctpserv01.c##\n            sri.sinfo_stream++;## 33 ##src/sctp/sctpserv01.c##\n            if (sri.sinfo_stream >=## 34 ##src/sctp/sctpserv01.c##\n                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))## 35 ##src/sctp/sctpserv01.c##\n                sri.sinfo_stream = 0;## 36 ##src/sctp/sctpserv01.c##\n        }## 37 ##src/sctp/sctpserv01.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 38 ##src/sctp/sctpserv01.c##\n                     (SA *) &cliaddr, len,## 39 ##src/sctp/sctpserv01.c##\n                     sri.sinfo_ppid,## 40 ##src/sctp/sctpserv01.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 41 ##src/sctp/sctpserv01.c##\n    }## 42 ##src/sctp/sctpserv01.c##\n}## 43 ##src/sctp/sctpserv01.c##\n"
  },
  {
    "path": "sctp/sctpserv02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tint stream_increment=1;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\tstruct sctp_initmsg initm;\n\n/* include modified_sctpserv02 */\n\tif (argc == 2)\n\t\tstream_increment = atoi(argv[1]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&initm,sizeof(initm));\n\tinitm.sinit_num_ostreams = SERV_MORE_STRMS_SCTP;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_INITMSG,\n\t\t   &initm, sizeof(initm));\n/* end modified_sctpserv02 */\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tif(stream_increment) {\n\t\t\tsri.sinfo_stream++;\n\t\t\tif(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) \n\t\t\t\tsri.sinfo_stream = 0;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctpserv02.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv02.c##\n\nint##  2 ##src/sctp/sctpserv02.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv02.c##\n{##  4 ##src/sctp/sctpserv02.c##\n    int     sock_fd, msg_flags;##  5 ##src/sctp/sctpserv02.c##\n    char    readbuf[BUFFSIZE];##  6 ##src/sctp/sctpserv02.c##\n    struct sockaddr_in servaddr, cliaddr;##  7 ##src/sctp/sctpserv02.c##\n    struct sctp_sndrcvinfo sri;##  8 ##src/sctp/sctpserv02.c##\n    struct sctp_event_subscribe evnts;##  9 ##src/sctp/sctpserv02.c##\n    int     stream_increment = 1;## 10 ##src/sctp/sctpserv02.c##\n    socklen_t len;## 11 ##src/sctp/sctpserv02.c##\n    size_t  rd_sz;## 12 ##src/sctp/sctpserv02.c##\n    struct sctp_initmsg initm;## 13 ##src/sctp/sctpserv02.c##\n\n    /* include modified_sctpserv02 */## 14 ##src/sctp/sctpserv02.c##\n    if (argc == 2)## 15 ##src/sctp/sctpserv02.c##\n        stream_increment = atoi(argv[1]);## 16 ##src/sctp/sctpserv02.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 17 ##src/sctp/sctpserv02.c##\n    bzero(&initm, sizeof(initm));## 18 ##src/sctp/sctpserv02.c##\n    initm.sinit_num_ostreams = SERV_MORE_STRMS_SCTP;## 19 ##src/sctp/sctpserv02.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_INITMSG, &initm, sizeof(initm));## 20 ##src/sctp/sctpserv02.c##\n    /* end modified_sctpserv02 */## 21 ##src/sctp/sctpserv02.c##\n    bzero(&servaddr, sizeof(servaddr));## 22 ##src/sctp/sctpserv02.c##\n    servaddr.sin_family = AF_INET;## 23 ##src/sctp/sctpserv02.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 24 ##src/sctp/sctpserv02.c##\n    servaddr.sin_len = sizeof(servaddr);## 25 ##src/sctp/sctpserv02.c##\n#endif## 26 ##src/sctp/sctpserv02.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 27 ##src/sctp/sctpserv02.c##\n    servaddr.sin_port = htons(SERV_PORT);## 28 ##src/sctp/sctpserv02.c##\n\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 29 ##src/sctp/sctpserv02.c##\n\n    bzero(&evnts, sizeof(evnts));## 30 ##src/sctp/sctpserv02.c##\n    evnts.sctp_data_io_event = 1;## 31 ##src/sctp/sctpserv02.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 32 ##src/sctp/sctpserv02.c##\n\n    Listen(sock_fd, LISTENQ);## 33 ##src/sctp/sctpserv02.c##\n    for (;;) {## 34 ##src/sctp/sctpserv02.c##\n        len = sizeof(struct sockaddr_in);## 35 ##src/sctp/sctpserv02.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 36 ##src/sctp/sctpserv02.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 37 ##src/sctp/sctpserv02.c##\n        if (stream_increment) {## 38 ##src/sctp/sctpserv02.c##\n            sri.sinfo_stream++;## 39 ##src/sctp/sctpserv02.c##\n            if (sri.sinfo_stream >=## 40 ##src/sctp/sctpserv02.c##\n                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))## 41 ##src/sctp/sctpserv02.c##\n                sri.sinfo_stream = 0;## 42 ##src/sctp/sctpserv02.c##\n        }## 43 ##src/sctp/sctpserv02.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 44 ##src/sctp/sctpserv02.c##\n                     (SA *) &cliaddr, len,## 45 ##src/sctp/sctpserv02.c##\n                     sri.sinfo_ppid,## 46 ##src/sctp/sctpserv02.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 47 ##src/sctp/sctpserv02.c##\n    }## 48 ##src/sctp/sctpserv02.c##\n}## 49 ##src/sctp/sctpserv02.c##\n"
  },
  {
    "path": "sctp/sctpserv03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tint stream_increment=1;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\n\tif (argc == 2)\n\t\tstream_increment = atoi(argv[1]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n/* include modified_sctpserv03 */\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tif(stream_increment) {\n\t\t\tsri.sinfo_stream++;\n\t\t\tif(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) \n\t\t\t\tsri.sinfo_stream = 0;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     (sri.sinfo_flags|MSG_EOF),\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n/* end modified_sctpserv03 */\n}\n"
  },
  {
    "path": "sctp/sctpserv03.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv03.c##\n\nint##  2 ##src/sctp/sctpserv03.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv03.c##\n{##  4 ##src/sctp/sctpserv03.c##\n    int     sock_fd, msg_flags;##  5 ##src/sctp/sctpserv03.c##\n    char    readbuf[BUFFSIZE];##  6 ##src/sctp/sctpserv03.c##\n    struct sockaddr_in servaddr, cliaddr;##  7 ##src/sctp/sctpserv03.c##\n    struct sctp_sndrcvinfo sri;##  8 ##src/sctp/sctpserv03.c##\n    struct sctp_event_subscribe evnts;##  9 ##src/sctp/sctpserv03.c##\n    int     stream_increment = 1;## 10 ##src/sctp/sctpserv03.c##\n    socklen_t len;## 11 ##src/sctp/sctpserv03.c##\n    size_t  rd_sz;## 12 ##src/sctp/sctpserv03.c##\n\n    if (argc == 2)## 13 ##src/sctp/sctpserv03.c##\n        stream_increment = atoi(argv[1]);## 14 ##src/sctp/sctpserv03.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 15 ##src/sctp/sctpserv03.c##\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/sctp/sctpserv03.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/sctp/sctpserv03.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 18 ##src/sctp/sctpserv03.c##\n    servaddr.sin_len = sizeof(servaddr);## 19 ##src/sctp/sctpserv03.c##\n#endif## 20 ##src/sctp/sctpserv03.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 21 ##src/sctp/sctpserv03.c##\n    servaddr.sin_port = htons(SERV_PORT);## 22 ##src/sctp/sctpserv03.c##\n\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 23 ##src/sctp/sctpserv03.c##\n\n    bzero(&evnts, sizeof(evnts));## 24 ##src/sctp/sctpserv03.c##\n    evnts.sctp_data_io_event = 1;## 25 ##src/sctp/sctpserv03.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 26 ##src/sctp/sctpserv03.c##\n\n    Listen(sock_fd, LISTENQ);## 27 ##src/sctp/sctpserv03.c##\n    /* include modified_sctpserv03 */## 28 ##src/sctp/sctpserv03.c##\n    for (;;) {## 29 ##src/sctp/sctpserv03.c##\n        len = sizeof(struct sockaddr_in);## 30 ##src/sctp/sctpserv03.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 31 ##src/sctp/sctpserv03.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 32 ##src/sctp/sctpserv03.c##\n        if (stream_increment) {## 33 ##src/sctp/sctpserv03.c##\n            sri.sinfo_stream++;## 34 ##src/sctp/sctpserv03.c##\n            if (sri.sinfo_stream >=## 35 ##src/sctp/sctpserv03.c##\n                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))## 36 ##src/sctp/sctpserv03.c##\n                sri.sinfo_stream = 0;## 37 ##src/sctp/sctpserv03.c##\n        }## 38 ##src/sctp/sctpserv03.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 39 ##src/sctp/sctpserv03.c##\n                     (SA *) &cliaddr, len,## 40 ##src/sctp/sctpserv03.c##\n                     sri.sinfo_ppid,## 41 ##src/sctp/sctpserv03.c##\n                     (sri.sinfo_flags | MSG_EOF), sri.sinfo_stream, 0, 0);## 42 ##src/sctp/sctpserv03.c##\n    }## 43 ##src/sctp/sctpserv03.c##\n    /* end modified_sctpserv03 */## 44 ##src/sctp/sctpserv03.c##\n}## 45 ##src/sctp/sctpserv03.c##\n"
  },
  {
    "path": "sctp/sctpserv04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tint stream_increment=1;\n\tint close_time;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\n/* include mod_serv04 */\n\tif (argc == 2)\n\t\tstream_increment = atoi(argv[1]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tclose_time = 120;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_AUTOCLOSE,\n\t\t   &close_time, sizeof(close_time));\n\t\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n/* end mod_serv04 */\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tif(stream_increment) {\n\t\t\tsri.sinfo_stream++;\n\t\t\tif(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) \n\t\t\t\tsri.sinfo_stream = 0;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctpserv04.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv04.c##\n\nint##  2 ##src/sctp/sctpserv04.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv04.c##\n{##  4 ##src/sctp/sctpserv04.c##\n    int     sock_fd, msg_flags;##  5 ##src/sctp/sctpserv04.c##\n    char    readbuf[BUFFSIZE];##  6 ##src/sctp/sctpserv04.c##\n    struct sockaddr_in servaddr, cliaddr;##  7 ##src/sctp/sctpserv04.c##\n    struct sctp_sndrcvinfo sri;##  8 ##src/sctp/sctpserv04.c##\n    struct sctp_event_subscribe evnts;##  9 ##src/sctp/sctpserv04.c##\n    int     stream_increment = 1;## 10 ##src/sctp/sctpserv04.c##\n    int     close_time;## 11 ##src/sctp/sctpserv04.c##\n    socklen_t len;## 12 ##src/sctp/sctpserv04.c##\n    size_t  rd_sz;## 13 ##src/sctp/sctpserv04.c##\n\n    /* include mod_serv04 */## 14 ##src/sctp/sctpserv04.c##\n    if (argc == 2)## 15 ##src/sctp/sctpserv04.c##\n        stream_increment = atoi(argv[1]);## 16 ##src/sctp/sctpserv04.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 17 ##src/sctp/sctpserv04.c##\n    close_time = 120;## 18 ##src/sctp/sctpserv04.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_AUTOCLOSE,## 19 ##src/sctp/sctpserv04.c##\n               &close_time, sizeof(close_time));## 20 ##src/sctp/sctpserv04.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 21 ##src/sctp/sctpserv04.c##\n    servaddr.sin_family = AF_INET;## 22 ##src/sctp/sctpserv04.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 23 ##src/sctp/sctpserv04.c##\n    servaddr.sin_len = sizeof(servaddr);## 24 ##src/sctp/sctpserv04.c##\n#endif## 25 ##src/sctp/sctpserv04.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 26 ##src/sctp/sctpserv04.c##\n    servaddr.sin_port = htons(SERV_PORT);## 27 ##src/sctp/sctpserv04.c##\n    /* end mod_serv04 */## 28 ##src/sctp/sctpserv04.c##\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 29 ##src/sctp/sctpserv04.c##\n\n    bzero(&evnts, sizeof(evnts));## 30 ##src/sctp/sctpserv04.c##\n    evnts.sctp_data_io_event = 1;## 31 ##src/sctp/sctpserv04.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 32 ##src/sctp/sctpserv04.c##\n\n    Listen(sock_fd, LISTENQ);## 33 ##src/sctp/sctpserv04.c##\n    for (;;) {## 34 ##src/sctp/sctpserv04.c##\n        len = sizeof(struct sockaddr_in);## 35 ##src/sctp/sctpserv04.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 36 ##src/sctp/sctpserv04.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 37 ##src/sctp/sctpserv04.c##\n        if (stream_increment) {## 38 ##src/sctp/sctpserv04.c##\n            sri.sinfo_stream++;## 39 ##src/sctp/sctpserv04.c##\n            if (sri.sinfo_stream >=## 40 ##src/sctp/sctpserv04.c##\n                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))## 41 ##src/sctp/sctpserv04.c##\n                sri.sinfo_stream = 0;## 42 ##src/sctp/sctpserv04.c##\n        }## 43 ##src/sctp/sctpserv04.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 44 ##src/sctp/sctpserv04.c##\n                     (SA *) &cliaddr, len,## 45 ##src/sctp/sctpserv04.c##\n                     sri.sinfo_ppid,## 46 ##src/sctp/sctpserv04.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 47 ##src/sctp/sctpserv04.c##\n    }## 48 ##src/sctp/sctpserv04.c##\n}## 49 ##src/sctp/sctpserv04.c##\n"
  },
  {
    "path": "sctp/sctpserv05.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tuint8_t *readbuf;\n\tint sock_fd,msg_flags;\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tint stream_increment=1;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\n\tif (argc == 2)\n\t\tstream_increment = atoi(argv[1]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n\trd_sz = 0;\n/* include mod_serv05 */\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\tbzero(&sri,sizeof(sri));\n\t\treadbuf = pdapi_recvmsg(sock_fd, &rd_sz,\n\t\t\t\t\t(SA *)&cliaddr, &len,\n\t\t\t\t\t&sri,&msg_flags);\n\t\tif(readbuf == NULL)\n\t\t   continue;\n/* end mod_serv05 */\n\t\tif(stream_increment) {\n\t\t\tsri.sinfo_stream++;\n\t\t\tif(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) \n\t\t\t\tsri.sinfo_stream = 0;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctpserv05.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv05.c##\n\nint##  2 ##src/sctp/sctpserv05.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv05.c##\n{##  4 ##src/sctp/sctpserv05.c##\n    uint8_t *readbuf;##  5 ##src/sctp/sctpserv05.c##\n    int     sock_fd, msg_flags;##  6 ##src/sctp/sctpserv05.c##\n    struct sockaddr_in servaddr, cliaddr;##  7 ##src/sctp/sctpserv05.c##\n    struct sctp_sndrcvinfo sri;##  8 ##src/sctp/sctpserv05.c##\n    struct sctp_event_subscribe evnts;##  9 ##src/sctp/sctpserv05.c##\n    int     stream_increment = 1;## 10 ##src/sctp/sctpserv05.c##\n    socklen_t len;## 11 ##src/sctp/sctpserv05.c##\n    size_t  rd_sz;## 12 ##src/sctp/sctpserv05.c##\n\n    if (argc == 2)## 13 ##src/sctp/sctpserv05.c##\n        stream_increment = atoi(argv[1]);## 14 ##src/sctp/sctpserv05.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 15 ##src/sctp/sctpserv05.c##\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/sctp/sctpserv05.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/sctp/sctpserv05.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 18 ##src/sctp/sctpserv05.c##\n    servaddr.sin_len = sizeof(servaddr);## 19 ##src/sctp/sctpserv05.c##\n#endif## 20 ##src/sctp/sctpserv05.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 21 ##src/sctp/sctpserv05.c##\n    servaddr.sin_port = htons(SERV_PORT);## 22 ##src/sctp/sctpserv05.c##\n\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 23 ##src/sctp/sctpserv05.c##\n\n    bzero(&evnts, sizeof(evnts));## 24 ##src/sctp/sctpserv05.c##\n    evnts.sctp_data_io_event = 1;## 25 ##src/sctp/sctpserv05.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 26 ##src/sctp/sctpserv05.c##\n\n    Listen(sock_fd, LISTENQ);## 27 ##src/sctp/sctpserv05.c##\n    rd_sz = 0;## 28 ##src/sctp/sctpserv05.c##\n    /* include mod_serv05 */## 29 ##src/sctp/sctpserv05.c##\n    for (;;) {## 30 ##src/sctp/sctpserv05.c##\n        len = sizeof(struct sockaddr_in);## 31 ##src/sctp/sctpserv05.c##\n        bzero(&sri, sizeof(sri));## 32 ##src/sctp/sctpserv05.c##\n        readbuf = pdapi_recvmsg(sock_fd, &rd_sz,## 33 ##src/sctp/sctpserv05.c##\n                                (SA *) &cliaddr, &len, &sri, &msg_flags);## 34 ##src/sctp/sctpserv05.c##\n        if (readbuf == NULL)## 35 ##src/sctp/sctpserv05.c##\n            continue;## 36 ##src/sctp/sctpserv05.c##\n        /* end mod_serv05 */## 37 ##src/sctp/sctpserv05.c##\n        if (stream_increment) {## 38 ##src/sctp/sctpserv05.c##\n            sri.sinfo_stream++;## 39 ##src/sctp/sctpserv05.c##\n            if (sri.sinfo_stream >=## 40 ##src/sctp/sctpserv05.c##\n                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))## 41 ##src/sctp/sctpserv05.c##\n                sri.sinfo_stream = 0;## 42 ##src/sctp/sctpserv05.c##\n        }## 43 ##src/sctp/sctpserv05.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 44 ##src/sctp/sctpserv05.c##\n                     (SA *) &cliaddr, len,## 45 ##src/sctp/sctpserv05.c##\n                     sri.sinfo_ppid,## 46 ##src/sctp/sctpserv05.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 47 ##src/sctp/sctpserv05.c##\n    }## 48 ##src/sctp/sctpserv05.c##\n}## 49 ##src/sctp/sctpserv05.c##\n"
  },
  {
    "path": "sctp/sctpserv06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tint stream_increment=1;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\n\tif (argc == 2)\n\t\tstream_increment = atoi(argv[1]);\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n/* include mod_serv06 */\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tevnts.sctp_association_event = 1;\n\tevnts.sctp_address_event = 1;\n\tevnts.sctp_send_failure_event = 1;\n\tevnts.sctp_peer_error_event = 1;\n\tevnts.sctp_shutdown_event = 1;\n\tevnts.sctp_partial_delivery_event = 1;\n\tevnts.sctp_adaption_layer_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tif(msg_flags & MSG_NOTIFICATION) {\n\t\t\tprint_notification(readbuf);\n\t\t\tcontinue;\n\t\t}\n/* end mod_serv06 */\n\t\tif(stream_increment) {\n\t\t\tsri.sinfo_stream++;\n\t\t\tif(sri.sinfo_stream >= sctp_get_no_strms(sock_fd,(SA *)&cliaddr, len)) \n\t\t\t\tsri.sinfo_stream = 0;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n}\n"
  },
  {
    "path": "sctp/sctpserv06.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv06.c##\n\nint##  2 ##src/sctp/sctpserv06.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv06.c##\n{##  4 ##src/sctp/sctpserv06.c##\n    int     sock_fd, msg_flags;##  5 ##src/sctp/sctpserv06.c##\n    char    readbuf[BUFFSIZE];##  6 ##src/sctp/sctpserv06.c##\n    struct sockaddr_in servaddr, cliaddr;##  7 ##src/sctp/sctpserv06.c##\n    struct sctp_sndrcvinfo sri;##  8 ##src/sctp/sctpserv06.c##\n    struct sctp_event_subscribe evnts;##  9 ##src/sctp/sctpserv06.c##\n    int     stream_increment = 1;## 10 ##src/sctp/sctpserv06.c##\n    socklen_t len;## 11 ##src/sctp/sctpserv06.c##\n    size_t  rd_sz;## 12 ##src/sctp/sctpserv06.c##\n\n    if (argc == 2)## 13 ##src/sctp/sctpserv06.c##\n        stream_increment = atoi(argv[1]);## 14 ##src/sctp/sctpserv06.c##\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 15 ##src/sctp/sctpserv06.c##\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/sctp/sctpserv06.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/sctp/sctpserv06.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 18 ##src/sctp/sctpserv06.c##\n    servaddr.sin_len = sizeof(servaddr);## 19 ##src/sctp/sctpserv06.c##\n#endif## 20 ##src/sctp/sctpserv06.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 21 ##src/sctp/sctpserv06.c##\n    servaddr.sin_port = htons(SERV_PORT);## 22 ##src/sctp/sctpserv06.c##\n\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 23 ##src/sctp/sctpserv06.c##\n\n    /* include mod_serv06 */## 24 ##src/sctp/sctpserv06.c##\n    bzero(&evnts, sizeof(evnts));## 25 ##src/sctp/sctpserv06.c##\n    evnts.sctp_data_io_event = 1;## 26 ##src/sctp/sctpserv06.c##\n    evnts.sctp_association_event = 1;## 27 ##src/sctp/sctpserv06.c##\n    evnts.sctp_address_event = 1;## 28 ##src/sctp/sctpserv06.c##\n    evnts.sctp_send_failure_event = 1;## 29 ##src/sctp/sctpserv06.c##\n    evnts.sctp_peer_error_event = 1;## 30 ##src/sctp/sctpserv06.c##\n    evnts.sctp_shutdown_event = 1;## 31 ##src/sctp/sctpserv06.c##\n    evnts.sctp_partial_delivery_event = 1;## 32 ##src/sctp/sctpserv06.c##\n    evnts.sctp_adaption_layer_event = 1;## 33 ##src/sctp/sctpserv06.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 34 ##src/sctp/sctpserv06.c##\n\n    Listen(sock_fd, LISTENQ);## 35 ##src/sctp/sctpserv06.c##\n    for (;;) {## 36 ##src/sctp/sctpserv06.c##\n        len = sizeof(struct sockaddr_in);## 37 ##src/sctp/sctpserv06.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 38 ##src/sctp/sctpserv06.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 39 ##src/sctp/sctpserv06.c##\n        if (msg_flags & MSG_NOTIFICATION) {## 40 ##src/sctp/sctpserv06.c##\n            print_notification(readbuf);## 41 ##src/sctp/sctpserv06.c##\n            continue;## 42 ##src/sctp/sctpserv06.c##\n        }## 43 ##src/sctp/sctpserv06.c##\n        /* end mod_serv06 */## 44 ##src/sctp/sctpserv06.c##\n        if (stream_increment) {## 45 ##src/sctp/sctpserv06.c##\n            sri.sinfo_stream++;## 46 ##src/sctp/sctpserv06.c##\n            if (sri.sinfo_stream >=## 47 ##src/sctp/sctpserv06.c##\n                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))## 48 ##src/sctp/sctpserv06.c##\n                sri.sinfo_stream = 0;## 49 ##src/sctp/sctpserv06.c##\n        }## 50 ##src/sctp/sctpserv06.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 51 ##src/sctp/sctpserv06.c##\n                     (SA *) &cliaddr, len,## 52 ##src/sctp/sctpserv06.c##\n                     sri.sinfo_ppid,## 53 ##src/sctp/sctpserv06.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 54 ##src/sctp/sctpserv06.c##\n    }## 55 ##src/sctp/sctpserv06.c##\n}## 56 ##src/sctp/sctpserv06.c##\n"
  },
  {
    "path": "sctp/sctpserv07.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tsocklen_t len;\n\tsize_t rd_sz;\n/* include mod_serv07 */\n\tif(argc < 2)\n\t\terr_quit(\"Error, use %s [list of addresses to bind]\\n\",\n\t\t       argv[0]);\n        sock_fd = Socket(AF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP);\n\n\tif(sctp_bind_arg_list(sock_fd, argv + 1, argc - 1))\n\t\terr_sys(\"Can't bind the address set\");\n\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n/* end mod_serv07 */\n\tevnts.sctp_association_event = 1;\n\tevnts.sctp_address_event = 1;\n\tevnts.sctp_send_failure_event = 1;\n\tevnts.sctp_peer_error_event = 1;\n\tevnts.sctp_shutdown_event = 1;\n\tevnts.sctp_partial_delivery_event = 1;\n\tevnts.sctp_adaption_layer_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tif(msg_flags & MSG_NOTIFICATION) {\n\t\t\tprint_notification(readbuf);\n\t\t\tcontinue;\n\t\t}\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t}\n\t\n}\n"
  },
  {
    "path": "sctp/sctpserv07.lc",
    "content": "\nint##  1 ##src/sctp/sctpserv07.c##\nmain(int argc, char **argv)##  2 ##src/sctp/sctpserv07.c##\n{##  3 ##src/sctp/sctpserv07.c##\n    int     sock_fd, msg_flags;##  4 ##src/sctp/sctpserv07.c##\n    char    readbuf[BUFFSIZE];##  5 ##src/sctp/sctpserv07.c##\n    struct sockaddr_in cliaddr;##  6 ##src/sctp/sctpserv07.c##\n    struct sctp_sndrcvinfo sri;##  7 ##src/sctp/sctpserv07.c##\n    struct sctp_event_subscribe evnts;##  8 ##src/sctp/sctpserv07.c##\n    socklen_t len;##  9 ##src/sctp/sctpserv07.c##\n    size_t  rd_sz;## 10 ##src/sctp/sctpserv07.c##\n    /* include mod_serv07 */## 11 ##src/sctp/sctpserv07.c##\n    if (argc < 2)## 12 ##src/sctp/sctpserv07.c##\n        err_quit(\"Error, use %s [list of addresses to bind]\\n\", argv[0]);## 13 ##src/sctp/sctpserv07.c##\n    sock_fd = Socket(AF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP);## 14 ##src/sctp/sctpserv07.c##\n\n    if (sctp_bind_arg_list(sock_fd, argv + 1, argc - 1))## 15 ##src/sctp/sctpserv07.c##\n        err_sys(\"Can't bind the address set\");## 16 ##src/sctp/sctpserv07.c##\n\n    bzero(&evnts, sizeof(evnts));## 17 ##src/sctp/sctpserv07.c##\n    evnts.sctp_data_io_event = 1;## 18 ##src/sctp/sctpserv07.c##\n    /* end mod_serv07 */## 19 ##src/sctp/sctpserv07.c##\n    evnts.sctp_association_event = 1;## 20 ##src/sctp/sctpserv07.c##\n    evnts.sctp_address_event = 1;## 21 ##src/sctp/sctpserv07.c##\n    evnts.sctp_send_failure_event = 1;## 22 ##src/sctp/sctpserv07.c##\n    evnts.sctp_peer_error_event = 1;## 23 ##src/sctp/sctpserv07.c##\n    evnts.sctp_shutdown_event = 1;## 24 ##src/sctp/sctpserv07.c##\n    evnts.sctp_partial_delivery_event = 1;## 25 ##src/sctp/sctpserv07.c##\n    evnts.sctp_adaption_layer_event = 1;## 26 ##src/sctp/sctpserv07.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 27 ##src/sctp/sctpserv07.c##\n\n    Listen(sock_fd, LISTENQ);## 28 ##src/sctp/sctpserv07.c##\n\n    for (;;) {## 29 ##src/sctp/sctpserv07.c##\n        len = sizeof(struct sockaddr_in);## 30 ##src/sctp/sctpserv07.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 31 ##src/sctp/sctpserv07.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 32 ##src/sctp/sctpserv07.c##\n        if (msg_flags & MSG_NOTIFICATION) {## 33 ##src/sctp/sctpserv07.c##\n            print_notification(readbuf);## 34 ##src/sctp/sctpserv07.c##\n            continue;## 35 ##src/sctp/sctpserv07.c##\n        }## 36 ##src/sctp/sctpserv07.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 37 ##src/sctp/sctpserv07.c##\n                     (SA *) &cliaddr, len,## 38 ##src/sctp/sctpserv07.c##\n                     sri.sinfo_ppid,## 39 ##src/sctp/sctpserv07.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 40 ##src/sctp/sctpserv07.c##\n    }## 41 ##src/sctp/sctpserv07.c##\n\n}## 42 ##src/sctp/sctpserv07.c##\n"
  },
  {
    "path": "sctp/sctpserv_fork.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint sock_fd,msg_flags,connfd,childpid;\n\tsctp_assoc_t assoc;\n\tchar readbuf[BUFFSIZE];\n\tstruct sockaddr_in servaddr, cliaddr;\n\tstruct sctp_sndrcvinfo sri;\n\tstruct sctp_event_subscribe evnts;\n\tsocklen_t len;\n\tsize_t rd_sz;\n\n        sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port = htons(SERV_PORT);\n\n\tBind(sock_fd, (SA *) &servaddr, sizeof(servaddr));\n\t\n\tbzero(&evnts, sizeof(evnts));\n\tevnts.sctp_data_io_event = 1;\n\tSetsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,\n\t\t   &evnts, sizeof(evnts));\n\n\tListen(sock_fd, LISTENQ);\n/* include mod_servfork */\n\tfor ( ; ; ) {\n\t\tlen = sizeof(struct sockaddr_in);\n\t\trd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),\n\t\t\t     (SA *)&cliaddr, &len,\n\t\t\t     &sri,&msg_flags);\n\t\tSctp_sendmsg(sock_fd, readbuf, rd_sz, \n\t\t\t     (SA *)&cliaddr, len,\n\t\t\t     sri.sinfo_ppid,\n\t\t\t     sri.sinfo_flags,\n\t\t\t     sri.sinfo_stream,\n\t\t\t     0, 0);\n\t\tassoc = sctp_address_to_associd(sock_fd,(SA *)&cliaddr,len);\n\t\tif((int)assoc == 0){\n\t\t\terr_ret(\"Can't get association id\");\n\t\t\tcontinue;\n\t\t} \n\t\tconnfd = sctp_peeloff(sock_fd,assoc);\n\t\tif(connfd == -1){\n\t\t\terr_ret(\"sctp_peeloff fails\");\n\t\t\tcontinue;\n\t\t}\n\t\tif((childpid = fork()) == 0) {\n\t\t\tClose(sock_fd);\n\t\t\tstr_echo(connfd);\n\t\t\texit(0);\n\t\t} else {\n\t\t\tClose(connfd);\n\t\t}\n\t}\n/* end mod_servfork */\n}\n"
  },
  {
    "path": "sctp/sctpserv_fork.lc",
    "content": "#include    \"unp.h\"##  1 ##src/sctp/sctpserv_fork.c##\n\nint##  2 ##src/sctp/sctpserv_fork.c##\nmain(int argc, char **argv)##  3 ##src/sctp/sctpserv_fork.c##\n{##  4 ##src/sctp/sctpserv_fork.c##\n    int     sock_fd, msg_flags, connfd, childpid;##  5 ##src/sctp/sctpserv_fork.c##\n    sctp_assoc_t assoc;##  6 ##src/sctp/sctpserv_fork.c##\n    char    readbuf[BUFFSIZE];##  7 ##src/sctp/sctpserv_fork.c##\n    struct sockaddr_in servaddr, cliaddr;##  8 ##src/sctp/sctpserv_fork.c##\n    struct sctp_sndrcvinfo sri;##  9 ##src/sctp/sctpserv_fork.c##\n    struct sctp_event_subscribe evnts;## 10 ##src/sctp/sctpserv_fork.c##\n    socklen_t len;## 11 ##src/sctp/sctpserv_fork.c##\n    size_t  rd_sz;## 12 ##src/sctp/sctpserv_fork.c##\n\n    sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);## 13 ##src/sctp/sctpserv_fork.c##\n    bzero(&servaddr, sizeof(servaddr));## 14 ##src/sctp/sctpserv_fork.c##\n    servaddr.sin_family = AF_INET;## 15 ##src/sctp/sctpserv_fork.c##\n#ifdef HAVE_SOCKADDR_SA_LEN## 16 ##src/sctp/sctpserv_fork.c##\n    servaddr.sin_len = sizeof(servaddr);## 17 ##src/sctp/sctpserv_fork.c##\n#endif## 18 ##src/sctp/sctpserv_fork.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 19 ##src/sctp/sctpserv_fork.c##\n    servaddr.sin_port = htons(SERV_PORT);## 20 ##src/sctp/sctpserv_fork.c##\n\n    Bind(sock_fd, (SA *) &servaddr, sizeof(servaddr));## 21 ##src/sctp/sctpserv_fork.c##\n\n    bzero(&evnts, sizeof(evnts));## 22 ##src/sctp/sctpserv_fork.c##\n    evnts.sctp_data_io_event = 1;## 23 ##src/sctp/sctpserv_fork.c##\n    Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));## 24 ##src/sctp/sctpserv_fork.c##\n\n    Listen(sock_fd, LISTENQ);## 25 ##src/sctp/sctpserv_fork.c##\n    /* include mod_servfork */## 26 ##src/sctp/sctpserv_fork.c##\n    for (;;) {## 27 ##src/sctp/sctpserv_fork.c##\n        len = sizeof(struct sockaddr_in);## 28 ##src/sctp/sctpserv_fork.c##\n        rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),## 29 ##src/sctp/sctpserv_fork.c##\n                             (SA *) &cliaddr, &len, &sri, &msg_flags);## 30 ##src/sctp/sctpserv_fork.c##\n        Sctp_sendmsg(sock_fd, readbuf, rd_sz,## 31 ##src/sctp/sctpserv_fork.c##\n                     (SA *) &cliaddr, len,## 32 ##src/sctp/sctpserv_fork.c##\n                     sri.sinfo_ppid,## 33 ##src/sctp/sctpserv_fork.c##\n                     sri.sinfo_flags, sri.sinfo_stream, 0, 0);## 34 ##src/sctp/sctpserv_fork.c##\n        assoc = sctp_address_to_associd(sock_fd, (SA *) &cliaddr, len);## 35 ##src/sctp/sctpserv_fork.c##\n        if ((int) assoc == 0) {## 36 ##src/sctp/sctpserv_fork.c##\n            err_ret(\"Can't get association id\");## 37 ##src/sctp/sctpserv_fork.c##\n            continue;## 38 ##src/sctp/sctpserv_fork.c##\n        }## 39 ##src/sctp/sctpserv_fork.c##\n        connfd = sctp_peeloff(sock_fd, assoc);## 40 ##src/sctp/sctpserv_fork.c##\n        if (connfd == -1) {## 41 ##src/sctp/sctpserv_fork.c##\n            err_ret(\"sctp_peeloff fails\");## 42 ##src/sctp/sctpserv_fork.c##\n            continue;## 43 ##src/sctp/sctpserv_fork.c##\n        }## 44 ##src/sctp/sctpserv_fork.c##\n        if ((childpid = fork()) == 0) {## 45 ##src/sctp/sctpserv_fork.c##\n            Close(sock_fd);## 46 ##src/sctp/sctpserv_fork.c##\n            str_echo(connfd);## 47 ##src/sctp/sctpserv_fork.c##\n            exit(0);## 48 ##src/sctp/sctpserv_fork.c##\n        } else {## 49 ##src/sctp/sctpserv_fork.c##\n            Close(connfd);## 50 ##src/sctp/sctpserv_fork.c##\n        }## 51 ##src/sctp/sctpserv_fork.c##\n    }## 52 ##src/sctp/sctpserv_fork.c##\n    /* end mod_servfork */## 53 ##src/sctp/sctpserv_fork.c##\n}## 54 ##src/sctp/sctpserv_fork.c##\n"
  },
  {
    "path": "sctp/unp.h",
    "content": "/* include unph */\n/* Our own header.  Tabs are set for 4 spaces, not 8 */\n\n#ifndef\t__unp_h\n#define\t__unp_h\n\n#include\t\"../config.h\"\t/* configuration options for current OS */\n\t\t\t\t\t\t\t/* \"../config.h\" is generated by configure */\n\n/* If anything changes in the following list of #includes, must change\n   acsite.m4 also, for configure's tests. */\n\n#include\t<sys/types.h>\t/* basic system data types */\n#include\t<sys/socket.h>\t/* basic socket definitions */\n#include\t<sys/time.h>\t/* timeval{} for select() */\n#include\t<time.h>\t\t/* timespec{} for pselect() */\n#include\t<netinet/in.h>\t/* sockaddr_in{} and other Internet defns */\n#include\t<arpa/inet.h>\t/* inet(3) functions */\n#include\t<netinet/sctp.h> /* note if sctp does not exist we blow up :> */\n#include\t<errno.h>\n#include\t<fcntl.h>\t\t/* for nonblocking */\n#include\t<netdb.h>\n#include\t<signal.h>\n#include\t<stdio.h>\n#include\t<stdlib.h>\n#include\t<string.h>\n#include\t<sys/stat.h>\t/* for S_xxx file mode constants */\n#include\t<sys/uio.h>\t\t/* for iovec{} and readv/writev */\n#include\t<unistd.h>\n#include\t<sys/wait.h>\n#include\t<sys/un.h>\t\t/* for Unix domain sockets */\n\n#ifdef\tHAVE_SYS_SELECT_H\n# include\t<sys/select.h>\t/* for convenience */\n#endif\n\n#ifdef\tHAVE_POLL_H\n# include\t<poll.h>\t\t/* for convenience */\n#endif\n\n#ifdef\tHAVE_STRINGS_H\n# include\t<strings.h>\t\t/* for convenience */\n#endif\n\n/* Three headers are normally needed for socket/file ioctl's:\n * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.\n */\n#ifdef\tHAVE_SYS_IOCTL_H\n# include\t<sys/ioctl.h>\n#endif\n#ifdef\tHAVE_SYS_FILIO_H\n# include\t<sys/filio.h>\n#endif\n#ifdef\tHAVE_SYS_SOCKIO_H\n# include\t<sys/sockio.h>\n#endif\n\n#ifdef\tHAVE_PTHREAD_H\n# include\t<pthread.h>\n#endif\n\n/* OSF/1 actually disables recv() and send() in <sys/socket.h> */\n#ifdef\t__osf__\n#undef\trecv\n#undef\tsend\n#define\trecv(a,b,c,d)\trecvfrom(a,b,c,d,0,0)\n#define\tsend(a,b,c,d)\tsendto(a,b,c,d,0,0)\n#endif\n\n#ifndef\tINADDR_NONE\n/* $$.Ic INADDR_NONE$$ */\n#define\tINADDR_NONE\t0xffffffff\t/* should have been in <netinet/in.h> */\n#endif\n\n#ifndef\tSHUT_RD\t\t\t\t/* these three Posix.1g names are quite new */\n#define\tSHUT_RD\t\t0\t/* shutdown for reading */\n#define\tSHUT_WR\t\t1\t/* shutdown for writing */\n#define\tSHUT_RDWR\t2\t/* shutdown for reading and writing */\n/* $$.Ic SHUT_RD$$ */\n/* $$.Ic SHUT_WR$$ */\n/* $$.Ic SHUT_RDWR$$ */\n#endif\n\n/* *INDENT-OFF* */\n#ifndef INET_ADDRSTRLEN\n/* $$.Ic INET_ADDRSTRLEN$$ */\n#define\tINET_ADDRSTRLEN\t\t16\t/* \"ddd.ddd.ddd.ddd\\0\"\n\t\t\t\t\t\t\t\t    1234567890123456 */\n#endif\n\n/* Define following even if IPv6 not supported, so we can always allocate\n   an adequately-sized buffer, without #ifdefs in the code. */\n#ifndef INET6_ADDRSTRLEN\n/* $$.Ic INET6_ADDRSTRLEN$$ */\n#define\tINET6_ADDRSTRLEN\t46\t/* max size of IPv6 address string:\n\t\t\t\t   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx\" or\n\t\t\t\t   \"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\\0\"\n\t\t\t\t    1234567890123456789012345678901234567890123456 */\n#endif\n/* *INDENT-ON* */\n\n/* Define bzero() as a macro if it's not in standard C library. */\n#ifndef\tHAVE_BZERO\n#define\tbzero(ptr,n)\t\tmemset(ptr, 0, n)\n/* $$.If bzero$$ */\n/* $$.If memset$$ */\n#endif\n\n/* Older resolvers do not have gethostbyname2() */\n#ifndef\tHAVE_GETHOSTBYNAME2\n#define\tgethostbyname2(host,family)\t\tgethostbyname((host))\n#endif\n\n/* The structure returned by recvfrom_flags() */\nstruct in_pktinfo {\n  struct in_addr\tipi_addr;\t/* dst IPv4 address */\n  int\t\t\t\tipi_ifindex;/* received interface index */\n};\n/* $$.It in_pktinfo$$ */\n/* $$.Ib ipi_addr$$ */\n/* $$.Ib ipi_ifindex$$ */\n\n/* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few\n   implementations support them today.  These two macros really need\n    an ALIGN() macro, but each implementation does this differently. */\n#ifndef\tCMSG_LEN\n/* $$.Ic CMSG_LEN$$ */\n#define\tCMSG_LEN(size)\t\t(sizeof(struct cmsghdr) + (size))\n#endif\n#ifndef\tCMSG_SPACE\n/* $$.Ic CMSG_SPACE$$ */\n#define\tCMSG_SPACE(size)\t(sizeof(struct cmsghdr) + (size))\n#endif\n\n/* Posix.1g requires the SUN_LEN() macro but not all implementations DefinE\n   it (yet).  Note that this 4.4BSD macro works regardless whether there is\n   a length field or not. */\n#ifndef\tSUN_LEN\n/* $$.Im SUN_LEN$$ */\n# define\tSUN_LEN(su) \\\n\t(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))\n#endif\n\n/* Posix.1g renames \"Unix domain\" as \"local IPC\".\n   But not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */\n#ifndef\tAF_LOCAL\n#define AF_LOCAL\tAF_UNIX\n#endif\n#ifndef\tPF_LOCAL\n#define PF_LOCAL\tPF_UNIX\n#endif\n\n/* Posix.1g requires that an #include of <poll.h> DefinE INFTIM, but many\n   systems still DefinE it in <sys/stropts.h>.  We don't want to include\n   all the streams stuff if it's not needed, so we just DefinE INFTIM here.\n   This is the standard value, but there's no guarantee it is -1. */\n#ifndef INFTIM\n#define INFTIM          (-1)    /* infinite poll timeout */\n/* $$.Ic INFTIM$$ */\n#ifdef\tHAVE_POLL_H\n#define\tINFTIM_UNPH\t\t\t\t/* tell unpxti.h we defined it */\n#endif\n#endif\n\n/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many\n   kernels still #define it as 5, while actually supporting many more */\n#define\tLISTENQ\t\t1024\t/* 2nd argument to listen() */\n\n/* Miscellaneous constants */\n#define\tMAXLINE\t\t4096\t/* max text line length */\n#define\tMAXSOCKADDR  128\t/* max socket address structure size */\n#define\tBUFFSIZE\t8192\t/* buffer size for reads and writes */\n\n/* Define some port number that can be used for client-servers */\n#define\tSERV_PORT\t\t 9877\t\t\t/* TCP and UDP client-servers */\n#define\tSERV_PORT_STR\t\"9877\"\t\t\t/* TCP and UDP client-servers */\n/* Some things for SCTP */\n#define SCTP_PDAPI_INCR_SZ 65535\t/* increment size for pdapi when adding buf space */\n#define SCTP_PDAPI_NEED_MORE_THRESHOLD 1024\t/* need more space threshold */\n#define SERV_MAX_SCTP_STRM\t10\t/* normal maximum streams */\n#define SERV_MORE_STRMS_SCTP\t20\t/* larger number of streams */\n\n\n#define\tUNIXSTR_PATH\t\"/tmp/unix.str\"\t/* Unix domain stream cli-serv */\n#define\tUNIXDG_PATH\t\t\"/tmp/unix.dg\"\t/* Unix domain datagram cli-serv */\n/* $$.ix [LISTENQ]~constant,~definition~of$$ */\n/* $$.ix [MAXLINE]~constant,~definition~of$$ */\n/* $$.ix [MAXSOCKADDR]~constant,~definition~of$$ */\n/* $$.ix [BUFFSIZE]~constant,~definition~of$$ */\n/* $$.ix [SERV_PORT]~constant,~definition~of$$ */\n/* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */\n/* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */\n\n/* Following shortens all the type casts of pointer arguments */\n#define\tSA\tstruct sockaddr\n\n#define\tFILE_MODE\t(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)\n\t\t\t\t\t/* default file access permissions for new files */\n#define\tDIR_MODE\t(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)\n\t\t\t\t\t/* default permissions for new directories */\n\ntypedef\tvoid\tSigfunc(int);\t/* for signal handlers */\n\n#define\tmin(a,b)\t((a) < (b) ? (a) : (b))\n#define\tmax(a,b)\t((a) > (b) ? (a) : (b))\n\n#ifndef\tHAVE_ADDRINFO_STRUCT\n# include\t\"../lib/addrinfo.h\"\n#endif\n\n#ifndef\tHAVE_IF_NAMEINDEX_STRUCT\nstruct if_nameindex {\n  unsigned int   if_index;  /* 1, 2, ... */\n  char          *if_name;   /* null terminated name: \"le0\", ... */\n};\n/* $$.It if_nameindex$$ */\n/* $$.Ib if_index$$ */\n/* $$.Ib if_name$$ */\n#endif\n\n#ifndef\tHAVE_TIMESPEC_STRUCT\nstruct timespec {\n  time_t\ttv_sec;\t\t/* seconds */\n  long\t\ttv_nsec;\t/* and nanoseconds */\n};\n/* $$.It timespec$$ */\n/* $$.Ib tv_sec$$ */\n/* $$.Ib tv_nsec$$ */\n#endif\n/* end unph */\n\n\t\t\t/* prototypes for our own library functions */\nint\t\t connect_nonb(int, const SA *, socklen_t, int);\nint\t\t connect_timeo(int, const SA *, socklen_t, int);\nvoid\t daemon_init(const char *, int);\nvoid\t daemon_inetd(const char *, int);\nvoid\t dg_cli(FILE *, int, const SA *, socklen_t);\nvoid\t dg_echo(int, SA *, socklen_t);\nchar\t*gf_time(void);\nvoid\t heartbeat_cli(int, int, int);\nvoid\t heartbeat_serv(int, int, int);\nstruct addrinfo *host_serv(const char *, const char *, int, int);\nint\t\t inet_srcrt_add(char *, int);\nu_char  *inet_srcrt_init(void);\nvoid\t inet_srcrt_print(u_char *, int);\nchar   **my_addrs(int *);\nint\t\t readable_timeo(int, int);\nssize_t\t readline(int, void *, size_t);\nssize_t\t readn(int, void *, size_t);\nssize_t\t read_fd(int, void *, size_t, int *);\nssize_t\t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,\n\t\t struct in_pktinfo *);\nSigfunc *signal_intr(int, Sigfunc *);\nint\t\t sock_bind_wild(int, int);\nint\t\t sock_cmp_addr(const SA *, const SA *, socklen_t);\nint\t\t sock_cmp_port(const SA *, const SA *, socklen_t);\nint\t\t sock_get_port(const SA *, socklen_t);\nvoid\t sock_set_addr(SA *, socklen_t, const void *);\nvoid\t sock_set_port(SA *, socklen_t, int);\nvoid\t sock_set_wild(SA *, socklen_t);\nchar\t*sock_ntop(const SA *, socklen_t);\nchar\t*sock_ntop_host(const SA *, socklen_t);\nint\t\t sockfd_to_family(int);\nvoid\t str_echo(int);\nvoid\t str_cli(FILE *, int);\nvoid     sctpstr_cli(FILE *fp, int sock_fd, struct sockaddr *to, socklen_t tolen);\nvoid\t sctpstr_cli_echoall(FILE *fp, int sock_fd, struct sockaddr *to, \n\t\t\t     socklen_t tolen);\nuint8_t *sctp_pdapi_recvmsg(int sock_fd, int *rdlen, SA *from, int *from_len,\n\t\t\t    struct sctp_sndrcvinfo *sri, int *msg_flags);\nint      sctp_bind_arg_list(int sock_fd, char **argv, int argc);\n\nvoid sctp_print_addresses(struct sockaddr_storage *addrs, int num);\n\nvoid sctp_check_notification(int sock_fd,char *recvlin);\n\n#define SCTP_ON_DEMAND_HB    1\n#define SCTP_SET_HB_INTERVAL 2\n#define SCTP_DISABLE_HB      3\nint sctp_heartbeat_action(int sock_fd, struct sockaddr *sa, \n\t\t\t  int action, u_int value);\n\nsctp_assoc_t\nsctp_address_to_associd(int sock_fd, struct sockaddr *sa, socklen_t);\n\n\nvoid\nsctp_print_notification(char *notify_buf);\n\nint\t\t tcp_connect(const char *, const char *);\nint\t\t tcp_listen(const char *, const char *, socklen_t *);\nvoid\t tv_sub(struct timeval *, struct timeval *);\nint\t\t udp_client(const char *, const char *, void **, socklen_t *);\nint\t\t udp_connect(const char *, const char *);\nint\t\t udp_server(const char *, const char *, socklen_t *);\nint\t\t writable_timeo(int, int);\nssize_t\t writen(int, const void *, size_t);\nssize_t\t write_fd(int, void *, size_t, int);\n\n#ifdef\tMCAST\nint\t\t mcast_leave(int, const SA *, socklen_t);\nint\t\t mcast_join(int, const SA *, socklen_t, const char *, u_int);\nint\t\t mcast_get_if(int);\nint\t\t mcast_get_loop(int);\nint\t\t mcast_get_ttl(int);\nint\t\t mcast_set_if(int, const char *, u_int);\nint\t\t mcast_set_loop(int, int);\nint\t\t mcast_set_ttl(int, int);\n\nvoid\t Mcast_leave(int, const SA *, socklen_t);\nvoid\t Mcast_join(int, const SA *, socklen_t, const char *, u_int);\nint\t\t Mcast_get_if(int);\nint\t\t Mcast_get_loop(int);\nint\t\t Mcast_get_ttl(int);\nvoid\t Mcast_set_if(int, const char *, u_int);\nvoid\t Mcast_set_loop(int, int);\nvoid\t Mcast_set_ttl(int, int);\n#endif\n\nunsigned short\tin_cksum(unsigned short *, int);\n\n#ifndef\tHAVE_GETADDRINFO_PROTO\nint\t\t getaddrinfo(const char *, const char *, const struct addrinfo *,\n\t\t\t\t\t struct addrinfo **);\nvoid\t freeaddrinfo(struct addrinfo *);\nchar\t*gai_strerror(int);\n#endif\n\n#ifndef\tHAVE_GETNAMEINFO_PROTO\nint\t\t getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);\n#endif\n\n#ifndef\tHAVE_GETHOSTNAME_PROTO\nint\t\t gethostname(char *, int);\n#endif\n\n#ifndef\tHAVE_HSTRERROR_PROTO\nconst char\t*hstrerror(int);\n#endif\n\n#ifndef\tHAVE_IF_NAMETOINDEX_PROTO\nunsigned int\t if_nametoindex(const char *);\nchar\t\t\t*if_indextoname(unsigned int, char *);\nvoid\t\t\t if_freenameindex(struct if_nameindex *);\nstruct if_nameindex *if_nameindex(void);\n#endif\n\n#ifndef\tHAVE_INET_PTON_PROTO\nint\t\t\t inet_pton(int, const char *, void *);\nconst char\t*inet_ntop(int, const void *, char *, size_t);\n#endif\n\n#ifndef\tHAVE_INET_ATON_PROTO\nint\t\t inet_aton(const char *, struct in_addr *);\n#endif\n\n#ifndef\tHAVE_ISFDTYPE_PROTO\nint\t\t isfdtype(int, int);\n#endif\n\n#ifndef\tHAVE_PSELECT_PROTO\nint\t\t pselect(int, fd_set *, fd_set *, fd_set *,\n\t\t\t\t const struct timespec *, const sigset_t *);\n#endif\n\n#ifndef\tHAVE_SOCKATMARK_PROTO\nint\t\t sockatmark(int);\n#endif\n\n#ifndef\tHAVE_SNPRINTF_PROTO\nint\t\t snprintf(char *, size_t, const char *, ...);\n#endif\n\n\t\t\t/* prototypes for our own library wrapper functions */\nvoid\t Connect_timeo(int, const SA *, socklen_t, int);\nstruct addrinfo *Host_serv(const char *, const char *, int, int);\nconst char\t\t*Inet_ntop(int, const void *, char *, size_t);\nvoid\t\t\t Inet_pton(int, const char *, void *);\nchar\t\t\t*If_indextoname(unsigned int, char *);\nunsigned int\t\t If_nametoindex(const char *);\nstruct if_nameindex\t*If_nameindex(void);\nchar   **My_addrs(int *);\nssize_t\t Read_fd(int, void *, size_t, int *);\nint\t\t Readable_timeo(int, int);\nssize_t\t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,\n\t\t struct in_pktinfo *);\nSigfunc *Signal(int, Sigfunc *);\nSigfunc *Signal_intr(int, Sigfunc *);\nint\t\t Sock_bind_wild(int, int);\nchar\t*Sock_ntop(const SA *, socklen_t);\nchar\t*Sock_ntop_host(const SA *, socklen_t);\nint\t\t Sockfd_to_family(int);\nint\t\t Tcp_connect(const char *, const char *);\nint\t\t Tcp_listen(const char *, const char *, socklen_t *);\nint\t\t Udp_client(const char *, const char *, void **, socklen_t *);\nint\t\t Udp_connect(const char *, const char *);\nint\t\t Udp_server(const char *, const char *, socklen_t *);\nssize_t\t Write_fd(int, void *, size_t, int);\nint\t\t Writable_timeo(int, int);\n\n\t\t\t/* prototypes for our Unix wrapper functions: see {Sec errors} */\nvoid\t*Calloc(size_t, size_t);\nvoid\t Close(int);\nvoid\t Dup2(int, int);\nint\t\t Fcntl(int, int, int);\nvoid\t Gettimeofday(struct timeval *, void *);\nint\t\t Ioctl(int, int, void *);\npid_t\t Fork(void);\nvoid\t*Malloc(size_t);\nvoid\t Mktemp(char *);\nvoid\t*Mmap(void *, size_t, int, int, int, off_t);\nint\t\t Open(const char *, int, mode_t);\nvoid\t Pipe(int *fds);\nssize_t\t Read(int, void *, size_t);\nvoid\t Sigaddset(sigset_t *, int);\nvoid\t Sigdelset(sigset_t *, int);\nvoid\t Sigemptyset(sigset_t *);\nvoid\t Sigfillset(sigset_t *);\nint\t\t Sigismember(const sigset_t *, int);\nvoid\t Sigpending(sigset_t *);\nvoid\t Sigprocmask(int, const sigset_t *, sigset_t *);\nchar\t*Strdup(const char *);\nlong\t Sysconf(int);\nvoid\t Sysctl(int *, u_int, void *, size_t *, void *, size_t);\nvoid\t Unlink(const char *);\npid_t\t Wait(int *);\npid_t\t Waitpid(pid_t, int *, int);\nvoid\t Write(int, void *, size_t);\n\n\t\t\t/* prototypes for our stdio wrapper functions: see {Sec errors} */\nvoid\t Fclose(FILE *);\nFILE\t*Fdopen(int, const char *);\nchar\t*Fgets(char *, int, FILE *);\nFILE\t*Fopen(const char *, const char *);\nvoid\t Fputs(const char *, FILE *);\n\n\t\t\t/* prototypes for our socket wrapper functions: see {Sec errors} */\nint\t\t Accept(int, SA *, socklen_t *);\nvoid\t Bind(int, const SA *, socklen_t);\nvoid\t Connect(int, const SA *, socklen_t);\nvoid\t Getpeername(int, SA *, socklen_t *);\nvoid\t Getsockname(int, SA *, socklen_t *);\nvoid\t Getsockopt(int, int, int, void *, socklen_t *);\nint\t\t Isfdtype(int, int);\nvoid\t Listen(int, int);\n#ifdef\tHAVE_POLL\nint\t\t Poll(struct pollfd *, unsigned long, int);\n#endif\nssize_t\t Readline(int, void *, size_t);\nssize_t\t Readn(int, void *, size_t);\nssize_t\t Recv(int, void *, size_t, int);\nssize_t\t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);\nssize_t\t Recvmsg(int, struct msghdr *, int);\nint\t\t Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);\nvoid\t Send(int, const void *, size_t, int);\nvoid\t Sendto(int, const void *, size_t, int, const SA *, socklen_t);\nvoid\t Sendmsg(int, const struct msghdr *, int);\nvoid\t Setsockopt(int, int, int, const void *, socklen_t);\nvoid\t Shutdown(int, int);\nint\t\t Sockatmark(int);\nint\t\t Socket(int, int, int);\nvoid\t Socketpair(int, int, int, int *);\nvoid\t Writen(int, void *, size_t);\n\nvoid\t err_dump(const char *, ...);\nvoid\t err_msg(const char *, ...);\nvoid\t err_quit(const char *, ...);\nvoid\t err_ret(const char *, ...);\nvoid\t err_sys(const char *, ...);\n\n#endif\t/* __unp_h */\n"
  },
  {
    "path": "select/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\ttcpcli01 tcpcli02 tcpcli03\n\nall:\t${PROGS}\n\ntcpcli01:\ttcpcli01.o strcliselect01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli01.o strcliselect01.o ${LIBS}\n\ntcpcli02:\ttcpcli02.o strcliselect02.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli02.o strcliselect02.o ${LIBS}\n\ntcpcli03:\ttcpcli03.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli03.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "select/strcliselect01.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\t\tmaxfdp1;\n\tfd_set\t\trset;\n\tchar\t\tsendline[MAXLINE], recvline[MAXLINE];\n\n\tFD_ZERO(&rset);\n\tfor ( ; ; ) {\n\t\tFD_SET(fileno(fp), &rset);\n\t\tFD_SET(sockfd, &rset);\n\t\tmaxfdp1 = max(fileno(fp), sockfd) + 1;\n\t\tSelect(maxfdp1, &rset, NULL, NULL, NULL);\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* socket is readable */\n\t\t\tif (Readline(sockfd, recvline, MAXLINE) == 0)\n\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\t\t\tFputs(recvline, stdout);\n\t\t}\n\n\t\tif (FD_ISSET(fileno(fp), &rset)) {  /* input is readable */\n\t\t\tif (Fgets(sendline, MAXLINE, fp) == NULL)\n\t\t\t\treturn;\t\t/* all done */\n\t\t\tWriten(sockfd, sendline, strlen(sendline));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "select/strcliselect02.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tint\t\t\tmaxfdp1, stdineof;\n\tfd_set\t\trset;\n\tchar\t\tbuf[MAXLINE];\n\tint\t\tn;\n\n\tstdineof = 0;\n\tFD_ZERO(&rset);\n\tfor ( ; ; ) {\n\t\tif (stdineof == 0)\n\t\t\tFD_SET(fileno(fp), &rset);\n\t\tFD_SET(sockfd, &rset);\n\t\tmaxfdp1 = max(fileno(fp), sockfd) + 1;\n\t\tSelect(maxfdp1, &rset, NULL, NULL, NULL);\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* socket is readable */\n\t\t\tif ( (n = Read(sockfd, buf, MAXLINE)) == 0) {\n\t\t\t\tif (stdineof == 1)\n\t\t\t\t\treturn;\t\t/* normal termination */\n\t\t\t\telse\n\t\t\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\t\t\t}\n\n\t\t\tWrite(fileno(stdout), buf, n);\n\t\t}\n\n\t\tif (FD_ISSET(fileno(fp), &rset)) {  /* input is readable */\n\t\t\tif ( (n = Read(fileno(fp), buf, MAXLINE)) == 0) {\n\t\t\t\tstdineof = 1;\n\t\t\t\tShutdown(sockfd, SHUT_WR);\t/* send FIN */\n\t\t\t\tFD_CLR(fileno(fp), &rset);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tWriten(sockfd, buf, n);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "select/strcliselect02.lc",
    "content": "#include    \"unp.h\"##  1 ##src/select/strcliselect02.c##\n\nvoid##  2 ##src/select/strcliselect02.c##\nstr_cli(FILE *fp, int sockfd)##  3 ##src/select/strcliselect02.c##\n{##  4 ##src/select/strcliselect02.c##\n    int     maxfdp1, stdineof;##  5 ##src/select/strcliselect02.c##\n    fd_set  rset;##  6 ##src/select/strcliselect02.c##\n    char    sendline[MAXLINE], recvline[MAXLINE];##  7 ##src/select/strcliselect02.c##\n\n    stdineof = 0;##  8 ##src/select/strcliselect02.c##\n    FD_ZERO(&rset);##  9 ##src/select/strcliselect02.c##\n    for (;;) {## 10 ##src/select/strcliselect02.c##\n        if (stdineof == 0)## 11 ##src/select/strcliselect02.c##\n            FD_SET(fileno(fp), &rset);## 12 ##src/select/strcliselect02.c##\n        FD_SET(sockfd, &rset);## 13 ##src/select/strcliselect02.c##\n        maxfdp1 = max(fileno(fp), sockfd) + 1;## 14 ##src/select/strcliselect02.c##\n        Select(maxfdp1, &rset, NULL, NULL, NULL);## 15 ##src/select/strcliselect02.c##\n\n        if (FD_ISSET(sockfd, &rset)) {  /* socket is readable */## 16 ##src/select/strcliselect02.c##\n            if (Readline(sockfd, recvline, MAXLINE) == 0) {## 17 ##src/select/strcliselect02.c##\n                if (stdineof == 1)## 18 ##src/select/strcliselect02.c##\n                    return;     /* normal termination */## 19 ##src/select/strcliselect02.c##\n                else## 20 ##src/select/strcliselect02.c##\n                    err_quit(\"str_cli: server terminated prematurely\");## 21 ##src/select/strcliselect02.c##\n            }## 22 ##src/select/strcliselect02.c##\n\n            Fputs(recvline, stdout);## 23 ##src/select/strcliselect02.c##\n        }## 24 ##src/select/strcliselect02.c##\n\n        if (FD_ISSET(fileno(fp), &rset)) {  /* input is readable */## 25 ##src/select/strcliselect02.c##\n            if (Fgets(sendline, MAXLINE, fp) == NULL) {## 26 ##src/select/strcliselect02.c##\n                stdineof = 1;## 27 ##src/select/strcliselect02.c##\n                Shutdown(sockfd, SHUT_WR);  /* send FIN */## 28 ##src/select/strcliselect02.c##\n                FD_CLR(fileno(fp), &rset);## 29 ##src/select/strcliselect02.c##\n                continue;## 30 ##src/select/strcliselect02.c##\n            }## 31 ##src/select/strcliselect02.c##\n\n            Writen(sockfd, sendline, strlen(sendline));## 32 ##src/select/strcliselect02.c##\n        }## 33 ##src/select/strcliselect02.c##\n    }## 34 ##src/select/strcliselect02.c##\n}## 35 ##src/select/strcliselect02.c##\n"
  },
  {
    "path": "select/tcpcli01.c",
    "content": "/* Use standard echo server; baseline measurements for nonblocking version */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "select/tcpcli02.c",
    "content": "/* Use standard echo server; baseline measurements for nonblocking version */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "select/tcpcli03.c",
    "content": "/* Test shutdown(fd,SHUT_RD) and see what happens */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli03 <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(19);\t\t/* chargen server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tshutdown(sockfd, SHUT_RD);\n\n\tpause();\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tclient clientrst \\\n\t\tserv01 serv02 serv03 serv04 serv05 serv06 serv07 serv08\n\nall:\t${PROGS}\n\n# The client to test the various servers.\nclient:\tclient.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ client.o pr_cpu_time.o ${LIBS}\n\n# A special client that sends an RST occasionally.\n# Used to test the XTI server (should receive disconnect).\nclientrst:\tclientrst.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ clientrst.o pr_cpu_time.o ${LIBS}\n\n# serv00: traditional concurrent server: use as base level\nserv00:\tserv00.o web_child.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ serv00.o web_child.o pr_cpu_time.o ${LIBS}\n\n# serv01: one fork per client (traditional concurrent server).\nserv01:\tserv01.o web_child.o sig_chld_waitpid.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ serv01.o web_child.o sig_chld_waitpid.o \\\n\t\t\tpr_cpu_time.o ${LIBS}\n\n# serv02: prefork, no locking; works on BSD-derived systems\n#\tbut not on SVR4-derived systems.\nserv02:\tserv02.o child02.o web_child.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ serv02.o child02.o web_child.o pr_cpu_time.o ${LIBS}\n\n# serv02l: prefork, no locking, block in select instead of accept to see\n#\tselect collisions; works on BSD-derived systems but not on SVR4.\nserv02l:serv02.o child02l.o web_child.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o serv02l serv02.o child02l.o web_child.o \\\n\t\t\tpr_cpu_time.o ${LIBS}\n\n# serv02m: prefork, no locking; works on BSD-derived systems.\n#\tThis version is \"metered\" to see #clients/child serviced.\nserv02m:serv02m.o child02m.o web_child.o pr_cpu_time.o meter.o\n\t\t${CC} ${CFLAGS} -o serv02m serv02m.o child02m.o web_child.o \\\n\t\t\tpr_cpu_time.o meter.o ${LIBS}\n\n# serv03: prefork, file locking using fcntl().  Similar to Apache server.\nserv03:\tserv03.o child03.o lock_fcntl.o web_child.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ serv03.o child03.o lock_fcntl.o web_child.o \\\n\t\t\tpr_cpu_time.o ${LIBS}\n\n# serv03m: prefork, file locking using fcntl(), metered.\nserv03m:\tserv03m.o child03m.o lock_fcntl.o web_child.o pr_cpu_time.o meter.o\n\t\t${CC} ${CFLAGS} -o $@ serv03m.o child03m.o lock_fcntl.o web_child.o \\\n\t\t\tpr_cpu_time.o meter.o ${LIBS}\n\n# serv04: prefork, file locking using pthread locking.\nserv04:\tserv04.o child04.o lock_pthread.o web_child.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ serv04.o child04.o lock_pthread.o \\\n\t\t\tweb_child.o pr_cpu_time.o ${LIBS}\n\n# serv05: prefork, descrptor passing to children.  Similar to NSCA server.\nserv05:\tserv05.o child05.o lock_fcntl.o web_child.o pr_cpu_time.o\n\t\t${CC} ${CFLAGS} -o $@ serv05.o child05.o lock_fcntl.o web_child.o \\\n\t\t\tpr_cpu_time.o ${LIBS}\n\n# Thread versions must call a reentrant version of readline().\n# serv06: one thread per client.\nserv06:\tserv06.o web_child.o pr_cpu_time.o readline.o\n\t\t${CC} ${CFLAGS} -o $@ serv06.o web_child.o pr_cpu_time.o \\\n\t\t\treadline.o ${LIBS}\n\n# serv07: prethread with mutex locking around accept().\nserv07:\tserv07.o pthread07.o web_child.o pr_cpu_time.o readline.o\n\t\t${CC} ${CFLAGS} -o $@ serv07.o pthread07.o web_child.o pr_cpu_time.o \\\n\t\t\treadline.o ${LIBS}\n\n# serv08: prethread with only main thread doing accept().\nserv08:\tserv08.o pthread08.o web_child.o pr_cpu_time.o readline.o\n\t\t${CC} ${CFLAGS} -o $@ serv08.o pthread08.o web_child.o pr_cpu_time.o \\\n\t\t\treadline.o ${LIBS}\n\n# serv09: prethread with no locking around accept().\nserv09:\tserv09.o pthread09.o web_child.o pr_cpu_time.o readline.o\n\t\t${CC} ${CFLAGS} -o $@ serv09.o pthread09.o web_child.o pr_cpu_time.o \\\n\t\t\treadline.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "server/child.h",
    "content": "typedef struct {\n  pid_t\t\tchild_pid;\t\t/* process ID */\n  int\t\tchild_pipefd;\t/* parent's stream pipe to/from child */\n  int\t\tchild_status;\t/* 0 = ready */\n  long\t\tchild_count;\t/* # connections handled */\n} Child;\n\nChild\t*cptr;\t\t/* array of Child structures; calloc'ed */\n"
  },
  {
    "path": "server/child.lh",
    "content": "typedef struct {##  1 ##src/server/child.h##\n    pid_t   child_pid;          /* process ID */##  2 ##src/server/child.h##\n    int     child_pipefd;       /* parent's stream pipe to/from child */##  3 ##src/server/child.h##\n    int     child_status;       /* 0 = ready */##  4 ##src/server/child.h##\n    long    child_count;        /* #connections handled */##  5 ##src/server/child.h##\n} Child;##  6 ##src/server/child.h##\n\nChild  *cptr;                   /* array of Child structures; calloc'ed */##  7 ##src/server/child.h##\n"
  },
  {
    "path": "server/child02.c",
    "content": "/* include child_make */\n#include\t\"unp.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tif ( (pid = Fork()) > 0)\n\t\treturn(pid);\t\t/* parent */\n\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n/* end child_make */\n\n/* include child_main */\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n/* end child_main */\n"
  },
  {
    "path": "server/child02.lc",
    "content": "/* include child_make */\n#include    \"unp.h\"##  1 ##src/server/child02.c##\n\npid_t##  2 ##src/server/child02.c##\nchild_make(int i, int listenfd, int addrlen)##  3 ##src/server/child02.c##\n{##  4 ##src/server/child02.c##\n    pid_t   pid;##  5 ##src/server/child02.c##\n    void    child_main(int, int, int);##  6 ##src/server/child02.c##\n\n    if ((pid = Fork()) > 0)##  7 ##src/server/child02.c##\n        return (pid);           /* parent */##  8 ##src/server/child02.c##\n\n    child_main(i, listenfd, addrlen);   /* never returns */##  9 ##src/server/child02.c##\n}## 10 ##src/server/child02.c##\n/* end child_make */\n\n/* include child_main */\nvoid## 11 ##src/server/child02.c##\nchild_main(int i, int listenfd, int addrlen)## 12 ##src/server/child02.c##\n{## 13 ##src/server/child02.c##\n    int     connfd;## 14 ##src/server/child02.c##\n    void    web_child(int);## 15 ##src/server/child02.c##\n    socklen_t clilen;## 16 ##src/server/child02.c##\n    struct sockaddr *cliaddr;## 17 ##src/server/child02.c##\n\n    cliaddr = Malloc(addrlen);## 18 ##src/server/child02.c##\n\n    printf(\"child %ld starting\\n\", (long) getpid());## 19 ##src/server/child02.c##\n    for (;;) {## 20 ##src/server/child02.c##\n        clilen = addrlen;## 21 ##src/server/child02.c##\n        connfd = Accept(listenfd, cliaddr, &clilen);## 22 ##src/server/child02.c##\n\n        web_child(connfd);      /* process the request */## 23 ##src/server/child02.c##\n        Close(connfd);## 24 ##src/server/child02.c##\n    }## 25 ##src/server/child02.c##\n}## 26 ##src/server/child02.c##\n/* end child_main */\n"
  },
  {
    "path": "server/child02l.c",
    "content": "#include\t\"unp.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tif ( (pid = Fork()) > 0)\n\t\treturn(pid);\t\t/* parent */\n\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tfd_set\t\t\trset;\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tFD_ZERO(&rset);\n\tfor ( ; ; ) {\n\t\tFD_SET(listenfd, &rset);\n\t\tSelect(listenfd+1, &rset, NULL, NULL, NULL);\n\t\tif (FD_ISSET(listenfd, &rset) == 0)\n\t\t\terr_quit(\"listenfd readable\");\n\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/child02m.c",
    "content": "#include\t\"unp.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tif ( (pid = Fork()) > 0)\n\t\treturn(pid);\t\t/* parent */\n\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\textern long\t\t*cptr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\t\tcptr[i]++;\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/child03.c",
    "content": "#include\t\"unp.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tif ( (pid = Fork()) > 0)\n\t\treturn(pid);\t\t/* parent */\n\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tmy_lock_wait();\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\t\tmy_lock_release();\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/child03m.c",
    "content": "#include\t\"unp.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tif ( (pid = Fork()) > 0)\n\t\treturn(pid);\t\t/* parent */\n\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\textern long\t\t*cptr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tmy_lock_wait();\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\t\tmy_lock_release();\n\t\tcptr[i]++;\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/child04.c",
    "content": "#include\t\"unp.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tif ( (pid = Fork()) > 0)\n\t\treturn(pid);\t\t/* parent */\n\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tmy_lock_wait();\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\t\tmy_lock_release();\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/child05.c",
    "content": "/* include child_make */\n#include\t\"unp.h\"\n#include\t\"child.h\"\n\npid_t\nchild_make(int i, int listenfd, int addrlen)\n{\n\tint\t\tsockfd[2];\n\tpid_t\tpid;\n\tvoid\tchild_main(int, int, int);\n\n\tSocketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);\n\n\tif ( (pid = Fork()) > 0) {\n\t\tClose(sockfd[1]);\n\t\tcptr[i].child_pid = pid;\n\t\tcptr[i].child_pipefd = sockfd[0];\n\t\tcptr[i].child_status = 0;\n\t\treturn(pid);\t\t/* parent */\n\t}\n\n\tDup2(sockfd[1], STDERR_FILENO);\t\t/* child's stream pipe to parent */\n\tClose(sockfd[0]);\n\tClose(sockfd[1]);\n\tClose(listenfd);\t\t\t\t\t/* child does not need this open */\n\tchild_main(i, listenfd, addrlen);\t/* never returns */\n}\n/* end child_make */\n\n/* include child_main */\nvoid\nchild_main(int i, int listenfd, int addrlen)\n{\n\tchar\t\t\tc;\n\tint\t\t\t\tconnfd;\n\tssize_t\t\t\tn;\n\tvoid\t\t\tweb_child(int);\n\n\tprintf(\"child %ld starting\\n\", (long) getpid());\n\tfor ( ; ; ) {\n\t\tif ( (n = Read_fd(STDERR_FILENO, &c, 1, &connfd)) == 0)\n\t\t\terr_quit(\"read_fd returned 0\");\n\t\tif (connfd < 0)\n\t\t\terr_quit(\"no descriptor from read_fd\");\n\n\t\tweb_child(connfd);\t\t\t\t/* process request */\n\t\tClose(connfd);\n\n\t\tWrite(STDERR_FILENO, \"\", 1);\t/* tell parent we're ready again */\n\t}\n}\n/* end child_main */\n"
  },
  {
    "path": "server/child05.lc",
    "content": "/* include child_make */\n#include    \"unp.h\"##  1 ##src/server/child05.c##\n#include    \"child.h\"##  2 ##src/server/child05.c##\n\npid_t##  3 ##src/server/child05.c##\nchild_make(int i, int listenfd, int addrlen)##  4 ##src/server/child05.c##\n{##  5 ##src/server/child05.c##\n    int     sockfd[2];##  6 ##src/server/child05.c##\n    pid_t   pid;##  7 ##src/server/child05.c##\n    void    child_main(int, int, int);##  8 ##src/server/child05.c##\n\n    Socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);##  9 ##src/server/child05.c##\n\n    if ((pid = Fork()) > 0) {## 10 ##src/server/child05.c##\n        Close(sockfd[1]);## 11 ##src/server/child05.c##\n        cptr[i].child_pid = pid;## 12 ##src/server/child05.c##\n        cptr[i].child_pipefd = sockfd[0];## 13 ##src/server/child05.c##\n        cptr[i].child_status = 0;## 14 ##src/server/child05.c##\n        return (pid);           /* parent */## 15 ##src/server/child05.c##\n    }## 16 ##src/server/child05.c##\n\n    Dup2(sockfd[1], STDERR_FILENO); /* child's stream pipe to parent */## 17 ##src/server/child05.c##\n    Close(sockfd[0]);## 18 ##src/server/child05.c##\n    Close(sockfd[1]);## 19 ##src/server/child05.c##\n    Close(listenfd);            /* child does not need this open */## 20 ##src/server/child05.c##\n    child_main(i, listenfd, addrlen);   /* never returns */## 21 ##src/server/child05.c##\n}## 22 ##src/server/child05.c##\n/* end child_make */\n\n/* include child_main */\nvoid## 23 ##src/server/child05.c##\nchild_main(int i, int listenfd, int addrlen)## 24 ##src/server/child05.c##\n{## 25 ##src/server/child05.c##\n    char    c;## 26 ##src/server/child05.c##\n    int     connfd;## 27 ##src/server/child05.c##\n    ssize_t n;## 28 ##src/server/child05.c##\n    void    web_child(int);## 29 ##src/server/child05.c##\n\n    printf(\"child %ld starting\\n\", (long) getpid());## 30 ##src/server/child05.c##\n    for (;;) {## 31 ##src/server/child05.c##\n        if ((n = Read_fd(STDERR_FILENO, &c, 1, &connfd)) == 0)## 32 ##src/server/child05.c##\n            err_quit(\"read_fd returned 0\");## 33 ##src/server/child05.c##\n        if (connfd < 0)## 34 ##src/server/child05.c##\n            err_quit(\"no descriptor from read_fd\");## 35 ##src/server/child05.c##\n\n        web_child(connfd);      /* process the request */## 36 ##src/server/child05.c##\n        Close(connfd);## 37 ##src/server/child05.c##\n\n        Write(STDERR_FILENO, \"\", 1);    /* tell parent we're ready again */## 38 ##src/server/child05.c##\n    }## 39 ##src/server/child05.c##\n}## 40 ##src/server/child05.c##\n/* end child_main */\n"
  },
  {
    "path": "server/client.c",
    "content": "#include\t\"unp.h\"\n\n#define\tMAXN\t16384\t\t/* max # bytes to request from server */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti, j, fd, nchildren, nloops, nbytes;\n\tpid_t\tpid;\n\tssize_t\tn;\n\tchar\trequest[MAXLINE], reply[MAXN];\n\n\tif (argc != 6)\n\t\terr_quit(\"usage: client <hostname or IPaddr> <port> <#children> \"\n\t\t\t\t \"<#loops/child> <#bytes/request>\");\n\n\tnchildren = atoi(argv[3]);\n\tnloops = atoi(argv[4]);\n\tnbytes = atoi(argv[5]);\n\tsnprintf(request, sizeof(request), \"%d\\n\", nbytes); /* newline at end */\n\n\tfor (i = 0; i < nchildren; i++) {\n\t\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\t\tfor (j = 0; j < nloops; j++) {\n\t\t\t\tfd = Tcp_connect(argv[1], argv[2]);\n\n\t\t\t\tWrite(fd, request, strlen(request));\n\n\t\t\t\tif ( (n = Readn(fd, reply, nbytes)) != nbytes)\n\t\t\t\t\terr_quit(\"server returned %d bytes\", n);\n\n\t\t\t\tClose(fd);\t\t/* TIME_WAIT on client, not server */\n\t\t\t}\n\t\t\tprintf(\"child %d done\\n\", i);\n\t\t\texit(0);\n\t\t}\n\t\t/* parent loops around to fork() again */\n\t}\n\n\twhile (wait(NULL) > 0)\t/* now parent waits for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/clientrst.c",
    "content": "#include\t\"unp.h\"\n\n#define\tMAXN\t16384\t\t/* max #bytes to request from server */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti, j, fd, nchildren, nloops, nbytes;\n\tpid_t\tpid;\n\tssize_t\tn;\n\tchar\trequest[MAXLINE], reply[MAXN];\n\n\tif (argc != 6)\n\t\terr_quit(\"usage: client <hostname or IPaddr> <port> <#children> \"\n\t\t\t\t \"<#loops/child> <#bytes/request>\");\n\n\tnchildren = atoi(argv[3]);\n\tnloops = atoi(argv[4]);\n\tnbytes = atoi(argv[5]);\n\tsnprintf(request, sizeof(request), \"%d\\n\", nbytes);\t/* newline at end */\n\n\tfor (i = 0; i < nchildren; i++) {\n\t\tif ( (pid = Fork()) == 0) {\t\t/* child */\n\t\t\tfor (j = 0; j < nloops; j++) {\n\t\t\t\tfd = Tcp_connect(argv[1], argv[2]);\n\n\t\t\t\t/*\n\t\t\t\t * We want to see what happens to the server when it has\n\t\t\t\t * connections outstanding and an RST arrives for one of\n\t\t\t\t * them, before the connection is accepted.\n\t\t\t\t * With the XTI server, this should generate some\n\t\t\t\t * T_DISCONNECT events from t_accept(), which must be\n\t\t\t\t * handled correctly.\n\t\t\t\t *\n\t\t\t\t * We do this for every third connection from the third\n\t\t\t\t * client child.  (Could add more command-line args ...)\n\t\t\t\t */\n\n\t\t\t\tif (i == 2 && (j % 3) == 0) {\n\t\t\t\t\tstruct linger\tling;\n\n\t\t\t\t\tling.l_onoff = 1;\n\t\t\t\t\tling.l_linger = 0;\n\t\t\t\t\tSetsockopt(fd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));\n\t\t\t\t\tClose(fd);\n\n\t\t\t\t\t/* and just continue on for this client connection ... */\n\t\t\t\t\tfd = Tcp_connect(argv[1], argv[2]);\n\t\t\t\t}\n\n\t\t\t\tWrite(fd, request, strlen(request));\n\n\t\t\t\tif ( (n = Readn(fd, reply, nbytes)) != nbytes)\n\t\t\t\t\terr_quit(\"server returned %d bytes\", n);\n\n\t\t\t\tClose(fd);\t\t/* TIME_WAIT on client, not server */\n\t\t\t}\n\t\t\tprintf(\"child %d done\\n\", i);\n\t\t\texit(0);\n\t\t}\n\t\t/* parent loops around to fork() again */\n\t}\n\n\twhile (wait(NULL) > 0)\t/* now parent waits for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/lock_fcntl.c",
    "content": "/* include my_lock_init */\n#include\t\"unp.h\"\n\nstatic struct flock\tlock_it, unlock_it;\nstatic int\t\t\tlock_fd = -1;\n\t\t\t\t\t/* fcntl() will fail if my_lock_init() not called */\n\nvoid\nmy_lock_init(char *pathname)\n{\n    char\tlock_file[1024];\n\n\t\t/* 4must copy caller's string, in case it's a constant */\n    strncpy(lock_file, pathname, sizeof(lock_file));\n    lock_fd = Mkstemp(lock_file);\n\n    Unlink(lock_file);\t\t\t/* but lock_fd remains open */\n\n\tlock_it.l_type = F_WRLCK;\n\tlock_it.l_whence = SEEK_SET;\n\tlock_it.l_start = 0;\n\tlock_it.l_len = 0;\n\n\tunlock_it.l_type = F_UNLCK;\n\tunlock_it.l_whence = SEEK_SET;\n\tunlock_it.l_start = 0;\n\tunlock_it.l_len = 0;\n}\n/* end my_lock_init */\n\n/* include my_lock_wait */\nvoid\nmy_lock_wait()\n{\n    int\t\trc;\n    \n    while ( (rc = fcntl(lock_fd, F_SETLKW, &lock_it)) < 0) {\n\t\tif (errno == EINTR)\n\t\t\tcontinue;\n    \telse\n\t\t\terr_sys(\"fcntl error for my_lock_wait\");\n\t}\n}\n\nvoid\nmy_lock_release()\n{\n    if (fcntl(lock_fd, F_SETLKW, &unlock_it) < 0)\n\t\terr_sys(\"fcntl error for my_lock_release\");\n}\n/* end my_lock_wait */\n"
  },
  {
    "path": "server/lock_fcntl.lc",
    "content": "/* include my_lock_init */\n#include    \"unp.h\"##  1 ##src/server/lock_fcntl.c##\n\nstatic struct flock lock_it, unlock_it;##  2 ##src/server/lock_fcntl.c##\nstatic int lock_fd = -1;##  3 ##src/server/lock_fcntl.c##\n                    /* fcntl() will fail if my_lock_init() not called */##  4 ##src/server/lock_fcntl.c##\n\nvoid##  5 ##src/server/lock_fcntl.c##\nmy_lock_init(char *pathname)##  6 ##src/server/lock_fcntl.c##\n{##  7 ##src/server/lock_fcntl.c##\n    char    lock_file[1024];##  8 ##src/server/lock_fcntl.c##\n\n    /* 4must copy caller's string, in case it's a constant */##  9 ##src/server/lock_fcntl.c##\n    strncpy(lock_file, pathname, sizeof(lock_file));## 10 ##src/server/lock_fcntl.c##\n    lock_fd = Mkstemp(lock_file);## 11 ##src/server/lock_fcntl.c##\n\n    Unlink(lock_file);          /* but lock_fd remains open */## 12 ##src/server/lock_fcntl.c##\n\n    lock_it.l_type = F_WRLCK;## 13 ##src/server/lock_fcntl.c##\n    lock_it.l_whence = SEEK_SET;## 14 ##src/server/lock_fcntl.c##\n    lock_it.l_start = 0;## 15 ##src/server/lock_fcntl.c##\n    lock_it.l_len = 0;## 16 ##src/server/lock_fcntl.c##\n\n    unlock_it.l_type = F_UNLCK;## 17 ##src/server/lock_fcntl.c##\n    unlock_it.l_whence = SEEK_SET;## 18 ##src/server/lock_fcntl.c##\n    unlock_it.l_start = 0;## 19 ##src/server/lock_fcntl.c##\n    unlock_it.l_len = 0;## 20 ##src/server/lock_fcntl.c##\n}## 21 ##src/server/lock_fcntl.c##\n/* end my_lock_init */\n\n/* include my_lock_wait */\nvoid## 22 ##src/server/lock_fcntl.c##\nmy_lock_wait()## 23 ##src/server/lock_fcntl.c##\n{## 24 ##src/server/lock_fcntl.c##\n    int     rc;## 25 ##src/server/lock_fcntl.c##\n\n    while ((rc = fcntl(lock_fd, F_SETLKW, &lock_it)) < 0) {## 26 ##src/server/lock_fcntl.c##\n        if (errno == EINTR)## 27 ##src/server/lock_fcntl.c##\n            continue;## 28 ##src/server/lock_fcntl.c##\n        else## 29 ##src/server/lock_fcntl.c##\n            err_sys(\"fcntl error for my_lock_wait\");## 30 ##src/server/lock_fcntl.c##\n    }## 31 ##src/server/lock_fcntl.c##\n}## 32 ##src/server/lock_fcntl.c##\n\nvoid## 33 ##src/server/lock_fcntl.c##\nmy_lock_release()## 34 ##src/server/lock_fcntl.c##\n{## 35 ##src/server/lock_fcntl.c##\n    if (fcntl(lock_fd, F_SETLKW, &unlock_it) < 0)## 36 ##src/server/lock_fcntl.c##\n        err_sys(\"fcntl error for my_lock_release\");## 37 ##src/server/lock_fcntl.c##\n}## 38 ##src/server/lock_fcntl.c##\n/* end my_lock_wait */\n"
  },
  {
    "path": "server/lock_pthread.c",
    "content": "/* include my_lock_init */\n#include\t\"unpthread.h\"\n#include\t<sys/mman.h>\n\nstatic pthread_mutex_t\t*mptr;\t/* actual mutex will be in shared memory */\n\nvoid\nmy_lock_init(char *pathname)\n{\n\tint\t\tfd;\n\tpthread_mutexattr_t\tmattr;\n\n\tfd = Open(\"/dev/zero\", O_RDWR, 0);\n\n\tmptr = Mmap(0, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE,\n\t\t\t\tMAP_SHARED, fd, 0);\n\tClose(fd);\n\n\tPthread_mutexattr_init(&mattr);\n\tPthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);\n\tPthread_mutex_init(mptr, &mattr);\n}\n/* end my_lock_init */\n\n/* include my_lock_wait */\nvoid\nmy_lock_wait()\n{\n\tPthread_mutex_lock(mptr);\n}\n\nvoid\nmy_lock_release()\n{\n\tPthread_mutex_unlock(mptr);\n}\n/* end my_lock_wait */\n"
  },
  {
    "path": "server/lock_pthread.lc",
    "content": "/* include my_lock_init */\n#include    \"unpthread.h\"##  1 ##src/server/lock_pthread.c##\n#include    <sys/mman.h>##  2 ##src/server/lock_pthread.c##\n\nstatic pthread_mutex_t *mptr;   /* actual mutex will be in shared memory */##  3 ##src/server/lock_pthread.c##\n\nvoid##  4 ##src/server/lock_pthread.c##\nmy_lock_init(char *pathname)##  5 ##src/server/lock_pthread.c##\n{##  6 ##src/server/lock_pthread.c##\n    int     fd;##  7 ##src/server/lock_pthread.c##\n    pthread_mutexattr_t mattr;##  8 ##src/server/lock_pthread.c##\n\n    fd = Open(\"/dev/zero\", O_RDWR, 0);##  9 ##src/server/lock_pthread.c##\n\n    mptr = Mmap(0, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE,## 10 ##src/server/lock_pthread.c##\n                MAP_SHARED, fd, 0);## 11 ##src/server/lock_pthread.c##\n    Close(fd);## 12 ##src/server/lock_pthread.c##\n\n    Pthread_mutexattr_init(&mattr);## 13 ##src/server/lock_pthread.c##\n    Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);## 14 ##src/server/lock_pthread.c##\n    Pthread_mutex_init(mptr, &mattr);## 15 ##src/server/lock_pthread.c##\n}## 16 ##src/server/lock_pthread.c##\n/* end my_lock_init */\n\n/* include my_lock_wait */\nvoid## 17 ##src/server/lock_pthread.c##\nmy_lock_wait()## 18 ##src/server/lock_pthread.c##\n{## 19 ##src/server/lock_pthread.c##\n    Pthread_mutex_lock(mptr);## 20 ##src/server/lock_pthread.c##\n}## 21 ##src/server/lock_pthread.c##\n\nvoid## 22 ##src/server/lock_pthread.c##\nmy_lock_release()## 23 ##src/server/lock_pthread.c##\n{## 24 ##src/server/lock_pthread.c##\n    Pthread_mutex_unlock(mptr);## 25 ##src/server/lock_pthread.c##\n}## 26 ##src/server/lock_pthread.c##\n/* end my_lock_wait */\n"
  },
  {
    "path": "server/meter.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/mman.h>\n\n/*\n * Allocate an array of \"nchildren\" longs in shared memory that can\n * be used as a counter by each child of how many clients it services.\n * See pp. 467-470 of \"Advanced Programming in the Unix Environment.\"\n */\n\nlong *\nmeter(int nchildren)\n{\n\tint\t\tfd;\n\tlong\t*ptr;\n\n#ifdef\tMAP_ANON\n\tptr = Mmap(0, nchildren*sizeof(long), PROT_READ | PROT_WRITE,\n\t\t\t   MAP_ANON | MAP_SHARED, -1, 0);\n#else\n\tfd = Open(\"/dev/zero\", O_RDWR, 0);\n\n\tptr = Mmap(0, nchildren*sizeof(long), PROT_READ | PROT_WRITE,\n\t\t\t   MAP_SHARED, fd, 0);\n\tClose(fd);\n#endif\n\n\treturn(ptr);\n}\n"
  },
  {
    "path": "server/pr_cpu_time.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/resource.h>\n\n#ifndef\tHAVE_GETRUSAGE_PROTO\nint\t\tgetrusage(int, struct rusage *);\n#endif\n\nvoid\npr_cpu_time(void)\n{\n\tdouble\t\t\tuser, sys;\n\tstruct rusage\tmyusage, childusage;\n\n\tif (getrusage(RUSAGE_SELF, &myusage) < 0)\n\t\terr_sys(\"getrusage error\");\n\tif (getrusage(RUSAGE_CHILDREN, &childusage) < 0)\n\t\terr_sys(\"getrusage error\");\n\n\tuser = (double) myusage.ru_utime.tv_sec +\n\t\t\t\t\tmyusage.ru_utime.tv_usec/1000000.0;\n\tuser += (double) childusage.ru_utime.tv_sec +\n\t\t\t\t\t childusage.ru_utime.tv_usec/1000000.0;\n\tsys = (double) myusage.ru_stime.tv_sec +\n\t\t\t\t   myusage.ru_stime.tv_usec/1000000.0;\n\tsys += (double) childusage.ru_stime.tv_sec +\n\t\t\t\t\tchildusage.ru_stime.tv_usec/1000000.0;\n\n\tprintf(\"\\nuser time = %g, sys time = %g\\n\", user, sys);\n}\n"
  },
  {
    "path": "server/pthread07.c",
    "content": "#include\t\"unpthread.h\"\n#include\t\"pthread07.h\"\n\nvoid\nthread_make(int i)\n{\n\tvoid\t*thread_main(void *);\n\n\tPthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void *) i);\n\treturn;\t\t/* main thread returns */\n}\n\nvoid *\nthread_main(void *arg)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"thread %d starting\\n\", (int) arg);\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n    \tPthread_mutex_lock(&mlock);\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\t\tPthread_mutex_unlock(&mlock);\n\t\ttptr[(int) arg].thread_count++;\n\n\t\tweb_child(connfd);\t\t/* process request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/pthread07.h",
    "content": "typedef struct {\n  pthread_t\t\tthread_tid;\t\t/* thread ID */\n  long\t\t\tthread_count;\t/* # connections handled */\n} Thread;\nThread\t*tptr;\t\t/* array of Thread structures; calloc'ed */\n\nint\t\t\t\tlistenfd, nthreads;\nsocklen_t\t\taddrlen;\npthread_mutex_t\tmlock;\n"
  },
  {
    "path": "server/pthread07.lc",
    "content": "#include    \"unpthread.h\"##  1 ##src/server/pthread07.c##\n#include    \"pthread07.h\"##  2 ##src/server/pthread07.c##\n\nvoid##  3 ##src/server/pthread07.c##\nthread_make(int i)##  4 ##src/server/pthread07.c##\n{##  5 ##src/server/pthread07.c##\n    void   *thread_main(void *);##  6 ##src/server/pthread07.c##\n\n    Pthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void *) i);##  7 ##src/server/pthread07.c##\n    return;                     /* main thread returns */##  8 ##src/server/pthread07.c##\n}##  9 ##src/server/pthread07.c##\n\nvoid   *## 10 ##src/server/pthread07.c##\nthread_main(void *arg)## 11 ##src/server/pthread07.c##\n{## 12 ##src/server/pthread07.c##\n    int     connfd;## 13 ##src/server/pthread07.c##\n    void    web_child(int);## 14 ##src/server/pthread07.c##\n    socklen_t clilen;## 15 ##src/server/pthread07.c##\n    struct sockaddr *cliaddr;## 16 ##src/server/pthread07.c##\n\n    cliaddr = Malloc(addrlen);## 17 ##src/server/pthread07.c##\n\n    printf(\"thread %d starting\\n\", (int) arg);## 18 ##src/server/pthread07.c##\n    for (;;) {## 19 ##src/server/pthread07.c##\n        clilen = addrlen;## 20 ##src/server/pthread07.c##\n        Pthread_mutex_lock(&mlock);## 21 ##src/server/pthread07.c##\n        connfd = Accept(listenfd, cliaddr, &clilen);## 22 ##src/server/pthread07.c##\n        Pthread_mutex_unlock(&mlock);## 23 ##src/server/pthread07.c##\n        tptr[(int) arg].thread_count++;## 24 ##src/server/pthread07.c##\n\n        web_child(connfd);      /* process the request */## 25 ##src/server/pthread07.c##\n        Close(connfd);## 26 ##src/server/pthread07.c##\n    }## 27 ##src/server/pthread07.c##\n}## 28 ##src/server/pthread07.c##\n"
  },
  {
    "path": "server/pthread08.c",
    "content": "#include\t\"unpthread.h\"\n#include\t\"pthread08.h\"\n\nvoid\nthread_make(int i)\n{\n\tvoid\t*thread_main(void *);\n\n\tPthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void *) i);\n\treturn;\t\t/* main thread returns */\n}\n\nvoid *\nthread_main(void *arg)\n{\n\tint\t\tconnfd;\n\tvoid\tweb_child(int);\n\n\tprintf(\"thread %d starting\\n\", (int) arg);\n\tfor ( ; ; ) {\n    \tPthread_mutex_lock(&clifd_mutex);\n\t\twhile (iget == iput)\n\t\t\tPthread_cond_wait(&clifd_cond, &clifd_mutex);\n\t\tconnfd = clifd[iget];\t/* connected socket to service */\n\t\tif (++iget == MAXNCLI)\n\t\t\tiget = 0;\n\t\tPthread_mutex_unlock(&clifd_mutex);\n\t\ttptr[(int) arg].thread_count++;\n\n\t\tweb_child(connfd);\t\t/* process request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/pthread08.h",
    "content": "typedef struct {\n  pthread_t\t\tthread_tid;\t\t/* thread ID */\n  long\t\t\tthread_count;\t/* # connections handled */\n} Thread;\nThread\t*tptr;\t\t/* array of Thread structures; calloc'ed */\n\n#define\tMAXNCLI\t32\nint\t\t\t\t\tclifd[MAXNCLI], iget, iput;\npthread_mutex_t\t\tclifd_mutex;\npthread_cond_t\t\tclifd_cond;\n"
  },
  {
    "path": "server/pthread08.lc",
    "content": "#include    \"unpthread.h\"##  1 ##src/server/pthread08.c##\n#include    \"pthread08.h\"##  2 ##src/server/pthread08.c##\n\nvoid##  3 ##src/server/pthread08.c##\nthread_make(int i)##  4 ##src/server/pthread08.c##\n{##  5 ##src/server/pthread08.c##\n    void   *thread_main(void *);##  6 ##src/server/pthread08.c##\n\n    Pthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void *) i);##  7 ##src/server/pthread08.c##\n    return;                     /* main thread returns */##  8 ##src/server/pthread08.c##\n}##  9 ##src/server/pthread08.c##\n\nvoid   *## 10 ##src/server/pthread08.c##\nthread_main(void *arg)## 11 ##src/server/pthread08.c##\n{## 12 ##src/server/pthread08.c##\n    int     connfd;## 13 ##src/server/pthread08.c##\n    void    web_child(int);## 14 ##src/server/pthread08.c##\n\n    printf(\"thread %d starting\\n\", (int) arg);## 15 ##src/server/pthread08.c##\n    for (;;) {## 16 ##src/server/pthread08.c##\n        Pthread_mutex_lock(&clifd_mutex);## 17 ##src/server/pthread08.c##\n        while (iget == iput)## 18 ##src/server/pthread08.c##\n            Pthread_cond_wait(&clifd_cond, &clifd_mutex);## 19 ##src/server/pthread08.c##\n        connfd = clifd[iget];   /* connected socket to service */## 20 ##src/server/pthread08.c##\n        if (++iget == MAXNCLI)## 21 ##src/server/pthread08.c##\n            iget = 0;## 22 ##src/server/pthread08.c##\n        Pthread_mutex_unlock(&clifd_mutex);## 23 ##src/server/pthread08.c##\n        tptr[(int) arg].thread_count++;## 24 ##src/server/pthread08.c##\n\n        web_child(connfd);      /* process the request */## 25 ##src/server/pthread08.c##\n        Close(connfd);## 26 ##src/server/pthread08.c##\n    }## 27 ##src/server/pthread08.c##\n}## 28 ##src/server/pthread08.c##\n"
  },
  {
    "path": "server/pthread09.c",
    "content": "#include\t\"unpthread.h\"\n#include\t\"pthread09.h\"\n\nvoid\nthread_make(int i)\n{\n\tvoid\t*thread_main(void *);\n\n\tPthread_create(&tptr[i].thread_tid, NULL, &thread_main, (void *) i);\n\treturn;\t\t/* main thread returns */\n}\n\nvoid *\nthread_main(void *arg)\n{\n\tint\t\t\t\tconnfd;\n\tvoid\t\t\tweb_child(int);\n\tsocklen_t\t\tclilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tcliaddr = Malloc(addrlen);\n\n\tprintf(\"thread %d starting\\n\", (int) arg);\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\t\ttptr[(int) arg].thread_count++;\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "server/pthread09.h",
    "content": "typedef struct {\n  pthread_t\t\tthread_tid;\t\t/* thread ID */\n  long\t\t\tthread_count;\t/* #connections handled */\n} Thread;\nThread\t*tptr;\t\t/* array of Thread structures; calloc'ed */\n\nint\t\t\t\tlistenfd, nthreads;\nsocklen_t\t\taddrlen;\n"
  },
  {
    "path": "server/readline.c",
    "content": "/* include readline */\n#include\t\"unp.h\"\n\nssize_t\nreadline(int fd, void *vptr, size_t maxlen)\n{\n\tssize_t\tn, rc;\n\tchar\tc, *ptr;\n\n\tptr = vptr;\n\tfor (n = 1; n < maxlen; n++) {\n\t\tif ( (rc = read(fd, &c, 1)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\n\t\t} else if (rc == 0) {\n\t\t\tif (n == 1)\n\t\t\t\treturn(0);\t/* EOF, no data read */\n\t\t\telse\n\t\t\t\tbreak;\t\t/* EOF, some data was read */\n\t\t} else\n\t\t\treturn(-1);\t/* error */\n\t}\n\n\t*ptr = 0;\n\treturn(n);\n}\n/* end readline */\n\nssize_t\nReadline(int fd, void *ptr, size_t maxlen)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline(fd, ptr, maxlen)) == -1)\n\t\terr_sys(\"readline error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "server/readline_r.c",
    "content": "/* include readline */\n#include\t\"unp.h\"\n#include\t\"readline_r.h\"\n\nstatic ssize_t\nmy_read_r(Rline *rptr, char *ptr)\n{\n\tif (rptr->rl_cnt <= 0) {\nagain:\n\t\trptr->rl_cnt = read(rptr->read_fd, rptr->rl_buf, sizeof(rptr->rl_buf));\n\t\tif (rptr->rl_cnt < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tgoto again;\n\t\t\telse\n\t\t\t\treturn(-1);\n\t\t}\n\t\telse if (rptr->rl_cnt == 0)\n\t\t\treturn(0);\n\t\trptr->rl_bufptr = rptr->rl_buf;\n\t}\n\n\trptr->rl_cnt--;\n\t*ptr = *rptr->rl_bufptr++ & 255;\n\treturn(1);\n}\n\nvoid\nreadline_rinit(int fd, void *ptr, size_t maxlen, Rline *rptr)\n{\n\trptr->read_fd = fd;\t\t\t\t/* save caller's arguments */\n\trptr->read_ptr = ptr;\n\trptr->read_maxlen = maxlen;\n\n\trptr->rl_cnt = 0;\t\t\t\t/* and init our counter & pointer */\n\trptr->rl_bufptr = rptr->rl_buf;\n}\n\nssize_t\nreadline_r(Rline *rptr)\n{\n\tint\t\tn, rc;\n\tchar\tc, *ptr;\n\n\tptr = rptr->read_ptr;\n\tfor (n = 1; n < rptr->read_maxlen; n++) {\n\t\tif ( (rc = my_read_r(rptr, &c)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\n\t\t} else if (rc == 0) {\n\t\t\tif (n == 1)\n\t\t\t\treturn(0);\t/* EOF, no data read */\n\t\t\telse\n\t\t\t\tbreak;\t\t/* EOF, some data was read */\n\t\t} else\n\t\t\treturn(-1);\t/* error */\n\t}\n\n\t*ptr = 0;\n\treturn(n);\n}\n/* end readline */\n\nssize_t\nReadline_r(Rline *rptr)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline_r(rptr)) == -1)\n\t\terr_sys(\"readline_r error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "server/readline_r.h",
    "content": "typedef struct {\n  int\t\tread_fd;\t\t/* caller's descriptor to read from */\n  char\t\t*read_ptr;\t\t/* caller's buffer to read into */\n  size_t\tread_maxlen;\t/* max #bytes to read */\n\t\t\t\t/* next three are used internally by the function */\n  int\t\trl_cnt;\t\t\t/* initialize to 0 */\n  char\t\t*rl_bufptr;\t\t/* initialize to rl_buf */\n  char\t\trl_buf[MAXLINE];\n} Rline;\n\nvoid\treadline_rinit(int, void *, size_t, Rline *);\nssize_t\treadline_r(Rline *);\nssize_t\tReadline_r(Rline *);\n"
  },
  {
    "path": "server/serv00.c",
    "content": "/* include serv00 */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tvoid\t\t\t\tsig_int(int), web_child(int);\n\tsocklen_t\t\t\tclilen, addrlen;\n\tstruct sockaddr\t\t*cliaddr;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv00 [ <host> ] <port#>\");\n\tcliaddr = Malloc(addrlen);\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\n\t\tweb_child(connfd);\t\t/* process the request */\n\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n/* end serv00 */\n\n/* include sigint */\nvoid\nsig_int(int signo)\n{\n\tvoid\tpr_cpu_time(void);\n\n\tpr_cpu_time();\n\texit(0);\n}\n/* end sigint */\n"
  },
  {
    "path": "server/serv01.c",
    "content": "/* include serv01 */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tvoid\t\t\t\tsig_chld(int), sig_int(int), web_child(int);\n\tsocklen_t\t\t\tclilen, addrlen;\n\tstruct sockaddr\t\t*cliaddr;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv01 [ <host> ] <port#>\");\n\tcliaddr = Malloc(addrlen);\n\n\tSignal(SIGCHLD, sig_chld);\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tif ( (connfd = accept(listenfd, cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tweb_child(connfd);\t/* process request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n/* end serv01 */\n\n/* include sigint */\nvoid\nsig_int(int signo)\n{\n\tvoid\tpr_cpu_time(void);\n\n\tpr_cpu_time();\n\texit(0);\n}\n/* end sigint */\n"
  },
  {
    "path": "server/serv01.lc",
    "content": "/* include serv01 */\n#include    \"unp.h\"##  1 ##src/server/serv01.c##\n\nint##  2 ##src/server/serv01.c##\nmain(int argc, char **argv)##  3 ##src/server/serv01.c##\n{##  4 ##src/server/serv01.c##\n    int     listenfd, connfd;##  5 ##src/server/serv01.c##\n    pid_t   childpid;##  6 ##src/server/serv01.c##\n    void    sig_chld(int), sig_int(int), web_child(int);##  7 ##src/server/serv01.c##\n    socklen_t clilen, addrlen;##  8 ##src/server/serv01.c##\n    struct sockaddr *cliaddr;##  9 ##src/server/serv01.c##\n\n    if (argc == 2)## 10 ##src/server/serv01.c##\n        listenfd = Tcp_listen(NULL, argv[1], &addrlen);## 11 ##src/server/serv01.c##\n    else if (argc == 3)## 12 ##src/server/serv01.c##\n        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);## 13 ##src/server/serv01.c##\n    else## 14 ##src/server/serv01.c##\n        err_quit(\"usage: serv01 [ <host> ] <port#>\");## 15 ##src/server/serv01.c##\n    cliaddr = Malloc(addrlen);## 16 ##src/server/serv01.c##\n\n    Signal(SIGCHLD, sig_chld);## 17 ##src/server/serv01.c##\n    Signal(SIGINT, sig_int);## 18 ##src/server/serv01.c##\n\n    for (;;) {## 19 ##src/server/serv01.c##\n        clilen = addrlen;## 20 ##src/server/serv01.c##\n        if ((connfd = accept(listenfd, cliaddr, &clilen)) < 0) {## 21 ##src/server/serv01.c##\n            if (errno == EINTR)## 22 ##src/server/serv01.c##\n                continue;       /* back to for() */## 23 ##src/server/serv01.c##\n            else## 24 ##src/server/serv01.c##\n                err_sys(\"accept error\");## 25 ##src/server/serv01.c##\n        }## 26 ##src/server/serv01.c##\n\n        if ((childpid = Fork()) == 0) { /* child process */## 27 ##src/server/serv01.c##\n            Close(listenfd);    /* close listening socket */## 28 ##src/server/serv01.c##\n            web_child(connfd);  /* process the request */## 29 ##src/server/serv01.c##\n            exit(0);## 30 ##src/server/serv01.c##\n        }## 31 ##src/server/serv01.c##\n        Close(connfd);          /* parent closes connected socket */## 32 ##src/server/serv01.c##\n    }## 33 ##src/server/serv01.c##\n}## 34 ##src/server/serv01.c##\n/* end serv01 */\n\n/* include sigint */\nvoid## 35 ##src/server/serv01.c##\nsig_int(int signo)## 36 ##src/server/serv01.c##\n{## 37 ##src/server/serv01.c##\n    void    pr_cpu_time(void);## 38 ##src/server/serv01.c##\n\n    pr_cpu_time();## 39 ##src/server/serv01.c##\n    exit(0);## 40 ##src/server/serv01.c##\n}## 41 ##src/server/serv01.c##\n/* end sigint */\n"
  },
  {
    "path": "server/serv02.c",
    "content": "/* include serv02 */\n#include\t\"unp.h\"\n\nstatic int\t\tnchildren;\nstatic pid_t\t*pids;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tlistenfd, i;\n\tsocklen_t\taddrlen;\n\tvoid\t\tsig_int(int);\n\tpid_t\t\tchild_make(int, int, int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv02 [ <host> ] <port#> <#children>\");\n\tnchildren = atoi(argv[argc-1]);\n\tpids = Calloc(nchildren, sizeof(pid_t));\n\n\tfor (i = 0; i < nchildren; i++)\n\t\tpids[i] = child_make(i, listenfd, addrlen);\t/* parent returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by children */\n}\n/* end serv02 */\n\n/* include sigint */\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\t\t/* 4terminate all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tkill(pids[i], SIGTERM);\n\twhile (wait(NULL) > 0)\t\t/* wait for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\tpr_cpu_time();\n\texit(0);\n}\n/* end sigint */\n"
  },
  {
    "path": "server/serv02.lc",
    "content": "/* include serv02 */\n#include    \"unp.h\"##  1 ##src/server/serv02.c##\n\nstatic int nchildren;##  2 ##src/server/serv02.c##\nstatic pid_t *pids;##  3 ##src/server/serv02.c##\n\nint##  4 ##src/server/serv02.c##\nmain(int argc, char **argv)##  5 ##src/server/serv02.c##\n{##  6 ##src/server/serv02.c##\n    int     listenfd, i;##  7 ##src/server/serv02.c##\n    socklen_t addrlen;##  8 ##src/server/serv02.c##\n    void    sig_int(int);##  9 ##src/server/serv02.c##\n    pid_t   child_make(int, int, int);## 10 ##src/server/serv02.c##\n\n    if (argc == 3)## 11 ##src/server/serv02.c##\n        listenfd = Tcp_listen(NULL, argv[1], &addrlen);## 12 ##src/server/serv02.c##\n    else if (argc == 4)## 13 ##src/server/serv02.c##\n        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);## 14 ##src/server/serv02.c##\n    else## 15 ##src/server/serv02.c##\n        err_quit(\"usage: serv02 [ <host> ] <port#> <#children>\");## 16 ##src/server/serv02.c##\n    nchildren = atoi(argv[argc - 1]);## 17 ##src/server/serv02.c##\n    pids = Calloc(nchildren, sizeof(pid_t));## 18 ##src/server/serv02.c##\n\n    for (i = 0; i < nchildren; i++)## 19 ##src/server/serv02.c##\n        pids[i] = child_make(i, listenfd, addrlen); /* parent returns */## 20 ##src/server/serv02.c##\n\n    Signal(SIGINT, sig_int);## 21 ##src/server/serv02.c##\n\n    for (;;)## 22 ##src/server/serv02.c##\n        pause();                /* everything done by children */## 23 ##src/server/serv02.c##\n}## 24 ##src/server/serv02.c##\n/* end serv02 */\n\n/* include sigint */\nvoid## 25 ##src/server/serv02.c##\nsig_int(int signo)## 26 ##src/server/serv02.c##\n{## 27 ##src/server/serv02.c##\n    int     i;## 28 ##src/server/serv02.c##\n    void    pr_cpu_time(void);## 29 ##src/server/serv02.c##\n\n    /* 4terminate all children */## 30 ##src/server/serv02.c##\n    for (i = 0; i < nchildren; i++)## 31 ##src/server/serv02.c##\n        kill(pids[i], SIGTERM);## 32 ##src/server/serv02.c##\n    while (wait(NULL) > 0)      /* wait for all children */## 33 ##src/server/serv02.c##\n        ;## 34 ##src/server/serv02.c##\n    if (errno != ECHILD)## 35 ##src/server/serv02.c##\n        err_sys(\"wait error\");## 36 ##src/server/serv02.c##\n\n    pr_cpu_time();## 37 ##src/server/serv02.c##\n    exit(0);## 38 ##src/server/serv02.c##\n}## 39 ##src/server/serv02.c##\n/* end sigint */\n"
  },
  {
    "path": "server/serv02m.c",
    "content": "#include\t\"unp.h\"\n\nstatic int\t\tnchildren;\nstatic pid_t\t*pids;\nlong\t\t\t*cptr, *meter(int);\t/* for counting #clients/child */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tlistenfd, i;\n\tsocklen_t\taddrlen;\n\tvoid\t\tsig_int(int);\n\tpid_t\t\tchild_make(int, int, int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv02 [ <host> ] <port#> <#children>\");\n\tnchildren = atoi(argv[argc-1]);\n\tpids = Calloc(nchildren, sizeof(pid_t));\n\tcptr = meter(nchildren);\n\n\tfor (i = 0; i < nchildren; i++)\n\t\tpids[i] = child_make(i, listenfd, addrlen);\t/* parent returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by children */\n}\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\t\t/* terminate all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tkill(pids[i], SIGTERM);\n\twhile (wait(NULL) > 0)\t\t/* wait for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\tpr_cpu_time();\n\n\tfor (i = 0; i < nchildren; i++)\n\t\tprintf(\"child %d, %ld connections\\n\", i, cptr[i]);\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv03.c",
    "content": "#include\t\"unp.h\"\n\nstatic int\t\tnchildren;\nstatic pid_t\t*pids;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tlistenfd, i;\n\tsocklen_t\taddrlen;\n\tvoid\t\tsig_int(int);\n\tpid_t\t\tchild_make(int, int, int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv03 [ <host> ] <port#> <#children>\");\n\tnchildren = atoi(argv[argc-1]);\n\tpids = Calloc(nchildren, sizeof(pid_t));\n\n\tmy_lock_init(\"/tmp/lock.XXXXXX\"); /* one lock file for all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tpids[i] = child_make(i, listenfd, addrlen);\t/* parent returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by children */\n}\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\t\t/* terminate all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tkill(pids[i], SIGTERM);\n\twhile (wait(NULL) > 0)\t\t/* wait for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\tpr_cpu_time();\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv03m.c",
    "content": "#include\t\"unp.h\"\n\nstatic int\t\tnchildren;\nstatic pid_t\t*pids;\nlong\t\t\t*cptr, *meter(int);\t/* for counting #clients/child */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tlistenfd, i;\n\tsocklen_t\taddrlen;\n\tvoid\t\tsig_int(int);\n\tpid_t\t\tchild_make(int, int, int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv03 [ <host> ] <port#> <#children>\");\n\tnchildren = atoi(argv[argc-1]);\n\tpids = Calloc(nchildren, sizeof(pid_t));\n\tcptr = meter(nchildren);\n\n\tmy_lock_init(\"/tmp/lock.XXXXXX\");\t/* one lock file for all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tpids[i] = child_make(i, listenfd, addrlen);\t/* parent returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by children */\n}\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\t\t/* terminate all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tkill(pids[i], SIGTERM);\n\twhile (wait(NULL) > 0)\t\t/* wait for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\tpr_cpu_time();\n\n\tfor (i = 0; i < nchildren; i++)\n\t\tprintf(\"child %d, %ld connections\\n\", i, cptr[i]);\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv04.c",
    "content": "#include\t\"unp.h\"\n\nstatic int\t\tnchildren;\nstatic pid_t\t*pids;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tlistenfd, i;\n\tsocklen_t\taddrlen;\n\tvoid\t\tsig_int(int);\n\tpid_t\t\tchild_make(int, int, int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv04 [ <host> ] <port#> <#children>\");\n\tnchildren = atoi(argv[argc-1]);\n\tpids = Calloc(nchildren, sizeof(pid_t));\n\n\tmy_lock_init(NULL);\n\tfor (i = 0; i < nchildren; i++)\n\t\tpids[i] = child_make(i, listenfd, addrlen);\t/* parent returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by children */\n}\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\t\t/* terminate all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tkill(pids[i], SIGTERM);\n\twhile (wait(NULL) > 0)\t\t/* wait for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\tpr_cpu_time();\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv05.c",
    "content": "/* include serv05a */\n#include\t\"unp.h\"\n#include\t\"child.h\"\n\nstatic int\t\tnchildren;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tlistenfd, i, navail, maxfd, nsel, connfd, rc;\n\tvoid\t\tsig_int(int);\n\tpid_t\t\tchild_make(int, int, int);\n\tssize_t\t\tn;\n\tfd_set\t\trset, masterset;\n\tsocklen_t\taddrlen, clilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv05 [ <host> ] <port#> <#children>\");\n\n\tFD_ZERO(&masterset);\n\tFD_SET(listenfd, &masterset);\n\tmaxfd = listenfd;\n\tcliaddr = Malloc(addrlen);\n\n\tnchildren = atoi(argv[argc-1]);\n\tnavail = nchildren;\n\tcptr = Calloc(nchildren, sizeof(Child));\n\n\t\t/* 4prefork all the children */\n\tfor (i = 0; i < nchildren; i++) {\n\t\tchild_make(i, listenfd, addrlen);\t/* parent returns */\n\t\tFD_SET(cptr[i].child_pipefd, &masterset);\n\t\tmaxfd = max(maxfd, cptr[i].child_pipefd);\n\t}\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; ) {\n\t\trset = masterset;\n\t\tif (navail <= 0)\n\t\t\tFD_CLR(listenfd, &rset);\t/* turn off if no available children */\n\t\tnsel = Select(maxfd + 1, &rset, NULL, NULL, NULL);\n\n\t\t\t/* 4check for new connections */\n\t\tif (FD_ISSET(listenfd, &rset)) {\n\t\t\tclilen = addrlen;\n\t\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\n\t\t\tfor (i = 0; i < nchildren; i++)\n\t\t\t\tif (cptr[i].child_status == 0)\n\t\t\t\t\tbreak;\t\t\t\t/* available */\n\n\t\t\tif (i == nchildren)\n\t\t\t\terr_quit(\"no available children\");\n\t\t\tcptr[i].child_status = 1;\t/* mark child as busy */\n\t\t\tcptr[i].child_count++;\n\t\t\tnavail--;\n\n\t\t\tn = Write_fd(cptr[i].child_pipefd, \"\", 1, connfd);\n\t\t\tClose(connfd);\n\t\t\tif (--nsel == 0)\n\t\t\t\tcontinue;\t/* all done with select() results */\n\t\t}\n\n\t\t\t/* 4find any newly-available children */\n\t\tfor (i = 0; i < nchildren; i++) {\n\t\t\tif (FD_ISSET(cptr[i].child_pipefd, &rset)) {\n\t\t\t\tif ( (n = Read(cptr[i].child_pipefd, &rc, 1)) == 0)\n\t\t\t\t\terr_quit(\"child %d terminated unexpectedly\", i);\n\t\t\t\tcptr[i].child_status = 0;\n\t\t\t\tnavail++;\n\t\t\t\tif (--nsel == 0)\n\t\t\t\t\tbreak;\t/* all done with select() results */\n\t\t\t}\n\t\t}\n\t}\n}\n/* end serv05a */\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\t\t/* 4terminate all children */\n\tfor (i = 0; i < nchildren; i++)\n\t\tkill(cptr[i].child_pid, SIGTERM);\n\twhile (wait(NULL) > 0)\t\t/* wait for all children */\n\t\t;\n\tif (errno != ECHILD)\n\t\terr_sys(\"wait error\");\n\n\tpr_cpu_time();\n\n\tfor (i = 0; i < nchildren; i++)\n\t\tprintf(\"child %d, %ld connections\\n\", i, cptr[i].child_count);\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv05.lc",
    "content": "/* include serv05a */\n#include    \"unp.h\"##  1 ##src/server/serv05.c##\n#include    \"child.h\"##  2 ##src/server/serv05.c##\n\nstatic int nchildren;##  3 ##src/server/serv05.c##\n\nint##  4 ##src/server/serv05.c##\nmain(int argc, char **argv)##  5 ##src/server/serv05.c##\n{##  6 ##src/server/serv05.c##\n    int     listenfd, i, navail, maxfd, nsel, connfd, rc;##  7 ##src/server/serv05.c##\n    void    sig_int(int);##  8 ##src/server/serv05.c##\n    pid_t   child_make(int, int, int);##  9 ##src/server/serv05.c##\n    ssize_t n;## 10 ##src/server/serv05.c##\n    fd_set  rset, masterset;## 11 ##src/server/serv05.c##\n    socklen_t addrlen, clilen;## 12 ##src/server/serv05.c##\n    struct sockaddr *cliaddr;## 13 ##src/server/serv05.c##\n\n    if (argc == 3)## 14 ##src/server/serv05.c##\n        listenfd = Tcp_listen(NULL, argv[1], &addrlen);## 15 ##src/server/serv05.c##\n    else if (argc == 4)## 16 ##src/server/serv05.c##\n        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);## 17 ##src/server/serv05.c##\n    else## 18 ##src/server/serv05.c##\n        err_quit(\"usage: serv05 [ <host> ] <port#> <#children>\");## 19 ##src/server/serv05.c##\n\n    FD_ZERO(&masterset);## 20 ##src/server/serv05.c##\n    FD_SET(listenfd, &masterset);## 21 ##src/server/serv05.c##\n    maxfd = listenfd;## 22 ##src/server/serv05.c##\n    cliaddr = Malloc(addrlen);## 23 ##src/server/serv05.c##\n\n    nchildren = atoi(argv[argc - 1]);## 24 ##src/server/serv05.c##\n    navail = nchildren;## 25 ##src/server/serv05.c##\n    cptr = Calloc(nchildren, sizeof(Child));## 26 ##src/server/serv05.c##\n\n    /* 4prefork all the children */## 27 ##src/server/serv05.c##\n    for (i = 0; i < nchildren; i++) {## 28 ##src/server/serv05.c##\n        child_make(i, listenfd, addrlen);   /* parent returns */## 29 ##src/server/serv05.c##\n        FD_SET(cptr[i].child_pipefd, &masterset);## 30 ##src/server/serv05.c##\n        maxfd = max(maxfd, cptr[i].child_pipefd);## 31 ##src/server/serv05.c##\n    }## 32 ##src/server/serv05.c##\n\n    Signal(SIGINT, sig_int);## 33 ##src/server/serv05.c##\n\n    for (;;) {## 34 ##src/server/serv05.c##\n        rset = masterset;## 35 ##src/server/serv05.c##\n        if (navail <= 0)## 36 ##src/server/serv05.c##\n            FD_CLR(listenfd, &rset);    /* turn off if no available children */## 37 ##src/server/serv05.c##\n        nsel = Select(maxfd + 1, &rset, NULL, NULL, NULL);## 38 ##src/server/serv05.c##\n\n        /* 4check for new connections */## 39 ##src/server/serv05.c##\n        if (FD_ISSET(listenfd, &rset)) {## 40 ##src/server/serv05.c##\n            clilen = addrlen;## 41 ##src/server/serv05.c##\n            connfd = Accept(listenfd, cliaddr, &clilen);## 42 ##src/server/serv05.c##\n\n            for (i = 0; i < nchildren; i++)## 43 ##src/server/serv05.c##\n                if (cptr[i].child_status == 0)## 44 ##src/server/serv05.c##\n                    break;      /* available */## 45 ##src/server/serv05.c##\n\n            if (i == nchildren)## 46 ##src/server/serv05.c##\n                err_quit(\"no available children\");## 47 ##src/server/serv05.c##\n            cptr[i].child_status = 1;   /* mark child as busy */## 48 ##src/server/serv05.c##\n            cptr[i].child_count++;## 49 ##src/server/serv05.c##\n            navail--;## 50 ##src/server/serv05.c##\n\n            n = Write_fd(cptr[i].child_pipefd, \"\", 1, connfd);## 51 ##src/server/serv05.c##\n            Close(connfd);## 52 ##src/server/serv05.c##\n            if (--nsel == 0)## 53 ##src/server/serv05.c##\n                continue;       /* all done with select() results */## 54 ##src/server/serv05.c##\n        }## 55 ##src/server/serv05.c##\n\n        /* 4find any newly-available children */## 56 ##src/server/serv05.c##\n        for (i = 0; i < nchildren; i++) {## 57 ##src/server/serv05.c##\n            if (FD_ISSET(cptr[i].child_pipefd, &rset)) {## 58 ##src/server/serv05.c##\n                if ((n = Read(cptr[i].child_pipefd, &rc, 1)) == 0)## 59 ##src/server/serv05.c##\n                    err_quit(\"child %d terminated unexpectedly\", i);## 60 ##src/server/serv05.c##\n                cptr[i].child_status = 0;## 61 ##src/server/serv05.c##\n                navail++;## 62 ##src/server/serv05.c##\n                if (--nsel == 0)## 63 ##src/server/serv05.c##\n                    break;      /* all done with select() results */## 64 ##src/server/serv05.c##\n            }## 65 ##src/server/serv05.c##\n        }## 66 ##src/server/serv05.c##\n    }## 67 ##src/server/serv05.c##\n}## 68 ##src/server/serv05.c##\n/* end serv05a */\n\nvoid## 69 ##src/server/serv05.c##\nsig_int(int signo)## 70 ##src/server/serv05.c##\n{## 71 ##src/server/serv05.c##\n    int     i;## 72 ##src/server/serv05.c##\n    void    pr_cpu_time(void);## 73 ##src/server/serv05.c##\n\n    /* 4terminate all children */## 74 ##src/server/serv05.c##\n    for (i = 0; i < nchildren; i++)## 75 ##src/server/serv05.c##\n        kill(cptr[i].child_pid, SIGTERM);## 76 ##src/server/serv05.c##\n    while (wait(NULL) > 0)      /* wait for all children */## 77 ##src/server/serv05.c##\n        ;## 78 ##src/server/serv05.c##\n    if (errno != ECHILD)## 79 ##src/server/serv05.c##\n        err_sys(\"wait error\");## 80 ##src/server/serv05.c##\n\n    pr_cpu_time();## 81 ##src/server/serv05.c##\n\n    for (i = 0; i < nchildren; i++)## 82 ##src/server/serv05.c##\n        printf(\"child %d, %ld connections\\n\", i, cptr[i].child_count);## 83 ##src/server/serv05.c##\n\n    exit(0);## 84 ##src/server/serv05.c##\n}## 85 ##src/server/serv05.c##\n"
  },
  {
    "path": "server/serv06.c",
    "content": "/* include serv06 */\n#include\t\"unpthread.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, connfd;\n\tvoid\t\t\tsig_int(int);\n\tvoid\t\t\t*doit(void *);\n\tpthread_t\t\ttid;\n\tsocklen_t\t\tclilen, addrlen;\n\tstruct sockaddr\t*cliaddr;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv06 [ <host> ] <port#>\");\n\tcliaddr = Malloc(addrlen);\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\n\t\tPthread_create(&tid, NULL, &doit, (void *) connfd);\n\t}\n}\n\nvoid *\ndoit(void *arg)\n{\n\tvoid\tweb_child(int);\n\n\tPthread_detach(pthread_self());\n\tweb_child((int) arg);\n\tClose((int) arg);\n\treturn(NULL);\n}\n/* end serv06 */\n\nvoid\nsig_int(int signo)\n{\n\tvoid\tpr_cpu_time(void);\n\n\tpr_cpu_time();\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv06.lc",
    "content": "/* include serv06 */\n#include    \"unpthread.h\"##  1 ##src/server/serv06.c##\n\nint##  2 ##src/server/serv06.c##\nmain(int argc, char **argv)##  3 ##src/server/serv06.c##\n{##  4 ##src/server/serv06.c##\n    int     listenfd, connfd;##  5 ##src/server/serv06.c##\n    void    sig_int(int);##  6 ##src/server/serv06.c##\n    void   *doit(void *);##  7 ##src/server/serv06.c##\n    pthread_t tid;##  8 ##src/server/serv06.c##\n    socklen_t clilen, addrlen;##  9 ##src/server/serv06.c##\n    struct sockaddr *cliaddr;## 10 ##src/server/serv06.c##\n\n    if (argc == 2)## 11 ##src/server/serv06.c##\n        listenfd = Tcp_listen(NULL, argv[1], &addrlen);## 12 ##src/server/serv06.c##\n    else if (argc == 3)## 13 ##src/server/serv06.c##\n        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);## 14 ##src/server/serv06.c##\n    else## 15 ##src/server/serv06.c##\n        err_quit(\"usage: serv06 [ <host> ] <port#>\");## 16 ##src/server/serv06.c##\n    cliaddr = Malloc(addrlen);## 17 ##src/server/serv06.c##\n\n    Signal(SIGINT, sig_int);## 18 ##src/server/serv06.c##\n\n    for (;;) {## 19 ##src/server/serv06.c##\n        clilen = addrlen;## 20 ##src/server/serv06.c##\n        connfd = Accept(listenfd, cliaddr, &clilen);## 21 ##src/server/serv06.c##\n\n        Pthread_create(&tid, NULL, &doit, (void *) connfd);## 22 ##src/server/serv06.c##\n    }## 23 ##src/server/serv06.c##\n}## 24 ##src/server/serv06.c##\n\nvoid   *## 25 ##src/server/serv06.c##\ndoit(void *arg)## 26 ##src/server/serv06.c##\n{## 27 ##src/server/serv06.c##\n    void    web_child(int);## 28 ##src/server/serv06.c##\n\n    Pthread_detach(pthread_self());## 29 ##src/server/serv06.c##\n    web_child((int) arg);## 30 ##src/server/serv06.c##\n    Close((int) arg);## 31 ##src/server/serv06.c##\n    return (NULL);## 32 ##src/server/serv06.c##\n}## 33 ##src/server/serv06.c##\n/* end serv06 */\n\nvoid## 34 ##src/server/serv06.c##\nsig_int(int signo)## 35 ##src/server/serv06.c##\n{## 36 ##src/server/serv06.c##\n    void    pr_cpu_time(void);## 37 ##src/server/serv06.c##\n\n    pr_cpu_time();## 38 ##src/server/serv06.c##\n    exit(0);## 39 ##src/server/serv06.c##\n}## 40 ##src/server/serv06.c##\n"
  },
  {
    "path": "server/serv07.c",
    "content": "/* include serv07 */\n#include\t\"unpthread.h\"\n#include\t\"pthread07.h\"\n\npthread_mutex_t\tmlock = PTHREAD_MUTEX_INITIALIZER;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti;\n\tvoid\tsig_int(int), thread_make(int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv07 [ <host> ] <port#> <#threads>\");\n\tnthreads = atoi(argv[argc-1]);\n\ttptr = Calloc(nthreads, sizeof(Thread));\n\n\tfor (i = 0; i < nthreads; i++)\n\t\tthread_make(i);\t\t\t/* only main thread returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by threads */\n}\n/* end serv07 */\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\tpr_cpu_time();\n\n\tfor (i = 0; i < nthreads; i++)\n\t\tprintf(\"thread %d, %ld connections\\n\", i, tptr[i].thread_count);\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv07.lc",
    "content": "/* include serv07 */\n#include    \"unpthread.h\"##  1 ##src/server/serv07.c##\n#include    \"pthread07.h\"##  2 ##src/server/serv07.c##\n\npthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;##  3 ##src/server/serv07.c##\n\nint##  4 ##src/server/serv07.c##\nmain(int argc, char **argv)##  5 ##src/server/serv07.c##\n{##  6 ##src/server/serv07.c##\n    int     i;##  7 ##src/server/serv07.c##\n    void    sig_int(int), thread_make(int);##  8 ##src/server/serv07.c##\n\n    if (argc == 3)##  9 ##src/server/serv07.c##\n        listenfd = Tcp_listen(NULL, argv[1], &addrlen);## 10 ##src/server/serv07.c##\n    else if (argc == 4)## 11 ##src/server/serv07.c##\n        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);## 12 ##src/server/serv07.c##\n    else## 13 ##src/server/serv07.c##\n        err_quit(\"usage: serv07 [ <host> ] <port#> <#threads>\");## 14 ##src/server/serv07.c##\n    nthreads = atoi(argv[argc - 1]);## 15 ##src/server/serv07.c##\n    tptr = Calloc(nthreads, sizeof(Thread));## 16 ##src/server/serv07.c##\n\n    for (i = 0; i < nthreads; i++)## 17 ##src/server/serv07.c##\n        thread_make(i);         /* only main thread returns */## 18 ##src/server/serv07.c##\n\n    Signal(SIGINT, sig_int);## 19 ##src/server/serv07.c##\n\n    for (;;)## 20 ##src/server/serv07.c##\n        pause();                /* everything done by threads */## 21 ##src/server/serv07.c##\n}## 22 ##src/server/serv07.c##\n/* end serv07 */\n\nvoid## 23 ##src/server/serv07.c##\nsig_int(int signo)## 24 ##src/server/serv07.c##\n{## 25 ##src/server/serv07.c##\n    int     i;## 26 ##src/server/serv07.c##\n    void    pr_cpu_time(void);## 27 ##src/server/serv07.c##\n\n    pr_cpu_time();## 28 ##src/server/serv07.c##\n\n    for (i = 0; i < nthreads; i++)## 29 ##src/server/serv07.c##\n        printf(\"thread %d, %ld connections\\n\", i, tptr[i].thread_count);## 30 ##src/server/serv07.c##\n\n    exit(0);## 31 ##src/server/serv07.c##\n}## 32 ##src/server/serv07.c##\n"
  },
  {
    "path": "server/serv08.c",
    "content": "/* include serv08 */\n#include\t\"unpthread.h\"\n#include\t\"pthread08.h\"\n\nstatic int\t\t\tnthreads;\npthread_mutex_t\t\tclifd_mutex = PTHREAD_MUTEX_INITIALIZER;\npthread_cond_t\t\tclifd_cond = PTHREAD_COND_INITIALIZER;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\ti, listenfd, connfd;\n\tvoid\t\tsig_int(int), thread_make(int);\n\tsocklen_t\taddrlen, clilen;\n\tstruct sockaddr\t*cliaddr;\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv08 [ <host> ] <port#> <#threads>\");\n\tcliaddr = Malloc(addrlen);\n\n\tnthreads = atoi(argv[argc-1]);\n\ttptr = Calloc(nthreads, sizeof(Thread));\n\tiget = iput = 0;\n\n\t\t/* 4create all the threads */\n\tfor (i = 0; i < nthreads; i++)\n\t\tthread_make(i);\t\t/* only main thread returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; ) {\n\t\tclilen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &clilen);\n\n\t\tPthread_mutex_lock(&clifd_mutex);\n\t\tclifd[iput] = connfd;\n\t\tif (++iput == MAXNCLI)\n\t\t\tiput = 0;\n\t\tif (iput == iget)\n\t\t\terr_quit(\"iput = iget = %d\", iput);\n\t\tPthread_cond_signal(&clifd_cond);\n\t\tPthread_mutex_unlock(&clifd_mutex);\n\t}\n}\n/* end serv08 */\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\tpr_cpu_time();\n\n\tfor (i = 0; i < nthreads; i++)\n\t\tprintf(\"thread %d, %ld connections\\n\", i, tptr[i].thread_count);\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/serv08.lc",
    "content": "/* include serv08 */\n#include    \"unpthread.h\"##  1 ##src/server/serv08.c##\n#include    \"pthread08.h\"##  2 ##src/server/serv08.c##\n\nstatic int nthreads;##  3 ##src/server/serv08.c##\npthread_mutex_t clifd_mutex = PTHREAD_MUTEX_INITIALIZER;##  4 ##src/server/serv08.c##\npthread_cond_t clifd_cond = PTHREAD_COND_INITIALIZER;##  5 ##src/server/serv08.c##\n\nint##  6 ##src/server/serv08.c##\nmain(int argc, char **argv)##  7 ##src/server/serv08.c##\n{##  8 ##src/server/serv08.c##\n    int     i, listenfd, connfd;##  9 ##src/server/serv08.c##\n    void    sig_int(int), thread_make(int);## 10 ##src/server/serv08.c##\n    socklen_t addrlen, clilen;## 11 ##src/server/serv08.c##\n    struct sockaddr *cliaddr;## 12 ##src/server/serv08.c##\n\n    if (argc == 3)## 13 ##src/server/serv08.c##\n        listenfd = Tcp_listen(NULL, argv[1], &addrlen);## 14 ##src/server/serv08.c##\n    else if (argc == 4)## 15 ##src/server/serv08.c##\n        listenfd = Tcp_listen(argv[1], argv[2], &addrlen);## 16 ##src/server/serv08.c##\n    else## 17 ##src/server/serv08.c##\n        err_quit(\"usage: serv08 [ <host> ] <port#> <#threads>\");## 18 ##src/server/serv08.c##\n    cliaddr = Malloc(addrlen);## 19 ##src/server/serv08.c##\n\n    nthreads = atoi(argv[argc - 1]);## 20 ##src/server/serv08.c##\n    tptr = Calloc(nthreads, sizeof(Thread));## 21 ##src/server/serv08.c##\n    iget = iput = 0;## 22 ##src/server/serv08.c##\n\n    /* 4create all the threads */## 23 ##src/server/serv08.c##\n    for (i = 0; i < nthreads; i++)## 24 ##src/server/serv08.c##\n        thread_make(i);         /* only main thread returns */## 25 ##src/server/serv08.c##\n\n    Signal(SIGINT, sig_int);## 26 ##src/server/serv08.c##\n\n    for (;;) {## 27 ##src/server/serv08.c##\n        clilen = addrlen;## 28 ##src/server/serv08.c##\n        connfd = Accept(listenfd, cliaddr, &clilen);## 29 ##src/server/serv08.c##\n\n        Pthread_mutex_lock(&clifd_mutex);## 30 ##src/server/serv08.c##\n        clifd[iput] = connfd;## 31 ##src/server/serv08.c##\n        if (++iput == MAXNCLI)## 32 ##src/server/serv08.c##\n            iput = 0;## 33 ##src/server/serv08.c##\n        if (iput == iget)## 34 ##src/server/serv08.c##\n            err_quit(\"iput = iget = %d\", iput);## 35 ##src/server/serv08.c##\n        Pthread_cond_signal(&clifd_cond);## 36 ##src/server/serv08.c##\n        Pthread_mutex_unlock(&clifd_mutex);## 37 ##src/server/serv08.c##\n    }## 38 ##src/server/serv08.c##\n}## 39 ##src/server/serv08.c##\n/* end serv08 */\n\nvoid## 40 ##src/server/serv08.c##\nsig_int(int signo)## 41 ##src/server/serv08.c##\n{## 42 ##src/server/serv08.c##\n    int     i;## 43 ##src/server/serv08.c##\n    void    pr_cpu_time(void);## 44 ##src/server/serv08.c##\n\n    pr_cpu_time();## 45 ##src/server/serv08.c##\n\n    for (i = 0; i < nthreads; i++)## 46 ##src/server/serv08.c##\n        printf(\"thread %d, %ld connections\\n\", i, tptr[i].thread_count);## 47 ##src/server/serv08.c##\n\n    exit(0);## 48 ##src/server/serv08.c##\n}## 49 ##src/server/serv08.c##\n"
  },
  {
    "path": "server/serv09.c",
    "content": "/* include serv09 */\n#include\t\"unpthread.h\"\n#include\t\"pthread09.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\ti;\n\tvoid\tsig_int(int), thread_make(int);\n\n\tif (argc == 3)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 4)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: serv09 [ <host> ] <port#> <#threads>\");\n\tnthreads = atoi(argv[argc-1]);\n\ttptr = Calloc(nthreads, sizeof(Thread));\n\n\tfor (i = 0; i < nthreads; i++)\n\t\tthread_make(i);\t\t\t/* only main thread returns */\n\n\tSignal(SIGINT, sig_int);\n\n\tfor ( ; ; )\n\t\tpause();\t/* everything done by threads */\n}\n/* end serv09 */\n\nvoid\nsig_int(int signo)\n{\n\tint\t\ti;\n\tvoid\tpr_cpu_time(void);\n\n\tpr_cpu_time();\n\n\tfor (i = 0; i < nthreads; i++)\n\t\tprintf(\"thread %d, %ld connections\\n\", i, tptr[i].thread_count);\n\n\texit(0);\n}\n"
  },
  {
    "path": "server/sig_chld_waitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {\n\t\t/* printf(\"child %d terminated\\n\", pid); */\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "server/unpthread.h",
    "content": "/* Our own header for the programs that use threads.\n   Include this file, instead of \"unp.h\". */\n\n#ifndef\t__unp_pthread_h\n#define\t__unp_pthread_h\n\n#include\t\"unp.h\"\n\nvoid\tPthread_create(pthread_t *, const pthread_attr_t *,\n\t\t\t\t\t   void * (*)(void *), void *);\nvoid\tPthread_join(pthread_t, void **);\nvoid\tPthread_detach(pthread_t);\nvoid\tPthread_kill(pthread_t, int);\n\nvoid\tPthread_mutexattr_init(pthread_mutexattr_t *);\nvoid\tPthread_mutexattr_setpshared(pthread_mutexattr_t *, int);\nvoid\tPthread_mutex_init(pthread_mutex_t *, pthread_mutexattr_t *);\nvoid\tPthread_mutex_lock(pthread_mutex_t *);\nvoid\tPthread_mutex_unlock(pthread_mutex_t *);\n\nvoid\tPthread_cond_broadcast(pthread_cond_t *);\nvoid\tPthread_cond_signal(pthread_cond_t *);\nvoid\tPthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);\nvoid\tPthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,\n\t\t\t\t\t\t\t   const struct timespec *);\n\nvoid\tPthread_key_create(pthread_key_t *, void (*)(void *));\nvoid\tPthread_setspecific(pthread_key_t, const void *);\nvoid\tPthread_once(pthread_once_t *, void (*)(void));\n\n#endif\t/* __unp_pthread_h */\n"
  },
  {
    "path": "server/web_child.c",
    "content": "#include\t\"unp.h\"\n\n#define\tMAXN\t16384\t\t/* max # bytes client can request */\n\nvoid\nweb_child(int sockfd)\n{\n\tint\t\t\tntowrite;\n\tssize_t\t\tnread;\n\tchar\t\tline[MAXLINE], result[MAXN];\n\n\tfor ( ; ; ) {\n\t\tif ( (nread = Readline(sockfd, line, MAXLINE)) == 0)\n\t\t\treturn;\t\t/* connection closed by other end */\n\n\t\t\t/* 4line from client specifies #bytes to write back */\n\t\tntowrite = atol(line);\n\t\tif ((ntowrite <= 0) || (ntowrite > MAXN))\n\t\t\terr_quit(\"client request for %d bytes\", ntowrite);\n\n\t\tWriten(sockfd, result, ntowrite);\n\t}\n}\n"
  },
  {
    "path": "server/web_child_r.c",
    "content": "#include\t\"unp.h\"\n#include\t\"readline_r.h\"\n\n#define\tMAXN\t16384\t\t/* max #bytes that a client can request */\n\nvoid\nweb_child(int sockfd)\n{\n\tint\t\t\tntowrite;\n\tssize_t\t\tnread;\n\tchar\t\tline[MAXLINE], result[MAXN];\n\tRline\t\trline;\n\n\treadline_rinit(sockfd, line, MAXLINE, &rline);\n\tfor ( ; ; ) {\n\t\tif ( (nread = Readline_r(&rline)) == 0)\n\t\t\treturn;\t\t/* connection closed by other end */\n\n\t\t\t/* line from client specifies #bytes to write back */\n\t\tntowrite = atol(line);\n\t\tif ((ntowrite <= 0) || (ntowrite > MAXN))\n\t\t\terr_quit(\"client request for %d bytes\", ntowrite);\n\n\t\tWriten(sockfd, result, ntowrite);\n\t}\n}\n"
  },
  {
    "path": "sigio/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tudpcli01 udpserv01\n\nall:\t${PROGS}\n\nudpcli01:\tudpcli01.o dgcli01.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o dgcli01.o ${LIBS}\n\nudpserv01:\tudpserv01.o dgecho01.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv01.o dgecho01.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "sigio/dgcli01.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "sigio/dgecho01.c",
    "content": "/* include dgecho1 */\n#include\t\"unp.h\"\n\nstatic int\t\tsockfd;\n\n#define\tQSIZE\t   8\t\t/* size of input queue */\n#define\tMAXDG\t4096\t\t/* max datagram size */\n\ntypedef struct {\n  void\t\t*dg_data;\t\t/* ptr to actual datagram */\n  size_t\tdg_len;\t\t\t/* length of datagram */\n  struct sockaddr  *dg_sa;\t/* ptr to sockaddr{} w/client's address */\n  socklen_t\tdg_salen;\t\t/* length of sockaddr{} */\n} DG;\nstatic DG\tdg[QSIZE];\t\t\t/* queue of datagrams to process */\nstatic long\tcntread[QSIZE+1];\t/* diagnostic counter */\n\nstatic int\tiget;\t\t/* next one for main loop to process */\nstatic int\tiput;\t\t/* next one for signal handler to read into */\nstatic int\tnqueue;\t\t/* # on queue for main loop to process */\nstatic socklen_t clilen;/* max length of sockaddr{} */\n\nstatic void\tsig_io(int);\nstatic void\tsig_hup(int);\n/* end dgecho1 */\n\n/* include dgecho2 */\nvoid\ndg_echo(int sockfd_arg, SA *pcliaddr, socklen_t clilen_arg)\n{\n\tint\t\t\ti;\n\tconst int\ton = 1;\n\tsigset_t\tzeromask, newmask, oldmask;\n\n\tsockfd = sockfd_arg;\n\tclilen = clilen_arg;\n\n\tfor (i = 0; i < QSIZE; i++) {\t/* init queue of buffers */\n\t\tdg[i].dg_data = Malloc(MAXDG);\n\t\tdg[i].dg_sa = Malloc(clilen);\n\t\tdg[i].dg_salen = clilen;\n\t}\n\tiget = iput = nqueue = 0;\n\n\tSignal(SIGHUP, sig_hup);\n\tSignal(SIGIO, sig_io);\n\tFcntl(sockfd, F_SETOWN, getpid());\n\tIoctl(sockfd, FIOASYNC, &on);\n\tIoctl(sockfd, FIONBIO, &on);\n\n\tSigemptyset(&zeromask);\t\t/* init three signal sets */\n\tSigemptyset(&oldmask);\n\tSigemptyset(&newmask);\n\tSigaddset(&newmask, SIGIO);\t/* signal we want to block */\n\n\tSigprocmask(SIG_BLOCK, &newmask, &oldmask);\n\tfor ( ; ; ) {\n\t\twhile (nqueue == 0)\n\t\t\tsigsuspend(&zeromask);\t/* wait for datagram to process */\n\n\t\t\t/* 4unblock SIGIO */\n\t\tSigprocmask(SIG_SETMASK, &oldmask, NULL);\n\n\t\tSendto(sockfd, dg[iget].dg_data, dg[iget].dg_len, 0,\n\t\t\t   dg[iget].dg_sa, dg[iget].dg_salen);\n\n\t\tif (++iget >= QSIZE)\n\t\t\tiget = 0;\n\n\t\t\t/* 4block SIGIO */\n\t\tSigprocmask(SIG_BLOCK, &newmask, &oldmask);\n\t\tnqueue--;\n\t}\n}\n/* end dgecho2 */\n\n/* include sig_io */\nstatic void\nsig_io(int signo)\n{\n\tssize_t\t\tlen;\n\tint\t\t\tnread;\n\tDG\t\t\t*ptr;\n\n\tfor (nread = 0; ; ) {\n\t\tif (nqueue >= QSIZE)\n\t\t\terr_quit(\"receive overflow\");\n\n\t\tptr = &dg[iput];\n\t\tptr->dg_salen = clilen;\n\t\tlen = recvfrom(sockfd, ptr->dg_data, MAXDG, 0,\n\t\t\t\t\t   ptr->dg_sa, &ptr->dg_salen);\n\t\tif (len < 0) {\n\t\t\tif (errno == EWOULDBLOCK)\n\t\t\t\tbreak;\t\t/* all done; no more queued to read */\n\t\t\telse\n\t\t\t\terr_sys(\"recvfrom error\");\n\t\t}\n\t\tptr->dg_len = len;\n\n\t\tnread++;\n\t\tnqueue++;\n\t\tif (++iput >= QSIZE)\n\t\t\tiput = 0;\n\n\t}\n\tcntread[nread]++;\t\t/* histogram of # datagrams read per signal */\n}\n/* end sig_io */\n\n/* include sig_hup */\nstatic void\nsig_hup(int signo)\n{\n\tint\t\ti;\n\n\tfor (i = 0; i <= QSIZE; i++)\n\t\tprintf(\"cntread[%d] = %ld\\n\", i, cntread[i]);\n}\n/* end sig_hup */\n"
  },
  {
    "path": "sigio/dgecho01.lc",
    "content": "/* include dgecho1 */\n#include    \"unp.h\"##  1 ##src/sigio/dgecho01.c##\n\nstatic int sockfd;##  2 ##src/sigio/dgecho01.c##\n\n#define QSIZE      8            /* size of input queue */##  3 ##src/sigio/dgecho01.c##\n#define MAXDG   4096            /* maximum datagram size */##  4 ##src/sigio/dgecho01.c##\n\ntypedef struct {##  5 ##src/sigio/dgecho01.c##\n    void   *dg_data;            /* ptr to actual datagram */##  6 ##src/sigio/dgecho01.c##\n    size_t  dg_len;             /* length of datagram */##  7 ##src/sigio/dgecho01.c##\n    struct sockaddr *dg_sa;     /* ptr to sockaddr{} w/client's address */##  8 ##src/sigio/dgecho01.c##\n    socklen_t dg_salen;         /* length of sockaddr{} */##  9 ##src/sigio/dgecho01.c##\n} DG;## 10 ##src/sigio/dgecho01.c##\nstatic DG dg[QSIZE];            /* the queue of datagrams to process */## 11 ##src/sigio/dgecho01.c##\nstatic long cntread[QSIZE + 1]; /* diagnostic counter */## 12 ##src/sigio/dgecho01.c##\n\nstatic int iget;                /* next one for main loop to process */## 13 ##src/sigio/dgecho01.c##\nstatic int iput;                /* next one for signal handler to read into */## 14 ##src/sigio/dgecho01.c##\nstatic int nqueue;              /* #on queue for main loop to process */## 15 ##src/sigio/dgecho01.c##\nstatic socklen_t clilen;        /* max length of sockaddr{} */## 16 ##src/sigio/dgecho01.c##\n\nstatic void sig_io(int);## 17 ##src/sigio/dgecho01.c##\nstatic void sig_hup(int);## 18 ##src/sigio/dgecho01.c##\n/* end dgecho1 */\n\n/* include dgecho2 */\nvoid## 19 ##src/sigio/dgecho01.c##\ndg_echo(int sockfd_arg, SA *pcliaddr, socklen_t clilen_arg)## 20 ##src/sigio/dgecho01.c##\n{## 21 ##src/sigio/dgecho01.c##\n    int     i;## 22 ##src/sigio/dgecho01.c##\n    const int on = 1;## 23 ##src/sigio/dgecho01.c##\n    sigset_t zeromask, newmask, oldmask;## 24 ##src/sigio/dgecho01.c##\n\n    sockfd = sockfd_arg;## 25 ##src/sigio/dgecho01.c##\n    clilen = clilen_arg;## 26 ##src/sigio/dgecho01.c##\n\n    for (i = 0; i < QSIZE; i++) {   /* init queue of buffers */## 27 ##src/sigio/dgecho01.c##\n        dg[i].dg_data = Malloc(MAXDG);## 28 ##src/sigio/dgecho01.c##\n        dg[i].dg_sa = Malloc(clilen);## 29 ##src/sigio/dgecho01.c##\n        dg[i].dg_salen = clilen;## 30 ##src/sigio/dgecho01.c##\n    }## 31 ##src/sigio/dgecho01.c##\n    iget = iput = nqueue = 0;## 32 ##src/sigio/dgecho01.c##\n\n    Signal(SIGHUP, sig_hup);## 33 ##src/sigio/dgecho01.c##\n    Signal(SIGIO, sig_io);## 34 ##src/sigio/dgecho01.c##\n    Fcntl(sockfd, F_SETOWN, getpid());## 35 ##src/sigio/dgecho01.c##\n    Ioctl(sockfd, FIOASYNC, &on);## 36 ##src/sigio/dgecho01.c##\n    Ioctl(sockfd, FIONBIO, &on);## 37 ##src/sigio/dgecho01.c##\n\n    Sigemptyset(&zeromask);     /* init three signal sets */## 38 ##src/sigio/dgecho01.c##\n    Sigemptyset(&oldmask);## 39 ##src/sigio/dgecho01.c##\n    Sigemptyset(&newmask);## 40 ##src/sigio/dgecho01.c##\n    Sigaddset(&newmask, SIGIO); /* the signal we want to block */## 41 ##src/sigio/dgecho01.c##\n\n    Sigprocmask(SIG_BLOCK, &newmask, &oldmask);## 42 ##src/sigio/dgecho01.c##\n    for (;;) {## 43 ##src/sigio/dgecho01.c##\n        while (nqueue == 0)## 44 ##src/sigio/dgecho01.c##\n            sigsuspend(&zeromask);  /* wait for a datagram to process */## 45 ##src/sigio/dgecho01.c##\n\n        /* 4unblock SIGIO */## 46 ##src/sigio/dgecho01.c##\n        Sigprocmask(SIG_SETMASK, &oldmask, NULL);## 47 ##src/sigio/dgecho01.c##\n\n        Sendto(sockfd, dg[iget].dg_data, dg[iget].dg_len, 0,## 48 ##src/sigio/dgecho01.c##\n               dg[iget].dg_sa, dg[iget].dg_salen);## 49 ##src/sigio/dgecho01.c##\n\n        if (++iget >= QSIZE)## 50 ##src/sigio/dgecho01.c##\n            iget = 0;## 51 ##src/sigio/dgecho01.c##\n\n        /* 4block SIGIO */## 52 ##src/sigio/dgecho01.c##\n        Sigprocmask(SIG_BLOCK, &newmask, &oldmask);## 53 ##src/sigio/dgecho01.c##\n        nqueue--;## 54 ##src/sigio/dgecho01.c##\n    }## 55 ##src/sigio/dgecho01.c##\n}## 56 ##src/sigio/dgecho01.c##\n/* end dgecho2 */\n\n/* include sig_io */\nstatic void## 57 ##src/sigio/dgecho01.c##\nsig_io(int signo)## 58 ##src/sigio/dgecho01.c##\n{## 59 ##src/sigio/dgecho01.c##\n    ssize_t len;## 60 ##src/sigio/dgecho01.c##\n    int     nread;## 61 ##src/sigio/dgecho01.c##\n    DG     *ptr;## 62 ##src/sigio/dgecho01.c##\n\n    for (nread = 0;;) {## 63 ##src/sigio/dgecho01.c##\n        if (nqueue >= QSIZE)## 64 ##src/sigio/dgecho01.c##\n            err_quit(\"receive overflow\");## 65 ##src/sigio/dgecho01.c##\n\n        ptr = &dg[iput];## 66 ##src/sigio/dgecho01.c##\n        ptr->dg_salen = clilen;## 67 ##src/sigio/dgecho01.c##\n        len = recvfrom(sockfd, ptr->dg_data, MAXDG, 0,## 68 ##src/sigio/dgecho01.c##\n                       ptr->dg_sa, &ptr->dg_salen);## 69 ##src/sigio/dgecho01.c##\n        if (len < 0) {## 70 ##src/sigio/dgecho01.c##\n            if (errno == EWOULDBLOCK)## 71 ##src/sigio/dgecho01.c##\n                break;          /* all done; no more queued to read */## 72 ##src/sigio/dgecho01.c##\n            else## 73 ##src/sigio/dgecho01.c##\n                err_sys(\"recvfrom error\");## 74 ##src/sigio/dgecho01.c##\n        }## 75 ##src/sigio/dgecho01.c##\n        ptr->dg_len = len;## 76 ##src/sigio/dgecho01.c##\n\n        nread++;## 77 ##src/sigio/dgecho01.c##\n        nqueue++;## 78 ##src/sigio/dgecho01.c##\n        if (++iput >= QSIZE)## 79 ##src/sigio/dgecho01.c##\n            iput = 0;## 80 ##src/sigio/dgecho01.c##\n\n    }## 81 ##src/sigio/dgecho01.c##\n    cntread[nread]++;           /* histogram of #datagrams read per signal */## 82 ##src/sigio/dgecho01.c##\n}## 83 ##src/sigio/dgecho01.c##\n/* end sig_io */\n\n/* include sig_hup */\nstatic void## 84 ##src/sigio/dgecho01.c##\nsig_hup(int signo)## 85 ##src/sigio/dgecho01.c##\n{## 86 ##src/sigio/dgecho01.c##\n    int     i;## 87 ##src/sigio/dgecho01.c##\n\n    for (i = 0; i <= QSIZE; i++)## 88 ##src/sigio/dgecho01.c##\n        printf(\"cntread[%d] = %ld\\n\", i, cntread[i]);## 89 ##src/sigio/dgecho01.c##\n}## 90 ##src/sigio/dgecho01.c##\n/* end sig_hup */\n"
  },
  {
    "path": "sigio/script.1",
    "content": "#!/bin/sh\n\n./udpcli01 140.252.13.35 < /usr/share/misc/termcap > /home/rstevens/temp.1 &\n./udpcli01 140.252.13.35 < /usr/share/misc/termcap > /home/rstevens/temp.2 &\n./udpcli01 140.252.13.35 < /usr/share/misc/termcap > /home/rstevens/temp.3 &\n./udpcli01 140.252.13.35 < /usr/share/misc/termcap > /home/rstevens/temp.4 &\n./udpcli01 140.252.13.35 < /usr/share/misc/termcap > /home/rstevens/temp.5 &\n./udpcli01 140.252.13.35 < /usr/share/misc/termcap > /home/rstevens/temp.6 &\n\nwait\n"
  },
  {
    "path": "sigio/script.2",
    "content": "#!/bin/sh\n\n./udpcli01 140.252.13.37 < /usr/share/lib/termcap > /home/rstevens/temp.1 &\n./udpcli01 140.252.13.37 < /usr/share/lib/termcap > /home/rstevens/temp.2 &\n./udpcli01 140.252.13.37 < /usr/share/lib/termcap > /home/rstevens/temp.3 &\n./udpcli01 140.252.13.37 < /usr/share/lib/termcap > /home/rstevens/temp.4 &\n./udpcli01 140.252.13.37 < /usr/share/lib/termcap > /home/rstevens/temp.5 &\n./udpcli01 140.252.13.37 < /usr/share/lib/termcap > /home/rstevens/temp.6 &\n\nwait\n"
  },
  {
    "path": "sigio/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli01 <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "sigio/udpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "sock/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tsock\nOBJS = buffers.o cliopen.o crlf.o error.o looptcp.o loopudp.o \\\n\t   main.o multicast.o pattern.o servopen.o sleepus.o sockopts.o \\\n\t   sourceroute.o sourcetcp.o sourceudp.o sinktcp.o sinkudp.o \\\n\t   tellwait.o write.o\n\nall:\t${PROGS}\n\n${OBJS}: sock.h\n\nsock:\t${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ ${OBJS} ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} core core.* *.o temp.* *.out typescript*\n"
  },
  {
    "path": "sock/README",
    "content": "\tThe source files in this directory are all copyrighted (c) 1993 by\nW. Richard Stevens.  \n\n\tThis source files in this directory assume tab stops every 4 positions,\nnot every 8 (the default).  Just \":set tabstop=4\" in vi, for example.\n\n\tIf your system doesn't define the POSIX.1 ssize_t data type, then\ndelete the appropriate #ifdef/#endif lines at the beginning of \"ourhdr.h\".\n\n\tIf your system's <stdlib.h> doesn't define the variables for getopt(),\nthen delete the appropriate #ifdef/#endif lines at the beginning of \"ourhdr.h\".\n\n\tIf your system doesn't support send() and recv() (e.g., OSF/1) then\ndelete the appropriate #ifdef/#endif lines at the beginning of \"ourhdr.h\".\n"
  },
  {
    "path": "sock/TODO",
    "content": "- With -v print IP address after gethostbyname returns.\n\n- First, option to write() in small chunks.  Then option to use writev()\n  instead of write().  See what happens, with and without TCO_NODELAY.\n"
  },
  {
    "path": "sock/buffers.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nvoid\nbuffers(int sockfd)\n{\n\tint\t\t\tn;\n\tsocklen_t\toptlen;\n\n\t\t/* Allocate the read and write buffers. */\n\n\tif (rbuf == NULL) {\n\t\tif ( (rbuf = malloc(readlen)) == NULL)\n\t\t\terr_sys(\"malloc error for read buffer\");\n\t}\n\n\tif (wbuf == NULL) {\n\t\tif ( (wbuf = malloc(writelen)) == NULL)\n\t\t\terr_sys(\"malloc error for write buffer\");\n\t}\n\n\t\t/* Set the socket send and receive buffer sizes (if specified).\n\t\t   The receive buffer size is tied to TCP's advertised window. */\n\n\tif (rcvbuflen) {\n\t\tif (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen,\n\t\t\t\t\t\t\t\t\t\t\t\t\tsizeof(rcvbuflen)) < 0)\n\t\t\terr_sys(\"SO_RCVBUF setsockopt error\");\n\t\n\t\toptlen = sizeof(n);\n\t\tif (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, &optlen) < 0)\n\t\t\terr_sys(\"SO_RCVBUF getsockopt error\");\n\t\tif (n != rcvbuflen)\n\t\t\terr_quit(\"rcvbuflen = %d, SO_RCVBUF = %d\", rcvbuflen, n);\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_RCVBUF = %d\\n\", n);\n\t}\n\n\tif (sndbuflen) {\n\t\tif (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuflen,\n\t\t\t\t\t\t\t\t\t\t\t\t\tsizeof(sndbuflen)) < 0)\n\t\t\terr_sys(\"SO_SNDBUF setsockopt error\");\n\t\n\t\toptlen = sizeof(n);\n\t\tif (getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &n, &optlen) < 0)\n\t\t\terr_sys(\"SO_SNDBUF getsockopt error\");\n\t\tif (n != sndbuflen)\n\t\t\terr_quit(\"sndbuflen = %d, SO_SNDBUF = %d\", sndbuflen, n);\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_SNDBUF = %d\\n\", n);\n\t}\n}\n"
  },
  {
    "path": "sock/cliopen.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nint\ncliopen(char *host, char *port)\n{\n\tint\t\t\t\t\tfd, i, on;\n\tconst char\t\t\t*protocol;\n\tstruct in_addr\t\tinaddr;\n\tstruct servent\t\t*sp;\n\tstruct hostent\t\t*hp;\n\n\tprotocol = udp ? \"udp\" : \"tcp\";\n\n\t\t/* initialize socket address structure */\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\n\t\t/* see if \"port\" is a service name or number */\n\tif ( (i = atoi(port)) == 0) {\n\t\tif ( (sp = getservbyname(port, protocol)) == NULL)\n\t\t\terr_quit(\"getservbyname() error for: %s/%s\", port, protocol);\n\n\t\tservaddr.sin_port = sp->s_port;\n\t} else\n\t\tservaddr.sin_port = htons(i);\n\n\t/*\n\t * First try to convert the host name as a dotted-decimal number.\n\t * Only if that fails do we call gethostbyname().\n\t */\n\n\tif (inet_aton(host, &inaddr) == 1)\n\t\tservaddr.sin_addr = inaddr;\t/* it's dotted-decimal */\n\telse if ( (hp = gethostbyname(host)) != NULL)\n\t\tmemcpy(&servaddr.sin_addr, hp->h_addr, hp->h_length);\n\telse\n\t\terr_quit(\"invalid hostname: %s\", host);\n\n\tif ( (fd = socket(AF_INET, udp ? SOCK_DGRAM : SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket() error\");\n\n\tif (reuseaddr) {\n\t\ton = 1;\n\t\tif (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0)\n\t\t\terr_sys(\"setsockopt of SO_REUSEADDR error\");\n\t}\n\n#ifdef\tSO_REUSEPORT\n\tif (reuseport) {\n\t\ton = 1;\n\t\tif (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof (on)) < 0)\n\t\t\terr_sys(\"setsockopt of SO_REUSEPORT error\");\n\t}\n#endif\n\n\t/*\n\t * User can specify port number for client to bind.  Only real use\n\t * is to see a TCP connection initiated by both ends at the same time.\n\t * Also, if UDP is being used, we specifically call bind() to assign\n\t * an ephemeral port to the socket.\n\t * Also, for experimentation, client can also set local IP address\n\t * (and port) using -l option.  Allow localip[] to be set but bindport\n\t * to be 0.\n\t */\n\n\tif (bindport != 0 || localip[0] != 0 || udp) {\n\t\tbzero(&cliaddr, sizeof(cliaddr));\n\t\tcliaddr.sin_family      = AF_INET;\n\t\tcliaddr.sin_port        = htons(bindport);\t\t\t/* can be 0 */\n\t\tif (localip[0] != 0) {\n\t\t\tif (inet_aton(localip, &cliaddr.sin_addr) == 0)\n\t\t\t\terr_quit(\"invalid IP address: %s\", localip);\n\t\t} else\n\t\t\tcliaddr.sin_addr.s_addr = htonl(INADDR_ANY);\t/* wildcard */\n\n\t\tif (bind(fd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0)\n\t\t\terr_sys(\"bind() error\");\n\t}\n\n\t/* Need to allocate buffers before connect(), since they can affect\n\t * TCP options (window scale, etc.).\n\t */\n\n\tbuffers(fd);\n\tsockopts(fd, 0);\t/* may also want to set SO_DEBUG */\n\n\t/*\n\t * Connect to the server.  Required for TCP, optional for UDP.\n\t */\n\n\tif (udp == 0 || connectudp) {\n\t\tfor ( ; ; ) {\n\t\t\tif (connect(fd, (struct sockaddr *) &servaddr, sizeof(servaddr))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t== 0)\n\t\t\t\tbreak;\t\t/* all OK */\n\t\t\tif (errno == EINTR)\t\t/* can happen with SIGIO */\n\t\t\t\tcontinue;\n\t\t\tif (errno == EISCONN)\t/* can happen with SIGIO */\n\t\t\t\tbreak;\n\t\t\terr_sys(\"connect() error\");\n\t\t}\n\t}\n\n\tif (verbose) {\n\t\t\t/* Call getsockname() to find local address bound to socket:\n\t\t\t   TCP ephemeral port was assigned by connect() or bind();\n\t\t\t   UDP ephemeral port was assigned by bind(). */\n\t\ti = sizeof(cliaddr);\n\t\tif (getsockname(fd, (struct sockaddr *) &cliaddr, &i) < 0)\n\t\t\terr_sys(\"getsockname() error\");\n\n\t\t\t\t\t/* Can't do one fprintf() since inet_ntoa() stores\n\t\t\t\t\t   the result in a static location. */\n\t\tfprintf(stderr, \"connected on %s.%d \",\n\t\t\t\t\tINET_NTOA(cliaddr.sin_addr), ntohs(cliaddr.sin_port));\n\t\tfprintf(stderr, \"to %s.%d\\n\",\n\t\t\t\t\tINET_NTOA(servaddr.sin_addr), ntohs(servaddr.sin_port));\n\t}\n\n\tsockopts(fd, 1);\t/* some options get set after connect() */\n\n\treturn(fd);\n}\n"
  },
  {
    "path": "sock/crlf.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\n/* Convert newline to return/newline. */\n\nint\ncrlf_add(char *dst, int dstsize, const char *src, int lenin)\n{\n\tint \tlenout;\n\tchar\tc;\n\n\tif ( (lenout = lenin) > dstsize)\n\t\t\terr_quit(\"crlf_add: destination not big enough\");\n\n\tfor ( ; lenin > 0; lenin--) {\n\t\tif ( (c = *src++) == '\\n') {\n\t\t\tif (++lenout >= dstsize)\n\t\t\t\terr_quit(\"crlf_add: destination not big enough\");\n\t\t\t*dst++ = '\\r';\n\t\t}\n\t\t*dst++ = c;\n\t}\n\n\treturn(lenout);\n}\n\nint\ncrlf_strip(char *dst, int dstsize, const char *src, int lenin)\n{\n\tint\t\tlenout;\n\tchar\tc;\n\n\tfor (lenout = 0; lenin > 0; lenin--) { \n\t\tif ( (c = *src++) != '\\r') {\n\t\t\tif (++lenout >= dstsize)\n\t\t\t\terr_quit(\"crlf_strip: destination not big enough\");\n\t\t\t*dst++ = c;\n\t\t}\n\t}\n\n\treturn(lenout);\n}\n"
  },
  {
    "path": "sock/error.c",
    "content": "#include\t<errno.h>\t\t/* for definition of errno */\n#include\t<stdarg.h>\t\t/* ANSI C header file */\n#include\t\"ourhdr.h\"\n\nstatic void\terr_doit(int, const char *, va_list);\n\nchar\t*pname = NULL;\t\t/* caller can set this from argv[0] */\n\n/* Nonfatal error related to a system call.\n * Print a message and return. */\n\nvoid\n/* $f err_ret $ */\nerr_ret(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(1, fmt, ap);\n\tva_end(ap);\n\treturn;\n}\n\n/* Fatal error related to a system call.\n * Print a message and terminate. */\n\nvoid\n/* $f err_sys $ */\nerr_sys(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(1, fmt, ap);\n\tva_end(ap);\n\texit(1);\n}\n\n/* Fatal error related to a system call.\n * Print a message, dump core, and terminate. */\n\nvoid\n/* $f err_dump $ */\nerr_dump(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(1, fmt, ap);\n\tva_end(ap);\n\tabort();\t\t/* dump core and terminate */\n\texit(1);\t\t/* shouldn't get here */\n}\n\n/* Nonfatal error unrelated to a system call.\n * Print a message and return. */\n\nvoid\n/* $f err_msg $ */\nerr_msg(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(0, fmt, ap);\n\tva_end(ap);\n\treturn;\n}\n\n/* Fatal error unrelated to a system call.\n * Print a message and terminate. */\n\nvoid\n/* $f err_quit $ */\nerr_quit(const char *fmt, ...)\n{\n\tva_list\t\tap;\n\n\tva_start(ap, fmt);\n\terr_doit(0, fmt, ap);\n\tva_end(ap);\n\texit(1);\n}\n\n/* Print a message and return to caller.\n * Caller specifies \"errnoflag\". */\n\nstatic void\nerr_doit(int errnoflag, const char *fmt, va_list ap)\n{\n\tint\t\terrno_save;\n\tchar\tbuf[MAXLINE];\n\n\terrno_save = errno;\t\t/* value caller might want printed */\n\tvsprintf(buf, fmt, ap);\n\tif (errnoflag)\n\t\tsprintf(buf+strlen(buf), \": %s\", strerror(errno_save));\n\tstrcat(buf, \"\\n\");\n\tfflush(stdout);\t\t/* in case stdout and stderr are the same */\n\tfputs(buf, stderr);\n\tfflush(stderr);\t\t/* SunOS 4.1.* doesn't grok NULL argument */\n\treturn;\n}\n"
  },
  {
    "path": "sock/loop.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\n/* Copy everything from stdin to \"sockfd\",\n * and everything from \"sockfd\" to stdout. */\n\nvoid\ttty_atexit(void);\t/* in library */\nvoid\tsig_catch(int);\t\t/* my function */\n\nvoid\nloop(int sockfd)\n{\n\tint\t\t\t\t\t\tmaxfdp1, nread, ntowrite, stdineof, clilen;\n\tfd_set\t\t\t\t\trset;\n\tstruct sockaddr_in\t\tcliaddr;\t\t/* for UDP server */\n\n#ifdef\tMSG_TRUNC\t\t\t/* 4.3BSD Reno and later */\n\tstruct iovec\t\t\tiov[1];\n\tstruct msghdr\t\t\tmsg;\n\n#ifdef\tIP_RECVDSTADDR\t\t/* 4.3BSD Reno and later */\n\tstatic struct cmsghdr  *cmptr = NULL;\t/* malloc'ed */\n\tstruct in_addr\t\t\tdstinaddr;\t\t/* for UDP server */\n#define\tCONTROLLEN\t(sizeof(struct cmsghdr) + sizeof(struct in_addr))\n#endif\t/* IP_RECVDSTADDR */\n\n#endif\t/* MSG_TRUNC */\n\n#ifdef\tnotdef\t/* following doesn't appear to work */\n\t/*\n\t * This is an attempt to set stdin to cbreak, so that input characters\n\t * are delivered one at a time, to see Nagle algorithm in effect\n\t * (or disabled).\n\t */\n\tif (cbreak && isatty(STDIN_FILENO)) {\n\t\tif (tty_cbreak(STDIN_FILENO) < 0)\n\t\t\terr_sys(\"tty_cbreak error\");\n\t\tif (atexit(tty_atexit) < 0)\n\t\t\terr_sys(\"tty_atexit error\");\n\n\t\tif (signal(SIGINT, sig_catch) == SIG_ERR)\n\t\t\terr_sys(\"signal error\");\n\t\tif (signal(SIGQUIT, sig_catch) == SIG_ERR)\n\t\t\terr_sys(\"signal error\");\n\t\tif (signal(SIGTERM, sig_catch) == SIG_ERR)\n\t\t\terr_sys(\"signal error\");\n\t}\n#endif\n\n\tif (pauseinit)\n\t\tsleep(pauseinit);\t/* intended for server */\n\n\tstdineof = 0;\n\tFD_ZERO(&rset);\n\tmaxfdp1 = sockfd + 1;\t/* check descriptors [0..sockfd] */\n\n\t\t/* UDP client issues connect(), so read() and write() are used.\n\t\t   Server is harder since cannot issue connect().  We use recvfrom()\n\t\t   or recvmsg(), depending on OS. */\n\n\tfor ( ; ; ) {\n\t\tif (stdineof == 0)\n\t\t\tFD_SET(STDIN_FILENO, &rset);\n\t\tFD_SET(sockfd, &rset);\n\n\t\tif (select(maxfdp1, &rset, NULL, NULL, NULL) < 0)\n\t\t\terr_sys(\"select error\");\n\n\t\tif (FD_ISSET(STDIN_FILENO, &rset)) {\t/* data to read on stdin */\n\t\t\tif ( (nread = read(STDIN_FILENO, rbuf, readlen)) < 0)\n\t\t\t\terr_sys(\"read error from stdin\");\n\t\t\telse if (nread == 0) {\t/* EOF on stdin */\n\t\t\t\tif (halfclose) {\n\t\t\t\t\tif (shutdown(sockfd, 1) < 0)\n\t\t\t\t\t\terr_sys(\"shutdown() error\");\n\n\t\t\t\t\tFD_CLR(STDIN_FILENO, &rset);\n\t\t\t\t\tstdineof = 1;\t/* don't read stdin anymore */\n\t\t\t\t\tcontinue;\t\t/* back to select() */\n\t\t\t\t}\n\t\t\t\tbreak;\t\t/* default: stdin EOF -> done */\n\t\t\t}\n\n\t\t\tif (crlf) {\n\t\t\t\tntowrite = crlf_add(wbuf, writelen, rbuf, nread);\n\t\t\t\tif (write(sockfd, wbuf, ntowrite) != ntowrite)\n\t\t\t\t\terr_sys(\"write error\");\n\t\t\t} else {\n\t\t\t\tif (write(sockfd, rbuf, nread) != nread)\n\t\t\t\t\terr_sys(\"write error\");\n\t\t\t}\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* data to read from socket */\n\t\t\tif (udp && server) {\n\t\t\t\tclilen = sizeof(cliaddr);\n#ifndef\tMSG_TRUNC\t/* vanilla BSD sockets */\n\t\t\t\tnread = recvfrom(sockfd, rbuf, readlen, 0,\n\t\t\t\t\t\t\t\t\t(struct sockaddr *) &cliaddr, &clilen);\n\n#else\t/* 4.3BSD Reno and later; use recvmsg() to get at MSG_TRUNC flag */\n\t\t/* Also lets us get at control information (destination address) */\n\n\n\t\t\t\tiov[0].iov_base = rbuf;\n\t\t\t\tiov[0].iov_len  = readlen;\n\t\t\t\tmsg.msg_iov          = iov;\n\t\t\t\tmsg.msg_iovlen       = 1;\n\t\t\t\tmsg.msg_name         = (caddr_t) &cliaddr;\n\t\t\t\tmsg.msg_namelen      = clilen;\n\n#ifdef\tIP_RECVDSTADDR\n\t\t\t\tif (cmptr == NULL && (cmptr = malloc(CONTROLLEN)) == NULL)\n\t\t\t\t\terr_sys(\"malloc error for control buffer\");\n\n\t\t\t\tmsg.msg_control      = (caddr_t) cmptr;\t/* for dest address */\n\t\t\t\tmsg.msg_controllen   = CONTROLLEN;\n#else\n\t\t\t\tmsg.msg_control      = (caddr_t) 0;\t/* no ancillary data */\n\t\t\t\tmsg.msg_controllen   = 0;\n#endif\t/* IP_RECVDSTADDR */\n\t\t\t\tmsg.msg_flags        = 0;\t\t\t/* flags returned here */\n\n\t\t\t\tnread = recvmsg(sockfd, &msg, 0);\n#endif\t/* MSG_TRUNC */\n\t\t\t\tif (nread < 0)\n\t\t\t\t\terr_sys(\"datagram receive error\");\n\n\t\t\t\tif (verbose) {\n\t\t\t\t\tprintf(\"from %s\", INET_NTOA(cliaddr.sin_addr));\n#ifdef\tMSG_TRUNC\n#ifdef\tIP_RECVDSTADDR\n\t\t\t\t\tif (recvdstaddr) {\n\t\t\t\t\t\tif (cmptr->cmsg_level != IPPROTO_IP)\n\t\t\t\t\t\t\terr_quit(\"control level != IPPROTO_IP\");\n\t\t\t\t\t\tif (cmptr->cmsg_type != IP_RECVDSTADDR)\n\t\t\t\t\t\t\terr_quit(\"control type != IP_RECVDSTADDR\");\n\t\t\t\t\t\tif (cmptr->cmsg_len != CONTROLLEN)\n\t\t\t\t\t\t\terr_quit(\"control length (%d) != %d\",\n\t\t\t\t\t\t\t\t\t cmptr->cmsg_len, CONTROLLEN);\n\t\t\t\t\t\tmemcpy((char *) &dstinaddr, (char *) CMSG_DATA(cmptr),\n\t\t\t\t\t\t\t  sizeof(struct in_addr));\n\n\t\t\t\t\t\tprintf(\", to %s\", INET_NTOA(dstinaddr));\n\t\t\t\t\t}\n#endif\t/* IP_RECVDSTADDR */\n#endif\t/* MSG_TRUNC */\n\t\t\t\t\tprintf(\": \");\n\t\t\t\t\tfflush(stdout);\n\t\t\t\t}\n\n#ifdef\tMSG_TRUNC\n\t\t\t\tif (msg.msg_flags & MSG_TRUNC)\n\t\t\t\t\tprintf(\"(datagram truncated)\\n\");\n#endif\n\n\t\t\t} else {\n\t\t\t\tif ( (nread = read(sockfd, rbuf, readlen)) < 0)\n\t\t\t\t\terr_sys(\"read error\");\n\t\t\t\telse if (nread == 0) {\n\t\t\t\t\tif (verbose)\n\t\t\t\t\t\tfprintf(stderr, \"connection closed by peer\\n\");\n\t\t\t\t\tbreak;\t\t/* EOF, terminate */\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (crlf) {\n\t\t\t\tntowrite = crlf_strip(wbuf, writelen, rbuf, nread);\n\t\t\t\tif (writen(STDOUT_FILENO, wbuf, ntowrite) != ntowrite)\n\t\t\t\t\terr_sys(\"writen error to stdout\");\n\t\t\t} else {\n\t\t\t\tif (writen(STDOUT_FILENO, rbuf, nread) != nread)\n\t\t\t\t\terr_sys(\"writen error to stdout\");\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep(pauseclose);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n\nvoid\nsig_catch(int signo)\n{\n\texit(0);\t/* exit handler will reset tty state */\n}\n"
  },
  {
    "path": "sock/looptcp.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\n/* Copy everything from stdin to \"sockfd\",\n * and everything from \"sockfd\" to stdout. */\n\nvoid\nloop_tcp(int sockfd)\n{\n\tint\t\tmaxfdp1, nread, ntowrite, stdineof, flags;\n\tfd_set\trset;\n\n\tif (pauseinit)\n\t\tsleep_us(pauseinit*1000);\t/* intended for server */\n\n\tflags = 0;\n\tstdineof = 0;\n\tFD_ZERO(&rset);\n\tmaxfdp1 = sockfd + 1;\t/* check descriptors [0..sockfd] */\n\n\tfor ( ; ; ) {\n\t\tif (stdineof == 0)\n\t\t\tFD_SET(STDIN_FILENO, &rset);\n\t\tFD_SET(sockfd, &rset);\n\n\t\tif (select(maxfdp1, &rset, NULL, NULL, NULL) < 0)\n\t\t\terr_sys(\"select error\");\n\n\t\tif (FD_ISSET(STDIN_FILENO, &rset)) {\t/* data to read on stdin */\n\t\t\tif ( (nread = read(STDIN_FILENO, rbuf, readlen)) < 0)\n\t\t\t\terr_sys(\"read error from stdin\");\n\t\t\telse if (nread == 0) {\t/* EOF on stdin */\n\t\t\t\tif (halfclose) {\n\t\t\t\t\tif (shutdown(sockfd, SHUT_WR) < 0)\n\t\t\t\t\t\terr_sys(\"shutdown() error\");\n\n\t\t\t\t\tFD_CLR(STDIN_FILENO, &rset);\n\t\t\t\t\tstdineof = 1;\t/* don't read stdin anymore */\n\t\t\t\t\tcontinue;\t\t/* back to select() */\n\t\t\t\t}\n\t\t\t\tbreak;\t\t/* default: stdin EOF -> done */\n\t\t\t}\n\n\t\t\tif (crlf) {\n\t\t\t\tntowrite = crlf_add(wbuf, writelen, rbuf, nread);\n\t\t\t\tif (dowrite(sockfd, wbuf, ntowrite) != ntowrite)\n\t\t\t\t\terr_sys(\"write error\");\n\t\t\t} else {\n\t\t\t\tif (dowrite(sockfd, rbuf, nread) != nread)\n\t\t\t\t\terr_sys(\"write error\");\n\t\t\t}\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* data to read from socket */\n\t\t\t\t/* msgpeek = 0 or MSG_PEEK */\n\t\t\tflags = msgpeek;\n\t\toncemore:\n\t\t\tif ( (nread = recv(sockfd, rbuf, readlen, flags)) < 0)\n\t\t\t\terr_sys(\"recv error\");\n\t\t\telse if (nread == 0) {\n\t\t\t\tif (verbose)\n\t\t\t\t\tfprintf(stderr, \"connection closed by peer\\n\");\n\t\t\t\tbreak;\t\t/* EOF, terminate */\n\t\t\t}\n\n\t\t\tif (crlf) {\n\t\t\t\tntowrite = crlf_strip(wbuf, writelen, rbuf, nread);\n\t\t\t\tif (writen(STDOUT_FILENO, wbuf, ntowrite) != ntowrite)\n\t\t\t\t\terr_sys(\"writen error to stdout\");\n\t\t\t} else {\n\t\t\t\tif (writen(STDOUT_FILENO, rbuf, nread) != nread)\n\t\t\t\t\terr_sys(\"writen error to stdout\");\n\t\t\t}\n\n\t\t\tif (flags != 0) {\n\t\t\t\tflags = 0;\t\t/* no infinite loop */\n\t\t\t\tgoto oncemore;\t/* read the message again */\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep_us(pauseclose*1000);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n"
  },
  {
    "path": "sock/loopudp.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\n/* Copy everything from stdin to \"sockfd\",\n * and everything from \"sockfd\" to stdout. */\n\nvoid\nloop_udp(int sockfd)\n{\n\tint\t\t\t\t\t\tmaxfdp1, nread, ntowrite, stdineof,\n\t\t\t\t\t\t\tclilen, servlen, flags;\n\tfd_set\t\t\t\t\trset;\n\tstruct sockaddr_in\t\tcliaddr;\t\t/* for UDP server */\n\tstruct sockaddr_in\t\tservaddr;\t\t/* for UDP client */\n\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n\tstruct iovec\t\t\tiov[1];\n\tstruct msghdr\t\t\tmsg;\n\n#ifdef\tIP_RECVDSTADDR\t\t/* 4.3BSD Reno and later */\n\tstatic struct cmsghdr  *cmptr = NULL;\t/* malloc'ed */\n\tstruct in_addr\t\t\tdstinaddr;\t\t/* for UDP server */\n#define\tCONTROLLEN\t(sizeof(struct cmsghdr) + sizeof(struct in_addr))\n#endif\t/* IP_RECVDSTADDR */\n\n#endif\t/* HAVE_MSGHDR_MSG_CONTROL */\n\n\tif (pauseinit)\n\t\tsleep_us(pauseinit*1000);\t/* intended for server */\n\n\tflags = 0;\n\tstdineof = 0;\n\tFD_ZERO(&rset);\n\tmaxfdp1 = sockfd + 1;\t/* check descriptors [0..sockfd] */\n\n\t\t/* If UDP client issues connect(), recv() and write() are used.\n\t\t   Server is harder since cannot issue connect().  We use recvfrom()\n\t\t   or recvmsg(), depending on OS. */\n\n\tfor ( ; ; ) {\n\t\tif (stdineof == 0)\n\t\t\tFD_SET(STDIN_FILENO, &rset);\n\t\tFD_SET(sockfd, &rset);\n\n\t\tif (select(maxfdp1, &rset, NULL, NULL, NULL) < 0)\n\t\t\terr_sys(\"select error\");\n\n\t\tif (FD_ISSET(STDIN_FILENO, &rset)) {\t/* data to read on stdin */\n\t\t\tif ( (nread = read(STDIN_FILENO, rbuf, readlen)) < 0)\n\t\t\t\terr_sys(\"read error from stdin\");\n\t\t\telse if (nread == 0) {\t/* EOF on stdin */\n\t\t\t\tif (halfclose) {\n\t\t\t\t\tif (shutdown(sockfd, SHUT_WR) < 0)\n\t\t\t\t\t\terr_sys(\"shutdown() error\");\n\n\t\t\t\t\tFD_CLR(STDIN_FILENO, &rset);\n\t\t\t\t\tstdineof = 1;\t/* don't read stdin anymore */\n\t\t\t\t\tcontinue;\t\t/* back to select() */\n\t\t\t\t}\n\t\t\t\tbreak;\t\t/* default: stdin EOF -> done */\n\t\t\t}\n\n\t\t\tif (crlf) {\n\t\t\t\tntowrite = crlf_add(wbuf, writelen, rbuf, nread);\n\t\t\t\tif (connectudp) {\n\t\t\t\t\tif (write(sockfd, wbuf, ntowrite) != ntowrite)\n\t\t\t\t\t\terr_sys(\"write error\");\n\t\t\t\t} else {\n\t\t\t\t\tif (sendto(sockfd, wbuf, ntowrite, 0,\n\t\t\t\t\t\t  (struct sockaddr *) &servaddr, sizeof(servaddr))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   != ntowrite)\n\t\t\t\t\t\terr_sys(\"sendto error\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (connectudp) {\n\t\t\t\t\tif (write(sockfd, rbuf, nread) != nread)\n\t\t\t\t\t\terr_sys(\"write error\");\n\t\t\t\t} else {\n\t\t\t\t\tif (sendto(sockfd, rbuf, nread, 0,\n\t\t\t\t\t\t  (struct sockaddr *) &servaddr, sizeof(servaddr))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t      != nread)\n\t\t\t\t\t\terr_sys(\"sendto error\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (FD_ISSET(sockfd, &rset)) {\t/* data to read from socket */\n\t\t\tif (server) {\n\t\t\t\tclilen = sizeof(cliaddr);\n#ifndef\tHAVE_MSGHDR_MSG_CONTROL\t/* vanilla BSD sockets */\n\t\t\t\tnread = recvfrom(sockfd, rbuf, readlen, 0,\n\t\t\t\t\t\t\t\t\t(struct sockaddr *) &cliaddr, &clilen);\n\n#else\t/* 4.3BSD Reno and later; use recvmsg() to get at MSG_TRUNC flag */\n\t\t/* Also lets us get at control information (destination address) */\n\n\n\t\t\t\tiov[0].iov_base = rbuf;\n\t\t\t\tiov[0].iov_len  = readlen;\n\t\t\t\tmsg.msg_iov          = iov;\n\t\t\t\tmsg.msg_iovlen       = 1;\n\t\t\t\tmsg.msg_name         = (caddr_t) &cliaddr;\n\t\t\t\tmsg.msg_namelen      = clilen;\n\n#ifdef\tIP_RECVDSTADDR\n\t\t\t\tif (cmptr == NULL && (cmptr = malloc(CONTROLLEN)) == NULL)\n\t\t\t\t\terr_sys(\"malloc error for control buffer\");\n\n\t\t\t\tmsg.msg_control      = (caddr_t) cmptr;\t/* for dest address */\n\t\t\t\tmsg.msg_controllen   = CONTROLLEN;\n#else\n\t\t\t\tmsg.msg_control      = (caddr_t) 0;\t/* no ancillary data */\n\t\t\t\tmsg.msg_controllen   = 0;\n#endif\t/* IP_RECVDSTADDR */\n\t\t\t\tmsg.msg_flags        = 0;\t\t\t/* flags returned here */\n\n\t\t\t\tnread = recvmsg(sockfd, &msg, 0);\n#endif\t/* HAVE_MSGHDR_MSG_CONTROL */\n\t\t\t\tif (nread < 0)\n\t\t\t\t\terr_sys(\"datagram receive error\");\n\n\t\t\t\tif (verbose) {\n\t\t\t\t\tprintf(\"from %s\", INET_NTOA(cliaddr.sin_addr));\n#ifdef\tHAVE_MSGHDR_MSG_CONTROL\n#ifdef\tIP_RECVDSTADDR\n\t\t\t\t\tif (recvdstaddr) {\n\t\t\t\t\t\tif (cmptr->cmsg_len != CONTROLLEN)\n\t\t\t\t\t\t\terr_quit(\"control length (%d) != %d\",\n\t\t\t\t\t\t\t\t\t cmptr->cmsg_len, CONTROLLEN);\n\t\t\t\t\t\tif (cmptr->cmsg_level != IPPROTO_IP)\n\t\t\t\t\t\t\terr_quit(\"control level != IPPROTO_IP\");\n\t\t\t\t\t\tif (cmptr->cmsg_type != IP_RECVDSTADDR)\n\t\t\t\t\t\t\terr_quit(\"control type != IP_RECVDSTADDR\");\n\t\t\t\t\t\tmemcpy(&dstinaddr, CMSG_DATA(cmptr),\n\t\t\t\t\t\t\t  sizeof(struct in_addr));\n\t\t\t\t\t\tbzero(cmptr, CONTROLLEN);\n\n\t\t\t\t\t\tprintf(\", to %s\", INET_NTOA(dstinaddr));\n\t\t\t\t\t}\n#endif\t/* IP_RECVDSTADDR */\n#endif\t/* HAVE_MSGHDR_MSG_CONTROL */\n\t\t\t\t\tprintf(\": \");\n\t\t\t\t\tfflush(stdout);\n\t\t\t\t}\n\n#ifdef\tMSG_TRUNC\n\t\t\t\tif (msg.msg_flags & MSG_TRUNC)\n\t\t\t\t\tprintf(\"(datagram truncated)\\n\");\n#endif\n\n\t\t\t} else if (connectudp) {\n\t\t\t\t\t/* msgpeek = 0 or MSG_PEEK */\n\t\t\t\tflags = msgpeek;\n\t\t\toncemore:\n\t\t\t\tif ( (nread = recv(sockfd, rbuf, readlen, flags)) < 0)\n\t\t\t\t\terr_sys(\"recv error\");\n\t\t\t\telse if (nread == 0) {\n\t\t\t\t\tif (verbose)\n\t\t\t\t\t\tfprintf(stderr, \"connection closed by peer\\n\");\n\t\t\t\t\tbreak;\t\t/* EOF, terminate */\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t/* Must use recvfrom() for unconnected UDP client */\n\t\t\t\tservlen = sizeof(servaddr);\n\t\t\t\tnread = recvfrom(sockfd, rbuf, readlen, 0,\n\t\t\t\t\t\t\t\t (struct sockaddr *) &servaddr, &servlen);\n\t\t\t\tif (nread < 0)\n\t\t\t\t\terr_sys(\"datagram recvfrom() error\");\n\n\t\t\t\tif (verbose) {\n\t\t\t\t\tprintf(\"from %s\", INET_NTOA(servaddr.sin_addr));\n\t\t\t\t\tprintf(\": \");\n\t\t\t\t\tfflush(stdout);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (crlf) {\n\t\t\t\tntowrite = crlf_strip(wbuf, writelen, rbuf, nread);\n\t\t\t\tif (writen(STDOUT_FILENO, wbuf, ntowrite) != ntowrite)\n\t\t\t\t\terr_sys(\"writen error to stdout\");\n\t\t\t} else {\n\t\t\t\tif (writen(STDOUT_FILENO, rbuf, nread) != nread)\n\t\t\t\t\terr_sys(\"writen error to stdout\");\n\t\t\t}\n\n\t\t\tif (flags != 0) {\n\t\t\t\tflags = 0;\t\t/* no infinite loop */\n\t\t\t\tgoto oncemore;\t/* read the message again */\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep_us(pauseclose*1000);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n"
  },
  {
    "path": "sock/main.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nchar\t*host;\t\t/* hostname or dotted-decimal string */\nchar\t*port;\n\n\t\t\t/* DefinE global variables */\nint\t\tbindport;\t\t\t/* 0 or TCP or UDP port number to bind */\n\t\t\t\t\t\t\t/* set by -b or -l options */\nint\t\tbroadcast;\t\t\t/* SO_BROADCAST */\nint\t\tcbreak;\t\t\t\t/* set terminal to cbreak mode */\nint\t\tchunkwrite;\t\t\t/* write in small chunks; not all-at-once */\nint\t\tclient = 1;\t\t\t/* acting as client is the default */\nint\t\tconnectudp = 1;\t\t/* connect UDP client */\nint\t\tcrlf;\t\t\t\t/* convert newline to CR/LF & vice versa */\nint\t\tdebug;\t\t\t\t/* SO_DEBUG */\nint\t\tdofork;\t\t\t\t/* concurrent server, do a fork() */\nint\t\tdontroute;\t\t\t/* SO_DONTROUTE */\nchar\tforeignip[32];\t\t/* foreign IP address, dotted-decimal string */\nint\t\tforeignport;\t\t/* foreign port number */\nint\t\thalfclose;\t\t\t/* TCP half close option */\nint\t\tignorewerr;\t\t\t/* true if write() errors should be ignored */\nint\t\tiptos = -1;\t\t\t/* IP_TOS opton */\nint\t\tipttl = -1;\t\t\t/* IP_TTL opton */\nchar\tjoinip[32];\t\t\t/* multicast IP address, dotted-decimal string */\nint\t\tkeepalive;\t\t\t/* SO_KEEPALIVE */\nlong\tlinger = -1;\t\t/* 0 or positive turns on option */\nint\t\tlistenq = 5;\t\t/* listen queue for TCP Server */\nchar\tlocalip[32];\t\t/* local IP address, dotted-decimal string */\nint\t\tmaxseg;\t\t\t\t/* TCP_MAXSEG */\nint\t\tmcastttl;\t\t\t/* multicast TTL */\nint\t\tmsgpeek;\t\t\t/* MSG_PEEK */\nint\t\tnodelay;\t\t\t/* TCP_NODELAY (Nagle algorithm) */\nint\t\tnbuf = 1024;\t\t/* number of buffers to write (sink mode) */\nint\t\tonesbcast;\t\t\t/* set IP_ONESBCAST for 255.255.255.255 bcasts */\nint\t\tpauseclose;\t\t\t/* #ms to sleep after recv FIN, before close */\nint\t\tpauseinit;\t\t\t/* #ms to sleep before first read */\nint\t\tpauselisten;\t\t/* #ms to sleep after listen() */\nint\t\tpauserw;\t\t\t/* #ms to sleep before each read or write */\nint\t\treuseaddr;\t\t\t/* SO_REUSEADDR */\nint\t\treuseport;\t\t\t/* SO_REUSEPORT */\nint\t\treadlen = 1024;\t\t/* default read length for socket */\nint\t\twritelen = 1024;\t/* default write length for socket */\nint\t\trecvdstaddr;\t\t/* IP_RECVDSTADDR option */\nint\t\trcvbuflen;\t\t\t/* size for SO_RCVBUF */\nint\t\tsndbuflen;\t\t\t/* size for SO_SNDBUF */\nlong\trcvtimeo;\t\t\t/* SO_RCVTIMEO */\nlong\tsndtimeo;\t\t\t/* SO_SNDTIMEO */\nint\t\tsroute_cnt;\t\t\t/* count of #IP addresses in route */\nchar   *rbuf;\t\t\t\t/* pointer that is malloc'ed */\nchar   *wbuf;\t\t\t\t/* pointer that is malloc'ed */\nint\t\tserver;\t\t\t\t/* to act as server requires -s option */\nint\t\tsigio;\t\t\t\t/* send SIGIO */\nint\t\tsourcesink;\t\t\t/* source/sink mode */\nint\t\tudp;\t\t\t\t/* use UDP instead of TCP */\nint\t\turgwrite;\t\t\t/* write urgent byte after this write */\nint\t\tverbose;\t\t\t/* each -v increments this by 1 */\nint\t\tusewritev;\t\t\t/* use writev() instead of write() */\n\nstruct sockaddr_in\tcliaddr, servaddr;\n\nstatic void\tusage(const char *);\n\nint\nmain(int argc, char *argv[])\n{\n\tint\t\tc, fd;\n\tchar\t*ptr;\n\n\tif (argc < 2)\n\t\tusage(\"\");\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"2b:cf:g:hij:kl:n:op:q:r:st:uvw:x:y:ABCDEFG:H:IJ:KL:NO:P:Q:R:S:TU:VWX:YZ\")) != -1) {\n\t\tswitch (c) {\n#ifdef\tIP_ONESBCAST\n\t\tcase '2':\t\t\t/* use 255.255.255.255 as broadcast address */\n\t\t\tonesbcast = 1;\n\t\t\tbreak;\n#endif\n\n\t\tcase 'b':\n\t\t\tbindport = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'c':\t\t\t/* convert newline to CR/LF & vice versa */\n\t\t\tcrlf = 1;\n\t\t\tbreak;\n\n\t\tcase 'f':\t\t\t/* foreign IP address and port#: a.b.c.d.p */\n\t\t\tif ( (ptr = strrchr(optarg, '.')) == NULL)\n\t\t\t\tusage(\"invalid -f option\");\n\n\t\t\t*ptr++ = 0;\t\t\t\t\t/* null replaces final period */\n\t\t\tforeignport = atoi(ptr);\t/* port number */\n\t\t\tstrcpy(foreignip, optarg);\t/* save dotted-decimal IP */\n\t\t\tbreak;\n\n\t\tcase 'g':\t\t\t/* loose source route */\n\t\t\tsroute_doopt(0, optarg);\n\t\t\tbreak;\n\n\t\tcase 'h':\t\t\t/* TCP half-close option */\n\t\t\thalfclose = 1;\n\t\t\tbreak;\n\n\t\tcase 'i':\t\t\t/* source/sink option */\n\t\t\tsourcesink = 1;\n\t\t\tbreak;\n\n#ifdef\tIP_ADD_MEMBERSHIP\n\t\tcase 'j':\t\t\t/* join multicast group a.b.c.d */\n\t\t\tstrcpy(joinip, optarg);\t/* save dotted-decimal IP */\n\t\t\tbreak;\n#endif\n\n\t\tcase 'k':\t\t\t/* chunk-write option */\n\t\t\tchunkwrite = 1;\n\t\t\tbreak;\n\n\t\tcase 'l':\t\t\t/* local IP address and port#: a.b.c.d.p */\n\t\t\tif ( (ptr = strrchr(optarg, '.')) == NULL)\n\t\t\t\tusage(\"invalid -l option\");\n\n\t\t\t*ptr++ = 0;\t\t\t\t\t/* null replaces final period */\n\t\t\tbindport = atoi(ptr);\t\t/* port number */\n\t\t\tstrcpy(localip, optarg);\t/* save dotted-decimal IP */\n\t\t\tbreak;\n\n\t\tcase 'n':\t\t\t/* number of buffers to write */\n\t\t\tnbuf = atol(optarg);\n\t\t\tbreak;\n\n\t\tcase 'o':\t\t\t/* do not connect UDP client */\n\t\t\tconnectudp = 0;\n\t\t\tbreak;\n\n\t\tcase 'p':\t\t\t/* pause before each read or write */\n\t\t\tpauserw = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'q':\t\t\t/* listen queue for TCP server */\n\t\t\tlistenq = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'r':\t\t\t/* read() length */\n\t\t\treadlen = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 's':\t\t\t/* server */\n\t\t\tserver = 1;\n\t\t\tclient = 0;\n\t\t\tbreak;\n\n#ifdef\tIP_MULTICAST_TTL\n\t\tcase 't':\t\t\t/* IP_MULTICAST_TTL */\n\t\t\tmcastttl = atoi(optarg);\n\t\t\tbreak;\n#endif\n\n\t\tcase 'u':\t\t\t/* use UDP instead of TCP */\n\t\t\tudp = 1;\n\t\t\tbreak;\n\n\t\tcase 'v':\t\t\t/* output what's going on */\n\t\t\tverbose++;\n\t\t\tbreak;\n\n\t\tcase 'w':\t\t\t/* write() length */\n\t\t\twritelen = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'x':\t\t\t/* SO_RCVTIMEO socket option */\n\t\t\trcvtimeo = atol(optarg);\n\t\t\tbreak;\n\n\t\tcase 'y':\t\t\t/* SO_SNDTIMEO socket option */\n\t\t\tsndtimeo = atol(optarg);\n\t\t\tbreak;\n\n\t\tcase 'A':\t\t\t/* SO_REUSEADDR socket option */\n\t\t\treuseaddr = 1;\n\t\t\tbreak;\n\n\t\tcase 'B':\t\t\t/* SO_BROADCAST socket option */\n\t\t\tbroadcast = 1;\n\t\t\tbreak;\n\n\t\tcase 'C':\t\t\t/* set standard input to cbreak mode */\n\t\t\tcbreak = 1;\n\t\t\tbreak;\n\n\t\tcase 'D':\t\t\t/* SO_DEBUG socket option */\n\t\t\tdebug = 1;\n\t\t\tbreak;\n\n\t\tcase 'E':\t\t\t/* IP_RECVDSTADDR socket option */\n\t\t\trecvdstaddr = 1;\n\t\t\tbreak;\n\n\t\tcase 'F':\t\t\t/* concurrent server, do a fork() */\n\t\t\tdofork = 1;\n\t\t\tbreak;\n\n\t\tcase 'G':\t\t\t/* strict source route */\n\t\t\tsroute_doopt(1, optarg);\n\t\t\tbreak;\n\n#ifdef\tIP_TOS\n\t\tcase 'H':\t\t\t/* IP_TOS socket option */\n\t\t\tiptos = atoi(optarg);\n\t\t\tbreak;\n#endif\n\n\t\tcase 'I':\t\t\t/* SIGIO signal */\n\t\t\tsigio = 1;\n\t\t\tbreak;\n\n#ifdef\tIP_TTL\n\t\tcase 'J':\t\t\t/* IP_TTL socket option */\n\t\t\tipttl = atoi(optarg);\n\t\t\tbreak;\n#endif\n\n\t\tcase 'K':\t\t\t/* SO_KEEPALIVE socket option */\n\t\t\tkeepalive = 1;\n\t\t\tbreak;\n\n\t\tcase 'L':\t\t\t/* SO_LINGER socket option */\n\t\t\tlinger = atol(optarg);\n\t\t\tbreak;\n\n\t\tcase 'N':\t\t\t/* SO_NODELAY socket option */\n\t\t\tnodelay = 1;\n\t\t\tbreak;\n\n\t\tcase 'O':\t\t\t/* pause before listen(), before first accept() */\n\t\t\tpauselisten = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'P':\t\t\t/* pause before first read() */\n\t\t\tpauseinit = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'Q':\t\t\t/* pause after receiving FIN, but before close() */\n\t\t\tpauseclose = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'R':\t\t\t/* SO_RCVBUF socket option */\n\t\t\trcvbuflen = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'S':\t\t\t/* SO_SNDBUF socket option */\n\t\t\tsndbuflen = atoi(optarg);\n\t\t\tbreak;\n\n#ifdef\tSO_REUSEPORT\n\t\tcase 'T':\t\t\t/* SO_REUSEPORT socket option */\n\t\t\treuseport = 1;\n\t\t\tbreak;\n#endif\n\n\t\tcase 'U':\t\t\t/* when to write urgent byte */\n\t\t\turgwrite = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'V':\t\t\t/* use writev() instead of write() */\n\t\t\tusewritev = 1;\n\t\t\tchunkwrite = 1;\t/* implies this option too */\n\t\t\tbreak;\n\n\t\tcase 'W':\t\t\t/* ignore write errors */\n\t\t\tignorewerr = 1;\n\t\t\tbreak;\n\n\t\tcase 'X':\t\t\t/* TCP maximum segment size option */\n\t\t\tmaxseg = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'Y':\t\t\t/* SO_DONTROUTE socket option */\n\t\t\tdontroute = 1;\n\t\t\tbreak;\n\n\t\tcase 'Z':\t\t\t/* MSG_PEEK option */\n\t\t\tmsgpeek = MSG_PEEK;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\tusage(\"unrecognized option\");\n\t\t}\n\t}\n\n\t\t/* check for options that don't make sense */\n\tif (udp && halfclose)\n\t\tusage(\"can't specify -h and -u\");\n\tif (udp && debug)\n\t\tusage(\"can't specify -D and -u\");\n\tif (udp && linger >= 0)\n\t\tusage(\"can't specify -L and -u\");\n\tif (udp && nodelay)\n\t\tusage(\"can't specify -N and -u\");\n#ifdef\tnotdef\n\tif (udp == 0 && broadcast)\n\t\tusage(\"can't specify -B with TCP\");\n#endif\n\tif (udp == 0 && foreignip[0] != 0)\n\t\tusage(\"can't specify -f with TCP\");\n\n\tif (client) {\n\t\tif (optind != argc-2)\n\t\t\tusage(\"missing <hostname> and/or <port>\");\n\t\thost = argv[optind];\n\t\tport = argv[optind+1];\n\n\t} else {\n\t\t\t/* If server specifies host and port, then local address is\n\t\t\t   bound to the \"host\" argument, instead of being wildcarded. */\n\t\tif (optind == argc-2) {\n\t\t\thost = argv[optind];\n\t\t\tport = argv[optind+1];\n\t\t} else if (optind == argc-1) {\n\t\t\thost = NULL;\n\t\t\tport = argv[optind];\n\t\t} else\n\t\t\tusage(\"missing <port>\");\n\t}\n\n\tif (client)\n\t\tfd = cliopen(host, port);\n\telse\n\t\tfd = servopen(host, port);\n\n\tif (sourcesink) {\t\t/* ignore stdin/stdout */\n\t\tif (client) {\n\t\t\tif (udp)\n\t\t\t\tsource_udp(fd);\n\t\t\telse\n\t\t\t\tsource_tcp(fd);\n\t\t} else {\n\t\t\tif (udp)\n\t\t\t\tsink_udp(fd);\n\t\t\telse\n\t\t\t\tsink_tcp(fd);\n\t\t}\n\n\t} else {\t\t\t\t/* copy stdin/stdout to/from socket */\n\t\tif (udp)\n\t\t\tloop_udp(fd);\n\t\telse\n\t\t\tloop_tcp(fd);\n\t}\n\n\texit(0);\n}\n\nstatic void\nusage(const char *msg)\n{\n\terr_msg(\n\"usage: sock [ options ] <host> <port>              (for client; default)\\n\"\n\"       sock [ options ] -s [ <IPaddr> ] <port>     (for server)\\n\"\n\"       sock [ options ] -i <host> <port>           (for \\\"source\\\" client)\\n\"\n\"       sock [ options ] -i -s [ <IPaddr> ] <port>  (for \\\"sink\\\" server)\\n\"\n\"options: -b n  bind n as client's local port number\\n\"\n\"         -c    convert newline to CR/LF & vice versa\\n\"\n\"         -f a.b.c.d.p  foreign IP address = a.b.c.d, foreign port # = p\\n\"\n\"         -g a.b.c.d  loose source route\\n\"\n\"         -h    issue TCP half close on standard input EOF\\n\"\n\"         -i    \\\"source\\\" data to socket, \\\"sink\\\" data from socket (w/-s)\\n\"\n#ifdef\tIP_ADD_MEMBERSHIP\n\"         -j a.b.c.d  join multicast group\\n\"\n#endif\n\"         -k    write or writev in chunks\\n\"\n\"         -l a.b.c.d.p  client's local IP address = a.b.c.d, local port # = p\\n\"\n\"         -n n  # buffers to write for \\\"source\\\" client (default 1024)\\n\"\n\"         -o    do NOT connect UDP client\\n\"\n\"         -p n  # ms to pause before each read or write (source/sink)\\n\"\n\"         -q n  size of listen queue for TCP server (default 5)\\n\"\n\"         -r n  # bytes per read() for \\\"sink\\\" server (default 1024)\\n\"\n\"         -s    operate as server instead of client\\n\"\n#ifdef\tIP_MULTICAST_TTL\n\"         -t n  set multicast ttl\\n\"\n#endif\n\"         -u    use UDP instead of TCP\\n\"\n\"         -v    verbose\\n\"\n\"         -w n  # bytes per write() for \\\"source\\\" client (default 1024)\\n\"\n\"         -x n  # ms for SO_RCVTIMEO (receive timeout)\\n\"\n\"         -y n  # ms for SO_SNDTIMEO (send timeout)\\n\"\n\"         -A    SO_REUSEADDR option\\n\"\n\"         -B    SO_BROADCAST option\\n\"\n\"         -C    set terminal to cbreak mode\\n\"\n\"         -D    SO_DEBUG option\\n\"\n\"         -E    IP_RECVDSTADDR option\\n\"\n\"         -F    fork after connection accepted (TCP concurrent server)\\n\"\n\"         -G a.b.c.d  strict source route\\n\"\n#ifdef\tIP_TOS\n\"         -H n  IP_TOS option (16=min del, 8=max thru, 4=max rel, 2=min$)\\n\"\n#endif\n\"         -I    SIGIO signal\\n\"\n#ifdef\tIP_TTL\n\"         -J n  IP_TTL option\\n\"\n#endif\n\"         -K    SO_KEEPALIVE option\\n\"\n\"         -L n  SO_LINGER option, n = linger time\\n\"\n\"         -N    TCP_NODELAY option\\n\"\n\"         -O n  # ms to pause after listen, but before first accept\\n\"\n\"         -P n  # ms to pause before first read or write (source/sink)\\n\"\n\"         -Q n  # ms to pause after receiving FIN, but before close\\n\"\n\"         -R n  SO_RCVBUF option\\n\"\n\"         -S n  SO_SNDBUF option\\n\"\n#ifdef\tSO_REUSEPORT\n\"         -T    SO_REUSEPORT option\\n\"\n#endif\n\"         -U n  enter urgent mode before write number n (source only)\\n\"\n\"         -V    use writev() instead of write(); enables -k too\\n\"\n\"         -W    ignore write errors for sink client\\n\"\n\"         -X n  TCP_MAXSEG option (set MSS)\\n\"\n\"         -Y    SO_DONTROUTE option\\n\"\n\"         -Z    MSG_PEEK\\n\"\n#ifdef\tIP_ONESBCAST\n\"         -2    IP_ONESBCAST option (255.255.255.255 for broadcast\\n\"\n#endif\n);\n\n\tif (msg[0] != 0)\n\t\terr_quit(\"%s\", msg);\n\texit(1);\n}\n"
  },
  {
    "path": "sock/multicast.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nvoid\njoin_mcast(int fd, struct sockaddr_in *sin)\n{\n#ifdef\tIP_ADD_MEMBERSHIP\t/* only include if host supports mcasting */\n\tu_long\t\t\tinaddr;\n\tstruct ip_mreq\tmreq;\n\n\tinaddr = sin->sin_addr.s_addr;\n\tif (IN_MULTICAST(inaddr) == 0)\n\t\treturn;\t\t\t/* not a multicast address */\n\n\tmreq.imr_multiaddr.s_addr = inaddr;\n\tmreq.imr_interface.s_addr = htonl(INADDR_ANY);\t/* need way to change */\n\tif (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,\n\t\t\t\t\t\t\t\t\t\t\t\tsizeof(mreq)) == -1 )\n\t\terr_sys(\"IP_ADD_MEMBERSHIP error\");\n\n\tif (verbose)\n\t\t\tfprintf(stderr, \"multicast group joined\\n\");\n#endif\t/* IP_ADD_MEMBERSHIP */\n}\n"
  },
  {
    "path": "sock/ourhdr.h",
    "content": "/* Our own header, to be included *after* all standard system headers */\n\n#ifndef\t__ourhdr_h\n#define\t__ourhdr_h\n\n#include\t<sys/types.h>\t/* required for some of our prototypes */\n#include\t<stdio.h>\t\t/* for convenience */\n#include\t<stdlib.h>\t\t/* for convenience */\n#include\t<string.h>\t\t/* for convenience */\n#include\t<unistd.h>\t\t/* for convenience */\n\n#ifdef\tnotdef\t/* delete for systems that don't define this (SunOS 4.x) */\ntypedef\tint\tssize_t;\n#endif\n\n#ifdef\tnotdef\t/* delete if <stdlib.h> doesn't define these for getopt() */\nextern char\t*optarg;\nextern int\toptind, opterr, optopt;\n#endif\n\n#ifdef\tnotdef\t/* delete if send() not supported (DEC OSF/1) */\n#define\tsend(a,b,c,d)\tsendto((a), (b), (c), (d), (struct sockaddr *) NULL, 0)\n#endif\n\n#define\tMAXLINE\t4096\t\t\t/* max line length */\n\n#define\tFILE_MODE\t(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)\n\t\t\t\t\t/* default file access permissions for new files */\n#define\tDIR_MODE\t(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)\n\t\t\t\t\t/* default permissions for new directories */\n\ntypedef\tvoid\tSigfunc(int);\t/* for signal handlers */\n\n\t\t\t\t\t/* 4.3BSD Reno <signal.h> doesn't define SIG_ERR */\n#if\tdefined(SIG_IGN) && !defined(SIG_ERR)\n#define\tSIG_ERR\t((Sigfunc *)-1)\n#endif\n\n#define\tmin(a,b)\t((a) < (b) ? (a) : (b))\n#define\tmax(a,b)\t((a) > (b) ? (a) : (b))\n\n\t\t\t\t\t/* prototypes for our own functions */\nchar\t*path_alloc(int *);\t\t\t/* {Prog pathalloc} */\nint\t\t open_max(void);\t\t\t/* {Prog openmax} */\nvoid\t clr_fl(int, int);\t\t\t/* {Prog setfl} */\nvoid\t set_fl(int, int);\t\t\t/* {Prog setfl} */\nvoid\t pr_exit(int);\t\t\t\t/* {Prog prexit} */\nvoid\t pr_mask(const char *);\t\t/* {Prog prmask} */\nSigfunc\t*signal_intr(int, Sigfunc *);/* {Prog signal_intr_function} */\n\nint\t\t tty_cbreak(int);\t\t\t/* {Prog raw} */\nint\t\t tty_raw(int);\t\t\t\t/* {Prog raw} */\nint\t\t tty_reset(int);\t\t\t/* {Prog raw} */\nvoid\t tty_atexit(void);\t\t\t/* {Prog raw} */\n#ifdef\tECHO\t/* only if <termios.h> has been included */\nstruct termios\t*tty_termios(void);\t/* {Prog raw} */\n#endif\n\nvoid\t sleep_us(unsigned int);\t/* {Ex sleepus} */\nssize_t\t readn(int, void *, size_t);/* {Prog readn} */\nssize_t\t writen(int, const void *, size_t);/* {Prog writen} */\nint\t\t daemon_init(void);\t\t\t/* {Prog daemoninit} */\n\nint\t\t s_pipe(int *);\t\t\t\t/* {Progs svr4_spipe bsd_spipe} */\nint\t\t recv_fd(int, ssize_t (*func)(int, const void *, size_t));\n\t\t\t\t\t\t\t\t\t/* {Progs recvfd_svr4 recvfd_43bsd} */\nint\t\t send_fd(int, int);\t\t\t/* {Progs sendfd_svr4 sendfd_43bsd} */\nint\t\t send_err(int, int, const char *);/* {Prog senderr} */\nint\t\t serv_listen(const char *);\t/* {Progs servlisten_svr4 servlisten_44bsd} */\nint\t\t serv_accept(int, uid_t *);\t/* {Progs servaccept_svr4 servaccept_44bsd} */\nint\t\t cli_conn(const char *);\t/* {Progs cliconn_svr4 cliconn_44bsd} */\nint\t\t buf_args(char *, int (*func)(int, char **));\n\t\t\t\t\t\t\t\t\t/* {Prog bufargs} */\n\nint\t\t ptym_open(char *);\t\t\t/* {Progs ptyopen_svr4 ptyopen_44bsd} */\nint\t\t ptys_open(int, char *);\t/* {Progs ptyopen_svr4 ptyopen_44bsd} */\n#ifdef\tTIOCGWINSZ\npid_t\t pty_fork(int *, char *, const struct termios *,\n\t\t\t\t  const struct winsize *);\t/* {Prog ptyfork} */\n#endif\n\nint\t\tlock_reg(int, int, int, off_t, int, off_t);\n\t\t\t\t\t\t\t\t\t/* {Prog lockreg} */\n#define\tread_lock(fd, offset, whence, len) \\\n\t\t\tlock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)\n#define\treadw_lock(fd, offset, whence, len) \\\n\t\t\tlock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)\n#define\twrite_lock(fd, offset, whence, len) \\\n\t\t\tlock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)\n#define\twritew_lock(fd, offset, whence, len) \\\n\t\t\tlock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)\n#define\tun_lock(fd, offset, whence, len) \\\n\t\t\tlock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)\n\npid_t\tlock_test(int, int, off_t, int, off_t);\n\t\t\t\t\t\t\t\t\t/* {Prog locktest} */\n\n#define\tis_readlock(fd, offset, whence, len) \\\n\t\t\tlock_test(fd, F_RDLCK, offset, whence, len)\n#define\tis_writelock(fd, offset, whence, len) \\\n\t\t\tlock_test(fd, F_WRLCK, offset, whence, len)\n\nvoid\terr_dump(const char *, ...);\t/* {App misc_source} */\nvoid\terr_msg(const char *, ...);\nvoid\terr_quit(const char *, ...);\nvoid\terr_ret(const char *, ...);\nvoid\terr_sys(const char *, ...);\n\nvoid\tlog_msg(const char *, ...);\t\t/* {App misc_source} */\nvoid\tlog_open(const char *, int, int);\nvoid\tlog_quit(const char *, ...);\nvoid\tlog_ret(const char *, ...);\nvoid\tlog_sys(const char *, ...);\n\nvoid\tTELL_WAIT(void);\t\t/* parent/child from {Sec race_conditions} */\nvoid\tTELL_PARENT(pid_t);\nvoid\tTELL_CHILD(pid_t);\nvoid\tWAIT_PARENT(void);\nvoid\tWAIT_CHILD(void);\n\n#endif\t/* __ourhdr_h */\n"
  },
  {
    "path": "sock/pattern.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n#include\t<ctype.h>\n\nvoid\npattern(char *ptr, int len)\n{\n\tchar\tc;\n\n\tc = 0;\n\twhile(len-- > 0)  {\n\t\twhile(isprint((c & 0x7F)) == 0)\n\t\t\tc++;\t/* skip over nonprinting characters */\n\t\t*ptr++ = (c++ & 0x7F);\n\t}\n}\n"
  },
  {
    "path": "sock/servopen.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nint\nservopen(char *host, char *port)\n{\n\tint\t\t\t\t\tfd, newfd, i, on, pid;\n\tconst char\t\t\t*protocol;\n\tstruct in_addr\t\tinaddr;\n\tstruct servent\t\t*sp;\n\n\tprotocol = udp ? \"udp\" : \"tcp\";\n\n\t\t/* Initialize the socket address structure */\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\n\t\t/* Caller normally wildcards the local Internet address, meaning\n\t\t   a connection will be accepted on any connected interface.\n\t\t   We only allow an IP address for the \"host\", not a name. */\n\tif (host == NULL)\n\t\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\t\t/* wildcard */\n\telse {\n\t\tif (inet_aton(host, &inaddr) == 0)\n\t\t\terr_quit(\"invalid host name for server: %s\", host);\n\t\tservaddr.sin_addr = inaddr;\n\t}\n\n\t\t/* See if \"port\" is a service name or number */\n\tif ( (i = atoi(port)) == 0) {\n\t\tif ( (sp = getservbyname(port, protocol)) == NULL)\n\t\t\terr_ret(\"getservbyname() error for: %s/%s\", port, protocol);\n\n\t\tservaddr.sin_port = sp->s_port;\n\t} else\n\t\tservaddr.sin_port = htons(i);\n\n\tif ( (fd = socket(AF_INET, udp ? SOCK_DGRAM : SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"socket() error\");\n\n\tif (reuseaddr) {\n\t\ton = 1;\n\t\tif (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)\n\t\t\terr_sys(\"setsockopt of SO_REUSEADDR error\");\n\t}\n\n#ifdef\tSO_REUSEPORT\n\tif (reuseport) {\n\t\ton = 1;\n\t\tif (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0)\n\t\t\terr_sys(\"setsockopt of SO_REUSEPORT error\");\n\t}\n#endif\n\n\t\t/* Bind our well-known port so the client can connect to us. */\n\tif (bind(fd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"can't bind local address\");\n\n\tjoin_mcast(fd, &servaddr);\n\n\tif (udp) {\n\t\tbuffers(fd);\n\n\t\tif (foreignip[0] != 0) {\t/* connect to foreignip/port# */\n\t\t\tbzero(&cliaddr, sizeof(cliaddr));\n\t\t\tif (inet_aton(foreignip, &cliaddr.sin_addr) == 0)\n\t\t\t\terr_quit(\"invalid IP address: %s\", foreignip);\n\t\t\tcliaddr.sin_family = AF_INET;\n\t\t\tcliaddr.sin_port   = htons(foreignport);\n\t\t\t\t/* connect() for datagram socket doesn't appear to allow\n\t\t\t\t   wildcarding of either IP address or port number */\n\n\t\t\tif (connect(fd, (struct sockaddr *) &cliaddr, sizeof(cliaddr))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  < 0)\n\t\t\t\terr_sys(\"connect() error\");\n\t\t\t\n\t\t}\n\n\t\tsockopts(fd, 1);\n\n\t\treturn(fd);\t\t/* nothing else to do */\n\t}\n\n\tbuffers(fd);\t\t/* may set receive buffer size; must do here to get\n\t\t\t\t\t\t   correct window advertised on SYN */\n\tsockopts(fd, 0);\t/* only set some socket options for fd */\n\n\tlisten(fd, listenq);\n\n\tif (pauselisten)\n\t\tsleep_us(pauselisten*1000);\t\t/* lets connection queue build up */\n\n\tif (dofork)\n\t\tTELL_WAIT();\t\t\t/* initialize synchronization primitives */\n\n\tfor ( ; ; ) {\n\t\ti = sizeof(cliaddr);\n\t\tif ( (newfd = accept(fd, (struct sockaddr *) &cliaddr, &i)) < 0)\n\t\t\terr_sys(\"accept() error\");\n\n\t\tif (dofork) {\n\t\t\tif ( (pid = fork()) < 0)\n\t\t\t\terr_sys(\"fork error\");\n\n\t\t\tif (pid > 0) {\n\t\t\t\tclose(newfd);\t/* parent closes connected socket */\n\t\t\t\tWAIT_CHILD();\t/* wait for child to output to terminal */\n\t\t\t\tcontinue;\t\t/* and back to for(;;) for another accept() */\n\t\t\t} else {\n\t\t\t\tclose(fd);\t\t/* child closes listening socket */\n\t\t\t}\n\t\t}\n\n\t\t\t/* child (or iterative server) continues here */\n\t\tif (verbose) {\n\t\t\t\t/* Call getsockname() to find local address bound to socket:\n\t\t\t\t   local internet address is now determined (if multihomed). */\n\t\t\ti = sizeof(servaddr);\n\t\t\tif (getsockname(newfd, (struct sockaddr *) &servaddr, &i) < 0)\n\t\t\t\terr_sys(\"getsockname() error\");\n\n\t\t\t\t\t\t/* Can't do one fprintf() since inet_ntoa() stores\n\t\t\t\t\t\t   the result in a static location. */\n\t\t\tfprintf(stderr, \"connection on %s.%d \",\n\t\t\t\t\tINET_NTOA(servaddr.sin_addr), ntohs(servaddr.sin_port));\n\t\t\tfprintf(stderr, \"from %s.%d\\n\",\n\t\t\t\t\tINET_NTOA(cliaddr.sin_addr), ntohs(cliaddr.sin_port));\n\t\t}\n\n\t\tbuffers(newfd);\t\t/* setsockopt() again, in case it didn't propagate\n\t\t\t\t\t\t\t   from listening socket to connected socket */\n\t\tsockopts(newfd, 1);\t/* can set all socket options for this socket */\n\n\t\tif (dofork)\n\t\t\tTELL_PARENT(getppid());\t/* tell parent we're done with terminal */\n\n\t\treturn(newfd);\n\t}\n}\n"
  },
  {
    "path": "sock/sinktcp.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nvoid\nsink_tcp(int sockfd)\n{\n\tint\t\tn, flags;\n\n\tif (pauseinit)\n\t\tsleep_us(pauseinit*1000);\n\n\tfor ( ; ; ) {\t/* read until peer closes connection; -n opt ignored */\n\t\t\t/* msgpeek = 0 or MSG_PEEK */\n\t\tflags = msgpeek;\n\toncemore:\n\t\tif ( (n = recv(sockfd, rbuf, readlen, flags)) < 0) {\n\t\t\terr_sys(\"recv error\");\n\n\t\t} else if (n == 0) {\n\t\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"connection closed by peer\\n\");\n\t\t\tbreak;\n\n#ifdef\tnotdef\t\t/* following not possible with TCP */\n\t\t} else if (n != readlen)\n\t\t\terr_quit(\"read returned %d, expected %d\", n, readlen);\n#else\n\t\t}\n#endif\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"received %d bytes%s\\n\", n,\n\t\t\t\t\t(flags == MSG_PEEK) ? \" (MSG_PEEK)\" : \"\");\n\n\t\tif (pauserw)\n\t\t\tsleep_us(pauserw*1000);\n\n\t\tif (flags != 0) {\n\t\t\tflags = 0;\t\t/* no infinite loop */\n\t\t\tgoto oncemore;\t/* read the message again */\n\t\t}\n\t}\n\n\tif (pauseclose) {\t/* pausing here puts peer into FIN_WAIT_2 */\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep_us(pauseclose*1000);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n"
  },
  {
    "path": "sock/sinkudp.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nvoid\nsink_udp(int sockfd)\t/* TODO: use recvfrom ?? */\n{\n\tint\t\tn, flags;\n\n\tif (pauseinit)\n\t\tsleep_us(pauseinit*1000);\n\n\tfor ( ; ; ) {\t/* read until peer closes connection; -n opt ignored */\n\t\t\t/* msgpeek = 0 or MSG_PEEK */\n\t\tflags = msgpeek;\n\toncemore:\n\t\tif ( (n = recv(sockfd, rbuf, readlen, flags)) < 0) {\n\t\t\terr_sys(\"recv error\");\n\n\t\t} else if (n == 0) {\n\t\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"connection closed by peer\\n\");\n\t\t\tbreak;\n\n#ifdef\tnotdef\t\t/* following not possible with TCP */\n\t\t} else if (n != readlen)\n\t\t\terr_quit(\"read returned %d, expected %d\", n, readlen);\n#else\n\t\t}\n#endif\n\n\t\tif (verbose) {\n\t\t\tfprintf(stderr, \"received %d bytes%s\\n\", n,\n\t\t\t\t\t(flags == MSG_PEEK) ? \" (MSG_PEEK)\" : \"\");\n\t\t\tif (verbose > 1) {\n\tfprintf(stderr, \"printing %d bytes\\n\", n);\n\t\t\t\trbuf[n] = 0;\t/* make certain it's null terminated */\n\t\t\t\tfprintf(stderr, \"SDAP header: %lx\\n\", *((long *) rbuf));\n\t\t\t\tfprintf(stderr, \"next long: %lx\\n\", *((long *) rbuf+4));\n\t\t\t\tfputs(&rbuf[8], stderr);\n\t\t\t}\n\t\t}\n\n\t\tif (pauserw)\n\t\t\tsleep_us(pauserw*1000);\n\n\t\tif (flags != 0) {\n\t\t\tflags = 0;\t\t/* avoid infinite loop */\n\t\t\tgoto oncemore;\t/* read the message again */\n\t\t}\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep_us(pauseclose*1000);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\n}\n"
  },
  {
    "path": "sock/sleepus.c",
    "content": "#include\t<sys/types.h>\n#include\t<sys/time.h>\n#include\t<errno.h>\n#include\t<stddef.h>\n#include\t\"ourhdr.h\"\n\nvoid\nsleep_us(unsigned int nusecs)\n{\n\tstruct timeval\ttval;\n\n\tfor ( ; ; ) {\n\t\ttval.tv_sec = nusecs / 1000000;\n\t\ttval.tv_usec = nusecs % 1000000;\n\t\tif (select(0, NULL, NULL, NULL, &tval) == 0)\n\t\t\tbreak;\t\t/* all OK */\n\t\t/*\n\t\t * Note than on an interrupted system call (i.e, SIGIO) there's not\n\t\t * much we can do, since the timeval{} isn't updated with the time\n\t\t * remaining.  We could obtain the clock time before the call, and\n\t\t * then obtain the clock time here, subtracting them to determine\n\t\t * how long select() blocked before it was interrupted, but that\n\t\t * seems like too much work :-)\n\t\t */\n\t\tif (errno == EINTR)\n\t\t\tcontinue;\n\t\terr_sys(\"sleep_us: select error\");\n\t}\n}\n"
  },
  {
    "path": "sock/sock.h",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"unp.h\"\n\n#include\t<sys/uio.h>\n#ifdef\t__bsdi__\n#include\t<machine/endian.h>\t/* required before tcp.h, for BYTE_ORDER */\n#endif\n#include\t<netinet/tcp.h>\t\t/* TCP_NODELAY */\n#include\t<netdb.h>\t\t\t/* getservbyname(), gethostbyname() */\n\n\t\t\t\t/* declare global variables */\nextern int\t\tbindport;\nextern int\t\tbroadcast;\nextern int\t\tcbreak;\nextern int\t\tchunkwrite;\nextern int\t\tclient;\nextern int\t\tconnectudp;\nextern int\t\tcrlf;\nextern int\t\tdebug;\nextern int\t\tdofork;\nextern int\t\tdontroute;\nextern char\t\tforeignip[];\nextern int\t\tforeignport;\nextern int\t\thalfclose;\nextern int\t\tignorewerr;\nextern int\t\tiptos;\nextern int\t\tipttl;\nextern char\t\tjoinip[];\nextern int\t\tkeepalive;\nextern long\t\tlinger;\nextern int\t\tlistenq;\nextern char\t\tlocalip[];\nextern int\t\tmaxseg;\nextern int\t\tmcastttl;\nextern int\t\tmsgpeek;\nextern int\t\tnodelay;\nextern int\t\tnbuf;\nextern int\t\tonesbcast;\nextern int\t\tpauseclose;\nextern int\t\tpauseinit;\nextern int\t\tpauselisten;\nextern int\t\tpauserw;\nextern int\t\treuseaddr;\nextern int\t\treuseport;\nextern int\t\treadlen;\nextern int\t\twritelen;\nextern int\t\trecvdstaddr;\nextern int\t\trcvbuflen;\nextern int\t\tsndbuflen;\nextern long\t\trcvtimeo;\nextern long\t\tsndtimeo;\nextern char\t   *rbuf;\nextern char\t   *wbuf;\nextern int\t\tserver;\nextern int\t\tsigio;\nextern int\t\tsourcesink;\nextern int\t\tsroute_cnt;\nextern int\t\tudp;\nextern int\t\turgwrite;\nextern int\t\tverbose;\nextern int\t\tusewritev;\n\nextern struct sockaddr_in\tcliaddr, servaddr;\n\n/* Earlier versions of gcc under SunOS 4.x have problems passing arguments\n   that are structs (as opposed to pointers to structs).  This shows up\n   with inet_ntoa, whose argument is a \"struct in_addr\". */\n\n#if\tdefined(sun) && defined(__GNUC__) && defined(GCC_STRUCT_PROBLEM)\n#define\tINET_NTOA(foo)\tinet_ntoa(&foo)\n#else\n#define\tINET_NTOA(foo)\tinet_ntoa(foo)\n#endif\n\n\t\t\t\t/* function prototypes */\nvoid\tbuffers(int);\nint\t\tcliopen(char *, char *);\nint\t\tcrlf_add(char *, int, const char *, int);\nint\t\tcrlf_strip(char *, int, const char *, int);\nvoid\tjoin_mcast(int, struct sockaddr_in *);\nvoid\tloop_tcp(int);\nvoid\tloop_udp(int);\nvoid\tpattern(char *, int);\nint\t\tservopen(char *, char *);\nvoid\tsink_tcp(int);\nvoid\tsink_udp(int);\nvoid\tsource_tcp(int);\nvoid\tsource_udp(int);\nvoid\tsroute_doopt(int, char *);\nvoid\tsroute_set(int);\nvoid\tsleep_us(unsigned int);\nvoid\tsockopts(int, int);\nssize_t\tdowrite(int, const void *, size_t);\n\nvoid\tTELL_WAIT(void);\nvoid\tTELL_PARENT(pid_t);\nvoid\tWAIT_PARENT(void);\nvoid\tTELL_CHILD(pid_t);\nvoid\tWAIT_CHILD(void);\n"
  },
  {
    "path": "sock/sock.in",
    "content": "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
  },
  {
    "path": "sock/sockopts.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n#include\t<fcntl.h>\n#include\t<sys/ioctl.h>\n\nvoid\nsockopts(int sockfd, int doall)\n{\n    int \t\t\toption, optlen;\n\tstruct linger\tling;\n\tstruct timeval\ttimer;\n\n\t/* \"doall\" is 0 for a server's listening socket (i.e., before\n\t   accept() has returned.)  Some socket options such as SO_KEEPALIVE\n\t   don't make sense at this point, while others like SO_DEBUG do. */\n\n    if (debug) {\n        option = 1;\n        if (setsockopt(sockfd, SOL_SOCKET, SO_DEBUG,\n\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n            err_sys(\"SO_DEBUG setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_DEBUG,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"SO_DEBUG getsockopt error\");\n\t\tif (option == 0)\n\t\t\terr_quit(\"SO_DEBUG not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_DEBUG set\\n\");\n    }\n\n    if (dontroute) {\n        option = 1;\n        if (setsockopt(sockfd, SOL_SOCKET, SO_DONTROUTE,\n\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n            err_sys(\"SO_DONTROUTE setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_DONTROUTE,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"SO_DONTROUTE getsockopt error\");\n\t\tif (option == 0)\n\t\t\terr_quit(\"SO_DONTROUTE not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_DONTROUTE set\\n\");\n    }\n\n#ifdef\tIP_TOS\n    if (iptos != -1 && doall == 0) {\n        if (setsockopt(sockfd, IPPROTO_IP, IP_TOS,\n\t\t\t\t\t\t\t\t\t\t&iptos, sizeof(iptos)) < 0)\n            err_sys(\"IP_TOS setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, IPPROTO_IP, IP_TOS,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"IP_TOS getsockopt error\");\n\t\tif (option != iptos)\n\t\t\terr_quit(\"IP_TOS not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"IP_TOS set to %d\\n\", iptos);\n    }\n#endif\n\n#ifdef\tIP_TTL\n    if (ipttl != -1 && doall == 0) {\n        if (setsockopt(sockfd, IPPROTO_IP, IP_TTL,\n\t\t\t\t\t\t\t\t\t\t&ipttl, sizeof(ipttl)) < 0)\n            err_sys(\"IP_TTL setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, IPPROTO_IP, IP_TTL,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"IP_TTL getsockopt error\");\n\t\tif (option != ipttl)\n\t\t\terr_quit(\"IP_TTL not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"IP_TTL set to %d\\n\", ipttl);\n    }\n#endif\n\n    if (maxseg && udp == 0) {\n\t\t\t/* Need to set MSS for server before connection established */\n\t\t\t/* Beware: some kernels do not let the process set this socket\n\t\t\t   option; others only let it be decreased. */\n        if (setsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG,\n\t\t\t\t\t\t\t\t\t\t&maxseg, sizeof(maxseg)) < 0)\n            err_sys(\"TCP_MAXSEG setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"TCP_MAXSEG getsockopt error\");\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"TCP_MAXSEG = %d\\n\", option);\n    }\n\n\tif (sroute_cnt > 0)\n\t\tsroute_set(sockfd);\n\n    if (broadcast) {\n        option = 1;\n        if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,\n\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n            err_sys(\"SO_BROADCAST setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"SO_BROADCAST getsockopt error\");\n\t\tif (option == 0)\n\t\t\terr_quit(\"SO_BROADCAST not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_BROADCAST set\\n\");\n\n#ifdef\tIP_ONESBCAST\n\t\tif (onesbcast) {\n\t        option = 1;\n\t        if (setsockopt(sockfd, IPPROTO_IP, IP_ONESBCAST,\n\t\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n\t            err_sys(\"IP_ONESBCAST setsockopt error\");\n\t\n\t        option = 0;\n\t\t\toptlen = sizeof(option);\n\t        if (getsockopt(sockfd, IPPROTO_IP, IP_ONESBCAST,\n\t\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n\t            err_sys(\"IP_ONESBCAST getsockopt error\");\n\t\t\tif (option == 0)\n\t\t\t\terr_quit(\"IP_ONESBCAST not set (%d)\", option);\n\t\n\t\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"IP_ONESBCAST set\\n\");\n\t\t}\n#endif\n    }\n\n#ifdef\tIP_ADD_MEMBERSHIP\n    if (joinip[0]) {\n\t\tstruct ip_mreq\tjoin;\n\n\t\tif (inet_aton(joinip, &join.imr_multiaddr) == 0)\n\t\t\terr_quit(\"invalid multicast address: %s\", joinip);\n\t\tjoin.imr_interface.s_addr = htonl(INADDR_ANY);\n        if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,\n\t\t\t\t\t\t\t\t\t\t&join, sizeof(join)) < 0)\n            err_sys(\"IP_ADD_MEMBERSHIP setsockopt error\");\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"IP_ADD_MEMBERSHIP set\\n\");\n    }\n#endif\n\n#ifdef\tIP_MULTICAST_TTL\n    if (mcastttl) {\n\t\tu_char\tttl = mcastttl;\n\n        if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL,\n\t\t\t\t\t\t\t\t\t\t&ttl, sizeof(ttl)) < 0)\n            err_sys(\"IP_MULTICAST_TTL setsockopt error\");\n\n\t\toptlen = sizeof(ttl);\n        if (getsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL,\n\t\t\t\t\t\t\t\t\t\t&ttl, &optlen) < 0)\n            err_sys(\"IP_MULTICAST_TTL getsockopt error\");\n\t\tif (ttl != mcastttl)\n\t\t\terr_quit(\"IP_MULTICAST_TTL not set (%d)\", ttl);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"IP_MULTICAST_TTL set to %d\\n\", ttl);\n    }\n#endif\n\n    if (keepalive && doall && udp == 0) {\n        option = 1;\n        if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE,\n\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n            err_sys(\"SO_KEEPALIVE setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"SO_KEEPALIVE getsockopt error\");\n\t\tif (option == 0)\n\t\t\terr_quit(\"SO_KEEPALIVE not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_KEEPALIVE set\\n\");\n    }\n\n    if (nodelay && doall && udp == 0) {\n        option = 1;\n        if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,\n\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n            err_sys(\"TCP_NODELAY setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"TCP_NODELAY getsockopt error\");\n\t\tif (option == 0)\n\t\t\terr_quit(\"TCP_NODELAY not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"TCP_NODELAY set\\n\");\n    }\n\n    if (doall && verbose && udp == 0) {\t/* just print MSS if verbose */\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"TCP_MAXSEG getsockopt error\");\n\n\t\tfprintf(stderr, \"TCP_MAXSEG = %d\\n\", option);\n    }\n\n    if (linger >= 0 && doall && udp == 0) {\n        ling.l_onoff = 1;\n        ling.l_linger = linger;\t\t/* 0 for abortive disconnect */\n        if (setsockopt(sockfd, SOL_SOCKET, SO_LINGER,\n\t\t\t\t\t\t\t\t\t\t&ling, sizeof(ling)) < 0)\n            err_sys(\"SO_LINGER setsockopt error\");\n\n\t\tling.l_onoff = 0;\n\t\tling.l_linger = -1;\n        optlen = sizeof(struct linger);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_LINGER,\n\t\t\t\t\t\t\t\t\t\t&ling, &optlen) < 0)\n            err_sys(\"SO_LINGER getsockopt error\");\n\t\tif (ling.l_onoff == 0 || ling.l_linger != linger)\n\t\t\terr_quit(\"SO_LINGER not set (%d, %d)\", ling.l_onoff, ling.l_linger);\n\n        if (verbose)\n            fprintf(stderr, \"linger %s, time = %d\\n\",\n                            ling.l_onoff ? \"on\" : \"off\", ling.l_linger);\n    }\n\n    if (doall && rcvtimeo) {\n#ifdef\tSO_RCVTIMEO\n\t\t/* User specifies millisec, must convert to sec/usec */\n\t\ttimer.tv_sec  =  rcvtimeo / 1000;\n\t\ttimer.tv_usec = (rcvtimeo % 1000) * 1000;\n        if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,\n\t\t\t\t\t\t\t\t\t\t&timer, sizeof(timer)) < 0)\n            err_sys(\"SO_RCVTIMEO setsockopt error\");\n\n\t\ttimer.tv_sec = timer.tv_usec = 0;\n\t\toptlen = sizeof(timer);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,\n\t\t\t\t\t\t\t\t\t\t&timer, &optlen) < 0)\n            err_sys(\"SO_RCVTIMEO getsockopt error\");\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_RCVTIMEO: %ld.%06ld\\n\",\n\t\t\t\t\t\t\t\t\ttimer.tv_sec, timer.tv_usec);\n#else\n\t\tfprintf(stderr, \"warning: SO_RCVTIMEO not supported by host\\n\");\n#endif\n    }\n\n    if (doall && sndtimeo) {\n#ifdef\tSO_SNDTIMEO\n\t\t/* User specifies millisec, must convert to sec/usec */\n\t\ttimer.tv_sec  =  sndtimeo / 1000;\n\t\ttimer.tv_usec = (sndtimeo % 1000) * 1000;\n        if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO,\n\t\t\t\t\t\t\t\t\t\t&timer, sizeof(timer)) < 0)\n            err_sys(\"SO_SNDTIMEO setsockopt error\");\n\n\t\ttimer.tv_sec = timer.tv_usec = 0;\n\t\toptlen = sizeof(timer);\n        if (getsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO,\n\t\t\t\t\t\t\t\t\t\t&timer, &optlen) < 0)\n            err_sys(\"SO_SNDTIMEO getsockopt error\");\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"SO_SNDTIMEO: %ld.%06ld\\n\",\n\t\t\t\t\t\t\t\t\ttimer.tv_sec, timer.tv_usec);\n#else\n\t\tfprintf(stderr, \"warning: SO_SNDTIMEO not supported by host\\n\");\n#endif\n    }\n\n    if (recvdstaddr && udp) {\n#ifdef\tIP_RECVDSTADDR\n        option = 1;\n        if (setsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR,\n\t\t\t\t\t\t\t\t\t\t&option, sizeof(option)) < 0)\n            err_sys(\"IP_RECVDSTADDR setsockopt error\");\n\n        option = 0;\n\t\toptlen = sizeof(option);\n        if (getsockopt(sockfd, IPPROTO_IP, IP_RECVDSTADDR,\n\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n            err_sys(\"IP_RECVDSTADDR getsockopt error\");\n\t\tif (option == 0)\n\t\t\terr_quit(\"IP_RECVDSTADDR not set (%d)\", option);\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"IP_RECVDSTADDR set\\n\");\n#else\n\t\tfprintf(stderr, \"warning: IP_RECVDSTADDR not supported by host\\n\");\n#endif\n    }\n\n    if (sigio) {\n#ifdef\tFIOASYNC\n\t\tstatic void sigio_func(int);\n\n\t\t/*\n\t\t * Should be able to set this with fcntl(O_ASYNC) or fcntl(FASYNC),\n\t\t * but some systems (AIX?) only do it with ioctl().\n\t\t *\n\t\t * Need to set this for listening socket and for connected socket.\n\t\t */\n\t\tsignal(SIGIO, sigio_func);\n\n\t\tif (fcntl(sockfd, F_SETOWN, getpid()) < 0)\n\t\t\terr_sys(\"fcntl F_SETOWN error\");\n\n        option = 1;\n\t\tif (ioctl(sockfd, FIOASYNC, (char *) &option) < 0)\n\t\t\terr_sys(\"ioctl FIOASYNC error\");\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"FIOASYNC set\\n\");\n#else\n\t\tfprintf(stderr, \"warning: FIOASYNC not supported by host\\n\");\n#endif\n    }\n}\n\nstatic void\nsigio_func(int signo)\n{\n\tfprintf(stderr, \"SIGIO\\n\");\n\t\t\t\t/* shouldn't printf from a signal handler ... */\n}\n"
  },
  {
    "path": "sock/sourceroute.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n#include\t<netinet/in_systm.h>\n#include\t<netinet/ip.h>\n\n/*\n * There is a fundamental limit of 9 IP addresses in a source route.\n * But we allocate sroute_opt[44] with room for 10 IP addresses (and\n * the 3-byte source route type/len/offset) because with the BSD\n * IP_OPTIONS socket option we can specify up to 9 addresses, followed\n * by the destination address.  The in_pcbopts() function in the kernel\n * then takes the final address in the list (the destination) and moves\n * it to the front, as shown in Figure 9.33 of \"TCP/IP Illustrated,\n * Volume 2\".  Also note that this destination address that we pass as\n * the final IP address in our array overrides the destination address\n * of the sendto() (Figure 9.28 of Volume 2).\n */\n\nu_char\tsroute_opt[44];\t\t/* some implementations require this to be\n\t\t\t\t\t\t\t   on a 4-byte boundary */\nu_char\t*optr;\t\t\t\t/* pointer into options being formed */\n\n/*\n * Process either the -g (loose) or -G (strict) command-line option,\n * specifying one hop in a source route.\n * Either option can be specified up to 9 times.\n * With IPv4 the entire source route is either loose or strict, but we\n * set the source route type field based on the first option encountered,\n * either -g or -G.\n */\n\nvoid\nsroute_doopt(int strict, char *argptr)\n{\n\tstruct in_addr\tinaddr;\n\tstruct hostent\t*hp;\n\n\tif (sroute_cnt >= 9)\n\t\terr_quit(\"too many source routes with: %s\", argptr);\n\n\tif (sroute_cnt == 0) {\t/* first one */\n\t\tbzero(sroute_opt, sizeof(sroute_opt));\n\t\toptr = sroute_opt;\n\t\t*optr++ = strict ? IPOPT_SSRR : IPOPT_LSRR;\n\t\toptr++;\t\t\t/* we fill in the total length later */\n\t\t*optr++ = 4;\t/* ptr to first source-route address */\n\t}\n\n\tif (inet_aton(argptr, &inaddr) == 1) {\n\t\tmemcpy(optr, &inaddr, sizeof(u_long));\t/* dotted decimal */\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"source route to %s\\n\", inet_ntoa(inaddr));\n\t} else if ( (hp = gethostbyname(argptr)) != NULL) {\n\t\tmemcpy(optr, hp->h_addr, sizeof(u_long));/* hostname */\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"source route to %s\\n\",\n\t\t\t\t\t\t\tinet_ntoa(*((struct in_addr *) hp->h_addr)));\n\t} else\n\t\terr_quit(\"unknown host: %s\\n\", argptr);\n\n\toptr += sizeof(u_long);\t\t/* for next IP addr in list */\n\tsroute_cnt++;\n}\n\n/*\n * Set the actual source route with the IP_OPTIONS socket option.\n * This function is called if srouce_cnt is nonzero.\n * The final destination goes at the end of the list of IP addresses.\n */\n\nvoid\nsroute_set(int sockfd)\n{\n\tsroute_cnt++;\t\t\t\t\t\t /* account for destination */\n\tsroute_opt[1] = 3 + (sroute_cnt * 4);/* total length, incl. destination */\n\n\t\t/* destination must be stored as final entry */\n\tmemcpy(optr, &servaddr.sin_addr, sizeof(u_long));\n\toptr += sizeof(u_long);\n\tif (verbose) {\n\t\tfprintf(stderr, \"source route to %s\\n\", inet_ntoa(servaddr.sin_addr));\n\t\tfprintf(stderr, \"source route size %d bytes\\n\", sroute_opt[1]);\n\t}\n\n\t/*\n\t * The number of bytes that we pass to setsockopt() must be a multiple\n\t * of 4.  Since the buffer was initialized to 0, this leaves an EOL\n\t * following the final IP address.\n\t * For optimization we could put a NOP before the 3-byte type/len/offset\n\t * field, which would then align all the IP addresses on 4-byte boundaries,\n\t * but the source routing code is not exactly in the fast path of most\n\t * routers.\n\t */\n\twhile ((optr - sroute_opt) & 3)\n\t\toptr++;\n\n\tif (setsockopt(sockfd, IPPROTO_IP, IP_OPTIONS,\n\t\t\t\t   sroute_opt, optr - sroute_opt) < 0)\n\t\terr_sys(\"setsockopt error for IP_OPTIONS\");\n\n\tsroute_cnt = 0;\t\t/* don't call this function again */\n}\n"
  },
  {
    "path": "sock/sourcesink.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n#include\t<ctype.h>\n\nvoid\tpattern(char *ptr, int len);\n\nvoid\nsink(int sockfd)\n{\n\tint\t\ti, n;\n\tchar\toob;\n\n\tif (client) {\n\t\tpattern(wbuf, writelen);\t/* fill send buffer with a pattern */\n\n\t\tif (pauseinit)\n\t\t\tsleep(pauseinit);\n\n\t\tfor (i = 1; i <= nbuf; i++) {\n\t\t\tif (urgwrite == i) {\n\t\t\t\toob = urgwrite;\n\t\t\t\tif ( (n = send(sockfd, &oob, 1, MSG_OOB)) != 1)\n\t\t\t\t\terr_sys(\"send of MSG_OOB returned %d, expected %d\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tn, writelen);\n\t\t\t\tif (verbose)\n\t\t\t\t\tfprintf(stderr, \"wrote %d byte of urgent data\\n\", n);\n\t\t\t}\n\n\t\t\tif ( (n = write(sockfd, wbuf, writelen)) != writelen)\n\t\t\t\terr_sys(\"write returned %d, expected %d\", n, writelen);\n\t\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"wrote %d bytes\\n\", n);\n\n\t\t\tif (pauserw)\n\t\t\t\tsleep(pauserw);\n\t\t}\n\n\t} else {\n\n\t\tif (pauseinit)\n\t\t\tsleep(pauseinit);\n\n\t\tfor ( ; ; ) {\n\t\t\tif ( (n = read(sockfd, rbuf, readlen)) < 0) {\n\t\t\t\terr_sys(\"read error\");\n\n\t\t\t} else if (n == 0) {\n\t\t\t\tbreak;\t \t/* connection closed by peer */\n\n\t\t\t} else if (n != readlen)\n\t\t\t\terr_quit(\"read returned %d, expected %d\", n, readlen);\n\t\n\t\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"received %d bytes\\n\", n);\n\n\t\t\tif (pauserw)\n\t\t\t\tsleep(pauserw);\n\t\t}\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep(pauseclose);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n\nvoid\npattern(char *ptr, int len)\n{\n\tchar\tc;\n\n\tc = 0;\n\twhile(len-- > 0)  {\n\t\twhile(isprint((c & 0x7F)) == 0)\n\t\t\tc++;\t/* skip over nonprinting characters */\n\t\t*ptr++ = (c++ & 0x7F);\n\t}\n}\n"
  },
  {
    "path": "sock/sourcetcp.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nvoid\nsource_tcp(int sockfd)\n{\n\tint\t\t\ti, n, option;\n\tsocklen_t\toptlen;\n\tchar\t\toob;\n\n\tpattern(wbuf, writelen);\t/* fill send buffer with a pattern */\n\n\tif (pauseinit)\n\t\tsleep_us(pauseinit*1000);\n\n\tfor (i = 1; i <= nbuf; i++) {\n\t\tif (urgwrite == i) {\n\t\t\toob = urgwrite;\n\t\t\tif ( (n = send(sockfd, &oob, 1, MSG_OOB)) != 1)\n\t\t\t\terr_sys(\"send of MSG_OOB returned %d, expected %d\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tn, writelen);\n\t\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"wrote %d byte of urgent data\\n\", n);\n\t\t}\n\n\t\tif ( (n = write(sockfd, wbuf, writelen)) != writelen) {\n\t\t\tif (ignorewerr) {\n\t\t\t\terr_ret(\"write returned %d, expected %d\", n, writelen);\n\t\t\t\t\t\t/* also call getsockopt() to clear so_error */\n\t\t\t\toptlen = sizeof(option);\n       \t\t\tif (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,\n\t\t\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n           \t\t\terr_sys(\"SO_ERROR getsockopt error\");\n\t\t\t} else\n\t\t\t\terr_sys(\"write returned %d, expected %d\", n, writelen);\n\n\t\t} else if (verbose)\n\t\t\tfprintf(stderr, \"wrote %d bytes\\n\", n);\n\n\t\tif (pauserw)\n\t\t\tsleep_us(pauserw*1000);\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep_us(pauseclose*1000);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n"
  },
  {
    "path": "sock/sourceudp.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n\nvoid\nsource_udp(int sockfd)\t/* TODO: use sendto ?? */\n{\n\tint\t\t\ti, n, option;\n\tsocklen_t\toptlen;\n\n\tpattern(wbuf, writelen);\t/* fill send buffer with a pattern */\n\n\tif (pauseinit)\n\t\tsleep_us(pauseinit*1000);\n\n\tfor (i = 1; i <= nbuf; i++) {\n\t\tif (connectudp) {\n\t\t\tif ( (n = write(sockfd, wbuf, writelen)) != writelen) {\n\t\t\t\tif (ignorewerr) {\n\t\t\t\t\terr_ret(\"write returned %d, expected %d\", n, writelen);\n\t\t\t\t\t\t/* also call getsockopt() to clear so_error */\n\t\t\t\t\toptlen = sizeof(option);\n       \t\t\t\tif (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,\n\t\t\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n           \t\t\t\terr_sys(\"SO_ERROR getsockopt error\");\n\t\t\t\t} else\n\t\t\t\t\terr_sys(\"write returned %d, expected %d\", n, writelen);\n\t\t\t}\n\t\t} else {\n\t\t\tif ( (n = sendto(sockfd, wbuf, writelen, 0,\n\t\t\t\t\t\t     (struct sockaddr *) &servaddr,\n\t\t\t\t\t\t\t sizeof(servaddr))) != writelen) {\n\t\t\t\tif (ignorewerr) {\n\t\t\t\t\terr_ret(\"sendto returned %d, expected %d\", n, writelen);\n\t\t\t\t\t\t/* also call getsockopt() to clear so_error */\n\t\t\t\t\toptlen = sizeof(option);\n       \t\t\t\tif (getsockopt(sockfd, SOL_SOCKET, SO_ERROR,\n\t\t\t\t\t\t\t\t\t\t\t\t&option, &optlen) < 0)\n           \t\t\t\terr_sys(\"SO_ERROR getsockopt error\");\n\t\t\t\t} else\n\t\t\t\t\terr_sys(\"sendto returned %d, expected %d\", n, writelen);\n\t\t\t}\n\t\t}\n\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"wrote %d bytes\\n\", n);\n\n\t\tif (pauserw)\n\t\t\tsleep_us(pauserw*1000);\n\t}\n\n\tif (pauseclose) {\n\t\tif (verbose)\n\t\t\t\tfprintf(stderr, \"pausing before close\\n\");\n\t\tsleep_us(pauseclose*1000);\n\t}\n\n\tif (close(sockfd) < 0)\n\t\terr_sys(\"close error\");\t\t/* since SO_LINGER may be set */\n}\n"
  },
  {
    "path": "sock/strerror.c",
    "content": "#include\t<stdio.h>\n\nextern const char\t*const sys_errlist[];\nextern int\t\tsys_nerr;\n\nchar *\nstrerror(int error)\n{\n\tstatic char\tmesg[30];\n\n\tif (error >= 0 && error <= sys_nerr)\n\t\treturn(sys_errlist[error]);\n\n\tsnprintf(mesg, sizeof(mesg), \"Unknown error (%d)\", error);\n\treturn(mesg);\n}\n"
  },
  {
    "path": "sock/tellwait.c",
    "content": "#include\t<signal.h>\n#include\t\"ourhdr.h\"\n\nstatic volatile sig_atomic_t\tsigflag;\n\t\t\t\t\t\t\t\t/* set nonzero by signal handler */\nstatic sigset_t\t\t\tnewmask, oldmask, zeromask;\n\nstatic void\nsig_usr(int signo)\t/* one signal handler for SIGUSR1 and SIGUSR2 */\n{\n\tsigflag = 1;\n\treturn;\n}\n\nvoid\nTELL_WAIT()\n{\n\tif (signal(SIGUSR1, sig_usr) == SIG_ERR)\n\t\terr_sys(\"signal(SIGINT) error\");\n\tif (signal(SIGUSR2, sig_usr) == SIG_ERR)\n\t\terr_sys(\"signal(SIGQUIT) error\");\n\n\tsigemptyset(&zeromask);\n\n\tsigemptyset(&newmask);\n\tsigaddset(&newmask, SIGUSR1);\n\tsigaddset(&newmask, SIGUSR2);\n\t\t/* block SIGUSR1 and SIGUSR2, and save current signal mask */\n\tif (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)\n\t\terr_sys(\"SIG_BLOCK error\");\n}\n\nvoid\nTELL_PARENT(pid_t pid)\n{\n\tkill(pid, SIGUSR2);\t\t/* tell parent we're done */\n}\n\nvoid\nWAIT_PARENT(void)\n{\n\twhile (sigflag == 0)\n\t\tsigsuspend(&zeromask);\t/* and wait for parent */\n\n\tsigflag = 0;\n\t\t\t/* reset signal mask to original value */\n\tif (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)\n\t\terr_sys(\"SIG_SETMASK error\");\n}\n\nvoid\nTELL_CHILD(pid_t pid)\n{\n\tkill(pid, SIGUSR1);\t\t\t/* tell child we're done */\n}\n\nvoid\nWAIT_CHILD(void)\n{\n\twhile (sigflag == 0)\n\t\tsigsuspend(&zeromask);\t/* and wait for child */\n\n\tsigflag = 0;\n\t\t\t/* reset signal mask to original value */\n\tif (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)\n\t\terr_sys(\"SIG_SETMASK error\");\n}\n"
  },
  {
    "path": "sock/write.c",
    "content": "/*\n * Copyright (c) 1993 W. Richard Stevens.  All rights reserved.\n * Permission to use or modify this software and its documentation only for\n * educational purposes and without fee is hereby granted, provided that\n * the above copyright notice appear in all copies.  The author makes no\n * representations about the suitability of this software for any purpose.\n * It is provided \"as is\" without express or implied warranty.\n */\n\n#include\t\"sock.h\"\n#include\t<sys/uio.h>\t\t/* for writev() */\n\n#ifndef\tUIO_MAXIOV\n#define\tUIO_MAXIOV\t16\t/* we assume this; may not be true? */\n#endif\n\nssize_t\ndowrite(int fd, const void *vptr, size_t nbytes)\n{\n\tstruct iovec\tiov[UIO_MAXIOV];\n\tconst char\t\t*ptr;\n\tint\t\t\t\tchunksize, i, n, nleft, nwritten, ntotal;\n\n\tif (chunkwrite == 0 && usewritev == 0)\n\t\treturn(write(fd, vptr, nbytes));\t\t/* common case */\n\n\t/*\n\t * Figure out what sized chunks to write.\n\t * Try to use UIO_MAXIOV chunks.\n\t */\n\n\tchunksize = nbytes / UIO_MAXIOV;\n\tif (chunksize <= 0)\n\t\tchunksize = 1;\n\telse if ((nbytes % UIO_MAXIOV) != 0)\n\t\tchunksize++;\n\n\tptr = vptr;\n\tnleft = nbytes;\n\tfor (i = 0; i < UIO_MAXIOV; i++) {\n\t\tiov[i].iov_base = ptr;\n\t\tn = (nleft >= chunksize) ? chunksize : nleft;\n\t\tiov[i].iov_len = n;\n\t\tif (verbose)\n\t\t\tfprintf(stderr, \"iov[%2d].iov_base = %x, iov[%2d].iov_len = %d\\n\",\n\t\t\t\t\t\ti, iov[i].iov_base, i, iov[i].iov_len);\n\t\tptr += n;\n\t\tif ((nleft -= n) == 0)\n\t\t\tbreak;\n\t}\n\tif (i == UIO_MAXIOV)\n\t\terr_quit(\"i == UIO_MAXIOV\");\n\n\tif (usewritev)\n\t\treturn(writev(fd, iov, i+1));\n\telse {\n\t\tntotal = 0;\n\t\tfor (n = 0; n <= i; n++) {\n\t\t\tnwritten = write(fd, iov[n].iov_base, iov[n].iov_len);\n\t\t\tif (nwritten != iov[n].iov_len)\n\t\t\t\treturn(-1);\n\t\t\tntotal += nwritten;\n\t\t}\n\t\treturn(ntotal);\n\t}\n}\n"
  },
  {
    "path": "sock/writen.c",
    "content": "#include\t\"ourhdr.h\"\n\nssize_t\t\t\t\t\t\t/* Write \"n\" bytes to a descriptor. */\nwriten(int fd, const void *vptr, size_t n)\n{\n\tsize_t\t\tnleft, nwritten;\n\tconst char\t*ptr;\n\n\tptr = vptr;\t/* can't do pointer arithmetic on void* */\n\tnleft = n;\n\twhile (nleft > 0) {\n\t\tif ( (nwritten = write(fd, ptr, nleft)) <= 0)\n\t\t\treturn(nwritten);\t\t/* error */\n\n\t\tnleft -= nwritten;\n\t\tptr   += nwritten;\n\t}\n\treturn(n);\n}\n"
  },
  {
    "path": "sockopt/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tcheckopts prdefaults rcvbuf rcvbufset sockopt\n\nall:\t${PROGS}\n\nsockopt:\tsockopt.o\n\t\t${CC} ${CFLAGS} -o $@ sockopt.o ${LIBS}\n\ncheckopts:\tcheckopts.o\n\t\t${CC} ${CFLAGS} -o $@ checkopts.o ${LIBS}\n\nprdefaults:\tprdefaults.o\n\t\t${CC} ${CFLAGS} -o $@ prdefaults.o ${LIBS}\n\nrcvbuf:\trcvbuf.o\n\t\t${CC} ${CFLAGS} -o $@ rcvbuf.o ${LIBS}\n\nrcvbufset:\trcvbufset.o\n\t\t${CC} ${CFLAGS} -o $@ rcvbufset.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "sockopt/checkopts.c",
    "content": "/* include checkopts1 */\n/* *INDENT-OFF* */\n#include\t\"unp.h\"\n#include\t<netinet/tcp.h>\t\t/* for TCP_xxx defines */\n\nunion val {\n  int\t\t\t\ti_val;\n  long\t\t\t\tl_val;\n  struct linger\t\tlinger_val;\n  struct timeval\ttimeval_val;\n} val;\n\nstatic char\t*sock_str_flag(union val *, int);\nstatic char\t*sock_str_int(union val *, int);\nstatic char\t*sock_str_linger(union val *, int);\nstatic char\t*sock_str_timeval(union val *, int);\n\nstruct sock_opts {\n  const char\t   *opt_str;\n  int\t\topt_level;\n  int\t\topt_name;\n  char   *(*opt_val_str)(union val *, int);\n} sock_opts[] = {\n\t{ \"SO_BROADCAST\",\t\tSOL_SOCKET,\tSO_BROADCAST,\tsock_str_flag },\n\t{ \"SO_DEBUG\",\t\t\tSOL_SOCKET,\tSO_DEBUG,\t\tsock_str_flag },\n\t{ \"SO_DONTROUTE\",\t\tSOL_SOCKET,\tSO_DONTROUTE,\tsock_str_flag },\n\t{ \"SO_ERROR\",\t\t\tSOL_SOCKET,\tSO_ERROR,\t\tsock_str_int },\n\t{ \"SO_KEEPALIVE\",\t\tSOL_SOCKET,\tSO_KEEPALIVE,\tsock_str_flag },\n\t{ \"SO_LINGER\",\t\t\tSOL_SOCKET,\tSO_LINGER,\t\tsock_str_linger },\n\t{ \"SO_OOBINLINE\",\t\tSOL_SOCKET,\tSO_OOBINLINE,\tsock_str_flag },\n\t{ \"SO_RCVBUF\",\t\t\tSOL_SOCKET,\tSO_RCVBUF,\t\tsock_str_int },\n\t{ \"SO_SNDBUF\",\t\t\tSOL_SOCKET,\tSO_SNDBUF,\t\tsock_str_int },\n\t{ \"SO_RCVLOWAT\",\t\tSOL_SOCKET,\tSO_RCVLOWAT,\tsock_str_int },\n\t{ \"SO_SNDLOWAT\",\t\tSOL_SOCKET,\tSO_SNDLOWAT,\tsock_str_int },\n\t{ \"SO_RCVTIMEO\",\t\tSOL_SOCKET,\tSO_RCVTIMEO,\tsock_str_timeval },\n\t{ \"SO_SNDTIMEO\",\t\tSOL_SOCKET,\tSO_SNDTIMEO,\tsock_str_timeval },\n\t{ \"SO_REUSEADDR\",\t\tSOL_SOCKET,\tSO_REUSEADDR,\tsock_str_flag },\n#ifdef\tSO_REUSEPORT\n\t{ \"SO_REUSEPORT\",\t\tSOL_SOCKET,\tSO_REUSEPORT,\tsock_str_flag },\n#else\n\t{ \"SO_REUSEPORT\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n\t{ \"SO_TYPE\",\t\t\tSOL_SOCKET,\tSO_TYPE,\t\tsock_str_int },\n\t{ \"SO_USELOOPBACK\",\t\tSOL_SOCKET,\tSO_USELOOPBACK,\tsock_str_flag },\n\t{ \"IP_TOS\",\t\t\t\tIPPROTO_IP,\tIP_TOS,\t\t\tsock_str_int },\n\t{ \"IP_TTL\",\t\t\t\tIPPROTO_IP,\tIP_TTL,\t\t\tsock_str_int },\n#ifdef\tIPV6_DONTFRAG\n\t{ \"IPV6_DONTFRAG\",\t\tIPPROTO_IPV6,IPV6_DONTFRAG,\tsock_str_flag },\n#else\n\t{ \"IPV6_DONTFRAG\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n#ifdef\tIPV6_UNICAST_HOPS\n\t{ \"IPV6_UNICAST_HOPS\",\tIPPROTO_IPV6,IPV6_UNICAST_HOPS,sock_str_int },\n#else\n\t{ \"IPV6_UNICAST_HOPS\",\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n#ifdef\tIPV6_V6ONLY\n\t{ \"IPV6_V6ONLY\",\t\tIPPROTO_IPV6,IPV6_V6ONLY,\tsock_str_flag },\n#else\n\t{ \"IPV6_V6ONLY\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n\t{ \"TCP_MAXSEG\",\t\t\tIPPROTO_TCP,TCP_MAXSEG,\t\tsock_str_int },\n\t{ \"TCP_NODELAY\",\t\tIPPROTO_TCP,TCP_NODELAY,\tsock_str_flag },\n#ifdef\tSCTP_AUTOCLOSE\n\t{ \"SCTP_AUTOCLOSE\",\t\tIPPROTO_SCTP,SCTP_AUTOCLOSE,sock_str_int },\n#else\n\t{ \"SCTP_AUTOCLOSE\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n#ifdef\tSCTP_MAXBURST\n\t{ \"SCTP_MAXBURST\",\t\tIPPROTO_SCTP,SCTP_MAXBURST,\tsock_str_int },\n#else\n\t{ \"SCTP_MAXBURST\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n#ifdef\tSCTP_MAXSEG\n\t{ \"SCTP_MAXSEG\",\t\tIPPROTO_SCTP,SCTP_MAXSEG,\tsock_str_int },\n#else\n\t{ \"SCTP_MAXSEG\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n#ifdef\tSCTP_NODELAY\n\t{ \"SCTP_NODELAY\",\t\tIPPROTO_SCTP,SCTP_NODELAY,\tsock_str_flag },\n#else\n\t{ \"SCTP_NODELAY\",\t\t0,\t\t\t0,\t\t\t\tNULL },\n#endif\n\t{ NULL,\t\t\t\t\t0,\t\t\t0,\t\t\t\tNULL }\n};\n/* *INDENT-ON* */\n/* end checkopts1 */\n\n/* include checkopts2 */\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tfd;\n\tsocklen_t\t\t\tlen;\n\tstruct sock_opts\t*ptr;\n\n\tfor (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {\n\t\tprintf(\"%s: \", ptr->opt_str);\n\t\tif (ptr->opt_val_str == NULL)\n\t\t\tprintf(\"(undefined)\\n\");\n\t\telse {\n\t\t\tswitch(ptr->opt_level) {\n\t\t\tcase SOL_SOCKET:\n\t\t\tcase IPPROTO_IP:\n\t\t\tcase IPPROTO_TCP:\n\t\t\t\tfd = Socket(AF_INET, SOCK_STREAM, 0);\n\t\t\t\tbreak;\n#ifdef\tIPV6\n\t\t\tcase IPPROTO_IPV6:\n\t\t\t\tfd = Socket(AF_INET6, SOCK_STREAM, 0);\n\t\t\t\tbreak;\n#endif\n#ifdef\tIPPROTO_SCTP\n\t\t\tcase IPPROTO_SCTP:\n\t\t\t\tfd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);\n\t\t\t\tbreak;\n#endif\n\t\t\tdefault:\n\t\t\t\terr_quit(\"Can't create fd for level %d\\n\", ptr->opt_level);\n\t\t\t}\n\n\t\t\tlen = sizeof(val);\n\t\t\tif (getsockopt(fd, ptr->opt_level, ptr->opt_name,\n\t\t\t\t\t\t   &val, &len) == -1) {\n\t\t\t\terr_ret(\"getsockopt error\");\n\t\t\t} else {\n\t\t\t\tprintf(\"default = %s\\n\", (*ptr->opt_val_str)(&val, len));\n\t\t\t}\n\t\t\tclose(fd);\n\t\t}\n\t}\n\texit(0);\n}\n/* end checkopts2 */\n\n/* include checkopts3 */\nstatic char\tstrres[128];\n\nstatic char\t*\nsock_str_flag(union val *ptr, int len)\n{\n/* *INDENT-OFF* */\n\tif (len != sizeof(int))\n\t\tsnprintf(strres, sizeof(strres), \"size (%d) not sizeof(int)\", len);\n\telse\n\t\tsnprintf(strres, sizeof(strres),\n\t\t\t\t \"%s\", (ptr->i_val == 0) ? \"off\" : \"on\");\n\treturn(strres);\n/* *INDENT-ON* */\n}\n/* end checkopts3 */\n\nstatic char\t*\nsock_str_int(union val *ptr, int len)\n{\n\tif (len != sizeof(int))\n\t\tsnprintf(strres, sizeof(strres), \"size (%d) not sizeof(int)\", len);\n\telse\n\t\tsnprintf(strres, sizeof(strres), \"%d\", ptr->i_val);\n\treturn(strres);\n}\n\nstatic char\t*\nsock_str_linger(union val *ptr, int len)\n{\n\tstruct linger\t*lptr = &ptr->linger_val;\n\n\tif (len != sizeof(struct linger))\n\t\tsnprintf(strres, sizeof(strres),\n\t\t\t\t \"size (%d) not sizeof(struct linger)\", len);\n\telse\n\t\tsnprintf(strres, sizeof(strres), \"l_onoff = %d, l_linger = %d\",\n\t\t\t\t lptr->l_onoff, lptr->l_linger);\n\treturn(strres);\n}\n\nstatic char\t*\nsock_str_timeval(union val *ptr, int len)\n{\n\tstruct timeval\t*tvptr = &ptr->timeval_val;\n\n\tif (len != sizeof(struct timeval))\n\t\tsnprintf(strres, sizeof(strres),\n\t\t\t\t \"size (%d) not sizeof(struct timeval)\", len);\n\telse\n\t\tsnprintf(strres, sizeof(strres), \"%d sec, %d usec\",\n\t\t\t\t tvptr->tv_sec, tvptr->tv_usec);\n\treturn(strres);\n}\n"
  },
  {
    "path": "sockopt/checkopts.lc",
    "content": "/* include checkopts1 */\n#include    \"unp.h\"##  1 ##src/sockopt/checkopts.c##\n#include    <netinet/tcp.h>     /* for TCP_xxx defines */##  2 ##src/sockopt/checkopts.c##\n\nunion val {##  3 ##src/sockopt/checkopts.c##\n  int               i_val;##  4 ##src/sockopt/checkopts.c##\n  long              l_val;##  5 ##src/sockopt/checkopts.c##\n  char              c_val[10];##  6 ##src/sockopt/checkopts.c##\n  struct linger     linger_val;##  7 ##src/sockopt/checkopts.c##\n  struct timeval    timeval_val;##  8 ##src/sockopt/checkopts.c##\n} val;##  9 ##src/sockopt/checkopts.c##\n\nstatic char *sock_str_flag(union val *, int);## 10 ##src/sockopt/checkopts.c##\nstatic char *sock_str_int(union val *, int);## 11 ##src/sockopt/checkopts.c##\nstatic char *sock_str_linger(union val *, int);## 12 ##src/sockopt/checkopts.c##\nstatic char *sock_str_timeval(union val *, int);## 13 ##src/sockopt/checkopts.c##\n\nstruct sock_opts {## 14 ##src/sockopt/checkopts.c##\n  char     *opt_str;## 15 ##src/sockopt/checkopts.c##\n  int       opt_level;## 16 ##src/sockopt/checkopts.c##\n  int       opt_name;## 17 ##src/sockopt/checkopts.c##\n  char   *(*opt_val_str)(union val *, int);## 18 ##src/sockopt/checkopts.c##\n} sock_opts[] = {## 19 ##src/sockopt/checkopts.c##\n    \"SO_BROADCAST\",     SOL_SOCKET, SO_BROADCAST,   sock_str_flag,## 20 ##src/sockopt/checkopts.c##\n    \"SO_DEBUG\",         SOL_SOCKET, SO_DEBUG,       sock_str_flag,## 21 ##src/sockopt/checkopts.c##\n    \"SO_DONTROUTE\",     SOL_SOCKET, SO_DONTROUTE,   sock_str_flag,## 22 ##src/sockopt/checkopts.c##\n    \"SO_ERROR\",         SOL_SOCKET, SO_ERROR,       sock_str_int,## 23 ##src/sockopt/checkopts.c##\n    \"SO_KEEPALIVE\",     SOL_SOCKET, SO_KEEPALIVE,   sock_str_flag,## 24 ##src/sockopt/checkopts.c##\n    \"SO_LINGER\",        SOL_SOCKET, SO_LINGER,      sock_str_linger,## 25 ##src/sockopt/checkopts.c##\n    \"SO_OOBINLINE\",     SOL_SOCKET, SO_OOBINLINE,   sock_str_flag,## 26 ##src/sockopt/checkopts.c##\n    \"SO_RCVBUF\",        SOL_SOCKET, SO_RCVBUF,      sock_str_int,## 27 ##src/sockopt/checkopts.c##\n    \"SO_SNDBUF\",        SOL_SOCKET, SO_SNDBUF,      sock_str_int,## 28 ##src/sockopt/checkopts.c##\n    \"SO_RCVLOWAT\",      SOL_SOCKET, SO_RCVLOWAT,    sock_str_int,## 29 ##src/sockopt/checkopts.c##\n    \"SO_SNDLOWAT\",      SOL_SOCKET, SO_SNDLOWAT,    sock_str_int,## 30 ##src/sockopt/checkopts.c##\n    \"SO_RCVTIMEO\",      SOL_SOCKET, SO_RCVTIMEO,    sock_str_timeval,## 31 ##src/sockopt/checkopts.c##\n    \"SO_SNDTIMEO\",      SOL_SOCKET, SO_SNDTIMEO,    sock_str_timeval,## 32 ##src/sockopt/checkopts.c##\n    \"SO_REUSEADDR\",     SOL_SOCKET, SO_REUSEADDR,   sock_str_flag,## 33 ##src/sockopt/checkopts.c##\n#ifdef  SO_REUSEPORT## 34 ##src/sockopt/checkopts.c##\n    \"SO_REUSEPORT\",     SOL_SOCKET, SO_REUSEPORT,   sock_str_flag,## 35 ##src/sockopt/checkopts.c##\n#else## 36 ##src/sockopt/checkopts.c##\n    \"SO_REUSEPORT\",     0,          0,              NULL,## 37 ##src/sockopt/checkopts.c##\n#endif## 38 ##src/sockopt/checkopts.c##\n    \"SO_TYPE\",          SOL_SOCKET, SO_TYPE,        sock_str_int,## 39 ##src/sockopt/checkopts.c##\n    \"SO_USELOOPBACK\",   SOL_SOCKET, SO_USELOOPBACK, sock_str_flag,## 40 ##src/sockopt/checkopts.c##\n    \"IP_TOS\",           IPPROTO_IP, IP_TOS,         sock_str_int,## 41 ##src/sockopt/checkopts.c##\n    \"IP_TTL\",           IPPROTO_IP, IP_TTL,         sock_str_int,## 42 ##src/sockopt/checkopts.c##\n    \"TCP_MAXSEG\",       IPPROTO_TCP,TCP_MAXSEG,     sock_str_int,## 43 ##src/sockopt/checkopts.c##\n    \"TCP_NODELAY\",      IPPROTO_TCP,TCP_NODELAY,    sock_str_flag,## 44 ##src/sockopt/checkopts.c##\n    NULL,               0,          0,              NULL## 45 ##src/sockopt/checkopts.c##\n};## 46 ##src/sockopt/checkopts.c##\n/* end checkopts1 */\n\n/* include checkopts2 */\nint## 47 ##src/sockopt/checkopts.c##\nmain(int argc, char **argv)## 48 ##src/sockopt/checkopts.c##\n{## 49 ##src/sockopt/checkopts.c##\n    int     fd, len;## 50 ##src/sockopt/checkopts.c##\n    struct sock_opts *ptr;## 51 ##src/sockopt/checkopts.c##\n\n    fd = Socket(AF_INET, SOCK_STREAM, 0);## 52 ##src/sockopt/checkopts.c##\n\n    for (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {## 53 ##src/sockopt/checkopts.c##\n        printf(\"%s: \", ptr->opt_str);## 54 ##src/sockopt/checkopts.c##\n        if (ptr->opt_val_str == NULL)## 55 ##src/sockopt/checkopts.c##\n            printf(\"(undefined)\\n\");## 56 ##src/sockopt/checkopts.c##\n        else {## 57 ##src/sockopt/checkopts.c##\n            len = sizeof(val);## 58 ##src/sockopt/checkopts.c##\n            if (getsockopt(fd, ptr->opt_level, ptr->opt_name,## 59 ##src/sockopt/checkopts.c##\n                           &val, &len) == -1) {## 60 ##src/sockopt/checkopts.c##\n                err_ret(\"getsockopt error\");## 61 ##src/sockopt/checkopts.c##\n            } else {## 62 ##src/sockopt/checkopts.c##\n                printf(\"default = %s\\n\", (*ptr->opt_val_str) (&val, len));## 63 ##src/sockopt/checkopts.c##\n            }## 64 ##src/sockopt/checkopts.c##\n        }## 65 ##src/sockopt/checkopts.c##\n    }## 66 ##src/sockopt/checkopts.c##\n    exit(0);## 67 ##src/sockopt/checkopts.c##\n}## 68 ##src/sockopt/checkopts.c##\n/* end checkopts2 */\n\n/* include checkopts3 */\nstatic char strres[128];## 69 ##src/sockopt/checkopts.c##\n\nstatic char *## 70 ##src/sockopt/checkopts.c##\nsock_str_flag(union val *ptr, int len)## 71 ##src/sockopt/checkopts.c##\n{## 72 ##src/sockopt/checkopts.c##\n    if (len != sizeof(int))## 73 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres), \"size (%d) not sizeof(int)\", len);## 74 ##src/sockopt/checkopts.c##\n    else## 75 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres),## 76 ##src/sockopt/checkopts.c##\n                 \"%s\", (ptr->i_val == 0) ? \"off\" : \"on\");## 77 ##src/sockopt/checkopts.c##\n    return(strres);## 78 ##src/sockopt/checkopts.c##\n}## 79 ##src/sockopt/checkopts.c##\n/* end checkopts3 */\n\nstatic char *## 80 ##src/sockopt/checkopts.c##\nsock_str_int(union val *ptr, int len)## 81 ##src/sockopt/checkopts.c##\n{## 82 ##src/sockopt/checkopts.c##\n    if (len != sizeof(int))## 83 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres), \"size (%d) not sizeof(int)\", len);## 84 ##src/sockopt/checkopts.c##\n    else## 85 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres), \"%d\", ptr->i_val);## 86 ##src/sockopt/checkopts.c##\n    return (strres);## 87 ##src/sockopt/checkopts.c##\n}## 88 ##src/sockopt/checkopts.c##\n\nstatic char *## 89 ##src/sockopt/checkopts.c##\nsock_str_linger(union val *ptr, int len)## 90 ##src/sockopt/checkopts.c##\n{## 91 ##src/sockopt/checkopts.c##\n    struct linger *lptr = &ptr->linger_val;## 92 ##src/sockopt/checkopts.c##\n\n    if (len != sizeof(struct linger))## 93 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres),## 94 ##src/sockopt/checkopts.c##\n                 \"size (%d) not sizeof(struct linger)\", len);## 95 ##src/sockopt/checkopts.c##\n    else## 96 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres), \"l_onoff = %d, l_linger = %d\",## 97 ##src/sockopt/checkopts.c##\n                 lptr->l_onoff, lptr->l_linger);## 98 ##src/sockopt/checkopts.c##\n    return (strres);## 99 ##src/sockopt/checkopts.c##\n}##100 ##src/sockopt/checkopts.c##\n\nstatic char *##101 ##src/sockopt/checkopts.c##\nsock_str_timeval(union val *ptr, int len)##102 ##src/sockopt/checkopts.c##\n{##103 ##src/sockopt/checkopts.c##\n    struct timeval *tvptr = &ptr->timeval_val;##104 ##src/sockopt/checkopts.c##\n\n    if (len != sizeof(struct timeval))##105 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres),##106 ##src/sockopt/checkopts.c##\n                 \"size (%d) not sizeof(struct timeval)\", len);##107 ##src/sockopt/checkopts.c##\n    else##108 ##src/sockopt/checkopts.c##\n        snprintf(strres, sizeof(strres), \"%d sec, %d usec\",##109 ##src/sockopt/checkopts.c##\n                 tvptr->tv_sec, tvptr->tv_usec);##110 ##src/sockopt/checkopts.c##\n    return (strres);##111 ##src/sockopt/checkopts.c##\n}##112 ##src/sockopt/checkopts.c##\n"
  },
  {
    "path": "sockopt/prdefaults.c",
    "content": "#include\t\"unp.h\"\n\nstatic doit(int, const char *);\n\nvoid\nmain()\n{\n\tint\t\ttcpsock, udpsock;\n\tstruct sockaddr_in\tservaddr;\n\n\tif ( (tcpsock = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n\t\terr_sys(\"TCP socket error\");\n\n#ifdef notdef\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_port        = htons(9);\n\tif (ascii2addr(AF_INET, \"127.0.0.1\", &servaddr.sin_addr) != 4)\n\t\terr_quit(\"ascii2addr error\");\n\n\tif (connect(tcpsock, (SA *) &servaddr, sizeof(servaddr)) < 0)\n\t\terr_sys(\"connect error\");\n#endif\n\n\tdoit(tcpsock, \"tcp\");\n\n\tif ( (udpsock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)\n\t\terr_sys(\"UDP socket error\");\n\n\tdoit(udpsock, \"udp\");\n\texit(0);\n}\n\nstatic\ndoit(int fd, const char *name)\n{\n\tint\t\t\tval;\n\tsocklen_t\toptlen;\n\n\toptlen = sizeof(val);\n\tif (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &optlen) < 0)\n\t\terr_sys(\"SO_SNDBUF getsockopt error\");\n\tprintf(\"%s send buffer size = %d\\n\", name, val);\n\n\toptlen = sizeof(val);\n\tif (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, &optlen) < 0)\n\t\terr_sys(\"SO_RCVBUF getsockopt error\");\n\tprintf(\"%s recv buffer size = %d\\n\", name, val);\n\n\toptlen = sizeof(val);\n\tif (getsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, &optlen) < 0)\n\t\terr_sys(\"SO_SNDLOWAT getsockopt error\");\n\tprintf(\"%s send low-water mark = %d\\n\", name, val);\n\n\toptlen = sizeof(val);\n\tif (getsockopt(fd, SOL_SOCKET, SO_RCVLOWAT, &val, &optlen) < 0)\n\t\terr_sys(\"SO_RCVLOWAT getsockopt error\");\n\tprintf(\"%s receive low-water mark size = %d\\n\", name, val);\n}\n"
  },
  {
    "path": "sockopt/rcvbuf.c",
    "content": "#include\t\"unp.h\"\n#include\t<netinet/tcp.h>\t\t/* for TCP_MAXSEG */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, rcvbuf, mss;\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: rcvbuf <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tlen = sizeof(rcvbuf);\n\tGetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);\n\tlen = sizeof(mss);\n\tGetsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);\n\tprintf(\"defaults: SO_RCVBUF = %d, MSS = %d\\n\", rcvbuf, mss);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tlen = sizeof(rcvbuf);\n\tGetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);\n\tlen = sizeof(mss);\n\tGetsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);\n\tprintf(\"after connect: SO_RCVBUF = %d, MSS = %d\\n\", rcvbuf, mss);\n\n\texit(0);\n}\n"
  },
  {
    "path": "sockopt/rcvbufset.c",
    "content": "#include\t\"unp.h\"\n#include\t<netinet/tcp.h>\t\t/* for TCP_MAXSEG */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd, rcvbuf, mss;\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: rcvbufset <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tlen = sizeof(rcvbuf);\n\tGetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);\n\tlen = sizeof(mss);\n\tGetsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);\n\tprintf(\"defaults: SO_RCVBUF = %d, MSS = %d\\n\", rcvbuf, mss);\n\n\trcvbuf = 9973;\t\t/* a prime number */\n\tSetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));\n\tlen = sizeof(rcvbuf);\n\tGetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);\n\tprintf(\"SO_RCVBUF = %d (after setting it to 9973)\\n\", rcvbuf);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tlen = sizeof(rcvbuf);\n\tGetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);\n\tlen = sizeof(mss);\n\tGetsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);\n\tprintf(\"after connect: SO_RCVBUF = %d, MSS = %d\\n\", rcvbuf, mss);\n\n\n\t exit(0);\n}\n"
  },
  {
    "path": "sockopt/sockopt.c",
    "content": "#include\t\"unp.h\"\n#include\t<netinet/tcp.h>\t\t/* for TCP_MAXSEG value */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tsockfd, mss, sendbuff;\n\tsocklen_t\toptlen;\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\t\t/* Fetch and print the TCP maximum segment size.  */\n\toptlen = sizeof(mss);\n\tGetsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &optlen);\n\tprintf(\"TCP mss = %d\\n\", mss);\n\n\t\t/* Set the send buffer size, then fetch it and print its value.  */\n\tsendbuff = 65536;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff));\n\n\toptlen = sizeof(sendbuff);\n\tGetsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen);\n\tprintf(\"send buffer size = %d\\n\", sendbuff);\n\texit(0);\n}\n"
  },
  {
    "path": "sparc64-unknown-freebsd5.1/config.h",
    "content": "/* config.h.  Generated automatically by configure.  */\n/* config.h.in.  Generated automatically from configure.in by autoheader.  */\n\n/* CPU, vendor, and operating system */\n#define CPU_VENDOR_OS \"sparc64-unknown-freebsd5.1\"\n\n/* Define if <netdb.h> defines struct addrinfo */\n#define HAVE_ADDRINFO_STRUCT 1\n\n/* Define if you have the <arpa/inet.h> header file. */\n#define HAVE_ARPA_INET_H 1\n\n/* Define if you have the `bzero' function. */\n#define HAVE_BZERO 1\n\n/* Define if the /dev/streams/xtiso/tcp device exists */\n/* #undef HAVE_DEV_STREAMS_XTISO_TCP */\n\n/* Define if the /dev/tcp device exists */\n/* #undef HAVE_DEV_TCP */\n\n/* Define if the /dev/xti/tcp device exists */\n/* #undef HAVE_DEV_XTI_TCP */\n\n/* Define if you have the <errno.h> header file. */\n#define HAVE_ERRNO_H 1\n\n/* Define if you have the <fcntl.h> header file. */\n#define HAVE_FCNTL_H 1\n\n/* Define if you have the `getaddrinfo' function. */\n#define HAVE_GETADDRINFO 1\n\n/* define if getaddrinfo prototype is in <netdb.h> */\n#define HAVE_GETADDRINFO_PROTO 1\n\n/* Define if you have the `gethostbyname2' function. */\n#define HAVE_GETHOSTBYNAME2 1\n\n/* Define if you have the `gethostbyname_r' function. */\n/* #undef HAVE_GETHOSTBYNAME_R */\n\n/* Define if you have the `gethostname' function. */\n#define HAVE_GETHOSTNAME 1\n\n/* define if gethostname prototype is in <unistd.h> */\n#define HAVE_GETHOSTNAME_PROTO 1\n\n/* Define if you have the `getnameinfo' function. */\n#define HAVE_GETNAMEINFO 1\n\n/* define if getnameinfo prototype is in <netdb.h> */\n#define HAVE_GETNAMEINFO_PROTO 1\n\n/* define if getrusage prototype is in <sys/resource.h> */\n#define HAVE_GETRUSAGE_PROTO 1\n\n/* Define if you have the `hstrerror' function. */\n#define HAVE_HSTRERROR 1\n\n/* define if hstrerror prototype is in <netdb.h> */\n#define HAVE_HSTRERROR_PROTO 1\n\n/* Define if <net/if.h> defines struct if_nameindex */\n#define HAVE_IF_NAMEINDEX_STRUCT 1\n\n/* Define if you have the `if_nametoindex' function. */\n#define HAVE_IF_NAMETOINDEX 1\n\n/* define if if_nametoindex prototype is in <net/if.h> */\n#define HAVE_IF_NAMETOINDEX_PROTO 1\n\n/* Define if you have the `inet_aton' function. */\n#define HAVE_INET_ATON 1\n\n/* define if inet_aton prototype is in <arpa/inet.h> */\n#define HAVE_INET_ATON_PROTO 1\n\n/* Define if you have the `inet_pton' function. */\n#define HAVE_INET_PTON 1\n\n/* define if inet_pton prototype is in <arpa/inet.h> */\n#define HAVE_INET_PTON_PROTO 1\n\n/* Define if you have the `kevent' function. */\n#define HAVE_KEVENT 1\n\n/* Define if you have the `kqueue' function. */\n#define HAVE_KQUEUE 1\n\n/* Define if you have the `nsl' library (-lnsl). */\n/* #undef HAVE_LIBNSL */\n\n/* Define if you have the `pthread' library (-lpthread). */\n/* #undef HAVE_LIBPTHREAD */\n\n/* Define if you have the `pthreads' library (-lpthreads). */\n/* #undef HAVE_LIBPTHREADS */\n\n/* Define if you have the `resolv' library (-lresolv). */\n/* #undef HAVE_LIBRESOLV */\n\n/* Define if you have the `xti' library (-lxti). */\n/* #undef HAVE_LIBXTI */\n\n/* Define if you have the `mkstemp' function. */\n#define HAVE_MKSTEMP 1\n\n/* define if struct msghdr contains the msg_control element */\n#define HAVE_MSGHDR_MSG_CONTROL 1\n\n/* Define if you have the <netconfig.h> header file. */\n#define HAVE_NETCONFIG_H 1\n\n/* Define if you have the <netdb.h> header file. */\n#define HAVE_NETDB_H 1\n\n/* Define if you have the <netdir.h> header file. */\n/* #undef HAVE_NETDIR_H */\n\n/* Define if you have the <netinet/in.h> header file. */\n#define HAVE_NETINET_IN_H 1\n\n/* Define if you have the <net/if_dl.h> header file. */\n#define HAVE_NET_IF_DL_H 1\n\n/* Define if you have the `poll' function. */\n#define HAVE_POLL 1\n\n/* Define if you have the <poll.h> header file. */\n#define HAVE_POLL_H 1\n\n/* Define if you have the `pselect' function. */\n#define HAVE_PSELECT 1\n\n/* define if pselect prototype is in <sys/stat.h> */\n#define HAVE_PSELECT_PROTO 1\n\n/* Define if you have the <pthread.h> header file. */\n#define HAVE_PTHREAD_H 1\n\n/* Define if you have the <signal.h> header file. */\n#define HAVE_SIGNAL_H 1\n\n/* Define if you have the `snprintf' function. */\n#define HAVE_SNPRINTF 1\n\n/* define if snprintf prototype is in <stdio.h> */\n#define HAVE_SNPRINTF_PROTO 1\n\n/* Define if <net/if_dl.h> defines struct sockaddr_dl */\n#define HAVE_SOCKADDR_DL_STRUCT 1\n\n/* define if socket address structures have length fields */\n#define HAVE_SOCKADDR_SA_LEN 1\n\n/* Define if you have the `sockatmark' function. */\n#define HAVE_SOCKATMARK 1\n\n/* define if sockatmark prototype is in <sys/socket.h> */\n#define HAVE_SOCKATMARK_PROTO 1\n\n/* Define if you have the <stdio.h> header file. */\n#define HAVE_STDIO_H 1\n\n/* Define if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define if you have the <strings.h> header file. */\n#define HAVE_STRINGS_H 1\n\n/* Define if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define if you have the <stropts.h> header file. */\n/* #undef HAVE_STROPTS_H */\n\n/* Define if `ifr_mtu' is member of `struct ifreq'. */\n#define HAVE_STRUCT_IFREQ_IFR_MTU 1\n\n/* Define if the system has the type `struct sockaddr_storage'. */\n#define HAVE_STRUCT_SOCKADDR_STORAGE 1\n\n/* Define if you have the <sys/event.h> header file. */\n#define HAVE_SYS_EVENT_H 1\n\n/* Define if you have the <sys/filio.h> header file. */\n#define HAVE_SYS_FILIO_H 1\n\n/* Define if you have the <sys/ioctl.h> header file. */\n#define HAVE_SYS_IOCTL_H 1\n\n/* Define if you have the <sys/select.h> header file. */\n#define HAVE_SYS_SELECT_H 1\n\n/* Define if you have the <sys/socket.h> header file. */\n#define HAVE_SYS_SOCKET_H 1\n\n/* Define if you have the <sys/sockio.h> header file. */\n#define HAVE_SYS_SOCKIO_H 1\n\n/* Define if you have the <sys/stat.h> header file. */\n#define HAVE_SYS_STAT_H 1\n\n/* Define if you have the <sys/sysctl.h> header file. */\n#define HAVE_SYS_SYSCTL_H 1\n\n/* Define if you have the <sys/time.h> header file. */\n#define HAVE_SYS_TIME_H 1\n\n/* Define if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define if you have the <sys/uio.h> header file. */\n#define HAVE_SYS_UIO_H 1\n\n/* Define if you have the <sys/un.h> header file. */\n#define HAVE_SYS_UN_H 1\n\n/* Define if you have the <sys/wait.h> header file. */\n#define HAVE_SYS_WAIT_H 1\n\n/* Define if <time.h> defines struct timespec */\n#define HAVE_TIMESPEC_STRUCT 1\n\n/* Define if you have the <time.h> header file. */\n#define HAVE_TIME_H 1\n\n/* Define if you have the <unistd.h> header file. */\n#define HAVE_UNISTD_H 1\n\n/* Define if you have the `vsnprintf' function. */\n#define HAVE_VSNPRINTF 1\n\n/* Define if you have the <xti.h> header file. */\n/* #undef HAVE_XTI_H */\n\n/* Define if you have the <xti_inet.h> header file. */\n/* #undef HAVE_XTI_INET_H */\n\n/* Define if the system supports IPv4 */\n#define IPV4 1\n\n/* Define if the system supports IPv6 */\n#define IPV6 1\n\n/* Define if the system supports IPv4 */\n#define IPv4 1\n\n/* Define if the system supports IPv6 */\n#define IPv6 1\n\n/* Define if the system supports IP Multicast */\n#define MCAST 1\n\n/* the size of the sa_family field in a socket address structure */\n/* #undef SA_FAMILY_T */\n\n/* Define if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* Define if you can safely include both <sys/time.h> and <time.h>. */\n#define TIME_WITH_SYS_TIME 1\n\n/* Define if the system supports UNIX domain sockets */\n#define UNIXDOMAIN 1\n\n/* Define if the system supports UNIX domain sockets */\n#define UNIXdomain 1\n\n/* 16 bit signed type */\n/* #undef int16_t */\n\n/* 32 bit signed type */\n/* #undef int32_t */\n\n/* the type of the sa_family struct element */\n/* #undef sa_family_t */\n\n/* unsigned integer type of the result of the sizeof operator */\n/* #undef size_t */\n\n/* a type appropriate for address */\n/* #undef socklen_t */\n\n/* define to __ss_family if sockaddr_storage has that instead of ss_family */\n/* #undef ss_family */\n\n/* a signed type appropriate for a count of bytes or an error indication */\n/* #undef ssize_t */\n\n/* scalar type */\n#define t_scalar_t int32_t\n\n/* unsigned scalar type */\n#define t_uscalar_t uint32_t\n\n/* 16 bit unsigned type */\n/* #undef uint16_t */\n\n/* 32 bit unsigned type */\n/* #undef uint32_t */\n\n/* 8-bit unsigned type */\n/* #undef uint8_t */\n"
  },
  {
    "path": "ssntp/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tssntp\n\nall:\t${PROGS}\n\nssntp:\tmain.o sntp_proc.o\n\t\t${CC} ${CFLAGS} -o $@ main.o sntp_proc.o ${LIBS} \n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "ssntp/main.c",
    "content": "#include\t\"sntp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tchar\t\t\t\tbuf[MAXLINE];\n\tssize_t\t\t\t\tn;\n\tsocklen_t\t\t\tsalen, len;\n\tstruct ifi_info\t\t*ifi;\n\tstruct sockaddr\t\t*mcastsa, *wild, *from;\n\tstruct timeval\t\tnow;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: ssntp <IPaddress>\");\n\n\tsockfd = Udp_client(argv[1], \"ntp\", (void **) &mcastsa, &salen);\n\n\twild = Malloc(salen);\n\tmemcpy(wild, mcastsa, salen);\t/* copy family and port */\n\tsock_set_wild(wild, salen);\n\tBind(sockfd, wild, salen);\t/* bind wildcard */\n\n#ifdef\tMCAST\n\t\t/* 4obtain interface list and process each one */\n\tfor (ifi = Get_ifi_info(mcastsa->sa_family, 1); ifi != NULL;\n\t\t ifi = ifi->ifi_next) {\n\t\tif (ifi->ifi_flags & IFF_MULTICAST) {\n\t\t\tMcast_join(sockfd, mcastsa, salen, ifi->ifi_name, 0);\n\t\t\tprintf(\"joined %s on %s\\n\",\n\t\t\t\t   Sock_ntop(mcastsa, salen), ifi->ifi_name);\n\t\t}\n\t}\n#endif\n\n\tfrom = Malloc(salen);\n\tfor ( ; ; ) {\n\t\tlen = salen;\n\t\tn = Recvfrom(sockfd, buf, sizeof(buf), 0, from, &len);\n\t\tGettimeofday(&now, NULL);\n\t\tsntp_proc(buf, n, &now);\n\t}\n}\n"
  },
  {
    "path": "ssntp/main.lc",
    "content": "#include    \"sntp.h\"##  1 ##src/ssntp/main.c##\n\nint##  2 ##src/ssntp/main.c##\nmain(int argc, char **argv)##  3 ##src/ssntp/main.c##\n{##  4 ##src/ssntp/main.c##\n    int     sockfd;##  5 ##src/ssntp/main.c##\n    char    buf[MAXLINE];##  6 ##src/ssntp/main.c##\n    ssize_t n;##  7 ##src/ssntp/main.c##\n    socklen_t salen, len;##  8 ##src/ssntp/main.c##\n    struct ifi_info *ifi;##  9 ##src/ssntp/main.c##\n    struct sockaddr *mcastsa, *wild, *from;## 10 ##src/ssntp/main.c##\n    struct timeval now;## 11 ##src/ssntp/main.c##\n\n    if (argc != 2)## 12 ##src/ssntp/main.c##\n        err_quit(\"usage: ssntp <IPaddress>\");## 13 ##src/ssntp/main.c##\n\n    sockfd = Udp_client(argv[1], \"ntp\", (void **) &mcastsa, &salen);## 14 ##src/ssntp/main.c##\n\n    wild = Malloc(salen);## 15 ##src/ssntp/main.c##\n    memcpy(wild, mcastsa, salen);   /* copy family and port */## 16 ##src/ssntp/main.c##\n    sock_set_wild(wild, salen);## 17 ##src/ssntp/main.c##\n    Bind(sockfd, wild, salen);  /* bind wildcard */## 18 ##src/ssntp/main.c##\n\n#ifdef  MCAST## 19 ##src/ssntp/main.c##\n    /* 4obtain interface list and process each one */## 20 ##src/ssntp/main.c##\n    for (ifi = Get_ifi_info(mcastsa->sa_family, 1); ifi != NULL;## 21 ##src/ssntp/main.c##\n         ifi = ifi->ifi_next) {## 22 ##src/ssntp/main.c##\n        if (ifi->ifi_flags & IFF_MULTICAST) {## 23 ##src/ssntp/main.c##\n            Mcast_join(sockfd, mcastsa, salen, ifi->ifi_name, 0);## 24 ##src/ssntp/main.c##\n            printf(\"joined %s on %s\\n\",## 25 ##src/ssntp/main.c##\n                   Sock_ntop(mcastsa, salen), ifi->ifi_name);## 26 ##src/ssntp/main.c##\n        }## 27 ##src/ssntp/main.c##\n    }## 28 ##src/ssntp/main.c##\n#endif## 29 ##src/ssntp/main.c##\n\n    from = Malloc(salen);## 30 ##src/ssntp/main.c##\n    for (;;) {## 31 ##src/ssntp/main.c##\n        len = salen;## 32 ##src/ssntp/main.c##\n        n = Recvfrom(sockfd, buf, sizeof(buf), 0, from, &len);## 33 ##src/ssntp/main.c##\n        Gettimeofday(&now, NULL);## 34 ##src/ssntp/main.c##\n        sntp_proc(buf, n, &now);## 35 ##src/ssntp/main.c##\n    }## 36 ##src/ssntp/main.c##\n}## 37 ##src/ssntp/main.c##\n"
  },
  {
    "path": "ssntp/ntp.h",
    "content": "#define\tJAN_1970\t2208988800UL\t/* 1970 - 1900 in seconds */\n\nstruct l_fixedpt {\t\t/* 64-bit fixed-point */\n  uint32_t\tint_part;\n  uint32_t\tfraction;\n};\n\nstruct s_fixedpt {\t\t/* 32-bit fixed-point */\n  uint16_t\tint_part;\n  uint16_t\tfraction;\n};\n\nstruct ntpdata {\t\t/* NTP header */\n  u_char\t\t\tstatus;\n  u_char\t\t\tstratum;\n  u_char\t\t\tppoll;\n  int\t\t\t\tprecision:8;\n  struct s_fixedpt\tdistance;\n  struct s_fixedpt\tdispersion;\n  uint32_t\t\t\trefid;\n  struct l_fixedpt\treftime;\n  struct l_fixedpt\torg;\n  struct l_fixedpt\trec;\n  struct l_fixedpt\txmt;\n};\n\n#define\tVERSION_MASK\t0x38\n#define\tMODE_MASK\t\t0x07\n\n#define\tMODE_CLIENT\t\t3\n#define\tMODE_SERVER\t\t4\n#define\tMODE_BROADCAST\t5\n"
  },
  {
    "path": "ssntp/sntp.h",
    "content": "#include\t\"unpifi.h\"\n#include\t\"ntp.h\"\n\nvoid\t sntp_proc(char *, ssize_t, struct timeval *);\n"
  },
  {
    "path": "ssntp/sntp_proc.c",
    "content": "#include\t\"sntp.h\"\n\nvoid\nsntp_proc(char *buf, ssize_t n, struct timeval *nowptr)\n{\n\tint\t\t\t\tversion, mode;\n\tuint32_t\t\tnsec, useci;\n\tdouble\t\t\tusecf;\n\tstruct timeval\tdiff;\n\tstruct ntpdata\t*ntp;\n\n\tif (n < (ssize_t)sizeof(struct ntpdata)) {\n\t\tprintf(\"\\npacket too small: %d bytes\\n\", n);\n\t\treturn;\n\t}\n\n\tntp = (struct ntpdata *) buf;\n\tversion = (ntp->status & VERSION_MASK) >> 3;\n\tmode = ntp->status & MODE_MASK;\n\tprintf(\"\\nv%d, mode %d, strat %d, \", version, mode, ntp->stratum);\n\tif (mode == MODE_CLIENT) {\n\t\tprintf(\"client\\n\");\n\t\treturn;\n\t}\n\n\tnsec = ntohl(ntp->xmt.int_part) - JAN_1970;\n\tuseci = ntohl(ntp->xmt.fraction);\t/* 32-bit integer fraction */\n\tusecf = useci;\t\t\t\t/* integer fraction -> double */\n\tusecf /= 4294967296.0;\t\t/* divide by 2**32 -> [0, 1.0) */\n\tuseci = usecf * 1000000.0;\t/* fraction -> parts per million */\n\n\tdiff.tv_sec = nowptr->tv_sec - nsec;\n\tif ( (diff.tv_usec = nowptr->tv_usec - useci) < 0) {\n\t\tdiff.tv_usec += 1000000;\n\t\tdiff.tv_sec--;\n\t}\n\tuseci = (diff.tv_sec * 1000000) + diff.tv_usec;\t/* diff in microsec */\n\tprintf(\"clock difference = %d usec\\n\", useci);\n}\n"
  },
  {
    "path": "streams/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tstrlist_sock strlist_xti tpi_daytime\n\nall:\t${PROGS}\n\nstrlist_sock:\tstrlist_sock.o\n\t\t${CC} ${CFLAGS} -o $@ strlist_sock.o ${LIBS_XTI}\n\nstrlist_xti:\tstrlist_xti.o\n\t\t${CC} ${CFLAGS} -o $@ strlist_xti.o ${LIBS_XTI}\n\ntpi_daytime:\ttpi_daytime.o tpi_bind.o tpi_connect.o tpi_read.o tpi_close.o\n\t\t${CC} ${CFLAGS} -o $@ tpi_daytime.o tpi_bind.o tpi_connect.o \\\n\t\t\ttpi_read.o tpi_close.o ${LIBS_XTI}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "streams/stream_dg/Makefile",
    "content": "all: client server\n\nclient: client.o net_stream.o\n\tcc client.o net_stream.o -o client -lnsl\n\nserver: server.o net_stream.o\n\tcc server.o net_stream.o -o server -lnsl\n"
  },
  {
    "path": "streams/stream_dg/client.c",
    "content": "#include <stdio.h>\n#include <sys/types.h>\n#include <sys/fcntl.h>\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n\nextern int errno;\n\n#define SERV_HOST_ADDR  \"128.220.101.4\"\n#define SERV_TCP_PORT   6000\n\nmain()\n{\n\tint fd;\n\tstruct sockaddr_in\tmy_addr;\n\tstruct sockaddr_in\tserv_addr;\n\tchar buf[128];\n\tvoid echo_driver(int, struct sockaddr_in *);\n\n\tif ((fd = net_open (\"/dev/udp\", O_RDWR)) < 0)\n\t{\n\t\tfprintf (stderr, \"open failed.\\n\");\n\t\texit (-1);\n\t}\n\t/*\n\t * bind any address to us.\n\t */\n\tbzero((char *) &my_addr, sizeof(my_addr));\n\tmy_addr.sin_family      = AF_INET;\n\tmy_addr.sin_addr.s_addr = htonl (INADDR_ANY);\n\tmy_addr.sin_port        = htons(0);\n\n\tfd = net_bind (fd, &my_addr, sizeof (struct sockaddr_in));\n\n\t/*\n\t * set up server's address\n\t */\n\tbzero((char *) &serv_addr, sizeof(serv_addr));\n\tserv_addr.sin_family      = AF_INET;\n\tserv_addr.sin_addr.s_addr = inet_addr (SERV_HOST_ADDR);\n\tserv_addr.sin_port        = htons(SERV_TCP_PORT);\n\n\techo_driver (fd, &serv_addr);\n\tclose (fd);\n\n\texit (0);\n}\n\nvoid\necho_driver(int fd, struct sockaddr_in *serv_addr)\n{\n\tchar buf[512];\n\tint n;\n\tstruct sockaddr_in\tfm_addr;\n\n\twhile ((n = read (0, buf, sizeof (buf))) != 0)\n\t{\n\t\tnet_send (fd, buf, n, serv_addr, sizeof (struct sockaddr_in));\n\n\t\tn = net_recv (fd, buf, sizeof (buf), &fm_addr, sizeof (struct sockaddr_in));\n\n\t\twrite (1, buf, n);\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "streams/stream_dg/net_stream.c",
    "content": "#include <stdio.h>\n#include <sys/types.h>\n#include <sys/fcntl.h>\n#include <sys/errno.h>\n\n#include <sys/stream.h>\n#include <sys/stropts.h>\n#include <sys/tihdr.h>\n\n\nextern int errno;\n\nint\nnet_open (char *path, int oflags, void *addr, int addrlen)\n{\n\tint fd;\n\tint flags;\n\n\tif ((fd = open (path, oflags)) < 0)\n\t{\n\t\tperror (\"open\");\n\t\treturn (-1);\n\t}\n\treturn (fd);\n}\n\nint\nnet_bind (int fd, void *addr, int addrlen)\n{\n\tstruct {\n\t\tstruct T_bind_req msg_hdr;\n\t\tchar addr[128];\n\t} bind_req;\n\tstruct strbuf ctlbuf;\n\tunion T_primitives rcvbuf;\n\tstruct T_error_ack *error_ack;\n\tint flags;\n\n\tif (addr == NULL || addrlen == 0)\n\t{\n\t\tfprintf (stderr, \"No address\\n\");\n\t\treturn (-1);\n\t}\n\n\tbind_req.msg_hdr.PRIM_type = T_BIND_REQ;\n\tbind_req.msg_hdr.ADDR_length = addrlen;\n\tbind_req.msg_hdr.ADDR_offset = sizeof (struct T_bind_req);\n\tbind_req.msg_hdr.CONIND_number = 5;\n\tbcopy (addr, bind_req.addr, addrlen);\n\n\tctlbuf.len = sizeof (struct T_bind_req) + addrlen;\n\tctlbuf.buf = (char *) &bind_req;\n\n\tif (putmsg (fd, &ctlbuf, NULL, 0) < 0)\n\t{\n\t\treturn (-1);\n\t}\n\t/*\n\t * Wait for acknowledgement\n\t */\n\tctlbuf.maxlen = sizeof (union T_primitives);\n\tctlbuf.len = 0;\n\tctlbuf.buf = (char *) &rcvbuf;\n\tflags = RS_HIPRI;\n\tif (getmsg (fd, &ctlbuf, NULL, &flags) < 0)\n\t{\n\t\tperror (\"getmsg\");\n\t\treturn (-1);\n\t}\n\n\tif (ctlbuf.len < sizeof (long))\n\t{\n\t\tfprintf (stderr, \"Bad length from getmsg.\\n\");\n\t\terrno = EPROTO;\n\t\treturn (-1);\n\t}\n\tswitch (rcvbuf.type)\n\t{\n\t    case T_BIND_ACK:\n\t\treturn (fd);\n\t    case T_ERROR_ACK:\n\t\tif (ctlbuf.len < sizeof (struct T_error_ack))\n\t\t{\n\t\t\terrno = EPROTO;\n\t\t\treturn (-1);\n\t\t}\n\t\terror_ack = (struct T_error_ack *) &rcvbuf;\n\t\tfprintf (stderr, \"Error ack from bind (%d %d %d)\\n\",\n\t\t\terror_ack->ERROR_prim,\n\t\t\terror_ack->TLI_error,\n\t\t\terror_ack->UNIX_error);\n\t\terrno = error_ack->UNIX_error;\n\t\tbreak;\n\t    default:\n\t\tfprintf (stderr, \"No ack from bind?\\n\");\n\t\terrno = EPROTO;\n\t\tbreak;\n\t}\n\treturn (-1);\n}\nint\nnet_send (int fd, char *buf, int len, char *to_addr, int addrlen)\n{\n\tstruct strbuf ctlbuf;\n\tstruct strbuf databuf;\n\tstruct {\n\t\tstruct T_unitdata_req unitdata_req;\n\t\tchar buf[128];\n\t} netdata;\n\n\tbcopy (to_addr, netdata.buf, addrlen);\n\tnetdata.unitdata_req.PRIM_type = T_UNITDATA_REQ;\n\tnetdata.unitdata_req.DEST_length = addrlen;\n\tnetdata.unitdata_req.DEST_offset = sizeof (struct T_unitdata_req);\n\t/* \n\t * for now, presume no options.\n\t */\n\tnetdata.unitdata_req.OPT_length = 0;\n\tnetdata.unitdata_req.OPT_offset = 0;\n\n\tctlbuf.len = sizeof (struct T_unitdata_req) + addrlen;\n\tctlbuf.buf = (char *) &netdata;\n\n\tdatabuf.len = len;\n\tdatabuf.buf = buf;\n\n\tif (putmsg (fd, &ctlbuf, &databuf, 0) < 0)\n\t\treturn (0);\n\tfree (netdata.buf);\n\treturn (len);\n}\n\nint\nnet_recv (int fd, char *buf, int len, char *from_addr, int addrlen)\n{\n\tstruct strbuf ctlbuf;\n\tstruct strbuf databuf;\n\tstruct {\n\t\tstruct T_unitdata_ind unitdata_ind;\n\t\tchar buf[128];\n\t} netdata;\n\tchar *c;\n\tint retval;\n\tint flags;\n\n\tctlbuf.maxlen = sizeof (netdata);\n\tctlbuf.buf = (char *) &netdata;\n\n\tdatabuf.maxlen = len;\n\tdatabuf.len = 0;\n\tdatabuf.buf = buf;\n\n\tflags = 0;\n\n\tif ((retval = getmsg (fd, &ctlbuf, &databuf, &flags)) < 0)\n\t\treturn (-1);\n\n\tif (netdata.unitdata_ind.PRIM_type != T_UNITDATA_IND)\n\t{\n\t\tfprintf (stderr, \"net_recv: Got %d\\n\", netdata.unitdata_ind.PRIM_type);\n\t\terrno = EPROTO;\n\t\treturn (0);\n\t}\n\tif (retval)\n\t{\n\t\terrno = EIO;\n\t\treturn (0);\n\t}\n\t/*\n\t * Copy return address for the user\n\t */\n\tif (netdata.unitdata_ind.SRC_length < addrlen)\n\t\taddrlen = netdata.unitdata_ind.SRC_length;\n\n\tc = (char *) &netdata;\n\tbcopy (&(c[netdata.unitdata_ind.SRC_offset]),\n\t\tfrom_addr,\n\t\taddrlen);\n\n\treturn (databuf.len);\n}\n"
  },
  {
    "path": "streams/stream_dg/server.c",
    "content": "#include <stdio.h>\n#include <sys/types.h>\n#include <sys/fcntl.h>\n#include <sys/errno.h>\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n\nextern int errno;\n\n#define SERV_TCP_PORT   6000\n\nmain()\n{\n\tint fd;\n\tstruct sockaddr_in\tmy_addr;\n\tvoid\t\t\techo_serv (int);\n\n\tbzero((char *) &my_addr, sizeof(my_addr));\n\tmy_addr.sin_family      = AF_INET;\n\tmy_addr.sin_addr.s_addr = htonl (INADDR_ANY);\n\tmy_addr.sin_port        = htons(SERV_TCP_PORT);\n\n\tfd = net_open (\"/dev/udp\", O_RDWR);\n\tfd = net_bind (fd, &my_addr, sizeof (struct sockaddr_in));\n\n\techo_serv (fd);\n\texit (0);\t/* not reached */\n}\n\nvoid\necho_serv (int fd)\n{\n\tstruct sockaddr_in\tfm_addr;\n\tchar\t\t\tbuf[512];\n\tint\t\t\tn;\n\n\twhile (1)\n\t{\n\t\tn = net_recv (fd, buf, sizeof (buf),\n\t\t\t\t&fm_addr, sizeof (struct sockaddr_in));\n\n\t\tnet_send (fd, buf, n,\n\t\t\t\t&fm_addr, sizeof (struct sockaddr_in));\n\t}\n}\n"
  },
  {
    "path": "streams/strlist_sock.c",
    "content": "#include\t\"unp.h\"\n#include\t<stropts.h>\n\nint\nmain(int argc, char *argv[])\n{\n\tint\t\t\t\t\tfd, i, nmods;\n\tstruct str_list\t\tlist;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out { tcp | udp }\");\n\n\tfd = Socket(AF_INET, (strcmp(argv[1], \"tcp\") == 0)\n\t\t\t\t\t\t\t\t\t? SOCK_STREAM : SOCK_DGRAM, 0);\n\tif (isastream(fd) == 0)\n\t\terr_quit(\"%s is not a stream\", argv[1]);\n\n\tlist.sl_nmods = nmods = Ioctl(fd, I_LIST, (void *) 0);\n\tprintf(\"%d modules\\n\", nmods);\n\tlist.sl_modlist = Calloc(nmods, sizeof(struct str_mlist));\n\n\tIoctl(fd, I_LIST, &list);\n\n\tfor (i = 1; i <= nmods; i++)\n\t\tprintf(\"  %s: %s\\n\", (i == nmods) ? \"driver\" : \"module\",\n\t\t\t\t\t\t\t\tlist.sl_modlist++);\n\texit(0);\n}\n"
  },
  {
    "path": "streams/strlist_xti.c",
    "content": "#include\t\"unpxti.h\"\n#include\t<stropts.h>\n\nint\nmain(int argc, char *argv[])\n{\n\tint\t\t\t\t\tfd, i, nmods;\n\tstruct str_list\t\tlist;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: a.out <pathname>\");\n\n\tfd = T_open(argv[1], O_RDWR, NULL);\n\tif (isastream(fd) == 0)\n\t\terr_quit(\"%s is not a stream\", argv[1]);\n\n\tlist.sl_nmods = nmods = Ioctl(fd, I_LIST, (void *) 0);\n\tprintf(\"%d modules\\n\", nmods);\n\tlist.sl_modlist = Calloc(nmods, sizeof(struct str_mlist));\n\n\tIoctl(fd, I_LIST, &list);\n\n\tfor (i = 1; i <= nmods; i++)\n\t\tprintf(\"  %s: %s\\n\", (i == nmods) ? \"driver\" : \"module\",\n\t\t\t\t\t\t\t\tlist.sl_modlist++);\n\texit(0);\n}\n"
  },
  {
    "path": "streams/tpi_bind.c",
    "content": "#include\t\"tpi_daytime.h\"\n\nvoid\ntpi_bind(int fd, const void *addr, size_t addrlen)\n{\n\tstruct {\n\t  struct T_bind_req\tmsg_hdr;\n\t  char\t\t\t\taddr[128];\n\t} bind_req;\n\tstruct {\n\t  struct T_bind_ack\tmsg_hdr;\n\t  char\t\t\t\taddr[128];\n\t} bind_ack;\n\tstruct strbuf\t\tctlbuf;\n\tstruct T_error_ack\t*error_ack;\n\tint\t\t\t\t\tflags;\n\n\tbind_req.msg_hdr.PRIM_type = T_BIND_REQ;\n\tbind_req.msg_hdr.ADDR_length = addrlen;\n\tbind_req.msg_hdr.ADDR_offset = sizeof(struct T_bind_req);\n\tbind_req.msg_hdr.CONIND_number = 0;\n\tmemcpy(bind_req.addr, addr, addrlen);\t/* sockaddr_in{} */\n\n\tctlbuf.len = sizeof(struct T_bind_req) + addrlen;\n\tctlbuf.buf = (char *) &bind_req;\n\tPutmsg(fd, &ctlbuf, NULL, 0);\n\n\tctlbuf.maxlen = sizeof(bind_ack);\n\tctlbuf.len = 0;\n\tctlbuf.buf = (char *) &bind_ack;\n\tflags = RS_HIPRI;\n\tGetmsg(fd, &ctlbuf, NULL, &flags);\n\n/* *INDENT-OFF* */\n\tif (ctlbuf.len < (int) sizeof(long))\n\t\terr_quit(\"bad length from getmsg\");\n/* *INDENT-ON* */\n\n\tswitch(bind_ack.msg_hdr.PRIM_type) {\n    case T_BIND_ACK:\n\t\treturn;\n\n    case T_ERROR_ACK:\n/* *INDENT-OFF* */\n\t\tif (ctlbuf.len < (int) sizeof(struct T_error_ack))\n\t\t\terr_quit(\"bad length for T_ERROR_ACK\");\n\t\terror_ack = (struct T_error_ack *) &bind_ack.msg_hdr;\n\t\terr_quit(\"T_ERROR_ACK from bind (%d, %d)\",\n\t\t\t\t error_ack->TLI_error, error_ack->UNIX_error);\n/* *INDENT-ON* */\n\n    default:\n\t\terr_quit(\"unexpected message type: %d\", bind_ack.msg_hdr.PRIM_type);\n\t}\n}\n"
  },
  {
    "path": "streams/tpi_close.c",
    "content": "#include\t\"tpi_daytime.h\"\n\nvoid\ntpi_close(int fd)\n{\n\tstruct T_ordrel_req\tordrel_req;\n\tstruct strbuf\t\tctlbuf;\n\n\tordrel_req.PRIM_type = T_ORDREL_REQ;\n\n\tctlbuf.len = sizeof(struct T_ordrel_req);\n\tctlbuf.buf = (char *) &ordrel_req;\n\tPutmsg(fd, &ctlbuf, NULL, 0);\n\n\tClose(fd);\n}\n"
  },
  {
    "path": "streams/tpi_close.lc",
    "content": "#include    \"tpi_daytime.h\"##  1 ##src/streams/tpi_close.c##\n\nvoid##  2 ##src/streams/tpi_close.c##\ntpi_close(int fd)##  3 ##src/streams/tpi_close.c##\n{##  4 ##src/streams/tpi_close.c##\n    struct T_ordrel_req ordrel_req;##  5 ##src/streams/tpi_close.c##\n    struct strbuf ctlbuf;##  6 ##src/streams/tpi_close.c##\n\n    ordrel_req.PRIM_type = T_ORDREL_REQ;##  7 ##src/streams/tpi_close.c##\n\n    ctlbuf.len = sizeof(struct T_ordrel_req);##  8 ##src/streams/tpi_close.c##\n    ctlbuf.buf = (char *) &ordrel_req;##  9 ##src/streams/tpi_close.c##\n    Putmsg(fd, &ctlbuf, NULL, 0);## 10 ##src/streams/tpi_close.c##\n\n    Close(fd);## 11 ##src/streams/tpi_close.c##\n}## 12 ##src/streams/tpi_close.c##\n"
  },
  {
    "path": "streams/tpi_connect.c",
    "content": "#include\t\"tpi_daytime.h\"\n\nvoid\ntpi_connect(int fd, const void *addr, size_t addrlen)\n{\n\tstruct {\n\t  struct T_conn_req\tmsg_hdr;\n\t  char\t\t\t\taddr[128];\n\t} conn_req;\n\tstruct {\n\t  struct T_conn_con\tmsg_hdr;\n\t  char\t\t\t\taddr[128];\n\t} conn_con;\n\tstruct strbuf\t\tctlbuf;\n\tunion T_primitives\trcvbuf;\n\tstruct T_error_ack\t*error_ack;\n\tstruct T_discon_ind\t*discon_ind;\n\tint\t\t\t\t\tflags;\n\n\tconn_req.msg_hdr.PRIM_type = T_CONN_REQ;\n\tconn_req.msg_hdr.DEST_length = addrlen;\n\tconn_req.msg_hdr.DEST_offset = sizeof(struct T_conn_req);\n\tconn_req.msg_hdr.OPT_length = 0;\n\tconn_req.msg_hdr.OPT_offset = 0;\n\tmemcpy(conn_req.addr, addr, addrlen);\t/* sockaddr_in{} */\n\n\tctlbuf.len = sizeof(struct T_conn_req) + addrlen;\n\tctlbuf.buf = (char *) &conn_req;\n\tPutmsg(fd, &ctlbuf, NULL, 0);\n\n\tctlbuf.maxlen = sizeof(union T_primitives);\n\tctlbuf.len = 0;\n\tctlbuf.buf = (char *) &rcvbuf;\n\tflags = RS_HIPRI;\n\tGetmsg(fd, &ctlbuf, NULL, &flags);\n\n/* *INDENT-OFF* */\n\tif (ctlbuf.len < (int) sizeof(long))\n\t\terr_quit(\"tpi_connect: bad length from getmsg\");\n/* *INDENT-ON* */\n\n\tswitch(rcvbuf.type) {\n    case T_OK_ACK:\n\t\tbreak;\n\n    case T_ERROR_ACK:\n/* *INDENT-OFF* */\n\t\tif (ctlbuf.len < (int) sizeof(struct T_error_ack))\n\t\t\terr_quit(\"tpi_connect: bad length for T_ERROR_ACK\");\n\t\terror_ack = (struct T_error_ack *) &rcvbuf;\n\t\terr_quit(\"tpi_connect: T_ERROR_ACK from conn (%d, %d)\",\n\t\t\t\t error_ack->TLI_error, error_ack->UNIX_error);\n/* *INDENT-ON* */\n\n    default:\n\t\terr_quit(\"tpi_connect: unexpected message type: %d\", rcvbuf.type);\n\t}\n\n\tctlbuf.maxlen = sizeof(conn_con);\n\tctlbuf.len = 0;\n\tctlbuf.buf = (char *) &conn_con;\n\tflags = 0;\n\tGetmsg(fd, &ctlbuf, NULL, &flags);\n\n/* *INDENT-OFF* */\n\tif (ctlbuf.len < (int) sizeof(long))\n\t\terr_quit(\"tpi_connect2: bad length from getmsg\");\n/* *INDENT-ON* */\n\n\tswitch(conn_con.msg_hdr.PRIM_type) {\n    case T_CONN_CON:\n\t\tbreak;\n\n    case T_DISCON_IND:\n/* *INDENT-OFF* */\n\t\tif (ctlbuf.len < (int) sizeof(struct T_discon_ind))\n\t\t\terr_quit(\"tpi_connect2: bad length for T_DISCON_IND\");\n\t\tdiscon_ind = (struct T_discon_ind *) &conn_con.msg_hdr;\n\t\terr_quit(\"tpi_connect2: T_DISCON_IND from conn (%d)\",\n\t\t\t\t discon_ind->DISCON_reason);\n/* *INDENT-ON* */\n\n    default:\n\t\terr_quit(\"tpi_connect2: unexpected message type: %d\",\n\t\t\t\t conn_con.msg_hdr.PRIM_type);\n\t}\n}\n"
  },
  {
    "path": "streams/tpi_connect.lc",
    "content": "#include    \"tpi_daytime.h\"##  1 ##src/streams/tpi_connect.c##\n\nvoid##  2 ##src/streams/tpi_connect.c##\ntpi_connect(int fd, const void *addr, size_t addrlen)##  3 ##src/streams/tpi_connect.c##\n{##  4 ##src/streams/tpi_connect.c##\n    struct {##  5 ##src/streams/tpi_connect.c##\n        struct T_conn_req msg_hdr;##  6 ##src/streams/tpi_connect.c##\n        char    addr[128];##  7 ##src/streams/tpi_connect.c##\n    } conn_req;##  8 ##src/streams/tpi_connect.c##\n    struct {##  9 ##src/streams/tpi_connect.c##\n        struct T_conn_con msg_hdr;## 10 ##src/streams/tpi_connect.c##\n        char    addr[128];## 11 ##src/streams/tpi_connect.c##\n    } conn_con;## 12 ##src/streams/tpi_connect.c##\n    struct strbuf ctlbuf;## 13 ##src/streams/tpi_connect.c##\n    union T_primitives rcvbuf;## 14 ##src/streams/tpi_connect.c##\n    struct T_error_ack *error_ack;## 15 ##src/streams/tpi_connect.c##\n    struct T_discon_ind *discon_ind;## 16 ##src/streams/tpi_connect.c##\n    int     flags;## 17 ##src/streams/tpi_connect.c##\n\n    conn_req.msg_hdr.PRIM_type = T_CONN_REQ;## 18 ##src/streams/tpi_connect.c##\n    conn_req.msg_hdr.DEST_length = addrlen;## 19 ##src/streams/tpi_connect.c##\n    conn_req.msg_hdr.DEST_offset = sizeof(struct T_conn_req);## 20 ##src/streams/tpi_connect.c##\n    conn_req.msg_hdr.OPT_length = 0;## 21 ##src/streams/tpi_connect.c##\n    conn_req.msg_hdr.OPT_offset = 0;## 22 ##src/streams/tpi_connect.c##\n    memcpy(conn_req.addr, addr, addrlen);   /* sockaddr_in{} */## 23 ##src/streams/tpi_connect.c##\n\n    ctlbuf.len = sizeof(struct T_conn_req) + addrlen;## 24 ##src/streams/tpi_connect.c##\n    ctlbuf.buf = (char *) &conn_req;## 25 ##src/streams/tpi_connect.c##\n    Putmsg(fd, &ctlbuf, NULL, 0);## 26 ##src/streams/tpi_connect.c##\n\n    ctlbuf.maxlen = sizeof(union T_primitives);## 27 ##src/streams/tpi_connect.c##\n    ctlbuf.len = 0;## 28 ##src/streams/tpi_connect.c##\n    ctlbuf.buf = (char *) &rcvbuf;## 29 ##src/streams/tpi_connect.c##\n    flags = RS_HIPRI;## 30 ##src/streams/tpi_connect.c##\n    Getmsg(fd, &ctlbuf, NULL, &flags);## 31 ##src/streams/tpi_connect.c##\n\n    if (ctlbuf.len < (int) sizeof(long))## 32 ##src/streams/tpi_connect.c##\n        err_quit(\"tpi_connect: bad length from getmsg\");## 33 ##src/streams/tpi_connect.c##\n\n    switch (rcvbuf.type) {## 34 ##src/streams/tpi_connect.c##\n    case T_OK_ACK:## 35 ##src/streams/tpi_connect.c##\n        break;## 36 ##src/streams/tpi_connect.c##\n\n    case T_ERROR_ACK:## 37 ##src/streams/tpi_connect.c##\n        if (ctlbuf.len < (int) sizeof(struct T_error_ack))## 38 ##src/streams/tpi_connect.c##\n            err_quit(\"tpi_connect: bad length for T_ERROR_ACK\");## 39 ##src/streams/tpi_connect.c##\n        error_ack = (struct T_error_ack *) &rcvbuf;## 40 ##src/streams/tpi_connect.c##\n        err_quit(\"tpi_connect: T_ERROR_ACK from conn (%d, %d)\",## 41 ##src/streams/tpi_connect.c##\n                 error_ack->TLI_error, error_ack->UNIX_error);## 42 ##src/streams/tpi_connect.c##\n\n    default:## 43 ##src/streams/tpi_connect.c##\n        err_quit(\"tpi_connect: unexpected message type: %d\", rcvbuf.type);## 44 ##src/streams/tpi_connect.c##\n    }## 45 ##src/streams/tpi_connect.c##\n\n    ctlbuf.maxlen = sizeof(conn_con);## 46 ##src/streams/tpi_connect.c##\n    ctlbuf.len = 0;## 47 ##src/streams/tpi_connect.c##\n    ctlbuf.buf = (char *) &conn_con;## 48 ##src/streams/tpi_connect.c##\n    flags = 0;## 49 ##src/streams/tpi_connect.c##\n    Getmsg(fd, &ctlbuf, NULL, &flags);## 50 ##src/streams/tpi_connect.c##\n\n    if (ctlbuf.len < (int) sizeof(long))## 51 ##src/streams/tpi_connect.c##\n        err_quit(\"tpi_connect2: bad length from getmsg\");## 52 ##src/streams/tpi_connect.c##\n\n    switch (conn_con.msg_hdr.PRIM_type) {## 53 ##src/streams/tpi_connect.c##\n    case T_CONN_CON:## 54 ##src/streams/tpi_connect.c##\n        break;## 55 ##src/streams/tpi_connect.c##\n\n    case T_DISCON_IND:## 56 ##src/streams/tpi_connect.c##\n        if (ctlbuf.len < (int) sizeof(struct T_discon_ind))## 57 ##src/streams/tpi_connect.c##\n            err_quit(\"tpi_connect2: bad length for T_DISCON_IND\");## 58 ##src/streams/tpi_connect.c##\n        discon_ind = (struct T_discon_ind *) &conn_con.msg_hdr;## 59 ##src/streams/tpi_connect.c##\n        err_quit(\"tpi_connect2: T_DISCON_IND from conn (%d)\",## 60 ##src/streams/tpi_connect.c##\n                 discon_ind->DISCON_reason);## 61 ##src/streams/tpi_connect.c##\n\n    default:## 62 ##src/streams/tpi_connect.c##\n        err_quit(\"tpi_connect2: unexpected message type: %d\",## 63 ##src/streams/tpi_connect.c##\n                 conn_con.msg_hdr.PRIM_type);## 64 ##src/streams/tpi_connect.c##\n    }## 65 ##src/streams/tpi_connect.c##\n}## 66 ##src/streams/tpi_connect.c##\n"
  },
  {
    "path": "streams/tpi_daytime.c",
    "content": "#include\t\"tpi_daytime.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tfd, n;\n\tchar\t\t\t\trecvline[MAXLINE + 1];\n\tstruct sockaddr_in\tmyaddr, servaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tpi_daytime <IPaddress>\");\n\n\tfd = Open(XTI_TCP, O_RDWR, 0);\n\n\t\t/*4bind any local address */\n\tbzero(&myaddr, sizeof(myaddr));\n\tmyaddr.sin_family = AF_INET;\n\tmyaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tmyaddr.sin_port = htons(0);\n\n\ttpi_bind(fd, &myaddr, sizeof(struct sockaddr_in));\n\n\t\t/*4fill in server's address */\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port   = htons(13);\t/* daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\ttpi_connect(fd, &servaddr, sizeof(struct sockaddr_in));\n\n\tfor ( ; ; ) {\n\t\tif ( (n = tpi_read(fd, recvline, MAXLINE)) <= 0) {\n\t\t\tif (n == 0)\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\terr_sys(\"tpi_read error\");\n\t\t}\n\t\trecvline[n] = 0;\t\t/* null terminate */\n\t\tfputs(recvline, stdout);\n\t}\n\ttpi_close(fd);\n\texit(0);\n}\n"
  },
  {
    "path": "streams/tpi_daytime.h",
    "content": "#include\t\"unpxti.h\"\n#include\t<sys/stream.h>\n#include\t<sys/tihdr.h>\n\nvoid\ttpi_bind(int, const void *, size_t);\nvoid\ttpi_connect(int, const void *, size_t);\nssize_t\ttpi_read(int, void *, size_t);\nvoid\ttpi_close(int);\n"
  },
  {
    "path": "streams/tpi_read.c",
    "content": "#include\t\"tpi_daytime.h\"\n\nssize_t\ntpi_read(int fd, void *buf, size_t len)\n{\n\tstruct strbuf\t\tctlbuf;\n\tstruct strbuf\t\tdatbuf;\n\tunion T_primitives\trcvbuf;\n\tint\t\t\t\t\tflags;\n\n\tctlbuf.maxlen = sizeof(union T_primitives);\n\tctlbuf.buf = (char *) &rcvbuf;\n\n\tdatbuf.maxlen = len;\n\tdatbuf.buf = buf;\n\tdatbuf.len = 0;\n\n\tflags = 0;\n\tGetmsg(fd, &ctlbuf, &datbuf, &flags);\n\n\tif (ctlbuf.len >= (int) sizeof(long)) {\n\t\tif (rcvbuf.type == T_DATA_IND)\n\t\t\treturn(datbuf.len);\n\t\telse if (rcvbuf.type == T_ORDREL_IND)\n\t\t\treturn(0);\n\t\telse\n\t\t\terr_quit(\"tpi_read: unexpected type %d\", rcvbuf.type);\n\t} else if (ctlbuf.len == -1)\n\t\treturn(datbuf.len);\n\telse\n\t\terr_quit(\"tpi_read: bad length from getmsg\");\n}\n"
  },
  {
    "path": "streams/tpi_read.lc",
    "content": "#include    \"tpi_daytime.h\"##  1 ##src/streams/tpi_read.c##\n\nssize_t##  2 ##src/streams/tpi_read.c##\ntpi_read(int fd, void *buf, size_t len)##  3 ##src/streams/tpi_read.c##\n{##  4 ##src/streams/tpi_read.c##\n    struct strbuf ctlbuf;##  5 ##src/streams/tpi_read.c##\n    struct strbuf datbuf;##  6 ##src/streams/tpi_read.c##\n    union T_primitives rcvbuf;##  7 ##src/streams/tpi_read.c##\n    int     flags;##  8 ##src/streams/tpi_read.c##\n\n    ctlbuf.maxlen = sizeof(union T_primitives);##  9 ##src/streams/tpi_read.c##\n    ctlbuf.buf = (char *) &rcvbuf;## 10 ##src/streams/tpi_read.c##\n\n    datbuf.maxlen = len;## 11 ##src/streams/tpi_read.c##\n    datbuf.buf = buf;## 12 ##src/streams/tpi_read.c##\n    datbuf.len = 0;## 13 ##src/streams/tpi_read.c##\n\n    flags = 0;## 14 ##src/streams/tpi_read.c##\n    Getmsg(fd, &ctlbuf, &datbuf, &flags);## 15 ##src/streams/tpi_read.c##\n\n    if (ctlbuf.len >= (int) sizeof(long)) {## 16 ##src/streams/tpi_read.c##\n        if (rcvbuf.type == T_DATA_IND)## 17 ##src/streams/tpi_read.c##\n            return (datbuf.len);## 18 ##src/streams/tpi_read.c##\n        else if (rcvbuf.type == T_ORDREL_IND)## 19 ##src/streams/tpi_read.c##\n            return (0);## 20 ##src/streams/tpi_read.c##\n        else## 21 ##src/streams/tpi_read.c##\n            err_quit(\"tpi_read: unexpected type %d\", rcvbuf.type);## 22 ##src/streams/tpi_read.c##\n    } else if (ctlbuf.len == -1)## 23 ##src/streams/tpi_read.c##\n        return (datbuf.len);## 24 ##src/streams/tpi_read.c##\n    else## 25 ##src/streams/tpi_read.c##\n        err_quit(\"tpi_read: bad length from getmsg\");## 26 ##src/streams/tpi_read.c##\n}## 27 ##src/streams/tpi_read.c##\n"
  },
  {
    "path": "streams/unpxti.h",
    "content": "/* include unpxtih1 */\n#ifndef\t__unp_xti_h\n#define\t__unp_xti_h\n\n#include\t\"unp.h\"\n\n#include\t<xti.h>\n#ifdef\tHAVE_XTI_INET_H\n# include\t<xti_inet.h>\n#endif\n#ifdef\tHAVE_NETCONFIG_H\n# include\t<netconfig.h>\n#endif\n#ifdef\tHAVE_NETDIR_H\n# include\t<netdir.h>\n#endif\n\n#ifdef\tINFTIM_UNPH\n#undef\tINFTIM\t/* was not in <poll.h>, undef for <stropts.h> */\n#endif\n\n#include\t<stropts.h>\n\n/* Provide compatibility with the new names prepended with T_\n   in XNS Issue 5, which are not in Posix.1g. */\n\n#ifndef\tT_INET_TCP\n#define\tT_INET_TCP\t\tINET_TCP\n/* $$.Ic T_INET_TCP$$ */\n#endif\n/* end unpxtih1 */\n#ifndef\tT_INET_UDP\n#define\tT_INET_UDP\t\tINET_UDP\n#endif\n#ifndef\tT_INET_IP\n#define\tT_INET_IP\t\tINET_IP\n#endif\n#ifndef\tT_TCP_NODELAY\n#define\tT_TCP_NODELAY\tTCP_NODELAY\n#endif\n#ifndef\tT_TCP_MAXSEG\n#define\tT_TCP_MAXSEG\tTCP_MAXSEG\n#endif\n#ifndef\tT_TCP_KEEPALIVE\n#define\tT_TCP_KEEPALIVE\tTCP_KEEPALIVE\n#endif\n#ifndef\tT_UDP_CHECKSUM\n#define\tT_UDP_CHECKSUM\tUDP_CHECKSUM\n#endif\n#ifndef\tT_IP_OPTIONS\n#define\tT_IP_OPTIONS\tIP_OPTIONS\n#endif\n#ifndef\tT_IP_TOS\n#define\tT_IP_TOS\t\tIP_TOS\n#endif\n#ifndef\tT_IP_TTL\n#define\tT_IP_TTL\t\tIP_TTL\n#endif\n#ifndef\tT_IP_REUSEADDR\n#define\tT_IP_REUSEADDR\tIP_REUSEADDR\n#endif\n#ifndef\tT_IP_DONTROUTE\n#define\tT_IP_DONTROUTE\tIP_DONTROUTE\n#endif\n/* include unpxtih2 */\n#ifndef\tT_IP_BROADCAST\n#define\tT_IP_BROADCAST\tIP_BROADCAST\n/* $$.Ic T_IP_BROADCAST$$ */\n#endif\n\n/* Define the appropriate devices for t_open(). */\n#ifdef\tHAVE_DEV_TCP\n# define\tXTI_TCP\t\t\"/dev/tcp\"\n# define\tXTI_UDP\t\t\"/dev/udp\"\n#endif\n#ifdef\tHAVE_DEV_XTI_TCP\n# define\tXTI_TCP\t\t\"/dev/xti/tcp\"\n# define\tXTI_UDP\t\t\"/dev/xti/udp\"\n#endif\n#ifdef\tHAVE_DEV_STREAMS_XTISO_TCP\n# define\tXTI_TCP\t\t\"/dev/streams/xtiso/tcp+\"\t/* + for XPG4 */\n# define\tXTI_UDP\t\t\"/dev/streams/xtiso/udp+\"\t/* + for XPG4 */\n#endif\n\n\t/* 4device to t_open() for t_accept(); set by tcp_listen() */\n/* $$.Id xti_serv_dev$$ */\nextern char\txti_serv_dev[];\n/* end unpxtih2 */\n\nvoid\t err_xti(const char *fmt, ...);\nvoid\t err_xti_ret(const char *fmt, ...);\n\nint\t\t Getmsg(int, struct strbuf *, struct strbuf *, int *);\nvoid\t Putmsg(int, const struct strbuf *, const struct strbuf *, int);\n\n#ifdef\tHAVE_NETCONFIG_H\nvoid\t*Setnetconfig(void);\nvoid\t*Setnetpath(void);\n#endif\n\nvoid\t*T_alloc(int, int, int);\nint\t\t T_accept(int, int, struct t_call *);\nvoid\t T_bind(int, const struct t_bind *, struct t_bind *);\nvoid\t T_close(int);\nvoid\t T_connect(int, const struct t_call *, struct t_call *);\nvoid\t T_free(void *, int);\nvoid\t T_getprotaddr(int, struct t_bind *, struct t_bind *);\nint\t\t T_getstate(int);\nvoid\t T_listen(int, struct t_call *);\nint\t\t T_look(int);\nint\t\t T_open(const char *, int, struct t_info *);\nvoid\t T_optmgmt(int, const struct t_optmgmt *, struct t_optmgmt *);\nint\t\t T_rcv(int, void *, unsigned int, int *);\nvoid\t T_rcvdis(int, struct t_discon *);\nvoid\t T_rcvrel(int);\nvoid\t T_rcvudata(int, struct t_unitdata *, int *);\nvoid\t T_rcvuderr(int, struct t_uderr *);\nvoid\t T_snd(int, void *, unsigned int, int);\nvoid\t T_sndrel(int);\nvoid\t T_sndudata(int, struct t_unitdata *);\n\nint\t\t xti_accept(int, struct netbuf *, int);\nint\t\t xti_getopt(int, int, int, void *, socklen_t *);\nchar\t*xti_flags_str(int);\nchar\t*xti_tlook_str(int);\nchar\t*xti_ntop(const struct netbuf *);\nchar\t*xti_ntop_host(const struct netbuf *);\nint\t\t xti_rdwr(int);\nint\t\t xti_setopt(int, int, int, void *, socklen_t);\n\nint\t\t Xti_accept(int, struct netbuf *, int);\nvoid\t Xti_getopt(int, int, int, void *, socklen_t *);\nchar\t*Xti_flags_str(int);\nchar\t*Xti_tlook_str(int);\nchar\t*Xti_ntop(const struct netbuf *);\nchar\t*Xti_ntop_host(const struct netbuf *);\nvoid\t Xti_rdwr(int);\nvoid\t Xti_setopt(int, int, int, void *, socklen_t);\n\nchar\t*xti_str_lend(struct t_opthdr *);\nchar\t*xti_str_uscalard(struct t_opthdr *);\nchar\t*xti_str_uchard(struct t_opthdr *);\nchar\t*xti_str_ucharx(struct t_opthdr *);\nchar\t*xti_str_yn(t_uscalar_t);\nchar\t*xti_str_syng(t_scalar_t);\nchar\t*xti_str_uiyn(struct t_opthdr *);\nchar\t*xti_str_usyn(struct t_opthdr *);\nchar\t*xti_str_linger(struct t_opthdr *);\nchar\t*xti_str_kpalive(struct t_opthdr *);\nchar\t*xti_str_flags(t_scalar_t);\n\n#endif\t/* __unp_xti_h */\n"
  },
  {
    "path": "tcpcliserv/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\ttcpcli01 tcpcli04 tcpcli05 tcpcli06 \\\n\t\ttcpcli07 tcpcli08 tcpcli09 tcpcli10 \\\n\t\ttcpserv01 tcpserv02 tcpserv03 tcpserv04 \\\n\t\ttcpserv08 tcpserv09 tcpservselect01 tcpservpoll01 tsigpipe\n\nall:\t${PROGS}\n\ntcpcli01:\ttcpcli01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli01.o ${LIBS}\n\ntcpcli04:\ttcpcli04.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli04.o ${LIBS}\n\ntcpcli05:\ttcpcli05.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli05.o ${LIBS}\n\ntcpcli06:\ttcpcli06.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli06.o ${LIBS}\n\ntcpcli07:\ttcpcli07.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli07.o ${LIBS}\n\ntcpcli08:\ttcpcli08.o str_cli08.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli08.o str_cli08.o ${LIBS}\n\ntcpcli09:\ttcpcli09.o str_cli09.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli09.o str_cli09.o ${LIBS}\n\ntcpcli10:\ttcpcli10.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli10.o ${LIBS}\n\ntcpcli11:\ttcpcli11.o str_cli11.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli11.o str_cli11.o ${LIBS}\n\ntcpserv01:\ttcpserv01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv01.o ${LIBS}\n\ntcpserv02:\ttcpserv02.o sigchldwait.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv02.o sigchldwait.o ${LIBS}\n\ntcpserv03:\ttcpserv03.o sigchldwait.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv03.o sigchldwait.o ${LIBS}\n\ntcpserv04:\ttcpserv04.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv04.o sigchldwaitpid.o ${LIBS}\n\ntcpserv08:\ttcpserv08.o str_echo08.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv08.o str_echo08.o sigchldwaitpid.o \\\n\t\t\t${LIBS}\n\ntcpserv09:\ttcpserv09.o str_echo09.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv09.o str_echo09.o sigchldwaitpid.o \\\n\t\t\t${LIBS}\n\ntcpservselect01:\ttcpservselect01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpservselect01.o ${LIBS}\n\ntcpservpoll01:\ttcpservpoll01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpservpoll01.o ${LIBS}\n\ntsigpipe:\ttsigpipe.o\n\t\t${CC} ${CFLAGS} -o $@ tsigpipe.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "tcpcliserv/sigchldwait.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\tpid = wait(&stat);\n\tprintf(\"child %d terminated\\n\", pid);\n\treturn;\n}\n"
  },
  {
    "path": "tcpcliserv/sigchldwait.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/sigchldwait.c##\n\nvoid##  2 ##src/tcpcliserv/sigchldwait.c##\nsig_chld(int signo)##  3 ##src/tcpcliserv/sigchldwait.c##\n{##  4 ##src/tcpcliserv/sigchldwait.c##\n    pid_t   pid;##  5 ##src/tcpcliserv/sigchldwait.c##\n    int     stat;##  6 ##src/tcpcliserv/sigchldwait.c##\n\n    pid = wait(&stat);##  7 ##src/tcpcliserv/sigchldwait.c##\n    printf(\"child %d terminated\\n\", pid);##  8 ##src/tcpcliserv/sigchldwait.c##\n    return;##  9 ##src/tcpcliserv/sigchldwait.c##\n}## 10 ##src/tcpcliserv/sigchldwait.c##\n"
  },
  {
    "path": "tcpcliserv/sigchldwaitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)\n\t\tprintf(\"child %d terminated\\n\", pid);\n\treturn;\n}\n"
  },
  {
    "path": "tcpcliserv/sigchldwaitpid.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/sigchldwaitpid.c##\n\nvoid##  2 ##src/tcpcliserv/sigchldwaitpid.c##\nsig_chld(int signo)##  3 ##src/tcpcliserv/sigchldwaitpid.c##\n{##  4 ##src/tcpcliserv/sigchldwaitpid.c##\n    pid_t   pid;##  5 ##src/tcpcliserv/sigchldwaitpid.c##\n    int     stat;##  6 ##src/tcpcliserv/sigchldwaitpid.c##\n\n    while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)##  7 ##src/tcpcliserv/sigchldwaitpid.c##\n        printf(\"child %d terminated\\n\", pid);##  8 ##src/tcpcliserv/sigchldwaitpid.c##\n    return;##  9 ##src/tcpcliserv/sigchldwaitpid.c##\n}## 10 ##src/tcpcliserv/sigchldwaitpid.c##\n"
  },
  {
    "path": "tcpcliserv/str_cli08.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tchar\tsendline[MAXLINE], recvline[MAXLINE];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tWriten(sockfd, sendline, strlen(sendline));\n\n\t\tif (Readline(sockfd, recvline, MAXLINE) == 0)\n\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/str_cli09.c",
    "content": "#include\t\"unp.h\"\n#include\t\"sum.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tchar\t\t\tsendline[MAXLINE];\n\tstruct args\t\targs;\n\tstruct result\tresult;\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tif (sscanf(sendline, \"%ld%ld\", &args.arg1, &args.arg2) != 2) {\n\t\t\tprintf(\"invalid input: %s\", sendline);\n\t\t\tcontinue;\n\t\t}\n\t\tWriten(sockfd, &args, sizeof(args));\n\n\t\tif (Readn(sockfd, &result, sizeof(result)) == 0)\n\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\n\t\tprintf(\"%ld\\n\", result.sum);\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/str_cli11.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_cli(FILE *fp, int sockfd)\n{\n\tchar\tsendline[MAXLINE], recvline[MAXLINE];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tWriten(sockfd, sendline, 1);\n\t\tsleep(1);\n\t\tWriten(sockfd, sendline+1, strlen(sendline)-1);\n\n\t\tif (Readline(sockfd, recvline, MAXLINE) == 0)\n\t\t\terr_quit(\"str_cli: server terminated prematurely\");\n\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/str_cli11.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/str_cli11.c##\n\nvoid##  2 ##src/tcpcliserv/str_cli11.c##\nstr_cli(FILE *fp, int sockfd)##  3 ##src/tcpcliserv/str_cli11.c##\n{##  4 ##src/tcpcliserv/str_cli11.c##\n    char    sendline[MAXLINE], recvline[MAXLINE];##  5 ##src/tcpcliserv/str_cli11.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {##  6 ##src/tcpcliserv/str_cli11.c##\n\n        Writen(sockfd, sendline, 1);##  7 ##src/tcpcliserv/str_cli11.c##\n        sleep(1);##  8 ##src/tcpcliserv/str_cli11.c##\n        Writen(sockfd, sendline + 1, strlen(sendline) - 1);##  9 ##src/tcpcliserv/str_cli11.c##\n\n        if (Readline(sockfd, recvline, MAXLINE) == 0)## 10 ##src/tcpcliserv/str_cli11.c##\n            err_quit(\"str_cli: server terminated prematurely\");## 11 ##src/tcpcliserv/str_cli11.c##\n\n        Fputs(recvline, stdout);## 12 ##src/tcpcliserv/str_cli11.c##\n    }## 13 ##src/tcpcliserv/str_cli11.c##\n}## 14 ##src/tcpcliserv/str_cli11.c##\n"
  },
  {
    "path": "tcpcliserv/str_echo08.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nstr_echo(int sockfd)\n{\n\tlong\t\targ1, arg2;\n\tssize_t\t\tn;\n\tchar\t\tline[MAXLINE];\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Readline(sockfd, line, MAXLINE)) == 0)\n\t\t\treturn;\t\t/* connection closed by other end */\n\n\t\tif (sscanf(line, \"%ld%ld\", &arg1, &arg2) == 2)\n\t\t\tsnprintf(line, sizeof(line), \"%ld\\n\", arg1 + arg2);\n\t\telse\n\t\t\tsnprintf(line, sizeof(line), \"input error\\n\");\n\n\t\tn = strlen(line);\n\t\tWriten(sockfd, line, n);\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/str_echo08.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/str_echo08.c##\n\nvoid##  2 ##src/tcpcliserv/str_echo08.c##\nstr_echo(int sockfd)##  3 ##src/tcpcliserv/str_echo08.c##\n{##  4 ##src/tcpcliserv/str_echo08.c##\n    long    arg1, arg2;##  5 ##src/tcpcliserv/str_echo08.c##\n    ssize_t n;##  6 ##src/tcpcliserv/str_echo08.c##\n    char    line[MAXLINE];##  7 ##src/tcpcliserv/str_echo08.c##\n\n    for (;;) {##  8 ##src/tcpcliserv/str_echo08.c##\n        if ((n = Readline(sockfd, line, MAXLINE)) == 0)##  9 ##src/tcpcliserv/str_echo08.c##\n            return;             /* connection closed by other end */## 10 ##src/tcpcliserv/str_echo08.c##\n\n        if (sscanf(line, \"%ld%ld\", &arg1, &arg2) == 2)## 11 ##src/tcpcliserv/str_echo08.c##\n            snprintf(line, sizeof(line), \"%ld\\n\", arg1 + arg2);## 12 ##src/tcpcliserv/str_echo08.c##\n        else## 13 ##src/tcpcliserv/str_echo08.c##\n            snprintf(line, sizeof(line), \"input error\\n\");## 14 ##src/tcpcliserv/str_echo08.c##\n\n        n = strlen(line);## 15 ##src/tcpcliserv/str_echo08.c##\n        Writen(sockfd, line, n);## 16 ##src/tcpcliserv/str_echo08.c##\n    }## 17 ##src/tcpcliserv/str_echo08.c##\n}## 18 ##src/tcpcliserv/str_echo08.c##\n"
  },
  {
    "path": "tcpcliserv/str_echo09.c",
    "content": "#include\t\"unp.h\"\n#include\t\"sum.h\"\n\nvoid\nstr_echo(int sockfd)\n{\n\tssize_t\t\t\tn;\n\tstruct args\t\targs;\n\tstruct result\tresult;\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Readn(sockfd, &args, sizeof(args))) == 0)\n\t\t\treturn;\t\t/* connection closed by other end */\n\n\t\tresult.sum = args.arg1 + args.arg2;\n\t\tWriten(sockfd, &result, sizeof(result));\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/sum.h",
    "content": "struct args {\n  long\targ1;\n  long\targ2;\n};\n\nstruct result {\n  long\tsum;\n};\n"
  },
  {
    "path": "tcpcliserv/tcpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/tcpcli01.c##\n\nint##  2 ##src/tcpcliserv/tcpcli01.c##\nmain(int argc, char **argv)##  3 ##src/tcpcliserv/tcpcli01.c##\n{##  4 ##src/tcpcliserv/tcpcli01.c##\n    int     sockfd;##  5 ##src/tcpcliserv/tcpcli01.c##\n    struct sockaddr_in servaddr;##  6 ##src/tcpcliserv/tcpcli01.c##\n\n    if (argc != 2)##  7 ##src/tcpcliserv/tcpcli01.c##\n        err_quit(\"usage: tcpcli <IPaddress>\");##  8 ##src/tcpcliserv/tcpcli01.c##\n\n    sockfd = Socket(AF_INET, SOCK_STREAM, 0);##  9 ##src/tcpcliserv/tcpcli01.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 10 ##src/tcpcliserv/tcpcli01.c##\n    servaddr.sin_family = AF_INET;## 11 ##src/tcpcliserv/tcpcli01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 12 ##src/tcpcliserv/tcpcli01.c##\n    Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);## 13 ##src/tcpcliserv/tcpcli01.c##\n\n    Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));## 14 ##src/tcpcliserv/tcpcli01.c##\n\n    str_cli(stdin, sockfd);     /* do it all */## 15 ##src/tcpcliserv/tcpcli01.c##\n\n    exit(0);## 16 ##src/tcpcliserv/tcpcli01.c##\n}## 17 ##src/tcpcliserv/tcpcli01.c##\n"
  },
  {
    "path": "tcpcliserv/tcpcli04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\ti, sockfd[5];\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tfor (i = 0; i < 5; i++) {\n\t\tsockfd[i] = Socket(AF_INET, SOCK_STREAM, 0);\n\n\t\tbzero(&servaddr, sizeof(servaddr));\n\t\tservaddr.sin_family = AF_INET;\n\t\tservaddr.sin_port = htons(SERV_PORT);\n\t\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\t\tConnect(sockfd[i], (SA *) &servaddr, sizeof(servaddr));\n\t}\n\n\tstr_cli(stdin, sockfd[0]);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli05.c",
    "content": "/* Use standard echo server; baseline measurements for nonblocking version */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli06.c",
    "content": "/* Test version of client that sends one line without a newline,\n   to break tcpservselect01.c */\n\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tWriten(sockfd, \"foo\", 3);\t/* no newline */\n\tsleep(30);\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli07.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tvoid\t\t\t\tsig_alrm(int);\n\tstruct itimerval\tval;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\t\t/* Set interval timer to go off before 3WHS completes */\n\tSignal(SIGALRM, sig_alrm);\n\tval.it_interval.tv_sec  = 0;\n\tval.it_interval.tv_usec = 0;\n\tval.it_value.tv_sec  = 0;\n\tval.it_value.tv_usec = 50000;\t/* 50 ms */\n\tif (setitimer(ITIMER_REAL, &val, NULL) == -1)\n\t\terr_sys(\"setitimer error\");\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n\nvoid\nsig_alrm(int signo)\n{\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli08.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli09.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli10.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct linger\t\tling;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\tling.l_onoff = 1;\n\tling.l_linger = 0;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpcli11.c",
    "content": "/* Use standard echo server; baseline measurements for nonblocking version */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "tcpcliserv/tcpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &clilen);\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/tcpserv01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/tcpserv01.c##\n\nint##  2 ##src/tcpcliserv/tcpserv01.c##\nmain(int argc, char **argv)##  3 ##src/tcpcliserv/tcpserv01.c##\n{##  4 ##src/tcpcliserv/tcpserv01.c##\n    int     listenfd, connfd;##  5 ##src/tcpcliserv/tcpserv01.c##\n    pid_t   childpid;##  6 ##src/tcpcliserv/tcpserv01.c##\n    socklen_t clilen;##  7 ##src/tcpcliserv/tcpserv01.c##\n    struct sockaddr_in cliaddr, servaddr;##  8 ##src/tcpcliserv/tcpserv01.c##\n\n    listenfd = Socket(AF_INET, SOCK_STREAM, 0);##  9 ##src/tcpcliserv/tcpserv01.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 10 ##src/tcpcliserv/tcpserv01.c##\n    servaddr.sin_family = AF_INET;## 11 ##src/tcpcliserv/tcpserv01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 12 ##src/tcpcliserv/tcpserv01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 13 ##src/tcpcliserv/tcpserv01.c##\n\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 14 ##src/tcpcliserv/tcpserv01.c##\n\n    Listen(listenfd, LISTENQ);## 15 ##src/tcpcliserv/tcpserv01.c##\n\n    for (;;) {## 16 ##src/tcpcliserv/tcpserv01.c##\n        clilen = sizeof(cliaddr);## 17 ##src/tcpcliserv/tcpserv01.c##\n        connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);## 18 ##src/tcpcliserv/tcpserv01.c##\n\n        if ((childpid = Fork()) == 0) { /* child process */## 19 ##src/tcpcliserv/tcpserv01.c##\n            Close(listenfd);    /* close listening socket */## 20 ##src/tcpcliserv/tcpserv01.c##\n            str_echo(connfd);   /* process the request */## 21 ##src/tcpcliserv/tcpserv01.c##\n            exit(0);## 22 ##src/tcpcliserv/tcpserv01.c##\n        }## 23 ##src/tcpcliserv/tcpserv01.c##\n        Close(connfd);          /* parent closes connected socket */## 24 ##src/tcpcliserv/tcpserv01.c##\n    }## 25 ##src/tcpcliserv/tcpserv01.c##\n}## 26 ##src/tcpcliserv/tcpserv01.c##\n"
  },
  {
    "path": "tcpcliserv/tcpserv02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &clilen);\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/tcpserv03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/tcpserv04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\t/* must call waitpid() */\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/tcpserv04.lc",
    "content": "#include    \"unp.h\"##  1 ##src/tcpcliserv/tcpserv04.c##\n\nint##  2 ##src/tcpcliserv/tcpserv04.c##\nmain(int argc, char **argv)##  3 ##src/tcpcliserv/tcpserv04.c##\n{##  4 ##src/tcpcliserv/tcpserv04.c##\n    int     listenfd, connfd;##  5 ##src/tcpcliserv/tcpserv04.c##\n    pid_t   childpid;##  6 ##src/tcpcliserv/tcpserv04.c##\n    socklen_t clilen;##  7 ##src/tcpcliserv/tcpserv04.c##\n    struct sockaddr_in cliaddr, servaddr;##  8 ##src/tcpcliserv/tcpserv04.c##\n    void    sig_chld(int);##  9 ##src/tcpcliserv/tcpserv04.c##\n\n    listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 10 ##src/tcpcliserv/tcpserv04.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 11 ##src/tcpcliserv/tcpserv04.c##\n    servaddr.sin_family = AF_INET;## 12 ##src/tcpcliserv/tcpserv04.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 13 ##src/tcpcliserv/tcpserv04.c##\n    servaddr.sin_port = htons(SERV_PORT);## 14 ##src/tcpcliserv/tcpserv04.c##\n\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 15 ##src/tcpcliserv/tcpserv04.c##\n\n    Listen(listenfd, LISTENQ);## 16 ##src/tcpcliserv/tcpserv04.c##\n\n    Signal(SIGCHLD, sig_chld);  /* must call waitpid() */## 17 ##src/tcpcliserv/tcpserv04.c##\n\n    for (;;) {## 18 ##src/tcpcliserv/tcpserv04.c##\n        clilen = sizeof(cliaddr);## 19 ##src/tcpcliserv/tcpserv04.c##\n        if ((connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {## 20 ##src/tcpcliserv/tcpserv04.c##\n            if (errno == EINTR)## 21 ##src/tcpcliserv/tcpserv04.c##\n                continue;       /* back to for() */## 22 ##src/tcpcliserv/tcpserv04.c##\n            else## 23 ##src/tcpcliserv/tcpserv04.c##\n                err_sys(\"accept error\");## 24 ##src/tcpcliserv/tcpserv04.c##\n        }## 25 ##src/tcpcliserv/tcpserv04.c##\n\n        if ((childpid = Fork()) == 0) { /* child process */## 26 ##src/tcpcliserv/tcpserv04.c##\n            Close(listenfd);    /* close listening socket */## 27 ##src/tcpcliserv/tcpserv04.c##\n            str_echo(connfd);   /* process the request */## 28 ##src/tcpcliserv/tcpserv04.c##\n            exit(0);## 29 ##src/tcpcliserv/tcpserv04.c##\n        }## 30 ##src/tcpcliserv/tcpserv04.c##\n        Close(connfd);          /* parent closes connected socket */## 31 ##src/tcpcliserv/tcpserv04.c##\n    }## 32 ##src/tcpcliserv/tcpserv04.c##\n}## 33 ##src/tcpcliserv/tcpserv04.c##\n"
  },
  {
    "path": "tcpcliserv/tcpserv08.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/tcpserv09.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "tcpcliserv/tcpservpoll01.c",
    "content": "/* include fig01 */\n#include\t\"unp.h\"\n#include\t<limits.h>\t\t/* for OPEN_MAX */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\ti, maxi, listenfd, connfd, sockfd;\n\tint\t\t\t\t\tnready;\n\tssize_t\t\t\t\tn;\n\tchar\t\t\t\tbuf[MAXLINE];\n\tsocklen_t\t\t\tclilen;\n\tstruct pollfd\t\tclient[OPEN_MAX];\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tclient[0].fd = listenfd;\n\tclient[0].events = POLLRDNORM;\n\tfor (i = 1; i < OPEN_MAX; i++)\n\t\tclient[i].fd = -1;\t\t/* -1 indicates available entry */\n\tmaxi = 0;\t\t\t\t\t/* max index into client[] array */\n/* end fig01 */\n\n/* include fig02 */\n\tfor ( ; ; ) {\n\t\tnready = Poll(client, maxi+1, INFTIM);\n\n\t\tif (client[0].revents & POLLRDNORM) {\t/* new client connection */\n\t\t\tclilen = sizeof(cliaddr);\n\t\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &clilen);\n#ifdef\tNOTDEF\n\t\t\tprintf(\"new client: %s\\n\", Sock_ntop((SA *) &cliaddr, clilen));\n#endif\n\n\t\t\tfor (i = 1; i < OPEN_MAX; i++)\n\t\t\t\tif (client[i].fd < 0) {\n\t\t\t\t\tclient[i].fd = connfd;\t/* save descriptor */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tif (i == OPEN_MAX)\n\t\t\t\terr_quit(\"too many clients\");\n\n\t\t\tclient[i].events = POLLRDNORM;\n\t\t\tif (i > maxi)\n\t\t\t\tmaxi = i;\t\t\t\t/* max index in client[] array */\n\n\t\t\tif (--nready <= 0)\n\t\t\t\tcontinue;\t\t\t\t/* no more readable descriptors */\n\t\t}\n\n\t\tfor (i = 1; i <= maxi; i++) {\t/* check all clients for data */\n\t\t\tif ( (sockfd = client[i].fd) < 0)\n\t\t\t\tcontinue;\n\t\t\tif (client[i].revents & (POLLRDNORM | POLLERR)) {\n\t\t\t\tif ( (n = read(sockfd, buf, MAXLINE)) < 0) {\n\t\t\t\t\tif (errno == ECONNRESET) {\n\t\t\t\t\t\t\t/*4connection reset by client */\n#ifdef\tNOTDEF\n\t\t\t\t\t\tprintf(\"client[%d] aborted connection\\n\", i);\n#endif\n\t\t\t\t\t\tClose(sockfd);\n\t\t\t\t\t\tclient[i].fd = -1;\n\t\t\t\t\t} else\n\t\t\t\t\t\terr_sys(\"read error\");\n\t\t\t\t} else if (n == 0) {\n\t\t\t\t\t\t/*4connection closed by client */\n#ifdef\tNOTDEF\n\t\t\t\t\tprintf(\"client[%d] closed connection\\n\", i);\n#endif\n\t\t\t\t\tClose(sockfd);\n\t\t\t\t\tclient[i].fd = -1;\n\t\t\t\t} else\n\t\t\t\t\tWriten(sockfd, buf, n);\n\n\t\t\t\tif (--nready <= 0)\n\t\t\t\t\tbreak;\t\t\t\t/* no more readable descriptors */\n\t\t\t}\n\t\t}\n\t}\n}\n/* end fig02 */\n"
  },
  {
    "path": "tcpcliserv/tcpservpoll01.lc",
    "content": "/* include fig01 */\n#include    \"unp.h\"##  1 ##src/tcpcliserv/tcpservpoll01.c##\n#include    <limits.h>          /* for OPEN_MAX */##  2 ##src/tcpcliserv/tcpservpoll01.c##\n\nint##  3 ##src/tcpcliserv/tcpservpoll01.c##\nmain(int argc, char **argv)##  4 ##src/tcpcliserv/tcpservpoll01.c##\n{##  5 ##src/tcpcliserv/tcpservpoll01.c##\n    int     i, maxi, listenfd, connfd, sockfd;##  6 ##src/tcpcliserv/tcpservpoll01.c##\n    int     nready;##  7 ##src/tcpcliserv/tcpservpoll01.c##\n    ssize_t n;##  8 ##src/tcpcliserv/tcpservpoll01.c##\n    char    line[MAXLINE];##  9 ##src/tcpcliserv/tcpservpoll01.c##\n    socklen_t clilen;## 10 ##src/tcpcliserv/tcpservpoll01.c##\n    struct pollfd client[OPEN_MAX];## 11 ##src/tcpcliserv/tcpservpoll01.c##\n    struct sockaddr_in cliaddr, servaddr;## 12 ##src/tcpcliserv/tcpservpoll01.c##\n\n    listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 13 ##src/tcpcliserv/tcpservpoll01.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 14 ##src/tcpcliserv/tcpservpoll01.c##\n    servaddr.sin_family = AF_INET;## 15 ##src/tcpcliserv/tcpservpoll01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 16 ##src/tcpcliserv/tcpservpoll01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 17 ##src/tcpcliserv/tcpservpoll01.c##\n\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 18 ##src/tcpcliserv/tcpservpoll01.c##\n\n    Listen(listenfd, LISTENQ);## 19 ##src/tcpcliserv/tcpservpoll01.c##\n\n    client[0].fd = listenfd;## 20 ##src/tcpcliserv/tcpservpoll01.c##\n    client[0].events = POLLRDNORM;## 21 ##src/tcpcliserv/tcpservpoll01.c##\n    for (i = 1; i < OPEN_MAX; i++)## 22 ##src/tcpcliserv/tcpservpoll01.c##\n        client[i].fd = -1;      /* -1 indicates available entry */## 23 ##src/tcpcliserv/tcpservpoll01.c##\n    maxi = 0;                   /* max index into client[] array */## 24 ##src/tcpcliserv/tcpservpoll01.c##\n/* end fig01 */\n\n/* include fig02 */\n    for (;;) {## 25 ##src/tcpcliserv/tcpservpoll01.c##\n        nready = Poll(client, maxi + 1, INFTIM);## 26 ##src/tcpcliserv/tcpservpoll01.c##\n\n        if (client[0].revents & POLLRDNORM) {   /* new client connection */## 27 ##src/tcpcliserv/tcpservpoll01.c##\n            clilen = sizeof(cliaddr);## 28 ##src/tcpcliserv/tcpservpoll01.c##\n            connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);## 29 ##src/tcpcliserv/tcpservpoll01.c##\n\n            for (i = 1; i < OPEN_MAX; i++)## 30 ##src/tcpcliserv/tcpservpoll01.c##\n                if (client[i].fd < 0) {## 31 ##src/tcpcliserv/tcpservpoll01.c##\n                    client[i].fd = connfd;  /* save descriptor */## 32 ##src/tcpcliserv/tcpservpoll01.c##\n                    break;## 33 ##src/tcpcliserv/tcpservpoll01.c##\n                }## 34 ##src/tcpcliserv/tcpservpoll01.c##\n            if (i == OPEN_MAX)## 35 ##src/tcpcliserv/tcpservpoll01.c##\n                err_quit(\"too many clients\");## 36 ##src/tcpcliserv/tcpservpoll01.c##\n\n            client[i].events = POLLRDNORM;## 37 ##src/tcpcliserv/tcpservpoll01.c##\n            if (i > maxi)## 38 ##src/tcpcliserv/tcpservpoll01.c##\n                maxi = i;       /* max index in client[] array */## 39 ##src/tcpcliserv/tcpservpoll01.c##\n\n            if (--nready <= 0)## 40 ##src/tcpcliserv/tcpservpoll01.c##\n                continue;       /* no more readable descriptors */## 41 ##src/tcpcliserv/tcpservpoll01.c##\n        }## 42 ##src/tcpcliserv/tcpservpoll01.c##\n\n        for (i = 1; i <= maxi; i++) {   /* check all clients for data */## 43 ##src/tcpcliserv/tcpservpoll01.c##\n            if ((sockfd = client[i].fd) < 0)## 44 ##src/tcpcliserv/tcpservpoll01.c##\n                continue;## 45 ##src/tcpcliserv/tcpservpoll01.c##\n            if (client[i].revents & (POLLRDNORM | POLLERR)) {## 46 ##src/tcpcliserv/tcpservpoll01.c##\n                if ((n = readline(sockfd, line, MAXLINE)) < 0) {## 47 ##src/tcpcliserv/tcpservpoll01.c##\n                    if (errno == ECONNRESET) {## 48 ##src/tcpcliserv/tcpservpoll01.c##\n                        /* 4connection reset by client */## 49 ##src/tcpcliserv/tcpservpoll01.c##\n                        Close(sockfd);## 50 ##src/tcpcliserv/tcpservpoll01.c##\n                        client[i].fd = -1;## 51 ##src/tcpcliserv/tcpservpoll01.c##\n                    } else## 52 ##src/tcpcliserv/tcpservpoll01.c##\n                        err_sys(\"readline error\");## 53 ##src/tcpcliserv/tcpservpoll01.c##\n                } else if (n == 0) {## 54 ##src/tcpcliserv/tcpservpoll01.c##\n                    /* 4connection closed by client */## 55 ##src/tcpcliserv/tcpservpoll01.c##\n                    Close(sockfd);## 56 ##src/tcpcliserv/tcpservpoll01.c##\n                    client[i].fd = -1;## 57 ##src/tcpcliserv/tcpservpoll01.c##\n                } else## 58 ##src/tcpcliserv/tcpservpoll01.c##\n                    Writen(sockfd, line, n);## 59 ##src/tcpcliserv/tcpservpoll01.c##\n\n                if (--nready <= 0)## 60 ##src/tcpcliserv/tcpservpoll01.c##\n                    break;      /* no more readable descriptors */## 61 ##src/tcpcliserv/tcpservpoll01.c##\n            }## 62 ##src/tcpcliserv/tcpservpoll01.c##\n        }## 63 ##src/tcpcliserv/tcpservpoll01.c##\n    }## 64 ##src/tcpcliserv/tcpservpoll01.c##\n}## 65 ##src/tcpcliserv/tcpservpoll01.c##\n/* end fig02 */\n"
  },
  {
    "path": "tcpcliserv/tcpservselect01.c",
    "content": "/* include fig01 */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\ti, maxi, maxfd, listenfd, connfd, sockfd;\n\tint\t\t\t\t\tnready, client[FD_SETSIZE];\n\tssize_t\t\t\t\tn;\n\tfd_set\t\t\t\trset, allset;\n\tchar\t\t\t\tbuf[MAXLINE];\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tmaxfd = listenfd;\t\t\t/* initialize */\n\tmaxi = -1;\t\t\t\t\t/* index into client[] array */\n\tfor (i = 0; i < FD_SETSIZE; i++)\n\t\tclient[i] = -1;\t\t\t/* -1 indicates available entry */\n\tFD_ZERO(&allset);\n\tFD_SET(listenfd, &allset);\n/* end fig01 */\n\n/* include fig02 */\n\tfor ( ; ; ) {\n\t\trset = allset;\t\t/* structure assignment */\n\t\tnready = Select(maxfd+1, &rset, NULL, NULL, NULL);\n\n\t\tif (FD_ISSET(listenfd, &rset)) {\t/* new client connection */\n\t\t\tclilen = sizeof(cliaddr);\n\t\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &clilen);\n#ifdef\tNOTDEF\n\t\t\tprintf(\"new client: %s, port %d\\n\",\n\t\t\t\t\tInet_ntop(AF_INET, &cliaddr.sin_addr, 4, NULL),\n\t\t\t\t\tntohs(cliaddr.sin_port));\n#endif\n\n\t\t\tfor (i = 0; i < FD_SETSIZE; i++)\n\t\t\t\tif (client[i] < 0) {\n\t\t\t\t\tclient[i] = connfd;\t/* save descriptor */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\tif (i == FD_SETSIZE)\n\t\t\t\terr_quit(\"too many clients\");\n\n\t\t\tFD_SET(connfd, &allset);\t/* add new descriptor to set */\n\t\t\tif (connfd > maxfd)\n\t\t\t\tmaxfd = connfd;\t\t\t/* for select */\n\t\t\tif (i > maxi)\n\t\t\t\tmaxi = i;\t\t\t\t/* max index in client[] array */\n\n\t\t\tif (--nready <= 0)\n\t\t\t\tcontinue;\t\t\t\t/* no more readable descriptors */\n\t\t}\n\n\t\tfor (i = 0; i <= maxi; i++) {\t/* check all clients for data */\n\t\t\tif ( (sockfd = client[i]) < 0)\n\t\t\t\tcontinue;\n\t\t\tif (FD_ISSET(sockfd, &rset)) {\n\t\t\t\tif ( (n = Read(sockfd, buf, MAXLINE)) == 0) {\n\t\t\t\t\t\t/*4connection closed by client */\n\t\t\t\t\tClose(sockfd);\n\t\t\t\t\tFD_CLR(sockfd, &allset);\n\t\t\t\t\tclient[i] = -1;\n\t\t\t\t} else\n\t\t\t\t\tWriten(sockfd, buf, n);\n\n\t\t\t\tif (--nready <= 0)\n\t\t\t\t\tbreak;\t\t\t\t/* no more readable descriptors */\n\t\t\t}\n\t\t}\n\t}\n}\n/* end fig02 */\n"
  },
  {
    "path": "tcpcliserv/tcpservselect01.lc",
    "content": "/* include fig01 */\n#include    \"unp.h\"##  1 ##src/tcpcliserv/tcpservselect01.c##\n\nint##  2 ##src/tcpcliserv/tcpservselect01.c##\nmain(int argc, char **argv)##  3 ##src/tcpcliserv/tcpservselect01.c##\n{##  4 ##src/tcpcliserv/tcpservselect01.c##\n    int     i, maxi, maxfd, listenfd, connfd, sockfd;##  5 ##src/tcpcliserv/tcpservselect01.c##\n    int     nready, client[FD_SETSIZE];##  6 ##src/tcpcliserv/tcpservselect01.c##\n    ssize_t n;##  7 ##src/tcpcliserv/tcpservselect01.c##\n    fd_set  rset, allset;##  8 ##src/tcpcliserv/tcpservselect01.c##\n    char    line[MAXLINE];##  9 ##src/tcpcliserv/tcpservselect01.c##\n    socklen_t clilen;## 10 ##src/tcpcliserv/tcpservselect01.c##\n    struct sockaddr_in cliaddr, servaddr;## 11 ##src/tcpcliserv/tcpservselect01.c##\n\n    listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 12 ##src/tcpcliserv/tcpservselect01.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 13 ##src/tcpcliserv/tcpservselect01.c##\n    servaddr.sin_family = AF_INET;## 14 ##src/tcpcliserv/tcpservselect01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 15 ##src/tcpcliserv/tcpservselect01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 16 ##src/tcpcliserv/tcpservselect01.c##\n\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 17 ##src/tcpcliserv/tcpservselect01.c##\n\n    Listen(listenfd, LISTENQ);## 18 ##src/tcpcliserv/tcpservselect01.c##\n\n    maxfd = listenfd;           /* initialize */## 19 ##src/tcpcliserv/tcpservselect01.c##\n    maxi = -1;                  /* index into client[] array */## 20 ##src/tcpcliserv/tcpservselect01.c##\n    for (i = 0; i < FD_SETSIZE; i++)## 21 ##src/tcpcliserv/tcpservselect01.c##\n        client[i] = -1;         /* -1 indicates available entry */## 22 ##src/tcpcliserv/tcpservselect01.c##\n    FD_ZERO(&allset);## 23 ##src/tcpcliserv/tcpservselect01.c##\n    FD_SET(listenfd, &allset);## 24 ##src/tcpcliserv/tcpservselect01.c##\n/* end fig01 */\n\n/* include fig02 */\n    for (;;) {## 25 ##src/tcpcliserv/tcpservselect01.c##\n        rset = allset;          /* structure assignment */## 26 ##src/tcpcliserv/tcpservselect01.c##\n        nready = Select(maxfd + 1, &rset, NULL, NULL, NULL);## 27 ##src/tcpcliserv/tcpservselect01.c##\n\n        if (FD_ISSET(listenfd, &rset)) {    /* new client connection */## 28 ##src/tcpcliserv/tcpservselect01.c##\n            clilen = sizeof(cliaddr);## 29 ##src/tcpcliserv/tcpservselect01.c##\n            connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);## 30 ##src/tcpcliserv/tcpservselect01.c##\n\n            for (i = 0; i < FD_SETSIZE; i++)## 31 ##src/tcpcliserv/tcpservselect01.c##\n                if (client[i] < 0) {## 32 ##src/tcpcliserv/tcpservselect01.c##\n                    client[i] = connfd; /* save descriptor */## 33 ##src/tcpcliserv/tcpservselect01.c##\n                    break;## 34 ##src/tcpcliserv/tcpservselect01.c##\n                }## 35 ##src/tcpcliserv/tcpservselect01.c##\n            if (i == FD_SETSIZE)## 36 ##src/tcpcliserv/tcpservselect01.c##\n                err_quit(\"too many clients\");## 37 ##src/tcpcliserv/tcpservselect01.c##\n\n            FD_SET(connfd, &allset);    /* add new descriptor to set */## 38 ##src/tcpcliserv/tcpservselect01.c##\n            if (connfd > maxfd)## 39 ##src/tcpcliserv/tcpservselect01.c##\n                maxfd = connfd; /* for select */## 40 ##src/tcpcliserv/tcpservselect01.c##\n            if (i > maxi)## 41 ##src/tcpcliserv/tcpservselect01.c##\n                maxi = i;       /* max index in client[] array */## 42 ##src/tcpcliserv/tcpservselect01.c##\n\n            if (--nready <= 0)## 43 ##src/tcpcliserv/tcpservselect01.c##\n                continue;       /* no more readable descriptors */## 44 ##src/tcpcliserv/tcpservselect01.c##\n        }## 45 ##src/tcpcliserv/tcpservselect01.c##\n\n        for (i = 0; i <= maxi; i++) {   /* check all clients for data */## 46 ##src/tcpcliserv/tcpservselect01.c##\n            if ((sockfd = client[i]) < 0)## 47 ##src/tcpcliserv/tcpservselect01.c##\n                continue;## 48 ##src/tcpcliserv/tcpservselect01.c##\n            if (FD_ISSET(sockfd, &rset)) {## 49 ##src/tcpcliserv/tcpservselect01.c##\n                if ((n = Readline(sockfd, line, MAXLINE)) == 0) {## 50 ##src/tcpcliserv/tcpservselect01.c##\n                    /* 4connection closed by client */## 51 ##src/tcpcliserv/tcpservselect01.c##\n                    Close(sockfd);## 52 ##src/tcpcliserv/tcpservselect01.c##\n                    FD_CLR(sockfd, &allset);## 53 ##src/tcpcliserv/tcpservselect01.c##\n                    client[i] = -1;## 54 ##src/tcpcliserv/tcpservselect01.c##\n                } else## 55 ##src/tcpcliserv/tcpservselect01.c##\n                    Writen(sockfd, line, n);## 56 ##src/tcpcliserv/tcpservselect01.c##\n\n                if (--nready <= 0)## 57 ##src/tcpcliserv/tcpservselect01.c##\n                    break;      /* no more readable descriptors */## 58 ##src/tcpcliserv/tcpservselect01.c##\n            }## 59 ##src/tcpcliserv/tcpservselect01.c##\n        }## 60 ##src/tcpcliserv/tcpservselect01.c##\n    }## 61 ##src/tcpcliserv/tcpservselect01.c##\n}## 62 ##src/tcpcliserv/tcpservselect01.c##\n/* end fig02 */\n"
  },
  {
    "path": "tcpcliserv/tsigpipe.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_pipe(int signo)\n{\n\tprintf(\"SIGPIPE received\\n\");\n\treturn;\n}\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: tcpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(13);\t\t/* daytime server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tSignal(SIGPIPE, sig_pipe);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tsleep(2);\n\tWrite(sockfd, \"hello\", 5);\n\tsleep(2);\n\tWrite(sockfd, \"world\", 5);\n\n\texit(0);\n}\n"
  },
  {
    "path": "test/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\taccept_eintr test1 treadline1 treadline2 treadline3 \\\n\t\ttsnprintf tisfdtype tshutdown\n\nTEST1_OBJS = test1.o funcs.o\n\nall:\t${PROGS}\n\ntest1:\t${TEST1_OBJS}\n\t\t${CC} ${CFLAGS} -o $@ ${TEST1_OBJS} ${LIBS}\n\ntest2:\ttest2.o\n\t\t${CC} ${CFLAGS} -o $@ test2.o ${LIBS}\n\naccept_eintr:\taccept_eintr.o\n\t\t${CC} ${CFLAGS} -o $@ accept_eintr.o ${LIBS}\n\ntreadline1:\ttreadline1.o readline1.o\n\t\t${CC} ${CFLAGS} -o $@ treadline1.o readline1.o ${LIBS}\n\ntreadline2:\ttreadline2.o readline2.o\n\t\t${CC} ${CFLAGS} -o $@ treadline2.o readline2.o ${LIBS}\n\ntreadline3:\ttreadline3.o readline3.o\n\t\t${CC} ${CFLAGS} -o $@ treadline3.o readline3.o ${LIBS}\n\ntsnprintf:\ttsnprintf.o\n\t\t${CC} ${CFLAGS} -o $@ tsnprintf.o ${LIBS}\n\ntisfdtype:\ttisfdtype.o\n\t\t${CC} ${CFLAGS} -o $@ tisfdtype.o ${LIBS}\n\ntshutdown:\ttshutdown.o\n\t\t${CC} ${CFLAGS} -o $@ tshutdown.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} core core.* *.o temp.* *.out typescript*\n"
  },
  {
    "path": "test/accept_eintr.c",
    "content": "#include\t\"unp.h\"\n\n/* Let's see if accept() is automatically restarted by the implementation. */\n\nvoid\nsig_int(int signo)\n{\n\tprintf(\"received SIGINT\\n\");\n\treturn;\n}\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGINT, sig_int);\t/* sets SA_RESTART */\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &clilen);\n\t\t\t/* error from Accept() if not restarted */\n\t}\n}\n"
  },
  {
    "path": "test/funcs.c",
    "content": "#include\t\"test.h\"\n\n/*\n * Fill in the global servaddr{} as a side effect.\n */\n\nint\nTcpSockByAddr(char *ipaddr, int port /* host byte order */ )\n{\n\tint\t\t\t\t\tsockfd;\n\n\tsockfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(port);\n\tInet_pton(AF_INET, ipaddr, &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\treturn(sockfd);\n}\n\n/*\n * Create the default (unconnected) UDP socket.\n * Fill in the global servaddr{} for the caller to use.\n */\n\nint\nUdpSockByAddr(char *ipaddr, int port /* host byte order */ )\n{\n\tint\t\t\t\t\tsockfd;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(port);\n\tInet_pton(AF_INET, ipaddr, &servaddr.sin_addr);\n\n\treturn(sockfd);\n}\n\n/*\n * Create a connected UDP socket.\n */\n\nint\nUdpConnSockByAddr(char *ipaddr, int port /* host byte order */ )\n{\n\tint\t\t\t\t\tsockfd;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(port);\n\tInet_pton(AF_INET, ipaddr, &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\treturn(sockfd);\n}\n"
  },
  {
    "path": "test/readline.h",
    "content": "typedef struct {\n  int\t\tread_fd;\t\t/* caller's descriptor to read from */\n  char\t\t*read_ptr;\t\t/* caller's buffer to read into */\n  size_t\tread_maxlen;\t/* max #bytes to read */\n\t\t\t\t/* next three are used internally by the function */\n  int\t\trl_cnt;\t\t\t/* initialize to 0 */\n  char\t\t*rl_bufptr;\t\t/* initialize to rl_buf */\n  char\t\trl_buf[MAXLINE];\n} Rline;\n\nvoid\treadline_rinit(int, void *, size_t, Rline *);\nssize_t\treadline_r(Rline *);\n"
  },
  {
    "path": "test/readline1.c",
    "content": "/* include readline */\n#include\t\"unp.h\"\n\n/* PAINFULLY SLOW VERSION -- example only */\nssize_t\nreadline(int fd, void *vptr, size_t maxlen)\n{\n\tssize_t\tn, rc;\n\tchar\tc, *ptr;\n\n\tptr = vptr;\n\tfor (n = 1; n < maxlen; n++) {\nagain:\n\t\tif ( (rc = read(fd, &c, 1)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\t/* newline is stored, like fgets() */\n\t\t} else if (rc == 0) {\n\t\t\t*ptr = 0;\n\t\t\treturn(n - 1);\t/* EOF, n - 1 bytes were read */\n\t\t} else {\n\t\t\tif (errno == EINTR)\n\t\t\t\tgoto again;\n\t\t\treturn(-1);\t\t/* error, errno set by read() */\n\t\t}\n\t}\n\n\t*ptr = 0;\t/* null terminate like fgets() */\n\treturn(n);\n}\n/* end readline */\n\nssize_t\nReadline(int fd, void *ptr, size_t maxlen)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline(fd, ptr, maxlen)) < 0)\n\t\terr_sys(\"readline error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "test/readline1.lc",
    "content": "/* include readline */\n#include    \"unp.h\"##  1 ##src/test/readline1.c##\n\nssize_t##  2 ##src/test/readline1.c##\nreadline(int fd, void *vptr, size_t maxlen)##  3 ##src/test/readline1.c##\n{##  4 ##src/test/readline1.c##\n    ssize_t n, rc;##  5 ##src/test/readline1.c##\n    char    c, *ptr;##  6 ##src/test/readline1.c##\n\n    ptr = vptr;##  7 ##src/test/readline1.c##\n    for (n = 1; n < maxlen; n++) {##  8 ##src/test/readline1.c##\n      again:##  9 ##src/test/readline1.c##\n        if ((rc = read(fd, &c, 1)) == 1) {## 10 ##src/test/readline1.c##\n            *ptr++ = c;## 11 ##src/test/readline1.c##\n            if (c == '\\n')## 12 ##src/test/readline1.c##\n                break;          /* newline is stored, like fgets() */## 13 ##src/test/readline1.c##\n        } else if (rc == 0) {## 14 ##src/test/readline1.c##\n            if (n == 1)## 15 ##src/test/readline1.c##\n                return (0);     /* EOF, no data read */## 16 ##src/test/readline1.c##\n            else## 17 ##src/test/readline1.c##\n                break;          /* EOF, some data was read */## 18 ##src/test/readline1.c##\n        } else {## 19 ##src/test/readline1.c##\n            if (errno == EINTR)## 20 ##src/test/readline1.c##\n                goto again;## 21 ##src/test/readline1.c##\n            return (-1);        /* error, errno set by read() */## 22 ##src/test/readline1.c##\n        }## 23 ##src/test/readline1.c##\n    }## 24 ##src/test/readline1.c##\n\n    *ptr = 0;                   /* null terminate like fgets() */## 25 ##src/test/readline1.c##\n    return (n);## 26 ##src/test/readline1.c##\n}## 27 ##src/test/readline1.c##\n/* end readline */\n\nssize_t## 28 ##src/test/readline1.c##\nReadline(int fd, void *ptr, size_t maxlen)## 29 ##src/test/readline1.c##\n{## 30 ##src/test/readline1.c##\n    ssize_t n;## 31 ##src/test/readline1.c##\n\n    if ((n = readline(fd, ptr, maxlen)) < 0)## 32 ##src/test/readline1.c##\n        err_sys(\"readline error\");## 33 ##src/test/readline1.c##\n    return (n);## 34 ##src/test/readline1.c##\n}## 35 ##src/test/readline1.c##\n"
  },
  {
    "path": "test/readline2.c",
    "content": "/* include readline */\n#include\t\"unp.h\"\n\nstatic ssize_t\nmy_read(int fd, char *ptr)\n{\n\tstatic int\tread_cnt = 0;\n\tstatic char\t*read_ptr;\n\tstatic char\tread_buf[MAXLINE];\n\n\tif (read_cnt <= 0) {\n\t\tif ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0)\n\t\t\terr_sys(\"read error\");\n\t\telse if (read_cnt == 0)\n\t\t\treturn(0);\n\t\tread_ptr = read_buf;\n\t}\n\n\tread_cnt--;\n\t*ptr = *read_ptr++ & 255;\n\treturn(1);\n}\n\nssize_t\nreadline(int fd, void *vptr, size_t maxlen)\n{\n\tint\t\tn, rc;\n\tchar\tc, *ptr;\n\n\tptr = vptr;\n\tfor (n = 1; n < maxlen; n++) {\n\t\tif ( (rc = my_read(fd, &c)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\n\t\t} else if (rc == 0) {\n\t\t\t*ptr = 0;\n\t\t\treturn(n - 1);\t/* EOF, n - 1 bytes were read */\n\t\t} else\n\t\t\treturn(-1);\t/* error */\n\t}\n\n\t*ptr = 0;\n\treturn(n);\n}\n/* end readline */\n\nssize_t\nReadline(int fd, void *ptr, size_t maxlen)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline(fd, ptr, maxlen)) == -1)\n\t\terr_sys(\"readline error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "test/readline3.c",
    "content": "/* include readline */\n#include\t\"unp.h\"\n#include\t\"readline.h\"\n\nstatic ssize_t\nmy_read(Rline *rptr, char *ptr)\n{\n\tif (rptr->rl_cnt <= 0) {\nagain:\n\t\trptr->rl_cnt = read(rptr->read_fd, rptr->rl_buf, sizeof(rptr->rl_buf));\n\t\tif (rptr->rl_cnt < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tgoto again;\n\t\t\telse\n\t\t\t\treturn(-1);\n\t\t}\n\t\telse if (rptr->rl_cnt == 0)\n\t\t\treturn(0);\n\t\trptr->rl_bufptr = rptr->rl_buf;\n\t}\n\n\trptr->rl_cnt--;\n\t*ptr = *rptr->rl_bufptr++ & 255;\n\treturn(1);\n}\n\nvoid\nreadline_rinit(int fd, void *ptr, size_t maxlen, Rline *rptr)\n{\n\trptr->read_fd = fd;\t\t\t\t/* save caller's arguments */\n\trptr->read_ptr = ptr;\n\trptr->read_maxlen = maxlen;\n\n\trptr->rl_cnt = 0;\t\t\t\t/* and init our counter & pointer */\n\trptr->rl_bufptr = rptr->rl_buf;\n}\n\nssize_t\nreadline_r(Rline *rptr)\n{\n\tint\t\tn, rc;\n\tchar\tc, *ptr;\n\n\tptr = rptr->read_ptr;\n\tfor (n = 1; n < rptr->read_maxlen; n++) {\n\t\tif ( (rc = my_read(rptr, &c)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\n\t\t} else if (rc == 0) {\n\t\t\t*ptr = 0;\n\t\t\treturn(n - 1);\t/* EOF, n - 1 bytes were read */\n\t\t} else\n\t\t\treturn(-1);\t/* error */\n\t}\n\n\t*ptr = 0;\n\treturn(n);\n}\n/* end readline */\n\nssize_t\nReadline(int fd, void *ptr, size_t maxlen)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline(fd, ptr, maxlen)) == -1)\n\t\terr_sys(\"readline error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "test/test.h",
    "content": "#include\t\"unp.h\"\n\n\t/* globals */\nextern struct sockaddr_in\tservaddr, cliaddr;\nextern char\t\tbuff[8192];\nextern int\t\tverbose;\n\nint\t\tTcpSockByAddr(char *, int);\nint\t\tUdpSockByAddr(char *, int);\nint\t\tUdpConnSockByAddr(char *, int);\n"
  },
  {
    "path": "test/test1.c",
    "content": "#include\t\"test.h\"\n\n/*\n * Socket test program.\n * Try and figure out everything that we can automatically.\n * Lines preceded by a + are deviations from 4.4BSD.\n * Lines preceded by a ! are fatal errors.\n * Lines without a + or ! are just informational.\n */\n\n\t/* allocate globals */\nstruct sockaddr_in\tservaddr, cliaddr;\nchar\tbuff[8192];\nint\t\tverbose;\n\n/*\n * Check whether various header flags are defined.\n */\n\nvoid\nheader_flags()\n{\n\n\t\t\t/* these are all \"if not defined\" */\n#ifndef\tMSG_DONTROUTE\n\tprintf(\"+ MSG_DONTROUTE not defined\\n\");\n#endif\n\n#ifndef\tMSG_OOB\n\tprintf(\"+ MSG_OOB not defined\\n\");\n#endif\n\n#ifndef\tMSG_PEEK\n\tprintf(\"+ MSG_PEEK not defined\\n\");\n#endif\n\n#ifndef\tMSG_WAITALL\n\tprintf(\"+ MSG_WAITALL not defined\\n\");\n#endif\n}\n\n/*\n * Check whether we can use sendto() and recvfrom() with a TCP socket.\n * Use a different length for each output function, so if it does work,\n * we can see it with tcpdump and separate it from the other outputs.\n */\n\nvoid\nsendto_01()\n{\n\tint\t\tsockfd, n;\n\tsocklen_t\tlen;\n\n\tsockfd = TcpSockByAddr(\"140.252.13.34\", 7);\t\t/* echo server */\n\n\t/*\n\t * This also verifies that we can call sendto() on a TCP socket\n\t * if we don't specify a destination address.\n\t */\n\n\tSendto(sockfd, \"hello\", 5, 0, NULL, NULL);\n\n\tif ( (n = Recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL)) != 5)\n\t\terr_quit(\"! Recvfrom expected 5\");\n\n\t/*\n\t * Now see what happens when we ask for the server's address.\n\t * Berkeley-derived implementations do not return this (p. 517, tcpipiv2)\n\t * while Solaris does.\n\t */\n\n\tSendto(sockfd, \"world\", 5, 0, NULL, NULL);\n\n\tlen = sizeof(servaddr) * 2;\t/* that's a lie */\n\tif ( (n = Recvfrom(sockfd, buff, sizeof(buff), 0,\n\t\t\t\t\t   (SA *) &servaddr, &len)) != 5)\n\t\terr_quit(\"! Recvfrom expected 5\");\n\tif (len != 0) {\n\t\terr_msg(\"+ recvfrom on TCP socket returns len = %d for sender's addr\",\n\t\t\t\tlen);\n\t\tif (len == sizeof(servaddr))\n\t\t\tprintf(\"  recvfrom from %s, port %d\\n\",\n\t\t\t\t   inet_ntoa(servaddr.sin_addr), ntohs(servaddr.sin_port));\n\t}\n\n\tClose(sockfd);\n\n\t/*\n\t * Now try and specify a destination address for sendto() on\n\t * a TCP socket.\n\t */\n\n\tsockfd = TcpSockByAddr(\"140.252.13.34\", 7);\t\t/* echo server */\n\n\t\t/* should not work with destination address specified */\n\tn = sendto(sockfd, \"hello1\", 6, 0, (SA *) &servaddr, sizeof(servaddr));\n\tif (n < 0)\n\t\terr_ret(\"sendto on TCP socket specifying dest addr returns error\");\n\telse if (n == 6)\n#ifdef\tMSG_EOF\t\t/* defined only if T/TCP supported */\n\t\terr_msg(\"+ sendto on TCP socket specifying dest addr OK (T/TCP supported)\");\n#else\n\t\terr_msg(\"+ sendto on TCP socket specifying dest addr OK\");\n#endif\n\telse\n\t\terr_quit(\"! sendto on TCP socket specifying dest addr, n = %d\", n);\n\n\tClose(sockfd);\n\n\t/*\n\t * Now an unconnected UDP socket.\n\t */\n\n\tsockfd = UdpSockByAddr(\"140.252.13.34\", 7);\t\t/* echo server */\n\n\t\t/* should not work */\n\tif ( (n = sendto(sockfd, \"hello12\", 7, 0, (SA *) 0, 0)) >= 0)\n\t\terr_msg(\"+ sendto on unconnected UDP without dest addr OK, n = %d\", n);\n\telse if (errno != EDESTADDRREQ)\n\t\terr_ret(\"+ sendto on unconnected UDP without dest addr, unexpected errno\");\n\n\t\t/* should not work */\n\tif ( (n = write(sockfd, \"hello\", 7)) >= 0)\n\t\terr_msg(\"+ write on unconnected UDP OK, n = %d\", n);\n\telse if (errno != EDESTADDRREQ)\n\t\terr_ret(\"+ write on unconnected UDP, unexpected errno\");\n\n\tClose(sockfd);\n\n\t/*\n\t * Now a connected UDP socket.\n\t */\n\n\tsockfd = UdpConnSockByAddr(\"140.252.13.34\", 7);\t\t/* echo server */\n\n\t\t/* should work */\n\tif ( (n = write(sockfd, \"hello123\", 8)) < 0)\n\t\terr_sys(\"! write on connected UDP, n = %d\", n);\n\telse if (n != 8)\n\t\terr_quit(\"! write on connected UDP, n = %d\", n);\n\n\t\t/* should work */\n\tif ( (n = sendto(sockfd, \"hello1234\", 9, 0, (SA *) 0, 0)) < 0)\n\t\terr_sys(\"! sendto on connected UDP without dest addr, n = %d\", n);\n\telse if (n != 9)\n\t\terr_quit(\"! sendto on connected UDP without dest addr, n = %d\", n);\n\n\t\t/* should not work */\n\tn = sendto(sockfd, \"hello12345\", 10, 0, (SA *) &servaddr, sizeof(servaddr));\n\tif (n < 0 && errno != EISCONN)\n\t\terr_ret(\"+ sendto on connected UDP with dest addr, unexpected errno\");\n\telse if (n >= 0)\n\t\terr_msg(\"+ sendto on connected UDP with dest addr OK, n = %d\", n);\n\n\tClose(sockfd);\n}\n\n/*\n * Send a UDP datagram to a server at IP address 1, and look at\n * the return address in the response.  If the server is multihomed,\n * the return address can differ from our original destination address.\n */\n\nvoid\nudp_01()\n{\n}\n\nstatic void\nusage(const char *msg)\n{\n\terr_msg(\n\"options: -v    verbose\\n\"\n);\n\n\tif (msg[0] != 0)\n\t\terr_quit(\"%s\", msg);\n\texit(1);\n}\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tc;\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"v\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 'v':\n\t\t\tverbose = 1;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\tusage(\"unrecognized option\");\n\t\t}\n\t}\n\n\tif (verbose) printf(\"header_flags\\n\");\n\theader_flags();\n\n\tif (verbose) printf(\"udp_01\\n\");\n\tudp_01();\n\n\tif (verbose) printf(\"sendto_01\\n\");\n\tsendto_01();\n}\n"
  },
  {
    "path": "test/test2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd;\n\tsocklen_t\t\tsalen;\n\tstruct addrinfo\t*res;\n\tstruct sockaddr\t*cli, *serv;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: test2 <IPaddress>\");\n\n#ifdef\tnotdef\n\tres = Host_serv(argv[1], \"daytime\", AF_UNSPEC, SOCK_DGRAM);\n\tprintf(\"res->ai_addrlen = %d\\n\", res->ai_addrlen);\n\tprintf(\"res->ai_addr = %p\\n\", res->ai_addr);\n\tprintf(\"res->ai_next = %p\\n\", res->ai_next);\n\tprintf(\"res->ai_addr->sa_family = %p\\n\", res->ai_addr->sa_family);\n#endif\n\tsockfd = Udp_client(argv[1], \"13\", (void **) &serv, &salen);\n\tprintf(\"sockfd = %d\\n\", sockfd);\n\n\texit(0);\n}\n#ifdef\tnotdef\nint\nudp_client(const char *host, const char *serv, void **saptr, socklen_t *lenp)\n{\n\tint\t\t\t\tsockfd, n;\n\tstruct addrinfo\thints, *res, *ressave;\n\n\tbzero(&hints, sizeof(struct addrinfo));\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_DGRAM;\n\n\tif ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)\n\t\terr_quit(\"udp_client error for %s, %s: %s\",\n\t\t\t\t host, serv, gai_strerror(n));\n\tressave = res;\n\n\tdo {\n\t\tsockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n\t\tif (sockfd >= 0)\n\t\t\tbreak;\t\t/* success */\n\t} while ( (res = res->ai_next) != NULL);\n\n\tif (res == NULL)\t/* errno set from final socket() */\n\t\terr_sys(\"udp_client error for %s, %s\", host, serv);\n\n\t*saptr = Malloc(res->ai_addrlen);\n\tmemcpy(*saptr, res->ai_addr, res->ai_addrlen);\n\t*lenp = res->ai_addrlen;\n\n\tfreeaddrinfo(ressave);\n\n\treturn(sockfd);\n}\n\nint\nUdp_client(const char *host, const char *serv, void **saptr, socklen_t *lenptr)\n{\n\treturn(udp_client(host, serv, saptr, lenptr));\n}\n#endif\n"
  },
  {
    "path": "test/tisfdtype.c",
    "content": "#include\t\"unp.h\"\n\nmain()\n{\n\tint\ttcpsock, udpsock;\n\n\tprintf(\"stdin: %d\\n\", Isfdtype(STDIN_FILENO, S_IFSOCK));\n\tprintf(\"stdout: %d\\n\", Isfdtype(STDOUT_FILENO, S_IFSOCK));\n\tprintf(\"stderr: %d\\n\", Isfdtype(STDERR_FILENO, S_IFSOCK));\n\n\ttcpsock = Socket(AF_INET, SOCK_STREAM, 0);\n\tprintf(\"TCP socket: %d\\n\", Isfdtype(tcpsock, S_IFSOCK));\n\n\tudpsock = Socket(AF_INET, SOCK_DGRAM, 0);\n\tprintf(\"UDP socket: %d\\n\", Isfdtype(udpsock, S_IFSOCK));\n\n\texit(0);\n}\n"
  },
  {
    "path": "test/treadline1.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tcount = 0;\n\tssize_t\tn;\n\tchar\trecvline[MAXLINE];\n\n\twhile ( ( n = readline(STDIN_FILENO, recvline, MAXLINE)) > 0)\n\t\tcount++;\n\tprintf(\"%d lines\\n\", count);\n}\n"
  },
  {
    "path": "test/treadline2.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tcount = 0;\n\tssize_t\tn;\n\tchar\trecvline[MAXLINE];\n\n\twhile ( ( n = readline(STDIN_FILENO, recvline, MAXLINE)) > 0)\n\t\tcount++;\n\tprintf(\"%d lines\\n\", count);\n}\n"
  },
  {
    "path": "test/treadline3.c",
    "content": "#include\t\"unp.h\"\n#include\t\"readline.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tcount = 0;\n\tssize_t\tn;\n\tchar\trecvline[MAXLINE];\n\tRline\trline;\n\n\treadline_rinit(STDIN_FILENO, recvline, MAXLINE, &rline);\n\twhile ( (n = readline_r(&rline)) > 0)\n\t\tcount++;\n\tprintf(\"%d lines\\n\", count);\n}\n"
  },
  {
    "path": "test/tshutdown.c",
    "content": "#include\t\"unp.h\"\n\n#define\tBUFF\t100000\nchar\tbuff[BUFF];\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd, nbytes;\n\tssize_t\tn;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tshutdown <hostname> <service>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\tfprintf(stderr, \"connected\\n\");\n\n\twhile ( (n = Read(STDIN_FILENO, buff, BUFF)) > 0) {\n\t\tWriten(sockfd, buff, n);\n\t}\n\tClose(STDIN_FILENO);\n\t/* Shutdown(sockfd, SHUT_WR); */\n\t\n\tnbytes = 0;\n\twhile ( (n = Read(sockfd, buff, BUFF)) > 0) {\n\t\t/* fprintf(stderr, \"read %d bytes from socket\\n\", n); */\n\t\tWrite(STDOUT_FILENO, buff, n);\n\t\tnbytes += n;\n\t}\n\tfprintf(stderr, \"total: %d bytes read from socket\\n\", nbytes);\n\tClose(STDOUT_FILENO);\n\n\texit(0);\n}\n"
  },
  {
    "path": "test/tsnprintf.c",
    "content": "/*\n * If your system does not provide snprintf(), this program will compile\n * but will have an undefined error from the linker.\n *\n * If you are using the lib/snprintf.c function that is supplied for\n * systems without snprintf(), you should get an error output from our\n * library function.\n *\n * If your system provides the function, and it works, there should be\n * no output.\n */\n\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tn;\n\tchar\tbuf[1024];\n\n\tn = snprintf(buf, 4, \"%d\", 9999);\n\tif (n > 3)\n\t\tprintf(\"error: snprintf overflowed buffer, n = %d\\n\", n);\n\texit(0);\n}\n"
  },
  {
    "path": "threads/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tweb01 web02 web03 \\\n\ttcpcli01 tcpcli02 tcpserv01 tcpserv02 \\\n\ttest01 example01 example02 example03\n\nall:\t${PROGS}\n\nweb01:\tweb01.o\n\t\t${CC} ${CFLAGS} -o $@ web01.o ${LIBS}\n\nweb02:\tweb02.o\n\t\t${CC} ${CFLAGS} -o $@ web02.o ${LIBS}\n\nweb03:\tweb03.o\n\t\t${CC} ${CFLAGS} -o $@ web03.o ${LIBS}\n\ntcpcli01:\ttcpcli01.o strclithread.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli01.o strclithread.o ${LIBS}\n\ntcpcli02:\ttcpcli02.o strclithread2.o\n\t\t${CC} ${CFLAGS} -o $@ tcpcli02.o strclithread2.o ${LIBS}\n\ntcpserv01:\ttcpserv01.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv01.o ${LIBS}\n\n# Broken one that uses readline() from library.\ntcpserv02:\ttcpserv02.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv02.o ${LIBS}\n\n# Correct one that uses thread-safe readline().\ntcpserv02g:\ttcpserv02.o readline.o\n\t\t${CC} ${CFLAGS} -o $@ tcpserv02.o readline.o ${LIBS}\n\ntest01:\ttest01.o\n\t\t${CC} ${CFLAGS} -o $@ test01.o ${LIBS}\n\ntest02:\ttest02.o\n\t\t${CC} ${CFLAGS} -o $@ test02.o ${LIBS}\n\ntest03:\ttest03.o\n\t\t${CC} ${CFLAGS} -o $@ test03.o ${LIBS}\n\n# Bad version uses readline() from library.\ntest04b:\ttest04.o\n\t\t${CC} ${CFLAGS} -o $@ test04.o ${LIBS}\n\n# Good version uses readline.c in this directory.\ntest04g:\ttest04.o readline.o\n\t\t${CC} ${CFLAGS} -o $@ test04.o readline.o ${LIBS}\n\ntest05:\ttest05.o\n\t\t${CC} ${CFLAGS} -o $@ test05.o ${LIBS}\n\nexample01:\texample01.o\n\t\t${CC} ${CFLAGS} -o $@ example01.o ${LIBS}\n\nexample02:\texample02.o\n\t\t${CC} ${CFLAGS} -o $@ example02.o ${LIBS}\n\nexample03:\texample03.o\n\t\t${CC} ${CFLAGS} -o $@ example03.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "threads/doit.1",
    "content": "#!/bin/sh\n\ncase $# in\n1)\tbreak ;;\n*)\techo \"one argument (#simultaneous connections) required\" 1>&2\n\texit 1 ;;\nesac\n\ntime ./web03 $1 192.207.117.2 / \\\n\t/img/logo/awl_logo_blue_50x40.gif \\\n\t/img/a_world_of_learning.gif \\\n\t/img/toolbar_soptions.gif \\\n\t/img/toolbar_purchase.gif \\\n\t/img/toolbar_feedback.gif \\\n\t/img/toolbar_top_hilite.gif \\\n\t/img/toolbar_qsearch.gif \\\n\t/img/blue_dot.gif \\\n\t/img/logo/pearson_logo_50.gif\n"
  },
  {
    "path": "threads/doit.2",
    "content": "#!/bin/sh\n\nClientP=/nfs/kohala/home/rstevens/doc/unp/src/tcpcliserv/tcpcli01 # client prog\nServerH=\"206.62.226.33\"\t\t\t# server host\nInfile=/usr/share/misc/zipcodes\t\t# big BSD/OS text file\n\n$ClientP $ServerH < $Infile > temp.1 &\n$ClientP $ServerH < $Infile > temp.2 &\n$ClientP $ServerH < $Infile > temp.3 &\n# $ClientP $ServerH < $Infile > temp.4 &\n# $ClientP $ServerH < $Infile > temp.5 &\n# $ClientP $ServerH < $Infile > temp.6 &\n# $ClientP $ServerH < $Infile > temp.7 &\n# $ClientP $ServerH < $Infile > temp.8 &\n# $ClientP $ServerH < $Infile > temp.9 &\n\nwait\n"
  },
  {
    "path": "threads/example01.c",
    "content": "#include\t\"unpthread.h\"\n\n#define\tNLOOP 5000\n\nint\t\t\t\tcounter;\t\t/* incremented by threads */\n\nvoid\t*doit(void *);\n\nint\nmain(int argc, char **argv)\n{\n\tpthread_t\ttidA, tidB;\n\n\tPthread_create(&tidA, NULL, &doit, NULL);\n\tPthread_create(&tidB, NULL, &doit, NULL);\n\n\t\t/* 4wait for both threads to terminate */\n\tPthread_join(tidA, NULL);\n\tPthread_join(tidB, NULL);\n\n\texit(0);\n}\n\nvoid *\ndoit(void *vptr)\n{\n\tint\t\ti, val;\n\n\t/*\n\t * Each thread fetches, prints, and increments the counter NLOOP times.\n\t * The value of the counter should increase monotonically.\n\t */\n\n\tfor (i = 0; i < NLOOP; i++) {\n\t\tval = counter;\n\t\tprintf(\"%d: %d\\n\", pthread_self(), val + 1);\n\t\tcounter = val + 1;\n\t}\n\n\treturn(NULL);\n}\n"
  },
  {
    "path": "threads/example01.lc",
    "content": "#include    \"unpthread.h\"##  1 ##src/threads/example01.c##\n\n#define NLOOP 5000##  2 ##src/threads/example01.c##\n\nint     counter;                /* this is incremented by the threads */##  3 ##src/threads/example01.c##\n\nvoid   *doit(void *);##  4 ##src/threads/example01.c##\n\nint##  5 ##src/threads/example01.c##\nmain(int argc, char **argv)##  6 ##src/threads/example01.c##\n{##  7 ##src/threads/example01.c##\n    pthread_t tidA, tidB;##  8 ##src/threads/example01.c##\n\n    Pthread_create(&tidA, NULL, &doit, NULL);##  9 ##src/threads/example01.c##\n    Pthread_create(&tidB, NULL, &doit, NULL);## 10 ##src/threads/example01.c##\n\n    /* 4wait for both threads to terminate */## 11 ##src/threads/example01.c##\n    Pthread_join(tidA, NULL);## 12 ##src/threads/example01.c##\n    Pthread_join(tidB, NULL);## 13 ##src/threads/example01.c##\n\n    exit(0);## 14 ##src/threads/example01.c##\n}## 15 ##src/threads/example01.c##\n\nvoid   *## 16 ##src/threads/example01.c##\ndoit(void *vptr)## 17 ##src/threads/example01.c##\n{## 18 ##src/threads/example01.c##\n    int     i, val;## 19 ##src/threads/example01.c##\n\n    /* ## 20 ##src/threads/example01.c##\n     * Each thread fetches, prints, and increments the counter NLOOP times.## 21 ##src/threads/example01.c##\n     * The value of the counter should increase monotonically.## 22 ##src/threads/example01.c##\n     */## 23 ##src/threads/example01.c##\n\n    for (i = 0; i < NLOOP; i++) {## 24 ##src/threads/example01.c##\n        val = counter;## 25 ##src/threads/example01.c##\n        printf(\"%d: %d\\n\", pthread_self(), val + 1);## 26 ##src/threads/example01.c##\n        counter = val + 1;## 27 ##src/threads/example01.c##\n    }## 28 ##src/threads/example01.c##\n\n    return (NULL);## 29 ##src/threads/example01.c##\n}## 30 ##src/threads/example01.c##\n"
  },
  {
    "path": "threads/example02.c",
    "content": "#include\t\"unpthread.h\"\n\n#define\tNLOOP 5000\n\nint\t\t\t\tcounter;\t\t/* incremented by threads */\npthread_mutex_t\tcounter_mutex = PTHREAD_MUTEX_INITIALIZER;\n\nvoid\t*doit(void *);\n\nint\nmain(int argc, char **argv)\n{\n\tpthread_t\ttidA, tidB;\n\n\tPthread_create(&tidA, NULL, &doit, NULL);\n\tPthread_create(&tidB, NULL, &doit, NULL);\n\n\t\t/* 4wait for both threads to terminate */\n\tPthread_join(tidA, NULL);\n\tPthread_join(tidB, NULL);\n\n\texit(0);\n}\n\nvoid *\ndoit(void *vptr)\n{\n\tint\t\ti, val;\n\n\t/*\n\t * Each thread fetches, prints, and increments the counter NLOOP times.\n\t * The value of the counter should increase monotonically.\n\t */\n\n\tfor (i = 0; i < NLOOP; i++) {\n\t\tPthread_mutex_lock(&counter_mutex);\n\n\t\tval = counter;\n\t\tprintf(\"%d: %d\\n\", pthread_self(), val + 1);\n\t\tcounter = val + 1;\n\n\t\tPthread_mutex_unlock(&counter_mutex);\n\t}\n\n\treturn(NULL);\n}\n"
  },
  {
    "path": "threads/example02.lc",
    "content": "#include    \"unpthread.h\"##  1 ##src/threads/example02.c##\n\n#define NLOOP 5000##  2 ##src/threads/example02.c##\n\nint     counter;                /* this is incremented by the threads */##  3 ##src/threads/example02.c##\npthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;##  4 ##src/threads/example02.c##\n\nvoid   *doit(void *);##  5 ##src/threads/example02.c##\n\nint##  6 ##src/threads/example02.c##\nmain(int argc, char **argv)##  7 ##src/threads/example02.c##\n{##  8 ##src/threads/example02.c##\n    pthread_t tidA, tidB;##  9 ##src/threads/example02.c##\n\n    Pthread_create(&tidA, NULL, &doit, NULL);## 10 ##src/threads/example02.c##\n    Pthread_create(&tidB, NULL, &doit, NULL);## 11 ##src/threads/example02.c##\n\n    /* 4wait for both threads to terminate */## 12 ##src/threads/example02.c##\n    Pthread_join(tidA, NULL);## 13 ##src/threads/example02.c##\n    Pthread_join(tidB, NULL);## 14 ##src/threads/example02.c##\n\n    exit(0);## 15 ##src/threads/example02.c##\n}## 16 ##src/threads/example02.c##\n\nvoid   *## 17 ##src/threads/example02.c##\ndoit(void *vptr)## 18 ##src/threads/example02.c##\n{## 19 ##src/threads/example02.c##\n    int     i, val;## 20 ##src/threads/example02.c##\n\n    /* ## 21 ##src/threads/example02.c##\n     * Each thread fetches, prints, and increments the counter NLOOP times.## 22 ##src/threads/example02.c##\n     * The value of the counter should increase monotonically.## 23 ##src/threads/example02.c##\n     */## 24 ##src/threads/example02.c##\n\n    for (i = 0; i < NLOOP; i++) {## 25 ##src/threads/example02.c##\n        Pthread_mutex_lock(&counter_mutex);## 26 ##src/threads/example02.c##\n\n        val = counter;## 27 ##src/threads/example02.c##\n        printf(\"%d: %d\\n\", pthread_self(), val + 1);## 28 ##src/threads/example02.c##\n        counter = val + 1;## 29 ##src/threads/example02.c##\n\n        Pthread_mutex_unlock(&counter_mutex);## 30 ##src/threads/example02.c##\n    }## 31 ##src/threads/example02.c##\n\n    return (NULL);## 32 ##src/threads/example02.c##\n}## 33 ##src/threads/example02.c##\n"
  },
  {
    "path": "threads/example03.c",
    "content": "#include\t\"unpthread.h\"\n\n#define\tPthread_mutex_lock(mptr) \\\n\t{\tint  n; \\\n\t\tif ( (n = pthread_mutex_lock(mptr)) != 0) \\\n\t\t\t{ errno = n; err_sys(\"pthread_mutex_lock error\"); } \\\n\t}\n#define\tPthread_mutex_unlock(mptr) \\\n\t{\tint  n; \\\n\t\tif ( (n = pthread_mutex_unlock(mptr)) != 0) \\\n\t\t\t{ errno = n; err_sys(\"pthread_mutex_unlock error\"); } \\\n\t}\n#define\tPthread_cond_wait(cptr,mptr) \\\n\t{\tint  n; \\\n\t\tif ( (n = pthread_cond_wait(cptr,mptr)) != 0) \\\n\t\t\t{ errno = n; err_sys(\"pthread_cond_wait error\"); } \\\n\t}\n#define\tPthread_cond_signal(cptr) \\\n\t{\tint  n; \\\n\t\tif ( (n = pthread_cond_signal(cptr)) != 0) \\\n\t\t\t{ errno = n; err_sys(\"pthread_cond_signal error\"); } \\\n\t}\n\n#define\tNLOOP\t   \t 50\n#define\tBUFFSIZE\t 10\n\nstruct buf_t {\n  int\t\tb_buf[BUFFSIZE];\t/* the buffer which contains integer items */\n  int\t\tb_nitems;\t\t\t/* #items currently in buffer */\n  int\t\tb_nextget;\n  int\t\tb_nextput;\n  pthread_mutex_t\tb_mutex;\n  pthread_cond_t\tb_cond_consumer;\t/* consumer waiting to get */\n  pthread_cond_t\tb_cond_producer;\t/* producer waiting to put */\n} buf_t;\n\nvoid\t*produce_loop(void *);\nvoid\t*consume_loop(void *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\tn;\n\tpthread_t\ttidA, tidB;\n\n\tprintf(\"main, addr(stack) = %x, addr(global) = %x, addr(func) = %x\\n\",\n\t\t\t&n, &buf_t, &produce_loop);\n\tif ( (n = pthread_create(&tidA, NULL, &produce_loop, NULL)) != 0)\n\t\terrno = n, err_sys(\"pthread_create error for A\");\n\tif ( (n = pthread_create(&tidB, NULL, &consume_loop, NULL)) != 0)\n\t\terrno = n, err_sys(\"pthread_create error for B\");\n\n\t\t/* wait for both threads to terminate */\n\tif ( (n = pthread_join(tidA, NULL)) != 0)\n\t\terrno = n, err_sys(\"pthread_join error for A\");\n\tif ( (n = pthread_join(tidB, NULL)) != 0)\n\t\terrno = n, err_sys(\"pthread_join error for B\");\n\n\texit(0);\n}\n\nvoid\nproduce(struct buf_t *bptr, int val)\n{\n\tPthread_mutex_lock(&bptr->b_mutex);\n\t\t/* Wait if buffer is full */\n\twhile (bptr->b_nitems >= BUFFSIZE)\n\t\tPthread_cond_wait(&bptr->b_cond_producer, &bptr->b_mutex);\n\n\t\t/* There is room, store the new value */\n\tprintf(\"produce %d\\n\", val);\n\tbptr->b_buf[bptr->b_nextput] = val;\n\tif (++bptr->b_nextput >= BUFFSIZE)\n\t\tbptr->b_nextput = 0;\n\tbptr->b_nitems++;\n\n\t\t/* Signal consumer */\n\tPthread_cond_signal(&bptr->b_cond_consumer);\n\tPthread_mutex_unlock(&bptr->b_mutex);\n}\n\nint\nconsume(struct buf_t *bptr)\n{\n\tint\t\tval;\n\n\tPthread_mutex_lock(&bptr->b_mutex);\n\t\t/* Wait if buffer is empty */\n\twhile (bptr->b_nitems <= 0)\n\t\tPthread_cond_wait(&bptr->b_cond_consumer, &bptr->b_mutex);\n\n\t\t/* There is data, fetch the value */\n\tval = bptr->b_buf[bptr->b_nextget];\n\tprintf(\"consume %d\\n\", val);\n\tif (++bptr->b_nextget >= BUFFSIZE)\n\t\tbptr->b_nextget = 0;\n\tbptr->b_nitems--;\n\n\t\t/* Signal producer; it might be waiting for space to store */\n\tPthread_cond_signal(&bptr->b_cond_producer);\n\tPthread_mutex_unlock(&bptr->b_mutex);\n\n\treturn(val);\n}\n\nvoid *\nproduce_loop(void *vptr)\n{\n\tint\t\ti;\n\n\tprintf(\"produce_loop thread, addr(stack) = %x\\n\", &i);\n\tfor (i = 0; i < NLOOP; i++) {\n\t\tproduce(&buf_t, i);\n\t}\n\n\treturn(NULL);\n}\n\nvoid *\nconsume_loop(void *vptr)\n{\n\tint\t\ti, val;\n\n\tprintf(\"consume_loop thread, addr(stack) = %x\\n\", &i);\n\tfor (i = 0; i < NLOOP; i++) {\n\t\tval = consume(&buf_t);\n\t}\n\n\treturn(NULL);\n}\n"
  },
  {
    "path": "threads/readline.c",
    "content": "/* include readline1 */\n#include\t\"unpthread.h\"\n\nstatic pthread_key_t\trl_key;\nstatic pthread_once_t\trl_once = PTHREAD_ONCE_INIT;\n\nstatic void\nreadline_destructor(void *ptr)\n{\n\tfree(ptr);\n}\n\nstatic void\nreadline_once(void)\n{\n\tPthread_key_create(&rl_key, readline_destructor);\n}\n\ntypedef struct {\n  int\t rl_cnt;\t\t\t/* initialize to 0 */\n  char\t*rl_bufptr;\t\t\t/* initialize to rl_buf */\n  char\t rl_buf[MAXLINE];\n} Rline;\n/* end readline1 */\n\n/* include readline2 */\nstatic ssize_t\nmy_read(Rline *tsd, int fd, char *ptr)\n{\n\tif (tsd->rl_cnt <= 0) {\nagain:\n\t\tif ( (tsd->rl_cnt = read(fd, tsd->rl_buf, MAXLINE)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tgoto again;\n\t\t\treturn(-1);\n\t\t} else if (tsd->rl_cnt == 0)\n\t\t\treturn(0);\n\t\ttsd->rl_bufptr = tsd->rl_buf;\n\t}\n\n\ttsd->rl_cnt--;\n\t*ptr = *tsd->rl_bufptr++;\n\treturn(1);\n}\n\nssize_t\nreadline(int fd, void *vptr, size_t maxlen)\n{\n\tsize_t\t\tn, rc;\n\tchar\tc, *ptr;\n\tRline\t*tsd;\n\n\tPthread_once(&rl_once, readline_once);\n\tif ( (tsd = pthread_getspecific(rl_key)) == NULL) {\n\t\ttsd = Calloc(1, sizeof(Rline));\t\t/* init to 0 */\n\t\tPthread_setspecific(rl_key, tsd);\n\t}\n\n\tptr = vptr;\n\tfor (n = 1; n < maxlen; n++) {\n\t\tif ( (rc = my_read(tsd, fd, &c)) == 1) {\n\t\t\t*ptr++ = c;\n\t\t\tif (c == '\\n')\n\t\t\t\tbreak;\n\t\t} else if (rc == 0) {\n\t\t\t*ptr = 0;\n\t\t\treturn(n - 1);\t\t/* EOF, n - 1 bytes read */\n\t\t} else\n\t\t\treturn(-1);\t\t/* error, errno set by read() */\n\t}\n\n\t*ptr = 0;\n\treturn(n);\n}\n/* end readline2 */\n\nssize_t\nReadline(int fd, void *ptr, size_t maxlen)\n{\n\tssize_t\t\tn;\n\n\tif ( (n = readline(fd, ptr, maxlen)) < 0)\n\t\terr_sys(\"readline error\");\n\treturn(n);\n}\n"
  },
  {
    "path": "threads/readline.lc",
    "content": "/* include readline1 */\n#include    \"unpthread.h\"##  1 ##src/threads/readline.c##\n\nstatic pthread_key_t rl_key;##  2 ##src/threads/readline.c##\nstatic pthread_once_t rl_once = PTHREAD_ONCE_INIT;##  3 ##src/threads/readline.c##\n\nstatic void##  4 ##src/threads/readline.c##\nreadline_destructor(void *ptr)##  5 ##src/threads/readline.c##\n{##  6 ##src/threads/readline.c##\n    free(ptr);##  7 ##src/threads/readline.c##\n}##  8 ##src/threads/readline.c##\n\nstatic void##  9 ##src/threads/readline.c##\nreadline_once(void)## 10 ##src/threads/readline.c##\n{## 11 ##src/threads/readline.c##\n    Pthread_key_create(&rl_key, readline_destructor);## 12 ##src/threads/readline.c##\n}## 13 ##src/threads/readline.c##\n\ntypedef struct {## 14 ##src/threads/readline.c##\n    int     rl_cnt;             /* initialize to 0 */## 15 ##src/threads/readline.c##\n    char   *rl_bufptr;          /* initialize to rl_buf */## 16 ##src/threads/readline.c##\n    char    rl_buf[MAXLINE];## 17 ##src/threads/readline.c##\n} Rline;## 18 ##src/threads/readline.c##\n/* end readline1 */\n\n/* include readline2 */\nstatic ssize_t## 19 ##src/threads/readline.c##\nmy_read(Rline *tsd, int fd, char *ptr)## 20 ##src/threads/readline.c##\n{## 21 ##src/threads/readline.c##\n    if (tsd->rl_cnt <= 0) {## 22 ##src/threads/readline.c##\n      again:## 23 ##src/threads/readline.c##\n        if ((tsd->rl_cnt = read(fd, tsd->rl_buf, MAXLINE)) < 0) {## 24 ##src/threads/readline.c##\n            if (errno == EINTR)## 25 ##src/threads/readline.c##\n                goto again;## 26 ##src/threads/readline.c##\n            return (-1);## 27 ##src/threads/readline.c##\n        } else if (tsd->rl_cnt == 0)## 28 ##src/threads/readline.c##\n            return (0);## 29 ##src/threads/readline.c##\n        tsd->rl_bufptr = tsd->rl_buf;## 30 ##src/threads/readline.c##\n    }## 31 ##src/threads/readline.c##\n\n    tsd->rl_cnt--;## 32 ##src/threads/readline.c##\n    *ptr = *tsd->rl_bufptr++;## 33 ##src/threads/readline.c##\n    return (1);## 34 ##src/threads/readline.c##\n}## 35 ##src/threads/readline.c##\n\nssize_t## 36 ##src/threads/readline.c##\nreadline(int fd, void *vptr, size_t maxlen)## 37 ##src/threads/readline.c##\n{## 38 ##src/threads/readline.c##\n    int     n, rc;## 39 ##src/threads/readline.c##\n    char    c, *ptr;## 40 ##src/threads/readline.c##\n    Rline  *tsd;## 41 ##src/threads/readline.c##\n\n    Pthread_once(&rl_once, readline_once);## 42 ##src/threads/readline.c##\n    if ((tsd = pthread_getspecific(rl_key)) == NULL) {## 43 ##src/threads/readline.c##\n        tsd = Calloc(1, sizeof(Rline)); /* init to 0 */## 44 ##src/threads/readline.c##\n        Pthread_setspecific(rl_key, tsd);## 45 ##src/threads/readline.c##\n    }## 46 ##src/threads/readline.c##\n\n    ptr = vptr;## 47 ##src/threads/readline.c##\n    for (n = 1; n < maxlen; n++) {## 48 ##src/threads/readline.c##\n        if ((rc = my_read(tsd, fd, &c)) == 1) {## 49 ##src/threads/readline.c##\n            *ptr++ = c;## 50 ##src/threads/readline.c##\n            if (c == '\\n')## 51 ##src/threads/readline.c##\n                break;## 52 ##src/threads/readline.c##\n        } else if (rc == 0) {## 53 ##src/threads/readline.c##\n            if (n == 1)## 54 ##src/threads/readline.c##\n                return (0);     /* EOF, no data read */## 55 ##src/threads/readline.c##\n            else## 56 ##src/threads/readline.c##\n                break;          /* EOF, some data was read */## 57 ##src/threads/readline.c##\n        } else## 58 ##src/threads/readline.c##\n            return (-1);        /* error, errno set by read() */## 59 ##src/threads/readline.c##\n    }## 60 ##src/threads/readline.c##\n\n    *ptr = 0;## 61 ##src/threads/readline.c##\n    return (n);## 62 ##src/threads/readline.c##\n}## 63 ##src/threads/readline.c##\n/* end readline2 */\n\nssize_t## 64 ##src/threads/readline.c##\nReadline(int fd, void *ptr, size_t maxlen)## 65 ##src/threads/readline.c##\n{## 66 ##src/threads/readline.c##\n    ssize_t n;## 67 ##src/threads/readline.c##\n\n    if ((n = readline(fd, ptr, maxlen)) < 0)## 68 ##src/threads/readline.c##\n        err_sys(\"readline error\");## 69 ##src/threads/readline.c##\n    return (n);## 70 ##src/threads/readline.c##\n}## 71 ##src/threads/readline.c##\n"
  },
  {
    "path": "threads/script.example01",
    "content": "4: 1\n4: 2\n4: 3\n4: 4\n4: 5\n4: 6\n4: 7\n4: 8\n4: 9\n4: 10\n4: 11\n4: 12\n4: 13\n4: 14\n4: 15\n4: 16\n4: 17\n4: 18\n4: 19\n4: 20\n4: 21\n4: 22\n4: 23\n4: 24\n4: 25\n4: 26\n4: 27\n4: 28\n4: 29\n4: 30\n4: 31\n4: 32\n4: 33\n4: 34\n4: 35\n4: 36\n4: 37\n4: 38\n4: 39\n4: 40\n4: 41\n4: 42\n4: 43\n4: 44\n4: 45\n4: 46\n4: 47\n4: 48\n4: 49\n4: 50\n4: 51\n4: 52\n4: 53\n4: 54\n4: 55\n4: 56\n4: 57\n4: 58\n4: 59\n4: 60\n4: 61\n4: 62\n4: 63\n4: 64\n4: 65\n4: 66\n4: 67\n4: 68\n4: 69\n4: 70\n4: 71\n4: 72\n4: 73\n4: 74\n4: 75\n4: 76\n4: 77\n4: 78\n4: 79\n4: 80\n4: 81\n4: 82\n4: 83\n4: 84\n4: 85\n4: 86\n4: 87\n4: 88\n4: 89\n4: 90\n4: 91\n4: 92\n4: 93\n4: 94\n4: 95\n4: 96\n4: 97\n4: 98\n4: 99\n4: 100\n4: 101\n4: 102\n4: 103\n4: 104\n4: 105\n4: 106\n4: 107\n4: 108\n4: 109\n4: 110\n4: 111\n4: 112\n4: 113\n4: 114\n4: 115\n4: 116\n4: 117\n4: 118\n4: 119\n4: 120\n4: 121\n4: 122\n4: 123\n4: 124\n4: 125\n4: 126\n4: 127\n4: 128\n4: 129\n4: 130\n4: 131\n4: 132\n4: 133\n4: 134\n4: 135\n4: 136\n4: 137\n4: 138\n4: 139\n4: 140\n4: 141\n4: 142\n4: 143\n4: 144\n4: 145\n4: 146\n4: 147\n4: 148\n4: 149\n4: 150\n4: 151\n4: 152\n4: 153\n4: 154\n4: 155\n4: 156\n4: 157\n4: 158\n4: 159\n4: 160\n4: 161\n4: 162\n4: 163\n4: 164\n4: 165\n4: 166\n4: 167\n4: 168\n4: 169\n4: 170\n4: 171\n4: 172\n4: 173\n4: 174\n4: 175\n4: 176\n4: 177\n4: 178\n4: 179\n4: 180\n4: 181\n4: 182\n4: 183\n4: 184\n4: 185\n4: 186\n4: 187\n4: 188\n4: 189\n4: 190\n4: 191\n4: 192\n4: 193\n4: 194\n4: 195\n4: 196\n4: 197\n4: 198\n4: 199\n4: 200\n4: 201\n4: 202\n4: 203\n4: 204\n4: 205\n4: 206\n4: 207\n4: 208\n4: 209\n4: 210\n4: 211\n4: 212\n4: 213\n4: 214\n4: 215\n4: 216\n4: 217\n4: 218\n4: 219\n4: 220\n4: 221\n4: 222\n4: 223\n4: 224\n4: 225\n4: 226\n4: 227\n4: 228\n4: 229\n4: 230\n4: 231\n4: 232\n4: 233\n4: 234\n4: 235\n4: 236\n4: 237\n4: 238\n4: 239\n4: 240\n4: 241\n4: 242\n4: 243\n4: 244\n4: 245\n4: 246\n4: 247\n4: 248\n4: 249\n4: 250\n4: 251\n4: 252\n4: 253\n4: 254\n4: 255\n4: 256\n4: 257\n4: 258\n4: 259\n4: 260\n4: 261\n4: 262\n4: 263\n4: 264\n4: 265\n4: 266\n4: 267\n4: 268\n4: 269\n4: 270\n4: 271\n4: 272\n4: 273\n4: 274\n4: 275\n4: 276\n4: 277\n4: 278\n4: 279\n4: 280\n4: 281\n4: 282\n4: 283\n4: 284\n4: 285\n4: 286\n4: 287\n4: 288\n4: 289\n4: 290\n4: 291\n4: 292\n4: 293\n4: 294\n4: 295\n4: 296\n4: 297\n4: 298\n4: 299\n4: 300\n4: 301\n4: 302\n4: 303\n4: 304\n4: 305\n4: 306\n4: 307\n4: 308\n4: 309\n4: 310\n4: 311\n4: 312\n4: 313\n4: 314\n4: 315\n4: 316\n4: 317\n4: 318\n4: 319\n4: 320\n4: 321\n4: 322\n4: 323\n4: 324\n4: 325\n4: 326\n4: 327\n4: 328\n4: 329\n4: 330\n4: 331\n4: 332\n4: 333\n4: 334\n4: 335\n4: 336\n4: 337\n4: 338\n4: 339\n4: 340\n4: 341\n4: 342\n4: 343\n4: 344\n4: 345\n4: 346\n4: 347\n4: 348\n4: 349\n4: 350\n4: 351\n4: 352\n4: 353\n4: 354\n4: 355\n4: 356\n4: 357\n4: 358\n4: 359\n4: 360\n4: 361\n4: 362\n4: 363\n4: 364\n4: 365\n4: 366\n4: 367\n4: 368\n4: 369\n4: 370\n4: 371\n4: 372\n4: 373\n4: 374\n4: 375\n4: 376\n4: 377\n4: 378\n4: 379\n4: 380\n4: 381\n4: 382\n4: 383\n4: 384\n4: 385\n4: 386\n4: 387\n4: 388\n4: 389\n4: 390\n4: 391\n4: 392\n4: 393\n4: 394\n4: 395\n4: 396\n4: 397\n4: 398\n4: 399\n4: 400\n4: 401\n4: 402\n4: 403\n4: 404\n4: 405\n4: 406\n4: 407\n4: 408\n4: 409\n4: 410\n4: 411\n4: 412\n4: 413\n4: 414\n4: 415\n4: 416\n4: 417\n4: 418\n4: 419\n4: 420\n4: 421\n4: 422\n4: 423\n4: 424\n4: 425\n4: 426\n4: 427\n4: 428\n4: 429\n4: 430\n4: 431\n4: 432\n4: 433\n4: 434\n4: 435\n4: 436\n4: 437\n4: 438\n4: 439\n4: 440\n4: 441\n4: 442\n4: 443\n4: 444\n4: 445\n4: 446\n4: 447\n4: 448\n4: 449\n4: 450\n4: 451\n4: 452\n4: 453\n4: 454\n4: 455\n4: 456\n4: 457\n4: 458\n4: 459\n4: 460\n4: 461\n4: 462\n4: 463\n4: 464\n4: 465\n4: 466\n4: 467\n4: 468\n4: 469\n4: 470\n4: 471\n4: 472\n4: 473\n4: 474\n4: 475\n4: 476\n4: 477\n4: 478\n4: 479\n4: 480\n4: 481\n4: 482\n4: 483\n4: 484\n4: 485\n4: 486\n4: 487\n4: 488\n4: 489\n4: 490\n4: 491\n4: 492\n4: 493\n4: 494\n4: 495\n4: 496\n4: 497\n4: 498\n4: 499\n4: 500\n4: 501\n4: 502\n4: 503\n4: 504\n4: 505\n4: 506\n4: 507\n4: 508\n4: 509\n4: 510\n4: 511\n4: 512\n4: 513\n4: 514\n4: 515\n4: 516\n4: 517\n4: 518\n5: 518\n5: 519\n5: 520\n5: 521\n5: 522\n5: 523\n5: 524\n5: 525\n5: 526\n5: 527\n5: 528\n5: 529\n5: 530\n5: 531\n5: 532\n5: 533\n5: 534\n5: 535\n5: 536\n5: 537\n5: 538\n5: 539\n5: 540\n5: 541\n5: 542\n5: 543\n5: 544\n5: 545\n5: 546\n5: 547\n5: 548\n5: 549\n5: 550\n5: 551\n5: 552\n5: 553\n5: 554\n5: 555\n5: 556\n5: 557\n5: 558\n5: 559\n5: 560\n5: 561\n5: 562\n5: 563\n5: 564\n5: 565\n5: 566\n5: 567\n5: 568\n5: 569\n5: 570\n5: 571\n5: 572\n5: 573\n5: 574\n5: 575\n5: 576\n5: 577\n5: 578\n5: 579\n5: 580\n5: 581\n5: 582\n5: 583\n5: 584\n5: 585\n5: 586\n5: 587\n5: 588\n5: 589\n5: 590\n5: 591\n5: 592\n5: 593\n5: 594\n5: 595\n5: 596\n5: 597\n5: 598\n5: 599\n5: 600\n5: 601\n5: 602\n5: 603\n5: 604\n5: 605\n5: 606\n5: 607\n5: 608\n5: 609\n5: 610\n5: 611\n5: 612\n5: 613\n5: 614\n5: 615\n5: 616\n5: 617\n5: 618\n5: 619\n5: 620\n5: 621\n5: 622\n5: 623\n5: 624\n5: 625\n5: 626\n5: 627\n5: 628\n5: 629\n5: 630\n5: 631\n5: 632\n5: 633\n5: 634\n5: 635\n5: 636\n5: 637\n5: 638\n5: 639\n5: 640\n5: 641\n5: 642\n5: 643\n5: 644\n5: 645\n5: 646\n5: 647\n5: 648\n5: 649\n5: 650\n5: 651\n5: 652\n5: 653\n5: 654\n5: 655\n5: 656\n5: 657\n5: 658\n5: 659\n5: 660\n5: 661\n5: 662\n5: 663\n5: 664\n5: 665\n5: 666\n5: 667\n5: 668\n5: 669\n5: 670\n5: 671\n5: 672\n5: 673\n5: 674\n5: 675\n5: 676\n5: 677\n5: 678\n5: 679\n5: 680\n5: 681\n5: 682\n5: 683\n5: 684\n5: 685\n5: 686\n5: 687\n5: 688\n5: 689\n5: 690\n5: 691\n5: 692\n5: 693\n5: 694\n5: 695\n5: 696\n5: 697\n5: 698\n5: 699\n5: 700\n5: 701\n5: 702\n5: 703\n5: 704\n5: 705\n5: 706\n5: 707\n5: 708\n5: 709\n5: 710\n5: 711\n5: 712\n5: 713\n5: 714\n5: 715\n5: 716\n5: 717\n5: 718\n5: 719\n5: 720\n5: 721\n5: 722\n5: 723\n5: 724\n5: 725\n5: 726\n5: 727\n5: 728\n5: 729\n5: 730\n5: 731\n5: 732\n5: 733\n5: 734\n5: 735\n5: 736\n5: 737\n5: 738\n5: 739\n5: 740\n5: 741\n5: 742\n5: 743\n5: 744\n5: 745\n5: 746\n5: 747\n5: 748\n5: 749\n5: 750\n5: 751\n5: 752\n5: 753\n5: 754\n5: 755\n5: 756\n5: 757\n5: 758\n5: 759\n5: 760\n5: 761\n5: 762\n5: 763\n5: 764\n5: 765\n5: 766\n5: 767\n5: 768\n5: 769\n5: 770\n5: 771\n5: 772\n5: 773\n5: 774\n5: 775\n5: 776\n5: 777\n5: 778\n5: 779\n5: 780\n5: 781\n5: 782\n5: 783\n5: 784\n5: 785\n5: 786\n5: 787\n5: 788\n5: 789\n5: 790\n5: 791\n5: 792\n5: 793\n5: 794\n5: 795\n5: 796\n5: 797\n5: 798\n5: 799\n5: 800\n5: 801\n5: 802\n5: 803\n5: 804\n5: 805\n5: 806\n5: 807\n5: 808\n5: 809\n5: 810\n5: 811\n5: 812\n5: 813\n5: 814\n5: 815\n5: 816\n5: 817\n5: 818\n5: 819\n5: 820\n5: 821\n5: 822\n5: 823\n5: 824\n5: 825\n5: 826\n5: 827\n5: 828\n5: 829\n5: 830\n5: 831\n5: 832\n5: 833\n5: 834\n5: 835\n5: 836\n5: 837\n5: 838\n5: 839\n5: 840\n5: 841\n5: 842\n5: 843\n5: 844\n5: 845\n5: 846\n5: 847\n5: 848\n5: 849\n5: 850\n5: 851\n5: 852\n5: 853\n5: 854\n5: 855\n5: 856\n5: 857\n5: 858\n5: 859\n5: 860\n5: 861\n5: 862\n5: 863\n5: 864\n5: 865\n5: 866\n5: 867\n5: 868\n5: 869\n5: 870\n5: 871\n5: 872\n5: 873\n5: 874\n5: 875\n5: 876\n5: 877\n5: 878\n5: 879\n5: 880\n5: 881\n5: 882\n5: 883\n5: 884\n5: 885\n5: 886\n5: 887\n5: 888\n5: 889\n5: 890\n5: 891\n5: 892\n5: 893\n5: 894\n5: 895\n5: 896\n5: 897\n5: 898\n5: 899\n5: 900\n5: 901\n5: 902\n5: 903\n5: 904\n5: 905\n5: 906\n5: 907\n5: 908\n5: 909\n5: 910\n5: 911\n5: 912\n5: 913\n5: 914\n5: 915\n5: 916\n5: 917\n5: 918\n5: 919\n5: 920\n5: 921\n5: 922\n5: 923\n5: 924\n5: 925\n5: 926\n5: 927\n4: 519\n4: 520\n4: 521\n4: 522\n4: 523\n4: 524\n4: 525\n4: 526\n4: 527\n4: 528\n4: 529\n4: 530\n4: 531\n4: 532\n4: 533\n4: 534\n4: 535\n4: 536\n4: 537\n4: 538\n4: 539\n4: 540\n4: 541\n4: 542\n4: 543\n4: 544\n4: 545\n4: 546\n4: 547\n4: 548\n4: 549\n4: 550\n4: 551\n4: 552\n4: 553\n4: 554\n4: 555\n4: 556\n4: 557\n4: 558\n4: 559\n4: 560\n4: 561\n4: 562\n4: 563\n4: 564\n4: 565\n4: 566\n4: 567\n4: 568\n4: 569\n4: 570\n4: 571\n4: 572\n4: 573\n4: 574\n4: 575\n4: 576\n4: 577\n4: 578\n4: 579\n4: 580\n4: 581\n4: 582\n4: 583\n4: 584\n4: 585\n4: 586\n4: 587\n4: 588\n4: 589\n4: 590\n4: 591\n4: 592\n4: 593\n4: 594\n4: 595\n4: 596\n4: 597\n4: 598\n4: 599\n4: 600\n4: 601\n4: 602\n4: 603\n4: 604\n4: 605\n4: 606\n4: 607\n4: 608\n4: 609\n4: 610\n4: 611\n4: 612\n4: 613\n4: 614\n4: 615\n4: 616\n4: 617\n4: 618\n4: 619\n4: 620\n4: 621\n4: 622\n4: 623\n4: 624\n4: 625\n4: 626\n4: 627\n4: 628\n4: 629\n4: 630\n4: 631\n4: 632\n4: 633\n4: 634\n4: 635\n4: 636\n4: 637\n4: 638\n4: 639\n4: 640\n4: 641\n4: 642\n4: 643\n4: 644\n4: 645\n4: 646\n4: 647\n4: 648\n4: 649\n4: 650\n4: 651\n4: 652\n4: 653\n4: 654\n4: 655\n4: 656\n4: 657\n4: 658\n4: 659\n4: 660\n4: 661\n4: 662\n4: 663\n4: 664\n4: 665\n4: 666\n4: 667\n4: 668\n4: 669\n4: 670\n4: 671\n4: 672\n4: 673\n4: 674\n5: 928\n5: 929\n5: 930\n5: 931\n5: 932\n5: 933\n5: 934\n5: 935\n5: 936\n5: 937\n5: 938\n5: 939\n5: 940\n5: 941\n5: 942\n5: 943\n5: 944\n5: 945\n5: 946\n5: 947\n5: 948\n5: 949\n5: 950\n5: 951\n5: 952\n5: 953\n5: 954\n5: 955\n5: 956\n5: 957\n5: 958\n5: 959\n5: 960\n5: 961\n5: 962\n5: 963\n5: 964\n5: 965\n5: 966\n5: 967\n5: 968\n5: 969\n5: 970\n5: 971\n5: 972\n5: 973\n5: 974\n5: 975\n5: 976\n5: 977\n5: 978\n5: 979\n5: 980\n5: 981\n5: 982\n5: 983\n5: 984\n5: 985\n5: 986\n5: 987\n5: 988\n5: 989\n5: 990\n5: 991\n5: 992\n5: 993\n5: 994\n5: 995\n5: 996\n5: 997\n5: 998\n5: 999\n5: 1000\n5: 1001\n5: 1002\n5: 1003\n5: 1004\n5: 1005\n5: 1006\n5: 1007\n5: 1008\n5: 1009\n5: 1010\n5: 1011\n5: 1012\n5: 1013\n5: 1014\n5: 1015\n5: 1016\n5: 1017\n5: 1018\n5: 1019\n5: 1020\n5: 1021\n5: 1022\n5: 1023\n5: 1024\n5: 1025\n5: 1026\n5: 1027\n5: 1028\n5: 1029\n5: 1030\n5: 1031\n5: 1032\n5: 1033\n5: 1034\n5: 1035\n5: 1036\n5: 1037\n5: 1038\n5: 1039\n5: 1040\n5: 1041\n5: 1042\n5: 1043\n5: 1044\n5: 1045\n5: 1046\n5: 1047\n5: 1048\n5: 1049\n5: 1050\n5: 1051\n5: 1052\n5: 1053\n5: 1054\n5: 1055\n5: 1056\n5: 1057\n5: 1058\n5: 1059\n5: 1060\n5: 1061\n5: 1062\n5: 1063\n5: 1064\n5: 1065\n5: 1066\n5: 1067\n5: 1068\n5: 1069\n5: 1070\n5: 1071\n5: 1072\n5: 1073\n5: 1074\n5: 1075\n5: 1076\n5: 1077\n5: 1078\n5: 1079\n5: 1080\n5: 1081\n5: 1082\n5: 1083\n5: 1084\n5: 1085\n5: 1086\n5: 1087\n5: 1088\n5: 1089\n5: 1090\n5: 1091\n5: 1092\n5: 1093\n5: 1094\n5: 1095\n4: 675\n4: 676\n4: 677\n4: 678\n4: 679\n4: 680\n4: 681\n4: 682\n4: 683\n4: 684\n4: 685\n4: 686\n4: 687\n4: 688\n4: 689\n4: 690\n4: 691\n4: 692\n4: 693\n4: 694\n4: 695\n4: 696\n4: 697\n4: 698\n4: 699\n4: 700\n4: 701\n4: 702\n4: 703\n4: 704\n4: 705\n4: 706\n4: 707\n4: 708\n4: 709\n4: 710\n4: 711\n4: 712\n4: 713\n4: 714\n4: 715\n4: 716\n4: 717\n4: 718\n4: 719\n4: 720\n4: 721\n4: 722\n4: 723\n4: 724\n4: 725\n4: 726\n4: 727\n4: 728\n4: 729\n4: 730\n4: 731\n4: 732\n4: 733\n4: 734\n4: 735\n4: 736\n4: 737\n4: 738\n4: 739\n4: 740\n4: 741\n4: 742\n4: 743\n4: 744\n4: 745\n4: 746\n4: 747\n4: 748\n4: 749\n4: 750\n4: 751\n4: 752\n4: 753\n4: 754\n4: 755\n4: 756\n4: 757\n4: 758\n4: 759\n4: 760\n4: 761\n4: 762\n4: 763\n4: 764\n4: 765\n4: 766\n4: 767\n4: 768\n4: 769\n4: 770\n4: 771\n4: 772\n4: 773\n4: 774\n4: 775\n4: 776\n4: 777\n5: 1096\n5: 1097\n5: 1098\n5: 1099\n5: 1100\n5: 1101\n5: 1102\n5: 1103\n5: 1104\n5: 1105\n5: 1106\n5: 1107\n5: 1108\n5: 1109\n5: 1110\n5: 1111\n5: 1112\n5: 1113\n5: 1114\n5: 1115\n5: 1116\n5: 1117\n5: 1118\n5: 1119\n5: 1120\n5: 1121\n5: 1122\n5: 1123\n5: 1124\n5: 1125\n5: 1126\n5: 1127\n5: 1128\n5: 1129\n5: 1130\n5: 1131\n5: 1132\n5: 1133\n5: 1134\n5: 1135\n5: 1136\n5: 1137\n5: 1138\n5: 1139\n5: 1140\n5: 1141\n5: 1142\n5: 1143\n5: 1144\n5: 1145\n5: 1146\n5: 1147\n5: 1148\n5: 1149\n5: 1150\n5: 1151\n5: 1152\n5: 1153\n5: 1154\n5: 1155\n5: 1156\n5: 1157\n5: 1158\n5: 1159\n5: 1160\n5: 1161\n5: 1162\n5: 1163\n5: 1164\n5: 1165\n5: 1166\n5: 1167\n5: 1168\n5: 1169\n5: 1170\n5: 1171\n5: 1172\n5: 1173\n5: 1174\n5: 1175\n5: 1176\n5: 1177\n5: 1178\n5: 1179\n5: 1180\n5: 1181\n5: 1182\n5: 1183\n5: 1184\n5: 1185\n5: 1186\n5: 1187\n5: 1188\n5: 1189\n5: 1190\n5: 1191\n5: 1192\n5: 1193\n5: 1194\n5: 1195\n5: 1196\n5: 1197\n5: 1198\n5: 1199\n5: 1200\n5: 1201\n5: 1202\n5: 1203\n5: 1204\n5: 1205\n5: 1206\n5: 1207\n5: 1208\n5: 1209\n5: 1210\n5: 1211\n5: 1212\n5: 1213\n5: 1214\n5: 1215\n5: 1216\n5: 1217\n5: 1218\n5: 1219\n5: 1220\n5: 1221\n5: 1222\n5: 1223\n5: 1224\n5: 1225\n5: 1226\n5: 1227\n5: 1228\n5: 1229\n5: 1230\n5: 1231\n5: 1232\n5: 1233\n5: 1234\n5: 1235\n5: 1236\n5: 1237\n5: 1238\n5: 1239\n5: 1240\n5: 1241\n5: 1242\n5: 1243\n5: 1244\n5: 1245\n5: 1246\n5: 1247\n5: 1248\n5: 1249\n5: 1250\n5: 1251\n5: 1252\n5: 1253\n5: 1254\n5: 1255\n5: 1256\n5: 1257\n5: 1258\n5: 1259\n5: 1260\n5: 1261\n5: 1262\n5: 1263\n5: 1264\n5: 1265\n5: 1266\n5: 1267\n5: 1268\n5: 1269\n5: 1270\n5: 1271\n5: 1272\n5: 1273\n5: 1274\n5: 1275\n5: 1276\n5: 1277\n5: 1278\n5: 1279\n5: 1280\n5: 1281\n5: 1282\n5: 1283\n5: 1284\n5: 1285\n5: 1286\n5: 1287\n5: 1288\n5: 1289\n5: 1290\n5: 1291\n5: 1292\n5: 1293\n5: 1294\n5: 1295\n5: 1296\n5: 1297\n5: 1298\n5: 1299\n5: 1300\n5: 1301\n5: 1302\n5: 1303\n5: 1304\n5: 1305\n5: 1306\n5: 1307\n5: 1308\n5: 1309\n5: 1310\n5: 1311\n5: 1312\n5: 1313\n5: 1314\n5: 1315\n5: 1316\n5: 1317\n5: 1318\n5: 1319\n5: 1320\n5: 1321\n5: 1322\n5: 1323\n5: 1324\n5: 1325\n5: 1326\n5: 1327\n5: 1328\n5: 1329\n5: 1330\n5: 1331\n5: 1332\n5: 1333\n5: 1334\n5: 1335\n5: 1336\n5: 1337\n5: 1338\n4: 778\n4: 779\n4: 780\n4: 781\n4: 782\n4: 783\n4: 784\n4: 785\n4: 786\n4: 787\n4: 788\n4: 789\n4: 790\n4: 791\n4: 792\n4: 793\n4: 794\n4: 795\n4: 796\n4: 797\n4: 798\n4: 799\n4: 800\n4: 801\n4: 802\n4: 803\n4: 804\n4: 805\n4: 806\n4: 807\n4: 808\n4: 809\n4: 810\n4: 811\n4: 812\n4: 813\n4: 814\n4: 815\n4: 816\n4: 817\n4: 818\n4: 819\n4: 820\n4: 821\n4: 822\n4: 823\n4: 824\n4: 825\n4: 826\n4: 827\n4: 828\n4: 829\n4: 830\n4: 831\n4: 832\n4: 833\n4: 834\n4: 835\n4: 836\n4: 837\n4: 838\n4: 839\n4: 840\n4: 841\n4: 842\n4: 843\n4: 844\n4: 845\n4: 846\n4: 847\n4: 848\n4: 849\n4: 850\n4: 851\n4: 852\n4: 853\n4: 854\n4: 855\n4: 856\n4: 857\n4: 858\n4: 859\n4: 860\n4: 861\n4: 862\n4: 863\n4: 864\n4: 865\n4: 866\n4: 867\n4: 868\n4: 869\n4: 870\n4: 871\n4: 872\n4: 873\n4: 874\n4: 875\n4: 876\n4: 877\n4: 878\n4: 879\n4: 880\n4: 881\n4: 882\n4: 883\n4: 884\n4: 885\n4: 886\n4: 887\n4: 888\n4: 889\n4: 890\n4: 891\n4: 892\n4: 893\n4: 894\n4: 895\n4: 896\n4: 897\n4: 898\n4: 899\n4: 900\n4: 901\n4: 902\n4: 903\n4: 904\n4: 905\n4: 906\n4: 907\n4: 908\n4: 909\n4: 910\n4: 911\n4: 912\n4: 913\n4: 914\n4: 915\n4: 916\n4: 917\n4: 918\n4: 919\n4: 920\n4: 921\n4: 922\n4: 923\n4: 924\n4: 925\n4: 926\n4: 927\n4: 928\n4: 929\n4: 930\n4: 931\n4: 932\n4: 933\n4: 934\n4: 935\n4: 936\n4: 937\n4: 938\n4: 939\n4: 940\n4: 941\n4: 942\n4: 943\n4: 944\n4: 945\n4: 946\n4: 947\n4: 948\n4: 949\n4: 950\n4: 951\n4: 952\n4: 953\n4: 954\n4: 955\n4: 956\n4: 957\n4: 958\n4: 959\n4: 960\n4: 961\n4: 962\n4: 963\n4: 964\n4: 965\n4: 966\n4: 967\n4: 968\n4: 969\n4: 970\n4: 971\n4: 972\n4: 973\n4: 974\n4: 975\n4: 976\n4: 977\n4: 978\n4: 979\n4: 980\n4: 981\n4: 982\n4: 983\n4: 984\n4: 985\n4: 986\n4: 987\n4: 988\n4: 989\n4: 990\n4: 991\n4: 992\n4: 993\n4: 994\n4: 995\n4: 996\n4: 997\n4: 998\n4: 999\n4: 1000\n4: 1001\n4: 1002\n4: 1003\n4: 1004\n4: 1005\n4: 1006\n4: 1007\n4: 1008\n4: 1009\n4: 1010\n4: 1011\n4: 1012\n4: 1013\n4: 1014\n4: 1015\n4: 1016\n4: 1017\n4: 1018\n4: 1019\n4: 1020\n4: 1021\n4: 1022\n4: 1023\n4: 1024\n4: 1025\n4: 1026\n4: 1027\n4: 1028\n4: 1029\n4: 1030\n4: 1031\n4: 1032\n4: 1033\n4: 1034\n4: 1035\n4: 1036\n4: 1037\n4: 1038\n4: 1039\n4: 1040\n4: 1041\n4: 1042\n4: 1043\n4: 1044\n4: 1045\n4: 1046\n4: 1047\n4: 1048\n4: 1049\n4: 1050\n4: 1051\n4: 1052\n4: 1053\n4: 1054\n4: 1055\n4: 1056\n4: 1057\n4: 1058\n4: 1059\n4: 1060\n4: 1061\n4: 1062\n4: 1063\n4: 1064\n4: 1065\n4: 1066\n4: 1067\n4: 1068\n4: 1069\n4: 1070\n4: 1071\n4: 1072\n4: 1073\n4: 1074\n4: 1075\n4: 1076\n4: 1077\n4: 1078\n4: 1079\n4: 1080\n4: 1081\n4: 1082\n4: 1083\n4: 1084\n4: 1085\n4: 1086\n4: 1087\n4: 1088\n4: 1089\n4: 1090\n4: 1091\n4: 1092\n4: 1093\n4: 1094\n4: 1095\n4: 1096\n4: 1097\n4: 1098\n4: 1099\n4: 1100\n4: 1101\n4: 1102\n4: 1103\n4: 1104\n4: 1105\n4: 1106\n4: 1107\n4: 1108\n4: 1109\n4: 1110\n4: 1111\n5: 1339\n5: 1340\n5: 1341\n5: 1342\n5: 1343\n5: 1344\n5: 1345\n5: 1346\n5: 1347\n5: 1348\n5: 1349\n5: 1350\n5: 1351\n5: 1352\n5: 1353\n5: 1354\n5: 1355\n5: 1356\n5: 1357\n5: 1358\n5: 1359\n5: 1360\n5: 1361\n5: 1362\n5: 1363\n5: 1364\n5: 1365\n5: 1366\n5: 1367\n5: 1368\n5: 1369\n5: 1370\n5: 1371\n5: 1372\n5: 1373\n5: 1374\n5: 1375\n5: 1376\n5: 1377\n5: 1378\n5: 1379\n5: 1380\n5: 1381\n5: 1382\n5: 1383\n5: 1384\n5: 1385\n5: 1386\n5: 1387\n5: 1388\n5: 1389\n5: 1390\n5: 1391\n5: 1392\n5: 1393\n5: 1394\n5: 1395\n5: 1396\n5: 1397\n5: 1398\n5: 1399\n5: 1400\n5: 1401\n5: 1402\n5: 1403\n5: 1404\n5: 1405\n5: 1406\n5: 1407\n5: 1408\n5: 1409\n5: 1410\n5: 1411\n5: 1412\n5: 1413\n5: 1414\n5: 1415\n5: 1416\n5: 1417\n5: 1418\n5: 1419\n5: 1420\n5: 1421\n5: 1422\n5: 1423\n5: 1424\n5: 1425\n5: 1426\n5: 1427\n5: 1428\n5: 1429\n5: 1430\n5: 1431\n5: 1432\n5: 1433\n5: 1434\n5: 1435\n5: 1436\n5: 1437\n5: 1438\n5: 1439\n5: 1440\n5: 1441\n5: 1442\n5: 1443\n5: 1444\n5: 1445\n5: 1446\n5: 1447\n5: 1448\n5: 1449\n5: 1450\n5: 1451\n5: 1452\n5: 1453\n5: 1454\n5: 1455\n5: 1456\n5: 1457\n5: 1458\n5: 1459\n5: 1460\n5: 1461\n5: 1462\n5: 1463\n5: 1464\n5: 1465\n5: 1466\n5: 1467\n5: 1468\n5: 1469\n5: 1470\n5: 1471\n5: 1472\n5: 1473\n5: 1474\n5: 1475\n5: 1476\n5: 1477\n5: 1478\n5: 1479\n5: 1480\n5: 1481\n5: 1482\n5: 1483\n5: 1484\n5: 1485\n5: 1486\n5: 1487\n5: 1488\n5: 1489\n5: 1490\n5: 1491\n5: 1492\n5: 1493\n5: 1494\n5: 1495\n5: 1496\n5: 1497\n5: 1498\n5: 1499\n5: 1500\n5: 1501\n5: 1502\n5: 1503\n5: 1504\n5: 1505\n5: 1506\n5: 1507\n5: 1508\n5: 1509\n5: 1510\n5: 1511\n5: 1512\n5: 1513\n5: 1514\n5: 1515\n5: 1516\n5: 1517\n5: 1518\n5: 1519\n5: 1520\n5: 1521\n5: 1522\n5: 1523\n5: 1524\n5: 1525\n5: 1526\n5: 1527\n5: 1528\n5: 1529\n5: 1530\n5: 1531\n5: 1532\n5: 1533\n5: 1534\n5: 1535\n5: 1536\n5: 1537\n5: 1538\n5: 1539\n5: 1540\n5: 1541\n5: 1542\n5: 1543\n5: 1544\n5: 1545\n5: 1546\n5: 1547\n5: 1548\n5: 1549\n5: 1550\n5: 1551\n5: 1552\n5: 1553\n5: 1554\n5: 1555\n5: 1556\n5: 1557\n5: 1558\n5: 1559\n5: 1560\n5: 1561\n5: 1562\n5: 1563\n5: 1564\n5: 1565\n5: 1566\n5: 1567\n5: 1568\n5: 1569\n5: 1570\n5: 1571\n5: 1572\n5: 1573\n5: 1574\n5: 1575\n5: 1576\n5: 1577\n5: 1578\n5: 1579\n5: 1580\n5: 1581\n5: 1582\n5: 1583\n5: 1584\n5: 1585\n5: 1586\n5: 1587\n5: 1588\n5: 1589\n5: 1590\n5: 1591\n5: 1592\n5: 1593\n5: 1594\n5: 1595\n5: 1596\n5: 1597\n5: 1598\n5: 1599\n5: 1600\n5: 1601\n5: 1602\n5: 1603\n5: 1604\n5: 1605\n5: 1606\n5: 1607\n5: 1608\n5: 1609\n5: 1610\n5: 1611\n5: 1612\n5: 1613\n5: 1614\n5: 1615\n5: 1616\n5: 1617\n5: 1618\n5: 1619\n5: 1620\n5: 1621\n5: 1622\n5: 1623\n5: 1624\n5: 1625\n5: 1626\n5: 1627\n5: 1628\n5: 1629\n5: 1630\n5: 1631\n5: 1632\n5: 1633\n5: 1634\n5: 1635\n5: 1636\n5: 1637\n5: 1638\n5: 1639\n5: 1640\n5: 1641\n5: 1642\n5: 1643\n5: 1644\n5: 1645\n5: 1646\n5: 1647\n5: 1648\n5: 1649\n5: 1650\n5: 1651\n5: 1652\n5: 1653\n5: 1654\n5: 1655\n5: 1656\n5: 1657\n5: 1658\n5: 1659\n5: 1660\n5: 1661\n5: 1662\n5: 1663\n5: 1664\n5: 1665\n5: 1666\n5: 1667\n5: 1668\n5: 1669\n5: 1670\n5: 1671\n5: 1672\n5: 1673\n5: 1674\n5: 1675\n5: 1676\n5: 1677\n5: 1678\n5: 1679\n5: 1680\n5: 1681\n5: 1682\n5: 1683\n5: 1684\n5: 1685\n5: 1686\n5: 1687\n5: 1688\n5: 1689\n5: 1690\n5: 1691\n5: 1692\n5: 1693\n5: 1694\n5: 1695\n5: 1696\n5: 1697\n5: 1698\n5: 1699\n5: 1700\n5: 1701\n5: 1702\n5: 1703\n4: 1112\n4: 1113\n4: 1114\n4: 1115\n4: 1116\n4: 1117\n4: 1118\n4: 1119\n4: 1120\n4: 1121\n4: 1122\n4: 1123\n4: 1124\n4: 1125\n4: 1126\n4: 1127\n4: 1128\n4: 1129\n4: 1130\n4: 1131\n4: 1132\n4: 1133\n4: 1134\n4: 1135\n4: 1136\n4: 1137\n4: 1138\n4: 1139\n4: 1140\n4: 1141\n4: 1142\n4: 1143\n4: 1144\n4: 1145\n4: 1146\n4: 1147\n4: 1148\n4: 1149\n4: 1150\n4: 1151\n4: 1152\n4: 1153\n4: 1154\n4: 1155\n4: 1156\n4: 1157\n4: 1158\n4: 1159\n4: 1160\n4: 1161\n4: 1162\n4: 1163\n4: 1164\n4: 1165\n4: 1166\n4: 1167\n4: 1168\n4: 1169\n4: 1170\n4: 1171\n4: 1172\n4: 1173\n4: 1174\n4: 1175\n4: 1176\n4: 1177\n4: 1178\n4: 1179\n4: 1180\n4: 1181\n4: 1182\n4: 1183\n4: 1184\n4: 1185\n4: 1186\n4: 1187\n4: 1188\n4: 1189\n4: 1190\n4: 1191\n4: 1192\n4: 1193\n4: 1194\n4: 1195\n4: 1196\n4: 1197\n4: 1198\n4: 1199\n4: 1200\n4: 1201\n4: 1202\n4: 1203\n4: 1204\n4: 1205\n4: 1206\n4: 1207\n4: 1208\n4: 1209\n4: 1210\n4: 1211\n4: 1212\n4: 1213\n4: 1214\n4: 1215\n4: 1216\n4: 1217\n4: 1218\n4: 1219\n4: 1220\n4: 1221\n4: 1222\n4: 1223\n4: 1224\n4: 1225\n4: 1226\n4: 1227\n4: 1228\n4: 1229\n4: 1230\n4: 1231\n4: 1232\n4: 1233\n4: 1234\n4: 1235\n4: 1236\n4: 1237\n4: 1238\n4: 1239\n4: 1240\n4: 1241\n4: 1242\n4: 1243\n4: 1244\n4: 1245\n4: 1246\n4: 1247\n4: 1248\n4: 1249\n4: 1250\n4: 1251\n4: 1252\n4: 1253\n4: 1254\n4: 1255\n4: 1256\n4: 1257\n4: 1258\n4: 1259\n4: 1260\n4: 1261\n4: 1262\n4: 1263\n4: 1264\n4: 1265\n4: 1266\n4: 1267\n4: 1268\n4: 1269\n4: 1270\n4: 1271\n4: 1272\n4: 1273\n4: 1274\n4: 1275\n4: 1276\n4: 1277\n4: 1278\n4: 1279\n4: 1280\n4: 1281\n4: 1282\n4: 1283\n4: 1284\n4: 1285\n4: 1286\n4: 1287\n4: 1288\n4: 1289\n4: 1290\n4: 1291\n4: 1292\n4: 1293\n4: 1294\n4: 1295\n4: 1296\n4: 1297\n4: 1298\n4: 1299\n4: 1300\n4: 1301\n4: 1302\n4: 1303\n4: 1304\n4: 1305\n4: 1306\n4: 1307\n4: 1308\n4: 1309\n4: 1310\n4: 1311\n4: 1312\n4: 1313\n4: 1314\n4: 1315\n4: 1316\n4: 1317\n4: 1318\n4: 1319\n4: 1320\n4: 1321\n4: 1322\n4: 1323\n4: 1324\n4: 1325\n4: 1326\n4: 1327\n4: 1328\n4: 1329\n4: 1330\n4: 1331\n4: 1332\n4: 1333\n4: 1334\n4: 1335\n4: 1336\n4: 1337\n4: 1338\n4: 1339\n4: 1340\n4: 1341\n4: 1342\n4: 1343\n4: 1344\n4: 1345\n4: 1346\n4: 1347\n4: 1348\n4: 1349\n4: 1350\n4: 1351\n4: 1352\n4: 1353\n4: 1354\n4: 1355\n4: 1356\n4: 1357\n4: 1358\n4: 1359\n4: 1360\n4: 1361\n4: 1362\n4: 1363\n4: 1364\n4: 1365\n4: 1366\n4: 1367\n4: 1368\n4: 1369\n4: 1370\n4: 1371\n4: 1372\n4: 1373\n4: 1374\n4: 1375\n4: 1376\n4: 1377\n4: 1378\n4: 1379\n4: 1380\n4: 1381\n4: 1382\n4: 1383\n4: 1384\n4: 1385\n4: 1386\n4: 1387\n4: 1388\n4: 1389\n4: 1390\n4: 1391\n4: 1392\n4: 1393\n4: 1394\n4: 1395\n4: 1396\n4: 1397\n4: 1398\n4: 1399\n5: 1704\n5: 1705\n5: 1706\n5: 1707\n5: 1708\n5: 1709\n5: 1710\n5: 1711\n5: 1712\n5: 1713\n5: 1714\n5: 1715\n5: 1716\n5: 1717\n5: 1718\n5: 1719\n5: 1720\n5: 1721\n5: 1722\n5: 1723\n5: 1724\n5: 1725\n5: 1726\n5: 1727\n5: 1728\n5: 1729\n5: 1730\n5: 1731\n5: 1732\n5: 1733\n5: 1734\n5: 1735\n5: 1736\n5: 1737\n5: 1738\n5: 1739\n5: 1740\n5: 1741\n5: 1742\n5: 1743\n5: 1744\n5: 1745\n5: 1746\n5: 1747\n5: 1748\n5: 1749\n5: 1750\n5: 1751\n5: 1752\n5: 1753\n5: 1754\n5: 1755\n5: 1756\n5: 1757\n5: 1758\n5: 1759\n5: 1760\n5: 1761\n5: 1762\n5: 1763\n5: 1764\n5: 1765\n5: 1766\n5: 1767\n5: 1768\n5: 1769\n5: 1770\n5: 1771\n5: 1772\n5: 1773\n5: 1774\n5: 1775\n5: 1776\n5: 1777\n5: 1778\n5: 1779\n5: 1780\n5: 1781\n5: 1782\n5: 1783\n5: 1784\n5: 1785\n5: 1786\n5: 1787\n5: 1788\n5: 1789\n5: 1790\n5: 1791\n5: 1792\n5: 1793\n5: 1794\n5: 1795\n5: 1796\n5: 1797\n5: 1798\n5: 1799\n5: 1800\n5: 1801\n5: 1802\n5: 1803\n5: 1804\n5: 1805\n5: 1806\n5: 1807\n5: 1808\n5: 1809\n5: 1810\n5: 1811\n5: 1812\n5: 1813\n5: 1814\n5: 1815\n5: 1816\n5: 1817\n5: 1818\n5: 1819\n5: 1820\n5: 1821\n5: 1822\n5: 1823\n5: 1824\n5: 1825\n5: 1826\n5: 1827\n5: 1828\n5: 1829\n5: 1830\n5: 1831\n5: 1832\n5: 1833\n5: 1834\n5: 1835\n5: 1836\n5: 1837\n5: 1838\n5: 1839\n5: 1840\n5: 1841\n5: 1842\n5: 1843\n5: 1844\n5: 1845\n5: 1846\n5: 1847\n5: 1848\n5: 1849\n5: 1850\n5: 1851\n5: 1852\n5: 1853\n5: 1854\n5: 1855\n5: 1856\n5: 1857\n5: 1858\n5: 1859\n5: 1860\n5: 1861\n5: 1862\n5: 1863\n5: 1864\n5: 1865\n5: 1866\n5: 1867\n5: 1868\n5: 1869\n5: 1870\n5: 1871\n5: 1872\n5: 1873\n5: 1874\n5: 1875\n5: 1876\n5: 1877\n5: 1878\n5: 1879\n5: 1880\n5: 1881\n5: 1882\n5: 1883\n5: 1884\n5: 1885\n5: 1886\n5: 1887\n5: 1888\n5: 1889\n5: 1890\n5: 1891\n5: 1892\n5: 1893\n5: 1894\n5: 1895\n5: 1896\n5: 1897\n5: 1898\n5: 1899\n5: 1900\n5: 1901\n5: 1902\n5: 1903\n5: 1904\n5: 1905\n5: 1906\n5: 1907\n5: 1908\n5: 1909\n5: 1910\n5: 1911\n5: 1912\n5: 1913\n5: 1914\n5: 1915\n5: 1916\n5: 1917\n5: 1918\n5: 1919\n5: 1920\n5: 1921\n5: 1922\n5: 1923\n5: 1924\n5: 1925\n5: 1926\n5: 1927\n5: 1928\n5: 1929\n5: 1930\n5: 1931\n5: 1932\n5: 1933\n5: 1934\n5: 1935\n5: 1936\n5: 1937\n5: 1938\n5: 1939\n5: 1940\n5: 1941\n5: 1942\n5: 1943\n5: 1944\n5: 1945\n5: 1946\n5: 1947\n5: 1948\n5: 1949\n5: 1950\n5: 1951\n5: 1952\n5: 1953\n5: 1954\n5: 1955\n5: 1956\n5: 1957\n5: 1958\n5: 1959\n5: 1960\n5: 1961\n5: 1962\n5: 1963\n5: 1964\n5: 1965\n5: 1966\n5: 1967\n5: 1968\n5: 1969\n5: 1970\n5: 1971\n5: 1972\n5: 1973\n5: 1974\n5: 1975\n5: 1976\n5: 1977\n5: 1978\n5: 1979\n5: 1980\n5: 1981\n5: 1982\n5: 1983\n5: 1984\n5: 1985\n5: 1986\n5: 1987\n5: 1988\n5: 1989\n5: 1990\n5: 1991\n5: 1992\n5: 1993\n5: 1994\n5: 1995\n5: 1996\n5: 1997\n5: 1998\n5: 1999\n5: 2000\n5: 2001\n5: 2002\n5: 2003\n5: 2004\n5: 2005\n5: 2006\n5: 2007\n5: 2008\n5: 2009\n5: 2010\n5: 2011\n5: 2012\n5: 2013\n5: 2014\n5: 2015\n5: 2016\n5: 2017\n5: 2018\n5: 2019\n5: 2020\n5: 2021\n5: 2022\n5: 2023\n5: 2024\n5: 2025\n5: 2026\n5: 2027\n5: 2028\n5: 2029\n5: 2030\n5: 2031\n5: 2032\n5: 2033\n5: 2034\n5: 2035\n5: 2036\n5: 2037\n5: 2038\n5: 2039\n5: 2040\n5: 2041\n5: 2042\n5: 2043\n5: 2044\n5: 2045\n5: 2046\n5: 2047\n5: 2048\n5: 2049\n5: 2050\n5: 2051\n5: 2052\n5: 2053\n5: 2054\n5: 2055\n5: 2056\n5: 2057\n5: 2058\n5: 2059\n5: 2060\n5: 2061\n5: 2062\n5: 2063\n5: 2064\n5: 2065\n5: 2066\n5: 2067\n5: 2068\n5: 2069\n5: 2070\n5: 2071\n5: 2072\n5: 2073\n5: 2074\n5: 2075\n5: 2076\n5: 2077\n5: 2078\n5: 2079\n5: 2080\n5: 2081\n5: 2082\n5: 2083\n5: 2084\n5: 2085\n5: 2086\n5: 2087\n5: 2088\n5: 2089\n5: 2090\n5: 2091\n5: 2092\n5: 2093\n5: 2094\n5: 2095\n5: 2096\n5: 2097\n5: 2098\n5: 2099\n5: 2100\n5: 2101\n5: 2102\n5: 2103\n5: 2104\n5: 2105\n5: 2106\n5: 2107\n5: 2108\n5: 2109\n5: 2110\n5: 2111\n5: 2112\n5: 2113\n5: 2114\n5: 2115\n5: 2116\n5: 2117\n5: 2118\n5: 2119\n5: 2120\n5: 2121\n5: 2122\n5: 2123\n5: 2124\n5: 2125\n5: 2126\n5: 2127\n5: 2128\n5: 2129\n5: 2130\n5: 2131\n5: 2132\n5: 2133\n5: 2134\n5: 2135\n5: 2136\n5: 2137\n5: 2138\n5: 2139\n5: 2140\n5: 2141\n5: 2142\n5: 2143\n5: 2144\n5: 2145\n5: 2146\n5: 2147\n5: 2148\n5: 2149\n4: 1400\n4: 1401\n4: 1402\n4: 1403\n4: 1404\n4: 1405\n4: 1406\n4: 1407\n4: 1408\n4: 1409\n4: 1410\n4: 1411\n4: 1412\n4: 1413\n4: 1414\n4: 1415\n4: 1416\n4: 1417\n4: 1418\n4: 1419\n4: 1420\n4: 1421\n4: 1422\n4: 1423\n4: 1424\n4: 1425\n4: 1426\n4: 1427\n4: 1428\n4: 1429\n4: 1430\n4: 1431\n4: 1432\n4: 1433\n4: 1434\n4: 1435\n4: 1436\n4: 1437\n4: 1438\n4: 1439\n4: 1440\n4: 1441\n4: 1442\n4: 1443\n4: 1444\n4: 1445\n4: 1446\n4: 1447\n4: 1448\n4: 1449\n4: 1450\n4: 1451\n4: 1452\n4: 1453\n4: 1454\n4: 1455\n4: 1456\n4: 1457\n4: 1458\n4: 1459\n4: 1460\n4: 1461\n4: 1462\n4: 1463\n4: 1464\n4: 1465\n4: 1466\n4: 1467\n4: 1468\n4: 1469\n4: 1470\n4: 1471\n4: 1472\n4: 1473\n4: 1474\n4: 1475\n4: 1476\n4: 1477\n4: 1478\n4: 1479\n4: 1480\n4: 1481\n4: 1482\n4: 1483\n4: 1484\n4: 1485\n4: 1486\n4: 1487\n4: 1488\n4: 1489\n4: 1490\n4: 1491\n4: 1492\n4: 1493\n4: 1494\n4: 1495\n4: 1496\n4: 1497\n4: 1498\n4: 1499\n4: 1500\n4: 1501\n4: 1502\n4: 1503\n4: 1504\n4: 1505\n4: 1506\n4: 1507\n4: 1508\n4: 1509\n4: 1510\n4: 1511\n4: 1512\n4: 1513\n4: 1514\n4: 1515\n4: 1516\n4: 1517\n4: 1518\n4: 1519\n4: 1520\n4: 1521\n4: 1522\n4: 1523\n4: 1524\n4: 1525\n4: 1526\n4: 1527\n4: 1528\n4: 1529\n4: 1530\n4: 1531\n4: 1532\n4: 1533\n4: 1534\n4: 1535\n4: 1536\n4: 1537\n4: 1538\n4: 1539\n4: 1540\n4: 1541\n4: 1542\n4: 1543\n4: 1544\n4: 1545\n4: 1546\n4: 1547\n4: 1548\n4: 1549\n4: 1550\n4: 1551\n4: 1552\n4: 1553\n4: 1554\n4: 1555\n4: 1556\n4: 1557\n4: 1558\n4: 1559\n4: 1560\n4: 1561\n4: 1562\n4: 1563\n4: 1564\n4: 1565\n4: 1566\n4: 1567\n4: 1568\n4: 1569\n4: 1570\n4: 1571\n4: 1572\n4: 1573\n4: 1574\n4: 1575\n4: 1576\n4: 1577\n4: 1578\n4: 1579\n4: 1580\n4: 1581\n4: 1582\n4: 1583\n4: 1584\n4: 1585\n4: 1586\n4: 1587\n4: 1588\n4: 1589\n4: 1590\n4: 1591\n4: 1592\n4: 1593\n4: 1594\n4: 1595\n4: 1596\n4: 1597\n4: 1598\n4: 1599\n4: 1600\n4: 1601\n4: 1602\n4: 1603\n4: 1604\n4: 1605\n4: 1606\n4: 1607\n4: 1608\n4: 1609\n4: 1610\n4: 1611\n4: 1612\n4: 1613\n4: 1614\n4: 1615\n4: 1616\n4: 1617\n4: 1618\n4: 1619\n4: 1620\n4: 1621\n4: 1622\n4: 1623\n4: 1624\n4: 1625\n4: 1626\n4: 1627\n4: 1628\n4: 1629\n4: 1630\n4: 1631\n4: 1632\n4: 1633\n4: 1634\n4: 1635\n4: 1636\n4: 1637\n4: 1638\n4: 1639\n4: 1640\n4: 1641\n4: 1642\n4: 1643\n4: 1644\n4: 1645\n4: 1646\n4: 1647\n4: 1648\n4: 1649\n4: 1650\n4: 1651\n4: 1652\n4: 1653\n4: 1654\n4: 1655\n4: 1656\n4: 1657\n4: 1658\n4: 1659\n4: 1660\n4: 1661\n4: 1662\n4: 1663\n4: 1664\n4: 1665\n4: 1666\n4: 1667\n4: 1668\n4: 1669\n4: 1670\n4: 1671\n4: 1672\n4: 1673\n4: 1674\n4: 1675\n4: 1676\n4: 1677\n4: 1678\n4: 1679\n4: 1680\n4: 1681\n4: 1682\n4: 1683\n4: 1684\n4: 1685\n4: 1686\n4: 1687\n4: 1688\n4: 1689\n4: 1690\n4: 1691\n4: 1692\n4: 1693\n4: 1694\n4: 1695\n4: 1696\n4: 1697\n4: 1698\n4: 1699\n4: 1700\n4: 1701\n4: 1702\n4: 1703\n4: 1704\n4: 1705\n4: 1706\n4: 1707\n4: 1708\n4: 1709\n4: 1710\n4: 1711\n4: 1712\n4: 1713\n4: 1714\n4: 1715\n4: 1716\n4: 1717\n4: 1718\n4: 1719\n4: 1720\n4: 1721\n4: 1722\n4: 1723\n4: 1724\n4: 1725\n4: 1726\n4: 1727\n4: 1728\n4: 1729\n4: 1730\n4: 1731\n4: 1732\n4: 1733\n4: 1734\n4: 1735\n4: 1736\n4: 1737\n4: 1738\n4: 1739\n4: 1740\n4: 1741\n4: 1742\n4: 1743\n4: 1744\n4: 1745\n4: 1746\n4: 1747\n4: 1748\n4: 1749\n4: 1750\n4: 1751\n4: 1752\n4: 1753\n4: 1754\n4: 1755\n4: 1756\n4: 1757\n4: 1758\n4: 1759\n4: 1760\n4: 1761\n4: 1762\n4: 1763\n4: 1764\n4: 1765\n4: 1766\n4: 1767\n4: 1768\n4: 1769\n4: 1770\n4: 1771\n4: 1772\n4: 1773\n4: 1774\n4: 1775\n4: 1776\n4: 1777\n4: 1778\n4: 1779\n4: 1780\n4: 1781\n4: 1782\n4: 1783\n4: 1784\n4: 1785\n4: 1786\n4: 1787\n4: 1788\n4: 1789\n4: 1790\n4: 1791\n4: 1792\n4: 1793\n4: 1794\n4: 1795\n4: 1796\n4: 1797\n4: 1798\n4: 1799\n4: 1800\n4: 1801\n4: 1802\n4: 1803\n4: 1804\n4: 1805\n4: 1806\n4: 1807\n4: 1808\n4: 1809\n4: 1810\n4: 1811\n4: 1812\n4: 1813\n4: 1814\n4: 1815\n4: 1816\n4: 1817\n4: 1818\n4: 1819\n4: 1820\n4: 1821\n4: 1822\n4: 1823\n4: 1824\n4: 1825\n4: 1826\n4: 1827\n4: 1828\n4: 1829\n4: 1830\n4: 1831\n4: 1832\n4: 1833\n4: 1834\n4: 1835\n4: 1836\n4: 1837\n4: 1838\n4: 1839\n4: 1840\n4: 1841\n4: 1842\n4: 1843\n4: 1844\n4: 1845\n4: 1846\n4: 1847\n4: 1848\n4: 1849\n4: 1850\n4: 1851\n4: 1852\n4: 1853\n4: 1854\n4: 1855\n4: 1856\n4: 1857\n4: 1858\n4: 1859\n4: 1860\n4: 1861\n4: 1862\n4: 1863\n4: 1864\n4: 1865\n4: 1866\n4: 1867\n4: 1868\n4: 1869\n4: 1870\n4: 1871\n4: 1872\n4: 1873\n4: 1874\n4: 1875\n4: 1876\n4: 1877\n4: 1878\n4: 1879\n4: 1880\n4: 1881\n4: 1882\n4: 1883\n4: 1884\n4: 1885\n4: 1886\n4: 1887\n4: 1888\n4: 1889\n4: 1890\n4: 1891\n4: 1892\n4: 1893\n4: 1894\n4: 1895\n4: 1896\n4: 1897\n4: 1898\n4: 1899\n4: 1900\n4: 1901\n4: 1902\n4: 1903\n4: 1904\n4: 1905\n4: 1906\n4: 1907\n4: 1908\n4: 1909\n4: 1910\n4: 1911\n4: 1912\n4: 1913\n4: 1914\n4: 1915\n4: 1916\n4: 1917\n4: 1918\n4: 1919\n4: 1920\n4: 1921\n4: 1922\n4: 1923\n4: 1924\n4: 1925\n4: 1926\n4: 1927\n4: 1928\n4: 1929\n4: 1930\n4: 1931\n4: 1932\n4: 1933\n4: 1934\n4: 1935\n4: 1936\n4: 1937\n4: 1938\n4: 1939\n4: 1940\n4: 1941\n4: 1942\n4: 1943\n4: 1944\n4: 1945\n4: 1946\n4: 1947\n4: 1948\n4: 1949\n4: 1950\n4: 1951\n4: 1952\n4: 1953\n4: 1954\n4: 1955\n4: 1956\n4: 1957\n4: 1958\n4: 1959\n4: 1960\n4: 1961\n4: 1962\n4: 1963\n4: 1964\n4: 1965\n4: 1966\n4: 1967\n4: 1968\n4: 1969\n4: 1970\n4: 1971\n4: 1972\n4: 1973\n4: 1974\n4: 1975\n4: 1976\n4: 1977\n4: 1978\n4: 1979\n4: 1980\n4: 1981\n4: 1982\n4: 1983\n4: 1984\n4: 1985\n4: 1986\n4: 1987\n4: 1988\n4: 1989\n4: 1990\n4: 1991\n4: 1992\n4: 1993\n4: 1994\n4: 1995\n4: 1996\n4: 1997\n4: 1998\n4: 1999\n4: 2000\n4: 2001\n4: 2002\n4: 2003\n4: 2004\n4: 2005\n4: 2006\n4: 2007\n4: 2008\n4: 2009\n4: 2010\n4: 2011\n4: 2012\n4: 2013\n4: 2014\n4: 2015\n4: 2016\n4: 2017\n4: 2018\n4: 2019\n4: 2020\n4: 2021\n4: 2022\n4: 2023\n4: 2024\n4: 2025\n4: 2026\n4: 2027\n4: 2028\n4: 2029\n4: 2030\n4: 2031\n4: 2032\n4: 2033\n4: 2034\n4: 2035\n4: 2036\n4: 2037\n4: 2038\n4: 2039\n4: 2040\n4: 2041\n4: 2042\n4: 2043\n4: 2044\n4: 2045\n4: 2046\n4: 2047\n4: 2048\n4: 2049\n4: 2050\n4: 2051\n4: 2052\n4: 2053\n4: 2054\n4: 2055\n4: 2056\n4: 2057\n4: 2058\n4: 2059\n4: 2060\n4: 2061\n4: 2062\n4: 2063\n4: 2064\n4: 2065\n4: 2066\n4: 2067\n4: 2068\n4: 2069\n4: 2070\n4: 2071\n4: 2072\n4: 2073\n4: 2074\n4: 2075\n4: 2076\n4: 2077\n4: 2078\n4: 2079\n4: 2080\n4: 2081\n4: 2082\n4: 2083\n4: 2084\n4: 2085\n4: 2086\n4: 2087\n4: 2088\n4: 2089\n4: 2090\n4: 2091\n4: 2092\n4: 2093\n4: 2094\n4: 2095\n4: 2096\n4: 2097\n4: 2098\n4: 2099\n4: 2100\n4: 2101\n4: 2102\n4: 2103\n4: 2104\n4: 2105\n4: 2106\n4: 2107\n4: 2108\n4: 2109\n4: 2110\n4: 2111\n4: 2112\n4: 2113\n4: 2114\n4: 2115\n4: 2116\n4: 2117\n4: 2118\n4: 2119\n4: 2120\n4: 2121\n4: 2122\n4: 2123\n4: 2124\n4: 2125\n4: 2126\n4: 2127\n4: 2128\n4: 2129\n4: 2130\n4: 2131\n4: 2132\n4: 2133\n4: 2134\n4: 2135\n4: 2136\n4: 2137\n4: 2138\n4: 2139\n4: 2140\n4: 2141\n4: 2142\n4: 2143\n4: 2144\n4: 2145\n4: 2146\n4: 2147\n4: 2148\n4: 2149\n4: 2150\n4: 2151\n4: 2152\n4: 2153\n4: 2154\n4: 2155\n4: 2156\n4: 2157\n4: 2158\n4: 2159\n4: 2160\n4: 2161\n4: 2162\n4: 2163\n4: 2164\n4: 2165\n4: 2166\n4: 2167\n4: 2168\n4: 2169\n4: 2170\n4: 2171\n4: 2172\n4: 2173\n4: 2174\n4: 2175\n4: 2176\n4: 2177\n4: 2178\n4: 2179\n4: 2180\n4: 2181\n4: 2182\n4: 2183\n4: 2184\n4: 2185\n4: 2186\n4: 2187\n4: 2188\n4: 2189\n4: 2190\n4: 2191\n4: 2192\n4: 2193\n4: 2194\n4: 2195\n4: 2196\n4: 2197\n4: 2198\n4: 2199\n4: 2200\n4: 2201\n4: 2202\n4: 2203\n4: 2204\n4: 2205\n4: 2206\n4: 2207\n4: 2208\n4: 2209\n4: 2210\n4: 2211\n4: 2212\n4: 2213\n4: 2214\n4: 2215\n4: 2216\n4: 2217\n4: 2218\n4: 2219\n4: 2220\n4: 2221\n4: 2222\n4: 2223\n4: 2224\n4: 2225\n4: 2226\n4: 2227\n4: 2228\n4: 2229\n4: 2230\n4: 2231\n4: 2232\n4: 2233\n4: 2234\n4: 2235\n4: 2236\n4: 2237\n4: 2238\n4: 2239\n4: 2240\n4: 2241\n4: 2242\n4: 2243\n4: 2244\n4: 2245\n4: 2246\n4: 2247\n4: 2248\n4: 2249\n4: 2250\n4: 2251\n4: 2252\n4: 2253\n4: 2254\n4: 2255\n4: 2256\n4: 2257\n4: 2258\n4: 2259\n4: 2260\n4: 2261\n4: 2262\n4: 2263\n4: 2264\n4: 2265\n4: 2266\n4: 2267\n4: 2268\n4: 2269\n4: 2270\n4: 2271\n4: 2272\n4: 2273\n4: 2274\n4: 2275\n4: 2276\n4: 2277\n4: 2278\n4: 2279\n4: 2280\n4: 2281\n4: 2282\n5: 2150\n5: 2151\n5: 2152\n5: 2153\n5: 2154\n5: 2155\n5: 2156\n5: 2157\n5: 2158\n5: 2159\n5: 2160\n5: 2161\n5: 2162\n5: 2163\n5: 2164\n5: 2165\n5: 2166\n5: 2167\n5: 2168\n5: 2169\n5: 2170\n5: 2171\n5: 2172\n5: 2173\n5: 2174\n5: 2175\n5: 2176\n5: 2177\n5: 2178\n5: 2179\n5: 2180\n5: 2181\n5: 2182\n5: 2183\n5: 2184\n5: 2185\n5: 2186\n5: 2187\n5: 2188\n5: 2189\n5: 2190\n5: 2191\n5: 2192\n5: 2193\n5: 2194\n5: 2195\n5: 2196\n5: 2197\n5: 2198\n5: 2199\n5: 2200\n5: 2201\n5: 2202\n5: 2203\n5: 2204\n5: 2205\n5: 2206\n5: 2207\n5: 2208\n5: 2209\n5: 2210\n5: 2211\n5: 2212\n5: 2213\n5: 2214\n5: 2215\n5: 2216\n5: 2217\n5: 2218\n5: 2219\n5: 2220\n5: 2221\n5: 2222\n5: 2223\n5: 2224\n5: 2225\n5: 2226\n5: 2227\n5: 2228\n5: 2229\n5: 2230\n5: 2231\n5: 2232\n5: 2233\n5: 2234\n5: 2235\n5: 2236\n5: 2237\n5: 2238\n5: 2239\n5: 2240\n5: 2241\n5: 2242\n5: 2243\n5: 2244\n5: 2245\n5: 2246\n5: 2247\n5: 2248\n5: 2249\n5: 2250\n5: 2251\n5: 2252\n5: 2253\n5: 2254\n5: 2255\n5: 2256\n5: 2257\n5: 2258\n5: 2259\n5: 2260\n5: 2261\n5: 2262\n5: 2263\n5: 2264\n5: 2265\n5: 2266\n5: 2267\n5: 2268\n5: 2269\n5: 2270\n5: 2271\n5: 2272\n5: 2273\n5: 2274\n5: 2275\n5: 2276\n5: 2277\n5: 2278\n5: 2279\n5: 2280\n5: 2281\n5: 2282\n5: 2283\n5: 2284\n5: 2285\n5: 2286\n5: 2287\n5: 2288\n5: 2289\n5: 2290\n5: 2291\n5: 2292\n5: 2293\n5: 2294\n5: 2295\n5: 2296\n5: 2297\n5: 2298\n5: 2299\n5: 2300\n5: 2301\n5: 2302\n5: 2303\n5: 2304\n5: 2305\n5: 2306\n5: 2307\n5: 2308\n5: 2309\n5: 2310\n5: 2311\n5: 2312\n5: 2313\n5: 2314\n5: 2315\n5: 2316\n5: 2317\n5: 2318\n5: 2319\n5: 2320\n5: 2321\n5: 2322\n5: 2323\n5: 2324\n5: 2325\n5: 2326\n5: 2327\n5: 2328\n5: 2329\n5: 2330\n5: 2331\n5: 2332\n5: 2333\n5: 2334\n5: 2335\n5: 2336\n5: 2337\n5: 2338\n5: 2339\n5: 2340\n5: 2341\n5: 2342\n5: 2343\n5: 2344\n5: 2345\n5: 2346\n5: 2347\n5: 2348\n5: 2349\n5: 2350\n5: 2351\n5: 2352\n5: 2353\n5: 2354\n5: 2355\n5: 2356\n5: 2357\n5: 2358\n5: 2359\n5: 2360\n5: 2361\n5: 2362\n5: 2363\n5: 2364\n5: 2365\n5: 2366\n5: 2367\n5: 2368\n5: 2369\n5: 2370\n5: 2371\n5: 2372\n5: 2373\n5: 2374\n5: 2375\n5: 2376\n5: 2377\n5: 2378\n5: 2379\n5: 2380\n5: 2381\n5: 2382\n5: 2383\n5: 2384\n5: 2385\n5: 2386\n5: 2387\n5: 2388\n5: 2389\n5: 2390\n5: 2391\n5: 2392\n5: 2393\n5: 2394\n5: 2395\n5: 2396\n5: 2397\n5: 2398\n5: 2399\n5: 2400\n5: 2401\n5: 2402\n5: 2403\n5: 2404\n5: 2405\n5: 2406\n5: 2407\n5: 2408\n5: 2409\n5: 2410\n5: 2411\n5: 2412\n5: 2413\n5: 2414\n5: 2415\n5: 2416\n5: 2417\n5: 2418\n5: 2419\n5: 2420\n5: 2421\n5: 2422\n5: 2423\n5: 2424\n5: 2425\n5: 2426\n5: 2427\n5: 2428\n5: 2429\n5: 2430\n5: 2431\n5: 2432\n5: 2433\n5: 2434\n5: 2435\n5: 2436\n5: 2437\n5: 2438\n5: 2439\n5: 2440\n5: 2441\n5: 2442\n5: 2443\n5: 2444\n5: 2445\n5: 2446\n5: 2447\n5: 2448\n5: 2449\n5: 2450\n5: 2451\n5: 2452\n5: 2453\n5: 2454\n5: 2455\n5: 2456\n5: 2457\n5: 2458\n5: 2459\n5: 2460\n5: 2461\n5: 2462\n5: 2463\n5: 2464\n5: 2465\n5: 2466\n5: 2467\n5: 2468\n5: 2469\n5: 2470\n5: 2471\n5: 2472\n5: 2473\n5: 2474\n5: 2475\n5: 2476\n5: 2477\n5: 2478\n5: 2479\n5: 2480\n5: 2481\n5: 2482\n5: 2483\n5: 2484\n4: 2283\n4: 2284\n4: 2285\n4: 2286\n4: 2287\n4: 2288\n4: 2289\n4: 2290\n4: 2291\n4: 2292\n4: 2293\n4: 2294\n4: 2295\n4: 2296\n4: 2297\n4: 2298\n4: 2299\n4: 2300\n4: 2301\n4: 2302\n4: 2303\n4: 2304\n4: 2305\n4: 2306\n4: 2307\n4: 2308\n4: 2309\n4: 2310\n4: 2311\n4: 2312\n4: 2313\n4: 2314\n4: 2315\n4: 2316\n4: 2317\n4: 2318\n4: 2319\n4: 2320\n4: 2321\n4: 2322\n4: 2323\n4: 2324\n4: 2325\n4: 2326\n4: 2327\n4: 2328\n4: 2329\n4: 2330\n4: 2331\n4: 2332\n4: 2333\n4: 2334\n4: 2335\n4: 2336\n4: 2337\n4: 2338\n4: 2339\n4: 2340\n4: 2341\n4: 2342\n4: 2343\n4: 2344\n4: 2345\n4: 2346\n4: 2347\n4: 2348\n4: 2349\n4: 2350\n4: 2351\n4: 2352\n4: 2353\n4: 2354\n4: 2355\n4: 2356\n4: 2357\n4: 2358\n4: 2359\n4: 2360\n4: 2361\n4: 2362\n4: 2363\n4: 2364\n4: 2365\n4: 2366\n4: 2367\n4: 2368\n4: 2369\n4: 2370\n4: 2371\n4: 2372\n4: 2373\n4: 2374\n4: 2375\n4: 2376\n4: 2377\n4: 2378\n4: 2379\n4: 2380\n4: 2381\n4: 2382\n4: 2383\n4: 2384\n4: 2385\n4: 2386\n4: 2387\n4: 2388\n4: 2389\n4: 2390\n4: 2391\n4: 2392\n4: 2393\n4: 2394\n4: 2395\n4: 2396\n4: 2397\n4: 2398\n4: 2399\n4: 2400\n4: 2401\n4: 2402\n4: 2403\n4: 2404\n4: 2405\n4: 2406\n4: 2407\n4: 2408\n4: 2409\n4: 2410\n4: 2411\n4: 2412\n4: 2413\n4: 2414\n4: 2415\n4: 2416\n4: 2417\n4: 2418\n4: 2419\n4: 2420\n4: 2421\n4: 2422\n4: 2423\n4: 2424\n4: 2425\n4: 2426\n4: 2427\n4: 2428\n4: 2429\n4: 2430\n4: 2431\n4: 2432\n4: 2433\n4: 2434\n4: 2435\n4: 2436\n4: 2437\n4: 2438\n4: 2439\n4: 2440\n4: 2441\n4: 2442\n4: 2443\n4: 2444\n4: 2445\n4: 2446\n4: 2447\n4: 2448\n4: 2449\n4: 2450\n4: 2451\n4: 2452\n4: 2453\n4: 2454\n4: 2455\n4: 2456\n4: 2457\n4: 2458\n4: 2459\n4: 2460\n4: 2461\n4: 2462\n4: 2463\n4: 2464\n4: 2465\n4: 2466\n4: 2467\n4: 2468\n4: 2469\n4: 2470\n4: 2471\n4: 2472\n4: 2473\n4: 2474\n4: 2475\n4: 2476\n4: 2477\n4: 2478\n4: 2479\n4: 2480\n4: 2481\n4: 2482\n4: 2483\n4: 2484\n4: 2485\n4: 2486\n4: 2487\n4: 2488\n4: 2489\n4: 2490\n4: 2491\n4: 2492\n4: 2493\n4: 2494\n4: 2495\n4: 2496\n4: 2497\n4: 2498\n4: 2499\n4: 2500\n4: 2501\n4: 2502\n4: 2503\n4: 2504\n4: 2505\n4: 2506\n4: 2507\n4: 2508\n4: 2509\n4: 2510\n4: 2511\n4: 2512\n4: 2513\n4: 2514\n4: 2515\n4: 2516\n4: 2517\n4: 2518\n4: 2519\n4: 2520\n4: 2521\n4: 2522\n4: 2523\n4: 2524\n4: 2525\n4: 2526\n4: 2527\n4: 2528\n4: 2529\n4: 2530\n4: 2531\n4: 2532\n4: 2533\n4: 2534\n4: 2535\n4: 2536\n4: 2537\n4: 2538\n4: 2539\n4: 2540\n4: 2541\n4: 2542\n4: 2543\n4: 2544\n4: 2545\n4: 2546\n4: 2547\n4: 2548\n4: 2549\n4: 2550\n4: 2551\n4: 2552\n4: 2553\n4: 2554\n4: 2555\n4: 2556\n4: 2557\n4: 2558\n4: 2559\n4: 2560\n4: 2561\n4: 2562\n4: 2563\n4: 2564\n4: 2565\n4: 2566\n4: 2567\n4: 2568\n4: 2569\n4: 2570\n4: 2571\n4: 2572\n4: 2573\n4: 2574\n4: 2575\n4: 2576\n4: 2577\n4: 2578\n4: 2579\n4: 2580\n4: 2581\n4: 2582\n4: 2583\n4: 2584\n4: 2585\n4: 2586\n4: 2587\n4: 2588\n4: 2589\n4: 2590\n4: 2591\n4: 2592\n4: 2593\n4: 2594\n4: 2595\n4: 2596\n4: 2597\n4: 2598\n4: 2599\n4: 2600\n4: 2601\n4: 2602\n4: 2603\n4: 2604\n4: 2605\n4: 2606\n4: 2607\n4: 2608\n4: 2609\n4: 2610\n4: 2611\n4: 2612\n4: 2613\n4: 2614\n4: 2615\n4: 2616\n4: 2617\n4: 2618\n4: 2619\n4: 2620\n4: 2621\n4: 2622\n4: 2623\n4: 2624\n4: 2625\n4: 2626\n4: 2627\n4: 2628\n4: 2629\n4: 2630\n4: 2631\n4: 2632\n4: 2633\n4: 2634\n4: 2635\n4: 2636\n4: 2637\n4: 2638\n4: 2639\n4: 2640\n4: 2641\n4: 2642\n4: 2643\n4: 2644\n4: 2645\n4: 2646\n4: 2647\n4: 2648\n4: 2649\n4: 2650\n4: 2651\n4: 2652\n4: 2653\n4: 2654\n4: 2655\n4: 2656\n4: 2657\n4: 2658\n4: 2659\n4: 2660\n4: 2661\n4: 2662\n4: 2663\n4: 2664\n4: 2665\n4: 2666\n4: 2667\n4: 2668\n4: 2669\n4: 2670\n4: 2671\n4: 2672\n4: 2673\n4: 2674\n4: 2675\n4: 2676\n4: 2677\n4: 2678\n4: 2679\n4: 2680\n4: 2681\n4: 2682\n4: 2683\n4: 2684\n4: 2685\n4: 2686\n4: 2687\n4: 2688\n4: 2689\n4: 2690\n4: 2691\n4: 2692\n4: 2693\n4: 2694\n4: 2695\n4: 2696\n4: 2697\n4: 2698\n4: 2699\n4: 2700\n4: 2701\n4: 2702\n4: 2703\n4: 2704\n4: 2705\n4: 2706\n4: 2707\n4: 2708\n4: 2709\n4: 2710\n4: 2711\n4: 2712\n4: 2713\n4: 2714\n4: 2715\n4: 2716\n4: 2717\n4: 2718\n4: 2719\n4: 2720\n4: 2721\n4: 2722\n4: 2723\n4: 2724\n4: 2725\n4: 2726\n4: 2727\n4: 2728\n4: 2729\n4: 2730\n4: 2731\n4: 2732\n4: 2733\n4: 2734\n4: 2735\n4: 2736\n4: 2737\n4: 2738\n4: 2739\n4: 2740\n4: 2741\n4: 2742\n4: 2743\n4: 2744\n4: 2745\n4: 2746\n4: 2747\n4: 2748\n4: 2749\n4: 2750\n4: 2751\n4: 2752\n5: 2485\n5: 2486\n5: 2487\n5: 2488\n5: 2489\n5: 2490\n5: 2491\n5: 2492\n5: 2493\n5: 2494\n5: 2495\n5: 2496\n5: 2497\n5: 2498\n5: 2499\n5: 2500\n5: 2501\n5: 2502\n5: 2503\n5: 2504\n5: 2505\n5: 2506\n5: 2507\n5: 2508\n5: 2509\n5: 2510\n5: 2511\n5: 2512\n5: 2513\n5: 2514\n5: 2515\n5: 2516\n5: 2517\n5: 2518\n5: 2519\n5: 2520\n5: 2521\n5: 2522\n5: 2523\n5: 2524\n5: 2525\n5: 2526\n5: 2527\n5: 2528\n5: 2529\n5: 2530\n5: 2531\n5: 2532\n5: 2533\n5: 2534\n5: 2535\n5: 2536\n5: 2537\n5: 2538\n5: 2539\n5: 2540\n5: 2541\n5: 2542\n5: 2543\n5: 2544\n5: 2545\n5: 2546\n5: 2547\n5: 2548\n5: 2549\n5: 2550\n5: 2551\n5: 2552\n5: 2553\n5: 2554\n5: 2555\n5: 2556\n5: 2557\n5: 2558\n5: 2559\n5: 2560\n5: 2561\n5: 2562\n5: 2563\n5: 2564\n5: 2565\n5: 2566\n5: 2567\n5: 2568\n5: 2569\n5: 2570\n5: 2571\n5: 2572\n5: 2573\n5: 2574\n5: 2575\n5: 2576\n5: 2577\n5: 2578\n5: 2579\n5: 2580\n5: 2581\n5: 2582\n5: 2583\n5: 2584\n5: 2585\n5: 2586\n5: 2587\n5: 2588\n5: 2589\n5: 2590\n5: 2591\n5: 2592\n5: 2593\n5: 2594\n5: 2595\n5: 2596\n5: 2597\n5: 2598\n5: 2599\n5: 2600\n5: 2601\n5: 2602\n5: 2603\n5: 2604\n5: 2605\n5: 2606\n5: 2607\n5: 2608\n5: 2609\n5: 2610\n5: 2611\n5: 2612\n5: 2613\n5: 2614\n5: 2615\n5: 2616\n5: 2617\n5: 2618\n5: 2619\n5: 2620\n5: 2621\n5: 2622\n5: 2623\n5: 2624\n5: 2625\n5: 2626\n5: 2627\n5: 2628\n5: 2629\n5: 2630\n5: 2631\n5: 2632\n5: 2633\n5: 2634\n5: 2635\n5: 2636\n5: 2637\n5: 2638\n5: 2639\n5: 2640\n5: 2641\n5: 2642\n5: 2643\n5: 2644\n5: 2645\n5: 2646\n5: 2647\n5: 2648\n5: 2649\n5: 2650\n5: 2651\n5: 2652\n5: 2653\n5: 2654\n5: 2655\n5: 2656\n5: 2657\n5: 2658\n5: 2659\n5: 2660\n5: 2661\n5: 2662\n5: 2663\n5: 2664\n5: 2665\n5: 2666\n5: 2667\n5: 2668\n5: 2669\n5: 2670\n5: 2671\n5: 2672\n5: 2673\n5: 2674\n5: 2675\n5: 2676\n5: 2677\n5: 2678\n5: 2679\n5: 2680\n5: 2681\n5: 2682\n5: 2683\n5: 2684\n5: 2685\n5: 2686\n5: 2687\n5: 2688\n5: 2689\n5: 2690\n5: 2691\n5: 2692\n5: 2693\n5: 2694\n5: 2695\n5: 2696\n5: 2697\n5: 2698\n5: 2699\n5: 2700\n5: 2701\n5: 2702\n5: 2703\n5: 2704\n5: 2705\n5: 2706\n5: 2707\n5: 2708\n5: 2709\n5: 2710\n5: 2711\n5: 2712\n5: 2713\n5: 2714\n5: 2715\n5: 2716\n5: 2717\n5: 2718\n5: 2719\n5: 2720\n5: 2721\n5: 2722\n5: 2723\n5: 2724\n5: 2725\n5: 2726\n5: 2727\n5: 2728\n5: 2729\n5: 2730\n5: 2731\n5: 2732\n5: 2733\n5: 2734\n5: 2735\n5: 2736\n5: 2737\n5: 2738\n5: 2739\n5: 2740\n5: 2741\n5: 2742\n5: 2743\n5: 2744\n5: 2745\n5: 2746\n5: 2747\n5: 2748\n5: 2749\n5: 2750\n5: 2751\n5: 2752\n5: 2753\n5: 2754\n5: 2755\n5: 2756\n5: 2757\n5: 2758\n5: 2759\n5: 2760\n5: 2761\n5: 2762\n5: 2763\n5: 2764\n5: 2765\n5: 2766\n5: 2767\n5: 2768\n5: 2769\n5: 2770\n5: 2771\n5: 2772\n5: 2773\n5: 2774\n5: 2775\n5: 2776\n5: 2777\n5: 2778\n5: 2779\n5: 2780\n5: 2781\n5: 2782\n5: 2783\n5: 2784\n5: 2785\n5: 2786\n5: 2787\n5: 2788\n5: 2789\n5: 2790\n5: 2791\n5: 2792\n5: 2793\n5: 2794\n5: 2795\n5: 2796\n5: 2797\n5: 2798\n5: 2799\n5: 2800\n5: 2801\n5: 2802\n5: 2803\n5: 2804\n5: 2805\n5: 2806\n5: 2807\n5: 2808\n5: 2809\n5: 2810\n5: 2811\n5: 2812\n5: 2813\n5: 2814\n5: 2815\n5: 2816\n5: 2817\n5: 2818\n5: 2819\n5: 2820\n5: 2821\n5: 2822\n5: 2823\n5: 2824\n5: 2825\n5: 2826\n5: 2827\n5: 2828\n5: 2829\n5: 2830\n5: 2831\n5: 2832\n5: 2833\n5: 2834\n5: 2835\n5: 2836\n5: 2837\n5: 2838\n5: 2839\n5: 2840\n5: 2841\n5: 2842\n5: 2843\n5: 2844\n5: 2845\n5: 2846\n5: 2847\n5: 2848\n5: 2849\n5: 2850\n5: 2851\n5: 2852\n5: 2853\n5: 2854\n5: 2855\n5: 2856\n5: 2857\n5: 2858\n5: 2859\n5: 2860\n5: 2861\n5: 2862\n5: 2863\n5: 2864\n5: 2865\n5: 2866\n5: 2867\n5: 2868\n5: 2869\n5: 2870\n5: 2871\n5: 2872\n5: 2873\n5: 2874\n5: 2875\n5: 2876\n5: 2877\n5: 2878\n5: 2879\n5: 2880\n5: 2881\n5: 2882\n5: 2883\n5: 2884\n5: 2885\n5: 2886\n5: 2887\n5: 2888\n5: 2889\n5: 2890\n5: 2891\n5: 2892\n5: 2893\n5: 2894\n5: 2895\n5: 2896\n5: 2897\n5: 2898\n5: 2899\n5: 2900\n5: 2901\n5: 2902\n5: 2903\n5: 2904\n5: 2905\n5: 2906\n5: 2907\n5: 2908\n5: 2909\n5: 2910\n5: 2911\n5: 2912\n5: 2913\n5: 2914\n5: 2915\n5: 2916\n5: 2917\n5: 2918\n5: 2919\n5: 2920\n5: 2921\n5: 2922\n5: 2923\n5: 2924\n5: 2925\n4: 2753\n4: 2754\n4: 2755\n4: 2756\n4: 2757\n4: 2758\n4: 2759\n4: 2760\n4: 2761\n4: 2762\n4: 2763\n4: 2764\n4: 2765\n4: 2766\n4: 2767\n4: 2768\n4: 2769\n4: 2770\n4: 2771\n4: 2772\n4: 2773\n4: 2774\n4: 2775\n4: 2776\n4: 2777\n4: 2778\n4: 2779\n4: 2780\n4: 2781\n4: 2782\n4: 2783\n4: 2784\n4: 2785\n4: 2786\n4: 2787\n4: 2788\n4: 2789\n4: 2790\n4: 2791\n4: 2792\n4: 2793\n4: 2794\n4: 2795\n4: 2796\n4: 2797\n4: 2798\n4: 2799\n4: 2800\n4: 2801\n4: 2802\n4: 2803\n4: 2804\n4: 2805\n4: 2806\n4: 2807\n4: 2808\n4: 2809\n4: 2810\n4: 2811\n4: 2812\n4: 2813\n4: 2814\n4: 2815\n4: 2816\n4: 2817\n4: 2818\n4: 2819\n4: 2820\n4: 2821\n4: 2822\n4: 2823\n4: 2824\n4: 2825\n4: 2826\n4: 2827\n4: 2828\n4: 2829\n4: 2830\n4: 2831\n4: 2832\n4: 2833\n4: 2834\n4: 2835\n4: 2836\n4: 2837\n4: 2838\n4: 2839\n4: 2840\n4: 2841\n4: 2842\n4: 2843\n4: 2844\n4: 2845\n4: 2846\n4: 2847\n4: 2848\n4: 2849\n4: 2850\n4: 2851\n4: 2852\n4: 2853\n4: 2854\n4: 2855\n4: 2856\n4: 2857\n4: 2858\n4: 2859\n4: 2860\n4: 2861\n4: 2862\n4: 2863\n4: 2864\n4: 2865\n4: 2866\n4: 2867\n4: 2868\n4: 2869\n4: 2870\n4: 2871\n4: 2872\n4: 2873\n4: 2874\n4: 2875\n4: 2876\n4: 2877\n4: 2878\n4: 2879\n4: 2880\n4: 2881\n4: 2882\n4: 2883\n4: 2884\n4: 2885\n4: 2886\n4: 2887\n4: 2888\n4: 2889\n4: 2890\n4: 2891\n4: 2892\n4: 2893\n4: 2894\n4: 2895\n4: 2896\n4: 2897\n4: 2898\n4: 2899\n4: 2900\n4: 2901\n4: 2902\n4: 2903\n4: 2904\n4: 2905\n4: 2906\n4: 2907\n4: 2908\n4: 2909\n4: 2910\n4: 2911\n4: 2912\n4: 2913\n4: 2914\n4: 2915\n4: 2916\n4: 2917\n4: 2918\n4: 2919\n4: 2920\n4: 2921\n4: 2922\n4: 2923\n4: 2924\n4: 2925\n4: 2926\n4: 2927\n4: 2928\n4: 2929\n4: 2930\n4: 2931\n4: 2932\n4: 2933\n4: 2934\n4: 2935\n4: 2936\n4: 2937\n4: 2938\n4: 2939\n4: 2940\n5: 2926\n5: 2927\n5: 2928\n5: 2929\n5: 2930\n5: 2931\n5: 2932\n5: 2933\n5: 2934\n5: 2935\n5: 2936\n5: 2937\n5: 2938\n5: 2939\n5: 2940\n5: 2941\n5: 2942\n5: 2943\n5: 2944\n5: 2945\n5: 2946\n5: 2947\n5: 2948\n5: 2949\n5: 2950\n5: 2951\n5: 2952\n5: 2953\n5: 2954\n5: 2955\n5: 2956\n5: 2957\n5: 2958\n5: 2959\n5: 2960\n5: 2961\n5: 2962\n5: 2963\n5: 2964\n5: 2965\n5: 2966\n5: 2967\n5: 2968\n5: 2969\n5: 2970\n5: 2971\n5: 2972\n5: 2973\n5: 2974\n5: 2975\n5: 2976\n5: 2977\n5: 2978\n5: 2979\n5: 2980\n5: 2981\n5: 2982\n5: 2983\n5: 2984\n5: 2985\n5: 2986\n5: 2987\n5: 2988\n5: 2989\n5: 2990\n5: 2991\n5: 2992\n5: 2993\n5: 2994\n5: 2995\n5: 2996\n5: 2997\n5: 2998\n5: 2999\n5: 3000\n5: 3001\n5: 3002\n5: 3003\n4: 2941\n4: 2942\n4: 2943\n4: 2944\n4: 2945\n4: 2946\n4: 2947\n4: 2948\n4: 2949\n4: 2950\n4: 2951\n4: 2952\n4: 2953\n4: 2954\n4: 2955\n4: 2956\n4: 2957\n4: 2958\n4: 2959\n4: 2960\n4: 2961\n4: 2962\n4: 2963\n4: 2964\n4: 2965\n4: 2966\n4: 2967\n4: 2968\n4: 2969\n4: 2970\n4: 2971\n4: 2972\n4: 2973\n4: 2974\n4: 2975\n4: 2976\n4: 2977\n4: 2978\n4: 2979\n4: 2980\n4: 2981\n4: 2982\n4: 2983\n4: 2984\n4: 2985\n4: 2986\n4: 2987\n4: 2988\n4: 2989\n4: 2990\n4: 2991\n4: 2992\n4: 2993\n4: 2994\n4: 2995\n4: 2996\n4: 2997\n4: 2998\n4: 2999\n4: 3000\n4: 3001\n4: 3002\n4: 3003\n4: 3004\n4: 3005\n4: 3006\n4: 3007\n4: 3008\n4: 3009\n4: 3010\n4: 3011\n4: 3012\n4: 3013\n4: 3014\n4: 3015\n4: 3016\n4: 3017\n4: 3018\n4: 3019\n4: 3020\n4: 3021\n4: 3022\n4: 3023\n4: 3024\n4: 3025\n5: 3004\n5: 3005\n5: 3006\n5: 3007\n5: 3008\n5: 3009\n5: 3010\n5: 3011\n5: 3012\n5: 3013\n5: 3014\n5: 3015\n5: 3016\n5: 3017\n5: 3018\n5: 3019\n5: 3020\n5: 3021\n5: 3022\n5: 3023\n5: 3024\n5: 3025\n5: 3026\n5: 3027\n5: 3028\n5: 3029\n5: 3030\n5: 3031\n5: 3032\n5: 3033\n5: 3034\n5: 3035\n5: 3036\n5: 3037\n5: 3038\n5: 3039\n5: 3040\n5: 3041\n5: 3042\n5: 3043\n5: 3044\n5: 3045\n5: 3046\n5: 3047\n5: 3048\n5: 3049\n5: 3050\n5: 3051\n5: 3052\n5: 3053\n5: 3054\n5: 3055\n5: 3056\n5: 3057\n5: 3058\n5: 3059\n5: 3060\n5: 3061\n5: 3062\n5: 3063\n5: 3064\n5: 3065\n5: 3066\n5: 3067\n5: 3068\n5: 3069\n5: 3070\n5: 3071\n5: 3072\n5: 3073\n5: 3074\n5: 3075\n5: 3076\n5: 3077\n5: 3078\n5: 3079\n5: 3080\n5: 3081\n5: 3082\n5: 3083\n5: 3084\n5: 3085\n5: 3086\n5: 3087\n5: 3088\n5: 3089\n5: 3090\n5: 3091\n5: 3092\n5: 3093\n5: 3094\n5: 3095\n5: 3096\n5: 3097\n5: 3098\n5: 3099\n5: 3100\n5: 3101\n5: 3102\n5: 3103\n5: 3104\n5: 3105\n5: 3106\n5: 3107\n5: 3108\n5: 3109\n5: 3110\n5: 3111\n5: 3112\n5: 3113\n5: 3114\n5: 3115\n5: 3116\n5: 3117\n5: 3118\n5: 3119\n5: 3120\n5: 3121\n5: 3122\n5: 3123\n5: 3124\n5: 3125\n5: 3126\n5: 3127\n5: 3128\n5: 3129\n5: 3130\n5: 3131\n5: 3132\n5: 3133\n5: 3134\n5: 3135\n5: 3136\n5: 3137\n5: 3138\n5: 3139\n5: 3140\n5: 3141\n5: 3142\n5: 3143\n5: 3144\n5: 3145\n5: 3146\n5: 3147\n5: 3148\n5: 3149\n5: 3150\n5: 3151\n5: 3152\n5: 3153\n5: 3154\n5: 3155\n5: 3156\n5: 3157\n5: 3158\n5: 3159\n5: 3160\n5: 3161\n5: 3162\n5: 3163\n5: 3164\n5: 3165\n5: 3166\n5: 3167\n5: 3168\n5: 3169\n5: 3170\n5: 3171\n5: 3172\n5: 3173\n5: 3174\n5: 3175\n5: 3176\n5: 3177\n5: 3178\n5: 3179\n5: 3180\n5: 3181\n5: 3182\n5: 3183\n5: 3184\n5: 3185\n5: 3186\n5: 3187\n5: 3188\n5: 3189\n5: 3190\n5: 3191\n5: 3192\n5: 3193\n5: 3194\n5: 3195\n5: 3196\n5: 3197\n5: 3198\n5: 3199\n5: 3200\n5: 3201\n5: 3202\n5: 3203\n5: 3204\n5: 3205\n5: 3206\n5: 3207\n5: 3208\n5: 3209\n5: 3210\n5: 3211\n5: 3212\n5: 3213\n5: 3214\n5: 3215\n5: 3216\n5: 3217\n5: 3218\n5: 3219\n5: 3220\n5: 3221\n5: 3222\n5: 3223\n5: 3224\n5: 3225\n5: 3226\n5: 3227\n5: 3228\n5: 3229\n5: 3230\n5: 3231\n5: 3232\n5: 3233\n5: 3234\n5: 3235\n5: 3236\n5: 3237\n5: 3238\n5: 3239\n5: 3240\n5: 3241\n5: 3242\n5: 3243\n5: 3244\n5: 3245\n5: 3246\n5: 3247\n5: 3248\n5: 3249\n5: 3250\n5: 3251\n5: 3252\n5: 3253\n5: 3254\n5: 3255\n5: 3256\n5: 3257\n5: 3258\n5: 3259\n5: 3260\n5: 3261\n5: 3262\n5: 3263\n5: 3264\n5: 3265\n5: 3266\n5: 3267\n5: 3268\n5: 3269\n5: 3270\n5: 3271\n5: 3272\n5: 3273\n5: 3274\n5: 3275\n5: 3276\n5: 3277\n5: 3278\n5: 3279\n5: 3280\n5: 3281\n5: 3282\n5: 3283\n5: 3284\n5: 3285\n5: 3286\n5: 3287\n5: 3288\n5: 3289\n5: 3290\n5: 3291\n5: 3292\n5: 3293\n5: 3294\n5: 3295\n5: 3296\n5: 3297\n5: 3298\n5: 3299\n5: 3300\n5: 3301\n5: 3302\n5: 3303\n5: 3304\n5: 3305\n5: 3306\n5: 3307\n5: 3308\n5: 3309\n5: 3310\n5: 3311\n5: 3312\n5: 3313\n5: 3314\n5: 3315\n5: 3316\n5: 3317\n5: 3318\n5: 3319\n5: 3320\n5: 3321\n5: 3322\n5: 3323\n5: 3324\n5: 3325\n5: 3326\n5: 3327\n5: 3328\n5: 3329\n5: 3330\n5: 3331\n5: 3332\n5: 3333\n5: 3334\n5: 3335\n5: 3336\n5: 3337\n5: 3338\n5: 3339\n5: 3340\n5: 3341\n5: 3342\n5: 3343\n5: 3344\n5: 3345\n5: 3346\n5: 3347\n5: 3348\n5: 3349\n5: 3350\n5: 3351\n5: 3352\n5: 3353\n5: 3354\n5: 3355\n5: 3356\n5: 3357\n5: 3358\n5: 3359\n5: 3360\n5: 3361\n5: 3362\n5: 3363\n5: 3364\n5: 3365\n5: 3366\n5: 3367\n5: 3368\n5: 3369\n5: 3370\n5: 3371\n5: 3372\n5: 3373\n5: 3374\n5: 3375\n5: 3376\n5: 3377\n5: 3378\n5: 3379\n5: 3380\n5: 3381\n4: 3026\n4: 3027\n4: 3028\n4: 3029\n4: 3030\n4: 3031\n4: 3032\n4: 3033\n4: 3034\n4: 3035\n4: 3036\n4: 3037\n4: 3038\n4: 3039\n4: 3040\n4: 3041\n4: 3042\n4: 3043\n4: 3044\n4: 3045\n4: 3046\n4: 3047\n4: 3048\n4: 3049\n4: 3050\n4: 3051\n4: 3052\n4: 3053\n4: 3054\n4: 3055\n4: 3056\n4: 3057\n4: 3058\n4: 3059\n4: 3060\n4: 3061\n4: 3062\n4: 3063\n4: 3064\n4: 3065\n4: 3066\n4: 3067\n4: 3068\n4: 3069\n4: 3070\n4: 3071\n4: 3072\n4: 3073\n4: 3074\n4: 3075\n4: 3076\n4: 3077\n4: 3078\n4: 3079\n4: 3080\n4: 3081\n4: 3082\n4: 3083\n4: 3084\n4: 3085\n4: 3086\n4: 3087\n4: 3088\n4: 3089\n4: 3090\n4: 3091\n4: 3092\n4: 3093\n4: 3094\n4: 3095\n4: 3096\n4: 3097\n4: 3098\n4: 3099\n4: 3100\n4: 3101\n4: 3102\n4: 3103\n4: 3104\n4: 3105\n4: 3106\n4: 3107\n4: 3108\n4: 3109\n4: 3110\n4: 3111\n4: 3112\n4: 3113\n4: 3114\n4: 3115\n4: 3116\n4: 3117\n4: 3118\n4: 3119\n4: 3120\n4: 3121\n4: 3122\n4: 3123\n4: 3124\n4: 3125\n4: 3126\n4: 3127\n4: 3128\n4: 3129\n4: 3130\n4: 3131\n4: 3132\n4: 3133\n4: 3134\n4: 3135\n4: 3136\n4: 3137\n4: 3138\n4: 3139\n4: 3140\n4: 3141\n4: 3142\n4: 3143\n4: 3144\n4: 3145\n4: 3146\n4: 3147\n4: 3148\n4: 3149\n4: 3150\n4: 3151\n4: 3152\n4: 3153\n4: 3154\n4: 3155\n4: 3156\n4: 3157\n4: 3158\n4: 3159\n4: 3160\n4: 3161\n4: 3162\n4: 3163\n4: 3164\n4: 3165\n4: 3166\n4: 3167\n4: 3168\n4: 3169\n4: 3170\n4: 3171\n4: 3172\n4: 3173\n4: 3174\n4: 3175\n4: 3176\n4: 3177\n4: 3178\n4: 3179\n4: 3180\n4: 3181\n4: 3182\n4: 3183\n4: 3184\n4: 3185\n4: 3186\n4: 3187\n4: 3188\n4: 3189\n4: 3190\n4: 3191\n4: 3192\n4: 3193\n4: 3194\n4: 3195\n4: 3196\n4: 3197\n4: 3198\n4: 3199\n4: 3200\n4: 3201\n4: 3202\n4: 3203\n4: 3204\n4: 3205\n4: 3206\n4: 3207\n4: 3208\n4: 3209\n4: 3210\n4: 3211\n4: 3212\n4: 3213\n4: 3214\n4: 3215\n4: 3216\n4: 3217\n4: 3218\n4: 3219\n4: 3220\n4: 3221\n4: 3222\n4: 3223\n4: 3224\n4: 3225\n4: 3226\n4: 3227\n4: 3228\n4: 3229\n4: 3230\n4: 3231\n4: 3232\n4: 3233\n4: 3234\n4: 3235\n4: 3236\n4: 3237\n4: 3238\n4: 3239\n4: 3240\n4: 3241\n4: 3242\n4: 3243\n4: 3244\n4: 3245\n4: 3246\n4: 3247\n4: 3248\n4: 3249\n4: 3250\n4: 3251\n4: 3252\n4: 3253\n4: 3254\n4: 3255\n4: 3256\n4: 3257\n4: 3258\n4: 3259\n4: 3260\n4: 3261\n4: 3262\n4: 3263\n4: 3264\n4: 3265\n4: 3266\n4: 3267\n4: 3268\n4: 3269\n4: 3270\n4: 3271\n4: 3272\n4: 3273\n4: 3274\n4: 3275\n4: 3276\n4: 3277\n4: 3278\n4: 3279\n4: 3280\n4: 3281\n4: 3282\n5: 3382\n5: 3383\n5: 3384\n5: 3385\n5: 3386\n5: 3387\n5: 3388\n5: 3389\n5: 3390\n5: 3391\n5: 3392\n5: 3393\n5: 3394\n5: 3395\n5: 3396\n5: 3397\n5: 3398\n5: 3399\n5: 3400\n5: 3401\n5: 3402\n5: 3403\n5: 3404\n5: 3405\n5: 3406\n5: 3407\n5: 3408\n5: 3409\n5: 3410\n5: 3411\n5: 3412\n5: 3413\n5: 3414\n5: 3415\n5: 3416\n5: 3417\n5: 3418\n5: 3419\n5: 3420\n5: 3421\n5: 3422\n5: 3423\n5: 3424\n5: 3425\n5: 3426\n5: 3427\n5: 3428\n5: 3429\n5: 3430\n5: 3431\n5: 3432\n5: 3433\n5: 3434\n5: 3435\n5: 3436\n5: 3437\n5: 3438\n5: 3439\n5: 3440\n5: 3441\n5: 3442\n5: 3443\n5: 3444\n5: 3445\n5: 3446\n5: 3447\n5: 3448\n5: 3449\n5: 3450\n5: 3451\n5: 3452\n5: 3453\n5: 3454\n5: 3455\n5: 3456\n5: 3457\n5: 3458\n5: 3459\n5: 3460\n5: 3461\n5: 3462\n5: 3463\n5: 3464\n5: 3465\n5: 3466\n5: 3467\n5: 3468\n5: 3469\n5: 3470\n5: 3471\n5: 3472\n5: 3473\n5: 3474\n5: 3475\n5: 3476\n5: 3477\n5: 3478\n5: 3479\n5: 3480\n5: 3481\n5: 3482\n5: 3483\n5: 3484\n5: 3485\n5: 3486\n5: 3487\n5: 3488\n5: 3489\n5: 3490\n5: 3491\n5: 3492\n5: 3493\n5: 3494\n5: 3495\n5: 3496\n5: 3497\n5: 3498\n5: 3499\n5: 3500\n5: 3501\n5: 3502\n5: 3503\n5: 3504\n5: 3505\n5: 3506\n5: 3507\n5: 3508\n5: 3509\n5: 3510\n5: 3511\n5: 3512\n5: 3513\n5: 3514\n5: 3515\n5: 3516\n5: 3517\n5: 3518\n5: 3519\n5: 3520\n5: 3521\n5: 3522\n5: 3523\n5: 3524\n5: 3525\n5: 3526\n5: 3527\n5: 3528\n5: 3529\n5: 3530\n5: 3531\n5: 3532\n5: 3533\n5: 3534\n5: 3535\n5: 3536\n5: 3537\n5: 3538\n5: 3539\n5: 3540\n5: 3541\n5: 3542\n5: 3543\n5: 3544\n5: 3545\n5: 3546\n5: 3547\n5: 3548\n5: 3549\n5: 3550\n5: 3551\n5: 3552\n5: 3553\n5: 3554\n5: 3555\n5: 3556\n5: 3557\n5: 3558\n5: 3559\n5: 3560\n5: 3561\n5: 3562\n5: 3563\n5: 3564\n5: 3565\n5: 3566\n5: 3567\n5: 3568\n5: 3569\n5: 3570\n5: 3571\n5: 3572\n5: 3573\n5: 3574\n5: 3575\n5: 3576\n5: 3577\n5: 3578\n5: 3579\n5: 3580\n5: 3581\n5: 3582\n5: 3583\n5: 3584\n5: 3585\n5: 3586\n5: 3587\n5: 3588\n5: 3589\n5: 3590\n5: 3591\n5: 3592\n5: 3593\n5: 3594\n5: 3595\n5: 3596\n5: 3597\n5: 3598\n5: 3599\n5: 3600\n5: 3601\n5: 3602\n5: 3603\n5: 3604\n5: 3605\n5: 3606\n5: 3607\n5: 3608\n5: 3609\n5: 3610\n5: 3611\n5: 3612\n5: 3613\n5: 3614\n5: 3615\n5: 3616\n5: 3617\n5: 3618\n5: 3619\n5: 3620\n5: 3621\n5: 3622\n5: 3623\n5: 3624\n5: 3625\n5: 3626\n5: 3627\n5: 3628\n5: 3629\n5: 3630\n5: 3631\n5: 3632\n5: 3633\n5: 3634\n5: 3635\n5: 3636\n5: 3637\n5: 3638\n5: 3639\n5: 3640\n5: 3641\n5: 3642\n5: 3643\n5: 3644\n5: 3645\n5: 3646\n5: 3647\n5: 3648\n5: 3649\n5: 3650\n5: 3651\n5: 3652\n5: 3653\n5: 3654\n5: 3655\n5: 3656\n5: 3657\n5: 3658\n5: 3659\n5: 3660\n5: 3661\n5: 3662\n5: 3663\n5: 3664\n5: 3665\n5: 3666\n5: 3667\n5: 3668\n5: 3669\n5: 3670\n5: 3671\n4: 3283\n4: 3284\n4: 3285\n4: 3286\n4: 3287\n4: 3288\n4: 3289\n4: 3290\n4: 3291\n4: 3292\n4: 3293\n4: 3294\n4: 3295\n4: 3296\n4: 3297\n4: 3298\n4: 3299\n4: 3300\n4: 3301\n4: 3302\n4: 3303\n4: 3304\n4: 3305\n4: 3306\n4: 3307\n4: 3308\n4: 3309\n4: 3310\n4: 3311\n4: 3312\n4: 3313\n4: 3314\n4: 3315\n4: 3316\n4: 3317\n4: 3318\n4: 3319\n4: 3320\n4: 3321\n4: 3322\n4: 3323\n4: 3324\n4: 3325\n4: 3326\n4: 3327\n4: 3328\n4: 3329\n4: 3330\n4: 3331\n4: 3332\n4: 3333\n4: 3334\n4: 3335\n4: 3336\n4: 3337\n4: 3338\n4: 3339\n4: 3340\n4: 3341\n4: 3342\n4: 3343\n4: 3344\n4: 3345\n4: 3346\n4: 3347\n4: 3348\n4: 3349\n4: 3350\n4: 3351\n4: 3352\n4: 3353\n4: 3354\n4: 3355\n4: 3356\n4: 3357\n4: 3358\n4: 3359\n4: 3360\n4: 3361\n4: 3362\n4: 3363\n4: 3364\n4: 3365\n4: 3366\n4: 3367\n4: 3368\n4: 3369\n4: 3370\n4: 3371\n4: 3372\n4: 3373\n4: 3374\n4: 3375\n4: 3376\n4: 3377\n4: 3378\n4: 3379\n4: 3380\n4: 3381\n4: 3382\n4: 3383\n4: 3384\n4: 3385\n4: 3386\n4: 3387\n4: 3388\n4: 3389\n4: 3390\n4: 3391\n4: 3392\n4: 3393\n4: 3394\n4: 3395\n4: 3396\n4: 3397\n4: 3398\n4: 3399\n4: 3400\n4: 3401\n4: 3402\n4: 3403\n4: 3404\n4: 3405\n4: 3406\n4: 3407\n4: 3408\n4: 3409\n4: 3410\n4: 3411\n4: 3412\n4: 3413\n4: 3414\n4: 3415\n4: 3416\n4: 3417\n4: 3418\n4: 3419\n4: 3420\n4: 3421\n4: 3422\n4: 3423\n4: 3424\n4: 3425\n4: 3426\n4: 3427\n4: 3428\n4: 3429\n4: 3430\n4: 3431\n4: 3432\n4: 3433\n4: 3434\n4: 3435\n4: 3436\n4: 3437\n4: 3438\n4: 3439\n4: 3440\n4: 3441\n4: 3442\n4: 3443\n4: 3444\n4: 3445\n4: 3446\n4: 3447\n4: 3448\n4: 3449\n4: 3450\n4: 3451\n4: 3452\n4: 3453\n4: 3454\n4: 3455\n4: 3456\n4: 3457\n4: 3458\n4: 3459\n4: 3460\n4: 3461\n4: 3462\n4: 3463\n4: 3464\n4: 3465\n4: 3466\n4: 3467\n4: 3468\n4: 3469\n4: 3470\n4: 3471\n4: 3472\n4: 3473\n4: 3474\n4: 3475\n4: 3476\n4: 3477\n4: 3478\n4: 3479\n4: 3480\n4: 3481\n4: 3482\n4: 3483\n4: 3484\n4: 3485\n4: 3486\n4: 3487\n4: 3488\n4: 3489\n4: 3490\n4: 3491\n4: 3492\n4: 3493\n4: 3494\n4: 3495\n4: 3496\n4: 3497\n4: 3498\n4: 3499\n4: 3500\n4: 3501\n4: 3502\n4: 3503\n4: 3504\n4: 3505\n4: 3506\n4: 3507\n4: 3508\n4: 3509\n4: 3510\n4: 3511\n4: 3512\n4: 3513\n4: 3514\n4: 3515\n4: 3516\n4: 3517\n4: 3518\n4: 3519\n4: 3520\n4: 3521\n4: 3522\n4: 3523\n4: 3524\n4: 3525\n4: 3526\n4: 3527\n4: 3528\n4: 3529\n4: 3530\n4: 3531\n4: 3532\n4: 3533\n4: 3534\n4: 3535\n4: 3536\n4: 3537\n4: 3538\n4: 3539\n4: 3540\n4: 3541\n4: 3542\n4: 3543\n4: 3544\n4: 3545\n4: 3546\n4: 3547\n4: 3548\n4: 3549\n4: 3550\n4: 3551\n4: 3552\n4: 3553\n4: 3554\n4: 3555\n4: 3556\n4: 3557\n4: 3558\n4: 3559\n4: 3560\n4: 3561\n4: 3562\n4: 3563\n4: 3564\n4: 3565\n4: 3566\n4: 3567\n4: 3568\n4: 3569\n4: 3570\n4: 3571\n4: 3572\n4: 3573\n4: 3574\n4: 3575\n4: 3576\n4: 3577\n4: 3578\n4: 3579\n4: 3580\n4: 3581\n4: 3582\n4: 3583\n4: 3584\n4: 3585\n4: 3586\n4: 3587\n4: 3588\n4: 3589\n4: 3590\n4: 3591\n4: 3592\n4: 3593\n4: 3594\n4: 3595\n4: 3596\n4: 3597\n4: 3598\n4: 3599\n4: 3600\n4: 3601\n4: 3602\n4: 3603\n4: 3604\n5: 3672\n5: 3673\n5: 3674\n5: 3675\n5: 3676\n5: 3677\n5: 3678\n5: 3679\n5: 3680\n5: 3681\n5: 3682\n5: 3683\n5: 3684\n5: 3685\n5: 3686\n5: 3687\n5: 3688\n5: 3689\n5: 3690\n5: 3691\n5: 3692\n5: 3693\n5: 3694\n5: 3695\n5: 3696\n5: 3697\n5: 3698\n5: 3699\n5: 3700\n5: 3701\n5: 3702\n5: 3703\n5: 3704\n5: 3705\n5: 3706\n5: 3707\n5: 3708\n5: 3709\n5: 3710\n5: 3711\n5: 3712\n5: 3713\n5: 3714\n5: 3715\n5: 3716\n5: 3717\n5: 3718\n5: 3719\n5: 3720\n5: 3721\n5: 3722\n5: 3723\n5: 3724\n5: 3725\n5: 3726\n5: 3727\n5: 3728\n5: 3729\n5: 3730\n5: 3731\n5: 3732\n5: 3733\n5: 3734\n5: 3735\n5: 3736\n5: 3737\n5: 3738\n5: 3739\n5: 3740\n5: 3741\n5: 3742\n5: 3743\n5: 3744\n5: 3745\n5: 3746\n5: 3747\n5: 3748\n5: 3749\n5: 3750\n5: 3751\n5: 3752\n5: 3753\n5: 3754\n5: 3755\n5: 3756\n5: 3757\n5: 3758\n5: 3759\n5: 3760\n5: 3761\n5: 3762\n5: 3763\n5: 3764\n5: 3765\n5: 3766\n5: 3767\n5: 3768\n5: 3769\n5: 3770\n5: 3771\n5: 3772\n5: 3773\n5: 3774\n5: 3775\n5: 3776\n5: 3777\n5: 3778\n5: 3779\n5: 3780\n5: 3781\n5: 3782\n5: 3783\n5: 3784\n5: 3785\n5: 3786\n5: 3787\n5: 3788\n5: 3789\n5: 3790\n5: 3791\n5: 3792\n5: 3793\n5: 3794\n5: 3795\n5: 3796\n5: 3797\n5: 3798\n5: 3799\n5: 3800\n5: 3801\n5: 3802\n5: 3803\n5: 3804\n5: 3805\n5: 3806\n5: 3807\n5: 3808\n5: 3809\n5: 3810\n5: 3811\n5: 3812\n5: 3813\n5: 3814\n5: 3815\n5: 3816\n5: 3817\n5: 3818\n5: 3819\n5: 3820\n5: 3821\n5: 3822\n5: 3823\n5: 3824\n5: 3825\n5: 3826\n5: 3827\n5: 3828\n5: 3829\n5: 3830\n5: 3831\n5: 3832\n5: 3833\n5: 3834\n5: 3835\n5: 3836\n5: 3837\n5: 3838\n5: 3839\n5: 3840\n5: 3841\n5: 3842\n5: 3843\n5: 3844\n5: 3845\n5: 3846\n5: 3847\n5: 3848\n5: 3849\n5: 3850\n5: 3851\n5: 3852\n5: 3853\n5: 3854\n5: 3855\n5: 3856\n5: 3857\n5: 3858\n5: 3859\n5: 3860\n5: 3861\n5: 3862\n5: 3863\n5: 3864\n5: 3865\n5: 3866\n5: 3867\n5: 3868\n5: 3869\n5: 3870\n5: 3871\n5: 3872\n5: 3873\n5: 3874\n5: 3875\n5: 3876\n5: 3877\n5: 3878\n5: 3879\n5: 3880\n5: 3881\n5: 3882\n5: 3883\n5: 3884\n5: 3885\n5: 3886\n5: 3887\n5: 3888\n5: 3889\n5: 3890\n5: 3891\n5: 3892\n5: 3893\n5: 3894\n5: 3895\n5: 3896\n5: 3897\n5: 3898\n5: 3899\n5: 3900\n5: 3901\n5: 3902\n5: 3903\n5: 3904\n5: 3905\n5: 3906\n5: 3907\n5: 3908\n5: 3909\n5: 3910\n5: 3911\n5: 3912\n5: 3913\n5: 3914\n5: 3915\n5: 3916\n5: 3917\n5: 3918\n5: 3919\n5: 3920\n5: 3921\n5: 3922\n5: 3923\n5: 3924\n5: 3925\n5: 3926\n5: 3927\n5: 3928\n5: 3929\n5: 3930\n5: 3931\n5: 3932\n5: 3933\n5: 3934\n5: 3935\n5: 3936\n5: 3937\n5: 3938\n5: 3939\n5: 3940\n5: 3941\n5: 3942\n5: 3943\n5: 3944\n5: 3945\n5: 3946\n5: 3947\n5: 3948\n5: 3949\n5: 3950\n5: 3951\n5: 3952\n5: 3953\n5: 3954\n5: 3955\n5: 3956\n5: 3957\n5: 3958\n5: 3959\n5: 3960\n5: 3961\n5: 3962\n5: 3963\n5: 3964\n5: 3965\n5: 3966\n5: 3967\n5: 3968\n5: 3969\n5: 3970\n5: 3971\n5: 3972\n5: 3973\n5: 3974\n5: 3975\n5: 3976\n5: 3977\n5: 3978\n5: 3979\n5: 3980\n5: 3981\n5: 3982\n5: 3983\n5: 3984\n5: 3985\n5: 3986\n5: 3987\n5: 3988\n5: 3989\n5: 3990\n5: 3991\n5: 3992\n5: 3993\n5: 3994\n5: 3995\n5: 3996\n5: 3997\n5: 3998\n5: 3999\n5: 4000\n5: 4001\n5: 4002\n5: 4003\n5: 4004\n5: 4005\n5: 4006\n5: 4007\n5: 4008\n5: 4009\n5: 4010\n5: 4011\n5: 4012\n5: 4013\n5: 4014\n5: 4015\n5: 4016\n5: 4017\n5: 4018\n5: 4019\n5: 4020\n5: 4021\n5: 4022\n5: 4023\n5: 4024\n5: 4025\n5: 4026\n5: 4027\n5: 4028\n5: 4029\n5: 4030\n5: 4031\n5: 4032\n5: 4033\n5: 4034\n5: 4035\n5: 4036\n5: 4037\n5: 4038\n5: 4039\n5: 4040\n5: 4041\n5: 4042\n5: 4043\n5: 4044\n5: 4045\n5: 4046\n5: 4047\n5: 4048\n5: 4049\n5: 4050\n5: 4051\n5: 4052\n5: 4053\n5: 4054\n5: 4055\n5: 4056\n5: 4057\n5: 4058\n5: 4059\n5: 4060\n5: 4061\n5: 4062\n5: 4063\n5: 4064\n5: 4065\n5: 4066\n5: 4067\n5: 4068\n5: 4069\n5: 4070\n5: 4071\n5: 4072\n5: 4073\n5: 4074\n5: 4075\n5: 4076\n5: 4077\n5: 4078\n5: 4079\n5: 4080\n5: 4081\n5: 4082\n5: 4083\n5: 4084\n5: 4085\n5: 4086\n5: 4087\n5: 4088\n5: 4089\n5: 4090\n5: 4091\n5: 4092\n5: 4093\n5: 4094\n5: 4095\n5: 4096\n5: 4097\n5: 4098\n5: 4099\n5: 4100\n5: 4101\n5: 4102\n5: 4103\n5: 4104\n5: 4105\n5: 4106\n5: 4107\n5: 4108\n5: 4109\n5: 4110\n5: 4111\n5: 4112\n5: 4113\n5: 4114\n4: 3605\n4: 3606\n4: 3607\n4: 3608\n4: 3609\n4: 3610\n4: 3611\n4: 3612\n4: 3613\n4: 3614\n4: 3615\n4: 3616\n4: 3617\n4: 3618\n4: 3619\n4: 3620\n4: 3621\n4: 3622\n4: 3623\n4: 3624\n4: 3625\n4: 3626\n4: 3627\n4: 3628\n4: 3629\n4: 3630\n4: 3631\n4: 3632\n4: 3633\n4: 3634\n4: 3635\n4: 3636\n4: 3637\n4: 3638\n4: 3639\n4: 3640\n4: 3641\n4: 3642\n4: 3643\n4: 3644\n4: 3645\n4: 3646\n4: 3647\n4: 3648\n4: 3649\n4: 3650\n4: 3651\n4: 3652\n4: 3653\n4: 3654\n4: 3655\n4: 3656\n4: 3657\n4: 3658\n4: 3659\n4: 3660\n4: 3661\n4: 3662\n4: 3663\n4: 3664\n4: 3665\n4: 3666\n4: 3667\n4: 3668\n4: 3669\n4: 3670\n4: 3671\n4: 3672\n4: 3673\n4: 3674\n4: 3675\n4: 3676\n4: 3677\n4: 3678\n4: 3679\n4: 3680\n4: 3681\n4: 3682\n4: 3683\n4: 3684\n4: 3685\n4: 3686\n4: 3687\n4: 3688\n4: 3689\n4: 3690\n4: 3691\n4: 3692\n4: 3693\n4: 3694\n4: 3695\n4: 3696\n4: 3697\n4: 3698\n4: 3699\n4: 3700\n4: 3701\n4: 3702\n4: 3703\n4: 3704\n4: 3705\n4: 3706\n4: 3707\n4: 3708\n4: 3709\n4: 3710\n4: 3711\n4: 3712\n4: 3713\n4: 3714\n4: 3715\n4: 3716\n4: 3717\n4: 3718\n4: 3719\n4: 3720\n4: 3721\n4: 3722\n4: 3723\n4: 3724\n4: 3725\n4: 3726\n4: 3727\n4: 3728\n4: 3729\n4: 3730\n4: 3731\n4: 3732\n4: 3733\n4: 3734\n4: 3735\n4: 3736\n4: 3737\n4: 3738\n4: 3739\n4: 3740\n4: 3741\n4: 3742\n4: 3743\n4: 3744\n4: 3745\n4: 3746\n4: 3747\n4: 3748\n4: 3749\n4: 3750\n4: 3751\n4: 3752\n4: 3753\n4: 3754\n4: 3755\n4: 3756\n4: 3757\n4: 3758\n4: 3759\n4: 3760\n4: 3761\n4: 3762\n4: 3763\n4: 3764\n4: 3765\n4: 3766\n4: 3767\n4: 3768\n4: 3769\n4: 3770\n4: 3771\n4: 3772\n4: 3773\n4: 3774\n4: 3775\n4: 3776\n4: 3777\n4: 3778\n4: 3779\n4: 3780\n4: 3781\n4: 3782\n4: 3783\n4: 3784\n4: 3785\n4: 3786\n4: 3787\n4: 3788\n4: 3789\n4: 3790\n4: 3791\n4: 3792\n4: 3793\n4: 3794\n4: 3795\n4: 3796\n4: 3797\n4: 3798\n4: 3799\n4: 3800\n4: 3801\n4: 3802\n4: 3803\n4: 3804\n4: 3805\n4: 3806\n4: 3807\n4: 3808\n4: 3809\n4: 3810\n4: 3811\n4: 3812\n4: 3813\n4: 3814\n4: 3815\n4: 3816\n4: 3817\n4: 3818\n4: 3819\n4: 3820\n4: 3821\n4: 3822\n4: 3823\n4: 3824\n4: 3825\n4: 3826\n4: 3827\n4: 3828\n4: 3829\n4: 3830\n4: 3831\n4: 3832\n4: 3833\n4: 3834\n4: 3835\n4: 3836\n4: 3837\n4: 3838\n4: 3839\n4: 3840\n4: 3841\n4: 3842\n4: 3843\n4: 3844\n4: 3845\n4: 3846\n4: 3847\n4: 3848\n4: 3849\n4: 3850\n4: 3851\n4: 3852\n4: 3853\n4: 3854\n4: 3855\n4: 3856\n4: 3857\n4: 3858\n4: 3859\n4: 3860\n4: 3861\n4: 3862\n4: 3863\n4: 3864\n4: 3865\n4: 3866\n4: 3867\n4: 3868\n4: 3869\n4: 3870\n4: 3871\n4: 3872\n4: 3873\n4: 3874\n4: 3875\n4: 3876\n4: 3877\n4: 3878\n4: 3879\n4: 3880\n4: 3881\n4: 3882\n4: 3883\n4: 3884\n4: 3885\n4: 3886\n4: 3887\n4: 3888\n4: 3889\n4: 3890\n4: 3891\n4: 3892\n4: 3893\n4: 3894\n4: 3895\n4: 3896\n4: 3897\n4: 3898\n4: 3899\n4: 3900\n4: 3901\n4: 3902\n4: 3903\n4: 3904\n4: 3905\n4: 3906\n4: 3907\n4: 3908\n4: 3909\n4: 3910\n4: 3911\n4: 3912\n4: 3913\n4: 3914\n4: 3915\n4: 3916\n4: 3917\n4: 3918\n4: 3919\n4: 3920\n4: 3921\n4: 3922\n4: 3923\n4: 3924\n4: 3925\n4: 3926\n4: 3927\n4: 3928\n4: 3929\n4: 3930\n4: 3931\n4: 3932\n4: 3933\n4: 3934\n4: 3935\n4: 3936\n4: 3937\n4: 3938\n4: 3939\n4: 3940\n4: 3941\n4: 3942\n4: 3943\n4: 3944\n4: 3945\n4: 3946\n4: 3947\n4: 3948\n4: 3949\n4: 3950\n4: 3951\n4: 3952\n4: 3953\n4: 3954\n4: 3955\n4: 3956\n4: 3957\n4: 3958\n4: 3959\n4: 3960\n4: 3961\n4: 3962\n4: 3963\n4: 3964\n4: 3965\n4: 3966\n4: 3967\n4: 3968\n4: 3969\n4: 3970\n4: 3971\n4: 3972\n4: 3973\n4: 3974\n4: 3975\n4: 3976\n4: 3977\n4: 3978\n4: 3979\n4: 3980\n4: 3981\n4: 3982\n4: 3983\n4: 3984\n4: 3985\n4: 3986\n4: 3987\n4: 3988\n4: 3989\n4: 3990\n4: 3991\n4: 3992\n4: 3993\n4: 3994\n4: 3995\n4: 3996\n4: 3997\n4: 3998\n4: 3999\n4: 4000\n4: 4001\n4: 4002\n4: 4003\n4: 4004\n4: 4005\n4: 4006\n4: 4007\n4: 4008\n4: 4009\n4: 4010\n4: 4011\n4: 4012\n4: 4013\n4: 4014\n4: 4015\n4: 4016\n4: 4017\n4: 4018\n4: 4019\n4: 4020\n5: 4115\n5: 4116\n5: 4117\n5: 4118\n5: 4119\n5: 4120\n5: 4121\n5: 4122\n5: 4123\n5: 4124\n5: 4125\n5: 4126\n5: 4127\n5: 4128\n5: 4129\n5: 4130\n5: 4131\n5: 4132\n5: 4133\n5: 4134\n5: 4135\n5: 4136\n5: 4137\n5: 4138\n5: 4139\n5: 4140\n5: 4141\n5: 4142\n5: 4143\n5: 4144\n5: 4145\n5: 4146\n5: 4147\n5: 4148\n5: 4149\n5: 4150\n5: 4151\n5: 4152\n5: 4153\n5: 4154\n5: 4155\n5: 4156\n5: 4157\n5: 4158\n5: 4159\n5: 4160\n5: 4161\n5: 4162\n5: 4163\n5: 4164\n5: 4165\n5: 4166\n5: 4167\n5: 4168\n5: 4169\n5: 4170\n5: 4171\n5: 4172\n5: 4173\n5: 4174\n5: 4175\n5: 4176\n5: 4177\n5: 4178\n5: 4179\n5: 4180\n5: 4181\n5: 4182\n5: 4183\n5: 4184\n5: 4185\n5: 4186\n5: 4187\n5: 4188\n5: 4189\n5: 4190\n5: 4191\n5: 4192\n5: 4193\n5: 4194\n5: 4195\n5: 4196\n5: 4197\n5: 4198\n5: 4199\n5: 4200\n5: 4201\n5: 4202\n5: 4203\n5: 4204\n5: 4205\n5: 4206\n5: 4207\n5: 4208\n5: 4209\n5: 4210\n5: 4211\n5: 4212\n5: 4213\n5: 4214\n5: 4215\n5: 4216\n5: 4217\n5: 4218\n5: 4219\n5: 4220\n5: 4221\n5: 4222\n5: 4223\n5: 4224\n5: 4225\n5: 4226\n5: 4227\n5: 4228\n5: 4229\n5: 4230\n5: 4231\n5: 4232\n5: 4233\n5: 4234\n5: 4235\n5: 4236\n5: 4237\n5: 4238\n5: 4239\n5: 4240\n5: 4241\n5: 4242\n5: 4243\n5: 4244\n5: 4245\n5: 4246\n5: 4247\n5: 4248\n5: 4249\n5: 4250\n5: 4251\n5: 4252\n5: 4253\n5: 4254\n5: 4255\n5: 4256\n5: 4257\n5: 4258\n5: 4259\n5: 4260\n5: 4261\n5: 4262\n5: 4263\n5: 4264\n5: 4265\n5: 4266\n5: 4267\n5: 4268\n5: 4269\n5: 4270\n5: 4271\n5: 4272\n5: 4273\n5: 4274\n5: 4275\n5: 4276\n5: 4277\n5: 4278\n5: 4279\n5: 4280\n5: 4281\n5: 4282\n5: 4283\n5: 4284\n5: 4285\n5: 4286\n5: 4287\n5: 4288\n5: 4289\n5: 4290\n5: 4291\n5: 4292\n5: 4293\n5: 4294\n5: 4295\n5: 4296\n5: 4297\n5: 4298\n5: 4299\n5: 4300\n5: 4301\n5: 4302\n5: 4303\n5: 4304\n5: 4305\n5: 4306\n5: 4307\n4: 4021\n4: 4022\n4: 4023\n4: 4024\n4: 4025\n4: 4026\n4: 4027\n4: 4028\n4: 4029\n4: 4030\n4: 4031\n4: 4032\n4: 4033\n4: 4034\n4: 4035\n4: 4036\n4: 4037\n4: 4038\n4: 4039\n4: 4040\n4: 4041\n4: 4042\n4: 4043\n4: 4044\n4: 4045\n4: 4046\n4: 4047\n4: 4048\n4: 4049\n4: 4050\n4: 4051\n4: 4052\n4: 4053\n4: 4054\n4: 4055\n4: 4056\n4: 4057\n4: 4058\n4: 4059\n4: 4060\n4: 4061\n4: 4062\n4: 4063\n4: 4064\n4: 4065\n4: 4066\n4: 4067\n4: 4068\n4: 4069\n4: 4070\n4: 4071\n4: 4072\n4: 4073\n4: 4074\n4: 4075\n4: 4076\n4: 4077\n4: 4078\n4: 4079\n4: 4080\n4: 4081\n4: 4082\n4: 4083\n4: 4084\n4: 4085\n4: 4086\n4: 4087\n4: 4088\n4: 4089\n4: 4090\n4: 4091\n4: 4092\n4: 4093\n4: 4094\n4: 4095\n4: 4096\n4: 4097\n4: 4098\n4: 4099\n4: 4100\n4: 4101\n4: 4102\n4: 4103\n4: 4104\n4: 4105\n4: 4106\n4: 4107\n4: 4108\n4: 4109\n4: 4110\n4: 4111\n4: 4112\n4: 4113\n4: 4114\n4: 4115\n4: 4116\n4: 4117\n4: 4118\n4: 4119\n4: 4120\n4: 4121\n4: 4122\n4: 4123\n4: 4124\n4: 4125\n4: 4126\n4: 4127\n4: 4128\n4: 4129\n4: 4130\n4: 4131\n4: 4132\n4: 4133\n4: 4134\n4: 4135\n4: 4136\n4: 4137\n4: 4138\n4: 4139\n4: 4140\n4: 4141\n4: 4142\n4: 4143\n4: 4144\n4: 4145\n4: 4146\n4: 4147\n4: 4148\n4: 4149\n4: 4150\n4: 4151\n4: 4152\n4: 4153\n4: 4154\n4: 4155\n4: 4156\n4: 4157\n4: 4158\n4: 4159\n4: 4160\n4: 4161\n4: 4162\n4: 4163\n4: 4164\n4: 4165\n4: 4166\n4: 4167\n4: 4168\n4: 4169\n4: 4170\n4: 4171\n4: 4172\n4: 4173\n4: 4174\n4: 4175\n4: 4176\n4: 4177\n4: 4178\n4: 4179\n4: 4180\n4: 4181\n4: 4182\n4: 4183\n4: 4184\n4: 4185\n4: 4186\n4: 4187\n4: 4188\n4: 4189\n4: 4190\n4: 4191\n4: 4192\n4: 4193\n4: 4194\n4: 4195\n4: 4196\n4: 4197\n4: 4198\n4: 4199\n4: 4200\n4: 4201\n4: 4202\n4: 4203\n4: 4204\n4: 4205\n4: 4206\n4: 4207\n4: 4208\n4: 4209\n4: 4210\n4: 4211\n4: 4212\n4: 4213\n4: 4214\n4: 4215\n4: 4216\n4: 4217\n4: 4218\n5: 4308\n5: 4309\n5: 4310\n5: 4311\n5: 4312\n5: 4313\n5: 4314\n5: 4315\n5: 4316\n5: 4317\n5: 4318\n5: 4319\n5: 4320\n5: 4321\n5: 4322\n5: 4323\n5: 4324\n5: 4325\n5: 4326\n5: 4327\n5: 4328\n5: 4329\n5: 4330\n5: 4331\n5: 4332\n5: 4333\n5: 4334\n5: 4335\n5: 4336\n5: 4337\n5: 4338\n5: 4339\n5: 4340\n5: 4341\n5: 4342\n5: 4343\n5: 4344\n5: 4345\n5: 4346\n5: 4347\n5: 4348\n5: 4349\n5: 4350\n5: 4351\n5: 4352\n5: 4353\n5: 4354\n5: 4355\n5: 4356\n5: 4357\n5: 4358\n5: 4359\n5: 4360\n5: 4361\n5: 4362\n5: 4363\n5: 4364\n5: 4365\n5: 4366\n5: 4367\n5: 4368\n5: 4369\n5: 4370\n5: 4371\n5: 4372\n5: 4373\n5: 4374\n5: 4375\n5: 4376\n5: 4377\n5: 4378\n5: 4379\n5: 4380\n5: 4381\n5: 4382\n5: 4383\n5: 4384\n5: 4385\n5: 4386\n5: 4387\n5: 4388\n5: 4389\n5: 4390\n5: 4391\n5: 4392\n5: 4393\n5: 4394\n5: 4395\n5: 4396\n5: 4397\n5: 4398\n5: 4399\n5: 4400\n5: 4401\n5: 4402\n5: 4403\n5: 4404\n5: 4405\n4: 4219\n4: 4220\n4: 4221\n4: 4222\n4: 4223\n4: 4224\n4: 4225\n4: 4226\n4: 4227\n4: 4228\n4: 4229\n4: 4230\n4: 4231\n4: 4232\n4: 4233\n4: 4234\n4: 4235\n4: 4236\n4: 4237\n4: 4238\n4: 4239\n4: 4240\n4: 4241\n4: 4242\n4: 4243\n4: 4244\n4: 4245\n4: 4246\n4: 4247\n4: 4248\n4: 4249\n4: 4250\n4: 4251\n4: 4252\n4: 4253\n4: 4254\n4: 4255\n4: 4256\n4: 4257\n4: 4258\n4: 4259\n4: 4260\n4: 4261\n4: 4262\n4: 4263\n4: 4264\n4: 4265\n4: 4266\n4: 4267\n4: 4268\n4: 4269\n4: 4270\n4: 4271\n4: 4272\n4: 4273\n4: 4274\n4: 4275\n4: 4276\n4: 4277\n4: 4278\n4: 4279\n4: 4280\n4: 4281\n4: 4282\n4: 4283\n4: 4284\n4: 4285\n4: 4286\n4: 4287\n4: 4288\n4: 4289\n4: 4290\n4: 4291\n4: 4292\n4: 4293\n4: 4294\n4: 4295\n4: 4296\n4: 4297\n4: 4298\n4: 4299\n4: 4300\n4: 4301\n4: 4302\n4: 4303\n4: 4304\n4: 4305\n4: 4306\n4: 4307\n4: 4308\n4: 4309\n4: 4310\n4: 4311\n4: 4312\n4: 4313\n4: 4314\n4: 4315\n4: 4316\n4: 4317\n4: 4318\n4: 4319\n4: 4320\n4: 4321\n4: 4322\n4: 4323\n4: 4324\n4: 4325\n4: 4326\n4: 4327\n4: 4328\n4: 4329\n4: 4330\n4: 4331\n4: 4332\n4: 4333\n4: 4334\n4: 4335\n4: 4336\n4: 4337\n4: 4338\n4: 4339\n4: 4340\n4: 4341\n4: 4342\n4: 4343\n4: 4344\n4: 4345\n4: 4346\n4: 4347\n4: 4348\n4: 4349\n4: 4350\n4: 4351\n4: 4352\n4: 4353\n4: 4354\n4: 4355\n4: 4356\n4: 4357\n4: 4358\n4: 4359\n4: 4360\n4: 4361\n4: 4362\n4: 4363\n4: 4364\n4: 4365\n4: 4366\n4: 4367\n4: 4368\n4: 4369\n4: 4370\n4: 4371\n4: 4372\n4: 4373\n4: 4374\n4: 4375\n4: 4376\n4: 4377\n4: 4378\n4: 4379\n4: 4380\n4: 4381\n4: 4382\n4: 4383\n4: 4384\n4: 4385\n4: 4386\n4: 4387\n4: 4388\n4: 4389\n4: 4390\n4: 4391\n4: 4392\n4: 4393\n4: 4394\n4: 4395\n4: 4396\n4: 4397\n4: 4398\n4: 4399\n4: 4400\n4: 4401\n4: 4402\n4: 4403\n4: 4404\n4: 4405\n4: 4406\n4: 4407\n4: 4408\n4: 4409\n4: 4410\n4: 4411\n4: 4412\n4: 4413\n4: 4414\n4: 4415\n4: 4416\n4: 4417\n4: 4418\n4: 4419\n4: 4420\n4: 4421\n4: 4422\n4: 4423\n4: 4424\n4: 4425\n4: 4426\n4: 4427\n4: 4428\n4: 4429\n4: 4430\n4: 4431\n4: 4432\n4: 4433\n4: 4434\n4: 4435\n4: 4436\n4: 4437\n4: 4438\n4: 4439\n4: 4440\n4: 4441\n4: 4442\n4: 4443\n4: 4444\n4: 4445\n4: 4446\n4: 4447\n4: 4448\n4: 4449\n4: 4450\n4: 4451\n4: 4452\n4: 4453\n4: 4454\n4: 4455\n4: 4456\n4: 4457\n4: 4458\n4: 4459\n4: 4460\n4: 4461\n4: 4462\n4: 4463\n4: 4464\n4: 4465\n4: 4466\n4: 4467\n4: 4468\n4: 4469\n4: 4470\n4: 4471\n4: 4472\n4: 4473\n4: 4474\n4: 4475\n4: 4476\n4: 4477\n4: 4478\n4: 4479\n4: 4480\n4: 4481\n4: 4482\n4: 4483\n4: 4484\n4: 4485\n4: 4486\n4: 4487\n4: 4488\n4: 4489\n4: 4490\n4: 4491\n4: 4492\n4: 4493\n4: 4494\n4: 4495\n4: 4496\n4: 4497\n4: 4498\n4: 4499\n4: 4500\n4: 4501\n4: 4502\n4: 4503\n4: 4504\n4: 4505\n4: 4506\n4: 4507\n4: 4508\n4: 4509\n4: 4510\n4: 4511\n4: 4512\n4: 4513\n4: 4514\n4: 4515\n4: 4516\n4: 4517\n4: 4518\n4: 4519\n4: 4520\n4: 4521\n4: 4522\n4: 4523\n4: 4524\n4: 4525\n4: 4526\n4: 4527\n4: 4528\n4: 4529\n4: 4530\n4: 4531\n4: 4532\n4: 4533\n4: 4534\n4: 4535\n4: 4536\n4: 4537\n4: 4538\n4: 4539\n4: 4540\n4: 4541\n4: 4542\n4: 4543\n4: 4544\n4: 4545\n4: 4546\n4: 4547\n4: 4548\n5: 4406\n5: 4407\n5: 4408\n5: 4409\n5: 4410\n5: 4411\n5: 4412\n5: 4413\n5: 4414\n5: 4415\n5: 4416\n5: 4417\n5: 4418\n5: 4419\n5: 4420\n5: 4421\n5: 4422\n5: 4423\n5: 4424\n5: 4425\n5: 4426\n5: 4427\n5: 4428\n5: 4429\n5: 4430\n5: 4431\n5: 4432\n5: 4433\n5: 4434\n5: 4435\n5: 4436\n5: 4437\n5: 4438\n5: 4439\n5: 4440\n5: 4441\n5: 4442\n5: 4443\n5: 4444\n5: 4445\n5: 4446\n5: 4447\n5: 4448\n5: 4449\n5: 4450\n5: 4451\n5: 4452\n5: 4453\n5: 4454\n5: 4455\n5: 4456\n5: 4457\n5: 4458\n5: 4459\n5: 4460\n5: 4461\n5: 4462\n5: 4463\n5: 4464\n5: 4465\n5: 4466\n5: 4467\n5: 4468\n5: 4469\n5: 4470\n5: 4471\n5: 4472\n5: 4473\n5: 4474\n5: 4475\n5: 4476\n5: 4477\n5: 4478\n5: 4479\n5: 4480\n5: 4481\n5: 4482\n5: 4483\n5: 4484\n5: 4485\n5: 4486\n5: 4487\n5: 4488\n5: 4489\n5: 4490\n5: 4491\n5: 4492\n5: 4493\n5: 4494\n5: 4495\n5: 4496\n5: 4497\n5: 4498\n5: 4499\n5: 4500\n5: 4501\n5: 4502\n5: 4503\n5: 4504\n5: 4505\n5: 4506\n5: 4507\n5: 4508\n5: 4509\n5: 4510\n5: 4511\n5: 4512\n5: 4513\n5: 4514\n5: 4515\n5: 4516\n5: 4517\n5: 4518\n5: 4519\n5: 4520\n5: 4521\n5: 4522\n5: 4523\n5: 4524\n5: 4525\n5: 4526\n5: 4527\n5: 4528\n5: 4529\n5: 4530\n5: 4531\n5: 4532\n5: 4533\n5: 4534\n5: 4535\n5: 4536\n5: 4537\n5: 4538\n5: 4539\n5: 4540\n5: 4541\n5: 4542\n5: 4543\n5: 4544\n5: 4545\n5: 4546\n5: 4547\n5: 4548\n5: 4549\n5: 4550\n5: 4551\n5: 4552\n5: 4553\n5: 4554\n5: 4555\n5: 4556\n5: 4557\n5: 4558\n5: 4559\n5: 4560\n5: 4561\n5: 4562\n5: 4563\n5: 4564\n5: 4565\n5: 4566\n5: 4567\n5: 4568\n5: 4569\n5: 4570\n5: 4571\n5: 4572\n5: 4573\n5: 4574\n5: 4575\n5: 4576\n5: 4577\n5: 4578\n5: 4579\n5: 4580\n5: 4581\n5: 4582\n5: 4583\n5: 4584\n5: 4585\n5: 4586\n5: 4587\n5: 4588\n5: 4589\n5: 4590\n5: 4591\n5: 4592\n5: 4593\n5: 4594\n5: 4595\n5: 4596\n5: 4597\n5: 4598\n5: 4599\n5: 4600\n5: 4601\n5: 4602\n5: 4603\n5: 4604\n5: 4605\n5: 4606\n5: 4607\n5: 4608\n5: 4609\n5: 4610\n5: 4611\n5: 4612\n5: 4613\n5: 4614\n5: 4615\n5: 4616\n5: 4617\n5: 4618\n5: 4619\n5: 4620\n5: 4621\n5: 4622\n5: 4623\n5: 4624\n5: 4625\n5: 4626\n5: 4627\n5: 4628\n5: 4629\n5: 4630\n5: 4631\n5: 4632\n5: 4633\n5: 4634\n5: 4635\n5: 4636\n5: 4637\n5: 4638\n5: 4639\n5: 4640\n5: 4641\n5: 4642\n5: 4643\n5: 4644\n5: 4645\n5: 4646\n5: 4647\n5: 4648\n5: 4649\n5: 4650\n5: 4651\n5: 4652\n5: 4653\n5: 4654\n5: 4655\n5: 4656\n5: 4657\n5: 4658\n5: 4659\n5: 4660\n5: 4661\n5: 4662\n5: 4663\n5: 4664\n5: 4665\n5: 4666\n5: 4667\n5: 4668\n5: 4669\n5: 4670\n5: 4671\n5: 4672\n5: 4673\n5: 4674\n5: 4675\n5: 4676\n5: 4677\n5: 4678\n5: 4679\n5: 4680\n5: 4681\n5: 4682\n5: 4683\n5: 4684\n5: 4685\n5: 4686\n5: 4687\n5: 4688\n5: 4689\n5: 4690\n5: 4691\n5: 4692\n5: 4693\n5: 4694\n5: 4695\n5: 4696\n5: 4697\n5: 4698\n5: 4699\n5: 4700\n5: 4701\n5: 4702\n5: 4703\n5: 4704\n5: 4705\n5: 4706\n5: 4707\n5: 4708\n5: 4709\n5: 4710\n5: 4711\n5: 4712\n5: 4713\n5: 4714\n5: 4715\n5: 4716\n5: 4717\n5: 4718\n4: 4549\n4: 4550\n4: 4551\n4: 4552\n4: 4553\n4: 4554\n4: 4555\n4: 4556\n4: 4557\n4: 4558\n4: 4559\n4: 4560\n4: 4561\n4: 4562\n4: 4563\n4: 4564\n4: 4565\n4: 4566\n4: 4567\n4: 4568\n4: 4569\n4: 4570\n4: 4571\n4: 4572\n4: 4573\n4: 4574\n4: 4575\n4: 4576\n4: 4577\n4: 4578\n4: 4579\n4: 4580\n4: 4581\n4: 4582\n4: 4583\n4: 4584\n4: 4585\n4: 4586\n4: 4587\n4: 4588\n4: 4589\n4: 4590\n4: 4591\n4: 4592\n4: 4593\n4: 4594\n4: 4595\n4: 4596\n4: 4597\n4: 4598\n4: 4599\n4: 4600\n4: 4601\n4: 4602\n4: 4603\n4: 4604\n4: 4605\n4: 4606\n4: 4607\n4: 4608\n4: 4609\n4: 4610\n4: 4611\n4: 4612\n4: 4613\n4: 4614\n4: 4615\n4: 4616\n4: 4617\n4: 4618\n4: 4619\n4: 4620\n4: 4621\n4: 4622\n4: 4623\n4: 4624\n4: 4625\n4: 4626\n4: 4627\n4: 4628\n4: 4629\n4: 4630\n4: 4631\n4: 4632\n4: 4633\n4: 4634\n4: 4635\n4: 4636\n4: 4637\n4: 4638\n4: 4639\n4: 4640\n4: 4641\n4: 4642\n4: 4643\n4: 4644\n4: 4645\n4: 4646\n4: 4647\n4: 4648\n4: 4649\n4: 4650\n4: 4651\n4: 4652\n4: 4653\n4: 4654\n4: 4655\n4: 4656\n4: 4657\n4: 4658\n4: 4659\n4: 4660\n4: 4661\n4: 4662\n4: 4663\n4: 4664\n4: 4665\n4: 4666\n4: 4667\n4: 4668\n4: 4669\n4: 4670\n4: 4671\n4: 4672\n4: 4673\n4: 4674\n4: 4675\n4: 4676\n4: 4677\n4: 4678\n4: 4679\n4: 4680\n4: 4681\n4: 4682\n4: 4683\n4: 4684\n4: 4685\n4: 4686\n4: 4687\n4: 4688\n4: 4689\n4: 4690\n4: 4691\n4: 4692\n4: 4693\n4: 4694\n4: 4695\n4: 4696\n4: 4697\n4: 4698\n4: 4699\n4: 4700\n4: 4701\n4: 4702\n4: 4703\n4: 4704\n4: 4705\n4: 4706\n4: 4707\n4: 4708\n4: 4709\n4: 4710\n4: 4711\n4: 4712\n4: 4713\n4: 4714\n4: 4715\n4: 4716\n4: 4717\n4: 4718\n4: 4719\n4: 4720\n4: 4721\n4: 4722\n4: 4723\n4: 4724\n4: 4725\n4: 4726\n4: 4727\n4: 4728\n4: 4729\n4: 4730\n4: 4731\n4: 4732\n4: 4733\n4: 4734\n4: 4735\n4: 4736\n4: 4737\n4: 4738\n4: 4739\n4: 4740\n4: 4741\n4: 4742\n4: 4743\n4: 4744\n4: 4745\n4: 4746\n4: 4747\n4: 4748\n4: 4749\n4: 4750\n5: 4719\n5: 4720\n5: 4721\n5: 4722\n5: 4723\n5: 4724\n5: 4725\n5: 4726\n5: 4727\n5: 4728\n5: 4729\n5: 4730\n5: 4731\n5: 4732\n5: 4733\n5: 4734\n5: 4735\n5: 4736\n5: 4737\n5: 4738\n5: 4739\n5: 4740\n5: 4741\n5: 4742\n5: 4743\n5: 4744\n5: 4745\n5: 4746\n5: 4747\n5: 4748\n5: 4749\n5: 4750\n5: 4751\n5: 4752\n5: 4753\n5: 4754\n5: 4755\n5: 4756\n5: 4757\n5: 4758\n5: 4759\n5: 4760\n5: 4761\n5: 4762\n5: 4763\n5: 4764\n5: 4765\n5: 4766\n5: 4767\n5: 4768\n5: 4769\n5: 4770\n5: 4771\n5: 4772\n5: 4773\n5: 4774\n5: 4775\n5: 4776\n5: 4777\n5: 4778\n5: 4779\n5: 4780\n5: 4781\n5: 4782\n5: 4783\n5: 4784\n5: 4785\n5: 4786\n5: 4787\n5: 4788\n5: 4789\n5: 4790\n5: 4791\n5: 4792\n5: 4793\n5: 4794\n5: 4795\n5: 4796\n5: 4797\n5: 4798\n5: 4799\n5: 4800\n5: 4801\n5: 4802\n5: 4803\n5: 4804\n5: 4805\n5: 4806\n5: 4807\n5: 4808\n5: 4809\n5: 4810\n5: 4811\n5: 4812\n5: 4813\n5: 4814\n5: 4815\n5: 4816\n5: 4817\n5: 4818\n5: 4819\n5: 4820\n5: 4821\n5: 4822\n5: 4823\n5: 4824\n5: 4825\n5: 4826\n5: 4827\n5: 4828\n5: 4829\n5: 4830\n5: 4831\n5: 4832\n5: 4833\n5: 4834\n5: 4835\n5: 4836\n5: 4837\n5: 4838\n5: 4839\n5: 4840\n5: 4841\n5: 4842\n5: 4843\n5: 4844\n5: 4845\n5: 4846\n5: 4847\n5: 4848\n5: 4849\n5: 4850\n5: 4851\n5: 4852\n5: 4853\n5: 4854\n5: 4855\n5: 4856\n5: 4857\n5: 4858\n5: 4859\n5: 4860\n5: 4861\n5: 4862\n5: 4863\n5: 4864\n5: 4865\n5: 4866\n5: 4867\n5: 4868\n5: 4869\n5: 4870\n5: 4871\n5: 4872\n5: 4873\n5: 4874\n5: 4875\n5: 4876\n5: 4877\n5: 4878\n5: 4879\n5: 4880\n5: 4881\n5: 4882\n5: 4883\n5: 4884\n5: 4885\n5: 4886\n5: 4887\n5: 4888\n5: 4889\n5: 4890\n5: 4891\n5: 4892\n5: 4893\n5: 4894\n5: 4895\n5: 4896\n5: 4897\n5: 4898\n5: 4899\n5: 4900\n5: 4901\n5: 4902\n5: 4903\n5: 4904\n5: 4905\n5: 4906\n5: 4907\n5: 4908\n5: 4909\n5: 4910\n5: 4911\n5: 4912\n5: 4913\n5: 4914\n5: 4915\n5: 4916\n5: 4917\n5: 4918\n5: 4919\n5: 4920\n5: 4921\n5: 4922\n5: 4923\n5: 4924\n5: 4925\n5: 4926\n5: 4927\n5: 4928\n5: 4929\n5: 4930\n5: 4931\n5: 4932\n5: 4933\n5: 4934\n5: 4935\n5: 4936\n5: 4937\n5: 4938\n5: 4939\n5: 4940\n5: 4941\n5: 4942\n5: 4943\n5: 4944\n5: 4945\n5: 4946\n5: 4947\n5: 4948\n5: 4949\n5: 4950\n5: 4951\n5: 4952\n5: 4953\n5: 4954\n5: 4955\n5: 4956\n5: 4957\n5: 4958\n5: 4959\n5: 4960\n5: 4961\n5: 4962\n5: 4963\n5: 4964\n5: 4965\n5: 4966\n5: 4967\n5: 4968\n5: 4969\n5: 4970\n5: 4971\n5: 4972\n5: 4973\n5: 4974\n5: 4975\n5: 4976\n5: 4977\n5: 4978\n5: 4979\n5: 4980\n5: 4981\n5: 4982\n5: 4983\n5: 4984\n5: 4985\n5: 4986\n5: 4987\n5: 4988\n5: 4989\n5: 4990\n5: 4991\n5: 4992\n5: 4993\n5: 4994\n5: 4995\n5: 4996\n5: 4997\n5: 4998\n5: 4999\n5: 5000\n5: 5001\n5: 5002\n5: 5003\n5: 5004\n4: 4751\n4: 4752\n4: 4753\n4: 4754\n4: 4755\n4: 4756\n4: 4757\n4: 4758\n4: 4759\n4: 4760\n4: 4761\n4: 4762\n4: 4763\n4: 4764\n4: 4765\n4: 4766\n4: 4767\n4: 4768\n4: 4769\n4: 4770\n4: 4771\n4: 4772\n4: 4773\n4: 4774\n4: 4775\n4: 4776\n4: 4777\n4: 4778\n4: 4779\n4: 4780\n4: 4781\n4: 4782\n4: 4783\n4: 4784\n4: 4785\n4: 4786\n4: 4787\n4: 4788\n4: 4789\n4: 4790\n4: 4791\n4: 4792\n4: 4793\n4: 4794\n4: 4795\n4: 4796\n4: 4797\n4: 4798\n4: 4799\n4: 4800\n4: 4801\n4: 4802\n4: 4803\n4: 4804\n4: 4805\n4: 4806\n4: 4807\n4: 4808\n4: 4809\n4: 4810\n4: 4811\n4: 4812\n4: 4813\n4: 4814\n4: 4815\n4: 4816\n4: 4817\n4: 4818\n4: 4819\n4: 4820\n4: 4821\n4: 4822\n4: 4823\n4: 4824\n4: 4825\n4: 4826\n4: 4827\n4: 4828\n4: 4829\n4: 4830\n4: 4831\n4: 4832\n4: 4833\n4: 4834\n4: 4835\n4: 4836\n4: 4837\n4: 4838\n4: 4839\n4: 4840\n4: 4841\n4: 4842\n4: 4843\n4: 4844\n4: 4845\n4: 4846\n4: 4847\n4: 4848\n4: 4849\n4: 4850\n4: 4851\n4: 4852\n4: 4853\n4: 4854\n4: 4855\n4: 4856\n4: 4857\n4: 4858\n4: 4859\n4: 4860\n4: 4861\n4: 4862\n4: 4863\n4: 4864\n4: 4865\n4: 4866\n4: 4867\n4: 4868\n4: 4869\n4: 4870\n4: 4871\n4: 4872\n4: 4873\n4: 4874\n4: 4875\n4: 4876\n4: 4877\n4: 4878\n4: 4879\n4: 4880\n4: 4881\n4: 4882\n4: 4883\n4: 4884\n4: 4885\n4: 4886\n4: 4887\n4: 4888\n4: 4889\n4: 4890\n4: 4891\n4: 4892\n4: 4893\n4: 4894\n4: 4895\n4: 4896\n4: 4897\n4: 4898\n4: 4899\n4: 4900\n4: 4901\n4: 4902\n4: 4903\n4: 4904\n4: 4905\n4: 4906\n4: 4907\n4: 4908\n4: 4909\n4: 4910\n4: 4911\n4: 4912\n4: 4913\n4: 4914\n4: 4915\n4: 4916\n4: 4917\n4: 4918\n4: 4919\n4: 4920\n4: 4921\n4: 4922\n4: 4923\n4: 4924\n4: 4925\n4: 4926\n4: 4927\n4: 4928\n4: 4929\n4: 4930\n4: 4931\n4: 4932\n4: 4933\n4: 4934\n4: 4935\n4: 4936\n4: 4937\n4: 4938\n4: 4939\n4: 4940\n4: 4941\n4: 4942\n4: 4943\n4: 4944\n4: 4945\n4: 4946\n4: 4947\n4: 4948\n4: 4949\n4: 4950\n4: 4951\n4: 4952\n4: 4953\n4: 4954\n4: 4955\n4: 4956\n4: 4957\n4: 4958\n4: 4959\n4: 4960\n4: 4961\n4: 4962\n4: 4963\n4: 4964\n4: 4965\n4: 4966\n4: 4967\n4: 4968\n4: 4969\n4: 4970\n4: 4971\n4: 4972\n4: 4973\n4: 4974\n4: 4975\n4: 4976\n4: 4977\n4: 4978\n4: 4979\n4: 4980\n4: 4981\n4: 4982\n4: 4983\n4: 4984\n4: 4985\n4: 4986\n4: 4987\n4: 4988\n4: 4989\n4: 4990\n4: 4991\n4: 4992\n4: 4993\n4: 4994\n4: 4995\n4: 4996\n4: 4997\n4: 4998\n4: 4999\n4: 5000\n5: 5005\n5: 5006\n5: 5007\n5: 5008\n5: 5009\n5: 5010\n5: 5011\n5: 5012\n5: 5013\n5: 5014\n5: 5015\n5: 5016\n5: 5017\n5: 5018\n5: 5019\n5: 5020\n5: 5021\n5: 5022\n5: 5023\n5: 5024\n5: 5025\n5: 5026\n5: 5027\n5: 5028\n5: 5029\n5: 5030\n5: 5031\n5: 5032\n5: 5033\n5: 5034\n5: 5035\n5: 5036\n5: 5037\n5: 5038\n5: 5039\n5: 5040\n5: 5041\n5: 5042\n5: 5043\n5: 5044\n5: 5045\n5: 5046\n5: 5047\n5: 5048\n5: 5049\n5: 5050\n5: 5051\n5: 5052\n5: 5053\n5: 5054\n5: 5055\n5: 5056\n5: 5057\n5: 5058\n5: 5059\n5: 5060\n5: 5061\n5: 5062\n5: 5063\n5: 5064\n5: 5065\n5: 5066\n5: 5067\n5: 5068\n5: 5069\n5: 5070\n5: 5071\n5: 5072\n5: 5073\n5: 5074\n5: 5075\n5: 5076\n5: 5077\n5: 5078\n5: 5079\n5: 5080\n5: 5081\n5: 5082\n5: 5083\n5: 5084\n5: 5085\n5: 5086\n5: 5087\n5: 5088\n5: 5089\n5: 5090\n5: 5091\n5: 5092\n5: 5093\n5: 5094\n5: 5095\n5: 5096\n5: 5097\n5: 5098\n5: 5099\n5: 5100\n5: 5101\n5: 5102\n5: 5103\n5: 5104\n5: 5105\n5: 5106\n5: 5107\n5: 5108\n5: 5109\n5: 5110\n5: 5111\n5: 5112\n5: 5113\n5: 5114\n5: 5115\n5: 5116\n5: 5117\n5: 5118\n5: 5119\n5: 5120\n5: 5121\n5: 5122\n5: 5123\n5: 5124\n5: 5125\n5: 5126\n5: 5127\n5: 5128\n5: 5129\n5: 5130\n5: 5131\n5: 5132\n5: 5133\n5: 5134\n5: 5135\n5: 5136\n5: 5137\n5: 5138\n5: 5139\n5: 5140\n5: 5141\n5: 5142\n5: 5143\n5: 5144\n5: 5145\n5: 5146\n5: 5147\n5: 5148\n5: 5149\n5: 5150\n5: 5151\n5: 5152\n5: 5153\n5: 5154\n5: 5155\n5: 5156\n5: 5157\n5: 5158\n5: 5159\n5: 5160\n5: 5161\n5: 5162\n5: 5163\n5: 5164\n5: 5165\n5: 5166\n5: 5167\n5: 5168\n5: 5169\n5: 5170\n5: 5171\n5: 5172\n5: 5173\n5: 5174\n5: 5175\n5: 5176\n5: 5177\n5: 5178\n5: 5179\n5: 5180\n5: 5181\n5: 5182\n5: 5183\n5: 5184\n5: 5185\n5: 5186\n5: 5187\n5: 5188\n5: 5189\n5: 5190\n5: 5191\n5: 5192\n5: 5193\n5: 5194\n5: 5195\n5: 5196\n5: 5197\n5: 5198\n5: 5199\n5: 5200\n5: 5201\n5: 5202\n5: 5203\n5: 5204\n5: 5205\n5: 5206\n5: 5207\n5: 5208\n5: 5209\n5: 5210\n5: 5211\n5: 5212\n5: 5213\n5: 5214\n5: 5215\n5: 5216\n5: 5217\n5: 5218\n5: 5219\n5: 5220\n5: 5221\n5: 5222\n5: 5223\n5: 5224\n5: 5225\n5: 5226\n5: 5227\n5: 5228\n5: 5229\n5: 5230\n5: 5231\n5: 5232\n5: 5233\n5: 5234\n5: 5235\n5: 5236\n5: 5237\n5: 5238\n5: 5239\n5: 5240\n5: 5241\n5: 5242\n5: 5243\n5: 5244\n5: 5245\n5: 5246\n5: 5247\n5: 5248\n5: 5249\n5: 5250\n5: 5251\n5: 5252\n5: 5253\n5: 5254\n5: 5255\n5: 5256\n5: 5257\n5: 5258\n5: 5259\n5: 5260\n5: 5261\n5: 5262\n5: 5263\n5: 5264\n5: 5265\n5: 5266\n5: 5267\n5: 5268\n5: 5269\n5: 5270\n5: 5271\n5: 5272\n5: 5273\n5: 5274\n5: 5275\n5: 5276\n5: 5277\n5: 5278\n5: 5279\n5: 5280\n5: 5281\n5: 5282\n5: 5283\n5: 5284\n5: 5285\n5: 5286\n5: 5287\n5: 5288\n5: 5289\n5: 5290\n5: 5291\n5: 5292\n5: 5293\n5: 5294\n5: 5295\n5: 5296\n5: 5297\n5: 5298\n5: 5299\n5: 5300\n5: 5301\n5: 5302\n5: 5303\n5: 5304\n5: 5305\n5: 5306\n5: 5307\n5: 5308\n5: 5309\n5: 5310\n5: 5311\n5: 5312\n5: 5313\n5: 5314\n5: 5315\n5: 5316\n5: 5317\n5: 5318\n5: 5319\n5: 5320\n5: 5321\n5: 5322\n5: 5323\n5: 5324\n5: 5325\n5: 5326\n5: 5327\n5: 5328\n5: 5329\n5: 5330\n5: 5331\n5: 5332\n5: 5333\n5: 5334\n5: 5335\n5: 5336\n5: 5337\n5: 5338\n5: 5339\n5: 5340\n5: 5341\n5: 5342\n5: 5343\n5: 5344\n5: 5345\n5: 5346\n5: 5347\n5: 5348\n5: 5349\n5: 5350\n5: 5351\n5: 5352\n5: 5353\n5: 5354\n5: 5355\n5: 5356\n5: 5357\n5: 5358\n5: 5359\n5: 5360\n5: 5361\n5: 5362\n5: 5363\n5: 5364\n5: 5365\n5: 5366\n5: 5367\n5: 5368\n5: 5369\n5: 5370\n5: 5371\n5: 5372\n5: 5373\n5: 5374\n5: 5375\n5: 5376\n5: 5377\n5: 5378\n5: 5379\n5: 5380\n5: 5381\n5: 5382\n5: 5383\n5: 5384\n5: 5385\n5: 5386\n5: 5387\n5: 5388\n5: 5389\n5: 5390\n5: 5391\n5: 5392\n5: 5393\n5: 5394\n5: 5395\n5: 5396\n5: 5397\n5: 5398\n5: 5399\n5: 5400\n5: 5401\n5: 5402\n5: 5403\n5: 5404\n5: 5405\n5: 5406\n5: 5407\n5: 5408\n5: 5409\n5: 5410\n5: 5411\n5: 5412\n5: 5413\n5: 5414\n5: 5415\n5: 5416\n5: 5417\n5: 5418\n5: 5419\n5: 5420\n5: 5421\n5: 5422\n5: 5423\n5: 5424\n5: 5425\n5: 5426\n5: 5427\n5: 5428\n5: 5429\n5: 5430\n5: 5431\n5: 5432\n5: 5433\n5: 5434\n5: 5435\n5: 5436\n5: 5437\n5: 5438\n5: 5439\n5: 5440\n5: 5441\n5: 5442\n5: 5443\n5: 5444\n5: 5445\n5: 5446\n5: 5447\n5: 5448\n5: 5449\n5: 5450\n5: 5451\n5: 5452\n5: 5453\n5: 5454\n5: 5455\n5: 5456\n5: 5457\n5: 5458\n5: 5459\n5: 5460\n5: 5461\n5: 5462\n5: 5463\n5: 5464\n5: 5465\n5: 5466\n5: 5467\n5: 5468\n5: 5469\n5: 5470\n5: 5471\n5: 5472\n5: 5473\n5: 5474\n5: 5475\n5: 5476\n5: 5477\n5: 5478\n5: 5479\n5: 5480\n5: 5481\n5: 5482\n5: 5483\n5: 5484\n5: 5485\n5: 5486\n5: 5487\n5: 5488\n5: 5489\n5: 5490\n5: 5491\n5: 5492\n5: 5493\n5: 5494\n5: 5495\n5: 5496\n5: 5497\n5: 5498\n5: 5499\n5: 5500\n5: 5501\n5: 5502\n5: 5503\n5: 5504\n5: 5505\n5: 5506\n5: 5507\n5: 5508\n5: 5509\n5: 5510\n5: 5511\n5: 5512\n5: 5513\n5: 5514\n5: 5515\n5: 5516\n5: 5517\n"
  },
  {
    "path": "threads/script.example02",
    "content": "4: 1\n4: 2\n4: 3\n4: 4\n4: 5\n4: 6\n4: 7\n4: 8\n4: 9\n4: 10\n4: 11\n4: 12\n4: 13\n4: 14\n4: 15\n4: 16\n4: 17\n4: 18\n4: 19\n4: 20\n4: 21\n4: 22\n4: 23\n4: 24\n4: 25\n4: 26\n4: 27\n4: 28\n4: 29\n4: 30\n4: 31\n4: 32\n4: 33\n4: 34\n4: 35\n4: 36\n4: 37\n4: 38\n4: 39\n4: 40\n4: 41\n4: 42\n4: 43\n4: 44\n4: 45\n4: 46\n4: 47\n4: 48\n4: 49\n4: 50\n4: 51\n4: 52\n4: 53\n4: 54\n4: 55\n4: 56\n4: 57\n4: 58\n4: 59\n4: 60\n4: 61\n4: 62\n4: 63\n4: 64\n4: 65\n4: 66\n4: 67\n4: 68\n4: 69\n4: 70\n4: 71\n4: 72\n4: 73\n4: 74\n4: 75\n4: 76\n4: 77\n4: 78\n4: 79\n4: 80\n4: 81\n4: 82\n4: 83\n4: 84\n4: 85\n4: 86\n4: 87\n4: 88\n4: 89\n4: 90\n4: 91\n4: 92\n4: 93\n4: 94\n4: 95\n4: 96\n4: 97\n4: 98\n4: 99\n4: 100\n4: 101\n4: 102\n4: 103\n4: 104\n4: 105\n4: 106\n4: 107\n4: 108\n4: 109\n4: 110\n4: 111\n4: 112\n4: 113\n4: 114\n4: 115\n4: 116\n4: 117\n4: 118\n4: 119\n4: 120\n4: 121\n4: 122\n4: 123\n4: 124\n4: 125\n4: 126\n4: 127\n4: 128\n4: 129\n4: 130\n4: 131\n4: 132\n4: 133\n4: 134\n4: 135\n4: 136\n4: 137\n4: 138\n4: 139\n4: 140\n4: 141\n4: 142\n4: 143\n4: 144\n4: 145\n4: 146\n4: 147\n4: 148\n4: 149\n4: 150\n4: 151\n4: 152\n4: 153\n4: 154\n4: 155\n4: 156\n4: 157\n4: 158\n4: 159\n4: 160\n4: 161\n4: 162\n4: 163\n4: 164\n4: 165\n4: 166\n4: 167\n4: 168\n4: 169\n4: 170\n4: 171\n4: 172\n4: 173\n4: 174\n4: 175\n4: 176\n4: 177\n4: 178\n4: 179\n4: 180\n4: 181\n4: 182\n4: 183\n4: 184\n4: 185\n4: 186\n4: 187\n4: 188\n4: 189\n4: 190\n4: 191\n4: 192\n4: 193\n4: 194\n4: 195\n4: 196\n4: 197\n4: 198\n4: 199\n4: 200\n4: 201\n4: 202\n4: 203\n4: 204\n4: 205\n4: 206\n4: 207\n4: 208\n4: 209\n4: 210\n4: 211\n4: 212\n4: 213\n4: 214\n4: 215\n4: 216\n4: 217\n4: 218\n4: 219\n4: 220\n4: 221\n4: 222\n4: 223\n4: 224\n4: 225\n4: 226\n4: 227\n4: 228\n4: 229\n4: 230\n4: 231\n4: 232\n4: 233\n4: 234\n4: 235\n4: 236\n4: 237\n4: 238\n4: 239\n4: 240\n4: 241\n4: 242\n4: 243\n4: 244\n4: 245\n4: 246\n4: 247\n4: 248\n4: 249\n4: 250\n4: 251\n4: 252\n4: 253\n4: 254\n4: 255\n4: 256\n4: 257\n4: 258\n4: 259\n4: 260\n4: 261\n4: 262\n4: 263\n4: 264\n4: 265\n4: 266\n4: 267\n4: 268\n4: 269\n4: 270\n4: 271\n4: 272\n4: 273\n4: 274\n4: 275\n4: 276\n4: 277\n4: 278\n4: 279\n4: 280\n4: 281\n4: 282\n4: 283\n4: 284\n4: 285\n4: 286\n4: 287\n4: 288\n4: 289\n4: 290\n4: 291\n4: 292\n4: 293\n4: 294\n4: 295\n4: 296\n4: 297\n4: 298\n4: 299\n4: 300\n4: 301\n4: 302\n4: 303\n4: 304\n4: 305\n4: 306\n4: 307\n4: 308\n4: 309\n4: 310\n4: 311\n4: 312\n4: 313\n4: 314\n4: 315\n4: 316\n4: 317\n4: 318\n4: 319\n4: 320\n4: 321\n4: 322\n4: 323\n4: 324\n4: 325\n4: 326\n4: 327\n4: 328\n4: 329\n4: 330\n4: 331\n4: 332\n4: 333\n4: 334\n4: 335\n4: 336\n4: 337\n4: 338\n4: 339\n4: 340\n4: 341\n4: 342\n4: 343\n4: 344\n4: 345\n4: 346\n4: 347\n4: 348\n4: 349\n4: 350\n4: 351\n4: 352\n4: 353\n4: 354\n4: 355\n4: 356\n4: 357\n4: 358\n4: 359\n4: 360\n4: 361\n4: 362\n4: 363\n4: 364\n4: 365\n4: 366\n4: 367\n4: 368\n4: 369\n4: 370\n4: 371\n4: 372\n4: 373\n4: 374\n4: 375\n4: 376\n4: 377\n4: 378\n4: 379\n4: 380\n4: 381\n4: 382\n4: 383\n4: 384\n4: 385\n4: 386\n4: 387\n4: 388\n4: 389\n4: 390\n4: 391\n4: 392\n4: 393\n4: 394\n4: 395\n4: 396\n4: 397\n4: 398\n4: 399\n4: 400\n4: 401\n4: 402\n4: 403\n4: 404\n4: 405\n4: 406\n4: 407\n4: 408\n4: 409\n4: 410\n4: 411\n4: 412\n4: 413\n4: 414\n4: 415\n4: 416\n4: 417\n4: 418\n4: 419\n4: 420\n4: 421\n4: 422\n4: 423\n4: 424\n4: 425\n4: 426\n4: 427\n4: 428\n4: 429\n4: 430\n4: 431\n4: 432\n4: 433\n4: 434\n4: 435\n4: 436\n4: 437\n4: 438\n4: 439\n4: 440\n4: 441\n4: 442\n4: 443\n4: 444\n4: 445\n4: 446\n4: 447\n4: 448\n4: 449\n4: 450\n4: 451\n4: 452\n4: 453\n4: 454\n4: 455\n4: 456\n4: 457\n4: 458\n4: 459\n4: 460\n4: 461\n4: 462\n4: 463\n4: 464\n4: 465\n4: 466\n4: 467\n4: 468\n4: 469\n4: 470\n4: 471\n4: 472\n4: 473\n4: 474\n4: 475\n4: 476\n4: 477\n4: 478\n4: 479\n4: 480\n4: 481\n4: 482\n4: 483\n4: 484\n4: 485\n4: 486\n4: 487\n4: 488\n4: 489\n4: 490\n4: 491\n4: 492\n4: 493\n4: 494\n4: 495\n4: 496\n4: 497\n4: 498\n4: 499\n4: 500\n4: 501\n4: 502\n4: 503\n4: 504\n4: 505\n4: 506\n4: 507\n4: 508\n4: 509\n4: 510\n4: 511\n4: 512\n4: 513\n4: 514\n4: 515\n4: 516\n4: 517\n4: 518\n4: 519\n4: 520\n4: 521\n4: 522\n4: 523\n4: 524\n4: 525\n4: 526\n4: 527\n4: 528\n4: 529\n4: 530\n4: 531\n4: 532\n4: 533\n4: 534\n4: 535\n4: 536\n4: 537\n4: 538\n4: 539\n4: 540\n4: 541\n4: 542\n4: 543\n4: 544\n4: 545\n4: 546\n4: 547\n4: 548\n4: 549\n4: 550\n4: 551\n4: 552\n4: 553\n4: 554\n4: 555\n4: 556\n4: 557\n4: 558\n4: 559\n4: 560\n4: 561\n4: 562\n4: 563\n4: 564\n4: 565\n4: 566\n4: 567\n4: 568\n4: 569\n4: 570\n4: 571\n4: 572\n4: 573\n4: 574\n4: 575\n4: 576\n4: 577\n4: 578\n4: 579\n4: 580\n4: 581\n4: 582\n4: 583\n4: 584\n4: 585\n4: 586\n4: 587\n4: 588\n4: 589\n4: 590\n4: 591\n4: 592\n4: 593\n4: 594\n4: 595\n4: 596\n4: 597\n4: 598\n4: 599\n4: 600\n4: 601\n4: 602\n4: 603\n4: 604\n4: 605\n4: 606\n4: 607\n4: 608\n4: 609\n4: 610\n4: 611\n4: 612\n4: 613\n4: 614\n4: 615\n4: 616\n4: 617\n4: 618\n4: 619\n4: 620\n4: 621\n4: 622\n4: 623\n4: 624\n4: 625\n4: 626\n4: 627\n4: 628\n4: 629\n4: 630\n4: 631\n4: 632\n4: 633\n4: 634\n4: 635\n4: 636\n4: 637\n4: 638\n4: 639\n4: 640\n4: 641\n4: 642\n4: 643\n4: 644\n4: 645\n4: 646\n4: 647\n4: 648\n4: 649\n4: 650\n4: 651\n4: 652\n4: 653\n4: 654\n4: 655\n4: 656\n4: 657\n4: 658\n4: 659\n4: 660\n4: 661\n4: 662\n4: 663\n4: 664\n4: 665\n4: 666\n4: 667\n4: 668\n4: 669\n4: 670\n4: 671\n4: 672\n4: 673\n4: 674\n4: 675\n4: 676\n4: 677\n4: 678\n4: 679\n4: 680\n4: 681\n4: 682\n4: 683\n4: 684\n4: 685\n4: 686\n4: 687\n4: 688\n4: 689\n4: 690\n4: 691\n4: 692\n4: 693\n4: 694\n4: 695\n4: 696\n4: 697\n4: 698\n4: 699\n4: 700\n4: 701\n4: 702\n4: 703\n4: 704\n4: 705\n4: 706\n4: 707\n4: 708\n4: 709\n4: 710\n4: 711\n4: 712\n4: 713\n4: 714\n4: 715\n4: 716\n4: 717\n4: 718\n4: 719\n4: 720\n4: 721\n4: 722\n4: 723\n4: 724\n4: 725\n4: 726\n4: 727\n4: 728\n4: 729\n4: 730\n4: 731\n4: 732\n4: 733\n4: 734\n4: 735\n4: 736\n4: 737\n4: 738\n4: 739\n4: 740\n4: 741\n4: 742\n4: 743\n4: 744\n4: 745\n4: 746\n4: 747\n4: 748\n4: 749\n4: 750\n4: 751\n4: 752\n4: 753\n4: 754\n4: 755\n4: 756\n4: 757\n4: 758\n4: 759\n4: 760\n4: 761\n4: 762\n4: 763\n4: 764\n4: 765\n4: 766\n4: 767\n4: 768\n4: 769\n4: 770\n4: 771\n4: 772\n4: 773\n4: 774\n4: 775\n4: 776\n4: 777\n4: 778\n4: 779\n4: 780\n4: 781\n4: 782\n5: 783\n5: 784\n5: 785\n5: 786\n5: 787\n5: 788\n5: 789\n5: 790\n5: 791\n5: 792\n5: 793\n5: 794\n5: 795\n5: 796\n5: 797\n5: 798\n5: 799\n5: 800\n5: 801\n5: 802\n5: 803\n5: 804\n5: 805\n5: 806\n5: 807\n5: 808\n5: 809\n5: 810\n5: 811\n5: 812\n5: 813\n5: 814\n5: 815\n5: 816\n5: 817\n5: 818\n5: 819\n5: 820\n5: 821\n5: 822\n5: 823\n5: 824\n5: 825\n5: 826\n5: 827\n5: 828\n5: 829\n5: 830\n5: 831\n5: 832\n5: 833\n5: 834\n5: 835\n5: 836\n5: 837\n5: 838\n5: 839\n5: 840\n5: 841\n5: 842\n5: 843\n5: 844\n5: 845\n5: 846\n5: 847\n5: 848\n5: 849\n5: 850\n5: 851\n5: 852\n5: 853\n5: 854\n5: 855\n5: 856\n5: 857\n5: 858\n5: 859\n5: 860\n5: 861\n5: 862\n5: 863\n5: 864\n5: 865\n5: 866\n5: 867\n5: 868\n5: 869\n5: 870\n5: 871\n5: 872\n5: 873\n5: 874\n5: 875\n5: 876\n5: 877\n5: 878\n5: 879\n5: 880\n5: 881\n5: 882\n5: 883\n5: 884\n5: 885\n5: 886\n5: 887\n5: 888\n5: 889\n5: 890\n5: 891\n5: 892\n5: 893\n5: 894\n5: 895\n5: 896\n5: 897\n5: 898\n5: 899\n5: 900\n5: 901\n5: 902\n5: 903\n5: 904\n5: 905\n5: 906\n5: 907\n5: 908\n5: 909\n5: 910\n5: 911\n5: 912\n5: 913\n5: 914\n5: 915\n5: 916\n5: 917\n5: 918\n5: 919\n5: 920\n5: 921\n5: 922\n5: 923\n5: 924\n5: 925\n5: 926\n5: 927\n5: 928\n5: 929\n5: 930\n5: 931\n5: 932\n5: 933\n5: 934\n5: 935\n5: 936\n5: 937\n5: 938\n5: 939\n5: 940\n5: 941\n5: 942\n5: 943\n5: 944\n5: 945\n5: 946\n5: 947\n5: 948\n5: 949\n5: 950\n5: 951\n5: 952\n5: 953\n5: 954\n5: 955\n5: 956\n5: 957\n5: 958\n5: 959\n5: 960\n5: 961\n5: 962\n5: 963\n5: 964\n5: 965\n5: 966\n5: 967\n5: 968\n5: 969\n5: 970\n5: 971\n5: 972\n5: 973\n5: 974\n5: 975\n5: 976\n5: 977\n5: 978\n5: 979\n5: 980\n5: 981\n5: 982\n5: 983\n5: 984\n5: 985\n5: 986\n5: 987\n5: 988\n5: 989\n5: 990\n5: 991\n5: 992\n5: 993\n5: 994\n5: 995\n5: 996\n5: 997\n5: 998\n5: 999\n5: 1000\n5: 1001\n5: 1002\n5: 1003\n5: 1004\n5: 1005\n5: 1006\n5: 1007\n5: 1008\n5: 1009\n5: 1010\n5: 1011\n5: 1012\n5: 1013\n5: 1014\n5: 1015\n5: 1016\n5: 1017\n5: 1018\n5: 1019\n5: 1020\n5: 1021\n5: 1022\n5: 1023\n5: 1024\n5: 1025\n5: 1026\n5: 1027\n5: 1028\n5: 1029\n5: 1030\n5: 1031\n5: 1032\n5: 1033\n5: 1034\n5: 1035\n5: 1036\n5: 1037\n5: 1038\n5: 1039\n5: 1040\n5: 1041\n5: 1042\n5: 1043\n5: 1044\n5: 1045\n5: 1046\n5: 1047\n5: 1048\n5: 1049\n5: 1050\n5: 1051\n5: 1052\n5: 1053\n5: 1054\n5: 1055\n5: 1056\n5: 1057\n5: 1058\n5: 1059\n5: 1060\n5: 1061\n5: 1062\n5: 1063\n5: 1064\n5: 1065\n5: 1066\n5: 1067\n5: 1068\n5: 1069\n5: 1070\n5: 1071\n5: 1072\n5: 1073\n5: 1074\n5: 1075\n5: 1076\n5: 1077\n5: 1078\n5: 1079\n5: 1080\n5: 1081\n5: 1082\n5: 1083\n5: 1084\n5: 1085\n5: 1086\n5: 1087\n5: 1088\n5: 1089\n5: 1090\n5: 1091\n5: 1092\n5: 1093\n5: 1094\n5: 1095\n5: 1096\n5: 1097\n5: 1098\n5: 1099\n5: 1100\n5: 1101\n5: 1102\n5: 1103\n5: 1104\n5: 1105\n5: 1106\n5: 1107\n5: 1108\n5: 1109\n5: 1110\n5: 1111\n5: 1112\n5: 1113\n5: 1114\n5: 1115\n5: 1116\n5: 1117\n5: 1118\n5: 1119\n5: 1120\n5: 1121\n5: 1122\n5: 1123\n5: 1124\n5: 1125\n5: 1126\n5: 1127\n5: 1128\n5: 1129\n5: 1130\n5: 1131\n5: 1132\n5: 1133\n5: 1134\n5: 1135\n5: 1136\n5: 1137\n5: 1138\n5: 1139\n5: 1140\n5: 1141\n5: 1142\n5: 1143\n5: 1144\n5: 1145\n5: 1146\n5: 1147\n5: 1148\n5: 1149\n5: 1150\n5: 1151\n5: 1152\n5: 1153\n5: 1154\n5: 1155\n5: 1156\n5: 1157\n5: 1158\n5: 1159\n5: 1160\n5: 1161\n5: 1162\n5: 1163\n5: 1164\n5: 1165\n5: 1166\n5: 1167\n5: 1168\n5: 1169\n5: 1170\n5: 1171\n5: 1172\n5: 1173\n5: 1174\n5: 1175\n5: 1176\n5: 1177\n5: 1178\n5: 1179\n5: 1180\n5: 1181\n4: 1182\n4: 1183\n4: 1184\n4: 1185\n4: 1186\n4: 1187\n4: 1188\n4: 1189\n4: 1190\n4: 1191\n4: 1192\n4: 1193\n4: 1194\n4: 1195\n4: 1196\n4: 1197\n4: 1198\n4: 1199\n4: 1200\n4: 1201\n4: 1202\n4: 1203\n4: 1204\n4: 1205\n4: 1206\n4: 1207\n4: 1208\n4: 1209\n4: 1210\n4: 1211\n4: 1212\n4: 1213\n4: 1214\n4: 1215\n4: 1216\n4: 1217\n4: 1218\n4: 1219\n4: 1220\n4: 1221\n4: 1222\n4: 1223\n4: 1224\n4: 1225\n4: 1226\n4: 1227\n4: 1228\n4: 1229\n4: 1230\n4: 1231\n4: 1232\n4: 1233\n4: 1234\n4: 1235\n4: 1236\n4: 1237\n4: 1238\n4: 1239\n4: 1240\n4: 1241\n4: 1242\n5: 1243\n5: 1244\n5: 1245\n5: 1246\n5: 1247\n5: 1248\n5: 1249\n5: 1250\n5: 1251\n5: 1252\n5: 1253\n5: 1254\n5: 1255\n5: 1256\n5: 1257\n5: 1258\n5: 1259\n5: 1260\n5: 1261\n5: 1262\n5: 1263\n5: 1264\n5: 1265\n5: 1266\n5: 1267\n5: 1268\n5: 1269\n5: 1270\n5: 1271\n5: 1272\n5: 1273\n5: 1274\n5: 1275\n5: 1276\n5: 1277\n5: 1278\n5: 1279\n5: 1280\n5: 1281\n5: 1282\n5: 1283\n5: 1284\n5: 1285\n5: 1286\n5: 1287\n5: 1288\n5: 1289\n5: 1290\n5: 1291\n5: 1292\n5: 1293\n5: 1294\n5: 1295\n5: 1296\n5: 1297\n5: 1298\n5: 1299\n5: 1300\n5: 1301\n5: 1302\n5: 1303\n5: 1304\n5: 1305\n5: 1306\n5: 1307\n5: 1308\n5: 1309\n5: 1310\n5: 1311\n5: 1312\n5: 1313\n5: 1314\n5: 1315\n5: 1316\n5: 1317\n5: 1318\n5: 1319\n5: 1320\n5: 1321\n5: 1322\n5: 1323\n5: 1324\n5: 1325\n5: 1326\n5: 1327\n5: 1328\n5: 1329\n5: 1330\n5: 1331\n5: 1332\n5: 1333\n5: 1334\n5: 1335\n5: 1336\n5: 1337\n5: 1338\n5: 1339\n5: 1340\n5: 1341\n5: 1342\n5: 1343\n5: 1344\n5: 1345\n5: 1346\n5: 1347\n5: 1348\n5: 1349\n5: 1350\n5: 1351\n5: 1352\n5: 1353\n5: 1354\n5: 1355\n5: 1356\n5: 1357\n5: 1358\n5: 1359\n5: 1360\n5: 1361\n5: 1362\n5: 1363\n5: 1364\n5: 1365\n5: 1366\n5: 1367\n5: 1368\n5: 1369\n5: 1370\n5: 1371\n5: 1372\n5: 1373\n5: 1374\n5: 1375\n5: 1376\n5: 1377\n5: 1378\n5: 1379\n5: 1380\n5: 1381\n5: 1382\n5: 1383\n5: 1384\n5: 1385\n5: 1386\n5: 1387\n5: 1388\n5: 1389\n5: 1390\n5: 1391\n5: 1392\n5: 1393\n5: 1394\n5: 1395\n5: 1396\n5: 1397\n5: 1398\n5: 1399\n5: 1400\n5: 1401\n5: 1402\n5: 1403\n5: 1404\n5: 1405\n5: 1406\n5: 1407\n5: 1408\n5: 1409\n5: 1410\n5: 1411\n5: 1412\n5: 1413\n5: 1414\n5: 1415\n5: 1416\n5: 1417\n5: 1418\n5: 1419\n5: 1420\n5: 1421\n5: 1422\n5: 1423\n5: 1424\n5: 1425\n5: 1426\n5: 1427\n5: 1428\n5: 1429\n5: 1430\n5: 1431\n5: 1432\n5: 1433\n5: 1434\n5: 1435\n5: 1436\n5: 1437\n5: 1438\n5: 1439\n5: 1440\n5: 1441\n5: 1442\n5: 1443\n5: 1444\n5: 1445\n5: 1446\n5: 1447\n5: 1448\n5: 1449\n5: 1450\n5: 1451\n5: 1452\n5: 1453\n5: 1454\n5: 1455\n5: 1456\n5: 1457\n5: 1458\n5: 1459\n5: 1460\n5: 1461\n5: 1462\n5: 1463\n5: 1464\n5: 1465\n5: 1466\n5: 1467\n5: 1468\n5: 1469\n5: 1470\n5: 1471\n5: 1472\n5: 1473\n5: 1474\n5: 1475\n5: 1476\n5: 1477\n5: 1478\n5: 1479\n5: 1480\n5: 1481\n5: 1482\n5: 1483\n5: 1484\n5: 1485\n5: 1486\n5: 1487\n5: 1488\n5: 1489\n5: 1490\n5: 1491\n5: 1492\n5: 1493\n5: 1494\n5: 1495\n5: 1496\n5: 1497\n5: 1498\n5: 1499\n5: 1500\n5: 1501\n5: 1502\n5: 1503\n5: 1504\n5: 1505\n5: 1506\n5: 1507\n5: 1508\n5: 1509\n5: 1510\n5: 1511\n5: 1512\n5: 1513\n5: 1514\n5: 1515\n5: 1516\n5: 1517\n5: 1518\n5: 1519\n5: 1520\n5: 1521\n5: 1522\n5: 1523\n5: 1524\n5: 1525\n5: 1526\n5: 1527\n5: 1528\n5: 1529\n5: 1530\n5: 1531\n5: 1532\n5: 1533\n5: 1534\n5: 1535\n5: 1536\n5: 1537\n5: 1538\n5: 1539\n5: 1540\n5: 1541\n4: 1542\n4: 1543\n4: 1544\n4: 1545\n4: 1546\n4: 1547\n4: 1548\n4: 1549\n4: 1550\n4: 1551\n4: 1552\n4: 1553\n4: 1554\n4: 1555\n4: 1556\n4: 1557\n4: 1558\n4: 1559\n4: 1560\n4: 1561\n4: 1562\n4: 1563\n4: 1564\n4: 1565\n4: 1566\n4: 1567\n4: 1568\n4: 1569\n4: 1570\n4: 1571\n4: 1572\n4: 1573\n4: 1574\n4: 1575\n4: 1576\n4: 1577\n4: 1578\n4: 1579\n4: 1580\n4: 1581\n4: 1582\n4: 1583\n4: 1584\n4: 1585\n4: 1586\n4: 1587\n4: 1588\n4: 1589\n4: 1590\n4: 1591\n4: 1592\n4: 1593\n4: 1594\n4: 1595\n4: 1596\n4: 1597\n4: 1598\n4: 1599\n4: 1600\n4: 1601\n4: 1602\n4: 1603\n4: 1604\n4: 1605\n4: 1606\n4: 1607\n4: 1608\n4: 1609\n4: 1610\n4: 1611\n4: 1612\n4: 1613\n4: 1614\n4: 1615\n4: 1616\n4: 1617\n4: 1618\n4: 1619\n4: 1620\n4: 1621\n4: 1622\n4: 1623\n4: 1624\n4: 1625\n4: 1626\n4: 1627\n4: 1628\n4: 1629\n4: 1630\n4: 1631\n4: 1632\n4: 1633\n4: 1634\n4: 1635\n4: 1636\n4: 1637\n4: 1638\n4: 1639\n4: 1640\n4: 1641\n4: 1642\n4: 1643\n4: 1644\n4: 1645\n4: 1646\n4: 1647\n4: 1648\n4: 1649\n4: 1650\n4: 1651\n4: 1652\n4: 1653\n4: 1654\n4: 1655\n4: 1656\n4: 1657\n4: 1658\n4: 1659\n4: 1660\n4: 1661\n4: 1662\n4: 1663\n4: 1664\n4: 1665\n4: 1666\n4: 1667\n4: 1668\n4: 1669\n4: 1670\n4: 1671\n4: 1672\n4: 1673\n4: 1674\n4: 1675\n4: 1676\n4: 1677\n4: 1678\n4: 1679\n4: 1680\n4: 1681\n4: 1682\n4: 1683\n4: 1684\n4: 1685\n4: 1686\n4: 1687\n4: 1688\n4: 1689\n4: 1690\n4: 1691\n4: 1692\n4: 1693\n4: 1694\n4: 1695\n4: 1696\n4: 1697\n4: 1698\n4: 1699\n4: 1700\n4: 1701\n4: 1702\n4: 1703\n4: 1704\n4: 1705\n4: 1706\n4: 1707\n4: 1708\n4: 1709\n4: 1710\n4: 1711\n4: 1712\n4: 1713\n4: 1714\n4: 1715\n4: 1716\n4: 1717\n4: 1718\n4: 1719\n4: 1720\n4: 1721\n4: 1722\n4: 1723\n4: 1724\n4: 1725\n4: 1726\n4: 1727\n4: 1728\n4: 1729\n4: 1730\n4: 1731\n4: 1732\n4: 1733\n4: 1734\n4: 1735\n4: 1736\n4: 1737\n4: 1738\n4: 1739\n4: 1740\n4: 1741\n4: 1742\n4: 1743\n4: 1744\n4: 1745\n4: 1746\n4: 1747\n4: 1748\n4: 1749\n4: 1750\n4: 1751\n4: 1752\n4: 1753\n4: 1754\n4: 1755\n4: 1756\n4: 1757\n4: 1758\n4: 1759\n4: 1760\n4: 1761\n4: 1762\n4: 1763\n4: 1764\n4: 1765\n4: 1766\n4: 1767\n4: 1768\n4: 1769\n4: 1770\n4: 1771\n4: 1772\n4: 1773\n4: 1774\n4: 1775\n4: 1776\n4: 1777\n4: 1778\n4: 1779\n4: 1780\n4: 1781\n4: 1782\n4: 1783\n4: 1784\n4: 1785\n4: 1786\n4: 1787\n4: 1788\n4: 1789\n4: 1790\n4: 1791\n4: 1792\n4: 1793\n4: 1794\n4: 1795\n4: 1796\n4: 1797\n4: 1798\n4: 1799\n4: 1800\n4: 1801\n4: 1802\n4: 1803\n4: 1804\n4: 1805\n4: 1806\n4: 1807\n4: 1808\n4: 1809\n4: 1810\n4: 1811\n4: 1812\n4: 1813\n4: 1814\n4: 1815\n4: 1816\n4: 1817\n4: 1818\n4: 1819\n4: 1820\n4: 1821\n4: 1822\n4: 1823\n4: 1824\n4: 1825\n4: 1826\n4: 1827\n4: 1828\n4: 1829\n4: 1830\n4: 1831\n5: 1832\n5: 1833\n5: 1834\n5: 1835\n5: 1836\n5: 1837\n5: 1838\n5: 1839\n5: 1840\n5: 1841\n5: 1842\n5: 1843\n5: 1844\n5: 1845\n5: 1846\n5: 1847\n5: 1848\n5: 1849\n5: 1850\n5: 1851\n5: 1852\n5: 1853\n5: 1854\n5: 1855\n5: 1856\n5: 1857\n5: 1858\n5: 1859\n5: 1860\n5: 1861\n5: 1862\n5: 1863\n5: 1864\n5: 1865\n5: 1866\n5: 1867\n5: 1868\n5: 1869\n5: 1870\n5: 1871\n5: 1872\n5: 1873\n5: 1874\n5: 1875\n5: 1876\n5: 1877\n5: 1878\n5: 1879\n5: 1880\n5: 1881\n5: 1882\n5: 1883\n5: 1884\n5: 1885\n5: 1886\n5: 1887\n5: 1888\n5: 1889\n5: 1890\n5: 1891\n5: 1892\n5: 1893\n5: 1894\n5: 1895\n5: 1896\n5: 1897\n5: 1898\n5: 1899\n5: 1900\n5: 1901\n5: 1902\n5: 1903\n5: 1904\n5: 1905\n5: 1906\n5: 1907\n5: 1908\n5: 1909\n5: 1910\n5: 1911\n5: 1912\n5: 1913\n5: 1914\n5: 1915\n5: 1916\n5: 1917\n5: 1918\n5: 1919\n5: 1920\n5: 1921\n5: 1922\n5: 1923\n5: 1924\n5: 1925\n5: 1926\n5: 1927\n5: 1928\n5: 1929\n5: 1930\n5: 1931\n5: 1932\n5: 1933\n5: 1934\n5: 1935\n5: 1936\n5: 1937\n5: 1938\n5: 1939\n5: 1940\n5: 1941\n5: 1942\n5: 1943\n5: 1944\n5: 1945\n5: 1946\n5: 1947\n5: 1948\n5: 1949\n5: 1950\n5: 1951\n5: 1952\n5: 1953\n5: 1954\n5: 1955\n5: 1956\n5: 1957\n5: 1958\n5: 1959\n5: 1960\n5: 1961\n5: 1962\n5: 1963\n5: 1964\n5: 1965\n5: 1966\n5: 1967\n5: 1968\n5: 1969\n5: 1970\n5: 1971\n5: 1972\n5: 1973\n5: 1974\n5: 1975\n5: 1976\n5: 1977\n5: 1978\n5: 1979\n5: 1980\n5: 1981\n5: 1982\n5: 1983\n5: 1984\n5: 1985\n5: 1986\n5: 1987\n5: 1988\n5: 1989\n5: 1990\n5: 1991\n5: 1992\n5: 1993\n5: 1994\n5: 1995\n5: 1996\n5: 1997\n5: 1998\n5: 1999\n5: 2000\n5: 2001\n5: 2002\n5: 2003\n5: 2004\n5: 2005\n5: 2006\n5: 2007\n5: 2008\n5: 2009\n5: 2010\n5: 2011\n5: 2012\n5: 2013\n5: 2014\n5: 2015\n5: 2016\n5: 2017\n5: 2018\n5: 2019\n5: 2020\n5: 2021\n5: 2022\n5: 2023\n5: 2024\n5: 2025\n5: 2026\n5: 2027\n5: 2028\n5: 2029\n5: 2030\n5: 2031\n5: 2032\n5: 2033\n5: 2034\n5: 2035\n5: 2036\n5: 2037\n5: 2038\n5: 2039\n5: 2040\n5: 2041\n5: 2042\n5: 2043\n5: 2044\n5: 2045\n5: 2046\n5: 2047\n5: 2048\n5: 2049\n5: 2050\n5: 2051\n5: 2052\n5: 2053\n5: 2054\n5: 2055\n5: 2056\n5: 2057\n5: 2058\n5: 2059\n5: 2060\n5: 2061\n5: 2062\n5: 2063\n5: 2064\n5: 2065\n5: 2066\n5: 2067\n5: 2068\n5: 2069\n5: 2070\n5: 2071\n5: 2072\n5: 2073\n5: 2074\n5: 2075\n5: 2076\n5: 2077\n5: 2078\n5: 2079\n5: 2080\n5: 2081\n5: 2082\n5: 2083\n5: 2084\n5: 2085\n5: 2086\n5: 2087\n5: 2088\n5: 2089\n5: 2090\n5: 2091\n5: 2092\n5: 2093\n5: 2094\n5: 2095\n5: 2096\n5: 2097\n5: 2098\n5: 2099\n5: 2100\n5: 2101\n5: 2102\n5: 2103\n5: 2104\n5: 2105\n5: 2106\n5: 2107\n5: 2108\n5: 2109\n5: 2110\n5: 2111\n5: 2112\n5: 2113\n5: 2114\n5: 2115\n5: 2116\n5: 2117\n5: 2118\n5: 2119\n5: 2120\n5: 2121\n5: 2122\n5: 2123\n5: 2124\n5: 2125\n5: 2126\n5: 2127\n5: 2128\n5: 2129\n5: 2130\n5: 2131\n5: 2132\n5: 2133\n5: 2134\n5: 2135\n5: 2136\n5: 2137\n5: 2138\n5: 2139\n5: 2140\n5: 2141\n5: 2142\n5: 2143\n5: 2144\n5: 2145\n5: 2146\n5: 2147\n5: 2148\n5: 2149\n5: 2150\n5: 2151\n5: 2152\n5: 2153\n5: 2154\n5: 2155\n5: 2156\n5: 2157\n5: 2158\n5: 2159\n5: 2160\n5: 2161\n5: 2162\n5: 2163\n5: 2164\n5: 2165\n5: 2166\n5: 2167\n5: 2168\n5: 2169\n5: 2170\n5: 2171\n5: 2172\n5: 2173\n5: 2174\n5: 2175\n5: 2176\n5: 2177\n5: 2178\n5: 2179\n5: 2180\n5: 2181\n5: 2182\n5: 2183\n5: 2184\n5: 2185\n5: 2186\n5: 2187\n5: 2188\n5: 2189\n5: 2190\n5: 2191\n5: 2192\n5: 2193\n5: 2194\n5: 2195\n5: 2196\n5: 2197\n5: 2198\n5: 2199\n5: 2200\n5: 2201\n5: 2202\n5: 2203\n5: 2204\n5: 2205\n5: 2206\n5: 2207\n5: 2208\n5: 2209\n5: 2210\n5: 2211\n5: 2212\n5: 2213\n5: 2214\n5: 2215\n5: 2216\n5: 2217\n5: 2218\n5: 2219\n5: 2220\n5: 2221\n5: 2222\n5: 2223\n5: 2224\n5: 2225\n5: 2226\n5: 2227\n5: 2228\n5: 2229\n5: 2230\n5: 2231\n5: 2232\n5: 2233\n5: 2234\n5: 2235\n5: 2236\n5: 2237\n5: 2238\n5: 2239\n5: 2240\n5: 2241\n5: 2242\n5: 2243\n5: 2244\n5: 2245\n5: 2246\n5: 2247\n5: 2248\n5: 2249\n5: 2250\n5: 2251\n5: 2252\n5: 2253\n5: 2254\n5: 2255\n5: 2256\n5: 2257\n5: 2258\n5: 2259\n5: 2260\n5: 2261\n5: 2262\n5: 2263\n5: 2264\n5: 2265\n5: 2266\n5: 2267\n5: 2268\n5: 2269\n5: 2270\n5: 2271\n5: 2272\n5: 2273\n5: 2274\n5: 2275\n5: 2276\n5: 2277\n5: 2278\n5: 2279\n5: 2280\n5: 2281\n5: 2282\n5: 2283\n5: 2284\n5: 2285\n5: 2286\n5: 2287\n5: 2288\n5: 2289\n5: 2290\n5: 2291\n5: 2292\n5: 2293\n5: 2294\n5: 2295\n5: 2296\n5: 2297\n5: 2298\n5: 2299\n5: 2300\n5: 2301\n5: 2302\n5: 2303\n5: 2304\n5: 2305\n5: 2306\n5: 2307\n5: 2308\n5: 2309\n5: 2310\n5: 2311\n5: 2312\n5: 2313\n5: 2314\n5: 2315\n5: 2316\n5: 2317\n5: 2318\n5: 2319\n5: 2320\n5: 2321\n5: 2322\n5: 2323\n5: 2324\n5: 2325\n5: 2326\n5: 2327\n5: 2328\n5: 2329\n5: 2330\n5: 2331\n5: 2332\n5: 2333\n5: 2334\n5: 2335\n5: 2336\n5: 2337\n5: 2338\n5: 2339\n5: 2340\n5: 2341\n5: 2342\n4: 2343\n4: 2344\n4: 2345\n4: 2346\n4: 2347\n4: 2348\n4: 2349\n4: 2350\n4: 2351\n4: 2352\n4: 2353\n4: 2354\n4: 2355\n4: 2356\n4: 2357\n4: 2358\n4: 2359\n4: 2360\n4: 2361\n4: 2362\n4: 2363\n4: 2364\n4: 2365\n4: 2366\n4: 2367\n4: 2368\n4: 2369\n4: 2370\n4: 2371\n4: 2372\n4: 2373\n4: 2374\n4: 2375\n4: 2376\n4: 2377\n4: 2378\n4: 2379\n4: 2380\n4: 2381\n4: 2382\n4: 2383\n4: 2384\n4: 2385\n4: 2386\n4: 2387\n4: 2388\n4: 2389\n4: 2390\n4: 2391\n4: 2392\n4: 2393\n4: 2394\n4: 2395\n4: 2396\n4: 2397\n4: 2398\n4: 2399\n4: 2400\n4: 2401\n4: 2402\n4: 2403\n4: 2404\n4: 2405\n4: 2406\n4: 2407\n4: 2408\n4: 2409\n4: 2410\n4: 2411\n4: 2412\n4: 2413\n4: 2414\n4: 2415\n4: 2416\n4: 2417\n4: 2418\n4: 2419\n4: 2420\n4: 2421\n4: 2422\n4: 2423\n4: 2424\n4: 2425\n4: 2426\n4: 2427\n4: 2428\n4: 2429\n4: 2430\n4: 2431\n4: 2432\n4: 2433\n4: 2434\n4: 2435\n4: 2436\n4: 2437\n4: 2438\n4: 2439\n4: 2440\n4: 2441\n4: 2442\n4: 2443\n4: 2444\n4: 2445\n4: 2446\n4: 2447\n4: 2448\n4: 2449\n4: 2450\n4: 2451\n4: 2452\n4: 2453\n4: 2454\n4: 2455\n4: 2456\n4: 2457\n4: 2458\n4: 2459\n4: 2460\n4: 2461\n4: 2462\n4: 2463\n4: 2464\n4: 2465\n4: 2466\n4: 2467\n4: 2468\n4: 2469\n4: 2470\n4: 2471\n4: 2472\n4: 2473\n4: 2474\n4: 2475\n4: 2476\n4: 2477\n4: 2478\n4: 2479\n4: 2480\n4: 2481\n4: 2482\n4: 2483\n4: 2484\n4: 2485\n4: 2486\n4: 2487\n4: 2488\n4: 2489\n4: 2490\n4: 2491\n4: 2492\n4: 2493\n4: 2494\n4: 2495\n4: 2496\n4: 2497\n4: 2498\n4: 2499\n4: 2500\n4: 2501\n4: 2502\n4: 2503\n4: 2504\n4: 2505\n4: 2506\n4: 2507\n4: 2508\n4: 2509\n4: 2510\n4: 2511\n4: 2512\n4: 2513\n4: 2514\n4: 2515\n4: 2516\n4: 2517\n4: 2518\n4: 2519\n4: 2520\n4: 2521\n4: 2522\n4: 2523\n4: 2524\n4: 2525\n4: 2526\n4: 2527\n4: 2528\n4: 2529\n4: 2530\n4: 2531\n4: 2532\n4: 2533\n4: 2534\n4: 2535\n4: 2536\n4: 2537\n4: 2538\n4: 2539\n4: 2540\n4: 2541\n4: 2542\n4: 2543\n4: 2544\n4: 2545\n4: 2546\n4: 2547\n4: 2548\n4: 2549\n4: 2550\n4: 2551\n4: 2552\n4: 2553\n4: 2554\n4: 2555\n4: 2556\n4: 2557\n4: 2558\n4: 2559\n4: 2560\n4: 2561\n4: 2562\n4: 2563\n4: 2564\n4: 2565\n4: 2566\n4: 2567\n4: 2568\n4: 2569\n4: 2570\n4: 2571\n4: 2572\n4: 2573\n4: 2574\n4: 2575\n4: 2576\n4: 2577\n4: 2578\n4: 2579\n4: 2580\n4: 2581\n4: 2582\n4: 2583\n4: 2584\n4: 2585\n4: 2586\n4: 2587\n4: 2588\n4: 2589\n4: 2590\n4: 2591\n4: 2592\n4: 2593\n4: 2594\n4: 2595\n4: 2596\n4: 2597\n4: 2598\n4: 2599\n4: 2600\n4: 2601\n4: 2602\n4: 2603\n4: 2604\n4: 2605\n4: 2606\n4: 2607\n4: 2608\n4: 2609\n4: 2610\n4: 2611\n4: 2612\n4: 2613\n4: 2614\n4: 2615\n4: 2616\n4: 2617\n4: 2618\n4: 2619\n4: 2620\n4: 2621\n4: 2622\n4: 2623\n4: 2624\n4: 2625\n4: 2626\n4: 2627\n4: 2628\n4: 2629\n4: 2630\n4: 2631\n4: 2632\n4: 2633\n4: 2634\n4: 2635\n4: 2636\n4: 2637\n4: 2638\n4: 2639\n4: 2640\n4: 2641\n4: 2642\n4: 2643\n4: 2644\n4: 2645\n4: 2646\n4: 2647\n4: 2648\n4: 2649\n4: 2650\n4: 2651\n4: 2652\n4: 2653\n4: 2654\n4: 2655\n4: 2656\n4: 2657\n4: 2658\n4: 2659\n4: 2660\n4: 2661\n4: 2662\n4: 2663\n4: 2664\n4: 2665\n4: 2666\n4: 2667\n4: 2668\n4: 2669\n4: 2670\n4: 2671\n4: 2672\n4: 2673\n4: 2674\n4: 2675\n4: 2676\n4: 2677\n4: 2678\n4: 2679\n4: 2680\n4: 2681\n4: 2682\n4: 2683\n4: 2684\n4: 2685\n4: 2686\n4: 2687\n4: 2688\n4: 2689\n4: 2690\n4: 2691\n4: 2692\n4: 2693\n4: 2694\n4: 2695\n4: 2696\n4: 2697\n4: 2698\n4: 2699\n4: 2700\n5: 2701\n5: 2702\n5: 2703\n5: 2704\n5: 2705\n5: 2706\n5: 2707\n5: 2708\n5: 2709\n5: 2710\n5: 2711\n5: 2712\n5: 2713\n5: 2714\n5: 2715\n5: 2716\n5: 2717\n5: 2718\n5: 2719\n5: 2720\n5: 2721\n5: 2722\n5: 2723\n5: 2724\n5: 2725\n5: 2726\n5: 2727\n5: 2728\n5: 2729\n5: 2730\n5: 2731\n5: 2732\n5: 2733\n5: 2734\n5: 2735\n5: 2736\n5: 2737\n5: 2738\n5: 2739\n5: 2740\n5: 2741\n5: 2742\n5: 2743\n5: 2744\n5: 2745\n5: 2746\n5: 2747\n5: 2748\n5: 2749\n5: 2750\n5: 2751\n5: 2752\n5: 2753\n5: 2754\n5: 2755\n5: 2756\n5: 2757\n5: 2758\n5: 2759\n5: 2760\n5: 2761\n5: 2762\n5: 2763\n5: 2764\n5: 2765\n5: 2766\n5: 2767\n5: 2768\n5: 2769\n5: 2770\n5: 2771\n5: 2772\n5: 2773\n5: 2774\n5: 2775\n5: 2776\n5: 2777\n5: 2778\n5: 2779\n5: 2780\n5: 2781\n5: 2782\n5: 2783\n5: 2784\n5: 2785\n5: 2786\n5: 2787\n5: 2788\n5: 2789\n5: 2790\n5: 2791\n5: 2792\n5: 2793\n5: 2794\n5: 2795\n5: 2796\n5: 2797\n5: 2798\n5: 2799\n5: 2800\n5: 2801\n5: 2802\n5: 2803\n5: 2804\n5: 2805\n5: 2806\n5: 2807\n5: 2808\n5: 2809\n5: 2810\n5: 2811\n5: 2812\n5: 2813\n5: 2814\n5: 2815\n5: 2816\n5: 2817\n5: 2818\n5: 2819\n5: 2820\n5: 2821\n5: 2822\n5: 2823\n5: 2824\n5: 2825\n5: 2826\n5: 2827\n5: 2828\n5: 2829\n5: 2830\n5: 2831\n5: 2832\n5: 2833\n5: 2834\n5: 2835\n5: 2836\n5: 2837\n5: 2838\n5: 2839\n5: 2840\n5: 2841\n5: 2842\n5: 2843\n5: 2844\n5: 2845\n5: 2846\n5: 2847\n5: 2848\n5: 2849\n5: 2850\n5: 2851\n5: 2852\n5: 2853\n5: 2854\n5: 2855\n5: 2856\n5: 2857\n5: 2858\n5: 2859\n5: 2860\n5: 2861\n5: 2862\n5: 2863\n5: 2864\n5: 2865\n5: 2866\n5: 2867\n5: 2868\n5: 2869\n5: 2870\n5: 2871\n5: 2872\n5: 2873\n5: 2874\n5: 2875\n5: 2876\n5: 2877\n5: 2878\n5: 2879\n5: 2880\n5: 2881\n5: 2882\n5: 2883\n5: 2884\n5: 2885\n5: 2886\n5: 2887\n5: 2888\n5: 2889\n5: 2890\n5: 2891\n5: 2892\n5: 2893\n5: 2894\n5: 2895\n5: 2896\n5: 2897\n5: 2898\n5: 2899\n5: 2900\n5: 2901\n5: 2902\n5: 2903\n5: 2904\n5: 2905\n5: 2906\n5: 2907\n5: 2908\n5: 2909\n5: 2910\n5: 2911\n5: 2912\n5: 2913\n5: 2914\n5: 2915\n5: 2916\n5: 2917\n5: 2918\n5: 2919\n5: 2920\n5: 2921\n5: 2922\n5: 2923\n5: 2924\n5: 2925\n5: 2926\n5: 2927\n5: 2928\n5: 2929\n5: 2930\n5: 2931\n5: 2932\n5: 2933\n5: 2934\n5: 2935\n5: 2936\n5: 2937\n5: 2938\n5: 2939\n5: 2940\n5: 2941\n5: 2942\n5: 2943\n5: 2944\n5: 2945\n5: 2946\n5: 2947\n5: 2948\n5: 2949\n5: 2950\n5: 2951\n5: 2952\n5: 2953\n5: 2954\n5: 2955\n5: 2956\n5: 2957\n5: 2958\n5: 2959\n5: 2960\n5: 2961\n5: 2962\n5: 2963\n5: 2964\n5: 2965\n5: 2966\n5: 2967\n5: 2968\n5: 2969\n5: 2970\n5: 2971\n5: 2972\n5: 2973\n5: 2974\n5: 2975\n5: 2976\n5: 2977\n5: 2978\n5: 2979\n5: 2980\n5: 2981\n5: 2982\n5: 2983\n5: 2984\n5: 2985\n5: 2986\n5: 2987\n5: 2988\n5: 2989\n5: 2990\n5: 2991\n5: 2992\n5: 2993\n5: 2994\n5: 2995\n5: 2996\n5: 2997\n5: 2998\n5: 2999\n5: 3000\n5: 3001\n5: 3002\n5: 3003\n5: 3004\n5: 3005\n5: 3006\n5: 3007\n5: 3008\n5: 3009\n5: 3010\n5: 3011\n5: 3012\n5: 3013\n5: 3014\n5: 3015\n5: 3016\n5: 3017\n5: 3018\n5: 3019\n5: 3020\n5: 3021\n5: 3022\n5: 3023\n5: 3024\n5: 3025\n5: 3026\n5: 3027\n5: 3028\n5: 3029\n5: 3030\n5: 3031\n5: 3032\n5: 3033\n5: 3034\n5: 3035\n5: 3036\n5: 3037\n5: 3038\n5: 3039\n5: 3040\n5: 3041\n5: 3042\n5: 3043\n5: 3044\n5: 3045\n5: 3046\n5: 3047\n5: 3048\n5: 3049\n5: 3050\n5: 3051\n5: 3052\n5: 3053\n5: 3054\n5: 3055\n5: 3056\n5: 3057\n5: 3058\n5: 3059\n5: 3060\n5: 3061\n5: 3062\n5: 3063\n5: 3064\n5: 3065\n5: 3066\n5: 3067\n5: 3068\n5: 3069\n5: 3070\n5: 3071\n5: 3072\n5: 3073\n5: 3074\n5: 3075\n5: 3076\n5: 3077\n5: 3078\n5: 3079\n5: 3080\n5: 3081\n5: 3082\n5: 3083\n5: 3084\n5: 3085\n5: 3086\n5: 3087\n5: 3088\n5: 3089\n5: 3090\n5: 3091\n5: 3092\n5: 3093\n5: 3094\n5: 3095\n5: 3096\n5: 3097\n5: 3098\n5: 3099\n5: 3100\n5: 3101\n5: 3102\n5: 3103\n5: 3104\n5: 3105\n5: 3106\n5: 3107\n5: 3108\n5: 3109\n5: 3110\n5: 3111\n5: 3112\n5: 3113\n5: 3114\n5: 3115\n5: 3116\n5: 3117\n5: 3118\n5: 3119\n5: 3120\n5: 3121\n5: 3122\n5: 3123\n5: 3124\n5: 3125\n5: 3126\n5: 3127\n5: 3128\n5: 3129\n5: 3130\n5: 3131\n5: 3132\n5: 3133\n5: 3134\n5: 3135\n5: 3136\n5: 3137\n5: 3138\n5: 3139\n5: 3140\n5: 3141\n5: 3142\n5: 3143\n5: 3144\n5: 3145\n5: 3146\n5: 3147\n5: 3148\n5: 3149\n5: 3150\n5: 3151\n5: 3152\n5: 3153\n5: 3154\n5: 3155\n5: 3156\n5: 3157\n5: 3158\n5: 3159\n5: 3160\n5: 3161\n5: 3162\n5: 3163\n5: 3164\n5: 3165\n5: 3166\n5: 3167\n5: 3168\n5: 3169\n5: 3170\n5: 3171\n5: 3172\n5: 3173\n5: 3174\n5: 3175\n5: 3176\n5: 3177\n5: 3178\n5: 3179\n5: 3180\n5: 3181\n5: 3182\n5: 3183\n5: 3184\n5: 3185\n5: 3186\n5: 3187\n5: 3188\n5: 3189\n5: 3190\n5: 3191\n5: 3192\n5: 3193\n5: 3194\n5: 3195\n5: 3196\n5: 3197\n5: 3198\n5: 3199\n5: 3200\n5: 3201\n5: 3202\n5: 3203\n5: 3204\n5: 3205\n5: 3206\n5: 3207\n5: 3208\n5: 3209\n5: 3210\n5: 3211\n5: 3212\n5: 3213\n5: 3214\n5: 3215\n5: 3216\n5: 3217\n5: 3218\n5: 3219\n5: 3220\n4: 3221\n4: 3222\n4: 3223\n4: 3224\n4: 3225\n4: 3226\n4: 3227\n4: 3228\n4: 3229\n4: 3230\n4: 3231\n4: 3232\n4: 3233\n4: 3234\n4: 3235\n4: 3236\n4: 3237\n4: 3238\n4: 3239\n4: 3240\n4: 3241\n4: 3242\n4: 3243\n4: 3244\n4: 3245\n4: 3246\n4: 3247\n4: 3248\n4: 3249\n4: 3250\n4: 3251\n4: 3252\n4: 3253\n4: 3254\n4: 3255\n4: 3256\n4: 3257\n4: 3258\n4: 3259\n4: 3260\n4: 3261\n4: 3262\n4: 3263\n4: 3264\n4: 3265\n4: 3266\n4: 3267\n4: 3268\n4: 3269\n4: 3270\n4: 3271\n4: 3272\n4: 3273\n4: 3274\n4: 3275\n4: 3276\n4: 3277\n4: 3278\n4: 3279\n4: 3280\n4: 3281\n4: 3282\n4: 3283\n4: 3284\n4: 3285\n4: 3286\n4: 3287\n4: 3288\n4: 3289\n4: 3290\n4: 3291\n4: 3292\n4: 3293\n4: 3294\n4: 3295\n4: 3296\n4: 3297\n4: 3298\n4: 3299\n4: 3300\n4: 3301\n4: 3302\n4: 3303\n4: 3304\n4: 3305\n4: 3306\n4: 3307\n4: 3308\n4: 3309\n4: 3310\n4: 3311\n4: 3312\n4: 3313\n4: 3314\n4: 3315\n4: 3316\n4: 3317\n4: 3318\n4: 3319\n4: 3320\n4: 3321\n4: 3322\n4: 3323\n4: 3324\n4: 3325\n4: 3326\n4: 3327\n4: 3328\n4: 3329\n4: 3330\n4: 3331\n4: 3332\n4: 3333\n4: 3334\n4: 3335\n4: 3336\n4: 3337\n4: 3338\n4: 3339\n4: 3340\n4: 3341\n4: 3342\n4: 3343\n4: 3344\n4: 3345\n4: 3346\n4: 3347\n4: 3348\n4: 3349\n4: 3350\n4: 3351\n4: 3352\n4: 3353\n4: 3354\n4: 3355\n4: 3356\n4: 3357\n4: 3358\n4: 3359\n4: 3360\n4: 3361\n4: 3362\n4: 3363\n4: 3364\n4: 3365\n4: 3366\n4: 3367\n4: 3368\n4: 3369\n4: 3370\n4: 3371\n4: 3372\n4: 3373\n4: 3374\n4: 3375\n4: 3376\n4: 3377\n4: 3378\n4: 3379\n4: 3380\n4: 3381\n4: 3382\n4: 3383\n4: 3384\n4: 3385\n4: 3386\n4: 3387\n4: 3388\n4: 3389\n4: 3390\n4: 3391\n4: 3392\n4: 3393\n4: 3394\n4: 3395\n4: 3396\n4: 3397\n4: 3398\n4: 3399\n4: 3400\n4: 3401\n4: 3402\n4: 3403\n4: 3404\n4: 3405\n4: 3406\n4: 3407\n4: 3408\n4: 3409\n4: 3410\n4: 3411\n4: 3412\n4: 3413\n4: 3414\n4: 3415\n4: 3416\n4: 3417\n4: 3418\n4: 3419\n4: 3420\n4: 3421\n4: 3422\n4: 3423\n4: 3424\n4: 3425\n4: 3426\n4: 3427\n4: 3428\n4: 3429\n4: 3430\n4: 3431\n4: 3432\n4: 3433\n4: 3434\n4: 3435\n4: 3436\n4: 3437\n4: 3438\n4: 3439\n4: 3440\n4: 3441\n4: 3442\n4: 3443\n4: 3444\n4: 3445\n4: 3446\n4: 3447\n4: 3448\n4: 3449\n4: 3450\n4: 3451\n4: 3452\n4: 3453\n4: 3454\n4: 3455\n4: 3456\n4: 3457\n4: 3458\n4: 3459\n4: 3460\n4: 3461\n4: 3462\n4: 3463\n4: 3464\n4: 3465\n4: 3466\n4: 3467\n4: 3468\n4: 3469\n4: 3470\n4: 3471\n4: 3472\n4: 3473\n4: 3474\n4: 3475\n4: 3476\n4: 3477\n4: 3478\n4: 3479\n4: 3480\n4: 3481\n4: 3482\n4: 3483\n4: 3484\n4: 3485\n4: 3486\n4: 3487\n4: 3488\n4: 3489\n4: 3490\n4: 3491\n4: 3492\n4: 3493\n4: 3494\n4: 3495\n4: 3496\n4: 3497\n4: 3498\n4: 3499\n4: 3500\n4: 3501\n4: 3502\n4: 3503\n4: 3504\n4: 3505\n4: 3506\n4: 3507\n4: 3508\n4: 3509\n4: 3510\n4: 3511\n4: 3512\n4: 3513\n4: 3514\n4: 3515\n4: 3516\n4: 3517\n4: 3518\n4: 3519\n4: 3520\n4: 3521\n4: 3522\n4: 3523\n4: 3524\n4: 3525\n4: 3526\n4: 3527\n4: 3528\n4: 3529\n4: 3530\n4: 3531\n4: 3532\n4: 3533\n4: 3534\n4: 3535\n4: 3536\n4: 3537\n4: 3538\n4: 3539\n4: 3540\n4: 3541\n4: 3542\n4: 3543\n4: 3544\n4: 3545\n4: 3546\n4: 3547\n4: 3548\n4: 3549\n4: 3550\n4: 3551\n4: 3552\n4: 3553\n4: 3554\n4: 3555\n4: 3556\n4: 3557\n4: 3558\n4: 3559\n4: 3560\n4: 3561\n4: 3562\n4: 3563\n4: 3564\n4: 3565\n4: 3566\n4: 3567\n4: 3568\n4: 3569\n4: 3570\n4: 3571\n4: 3572\n4: 3573\n4: 3574\n4: 3575\n4: 3576\n4: 3577\n4: 3578\n4: 3579\n4: 3580\n4: 3581\n4: 3582\n4: 3583\n4: 3584\n4: 3585\n4: 3586\n4: 3587\n4: 3588\n4: 3589\n4: 3590\n4: 3591\n4: 3592\n4: 3593\n4: 3594\n4: 3595\n4: 3596\n4: 3597\n4: 3598\n4: 3599\n4: 3600\n4: 3601\n4: 3602\n4: 3603\n4: 3604\n4: 3605\n4: 3606\n4: 3607\n4: 3608\n4: 3609\n4: 3610\n4: 3611\n4: 3612\n4: 3613\n4: 3614\n4: 3615\n4: 3616\n4: 3617\n4: 3618\n4: 3619\n4: 3620\n4: 3621\n4: 3622\n4: 3623\n4: 3624\n4: 3625\n4: 3626\n4: 3627\n4: 3628\n4: 3629\n4: 3630\n4: 3631\n4: 3632\n4: 3633\n4: 3634\n4: 3635\n4: 3636\n4: 3637\n4: 3638\n4: 3639\n4: 3640\n4: 3641\n4: 3642\n4: 3643\n4: 3644\n4: 3645\n4: 3646\n4: 3647\n4: 3648\n4: 3649\n4: 3650\n4: 3651\n4: 3652\n4: 3653\n4: 3654\n4: 3655\n4: 3656\n4: 3657\n4: 3658\n4: 3659\n4: 3660\n4: 3661\n4: 3662\n4: 3663\n4: 3664\n4: 3665\n4: 3666\n4: 3667\n4: 3668\n4: 3669\n4: 3670\n4: 3671\n4: 3672\n4: 3673\n4: 3674\n4: 3675\n4: 3676\n4: 3677\n4: 3678\n4: 3679\n4: 3680\n4: 3681\n4: 3682\n4: 3683\n4: 3684\n4: 3685\n4: 3686\n4: 3687\n4: 3688\n4: 3689\n4: 3690\n4: 3691\n4: 3692\n4: 3693\n4: 3694\n4: 3695\n4: 3696\n4: 3697\n4: 3698\n4: 3699\n4: 3700\n4: 3701\n4: 3702\n4: 3703\n4: 3704\n4: 3705\n4: 3706\n4: 3707\n4: 3708\n4: 3709\n4: 3710\n4: 3711\n4: 3712\n5: 3713\n5: 3714\n5: 3715\n5: 3716\n5: 3717\n5: 3718\n5: 3719\n5: 3720\n5: 3721\n5: 3722\n5: 3723\n5: 3724\n5: 3725\n5: 3726\n5: 3727\n5: 3728\n5: 3729\n5: 3730\n5: 3731\n5: 3732\n5: 3733\n5: 3734\n5: 3735\n5: 3736\n5: 3737\n5: 3738\n5: 3739\n5: 3740\n5: 3741\n5: 3742\n5: 3743\n5: 3744\n5: 3745\n5: 3746\n5: 3747\n5: 3748\n5: 3749\n5: 3750\n5: 3751\n5: 3752\n5: 3753\n5: 3754\n5: 3755\n5: 3756\n5: 3757\n5: 3758\n5: 3759\n5: 3760\n5: 3761\n5: 3762\n5: 3763\n5: 3764\n5: 3765\n5: 3766\n5: 3767\n5: 3768\n5: 3769\n5: 3770\n5: 3771\n5: 3772\n5: 3773\n5: 3774\n5: 3775\n5: 3776\n5: 3777\n5: 3778\n5: 3779\n5: 3780\n5: 3781\n5: 3782\n5: 3783\n5: 3784\n5: 3785\n5: 3786\n5: 3787\n5: 3788\n5: 3789\n5: 3790\n5: 3791\n5: 3792\n5: 3793\n5: 3794\n5: 3795\n5: 3796\n5: 3797\n5: 3798\n5: 3799\n5: 3800\n5: 3801\n5: 3802\n5: 3803\n5: 3804\n5: 3805\n5: 3806\n5: 3807\n5: 3808\n5: 3809\n5: 3810\n5: 3811\n5: 3812\n5: 3813\n5: 3814\n5: 3815\n5: 3816\n5: 3817\n5: 3818\n5: 3819\n5: 3820\n5: 3821\n5: 3822\n5: 3823\n5: 3824\n5: 3825\n5: 3826\n5: 3827\n5: 3828\n5: 3829\n5: 3830\n5: 3831\n5: 3832\n5: 3833\n5: 3834\n5: 3835\n5: 3836\n5: 3837\n5: 3838\n5: 3839\n5: 3840\n5: 3841\n5: 3842\n5: 3843\n5: 3844\n5: 3845\n5: 3846\n5: 3847\n5: 3848\n5: 3849\n5: 3850\n5: 3851\n5: 3852\n5: 3853\n5: 3854\n5: 3855\n5: 3856\n5: 3857\n5: 3858\n5: 3859\n5: 3860\n5: 3861\n5: 3862\n5: 3863\n5: 3864\n5: 3865\n5: 3866\n5: 3867\n5: 3868\n5: 3869\n5: 3870\n5: 3871\n5: 3872\n5: 3873\n5: 3874\n5: 3875\n5: 3876\n5: 3877\n5: 3878\n5: 3879\n5: 3880\n5: 3881\n5: 3882\n5: 3883\n5: 3884\n5: 3885\n5: 3886\n5: 3887\n5: 3888\n5: 3889\n5: 3890\n5: 3891\n5: 3892\n5: 3893\n5: 3894\n5: 3895\n5: 3896\n5: 3897\n5: 3898\n5: 3899\n5: 3900\n5: 3901\n5: 3902\n5: 3903\n5: 3904\n5: 3905\n5: 3906\n5: 3907\n5: 3908\n5: 3909\n5: 3910\n5: 3911\n5: 3912\n5: 3913\n5: 3914\n5: 3915\n5: 3916\n5: 3917\n5: 3918\n5: 3919\n5: 3920\n5: 3921\n5: 3922\n5: 3923\n5: 3924\n5: 3925\n5: 3926\n5: 3927\n5: 3928\n5: 3929\n5: 3930\n5: 3931\n5: 3932\n5: 3933\n5: 3934\n5: 3935\n5: 3936\n5: 3937\n5: 3938\n5: 3939\n5: 3940\n5: 3941\n5: 3942\n5: 3943\n5: 3944\n5: 3945\n5: 3946\n5: 3947\n5: 3948\n5: 3949\n5: 3950\n5: 3951\n5: 3952\n5: 3953\n5: 3954\n5: 3955\n5: 3956\n5: 3957\n5: 3958\n5: 3959\n5: 3960\n5: 3961\n5: 3962\n5: 3963\n5: 3964\n5: 3965\n5: 3966\n5: 3967\n5: 3968\n5: 3969\n5: 3970\n5: 3971\n5: 3972\n5: 3973\n5: 3974\n5: 3975\n5: 3976\n5: 3977\n5: 3978\n5: 3979\n5: 3980\n5: 3981\n5: 3982\n5: 3983\n5: 3984\n5: 3985\n5: 3986\n5: 3987\n5: 3988\n5: 3989\n5: 3990\n5: 3991\n5: 3992\n5: 3993\n5: 3994\n5: 3995\n5: 3996\n5: 3997\n5: 3998\n5: 3999\n5: 4000\n5: 4001\n5: 4002\n5: 4003\n5: 4004\n4: 4005\n4: 4006\n4: 4007\n4: 4008\n4: 4009\n4: 4010\n4: 4011\n4: 4012\n4: 4013\n4: 4014\n4: 4015\n4: 4016\n4: 4017\n4: 4018\n4: 4019\n4: 4020\n4: 4021\n4: 4022\n4: 4023\n4: 4024\n4: 4025\n4: 4026\n4: 4027\n4: 4028\n4: 4029\n4: 4030\n4: 4031\n4: 4032\n4: 4033\n4: 4034\n4: 4035\n4: 4036\n4: 4037\n4: 4038\n4: 4039\n4: 4040\n4: 4041\n4: 4042\n4: 4043\n4: 4044\n4: 4045\n4: 4046\n4: 4047\n4: 4048\n4: 4049\n4: 4050\n4: 4051\n4: 4052\n4: 4053\n4: 4054\n4: 4055\n4: 4056\n4: 4057\n4: 4058\n4: 4059\n4: 4060\n4: 4061\n4: 4062\n4: 4063\n4: 4064\n4: 4065\n4: 4066\n4: 4067\n4: 4068\n4: 4069\n4: 4070\n4: 4071\n4: 4072\n4: 4073\n4: 4074\n4: 4075\n4: 4076\n4: 4077\n4: 4078\n4: 4079\n4: 4080\n4: 4081\n4: 4082\n4: 4083\n4: 4084\n4: 4085\n4: 4086\n4: 4087\n4: 4088\n4: 4089\n4: 4090\n4: 4091\n4: 4092\n4: 4093\n4: 4094\n4: 4095\n4: 4096\n4: 4097\n4: 4098\n4: 4099\n4: 4100\n4: 4101\n4: 4102\n4: 4103\n4: 4104\n4: 4105\n4: 4106\n4: 4107\n4: 4108\n4: 4109\n4: 4110\n4: 4111\n4: 4112\n4: 4113\n4: 4114\n4: 4115\n4: 4116\n4: 4117\n4: 4118\n4: 4119\n4: 4120\n4: 4121\n4: 4122\n4: 4123\n4: 4124\n4: 4125\n4: 4126\n4: 4127\n4: 4128\n4: 4129\n4: 4130\n4: 4131\n4: 4132\n4: 4133\n4: 4134\n4: 4135\n4: 4136\n4: 4137\n4: 4138\n4: 4139\n4: 4140\n4: 4141\n4: 4142\n4: 4143\n4: 4144\n4: 4145\n4: 4146\n4: 4147\n4: 4148\n4: 4149\n4: 4150\n4: 4151\n4: 4152\n4: 4153\n4: 4154\n4: 4155\n4: 4156\n4: 4157\n4: 4158\n4: 4159\n4: 4160\n4: 4161\n4: 4162\n4: 4163\n4: 4164\n4: 4165\n4: 4166\n4: 4167\n4: 4168\n4: 4169\n4: 4170\n4: 4171\n4: 4172\n4: 4173\n4: 4174\n4: 4175\n4: 4176\n4: 4177\n4: 4178\n4: 4179\n4: 4180\n4: 4181\n4: 4182\n4: 4183\n4: 4184\n4: 4185\n4: 4186\n4: 4187\n4: 4188\n4: 4189\n4: 4190\n4: 4191\n4: 4192\n4: 4193\n4: 4194\n4: 4195\n4: 4196\n4: 4197\n4: 4198\n4: 4199\n4: 4200\n4: 4201\n4: 4202\n4: 4203\n4: 4204\n4: 4205\n4: 4206\n4: 4207\n4: 4208\n4: 4209\n4: 4210\n4: 4211\n4: 4212\n4: 4213\n4: 4214\n4: 4215\n4: 4216\n4: 4217\n4: 4218\n4: 4219\n4: 4220\n4: 4221\n4: 4222\n4: 4223\n4: 4224\n4: 4225\n4: 4226\n4: 4227\n4: 4228\n4: 4229\n4: 4230\n4: 4231\n4: 4232\n4: 4233\n4: 4234\n4: 4235\n4: 4236\n4: 4237\n4: 4238\n4: 4239\n4: 4240\n4: 4241\n4: 4242\n4: 4243\n4: 4244\n4: 4245\n4: 4246\n4: 4247\n4: 4248\n4: 4249\n4: 4250\n4: 4251\n4: 4252\n4: 4253\n4: 4254\n4: 4255\n4: 4256\n4: 4257\n4: 4258\n4: 4259\n4: 4260\n4: 4261\n4: 4262\n4: 4263\n4: 4264\n4: 4265\n4: 4266\n4: 4267\n4: 4268\n4: 4269\n4: 4270\n4: 4271\n4: 4272\n4: 4273\n4: 4274\n4: 4275\n4: 4276\n4: 4277\n4: 4278\n4: 4279\n4: 4280\n4: 4281\n4: 4282\n4: 4283\n4: 4284\n4: 4285\n4: 4286\n4: 4287\n4: 4288\n4: 4289\n4: 4290\n4: 4291\n4: 4292\n4: 4293\n4: 4294\n4: 4295\n4: 4296\n4: 4297\n4: 4298\n4: 4299\n4: 4300\n4: 4301\n4: 4302\n4: 4303\n4: 4304\n4: 4305\n4: 4306\n4: 4307\n4: 4308\n4: 4309\n4: 4310\n4: 4311\n4: 4312\n4: 4313\n4: 4314\n4: 4315\n4: 4316\n4: 4317\n4: 4318\n4: 4319\n4: 4320\n4: 4321\n5: 4322\n5: 4323\n5: 4324\n5: 4325\n5: 4326\n5: 4327\n5: 4328\n5: 4329\n5: 4330\n5: 4331\n5: 4332\n5: 4333\n5: 4334\n5: 4335\n5: 4336\n5: 4337\n5: 4338\n5: 4339\n5: 4340\n5: 4341\n5: 4342\n5: 4343\n5: 4344\n5: 4345\n5: 4346\n5: 4347\n5: 4348\n5: 4349\n5: 4350\n5: 4351\n5: 4352\n5: 4353\n5: 4354\n5: 4355\n5: 4356\n5: 4357\n5: 4358\n5: 4359\n5: 4360\n5: 4361\n5: 4362\n5: 4363\n5: 4364\n5: 4365\n5: 4366\n5: 4367\n5: 4368\n5: 4369\n5: 4370\n5: 4371\n5: 4372\n5: 4373\n5: 4374\n5: 4375\n5: 4376\n5: 4377\n5: 4378\n5: 4379\n5: 4380\n5: 4381\n5: 4382\n5: 4383\n5: 4384\n5: 4385\n5: 4386\n5: 4387\n5: 4388\n5: 4389\n5: 4390\n5: 4391\n5: 4392\n5: 4393\n5: 4394\n5: 4395\n5: 4396\n5: 4397\n5: 4398\n5: 4399\n5: 4400\n5: 4401\n5: 4402\n5: 4403\n5: 4404\n5: 4405\n5: 4406\n5: 4407\n5: 4408\n5: 4409\n5: 4410\n5: 4411\n5: 4412\n5: 4413\n5: 4414\n5: 4415\n5: 4416\n5: 4417\n5: 4418\n5: 4419\n5: 4420\n5: 4421\n5: 4422\n5: 4423\n5: 4424\n5: 4425\n5: 4426\n5: 4427\n5: 4428\n5: 4429\n5: 4430\n5: 4431\n5: 4432\n5: 4433\n5: 4434\n5: 4435\n5: 4436\n5: 4437\n5: 4438\n5: 4439\n5: 4440\n5: 4441\n5: 4442\n5: 4443\n5: 4444\n5: 4445\n5: 4446\n5: 4447\n5: 4448\n5: 4449\n5: 4450\n5: 4451\n5: 4452\n5: 4453\n5: 4454\n5: 4455\n5: 4456\n5: 4457\n5: 4458\n5: 4459\n5: 4460\n5: 4461\n5: 4462\n5: 4463\n5: 4464\n5: 4465\n5: 4466\n5: 4467\n5: 4468\n5: 4469\n5: 4470\n5: 4471\n5: 4472\n5: 4473\n5: 4474\n5: 4475\n5: 4476\n5: 4477\n5: 4478\n5: 4479\n5: 4480\n5: 4481\n5: 4482\n5: 4483\n5: 4484\n5: 4485\n5: 4486\n5: 4487\n5: 4488\n5: 4489\n5: 4490\n5: 4491\n5: 4492\n5: 4493\n5: 4494\n5: 4495\n5: 4496\n5: 4497\n5: 4498\n5: 4499\n5: 4500\n5: 4501\n5: 4502\n5: 4503\n5: 4504\n5: 4505\n5: 4506\n5: 4507\n5: 4508\n5: 4509\n5: 4510\n5: 4511\n5: 4512\n5: 4513\n5: 4514\n5: 4515\n5: 4516\n5: 4517\n5: 4518\n5: 4519\n5: 4520\n5: 4521\n5: 4522\n5: 4523\n5: 4524\n5: 4525\n5: 4526\n5: 4527\n5: 4528\n5: 4529\n5: 4530\n5: 4531\n5: 4532\n5: 4533\n5: 4534\n5: 4535\n5: 4536\n5: 4537\n5: 4538\n5: 4539\n5: 4540\n5: 4541\n5: 4542\n5: 4543\n5: 4544\n5: 4545\n5: 4546\n5: 4547\n5: 4548\n5: 4549\n5: 4550\n5: 4551\n5: 4552\n5: 4553\n5: 4554\n5: 4555\n5: 4556\n5: 4557\n5: 4558\n5: 4559\n5: 4560\n5: 4561\n5: 4562\n5: 4563\n5: 4564\n5: 4565\n5: 4566\n5: 4567\n5: 4568\n5: 4569\n5: 4570\n5: 4571\n5: 4572\n5: 4573\n5: 4574\n5: 4575\n5: 4576\n5: 4577\n5: 4578\n5: 4579\n5: 4580\n5: 4581\n5: 4582\n5: 4583\n5: 4584\n5: 4585\n5: 4586\n5: 4587\n5: 4588\n5: 4589\n5: 4590\n5: 4591\n5: 4592\n5: 4593\n5: 4594\n5: 4595\n5: 4596\n5: 4597\n5: 4598\n5: 4599\n5: 4600\n5: 4601\n5: 4602\n5: 4603\n5: 4604\n5: 4605\n5: 4606\n5: 4607\n5: 4608\n5: 4609\n5: 4610\n5: 4611\n5: 4612\n5: 4613\n5: 4614\n5: 4615\n5: 4616\n5: 4617\n5: 4618\n5: 4619\n5: 4620\n5: 4621\n5: 4622\n5: 4623\n5: 4624\n5: 4625\n5: 4626\n5: 4627\n5: 4628\n5: 4629\n5: 4630\n5: 4631\n5: 4632\n5: 4633\n5: 4634\n5: 4635\n5: 4636\n5: 4637\n5: 4638\n5: 4639\n5: 4640\n5: 4641\n5: 4642\n5: 4643\n5: 4644\n5: 4645\n5: 4646\n5: 4647\n5: 4648\n5: 4649\n5: 4650\n5: 4651\n5: 4652\n5: 4653\n5: 4654\n5: 4655\n5: 4656\n5: 4657\n5: 4658\n5: 4659\n5: 4660\n5: 4661\n5: 4662\n5: 4663\n5: 4664\n5: 4665\n5: 4666\n5: 4667\n5: 4668\n5: 4669\n5: 4670\n5: 4671\n5: 4672\n5: 4673\n5: 4674\n5: 4675\n5: 4676\n5: 4677\n5: 4678\n5: 4679\n5: 4680\n5: 4681\n5: 4682\n5: 4683\n5: 4684\n5: 4685\n5: 4686\n5: 4687\n5: 4688\n5: 4689\n5: 4690\n5: 4691\n5: 4692\n5: 4693\n5: 4694\n5: 4695\n5: 4696\n5: 4697\n5: 4698\n5: 4699\n5: 4700\n5: 4701\n5: 4702\n5: 4703\n5: 4704\n5: 4705\n5: 4706\n5: 4707\n5: 4708\n5: 4709\n5: 4710\n5: 4711\n5: 4712\n5: 4713\n5: 4714\n5: 4715\n5: 4716\n5: 4717\n5: 4718\n5: 4719\n5: 4720\n5: 4721\n5: 4722\n5: 4723\n5: 4724\n5: 4725\n5: 4726\n5: 4727\n5: 4728\n5: 4729\n5: 4730\n5: 4731\n5: 4732\n5: 4733\n5: 4734\n5: 4735\n5: 4736\n5: 4737\n5: 4738\n5: 4739\n5: 4740\n5: 4741\n5: 4742\n5: 4743\n5: 4744\n5: 4745\n5: 4746\n5: 4747\n5: 4748\n5: 4749\n5: 4750\n5: 4751\n5: 4752\n5: 4753\n5: 4754\n5: 4755\n5: 4756\n5: 4757\n5: 4758\n5: 4759\n5: 4760\n5: 4761\n5: 4762\n5: 4763\n5: 4764\n5: 4765\n5: 4766\n5: 4767\n5: 4768\n5: 4769\n5: 4770\n5: 4771\n5: 4772\n5: 4773\n5: 4774\n5: 4775\n5: 4776\n5: 4777\n5: 4778\n5: 4779\n5: 4780\n5: 4781\n5: 4782\n5: 4783\n5: 4784\n5: 4785\n5: 4786\n5: 4787\n5: 4788\n5: 4789\n5: 4790\n5: 4791\n5: 4792\n5: 4793\n5: 4794\n5: 4795\n5: 4796\n5: 4797\n5: 4798\n5: 4799\n5: 4800\n5: 4801\n5: 4802\n5: 4803\n5: 4804\n5: 4805\n5: 4806\n5: 4807\n5: 4808\n5: 4809\n5: 4810\n5: 4811\n5: 4812\n5: 4813\n5: 4814\n5: 4815\n5: 4816\n5: 4817\n5: 4818\n5: 4819\n5: 4820\n5: 4821\n5: 4822\n5: 4823\n5: 4824\n5: 4825\n5: 4826\n5: 4827\n5: 4828\n5: 4829\n5: 4830\n5: 4831\n5: 4832\n5: 4833\n5: 4834\n5: 4835\n5: 4836\n5: 4837\n5: 4838\n5: 4839\n5: 4840\n5: 4841\n5: 4842\n5: 4843\n5: 4844\n5: 4845\n5: 4846\n5: 4847\n5: 4848\n5: 4849\n5: 4850\n5: 4851\n5: 4852\n5: 4853\n5: 4854\n5: 4855\n5: 4856\n5: 4857\n5: 4858\n5: 4859\n5: 4860\n5: 4861\n5: 4862\n5: 4863\n5: 4864\n5: 4865\n5: 4866\n5: 4867\n5: 4868\n5: 4869\n5: 4870\n5: 4871\n5: 4872\n5: 4873\n5: 4874\n5: 4875\n5: 4876\n5: 4877\n5: 4878\n5: 4879\n5: 4880\n5: 4881\n5: 4882\n5: 4883\n5: 4884\n5: 4885\n5: 4886\n5: 4887\n5: 4888\n5: 4889\n5: 4890\n5: 4891\n5: 4892\n5: 4893\n5: 4894\n5: 4895\n5: 4896\n5: 4897\n5: 4898\n5: 4899\n5: 4900\n5: 4901\n5: 4902\n5: 4903\n5: 4904\n5: 4905\n5: 4906\n5: 4907\n5: 4908\n5: 4909\n5: 4910\n5: 4911\n5: 4912\n5: 4913\n5: 4914\n5: 4915\n5: 4916\n5: 4917\n5: 4918\n5: 4919\n5: 4920\n5: 4921\n5: 4922\n5: 4923\n5: 4924\n5: 4925\n5: 4926\n5: 4927\n5: 4928\n5: 4929\n5: 4930\n5: 4931\n5: 4932\n5: 4933\n5: 4934\n5: 4935\n5: 4936\n5: 4937\n5: 4938\n5: 4939\n5: 4940\n5: 4941\n5: 4942\n5: 4943\n5: 4944\n5: 4945\n5: 4946\n5: 4947\n5: 4948\n5: 4949\n5: 4950\n5: 4951\n5: 4952\n5: 4953\n5: 4954\n5: 4955\n5: 4956\n5: 4957\n5: 4958\n5: 4959\n5: 4960\n5: 4961\n5: 4962\n5: 4963\n5: 4964\n5: 4965\n5: 4966\n5: 4967\n5: 4968\n5: 4969\n5: 4970\n5: 4971\n5: 4972\n5: 4973\n5: 4974\n5: 4975\n5: 4976\n5: 4977\n5: 4978\n5: 4979\n5: 4980\n5: 4981\n5: 4982\n5: 4983\n5: 4984\n4: 4985\n4: 4986\n4: 4987\n4: 4988\n4: 4989\n4: 4990\n4: 4991\n4: 4992\n4: 4993\n4: 4994\n4: 4995\n4: 4996\n4: 4997\n4: 4998\n4: 4999\n4: 5000\n4: 5001\n4: 5002\n4: 5003\n4: 5004\n4: 5005\n4: 5006\n4: 5007\n4: 5008\n4: 5009\n4: 5010\n4: 5011\n4: 5012\n4: 5013\n4: 5014\n4: 5015\n4: 5016\n4: 5017\n4: 5018\n4: 5019\n4: 5020\n4: 5021\n4: 5022\n4: 5023\n4: 5024\n4: 5025\n4: 5026\n4: 5027\n4: 5028\n4: 5029\n4: 5030\n4: 5031\n4: 5032\n4: 5033\n4: 5034\n4: 5035\n4: 5036\n4: 5037\n4: 5038\n4: 5039\n4: 5040\n4: 5041\n4: 5042\n4: 5043\n4: 5044\n4: 5045\n4: 5046\n4: 5047\n4: 5048\n4: 5049\n4: 5050\n4: 5051\n4: 5052\n4: 5053\n4: 5054\n4: 5055\n4: 5056\n4: 5057\n4: 5058\n4: 5059\n4: 5060\n4: 5061\n4: 5062\n4: 5063\n4: 5064\n4: 5065\n4: 5066\n4: 5067\n4: 5068\n4: 5069\n4: 5070\n4: 5071\n4: 5072\n4: 5073\n4: 5074\n4: 5075\n4: 5076\n4: 5077\n4: 5078\n4: 5079\n4: 5080\n4: 5081\n4: 5082\n4: 5083\n4: 5084\n4: 5085\n4: 5086\n4: 5087\n4: 5088\n4: 5089\n4: 5090\n4: 5091\n4: 5092\n4: 5093\n4: 5094\n4: 5095\n4: 5096\n4: 5097\n4: 5098\n4: 5099\n4: 5100\n4: 5101\n4: 5102\n4: 5103\n4: 5104\n4: 5105\n4: 5106\n4: 5107\n4: 5108\n4: 5109\n4: 5110\n4: 5111\n4: 5112\n4: 5113\n4: 5114\n4: 5115\n4: 5116\n4: 5117\n4: 5118\n4: 5119\n4: 5120\n4: 5121\n4: 5122\n4: 5123\n4: 5124\n4: 5125\n4: 5126\n4: 5127\n4: 5128\n4: 5129\n4: 5130\n4: 5131\n4: 5132\n4: 5133\n4: 5134\n4: 5135\n4: 5136\n4: 5137\n4: 5138\n4: 5139\n4: 5140\n4: 5141\n4: 5142\n4: 5143\n4: 5144\n4: 5145\n4: 5146\n4: 5147\n4: 5148\n4: 5149\n4: 5150\n4: 5151\n4: 5152\n4: 5153\n4: 5154\n4: 5155\n4: 5156\n4: 5157\n4: 5158\n4: 5159\n4: 5160\n4: 5161\n4: 5162\n4: 5163\n4: 5164\n4: 5165\n4: 5166\n4: 5167\n4: 5168\n4: 5169\n4: 5170\n4: 5171\n4: 5172\n4: 5173\n4: 5174\n4: 5175\n4: 5176\n4: 5177\n4: 5178\n4: 5179\n4: 5180\n4: 5181\n4: 5182\n4: 5183\n4: 5184\n4: 5185\n4: 5186\n4: 5187\n4: 5188\n4: 5189\n4: 5190\n4: 5191\n4: 5192\n4: 5193\n4: 5194\n4: 5195\n4: 5196\n4: 5197\n4: 5198\n4: 5199\n4: 5200\n4: 5201\n4: 5202\n4: 5203\n4: 5204\n4: 5205\n4: 5206\n4: 5207\n4: 5208\n4: 5209\n4: 5210\n4: 5211\n4: 5212\n4: 5213\n4: 5214\n4: 5215\n4: 5216\n4: 5217\n4: 5218\n4: 5219\n4: 5220\n4: 5221\n4: 5222\n4: 5223\n4: 5224\n4: 5225\n4: 5226\n4: 5227\n4: 5228\n4: 5229\n4: 5230\n4: 5231\n4: 5232\n4: 5233\n4: 5234\n4: 5235\n4: 5236\n4: 5237\n4: 5238\n4: 5239\n4: 5240\n4: 5241\n4: 5242\n4: 5243\n4: 5244\n4: 5245\n4: 5246\n4: 5247\n4: 5248\n4: 5249\n4: 5250\n4: 5251\n4: 5252\n4: 5253\n4: 5254\n4: 5255\n4: 5256\n4: 5257\n4: 5258\n4: 5259\n4: 5260\n4: 5261\n5: 5262\n5: 5263\n5: 5264\n5: 5265\n5: 5266\n5: 5267\n5: 5268\n5: 5269\n5: 5270\n5: 5271\n5: 5272\n5: 5273\n5: 5274\n5: 5275\n5: 5276\n5: 5277\n5: 5278\n5: 5279\n5: 5280\n5: 5281\n5: 5282\n5: 5283\n5: 5284\n5: 5285\n5: 5286\n5: 5287\n5: 5288\n5: 5289\n5: 5290\n5: 5291\n5: 5292\n5: 5293\n5: 5294\n5: 5295\n5: 5296\n5: 5297\n5: 5298\n5: 5299\n5: 5300\n5: 5301\n5: 5302\n5: 5303\n5: 5304\n5: 5305\n5: 5306\n5: 5307\n5: 5308\n5: 5309\n5: 5310\n5: 5311\n5: 5312\n5: 5313\n5: 5314\n5: 5315\n5: 5316\n5: 5317\n5: 5318\n5: 5319\n5: 5320\n5: 5321\n5: 5322\n5: 5323\n5: 5324\n5: 5325\n5: 5326\n5: 5327\n5: 5328\n5: 5329\n5: 5330\n5: 5331\n5: 5332\n5: 5333\n5: 5334\n5: 5335\n5: 5336\n5: 5337\n5: 5338\n5: 5339\n5: 5340\n5: 5341\n5: 5342\n5: 5343\n5: 5344\n5: 5345\n5: 5346\n5: 5347\n5: 5348\n5: 5349\n5: 5350\n5: 5351\n5: 5352\n5: 5353\n5: 5354\n5: 5355\n5: 5356\n5: 5357\n5: 5358\n5: 5359\n5: 5360\n5: 5361\n5: 5362\n5: 5363\n5: 5364\n5: 5365\n5: 5366\n5: 5367\n5: 5368\n5: 5369\n5: 5370\n5: 5371\n5: 5372\n5: 5373\n5: 5374\n5: 5375\n5: 5376\n5: 5377\n5: 5378\n5: 5379\n5: 5380\n5: 5381\n5: 5382\n5: 5383\n5: 5384\n5: 5385\n5: 5386\n5: 5387\n5: 5388\n5: 5389\n5: 5390\n5: 5391\n5: 5392\n5: 5393\n5: 5394\n5: 5395\n5: 5396\n5: 5397\n5: 5398\n5: 5399\n5: 5400\n5: 5401\n5: 5402\n5: 5403\n5: 5404\n5: 5405\n5: 5406\n5: 5407\n5: 5408\n5: 5409\n5: 5410\n5: 5411\n5: 5412\n5: 5413\n5: 5414\n5: 5415\n5: 5416\n5: 5417\n5: 5418\n5: 5419\n5: 5420\n5: 5421\n5: 5422\n5: 5423\n5: 5424\n5: 5425\n5: 5426\n5: 5427\n5: 5428\n5: 5429\n5: 5430\n5: 5431\n5: 5432\n5: 5433\n5: 5434\n5: 5435\n5: 5436\n5: 5437\n5: 5438\n5: 5439\n5: 5440\n5: 5441\n5: 5442\n5: 5443\n5: 5444\n5: 5445\n5: 5446\n5: 5447\n5: 5448\n5: 5449\n5: 5450\n5: 5451\n5: 5452\n5: 5453\n5: 5454\n5: 5455\n5: 5456\n5: 5457\n5: 5458\n5: 5459\n5: 5460\n5: 5461\n5: 5462\n5: 5463\n5: 5464\n5: 5465\n5: 5466\n5: 5467\n5: 5468\n5: 5469\n5: 5470\n5: 5471\n5: 5472\n5: 5473\n5: 5474\n5: 5475\n5: 5476\n5: 5477\n5: 5478\n5: 5479\n5: 5480\n5: 5481\n5: 5482\n5: 5483\n5: 5484\n5: 5485\n5: 5486\n5: 5487\n5: 5488\n5: 5489\n5: 5490\n5: 5491\n5: 5492\n5: 5493\n5: 5494\n5: 5495\n5: 5496\n5: 5497\n5: 5498\n5: 5499\n5: 5500\n5: 5501\n5: 5502\n5: 5503\n5: 5504\n5: 5505\n5: 5506\n5: 5507\n5: 5508\n5: 5509\n5: 5510\n5: 5511\n5: 5512\n5: 5513\n5: 5514\n5: 5515\n5: 5516\n5: 5517\n5: 5518\n5: 5519\n5: 5520\n5: 5521\n5: 5522\n5: 5523\n5: 5524\n5: 5525\n5: 5526\n5: 5527\n5: 5528\n5: 5529\n5: 5530\n5: 5531\n5: 5532\n5: 5533\n5: 5534\n5: 5535\n5: 5536\n5: 5537\n5: 5538\n5: 5539\n5: 5540\n5: 5541\n5: 5542\n5: 5543\n5: 5544\n5: 5545\n5: 5546\n5: 5547\n5: 5548\n5: 5549\n5: 5550\n5: 5551\n5: 5552\n5: 5553\n5: 5554\n5: 5555\n5: 5556\n5: 5557\n5: 5558\n5: 5559\n5: 5560\n5: 5561\n5: 5562\n5: 5563\n5: 5564\n5: 5565\n5: 5566\n5: 5567\n5: 5568\n5: 5569\n5: 5570\n5: 5571\n5: 5572\n5: 5573\n5: 5574\n5: 5575\n5: 5576\n5: 5577\n5: 5578\n5: 5579\n5: 5580\n5: 5581\n5: 5582\n5: 5583\n5: 5584\n5: 5585\n5: 5586\n5: 5587\n5: 5588\n5: 5589\n5: 5590\n5: 5591\n5: 5592\n5: 5593\n5: 5594\n5: 5595\n5: 5596\n5: 5597\n5: 5598\n5: 5599\n5: 5600\n5: 5601\n5: 5602\n4: 5603\n4: 5604\n4: 5605\n4: 5606\n4: 5607\n4: 5608\n4: 5609\n4: 5610\n4: 5611\n4: 5612\n4: 5613\n4: 5614\n4: 5615\n4: 5616\n4: 5617\n4: 5618\n4: 5619\n4: 5620\n4: 5621\n4: 5622\n4: 5623\n4: 5624\n4: 5625\n4: 5626\n4: 5627\n4: 5628\n4: 5629\n4: 5630\n4: 5631\n4: 5632\n4: 5633\n4: 5634\n4: 5635\n4: 5636\n4: 5637\n4: 5638\n4: 5639\n4: 5640\n4: 5641\n4: 5642\n4: 5643\n4: 5644\n4: 5645\n4: 5646\n4: 5647\n4: 5648\n4: 5649\n4: 5650\n4: 5651\n4: 5652\n4: 5653\n4: 5654\n4: 5655\n4: 5656\n4: 5657\n4: 5658\n4: 5659\n4: 5660\n4: 5661\n4: 5662\n4: 5663\n4: 5664\n4: 5665\n4: 5666\n4: 5667\n4: 5668\n4: 5669\n4: 5670\n4: 5671\n4: 5672\n4: 5673\n4: 5674\n4: 5675\n4: 5676\n4: 5677\n4: 5678\n4: 5679\n4: 5680\n4: 5681\n4: 5682\n4: 5683\n4: 5684\n4: 5685\n4: 5686\n4: 5687\n4: 5688\n4: 5689\n4: 5690\n4: 5691\n4: 5692\n4: 5693\n4: 5694\n4: 5695\n4: 5696\n4: 5697\n4: 5698\n4: 5699\n4: 5700\n4: 5701\n4: 5702\n4: 5703\n4: 5704\n4: 5705\n4: 5706\n4: 5707\n4: 5708\n4: 5709\n4: 5710\n4: 5711\n4: 5712\n4: 5713\n4: 5714\n4: 5715\n4: 5716\n4: 5717\n4: 5718\n4: 5719\n4: 5720\n4: 5721\n4: 5722\n4: 5723\n4: 5724\n4: 5725\n4: 5726\n4: 5727\n4: 5728\n4: 5729\n4: 5730\n4: 5731\n4: 5732\n4: 5733\n4: 5734\n4: 5735\n4: 5736\n4: 5737\n4: 5738\n4: 5739\n4: 5740\n4: 5741\n4: 5742\n4: 5743\n4: 5744\n4: 5745\n4: 5746\n4: 5747\n4: 5748\n4: 5749\n4: 5750\n4: 5751\n4: 5752\n4: 5753\n4: 5754\n4: 5755\n4: 5756\n4: 5757\n4: 5758\n4: 5759\n4: 5760\n4: 5761\n4: 5762\n4: 5763\n4: 5764\n4: 5765\n4: 5766\n4: 5767\n4: 5768\n4: 5769\n4: 5770\n4: 5771\n4: 5772\n4: 5773\n4: 5774\n4: 5775\n4: 5776\n4: 5777\n4: 5778\n4: 5779\n4: 5780\n4: 5781\n4: 5782\n4: 5783\n4: 5784\n4: 5785\n4: 5786\n4: 5787\n4: 5788\n4: 5789\n4: 5790\n4: 5791\n4: 5792\n4: 5793\n4: 5794\n4: 5795\n4: 5796\n4: 5797\n4: 5798\n4: 5799\n4: 5800\n4: 5801\n4: 5802\n4: 5803\n4: 5804\n4: 5805\n4: 5806\n4: 5807\n4: 5808\n4: 5809\n4: 5810\n4: 5811\n4: 5812\n4: 5813\n4: 5814\n4: 5815\n4: 5816\n4: 5817\n4: 5818\n4: 5819\n4: 5820\n4: 5821\n4: 5822\n4: 5823\n4: 5824\n4: 5825\n4: 5826\n4: 5827\n4: 5828\n4: 5829\n4: 5830\n4: 5831\n4: 5832\n4: 5833\n4: 5834\n4: 5835\n4: 5836\n4: 5837\n4: 5838\n4: 5839\n4: 5840\n4: 5841\n4: 5842\n4: 5843\n4: 5844\n4: 5845\n4: 5846\n4: 5847\n4: 5848\n4: 5849\n4: 5850\n4: 5851\n4: 5852\n4: 5853\n4: 5854\n4: 5855\n4: 5856\n4: 5857\n4: 5858\n4: 5859\n4: 5860\n4: 5861\n4: 5862\n4: 5863\n4: 5864\n4: 5865\n4: 5866\n4: 5867\n4: 5868\n4: 5869\n4: 5870\n4: 5871\n4: 5872\n4: 5873\n4: 5874\n4: 5875\n4: 5876\n4: 5877\n4: 5878\n4: 5879\n4: 5880\n4: 5881\n4: 5882\n4: 5883\n4: 5884\n4: 5885\n4: 5886\n4: 5887\n4: 5888\n4: 5889\n4: 5890\n4: 5891\n4: 5892\n4: 5893\n4: 5894\n4: 5895\n4: 5896\n4: 5897\n4: 5898\n4: 5899\n4: 5900\n4: 5901\n4: 5902\n4: 5903\n4: 5904\n4: 5905\n4: 5906\n4: 5907\n4: 5908\n4: 5909\n4: 5910\n4: 5911\n4: 5912\n4: 5913\n4: 5914\n4: 5915\n4: 5916\n4: 5917\n4: 5918\n4: 5919\n4: 5920\n4: 5921\n4: 5922\n4: 5923\n4: 5924\n4: 5925\n4: 5926\n4: 5927\n4: 5928\n4: 5929\n4: 5930\n4: 5931\n4: 5932\n4: 5933\n4: 5934\n4: 5935\n4: 5936\n4: 5937\n4: 5938\n4: 5939\n4: 5940\n4: 5941\n4: 5942\n4: 5943\n4: 5944\n4: 5945\n4: 5946\n4: 5947\n4: 5948\n4: 5949\n4: 5950\n4: 5951\n4: 5952\n4: 5953\n4: 5954\n4: 5955\n4: 5956\n4: 5957\n4: 5958\n4: 5959\n4: 5960\n4: 5961\n4: 5962\n4: 5963\n4: 5964\n4: 5965\n4: 5966\n4: 5967\n4: 5968\n4: 5969\n4: 5970\n4: 5971\n4: 5972\n4: 5973\n4: 5974\n4: 5975\n4: 5976\n4: 5977\n4: 5978\n4: 5979\n4: 5980\n4: 5981\n4: 5982\n4: 5983\n4: 5984\n4: 5985\n4: 5986\n4: 5987\n4: 5988\n4: 5989\n4: 5990\n4: 5991\n4: 5992\n4: 5993\n4: 5994\n4: 5995\n4: 5996\n4: 5997\n4: 5998\n4: 5999\n4: 6000\n4: 6001\n4: 6002\n4: 6003\n4: 6004\n4: 6005\n4: 6006\n4: 6007\n4: 6008\n4: 6009\n4: 6010\n4: 6011\n4: 6012\n4: 6013\n4: 6014\n4: 6015\n4: 6016\n4: 6017\n4: 6018\n4: 6019\n4: 6020\n4: 6021\n4: 6022\n4: 6023\n4: 6024\n4: 6025\n4: 6026\n4: 6027\n4: 6028\n4: 6029\n4: 6030\n4: 6031\n4: 6032\n4: 6033\n4: 6034\n4: 6035\n4: 6036\n4: 6037\n4: 6038\n4: 6039\n4: 6040\n4: 6041\n4: 6042\n4: 6043\n4: 6044\n4: 6045\n4: 6046\n4: 6047\n4: 6048\n4: 6049\n4: 6050\n4: 6051\n4: 6052\n4: 6053\n4: 6054\n4: 6055\n4: 6056\n4: 6057\n4: 6058\n4: 6059\n4: 6060\n4: 6061\n4: 6062\n4: 6063\n4: 6064\n4: 6065\n4: 6066\n4: 6067\n4: 6068\n4: 6069\n4: 6070\n4: 6071\n4: 6072\n4: 6073\n4: 6074\n4: 6075\n4: 6076\n4: 6077\n4: 6078\n4: 6079\n4: 6080\n4: 6081\n4: 6082\n4: 6083\n4: 6084\n4: 6085\n4: 6086\n4: 6087\n4: 6088\n4: 6089\n4: 6090\n4: 6091\n4: 6092\n4: 6093\n4: 6094\n4: 6095\n4: 6096\n4: 6097\n4: 6098\n4: 6099\n4: 6100\n4: 6101\n4: 6102\n4: 6103\n4: 6104\n4: 6105\n4: 6106\n4: 6107\n4: 6108\n4: 6109\n4: 6110\n4: 6111\n4: 6112\n4: 6113\n4: 6114\n4: 6115\n4: 6116\n4: 6117\n4: 6118\n4: 6119\n4: 6120\n4: 6121\n4: 6122\n4: 6123\n4: 6124\n4: 6125\n4: 6126\n4: 6127\n4: 6128\n4: 6129\n4: 6130\n4: 6131\n4: 6132\n4: 6133\n4: 6134\n4: 6135\n4: 6136\n4: 6137\n4: 6138\n4: 6139\n4: 6140\n4: 6141\n4: 6142\n4: 6143\n4: 6144\n4: 6145\n4: 6146\n4: 6147\n4: 6148\n4: 6149\n4: 6150\n4: 6151\n4: 6152\n4: 6153\n4: 6154\n4: 6155\n4: 6156\n4: 6157\n4: 6158\n4: 6159\n4: 6160\n4: 6161\n4: 6162\n4: 6163\n4: 6164\n4: 6165\n4: 6166\n4: 6167\n4: 6168\n4: 6169\n4: 6170\n4: 6171\n4: 6172\n4: 6173\n4: 6174\n4: 6175\n4: 6176\n4: 6177\n4: 6178\n4: 6179\n4: 6180\n4: 6181\n4: 6182\n4: 6183\n4: 6184\n4: 6185\n4: 6186\n4: 6187\n4: 6188\n5: 6189\n5: 6190\n5: 6191\n5: 6192\n5: 6193\n5: 6194\n5: 6195\n5: 6196\n5: 6197\n5: 6198\n5: 6199\n5: 6200\n5: 6201\n5: 6202\n5: 6203\n5: 6204\n5: 6205\n5: 6206\n5: 6207\n5: 6208\n5: 6209\n5: 6210\n5: 6211\n5: 6212\n5: 6213\n5: 6214\n5: 6215\n5: 6216\n5: 6217\n5: 6218\n5: 6219\n5: 6220\n5: 6221\n5: 6222\n5: 6223\n5: 6224\n5: 6225\n5: 6226\n5: 6227\n5: 6228\n5: 6229\n5: 6230\n5: 6231\n5: 6232\n5: 6233\n5: 6234\n5: 6235\n5: 6236\n5: 6237\n5: 6238\n5: 6239\n5: 6240\n5: 6241\n5: 6242\n5: 6243\n5: 6244\n5: 6245\n5: 6246\n5: 6247\n5: 6248\n5: 6249\n5: 6250\n5: 6251\n5: 6252\n5: 6253\n5: 6254\n5: 6255\n5: 6256\n5: 6257\n5: 6258\n5: 6259\n5: 6260\n5: 6261\n5: 6262\n5: 6263\n5: 6264\n5: 6265\n5: 6266\n5: 6267\n5: 6268\n5: 6269\n5: 6270\n5: 6271\n5: 6272\n5: 6273\n5: 6274\n5: 6275\n5: 6276\n5: 6277\n5: 6278\n5: 6279\n5: 6280\n5: 6281\n5: 6282\n5: 6283\n5: 6284\n5: 6285\n5: 6286\n5: 6287\n5: 6288\n5: 6289\n5: 6290\n5: 6291\n5: 6292\n5: 6293\n5: 6294\n5: 6295\n5: 6296\n5: 6297\n5: 6298\n5: 6299\n5: 6300\n5: 6301\n5: 6302\n5: 6303\n5: 6304\n5: 6305\n5: 6306\n5: 6307\n5: 6308\n5: 6309\n5: 6310\n5: 6311\n5: 6312\n5: 6313\n5: 6314\n5: 6315\n5: 6316\n5: 6317\n5: 6318\n5: 6319\n5: 6320\n5: 6321\n5: 6322\n5: 6323\n5: 6324\n5: 6325\n5: 6326\n5: 6327\n5: 6328\n5: 6329\n5: 6330\n5: 6331\n5: 6332\n5: 6333\n5: 6334\n5: 6335\n5: 6336\n5: 6337\n5: 6338\n5: 6339\n5: 6340\n5: 6341\n5: 6342\n5: 6343\n5: 6344\n5: 6345\n5: 6346\n5: 6347\n5: 6348\n5: 6349\n5: 6350\n5: 6351\n5: 6352\n5: 6353\n5: 6354\n5: 6355\n5: 6356\n5: 6357\n5: 6358\n5: 6359\n5: 6360\n5: 6361\n5: 6362\n5: 6363\n5: 6364\n5: 6365\n5: 6366\n5: 6367\n5: 6368\n5: 6369\n5: 6370\n5: 6371\n5: 6372\n5: 6373\n5: 6374\n5: 6375\n5: 6376\n5: 6377\n5: 6378\n5: 6379\n5: 6380\n5: 6381\n5: 6382\n5: 6383\n5: 6384\n5: 6385\n5: 6386\n5: 6387\n5: 6388\n5: 6389\n5: 6390\n5: 6391\n5: 6392\n5: 6393\n5: 6394\n5: 6395\n5: 6396\n5: 6397\n5: 6398\n5: 6399\n5: 6400\n5: 6401\n5: 6402\n5: 6403\n5: 6404\n5: 6405\n5: 6406\n5: 6407\n5: 6408\n5: 6409\n5: 6410\n5: 6411\n5: 6412\n5: 6413\n5: 6414\n5: 6415\n5: 6416\n5: 6417\n5: 6418\n5: 6419\n5: 6420\n5: 6421\n5: 6422\n5: 6423\n5: 6424\n5: 6425\n5: 6426\n5: 6427\n5: 6428\n5: 6429\n5: 6430\n5: 6431\n5: 6432\n5: 6433\n5: 6434\n5: 6435\n5: 6436\n5: 6437\n5: 6438\n5: 6439\n5: 6440\n5: 6441\n5: 6442\n5: 6443\n5: 6444\n5: 6445\n5: 6446\n5: 6447\n5: 6448\n5: 6449\n5: 6450\n5: 6451\n5: 6452\n5: 6453\n5: 6454\n5: 6455\n5: 6456\n5: 6457\n5: 6458\n5: 6459\n5: 6460\n5: 6461\n5: 6462\n5: 6463\n5: 6464\n5: 6465\n5: 6466\n5: 6467\n5: 6468\n5: 6469\n5: 6470\n5: 6471\n5: 6472\n5: 6473\n5: 6474\n5: 6475\n5: 6476\n5: 6477\n5: 6478\n5: 6479\n5: 6480\n5: 6481\n5: 6482\n5: 6483\n5: 6484\n5: 6485\n5: 6486\n5: 6487\n5: 6488\n5: 6489\n5: 6490\n5: 6491\n5: 6492\n5: 6493\n5: 6494\n5: 6495\n5: 6496\n5: 6497\n5: 6498\n5: 6499\n5: 6500\n5: 6501\n5: 6502\n5: 6503\n5: 6504\n5: 6505\n5: 6506\n5: 6507\n5: 6508\n5: 6509\n5: 6510\n5: 6511\n5: 6512\n5: 6513\n5: 6514\n5: 6515\n5: 6516\n5: 6517\n5: 6518\n5: 6519\n5: 6520\n5: 6521\n5: 6522\n5: 6523\n5: 6524\n5: 6525\n5: 6526\n5: 6527\n5: 6528\n5: 6529\n5: 6530\n5: 6531\n5: 6532\n5: 6533\n5: 6534\n5: 6535\n5: 6536\n5: 6537\n5: 6538\n5: 6539\n5: 6540\n5: 6541\n5: 6542\n5: 6543\n5: 6544\n5: 6545\n5: 6546\n5: 6547\n5: 6548\n5: 6549\n5: 6550\n5: 6551\n5: 6552\n5: 6553\n5: 6554\n5: 6555\n5: 6556\n5: 6557\n5: 6558\n5: 6559\n5: 6560\n5: 6561\n5: 6562\n5: 6563\n5: 6564\n5: 6565\n5: 6566\n4: 6567\n4: 6568\n4: 6569\n4: 6570\n4: 6571\n4: 6572\n4: 6573\n4: 6574\n4: 6575\n4: 6576\n4: 6577\n4: 6578\n4: 6579\n4: 6580\n4: 6581\n4: 6582\n4: 6583\n4: 6584\n4: 6585\n4: 6586\n4: 6587\n4: 6588\n4: 6589\n4: 6590\n4: 6591\n4: 6592\n4: 6593\n4: 6594\n4: 6595\n4: 6596\n4: 6597\n4: 6598\n4: 6599\n4: 6600\n4: 6601\n4: 6602\n4: 6603\n4: 6604\n4: 6605\n4: 6606\n4: 6607\n4: 6608\n4: 6609\n4: 6610\n4: 6611\n4: 6612\n4: 6613\n4: 6614\n4: 6615\n4: 6616\n4: 6617\n4: 6618\n4: 6619\n4: 6620\n4: 6621\n4: 6622\n4: 6623\n4: 6624\n4: 6625\n4: 6626\n4: 6627\n4: 6628\n4: 6629\n4: 6630\n4: 6631\n4: 6632\n4: 6633\n4: 6634\n4: 6635\n4: 6636\n4: 6637\n4: 6638\n4: 6639\n4: 6640\n4: 6641\n4: 6642\n4: 6643\n4: 6644\n4: 6645\n4: 6646\n4: 6647\n4: 6648\n4: 6649\n4: 6650\n4: 6651\n4: 6652\n4: 6653\n4: 6654\n4: 6655\n4: 6656\n4: 6657\n4: 6658\n4: 6659\n4: 6660\n4: 6661\n4: 6662\n4: 6663\n4: 6664\n4: 6665\n4: 6666\n4: 6667\n4: 6668\n4: 6669\n4: 6670\n4: 6671\n4: 6672\n4: 6673\n4: 6674\n4: 6675\n4: 6676\n4: 6677\n4: 6678\n4: 6679\n4: 6680\n4: 6681\n4: 6682\n4: 6683\n4: 6684\n4: 6685\n4: 6686\n4: 6687\n4: 6688\n4: 6689\n4: 6690\n4: 6691\n4: 6692\n4: 6693\n4: 6694\n4: 6695\n4: 6696\n4: 6697\n4: 6698\n4: 6699\n4: 6700\n4: 6701\n4: 6702\n4: 6703\n4: 6704\n4: 6705\n4: 6706\n4: 6707\n4: 6708\n4: 6709\n4: 6710\n4: 6711\n4: 6712\n4: 6713\n4: 6714\n4: 6715\n4: 6716\n4: 6717\n4: 6718\n4: 6719\n4: 6720\n4: 6721\n4: 6722\n4: 6723\n4: 6724\n4: 6725\n4: 6726\n4: 6727\n4: 6728\n4: 6729\n4: 6730\n4: 6731\n4: 6732\n4: 6733\n4: 6734\n4: 6735\n4: 6736\n4: 6737\n4: 6738\n4: 6739\n4: 6740\n4: 6741\n4: 6742\n4: 6743\n4: 6744\n4: 6745\n4: 6746\n4: 6747\n4: 6748\n4: 6749\n4: 6750\n4: 6751\n4: 6752\n4: 6753\n4: 6754\n4: 6755\n4: 6756\n4: 6757\n4: 6758\n4: 6759\n4: 6760\n4: 6761\n4: 6762\n4: 6763\n4: 6764\n4: 6765\n4: 6766\n4: 6767\n4: 6768\n4: 6769\n4: 6770\n4: 6771\n4: 6772\n4: 6773\n4: 6774\n4: 6775\n4: 6776\n4: 6777\n4: 6778\n4: 6779\n4: 6780\n4: 6781\n4: 6782\n4: 6783\n4: 6784\n4: 6785\n4: 6786\n4: 6787\n4: 6788\n4: 6789\n4: 6790\n4: 6791\n4: 6792\n4: 6793\n4: 6794\n4: 6795\n4: 6796\n4: 6797\n4: 6798\n4: 6799\n4: 6800\n4: 6801\n4: 6802\n4: 6803\n4: 6804\n4: 6805\n4: 6806\n4: 6807\n4: 6808\n4: 6809\n4: 6810\n4: 6811\n4: 6812\n4: 6813\n4: 6814\n4: 6815\n4: 6816\n4: 6817\n4: 6818\n4: 6819\n4: 6820\n4: 6821\n4: 6822\n4: 6823\n4: 6824\n4: 6825\n4: 6826\n4: 6827\n4: 6828\n4: 6829\n4: 6830\n4: 6831\n4: 6832\n4: 6833\n4: 6834\n4: 6835\n4: 6836\n4: 6837\n4: 6838\n4: 6839\n4: 6840\n4: 6841\n4: 6842\n4: 6843\n4: 6844\n4: 6845\n4: 6846\n4: 6847\n4: 6848\n4: 6849\n4: 6850\n4: 6851\n4: 6852\n4: 6853\n4: 6854\n4: 6855\n4: 6856\n4: 6857\n4: 6858\n4: 6859\n4: 6860\n4: 6861\n4: 6862\n4: 6863\n4: 6864\n4: 6865\n4: 6866\n4: 6867\n4: 6868\n4: 6869\n4: 6870\n4: 6871\n4: 6872\n4: 6873\n4: 6874\n4: 6875\n4: 6876\n4: 6877\n4: 6878\n4: 6879\n4: 6880\n4: 6881\n4: 6882\n4: 6883\n4: 6884\n4: 6885\n4: 6886\n4: 6887\n4: 6888\n4: 6889\n4: 6890\n4: 6891\n4: 6892\n4: 6893\n4: 6894\n4: 6895\n4: 6896\n4: 6897\n4: 6898\n4: 6899\n4: 6900\n4: 6901\n4: 6902\n4: 6903\n4: 6904\n4: 6905\n4: 6906\n4: 6907\n4: 6908\n4: 6909\n4: 6910\n4: 6911\n4: 6912\n4: 6913\n4: 6914\n4: 6915\n4: 6916\n4: 6917\n4: 6918\n4: 6919\n4: 6920\n4: 6921\n4: 6922\n4: 6923\n4: 6924\n4: 6925\n4: 6926\n4: 6927\n4: 6928\n4: 6929\n4: 6930\n4: 6931\n4: 6932\n4: 6933\n4: 6934\n4: 6935\n4: 6936\n4: 6937\n4: 6938\n4: 6939\n4: 6940\n4: 6941\n4: 6942\n4: 6943\n4: 6944\n4: 6945\n4: 6946\n4: 6947\n4: 6948\n4: 6949\n4: 6950\n4: 6951\n4: 6952\n4: 6953\n4: 6954\n4: 6955\n4: 6956\n4: 6957\n4: 6958\n4: 6959\n4: 6960\n4: 6961\n4: 6962\n4: 6963\n4: 6964\n4: 6965\n4: 6966\n4: 6967\n4: 6968\n4: 6969\n4: 6970\n4: 6971\n4: 6972\n4: 6973\n4: 6974\n4: 6975\n4: 6976\n4: 6977\n4: 6978\n4: 6979\n4: 6980\n4: 6981\n4: 6982\n4: 6983\n4: 6984\n4: 6985\n4: 6986\n4: 6987\n4: 6988\n4: 6989\n4: 6990\n4: 6991\n4: 6992\n4: 6993\n4: 6994\n4: 6995\n4: 6996\n4: 6997\n4: 6998\n4: 6999\n4: 7000\n4: 7001\n4: 7002\n4: 7003\n4: 7004\n4: 7005\n4: 7006\n4: 7007\n4: 7008\n4: 7009\n4: 7010\n4: 7011\n4: 7012\n4: 7013\n4: 7014\n4: 7015\n4: 7016\n4: 7017\n4: 7018\n4: 7019\n4: 7020\n4: 7021\n4: 7022\n4: 7023\n4: 7024\n4: 7025\n4: 7026\n4: 7027\n4: 7028\n4: 7029\n4: 7030\n4: 7031\n4: 7032\n4: 7033\n4: 7034\n4: 7035\n4: 7036\n4: 7037\n4: 7038\n4: 7039\n4: 7040\n4: 7041\n4: 7042\n4: 7043\n4: 7044\n4: 7045\n4: 7046\n4: 7047\n4: 7048\n4: 7049\n4: 7050\n4: 7051\n4: 7052\n4: 7053\n4: 7054\n4: 7055\n4: 7056\n4: 7057\n4: 7058\n4: 7059\n4: 7060\n4: 7061\n4: 7062\n4: 7063\n4: 7064\n4: 7065\n4: 7066\n4: 7067\n4: 7068\n4: 7069\n4: 7070\n4: 7071\n4: 7072\n4: 7073\n4: 7074\n4: 7075\n4: 7076\n4: 7077\n4: 7078\n4: 7079\n4: 7080\n4: 7081\n4: 7082\n4: 7083\n4: 7084\n4: 7085\n4: 7086\n4: 7087\n5: 7088\n5: 7089\n5: 7090\n5: 7091\n5: 7092\n5: 7093\n5: 7094\n5: 7095\n5: 7096\n5: 7097\n5: 7098\n5: 7099\n5: 7100\n5: 7101\n5: 7102\n5: 7103\n5: 7104\n5: 7105\n5: 7106\n5: 7107\n5: 7108\n5: 7109\n5: 7110\n5: 7111\n5: 7112\n5: 7113\n5: 7114\n5: 7115\n5: 7116\n5: 7117\n5: 7118\n5: 7119\n5: 7120\n5: 7121\n5: 7122\n5: 7123\n5: 7124\n5: 7125\n5: 7126\n5: 7127\n5: 7128\n5: 7129\n5: 7130\n5: 7131\n5: 7132\n5: 7133\n5: 7134\n5: 7135\n5: 7136\n5: 7137\n5: 7138\n5: 7139\n5: 7140\n5: 7141\n5: 7142\n5: 7143\n5: 7144\n5: 7145\n5: 7146\n5: 7147\n5: 7148\n5: 7149\n5: 7150\n5: 7151\n5: 7152\n5: 7153\n5: 7154\n5: 7155\n5: 7156\n5: 7157\n5: 7158\n5: 7159\n5: 7160\n5: 7161\n5: 7162\n5: 7163\n5: 7164\n5: 7165\n5: 7166\n5: 7167\n5: 7168\n5: 7169\n5: 7170\n5: 7171\n5: 7172\n5: 7173\n5: 7174\n5: 7175\n5: 7176\n5: 7177\n5: 7178\n5: 7179\n5: 7180\n5: 7181\n5: 7182\n5: 7183\n5: 7184\n5: 7185\n5: 7186\n5: 7187\n5: 7188\n5: 7189\n5: 7190\n5: 7191\n5: 7192\n5: 7193\n5: 7194\n5: 7195\n5: 7196\n5: 7197\n5: 7198\n5: 7199\n5: 7200\n5: 7201\n5: 7202\n5: 7203\n5: 7204\n5: 7205\n5: 7206\n5: 7207\n5: 7208\n5: 7209\n5: 7210\n5: 7211\n5: 7212\n5: 7213\n5: 7214\n5: 7215\n5: 7216\n5: 7217\n5: 7218\n5: 7219\n5: 7220\n5: 7221\n5: 7222\n5: 7223\n5: 7224\n5: 7225\n5: 7226\n5: 7227\n5: 7228\n5: 7229\n5: 7230\n5: 7231\n5: 7232\n5: 7233\n5: 7234\n5: 7235\n5: 7236\n5: 7237\n5: 7238\n5: 7239\n5: 7240\n5: 7241\n5: 7242\n5: 7243\n5: 7244\n5: 7245\n5: 7246\n5: 7247\n5: 7248\n5: 7249\n5: 7250\n5: 7251\n5: 7252\n5: 7253\n5: 7254\n5: 7255\n5: 7256\n5: 7257\n5: 7258\n5: 7259\n5: 7260\n5: 7261\n5: 7262\n5: 7263\n5: 7264\n5: 7265\n5: 7266\n5: 7267\n5: 7268\n5: 7269\n5: 7270\n5: 7271\n5: 7272\n5: 7273\n5: 7274\n5: 7275\n5: 7276\n5: 7277\n5: 7278\n5: 7279\n5: 7280\n5: 7281\n5: 7282\n5: 7283\n5: 7284\n5: 7285\n5: 7286\n5: 7287\n5: 7288\n5: 7289\n5: 7290\n5: 7291\n5: 7292\n5: 7293\n5: 7294\n5: 7295\n5: 7296\n5: 7297\n5: 7298\n5: 7299\n5: 7300\n5: 7301\n5: 7302\n5: 7303\n5: 7304\n5: 7305\n5: 7306\n5: 7307\n5: 7308\n5: 7309\n5: 7310\n5: 7311\n5: 7312\n5: 7313\n5: 7314\n5: 7315\n5: 7316\n5: 7317\n5: 7318\n5: 7319\n5: 7320\n5: 7321\n5: 7322\n5: 7323\n5: 7324\n5: 7325\n5: 7326\n5: 7327\n5: 7328\n5: 7329\n5: 7330\n5: 7331\n5: 7332\n5: 7333\n5: 7334\n5: 7335\n5: 7336\n5: 7337\n5: 7338\n5: 7339\n5: 7340\n5: 7341\n5: 7342\n5: 7343\n5: 7344\n5: 7345\n5: 7346\n5: 7347\n5: 7348\n5: 7349\n5: 7350\n5: 7351\n5: 7352\n5: 7353\n5: 7354\n5: 7355\n5: 7356\n5: 7357\n5: 7358\n5: 7359\n5: 7360\n5: 7361\n5: 7362\n5: 7363\n5: 7364\n5: 7365\n5: 7366\n5: 7367\n5: 7368\n5: 7369\n5: 7370\n5: 7371\n5: 7372\n5: 7373\n5: 7374\n5: 7375\n5: 7376\n5: 7377\n5: 7378\n5: 7379\n5: 7380\n5: 7381\n5: 7382\n5: 7383\n5: 7384\n5: 7385\n5: 7386\n5: 7387\n5: 7388\n5: 7389\n5: 7390\n5: 7391\n5: 7392\n5: 7393\n5: 7394\n5: 7395\n5: 7396\n5: 7397\n5: 7398\n5: 7399\n5: 7400\n5: 7401\n5: 7402\n5: 7403\n5: 7404\n5: 7405\n5: 7406\n5: 7407\n5: 7408\n5: 7409\n5: 7410\n5: 7411\n5: 7412\n5: 7413\n5: 7414\n5: 7415\n5: 7416\n5: 7417\n5: 7418\n5: 7419\n5: 7420\n5: 7421\n5: 7422\n5: 7423\n5: 7424\n5: 7425\n5: 7426\n5: 7427\n5: 7428\n5: 7429\n5: 7430\n5: 7431\n5: 7432\n5: 7433\n5: 7434\n5: 7435\n5: 7436\n5: 7437\n5: 7438\n5: 7439\n5: 7440\n5: 7441\n5: 7442\n5: 7443\n5: 7444\n5: 7445\n5: 7446\n5: 7447\n5: 7448\n5: 7449\n5: 7450\n5: 7451\n5: 7452\n5: 7453\n5: 7454\n5: 7455\n5: 7456\n5: 7457\n5: 7458\n5: 7459\n5: 7460\n5: 7461\n5: 7462\n5: 7463\n5: 7464\n5: 7465\n5: 7466\n5: 7467\n5: 7468\n5: 7469\n5: 7470\n5: 7471\n5: 7472\n5: 7473\n5: 7474\n5: 7475\n5: 7476\n5: 7477\n5: 7478\n5: 7479\n5: 7480\n5: 7481\n5: 7482\n5: 7483\n5: 7484\n5: 7485\n5: 7486\n5: 7487\n5: 7488\n5: 7489\n5: 7490\n5: 7491\n5: 7492\n5: 7493\n5: 7494\n5: 7495\n5: 7496\n5: 7497\n5: 7498\n5: 7499\n5: 7500\n5: 7501\n5: 7502\n5: 7503\n5: 7504\n5: 7505\n5: 7506\n5: 7507\n5: 7508\n5: 7509\n5: 7510\n5: 7511\n5: 7512\n5: 7513\n5: 7514\n5: 7515\n5: 7516\n5: 7517\n5: 7518\n5: 7519\n5: 7520\n5: 7521\n5: 7522\n5: 7523\n5: 7524\n5: 7525\n5: 7526\n5: 7527\n5: 7528\n5: 7529\n5: 7530\n5: 7531\n5: 7532\n5: 7533\n5: 7534\n5: 7535\n5: 7536\n5: 7537\n5: 7538\n5: 7539\n5: 7540\n5: 7541\n5: 7542\n5: 7543\n5: 7544\n5: 7545\n5: 7546\n5: 7547\n5: 7548\n5: 7549\n5: 7550\n5: 7551\n5: 7552\n5: 7553\n5: 7554\n5: 7555\n5: 7556\n5: 7557\n5: 7558\n5: 7559\n5: 7560\n5: 7561\n5: 7562\n5: 7563\n5: 7564\n5: 7565\n5: 7566\n5: 7567\n5: 7568\n5: 7569\n5: 7570\n5: 7571\n5: 7572\n5: 7573\n5: 7574\n5: 7575\n5: 7576\n5: 7577\n5: 7578\n5: 7579\n5: 7580\n5: 7581\n5: 7582\n5: 7583\n5: 7584\n5: 7585\n5: 7586\n5: 7587\n5: 7588\n5: 7589\n5: 7590\n5: 7591\n5: 7592\n5: 7593\n5: 7594\n5: 7595\n5: 7596\n5: 7597\n5: 7598\n5: 7599\n5: 7600\n5: 7601\n5: 7602\n5: 7603\n5: 7604\n5: 7605\n5: 7606\n5: 7607\n5: 7608\n5: 7609\n5: 7610\n5: 7611\n5: 7612\n5: 7613\n5: 7614\n5: 7615\n5: 7616\n5: 7617\n5: 7618\n5: 7619\n5: 7620\n5: 7621\n5: 7622\n5: 7623\n5: 7624\n5: 7625\n5: 7626\n5: 7627\n5: 7628\n5: 7629\n5: 7630\n5: 7631\n5: 7632\n5: 7633\n5: 7634\n5: 7635\n5: 7636\n5: 7637\n5: 7638\n5: 7639\n5: 7640\n5: 7641\n5: 7642\n5: 7643\n5: 7644\n5: 7645\n5: 7646\n5: 7647\n5: 7648\n5: 7649\n5: 7650\n5: 7651\n5: 7652\n5: 7653\n5: 7654\n5: 7655\n5: 7656\n5: 7657\n5: 7658\n5: 7659\n5: 7660\n5: 7661\n5: 7662\n5: 7663\n5: 7664\n5: 7665\n5: 7666\n5: 7667\n5: 7668\n5: 7669\n5: 7670\n5: 7671\n5: 7672\n5: 7673\n5: 7674\n5: 7675\n5: 7676\n5: 7677\n5: 7678\n5: 7679\n5: 7680\n5: 7681\n5: 7682\n5: 7683\n5: 7684\n5: 7685\n5: 7686\n5: 7687\n5: 7688\n5: 7689\n5: 7690\n5: 7691\n5: 7692\n5: 7693\n5: 7694\n5: 7695\n5: 7696\n5: 7697\n5: 7698\n5: 7699\n5: 7700\n5: 7701\n5: 7702\n5: 7703\n5: 7704\n5: 7705\n5: 7706\n5: 7707\n5: 7708\n5: 7709\n5: 7710\n5: 7711\n5: 7712\n5: 7713\n5: 7714\n5: 7715\n5: 7716\n5: 7717\n5: 7718\n5: 7719\n5: 7720\n5: 7721\n5: 7722\n5: 7723\n5: 7724\n5: 7725\n5: 7726\n5: 7727\n5: 7728\n5: 7729\n5: 7730\n5: 7731\n5: 7732\n5: 7733\n5: 7734\n5: 7735\n5: 7736\n5: 7737\n5: 7738\n5: 7739\n5: 7740\n5: 7741\n5: 7742\n5: 7743\n5: 7744\n5: 7745\n5: 7746\n5: 7747\n5: 7748\n5: 7749\n5: 7750\n5: 7751\n5: 7752\n5: 7753\n5: 7754\n5: 7755\n5: 7756\n5: 7757\n5: 7758\n5: 7759\n5: 7760\n5: 7761\n5: 7762\n5: 7763\n5: 7764\n5: 7765\n5: 7766\n5: 7767\n5: 7768\n5: 7769\n5: 7770\n5: 7771\n5: 7772\n5: 7773\n5: 7774\n5: 7775\n5: 7776\n5: 7777\n5: 7778\n5: 7779\n5: 7780\n5: 7781\n5: 7782\n5: 7783\n5: 7784\n5: 7785\n5: 7786\n5: 7787\n5: 7788\n5: 7789\n5: 7790\n5: 7791\n5: 7792\n5: 7793\n5: 7794\n5: 7795\n5: 7796\n5: 7797\n5: 7798\n5: 7799\n5: 7800\n5: 7801\n5: 7802\n5: 7803\n5: 7804\n5: 7805\n5: 7806\n5: 7807\n5: 7808\n5: 7809\n5: 7810\n5: 7811\n5: 7812\n5: 7813\n5: 7814\n5: 7815\n5: 7816\n5: 7817\n5: 7818\n5: 7819\n4: 7820\n4: 7821\n4: 7822\n4: 7823\n4: 7824\n4: 7825\n4: 7826\n4: 7827\n4: 7828\n4: 7829\n4: 7830\n4: 7831\n4: 7832\n4: 7833\n4: 7834\n4: 7835\n4: 7836\n4: 7837\n4: 7838\n4: 7839\n4: 7840\n4: 7841\n4: 7842\n4: 7843\n4: 7844\n4: 7845\n4: 7846\n4: 7847\n4: 7848\n4: 7849\n4: 7850\n4: 7851\n4: 7852\n4: 7853\n4: 7854\n4: 7855\n4: 7856\n4: 7857\n4: 7858\n4: 7859\n4: 7860\n4: 7861\n4: 7862\n4: 7863\n4: 7864\n4: 7865\n4: 7866\n4: 7867\n4: 7868\n4: 7869\n4: 7870\n4: 7871\n4: 7872\n4: 7873\n4: 7874\n4: 7875\n4: 7876\n4: 7877\n4: 7878\n4: 7879\n4: 7880\n4: 7881\n4: 7882\n4: 7883\n4: 7884\n4: 7885\n4: 7886\n4: 7887\n4: 7888\n4: 7889\n4: 7890\n4: 7891\n4: 7892\n4: 7893\n4: 7894\n4: 7895\n4: 7896\n4: 7897\n4: 7898\n4: 7899\n4: 7900\n4: 7901\n4: 7902\n4: 7903\n4: 7904\n4: 7905\n4: 7906\n4: 7907\n4: 7908\n4: 7909\n4: 7910\n4: 7911\n4: 7912\n4: 7913\n4: 7914\n4: 7915\n4: 7916\n4: 7917\n4: 7918\n4: 7919\n4: 7920\n4: 7921\n4: 7922\n4: 7923\n4: 7924\n4: 7925\n4: 7926\n4: 7927\n4: 7928\n4: 7929\n4: 7930\n4: 7931\n4: 7932\n4: 7933\n4: 7934\n4: 7935\n4: 7936\n4: 7937\n4: 7938\n4: 7939\n4: 7940\n4: 7941\n4: 7942\n4: 7943\n4: 7944\n4: 7945\n4: 7946\n4: 7947\n4: 7948\n4: 7949\n4: 7950\n4: 7951\n4: 7952\n4: 7953\n4: 7954\n4: 7955\n4: 7956\n4: 7957\n4: 7958\n4: 7959\n4: 7960\n4: 7961\n4: 7962\n4: 7963\n4: 7964\n4: 7965\n4: 7966\n4: 7967\n4: 7968\n4: 7969\n4: 7970\n4: 7971\n4: 7972\n4: 7973\n4: 7974\n4: 7975\n4: 7976\n4: 7977\n4: 7978\n4: 7979\n4: 7980\n4: 7981\n4: 7982\n4: 7983\n4: 7984\n4: 7985\n4: 7986\n4: 7987\n4: 7988\n4: 7989\n4: 7990\n4: 7991\n4: 7992\n4: 7993\n4: 7994\n4: 7995\n4: 7996\n4: 7997\n4: 7998\n4: 7999\n4: 8000\n4: 8001\n4: 8002\n4: 8003\n4: 8004\n4: 8005\n4: 8006\n4: 8007\n4: 8008\n4: 8009\n4: 8010\n4: 8011\n4: 8012\n4: 8013\n4: 8014\n4: 8015\n4: 8016\n4: 8017\n4: 8018\n4: 8019\n4: 8020\n4: 8021\n4: 8022\n4: 8023\n4: 8024\n4: 8025\n4: 8026\n4: 8027\n4: 8028\n4: 8029\n4: 8030\n4: 8031\n4: 8032\n4: 8033\n4: 8034\n4: 8035\n4: 8036\n4: 8037\n4: 8038\n4: 8039\n4: 8040\n4: 8041\n4: 8042\n4: 8043\n4: 8044\n4: 8045\n4: 8046\n4: 8047\n4: 8048\n4: 8049\n4: 8050\n4: 8051\n4: 8052\n4: 8053\n4: 8054\n4: 8055\n4: 8056\n4: 8057\n4: 8058\n4: 8059\n4: 8060\n4: 8061\n4: 8062\n4: 8063\n4: 8064\n4: 8065\n4: 8066\n4: 8067\n4: 8068\n4: 8069\n5: 8070\n5: 8071\n5: 8072\n5: 8073\n5: 8074\n5: 8075\n5: 8076\n5: 8077\n5: 8078\n5: 8079\n5: 8080\n5: 8081\n5: 8082\n5: 8083\n5: 8084\n5: 8085\n5: 8086\n5: 8087\n5: 8088\n5: 8089\n5: 8090\n5: 8091\n5: 8092\n5: 8093\n5: 8094\n5: 8095\n5: 8096\n5: 8097\n5: 8098\n5: 8099\n5: 8100\n5: 8101\n5: 8102\n5: 8103\n5: 8104\n5: 8105\n5: 8106\n5: 8107\n5: 8108\n5: 8109\n5: 8110\n5: 8111\n5: 8112\n5: 8113\n5: 8114\n5: 8115\n5: 8116\n5: 8117\n5: 8118\n5: 8119\n5: 8120\n5: 8121\n5: 8122\n5: 8123\n5: 8124\n5: 8125\n5: 8126\n5: 8127\n5: 8128\n5: 8129\n5: 8130\n5: 8131\n5: 8132\n5: 8133\n5: 8134\n5: 8135\n5: 8136\n5: 8137\n5: 8138\n5: 8139\n5: 8140\n5: 8141\n5: 8142\n5: 8143\n5: 8144\n5: 8145\n5: 8146\n5: 8147\n5: 8148\n5: 8149\n5: 8150\n5: 8151\n5: 8152\n5: 8153\n5: 8154\n5: 8155\n5: 8156\n5: 8157\n5: 8158\n5: 8159\n5: 8160\n5: 8161\n5: 8162\n5: 8163\n5: 8164\n5: 8165\n5: 8166\n5: 8167\n5: 8168\n5: 8169\n5: 8170\n5: 8171\n5: 8172\n5: 8173\n5: 8174\n5: 8175\n5: 8176\n5: 8177\n5: 8178\n5: 8179\n5: 8180\n5: 8181\n5: 8182\n5: 8183\n5: 8184\n5: 8185\n5: 8186\n5: 8187\n5: 8188\n5: 8189\n5: 8190\n5: 8191\n5: 8192\n5: 8193\n5: 8194\n5: 8195\n5: 8196\n5: 8197\n5: 8198\n5: 8199\n5: 8200\n5: 8201\n5: 8202\n5: 8203\n5: 8204\n5: 8205\n5: 8206\n5: 8207\n5: 8208\n5: 8209\n5: 8210\n5: 8211\n5: 8212\n5: 8213\n5: 8214\n5: 8215\n5: 8216\n5: 8217\n5: 8218\n5: 8219\n5: 8220\n5: 8221\n5: 8222\n5: 8223\n5: 8224\n5: 8225\n5: 8226\n5: 8227\n5: 8228\n5: 8229\n5: 8230\n5: 8231\n5: 8232\n5: 8233\n5: 8234\n5: 8235\n5: 8236\n5: 8237\n5: 8238\n5: 8239\n5: 8240\n5: 8241\n5: 8242\n5: 8243\n5: 8244\n5: 8245\n5: 8246\n5: 8247\n5: 8248\n5: 8249\n5: 8250\n5: 8251\n5: 8252\n5: 8253\n5: 8254\n5: 8255\n5: 8256\n5: 8257\n5: 8258\n5: 8259\n5: 8260\n5: 8261\n5: 8262\n5: 8263\n5: 8264\n5: 8265\n5: 8266\n5: 8267\n5: 8268\n5: 8269\n5: 8270\n5: 8271\n5: 8272\n5: 8273\n5: 8274\n5: 8275\n5: 8276\n5: 8277\n5: 8278\n5: 8279\n5: 8280\n5: 8281\n5: 8282\n5: 8283\n5: 8284\n5: 8285\n5: 8286\n5: 8287\n5: 8288\n5: 8289\n5: 8290\n5: 8291\n5: 8292\n5: 8293\n5: 8294\n5: 8295\n5: 8296\n5: 8297\n5: 8298\n5: 8299\n5: 8300\n5: 8301\n5: 8302\n5: 8303\n5: 8304\n5: 8305\n5: 8306\n5: 8307\n5: 8308\n5: 8309\n5: 8310\n5: 8311\n5: 8312\n5: 8313\n5: 8314\n5: 8315\n5: 8316\n5: 8317\n5: 8318\n5: 8319\n5: 8320\n5: 8321\n5: 8322\n5: 8323\n5: 8324\n5: 8325\n5: 8326\n5: 8327\n5: 8328\n5: 8329\n5: 8330\n5: 8331\n5: 8332\n5: 8333\n5: 8334\n5: 8335\n5: 8336\n5: 8337\n5: 8338\n5: 8339\n5: 8340\n5: 8341\n5: 8342\n5: 8343\n5: 8344\n5: 8345\n5: 8346\n5: 8347\n5: 8348\n5: 8349\n5: 8350\n5: 8351\n5: 8352\n5: 8353\n5: 8354\n5: 8355\n5: 8356\n5: 8357\n5: 8358\n5: 8359\n5: 8360\n5: 8361\n5: 8362\n5: 8363\n5: 8364\n5: 8365\n5: 8366\n5: 8367\n5: 8368\n5: 8369\n5: 8370\n5: 8371\n5: 8372\n5: 8373\n5: 8374\n5: 8375\n5: 8376\n5: 8377\n5: 8378\n5: 8379\n5: 8380\n5: 8381\n5: 8382\n5: 8383\n5: 8384\n5: 8385\n5: 8386\n5: 8387\n5: 8388\n5: 8389\n5: 8390\n5: 8391\n5: 8392\n5: 8393\n5: 8394\n5: 8395\n5: 8396\n5: 8397\n5: 8398\n5: 8399\n5: 8400\n5: 8401\n5: 8402\n5: 8403\n5: 8404\n5: 8405\n5: 8406\n5: 8407\n5: 8408\n5: 8409\n5: 8410\n5: 8411\n5: 8412\n5: 8413\n5: 8414\n5: 8415\n5: 8416\n5: 8417\n5: 8418\n5: 8419\n5: 8420\n5: 8421\n5: 8422\n5: 8423\n5: 8424\n5: 8425\n5: 8426\n5: 8427\n5: 8428\n5: 8429\n5: 8430\n5: 8431\n5: 8432\n5: 8433\n5: 8434\n5: 8435\n5: 8436\n5: 8437\n5: 8438\n5: 8439\n5: 8440\n5: 8441\n5: 8442\n5: 8443\n5: 8444\n5: 8445\n5: 8446\n5: 8447\n5: 8448\n5: 8449\n5: 8450\n5: 8451\n5: 8452\n5: 8453\n5: 8454\n5: 8455\n5: 8456\n5: 8457\n5: 8458\n5: 8459\n5: 8460\n5: 8461\n5: 8462\n5: 8463\n5: 8464\n5: 8465\n5: 8466\n5: 8467\n5: 8468\n5: 8469\n5: 8470\n5: 8471\n5: 8472\n5: 8473\n5: 8474\n5: 8475\n5: 8476\n5: 8477\n5: 8478\n5: 8479\n5: 8480\n5: 8481\n5: 8482\n5: 8483\n5: 8484\n5: 8485\n5: 8486\n5: 8487\n5: 8488\n5: 8489\n5: 8490\n5: 8491\n5: 8492\n5: 8493\n5: 8494\n5: 8495\n5: 8496\n5: 8497\n5: 8498\n5: 8499\n5: 8500\n5: 8501\n5: 8502\n5: 8503\n5: 8504\n5: 8505\n5: 8506\n5: 8507\n5: 8508\n5: 8509\n5: 8510\n5: 8511\n5: 8512\n5: 8513\n5: 8514\n5: 8515\n5: 8516\n5: 8517\n5: 8518\n5: 8519\n5: 8520\n5: 8521\n5: 8522\n5: 8523\n5: 8524\n5: 8525\n5: 8526\n5: 8527\n5: 8528\n5: 8529\n5: 8530\n5: 8531\n5: 8532\n5: 8533\n5: 8534\n5: 8535\n5: 8536\n5: 8537\n5: 8538\n5: 8539\n5: 8540\n5: 8541\n5: 8542\n5: 8543\n5: 8544\n5: 8545\n5: 8546\n5: 8547\n5: 8548\n5: 8549\n5: 8550\n5: 8551\n5: 8552\n5: 8553\n5: 8554\n5: 8555\n5: 8556\n5: 8557\n5: 8558\n5: 8559\n5: 8560\n5: 8561\n5: 8562\n5: 8563\n5: 8564\n5: 8565\n5: 8566\n5: 8567\n5: 8568\n5: 8569\n5: 8570\n4: 8571\n4: 8572\n4: 8573\n4: 8574\n4: 8575\n4: 8576\n4: 8577\n4: 8578\n4: 8579\n4: 8580\n4: 8581\n4: 8582\n4: 8583\n4: 8584\n4: 8585\n4: 8586\n4: 8587\n4: 8588\n4: 8589\n4: 8590\n4: 8591\n4: 8592\n4: 8593\n4: 8594\n4: 8595\n4: 8596\n4: 8597\n4: 8598\n4: 8599\n4: 8600\n4: 8601\n4: 8602\n4: 8603\n4: 8604\n4: 8605\n4: 8606\n4: 8607\n4: 8608\n4: 8609\n4: 8610\n4: 8611\n4: 8612\n4: 8613\n4: 8614\n4: 8615\n4: 8616\n4: 8617\n4: 8618\n4: 8619\n4: 8620\n4: 8621\n4: 8622\n4: 8623\n4: 8624\n4: 8625\n4: 8626\n4: 8627\n4: 8628\n4: 8629\n4: 8630\n4: 8631\n4: 8632\n4: 8633\n4: 8634\n4: 8635\n4: 8636\n4: 8637\n4: 8638\n4: 8639\n4: 8640\n4: 8641\n4: 8642\n4: 8643\n4: 8644\n4: 8645\n4: 8646\n4: 8647\n4: 8648\n4: 8649\n4: 8650\n4: 8651\n4: 8652\n4: 8653\n4: 8654\n4: 8655\n4: 8656\n4: 8657\n4: 8658\n4: 8659\n4: 8660\n4: 8661\n4: 8662\n4: 8663\n4: 8664\n4: 8665\n4: 8666\n4: 8667\n4: 8668\n4: 8669\n4: 8670\n4: 8671\n4: 8672\n4: 8673\n4: 8674\n4: 8675\n4: 8676\n4: 8677\n4: 8678\n4: 8679\n4: 8680\n4: 8681\n4: 8682\n4: 8683\n4: 8684\n4: 8685\n4: 8686\n4: 8687\n4: 8688\n4: 8689\n4: 8690\n4: 8691\n4: 8692\n4: 8693\n4: 8694\n4: 8695\n4: 8696\n4: 8697\n4: 8698\n4: 8699\n4: 8700\n4: 8701\n4: 8702\n4: 8703\n4: 8704\n4: 8705\n4: 8706\n4: 8707\n4: 8708\n4: 8709\n4: 8710\n4: 8711\n4: 8712\n4: 8713\n4: 8714\n4: 8715\n4: 8716\n4: 8717\n4: 8718\n4: 8719\n4: 8720\n4: 8721\n4: 8722\n4: 8723\n4: 8724\n4: 8725\n4: 8726\n4: 8727\n4: 8728\n4: 8729\n4: 8730\n4: 8731\n4: 8732\n4: 8733\n4: 8734\n4: 8735\n4: 8736\n4: 8737\n4: 8738\n4: 8739\n4: 8740\n4: 8741\n4: 8742\n4: 8743\n4: 8744\n4: 8745\n4: 8746\n4: 8747\n4: 8748\n4: 8749\n4: 8750\n4: 8751\n4: 8752\n4: 8753\n4: 8754\n4: 8755\n4: 8756\n4: 8757\n4: 8758\n4: 8759\n4: 8760\n4: 8761\n4: 8762\n4: 8763\n4: 8764\n4: 8765\n4: 8766\n4: 8767\n4: 8768\n4: 8769\n4: 8770\n4: 8771\n4: 8772\n4: 8773\n4: 8774\n4: 8775\n4: 8776\n4: 8777\n4: 8778\n4: 8779\n4: 8780\n4: 8781\n4: 8782\n4: 8783\n4: 8784\n4: 8785\n4: 8786\n4: 8787\n4: 8788\n4: 8789\n4: 8790\n4: 8791\n4: 8792\n4: 8793\n4: 8794\n4: 8795\n4: 8796\n4: 8797\n4: 8798\n4: 8799\n4: 8800\n4: 8801\n4: 8802\n4: 8803\n4: 8804\n4: 8805\n4: 8806\n4: 8807\n4: 8808\n4: 8809\n4: 8810\n4: 8811\n4: 8812\n4: 8813\n4: 8814\n4: 8815\n4: 8816\n4: 8817\n4: 8818\n4: 8819\n4: 8820\n4: 8821\n4: 8822\n4: 8823\n4: 8824\n4: 8825\n4: 8826\n4: 8827\n4: 8828\n4: 8829\n4: 8830\n4: 8831\n4: 8832\n4: 8833\n4: 8834\n4: 8835\n4: 8836\n4: 8837\n4: 8838\n4: 8839\n4: 8840\n4: 8841\n4: 8842\n4: 8843\n4: 8844\n4: 8845\n4: 8846\n4: 8847\n4: 8848\n4: 8849\n4: 8850\n4: 8851\n4: 8852\n4: 8853\n4: 8854\n4: 8855\n4: 8856\n4: 8857\n4: 8858\n4: 8859\n4: 8860\n4: 8861\n4: 8862\n4: 8863\n4: 8864\n4: 8865\n4: 8866\n4: 8867\n4: 8868\n4: 8869\n4: 8870\n4: 8871\n4: 8872\n4: 8873\n4: 8874\n4: 8875\n4: 8876\n4: 8877\n4: 8878\n4: 8879\n4: 8880\n4: 8881\n4: 8882\n4: 8883\n4: 8884\n4: 8885\n4: 8886\n4: 8887\n4: 8888\n4: 8889\n4: 8890\n4: 8891\n4: 8892\n4: 8893\n4: 8894\n4: 8895\n4: 8896\n4: 8897\n4: 8898\n4: 8899\n4: 8900\n4: 8901\n4: 8902\n4: 8903\n4: 8904\n4: 8905\n4: 8906\n4: 8907\n4: 8908\n4: 8909\n4: 8910\n4: 8911\n4: 8912\n4: 8913\n4: 8914\n4: 8915\n4: 8916\n4: 8917\n4: 8918\n4: 8919\n4: 8920\n4: 8921\n4: 8922\n4: 8923\n4: 8924\n4: 8925\n4: 8926\n4: 8927\n4: 8928\n4: 8929\n4: 8930\n4: 8931\n4: 8932\n4: 8933\n4: 8934\n4: 8935\n4: 8936\n4: 8937\n4: 8938\n4: 8939\n4: 8940\n4: 8941\n4: 8942\n4: 8943\n4: 8944\n4: 8945\n4: 8946\n4: 8947\n4: 8948\n4: 8949\n4: 8950\n4: 8951\n4: 8952\n4: 8953\n4: 8954\n4: 8955\n4: 8956\n4: 8957\n4: 8958\n4: 8959\n4: 8960\n4: 8961\n4: 8962\n4: 8963\n4: 8964\n4: 8965\n4: 8966\n4: 8967\n4: 8968\n4: 8969\n4: 8970\n4: 8971\n4: 8972\n4: 8973\n4: 8974\n4: 8975\n4: 8976\n4: 8977\n4: 8978\n4: 8979\n4: 8980\n4: 8981\n4: 8982\n4: 8983\n4: 8984\n4: 8985\n4: 8986\n4: 8987\n4: 8988\n4: 8989\n4: 8990\n4: 8991\n4: 8992\n4: 8993\n4: 8994\n4: 8995\n4: 8996\n4: 8997\n4: 8998\n4: 8999\n4: 9000\n4: 9001\n4: 9002\n4: 9003\n4: 9004\n4: 9005\n4: 9006\n4: 9007\n4: 9008\n4: 9009\n4: 9010\n4: 9011\n4: 9012\n4: 9013\n4: 9014\n4: 9015\n4: 9016\n4: 9017\n4: 9018\n4: 9019\n4: 9020\n4: 9021\n4: 9022\n4: 9023\n4: 9024\n4: 9025\n4: 9026\n4: 9027\n4: 9028\n4: 9029\n4: 9030\n4: 9031\n4: 9032\n4: 9033\n4: 9034\n4: 9035\n4: 9036\n4: 9037\n4: 9038\n4: 9039\n4: 9040\n4: 9041\n4: 9042\n4: 9043\n4: 9044\n4: 9045\n4: 9046\n4: 9047\n4: 9048\n4: 9049\n4: 9050\n4: 9051\n4: 9052\n4: 9053\n4: 9054\n4: 9055\n4: 9056\n4: 9057\n4: 9058\n4: 9059\n4: 9060\n4: 9061\n4: 9062\n4: 9063\n4: 9064\n4: 9065\n4: 9066\n4: 9067\n4: 9068\n4: 9069\n4: 9070\n4: 9071\n4: 9072\n4: 9073\n4: 9074\n4: 9075\n4: 9076\n4: 9077\n4: 9078\n4: 9079\n4: 9080\n4: 9081\n4: 9082\n4: 9083\n4: 9084\n4: 9085\n4: 9086\n4: 9087\n4: 9088\n4: 9089\n4: 9090\n4: 9091\n4: 9092\n4: 9093\n4: 9094\n4: 9095\n4: 9096\n4: 9097\n4: 9098\n4: 9099\n4: 9100\n4: 9101\n4: 9102\n4: 9103\n4: 9104\n4: 9105\n4: 9106\n4: 9107\n4: 9108\n4: 9109\n4: 9110\n4: 9111\n4: 9112\n4: 9113\n4: 9114\n4: 9115\n4: 9116\n4: 9117\n4: 9118\n4: 9119\n4: 9120\n4: 9121\n4: 9122\n4: 9123\n4: 9124\n4: 9125\n4: 9126\n4: 9127\n4: 9128\n4: 9129\n4: 9130\n4: 9131\n4: 9132\n4: 9133\n4: 9134\n4: 9135\n4: 9136\n4: 9137\n4: 9138\n4: 9139\n4: 9140\n4: 9141\n4: 9142\n4: 9143\n4: 9144\n4: 9145\n4: 9146\n4: 9147\n4: 9148\n4: 9149\n4: 9150\n4: 9151\n4: 9152\n4: 9153\n4: 9154\n4: 9155\n4: 9156\n4: 9157\n4: 9158\n4: 9159\n4: 9160\n4: 9161\n4: 9162\n4: 9163\n4: 9164\n4: 9165\n4: 9166\n4: 9167\n4: 9168\n4: 9169\n4: 9170\n4: 9171\n4: 9172\n4: 9173\n4: 9174\n4: 9175\n4: 9176\n4: 9177\n4: 9178\n4: 9179\n4: 9180\n4: 9181\n4: 9182\n4: 9183\n4: 9184\n4: 9185\n4: 9186\n4: 9187\n4: 9188\n4: 9189\n4: 9190\n4: 9191\n4: 9192\n4: 9193\n4: 9194\n4: 9195\n4: 9196\n4: 9197\n4: 9198\n4: 9199\n4: 9200\n4: 9201\n4: 9202\n4: 9203\n4: 9204\n4: 9205\n4: 9206\n4: 9207\n4: 9208\n4: 9209\n4: 9210\n4: 9211\n4: 9212\n4: 9213\n4: 9214\n4: 9215\n4: 9216\n4: 9217\n4: 9218\n5: 9219\n5: 9220\n5: 9221\n5: 9222\n5: 9223\n5: 9224\n5: 9225\n5: 9226\n5: 9227\n5: 9228\n5: 9229\n5: 9230\n5: 9231\n5: 9232\n5: 9233\n5: 9234\n5: 9235\n5: 9236\n5: 9237\n5: 9238\n5: 9239\n5: 9240\n5: 9241\n5: 9242\n5: 9243\n5: 9244\n5: 9245\n5: 9246\n5: 9247\n5: 9248\n5: 9249\n5: 9250\n5: 9251\n5: 9252\n5: 9253\n5: 9254\n5: 9255\n5: 9256\n5: 9257\n5: 9258\n5: 9259\n5: 9260\n5: 9261\n5: 9262\n5: 9263\n5: 9264\n5: 9265\n5: 9266\n5: 9267\n5: 9268\n5: 9269\n5: 9270\n5: 9271\n5: 9272\n5: 9273\n5: 9274\n5: 9275\n5: 9276\n5: 9277\n5: 9278\n5: 9279\n5: 9280\n5: 9281\n5: 9282\n5: 9283\n5: 9284\n5: 9285\n5: 9286\n5: 9287\n5: 9288\n5: 9289\n5: 9290\n5: 9291\n5: 9292\n5: 9293\n5: 9294\n5: 9295\n5: 9296\n5: 9297\n5: 9298\n5: 9299\n5: 9300\n5: 9301\n5: 9302\n5: 9303\n5: 9304\n5: 9305\n5: 9306\n5: 9307\n5: 9308\n5: 9309\n5: 9310\n5: 9311\n5: 9312\n5: 9313\n5: 9314\n5: 9315\n5: 9316\n5: 9317\n5: 9318\n5: 9319\n5: 9320\n5: 9321\n5: 9322\n5: 9323\n5: 9324\n5: 9325\n5: 9326\n5: 9327\n5: 9328\n5: 9329\n5: 9330\n5: 9331\n5: 9332\n5: 9333\n5: 9334\n5: 9335\n5: 9336\n5: 9337\n5: 9338\n5: 9339\n5: 9340\n5: 9341\n5: 9342\n5: 9343\n5: 9344\n5: 9345\n5: 9346\n5: 9347\n5: 9348\n5: 9349\n5: 9350\n5: 9351\n5: 9352\n5: 9353\n5: 9354\n5: 9355\n5: 9356\n5: 9357\n5: 9358\n5: 9359\n5: 9360\n5: 9361\n5: 9362\n5: 9363\n5: 9364\n5: 9365\n5: 9366\n5: 9367\n5: 9368\n5: 9369\n5: 9370\n5: 9371\n5: 9372\n5: 9373\n5: 9374\n5: 9375\n5: 9376\n5: 9377\n5: 9378\n5: 9379\n5: 9380\n5: 9381\n5: 9382\n5: 9383\n5: 9384\n5: 9385\n5: 9386\n5: 9387\n5: 9388\n5: 9389\n5: 9390\n5: 9391\n5: 9392\n5: 9393\n5: 9394\n5: 9395\n5: 9396\n5: 9397\n5: 9398\n5: 9399\n5: 9400\n5: 9401\n5: 9402\n5: 9403\n5: 9404\n5: 9405\n5: 9406\n5: 9407\n5: 9408\n5: 9409\n5: 9410\n5: 9411\n5: 9412\n5: 9413\n5: 9414\n5: 9415\n5: 9416\n5: 9417\n5: 9418\n5: 9419\n5: 9420\n5: 9421\n5: 9422\n5: 9423\n5: 9424\n5: 9425\n5: 9426\n5: 9427\n5: 9428\n5: 9429\n5: 9430\n5: 9431\n5: 9432\n5: 9433\n5: 9434\n5: 9435\n5: 9436\n5: 9437\n5: 9438\n5: 9439\n5: 9440\n5: 9441\n5: 9442\n5: 9443\n5: 9444\n5: 9445\n5: 9446\n5: 9447\n5: 9448\n5: 9449\n5: 9450\n5: 9451\n5: 9452\n5: 9453\n5: 9454\n5: 9455\n5: 9456\n5: 9457\n5: 9458\n5: 9459\n5: 9460\n5: 9461\n5: 9462\n5: 9463\n5: 9464\n5: 9465\n5: 9466\n5: 9467\n5: 9468\n5: 9469\n5: 9470\n5: 9471\n5: 9472\n5: 9473\n5: 9474\n5: 9475\n5: 9476\n5: 9477\n5: 9478\n5: 9479\n5: 9480\n4: 9481\n4: 9482\n4: 9483\n4: 9484\n4: 9485\n4: 9486\n4: 9487\n4: 9488\n4: 9489\n4: 9490\n4: 9491\n4: 9492\n4: 9493\n4: 9494\n4: 9495\n4: 9496\n4: 9497\n4: 9498\n4: 9499\n4: 9500\n4: 9501\n4: 9502\n4: 9503\n4: 9504\n4: 9505\n4: 9506\n4: 9507\n4: 9508\n4: 9509\n4: 9510\n4: 9511\n4: 9512\n4: 9513\n4: 9514\n4: 9515\n4: 9516\n4: 9517\n4: 9518\n4: 9519\n4: 9520\n4: 9521\n4: 9522\n4: 9523\n4: 9524\n4: 9525\n4: 9526\n4: 9527\n4: 9528\n4: 9529\n4: 9530\n4: 9531\n4: 9532\n4: 9533\n4: 9534\n4: 9535\n4: 9536\n4: 9537\n4: 9538\n4: 9539\n4: 9540\n4: 9541\n4: 9542\n4: 9543\n4: 9544\n4: 9545\n4: 9546\n4: 9547\n4: 9548\n4: 9549\n4: 9550\n4: 9551\n4: 9552\n4: 9553\n4: 9554\n4: 9555\n4: 9556\n4: 9557\n4: 9558\n4: 9559\n4: 9560\n4: 9561\n4: 9562\n4: 9563\n4: 9564\n4: 9565\n4: 9566\n4: 9567\n4: 9568\n4: 9569\n4: 9570\n4: 9571\n4: 9572\n4: 9573\n4: 9574\n4: 9575\n4: 9576\n4: 9577\n4: 9578\n4: 9579\n4: 9580\n4: 9581\n4: 9582\n4: 9583\n4: 9584\n4: 9585\n4: 9586\n4: 9587\n4: 9588\n4: 9589\n4: 9590\n4: 9591\n4: 9592\n4: 9593\n4: 9594\n4: 9595\n4: 9596\n4: 9597\n4: 9598\n4: 9599\n4: 9600\n4: 9601\n4: 9602\n4: 9603\n4: 9604\n4: 9605\n4: 9606\n4: 9607\n4: 9608\n4: 9609\n4: 9610\n4: 9611\n4: 9612\n4: 9613\n4: 9614\n4: 9615\n4: 9616\n4: 9617\n4: 9618\n4: 9619\n4: 9620\n4: 9621\n4: 9622\n4: 9623\n4: 9624\n4: 9625\n4: 9626\n4: 9627\n4: 9628\n4: 9629\n4: 9630\n4: 9631\n4: 9632\n4: 9633\n4: 9634\n4: 9635\n4: 9636\n4: 9637\n4: 9638\n4: 9639\n4: 9640\n4: 9641\n4: 9642\n4: 9643\n4: 9644\n4: 9645\n4: 9646\n4: 9647\n4: 9648\n4: 9649\n4: 9650\n4: 9651\n4: 9652\n4: 9653\n4: 9654\n4: 9655\n4: 9656\n4: 9657\n4: 9658\n4: 9659\n4: 9660\n4: 9661\n4: 9662\n4: 9663\n4: 9664\n4: 9665\n4: 9666\n4: 9667\n4: 9668\n4: 9669\n4: 9670\n4: 9671\n4: 9672\n4: 9673\n4: 9674\n4: 9675\n4: 9676\n4: 9677\n4: 9678\n4: 9679\n4: 9680\n4: 9681\n4: 9682\n4: 9683\n4: 9684\n4: 9685\n4: 9686\n4: 9687\n4: 9688\n4: 9689\n4: 9690\n4: 9691\n4: 9692\n4: 9693\n4: 9694\n4: 9695\n4: 9696\n4: 9697\n4: 9698\n4: 9699\n4: 9700\n4: 9701\n4: 9702\n4: 9703\n4: 9704\n4: 9705\n4: 9706\n4: 9707\n4: 9708\n4: 9709\n4: 9710\n4: 9711\n4: 9712\n4: 9713\n4: 9714\n4: 9715\n4: 9716\n4: 9717\n4: 9718\n4: 9719\n4: 9720\n4: 9721\n4: 9722\n4: 9723\n4: 9724\n4: 9725\n4: 9726\n4: 9727\n4: 9728\n4: 9729\n4: 9730\n4: 9731\n4: 9732\n4: 9733\n4: 9734\n4: 9735\n4: 9736\n4: 9737\n4: 9738\n4: 9739\n4: 9740\n4: 9741\n4: 9742\n4: 9743\n4: 9744\n4: 9745\n4: 9746\n4: 9747\n4: 9748\n4: 9749\n4: 9750\n4: 9751\n4: 9752\n4: 9753\n4: 9754\n4: 9755\n4: 9756\n4: 9757\n4: 9758\n4: 9759\n4: 9760\n4: 9761\n4: 9762\n4: 9763\n4: 9764\n4: 9765\n4: 9766\n4: 9767\n4: 9768\n4: 9769\n4: 9770\n4: 9771\n4: 9772\n4: 9773\n4: 9774\n4: 9775\n4: 9776\n4: 9777\n4: 9778\n4: 9779\n4: 9780\n4: 9781\n4: 9782\n4: 9783\n4: 9784\n4: 9785\n4: 9786\n4: 9787\n4: 9788\n4: 9789\n4: 9790\n4: 9791\n4: 9792\n4: 9793\n4: 9794\n4: 9795\n4: 9796\n4: 9797\n4: 9798\n4: 9799\n4: 9800\n4: 9801\n4: 9802\n4: 9803\n4: 9804\n4: 9805\n4: 9806\n4: 9807\n4: 9808\n4: 9809\n4: 9810\n4: 9811\n4: 9812\n4: 9813\n4: 9814\n4: 9815\n4: 9816\n4: 9817\n4: 9818\n4: 9819\n4: 9820\n4: 9821\n4: 9822\n4: 9823\n4: 9824\n4: 9825\n4: 9826\n4: 9827\n4: 9828\n4: 9829\n4: 9830\n4: 9831\n4: 9832\n4: 9833\n4: 9834\n4: 9835\n4: 9836\n4: 9837\n4: 9838\n4: 9839\n4: 9840\n4: 9841\n4: 9842\n4: 9843\n4: 9844\n4: 9845\n4: 9846\n4: 9847\n4: 9848\n4: 9849\n4: 9850\n4: 9851\n4: 9852\n4: 9853\n4: 9854\n4: 9855\n4: 9856\n4: 9857\n4: 9858\n4: 9859\n4: 9860\n4: 9861\n4: 9862\n4: 9863\n4: 9864\n4: 9865\n4: 9866\n4: 9867\n4: 9868\n4: 9869\n4: 9870\n4: 9871\n4: 9872\n4: 9873\n4: 9874\n4: 9875\n4: 9876\n4: 9877\n4: 9878\n4: 9879\n4: 9880\n4: 9881\n4: 9882\n4: 9883\n4: 9884\n4: 9885\n4: 9886\n4: 9887\n4: 9888\n4: 9889\n4: 9890\n4: 9891\n4: 9892\n4: 9893\n4: 9894\n4: 9895\n4: 9896\n4: 9897\n4: 9898\n5: 9899\n5: 9900\n5: 9901\n5: 9902\n5: 9903\n5: 9904\n5: 9905\n5: 9906\n5: 9907\n5: 9908\n5: 9909\n5: 9910\n5: 9911\n5: 9912\n5: 9913\n5: 9914\n5: 9915\n5: 9916\n5: 9917\n5: 9918\n5: 9919\n5: 9920\n5: 9921\n5: 9922\n5: 9923\n5: 9924\n5: 9925\n5: 9926\n5: 9927\n5: 9928\n5: 9929\n5: 9930\n5: 9931\n5: 9932\n5: 9933\n5: 9934\n5: 9935\n5: 9936\n5: 9937\n5: 9938\n5: 9939\n5: 9940\n5: 9941\n5: 9942\n5: 9943\n5: 9944\n5: 9945\n5: 9946\n5: 9947\n5: 9948\n5: 9949\n5: 9950\n5: 9951\n5: 9952\n5: 9953\n5: 9954\n5: 9955\n5: 9956\n5: 9957\n5: 9958\n5: 9959\n5: 9960\n5: 9961\n5: 9962\n5: 9963\n5: 9964\n5: 9965\n5: 9966\n5: 9967\n5: 9968\n5: 9969\n5: 9970\n5: 9971\n5: 9972\n5: 9973\n5: 9974\n5: 9975\n5: 9976\n5: 9977\n5: 9978\n5: 9979\n5: 9980\n5: 9981\n5: 9982\n5: 9983\n5: 9984\n5: 9985\n5: 9986\n5: 9987\n5: 9988\n5: 9989\n5: 9990\n5: 9991\n5: 9992\n5: 9993\n5: 9994\n5: 9995\n5: 9996\n5: 9997\n5: 9998\n5: 9999\n5: 10000\n"
  },
  {
    "path": "threads/strclithread.c",
    "content": "#include\t\"unpthread.h\"\n\nvoid\t*copyto(void *);\n\nstatic int\tsockfd;\t\t/* global for both threads to access */\nstatic FILE\t*fp;\n\nvoid\nstr_cli(FILE *fp_arg, int sockfd_arg)\n{\n\tchar\t\trecvline[MAXLINE];\n\tpthread_t\ttid;\n\n\tsockfd = sockfd_arg;\t/* copy arguments to externals */\n\tfp = fp_arg;\n\n\tPthread_create(&tid, NULL, copyto, NULL);\n\n\twhile (Readline(sockfd, recvline, MAXLINE) > 0)\n\t\tFputs(recvline, stdout);\n}\n\nvoid *\ncopyto(void *arg)\n{\n\tchar\tsendline[MAXLINE];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL)\n\t\tWriten(sockfd, sendline, strlen(sendline));\n\n\tShutdown(sockfd, SHUT_WR);\t/* EOF on stdin, send FIN */\n\n\treturn(NULL);\n\t\t/* 4return (i.e., thread terminates) when EOF on stdin */\n}\n"
  },
  {
    "path": "threads/strclithread.lc",
    "content": "#include    \"unpthread.h\"##  1 ##src/threads/strclithread.c##\n\nvoid   *copyto(void *);##  2 ##src/threads/strclithread.c##\n\nstatic int sockfd;              /* global for both threads to access */##  3 ##src/threads/strclithread.c##\nstatic FILE *fp;##  4 ##src/threads/strclithread.c##\n\nvoid##  5 ##src/threads/strclithread.c##\nstr_cli(FILE *fp_arg, int sockfd_arg)##  6 ##src/threads/strclithread.c##\n{##  7 ##src/threads/strclithread.c##\n    char    recvline[MAXLINE];##  8 ##src/threads/strclithread.c##\n    pthread_t tid;##  9 ##src/threads/strclithread.c##\n\n    sockfd = sockfd_arg;        /* copy arguments to externals */## 10 ##src/threads/strclithread.c##\n    fp = fp_arg;## 11 ##src/threads/strclithread.c##\n\n    Pthread_create(&tid, NULL, copyto, NULL);## 12 ##src/threads/strclithread.c##\n\n    while (Readline(sockfd, recvline, MAXLINE) > 0)## 13 ##src/threads/strclithread.c##\n        Fputs(recvline, stdout);## 14 ##src/threads/strclithread.c##\n}## 15 ##src/threads/strclithread.c##\n\nvoid   *## 16 ##src/threads/strclithread.c##\ncopyto(void *arg)## 17 ##src/threads/strclithread.c##\n{## 18 ##src/threads/strclithread.c##\n    char    sendline[MAXLINE];## 19 ##src/threads/strclithread.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL)## 20 ##src/threads/strclithread.c##\n        Writen(sockfd, sendline, strlen(sendline));## 21 ##src/threads/strclithread.c##\n\n    Shutdown(sockfd, SHUT_WR);  /* EOF on stdin, send FIN */## 22 ##src/threads/strclithread.c##\n\n    return (NULL);## 23 ##src/threads/strclithread.c##\n    /* 4return (i.e., thread terminates) when end-of-file on stdin */## 24 ##src/threads/strclithread.c##\n}## 25 ##src/threads/strclithread.c##\n"
  },
  {
    "path": "threads/strclithread2.c",
    "content": "#include\t\"unpthread.h\"\n\nvoid\t*copyto(void *);\n\nstatic int\tsockfd;\nstatic FILE\t*fp;\nstatic int\tdone;\n\nvoid\nstr_cli(FILE *fp_arg, int sockfd_arg)\n{\n\tchar\t\trecvline[MAXLINE];\n\tpthread_t\ttid;\n\n\tsockfd = sockfd_arg;\t/* copy arguments to externals */\n\tfp = fp_arg;\n\n\tPthread_create(&tid, NULL, copyto, NULL);\n\n\twhile (Readline(sockfd, recvline, MAXLINE) > 0)\n\t\tFputs(recvline, stdout);\n\n\tif (done == 0)\n\t\terr_quit(\"server terminated prematurely\");\n}\n\nvoid *\ncopyto(void *arg)\n{\n\tchar\tsendline[MAXLINE];\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL)\n\t\tWriten(sockfd, sendline, strlen(sendline));\n\n\tShutdown(sockfd, SHUT_WR);\t/* EOF on stdin, send FIN */\n\n\tdone = 1;\n\treturn(NULL);\n\t/* return (i.e., thread terminates) when end-of-file on stdin */\n}\n"
  },
  {
    "path": "threads/tcpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpcli <hostname> <service>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "threads/tcpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tsockfd;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: tcpcli <hostname> <service>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "threads/tcpserv01.c",
    "content": "#include\t\"unpthread.h\"\n\nstatic void\t*doit(void *);\t\t/* each thread executes this function */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, connfd;\n\tpthread_t\t\ttid;\n\tsocklen_t\t\taddrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: tcpserv01 [ <host> ] <service or port>\");\n\n\tcliaddr = Malloc(addrlen);\n\n\tfor ( ; ; ) {\n\t\tlen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &len);\n\t\tPthread_create(&tid, NULL, &doit, (void *) connfd);\n\t}\n}\n\nstatic void *\ndoit(void *arg)\n{\n\tPthread_detach(pthread_self());\n\tstr_echo((int) arg);\t/* same function as before */\n\tClose((int) arg);\t\t/* done with connected socket */\n\treturn(NULL);\n}\n"
  },
  {
    "path": "threads/tcpserv02.c",
    "content": "#include\t\"unpthread.h\"\n\nstatic void\t*doit(void *);\t\t/* each thread executes this function */\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tlistenfd, *iptr;\n\tthread_t\t\ttid;\n\tsocklen_t\t\taddrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: tcpserv01 [ <host> ] <service or port>\");\n\n\tcliaddr = Malloc(addrlen);\n\n\tfor ( ; ; ) {\n\t\tlen = addrlen;\n\t\tiptr = Malloc(sizeof(int));\n\t\t*iptr = Accept(listenfd, cliaddr, &len);\n\t\tPthread_create(&tid, NULL, &doit, iptr);\n\t}\n}\n\nstatic void *\ndoit(void *arg)\n{\n\tint\t\tconnfd;\n\n\tconnfd = *((int *) arg);\n\tfree(arg);\n\n\tPthread_detach(pthread_self());\n\tstr_echo(connfd);\t\t/* same function as before */\n\tClose(connfd);\t\t\t/* done with connected socket */\n\treturn(NULL);\n}\n"
  },
  {
    "path": "threads/test01.c",
    "content": "#include\t\"unpthread.h\"\n\nvoid *\nmyfunc(void *ptr)\n{\n\tpause();\n}\n\nint\nmain(int argc, char **argv)\n{\n\tpthread_t\ttid;\n\tint\t\t\tn;\n\n\t/* Let's see what the return value is and what errno is after a error. */\n\tfor ( ; ; ) {\n\t\terrno = 0;\n\t\tif ( (n = pthread_create(&tid, NULL, myfunc, NULL)) != 0) {\n\t\t\tprintf(\"pthread_create returned %d, errno = %d\\n\", n, errno);\n\n\t\t\terrno = 0;\n\t\t\tn = pthread_join(777777, NULL);\n\t\t\tprintf(\"pthread_join returned %d, errno = %d\\n\", n, errno);\n\n\t\t\texit(0);\n\t\t}\n\t\tprintf(\"created tid %d\\n\", tid);\n\t}\n}\n"
  },
  {
    "path": "threads/test02.c",
    "content": "#include\t\"unpthread.h\"\n\nvoid *\nmyfunc(void *ptr)\n{\n\tint\t\tval;\n\n\tprintf(\"thread ID of myfunc: %d\\n\", pthread_self());\n\n\tval = *((int *) ptr);\n\tprintf(\"val = %d\\n\", val);\n\tsleep(10);\n\tval = *((int *) ptr);\n\tprintf(\"val = %d\\n\", val);\n}\n\nint\nmain(int argc, char **argv)\n{\n\tpthread_t\ttid;\n\tint\t\t\tn, val;\n\n\tprintf(\"thread ID of main: %d\\n\", pthread_self());\n\n\t/* Let's verify that the value pointed to the thread's argument is\n\t   modifiable */\n\tval = 123;\n\tif ( (n = pthread_create(&tid, NULL, myfunc, &val)) != 0)\n\t\terrno = n, err_sys(\"pthread_create error\");\n\tsleep(5);\n\tval = 789;\n\tsleep(20);\n\texit(0);\n}\n"
  },
  {
    "path": "threads/test03.c",
    "content": "/* test pthread_cond_timedwait() */\n\n#include\t\"unpthread.h\"\n\nint\t\t\t\tndone;\npthread_mutex_t\tndone_mutex = PTHREAD_MUTEX_INITIALIZER;\npthread_cond_t\tndone_cond = PTHREAD_COND_INITIALIZER;\n\nvoid *\nmyfunc(void *ptr)\n{\n\tint\t\tval;\n\n\tsleep(100);\t\t/* do not set ndone, do not cond_signal() */\n\treturn(NULL);\n}\n\nint\nmain(int argc, char **argv)\n{\n\tpthread_t\t\ttid;\n\tint\t\t\t\tn, val;\n\tstruct timeval\ttv;\n\tstruct timespec\tts;\n\n\tif ( (n = pthread_create(&tid, NULL, myfunc, &val)) != 0)\n\t\terrno = n, err_sys(\"pthread_create error\");\n\n\tif (gettimeofday(&tv, NULL) < 0)\n\t\terr_sys(\"gettimeofday error\");\n\tts.tv_sec  = tv.tv_sec + 5;\t\t/* 5 seconds in future */\n\tts.tv_nsec = tv.tv_usec * 1000;\n\n\tif ( (n = pthread_mutex_lock(&ndone_mutex)) != 0)\n\t\terrno = n, err_sys(\"pthread_mutex_lock error\");\n\twhile (ndone == 0)\n\t\tif ( (n = pthread_cond_timedwait(&ndone_cond, &ndone_mutex, &ts)) != 0){\n\t\t\tif (n == ETIME)\n\t\t\t\terr_quit(\"timewait timed out\");\n\t\t\terrno = n, err_sys(\"pthread_cond_timedwait error\");\n\t\t}\n\n\tif ( (n = pthread_mutex_unlock(&ndone_mutex)) != 0)\n\t\terrno = n, err_sys(\"pthread_mutex_unlock error\");\n\n\texit(0);\n}\n"
  },
  {
    "path": "threads/test04.c",
    "content": "/* test readline() */\n\n#include\t\"unpthread.h\"\n\nstatic char\t*infile;\t/* from argv[1]; read-only by threads */\n\nvoid *\nmyfunc(void *ptr)\n{\n\tint\t\ti, fdin;\n\tchar\tbuf[MAXLINE];\n\tFILE\t*fpout;\n\n\tsnprintf(buf, sizeof(buf), \"temp.%d\", pthread_self());\n\tfpout = Fopen(buf, \"w+\");\n\t/* printf(\"created %s\\n\", buf); */\n\n\tfor (i = 0; i < 5; i++) {\n\t\tfdin = Open(infile, O_RDONLY, 0);\n\n\t\twhile (Readline(fdin, buf, sizeof(buf)) > 0) {\n\t\t\tfputs(buf, fpout);\n\t\t}\n\t\tClose(fdin);\n\t}\n\tFclose(fpout);\n\n\tprintf(\"thread %d done\\n\", pthread_self());\n\treturn(NULL);\n}\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\ti, nthreads;\n\tpthread_t\t\ttid;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: test04 <input-file> <#threads>\");\n\tinfile = argv[1];\n\tnthreads = atoi(argv[2]);\n\n\tfor (i = 0; i < nthreads; i++) {\n\t\tPthread_create(&tid, NULL, myfunc, NULL);\n\t}\n\n\tpause();\n\n\texit(0);\n}\n"
  },
  {
    "path": "threads/test05.c",
    "content": "/* See what the implementation returns for TSD keys */\n\n#include\t\"unpthread.h\"\n\npthread_key_t\tmy_key;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t*iptr;\n\n\tPthread_key_create(&my_key, NULL);\n\tprintf(\"first key = %d\\n\", my_key);\n\n\tPthread_key_create(&my_key, NULL);\n\tprintf(\"second key = %d\\n\", my_key);\n\n\tPthread_key_create(&my_key, NULL);\n\tprintf(\"third key = %d\\n\", my_key);\n\n\tif ( (iptr = pthread_getspecific((pthread_key_t) 0)) == NULL)\n\t\tprintf(\"key 0 pointer is NULL\\n\");\n\telse\n\t\tprintf(\"value in key 0 = %d\\n\", *iptr);\n\n\terrno = 67;\n\tif ( (iptr = pthread_getspecific((pthread_key_t) 0)) == NULL)\n\t\tprintf(\"key 0 pointer is NULL\\n\");\n\telse\n\t\tprintf(\"value in key 0 = %d\\n\", *iptr);\n\n\texit(0);\n}\n"
  },
  {
    "path": "threads/unpthread.h",
    "content": "/* Our own header for the programs that use threads.\n   Include this file, instead of \"unp.h\". */\n\n#ifndef\t__unp_pthread_h\n#define\t__unp_pthread_h\n\n#include\t\"unp.h\"\n\nvoid\tPthread_create(pthread_t *, const pthread_attr_t *,\n\t\t\t\t\t   void * (*)(void *), void *);\nvoid\tPthread_join(pthread_t, void **);\nvoid\tPthread_detach(pthread_t);\nvoid\tPthread_kill(pthread_t, int);\n\nvoid\tPthread_mutexattr_init(pthread_mutexattr_t *);\nvoid\tPthread_mutexattr_setpshared(pthread_mutexattr_t *, int);\nvoid\tPthread_mutex_init(pthread_mutex_t *, pthread_mutexattr_t *);\nvoid\tPthread_mutex_lock(pthread_mutex_t *);\nvoid\tPthread_mutex_unlock(pthread_mutex_t *);\n\nvoid\tPthread_cond_broadcast(pthread_cond_t *);\nvoid\tPthread_cond_signal(pthread_cond_t *);\nvoid\tPthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);\nvoid\tPthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,\n\t\t\t\t\t\t\t   const struct timespec *);\n\nvoid\tPthread_key_create(pthread_key_t *, void (*)(void *));\nvoid\tPthread_setspecific(pthread_key_t, const void *);\nvoid\tPthread_once(pthread_once_t *, void (*)(void));\n\n#endif\t/* __unp_pthread_h */\n"
  },
  {
    "path": "threads/web01.c",
    "content": "/* include web1 */\n#include\t\"unpthread.h\"\n#include\t<thread.h>\t\t/* Solaris threads */\n\n#define\tMAXFILES\t20\n#define\tSERV\t\t\"80\"\t/* port number or service name */\n\nstruct file {\n  char\t*f_name;\t\t\t/* filename */\n  char\t*f_host;\t\t\t/* hostname or IP address */\n  int    f_fd;\t\t\t\t/* descriptor */\n  int\t f_flags;\t\t\t/* F_xxx below */\n  pthread_t\t f_tid;\t\t\t/* thread ID */\n} file[MAXFILES];\n#define\tF_CONNECTING\t1\t/* connect() in progress */\n#define\tF_READING\t\t2\t/* connect() complete; now reading */\n#define\tF_DONE\t\t\t4\t/* all done */\n\n#define\tGET_CMD\t\t\"GET %s HTTP/1.0\\r\\n\\r\\n\"\n\nint\t\tnconn, nfiles, nlefttoconn, nlefttoread;\n\nvoid\t*do_get_read(void *);\nvoid\thome_page(const char *, const char *);\nvoid\twrite_get_cmd(struct file *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\ti, n, maxnconn;\n\tpthread_t\ttid;\n\tstruct file\t*fptr;\n\n\tif (argc < 5)\n\t\terr_quit(\"usage: web <#conns> <IPaddr> <homepage> file1 ...\");\n\tmaxnconn = atoi(argv[1]);\n\n\tnfiles = min(argc - 4, MAXFILES);\n\tfor (i = 0; i < nfiles; i++) {\n\t\tfile[i].f_name = argv[i + 4];\n\t\tfile[i].f_host = argv[2];\n\t\tfile[i].f_flags = 0;\n\t}\n\tprintf(\"nfiles = %d\\n\", nfiles);\n\n\thome_page(argv[2], argv[3]);\n\n\tnlefttoread = nlefttoconn = nfiles;\n\tnconn = 0;\n/* end web1 */\n/* include web2 */\n\twhile (nlefttoread > 0) {\n\t\twhile (nconn < maxnconn && nlefttoconn > 0) {\n\t\t\t\t/* 4find a file to read */\n\t\t\tfor (i = 0 ; i < nfiles; i++)\n\t\t\t\tif (file[i].f_flags == 0)\n\t\t\t\t\tbreak;\n\t\t\tif (i == nfiles)\n\t\t\t\terr_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);\n\n\t\t\tfile[i].f_flags = F_CONNECTING;\n\t\t\tPthread_create(&tid, NULL, &do_get_read, &file[i]);\n\t\t\tfile[i].f_tid = tid;\n\t\t\tnconn++;\n\t\t\tnlefttoconn--;\n\t\t}\n\n\t\tif ( (n = thr_join(0, &tid, (void **) &fptr)) != 0)\n\t\t\terrno = n, err_sys(\"thr_join error\");\n\n\t\tnconn--;\n\t\tnlefttoread--;\n\t\tprintf(\"thread id %d for %s done\\n\", tid, fptr->f_name);\n\t}\n\n\texit(0);\n}\n/* end web2 */\n\n/* include do_get_read */\nvoid *\ndo_get_read(void *vptr)\n{\n\tint\t\t\t\t\tfd, n;\n\tchar\t\t\t\tline[MAXLINE];\n\tstruct file\t\t\t*fptr;\n\n\tfptr = (struct file *) vptr;\n\n\tfd = Tcp_connect(fptr->f_host, SERV);\n\tfptr->f_fd = fd;\n\tprintf(\"do_get_read for %s, fd %d, thread %d\\n\",\n\t\t\tfptr->f_name, fd, fptr->f_tid);\n\n\twrite_get_cmd(fptr);\t/* write() the GET command */\n\n\t\t/* 4Read server's reply */\n\tfor ( ; ; ) {\n\t\tif ( (n = Read(fd, line, MAXLINE)) == 0)\n\t\t\tbreak;\t\t/* server closed connection */\n\n\t\tprintf(\"read %d bytes from %s\\n\", n, fptr->f_name);\n\t}\n\tprintf(\"end-of-file on %s\\n\", fptr->f_name);\n\tClose(fd);\n\tfptr->f_flags = F_DONE;\t\t/* clears F_READING */\n\n\treturn(fptr);\t\t/* terminate thread */\n}\n/* end do_get_read */\n\n/* include write_get_cmd */\nvoid\nwrite_get_cmd(struct file *fptr)\n{\n\tint\t\tn;\n\tchar\tline[MAXLINE];\n\n\tn = snprintf(line, sizeof(line), GET_CMD, fptr->f_name);\n\tWriten(fptr->f_fd, line, n);\n\tprintf(\"wrote %d bytes for %s\\n\", n, fptr->f_name);\n\n\tfptr->f_flags = F_READING;\t\t\t/* clears F_CONNECTING */\n}\n/* end write_get_cmd */\n\n/* include home_page */\nvoid\nhome_page(const char *host, const char *fname)\n{\n\tint\t\tfd, n;\n\tchar\tline[MAXLINE];\n\n\tfd = Tcp_connect(host, SERV);\t/* blocking connect() */\n\n\tn = snprintf(line, sizeof(line), GET_CMD, fname);\n\tWriten(fd, line, n);\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Read(fd, line, MAXLINE)) == 0)\n\t\t\tbreak;\t\t/* server closed connection */\n\n\t\tprintf(\"read %d bytes of home page\\n\", n);\n\t\t/* do whatever with data */\n\t}\n\tprintf(\"end-of-file on home page\\n\");\n\tClose(fd);\n}\n/* end home_page */\n"
  },
  {
    "path": "threads/web01.lc",
    "content": "/* include web1 */\n#include    \"unpthread.h\"##  1 ##src/threads/web01.c##\n#include    <thread.h>          /* Solaris threads */##  2 ##src/threads/web01.c##\n\n#define MAXFILES    20##  3 ##src/threads/web01.c##\n#define SERV        \"80\"        /* port number or service name */##  4 ##src/threads/web01.c##\n\nstruct file {##  5 ##src/threads/web01.c##\n    char   *f_name;             /* filename */##  6 ##src/threads/web01.c##\n    char   *f_host;             /* hostname or IP address */##  7 ##src/threads/web01.c##\n    int     f_fd;               /* descriptor */##  8 ##src/threads/web01.c##\n    int     f_flags;            /* F_xxx below */##  9 ##src/threads/web01.c##\n    pthread_t f_tid;            /* thread ID */## 10 ##src/threads/web01.c##\n} file[MAXFILES];## 11 ##src/threads/web01.c##\n#define F_CONNECTING    1       /* connect() in progress */## 12 ##src/threads/web01.c##\n#define F_READING       2       /* connect() complete; now reading */## 13 ##src/threads/web01.c##\n#define F_DONE          4       /* all done */## 14 ##src/threads/web01.c##\n\n#define GET_CMD     \"GET %s HTTP/1.0\\r\\n\\r\\n\"## 15 ##src/threads/web01.c##\n\nint     nconn, nfiles, nlefttoconn, nlefttoread;## 16 ##src/threads/web01.c##\n\nvoid   *do_get_read(void *);## 17 ##src/threads/web01.c##\nvoid    home_page(const char *, const char *);## 18 ##src/threads/web01.c##\nvoid    write_get_cmd(struct file *);## 19 ##src/threads/web01.c##\n\nint## 20 ##src/threads/web01.c##\nmain(int argc, char **argv)## 21 ##src/threads/web01.c##\n{## 22 ##src/threads/web01.c##\n    int     i, n, maxnconn;## 23 ##src/threads/web01.c##\n    pthread_t tid;## 24 ##src/threads/web01.c##\n    struct file *fptr;## 25 ##src/threads/web01.c##\n\n    if (argc < 5)## 26 ##src/threads/web01.c##\n        err_quit(\"usage: web <#conns> <IPaddr> <homepage> file1 ...\");## 27 ##src/threads/web01.c##\n    maxnconn = atoi(argv[1]);## 28 ##src/threads/web01.c##\n\n    nfiles = min(argc - 4, MAXFILES);## 29 ##src/threads/web01.c##\n    for (i = 0; i < nfiles; i++) {## 30 ##src/threads/web01.c##\n        file[i].f_name = argv[i + 4];## 31 ##src/threads/web01.c##\n        file[i].f_host = argv[2];## 32 ##src/threads/web01.c##\n        file[i].f_flags = 0;## 33 ##src/threads/web01.c##\n    }## 34 ##src/threads/web01.c##\n    printf(\"nfiles = %d\\n\", nfiles);## 35 ##src/threads/web01.c##\n\n    home_page(argv[2], argv[3]);## 36 ##src/threads/web01.c##\n\n    nlefttoread = nlefttoconn = nfiles;## 37 ##src/threads/web01.c##\n    nconn = 0;## 38 ##src/threads/web01.c##\n/* end web1 */\n/* include web2 */\n    while (nlefttoread > 0) {## 39 ##src/threads/web01.c##\n        while (nconn < maxnconn && nlefttoconn > 0) {## 40 ##src/threads/web01.c##\n            /* 4find a file to read */## 41 ##src/threads/web01.c##\n            for (i = 0; i < nfiles; i++)## 42 ##src/threads/web01.c##\n                if (file[i].f_flags == 0)## 43 ##src/threads/web01.c##\n                    break;## 44 ##src/threads/web01.c##\n            if (i == nfiles)## 45 ##src/threads/web01.c##\n                err_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);## 46 ##src/threads/web01.c##\n\n            file[i].f_flags = F_CONNECTING;## 47 ##src/threads/web01.c##\n            Pthread_create(&tid, NULL, &do_get_read, &file[i]);## 48 ##src/threads/web01.c##\n            file[i].f_tid = tid;## 49 ##src/threads/web01.c##\n            nconn++;## 50 ##src/threads/web01.c##\n            nlefttoconn--;## 51 ##src/threads/web01.c##\n        }## 52 ##src/threads/web01.c##\n\n        if ((n = thr_join(0, &tid, (void **) &fptr)) != 0)## 53 ##src/threads/web01.c##\n            errno = n, err_sys(\"thr_join error\");## 54 ##src/threads/web01.c##\n\n        nconn--;## 55 ##src/threads/web01.c##\n        nlefttoread--;## 56 ##src/threads/web01.c##\n        printf(\"thread id %d for %s done\\n\", tid, fptr->f_name);## 57 ##src/threads/web01.c##\n    }## 58 ##src/threads/web01.c##\n\n    exit(0);## 59 ##src/threads/web01.c##\n}## 60 ##src/threads/web01.c##\n/* end web2 */\n\n/* include do_get_read */\nvoid   *## 61 ##src/threads/web01.c##\ndo_get_read(void *vptr)## 62 ##src/threads/web01.c##\n{## 63 ##src/threads/web01.c##\n    int     fd, n;## 64 ##src/threads/web01.c##\n    char    line[MAXLINE];## 65 ##src/threads/web01.c##\n    struct file *fptr;## 66 ##src/threads/web01.c##\n\n    fptr = (struct file *) vptr;## 67 ##src/threads/web01.c##\n\n    fd = Tcp_connect(fptr->f_host, SERV);## 68 ##src/threads/web01.c##\n    fptr->f_fd = fd;## 69 ##src/threads/web01.c##\n    printf(\"do_get_read for %s, fd %d, thread %d\\n\",## 70 ##src/threads/web01.c##\n           fptr->f_name, fd, fptr->f_tid);## 71 ##src/threads/web01.c##\n\n    write_get_cmd(fptr);        /* write() the GET command */## 72 ##src/threads/web01.c##\n\n    /* 4Read server's reply */## 73 ##src/threads/web01.c##\n    for (;;) {## 74 ##src/threads/web01.c##\n        if ((n = Read(fd, line, MAXLINE)) == 0)## 75 ##src/threads/web01.c##\n            break;              /* server closed connection */## 76 ##src/threads/web01.c##\n\n        printf(\"read %d bytes from %s\\n\", n, fptr->f_name);## 77 ##src/threads/web01.c##\n    }## 78 ##src/threads/web01.c##\n    printf(\"end-of-file on %s\\n\", fptr->f_name);## 79 ##src/threads/web01.c##\n    Close(fd);## 80 ##src/threads/web01.c##\n    fptr->f_flags = F_DONE;     /* clears F_READING */## 81 ##src/threads/web01.c##\n\n    return (fptr);              /* terminate thread */## 82 ##src/threads/web01.c##\n}## 83 ##src/threads/web01.c##\n/* end do_get_read */\n\n/* include write_get_cmd */\nvoid## 84 ##src/threads/web01.c##\nwrite_get_cmd(struct file *fptr)## 85 ##src/threads/web01.c##\n{## 86 ##src/threads/web01.c##\n    int     n;## 87 ##src/threads/web01.c##\n    char    line[MAXLINE];## 88 ##src/threads/web01.c##\n\n    n = snprintf(line, sizeof(line), GET_CMD, fptr->f_name);## 89 ##src/threads/web01.c##\n    Writen(fptr->f_fd, line, n);## 90 ##src/threads/web01.c##\n    printf(\"wrote %d bytes for %s\\n\", n, fptr->f_name);## 91 ##src/threads/web01.c##\n\n    fptr->f_flags = F_READING;  /* clears F_CONNECTING */## 92 ##src/threads/web01.c##\n}## 93 ##src/threads/web01.c##\n/* end write_get_cmd */\n\n/* include home_page */\nvoid## 94 ##src/threads/web01.c##\nhome_page(const char *host, const char *fname)## 95 ##src/threads/web01.c##\n{## 96 ##src/threads/web01.c##\n    int     fd, n;## 97 ##src/threads/web01.c##\n    char    line[MAXLINE];## 98 ##src/threads/web01.c##\n\n    fd = Tcp_connect(host, SERV);   /* blocking connect() */## 99 ##src/threads/web01.c##\n\n    n = snprintf(line, sizeof(line), GET_CMD, fname);##100 ##src/threads/web01.c##\n    Writen(fd, line, n);##101 ##src/threads/web01.c##\n\n    for (;;) {##102 ##src/threads/web01.c##\n        if ((n = Read(fd, line, MAXLINE)) == 0)##103 ##src/threads/web01.c##\n            break;              /* server closed connection */##104 ##src/threads/web01.c##\n\n        printf(\"read %d bytes of home page\\n\", n);##105 ##src/threads/web01.c##\n        /* do whatever with data */##106 ##src/threads/web01.c##\n    }##107 ##src/threads/web01.c##\n    printf(\"end-of-file on home page\\n\");##108 ##src/threads/web01.c##\n    Close(fd);##109 ##src/threads/web01.c##\n}##110 ##src/threads/web01.c##\n/* end home_page */\n"
  },
  {
    "path": "threads/web02.c",
    "content": "/* Doesn't work right.  Main thread sucks up all the CPU time polling unless\n   we call thr_yield(). */\n#include\t\"unpthread.h\"\n#include\t<thread.h>\t\t/* Solaris threads */\n\n#define\tMAXFILES\t20\n#define\tSERV\t\t\"80\"\t/* port number or service name */\n\nstruct file {\n  char\t*f_name;\t\t\t/* filename */\n  char\t*f_host;\t\t\t/* hostname or IP address */\n  int    f_fd;\t\t\t\t/* descriptor */\n  int\t f_flags;\t\t\t/* F_xxx below */\n  pthread_t\t f_tid;\t\t\t/* thread ID */\n} file[MAXFILES];\n#define\tF_CONNECTING\t1\t/* connect() in progress */\n#define\tF_READING\t\t2\t/* connect() complete; now reading */\n#define\tF_DONE\t\t\t4\t/* all done */\n#define\tF_JOINED\t\t8\t/* main has pthread_join'ed */\n\nint\t\tnconn, nfiles, nlefttoconn, nlefttoread;\nchar\tget[] = \"GET / HTTP/1.0\\r\\n\\r\\n\";\t/* for home page */\n\nint\t\t\t\tndone;\t\t/* number of terminated threads & mutex */\npthread_mutex_t\tndone_mutex = PTHREAD_MUTEX_INITIALIZER;\n\nvoid\t*do_get_read(void *);\nvoid\thome_page(const char *, const char *);\nvoid\twrite_get_cmd(struct file *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\ti, n, maxnconn;\n\tpthread_t\ttid;\n\tstruct file\t*fptr;\n\n\tif (argc < 5)\n\t\terr_quit(\"usage: web <#conns> <IPaddr> <homepage> file1 ...\");\n\tmaxnconn = atoi(argv[1]);\n\n\tnfiles = min(argc - 4, MAXFILES);\n\tfor (i = 0; i < nfiles; i++) {\n\t\tfile[i].f_name = argv[i + 4];\n\t\tfile[i].f_host = argv[2];\n\t\tfile[i].f_flags = 0;\n\t}\n\tprintf(\"nfiles = %d\\n\", nfiles);\n\n\thome_page(argv[2], argv[3]);\n\n\tnlefttoread = nlefttoconn = nfiles;\n\tnconn = 0;\n\twhile (nlefttoread > 0) {\n/* printf(\"nconn = %d, nlefttoconn = %d\\n\", nconn, nlefttoconn); */\n\t\twhile (nconn < maxnconn && nlefttoconn > 0) {\n\t\t\t\t/* find a file to read */\n\t\t\tfor (i = 0 ; i < nfiles; i++)\n\t\t\t\tif (file[i].f_flags == 0)\n\t\t\t\t\tbreak;\n\t\t\tif (i == nfiles)\n\t\t\t\terr_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);\n\n\t\t\tif ( (n = pthread_create(&tid, NULL, &do_get_read, &file[i])) != 0)\n\t\t\t\terrno = n, err_sys(\"pthread_create error\");\nprintf(\"created thread %d\\n\", tid);\n\t\t\tfile[i].f_tid = tid;\n\t\t\tfile[i].f_flags = F_CONNECTING;\n\t\t\tnconn++;\n\t\t\tnlefttoconn--;\n\t\t}\nthr_yield();\n\n\t\t\t/* See if one of the threads is done */\n\t\tif ( (n = pthread_mutex_lock(&ndone_mutex)) != 0)\n\t\t\terrno = n, err_sys(\"pthread_mutex_lock error\");\n\t\tif (ndone > 0) {\n\t\t\tfor (i = 0; i < nfiles; i++) {\n\t\t\t\tif (file[i].f_flags & F_DONE) {\n\t\t\t\t\tif ( (n = pthread_join(file[i].f_tid, (void **) &fptr)) != 0)\n\t\t\t\t\t\terrno = n, err_sys(\"pthread_join error\");\n\t\t\n\t\t\t\t\tif (&file[i] != fptr)\n\t\t\t\t\t\terr_quit(\"file[i] != fptr\");\n\t\t\t\t\tfptr->f_flags = F_JOINED;\t/* clears F_DONE */\n\t\t\t\t\tndone--;\n\t\t\t\t\tnconn--;\n\t\t\t\t\tnlefttoread--;\n\t\t\t\t\tprintf(\"thread id %d for %s done\\n\",\n\t\t\t\t\t\t\tfile[i].f_tid, fptr->f_name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ( (n = pthread_mutex_unlock(&ndone_mutex)) != 0)\n\t\t\terrno = n, err_sys(\"pthread_mutex_unlock error\");\n\t}\n\n\texit(0);\n}\n\nvoid *\ndo_get_read(void *vptr)\n{\n\tint\t\t\t\t\tfd, n;\n\tchar\t\t\t\tline[MAXLINE];\n\tstruct file\t\t\t*fptr;\n\n\tfptr = (struct file *) vptr;\n\n\tfd = Tcp_connect(fptr->f_host, SERV);\n\tfptr->f_fd = fd;\n\tprintf(\"do_get_read for %s, fd %d, thread %d\\n\",\n\t\t\tfptr->f_name, fd, fptr->f_tid);\n\n\twrite_get_cmd(fptr);\t/* write() the GET command */\n\n\t\t/* Read server's reply */\n\tfor ( ; ; ) {\n\t\tif ( (n = read(fd, line, MAXLINE)) <= 0) {\n\t\t\tif (n == 0)\n\t\t\t\tbreak;\t\t/* server closed connection */\n\t\t\telse\n\t\t\t\terr_sys(\"read error\");\n\t\t}\n\t\tprintf(\"read %d bytes from %s\\n\", n, fptr->f_name);\n\t}\n\tprintf(\"end-of-file on %s\\n\", fptr->f_name);\n\tclose(fd);\n\tfptr->f_flags = F_DONE;\t\t/* clears F_READING */\n\n\tif ( (n = pthread_mutex_lock(&ndone_mutex)) != 0)\n\t\terrno = n, err_sys(\"pthread_mutex_lock error\");\n\tndone++;\n\tif ( (n = pthread_mutex_unlock(&ndone_mutex)) != 0)\n\t\terrno = n, err_sys(\"pthread_mutex_unlock error\");\n\n\treturn(fptr);\t\t/* terminate thread */\n}\n\nvoid\nwrite_get_cmd(struct file *fptr)\n{\n\tint\t\tn;\n\tchar\tline[MAXLINE];\n\n\tstrcpy(line, \"GET \");\n\tstrcat(line, fptr->f_name);\n\tstrcat(line, \" HTTP/1.0\\r\\n\\r\\n\");\n\tn = strlen(line);\n\tif (writen(fptr->f_fd, line, n) != n)\n\t\terr_sys(\"writen error\");\n\tprintf(\"wrote %d bytes for %s\\n\", n, fptr->f_name);\n\n\tfptr->f_flags = F_READING;\t\t\t/* clears F_CONNECTING */\n}\n\nvoid\nhome_page(const char *host, const char *fname)\n{\n\tint\t\t\t\t\tfd, n;\n\tchar\t\t\t\tline[MAXLINE];\n\n\tfd = Tcp_connect(host, SERV);\n\n\tstrcpy(line, \"GET \");\n\tstrcat(line, fname);\n\tstrcat(line, \" HTTP/1.0\\r\\n\\r\\n\");\n\tn = strlen(line);\n\tif (writen(fd, line, n) != n)\n\t\terr_sys(\"writen error\");\n\n\tfor ( ; ; ) {\n\t\tif ( (n = read(fd, line, MAXLINE)) <= 0) {\n\t\t\tif (n == 0)\n\t\t\t\tbreak;\t\t/* server closed connection */\n\t\t\telse\n\t\t\t\terr_sys(\"read error\");\n\t\t}\n\t\tprintf(\"read %d bytes of home page\\n\", n);\n\t\t/* do whatever with data */\n\t}\n\tprintf(\"end-of-file on home page\\n\");\n\tclose(fd);\n}\n"
  },
  {
    "path": "threads/web03.c",
    "content": "#include\t\"unpthread.h\"\n#include\t<thread.h>\t\t/* Solaris threads */\n\n#define\tMAXFILES\t20\n#define\tSERV\t\t\"80\"\t/* port number or service name */\n\nstruct file {\n  char\t*f_name;\t\t\t/* filename */\n  char\t*f_host;\t\t\t/* hostname or IP address */\n  int    f_fd;\t\t\t\t/* descriptor */\n  int\t f_flags;\t\t\t/* F_xxx below */\n  pthread_t\t f_tid;\t\t\t/* thread ID */\n} file[MAXFILES];\n#define\tF_CONNECTING\t1\t/* connect() in progress */\n#define\tF_READING\t\t2\t/* connect() complete; now reading */\n#define\tF_DONE\t\t\t4\t/* all done */\n#define\tF_JOINED\t\t8\t/* main has pthread_join'ed */\n\n#define\tGET_CMD\t\t\"GET %s HTTP/1.0\\r\\n\\r\\n\"\n\nint\t\tnconn, nfiles, nlefttoconn, nlefttoread;\n\nint\t\t\t\tndone;\t\t/* number of terminated threads */\npthread_mutex_t\tndone_mutex = PTHREAD_MUTEX_INITIALIZER;\npthread_cond_t\tndone_cond = PTHREAD_COND_INITIALIZER;\n\nvoid\t*do_get_read(void *);\nvoid\thome_page(const char *, const char *);\nvoid\twrite_get_cmd(struct file *);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\ti, maxnconn;\n\tpthread_t\ttid;\n\tstruct file\t*fptr;\n\n\tif (argc < 5)\n\t\terr_quit(\"usage: web <#conns> <IPaddr> <homepage> file1 ...\");\n\tmaxnconn = atoi(argv[1]);\n\n\tnfiles = min(argc - 4, MAXFILES);\n\tfor (i = 0; i < nfiles; i++) {\n\t\tfile[i].f_name = argv[i + 4];\n\t\tfile[i].f_host = argv[2];\n\t\tfile[i].f_flags = 0;\n\t}\n\tprintf(\"nfiles = %d\\n\", nfiles);\n\n\thome_page(argv[2], argv[3]);\n\n\tnlefttoread = nlefttoconn = nfiles;\n\tnconn = 0;\n/* include web2 */\n\twhile (nlefttoread > 0) {\n\t\twhile (nconn < maxnconn && nlefttoconn > 0) {\n\t\t\t\t/* 4find a file to read */\n\t\t\tfor (i = 0 ; i < nfiles; i++)\n\t\t\t\tif (file[i].f_flags == 0)\n\t\t\t\t\tbreak;\n\t\t\tif (i == nfiles)\n\t\t\t\terr_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);\n\n\t\t\tfile[i].f_flags = F_CONNECTING;\n\t\t\tPthread_create(&tid, NULL, &do_get_read, &file[i]);\n\t\t\tfile[i].f_tid = tid;\n\t\t\tnconn++;\n\t\t\tnlefttoconn--;\n\t\t}\n\n\t\t\t/* 4Wait for thread to terminate */\n\t\tPthread_mutex_lock(&ndone_mutex);\n\t\twhile (ndone == 0)\n\t\t\tPthread_cond_wait(&ndone_cond, &ndone_mutex);\n\n\t\tfor (i = 0; i < nfiles; i++) {\n\t\t\tif (file[i].f_flags & F_DONE) {\n\t\t\t\tPthread_join(file[i].f_tid, (void **) &fptr);\n\n\t\t\t\tif (&file[i] != fptr)\n\t\t\t\t\terr_quit(\"file[i] != fptr\");\n\t\t\t\tfptr->f_flags = F_JOINED;\t/* clears F_DONE */\n\t\t\t\tndone--;\n\t\t\t\tnconn--;\n\t\t\t\tnlefttoread--;\n\t\t\t\tprintf(\"thread %d for %s done\\n\", fptr->f_tid, fptr->f_name);\n\t\t\t}\n\t\t}\n\t\tPthread_mutex_unlock(&ndone_mutex);\n\t}\n\n\texit(0);\n}\n/* end web2 */\n\nvoid *\ndo_get_read(void *vptr)\n{\n\tint\t\t\t\t\tfd, n;\n\tchar\t\t\t\tline[MAXLINE];\n\tstruct file\t\t\t*fptr;\n\n\tfptr = (struct file *) vptr;\n\n\tfd = Tcp_connect(fptr->f_host, SERV);\n\tfptr->f_fd = fd;\n\tprintf(\"do_get_read for %s, fd %d, thread %d\\n\",\n\t\t\tfptr->f_name, fd, fptr->f_tid);\n\n\twrite_get_cmd(fptr);\t/* write() the GET command */\n\n\t\t/* 4Read server's reply */\n\tfor ( ; ; ) {\n\t\tif ( (n = Read(fd, line, MAXLINE)) == 0)\n\t\t\tbreak;\t\t/* server closed connection */\n\n\t\tprintf(\"read %d bytes from %s\\n\", n, fptr->f_name);\n\t}\n\tprintf(\"end-of-file on %s\\n\", fptr->f_name);\n\tClose(fd);\n\tfptr->f_flags = F_DONE;\t\t/* clears F_READING */\n\n\tPthread_mutex_lock(&ndone_mutex);\n\tndone++;\n\tPthread_cond_signal(&ndone_cond);\n\tPthread_mutex_unlock(&ndone_mutex);\n\n\treturn(fptr);\t\t/* terminate thread */\n}\n\nvoid\nwrite_get_cmd(struct file *fptr)\n{\n\tint\t\tn;\n\tchar\tline[MAXLINE];\n\n\tn = snprintf(line, sizeof(line), GET_CMD, fptr->f_name);\n\tWriten(fptr->f_fd, line, n);\n\tprintf(\"wrote %d bytes for %s\\n\", n, fptr->f_name);\n\n\tfptr->f_flags = F_READING;\t\t\t/* clears F_CONNECTING */\n}\n\nvoid\nhome_page(const char *host, const char *fname)\n{\n\tint\t\tfd, n;\n\tchar\tline[MAXLINE];\n\n\tfd = Tcp_connect(host, SERV);\t/* blocking connect() */\n\n\tn = snprintf(line, sizeof(line), GET_CMD, fname);\n\tWriten(fd, line, n);\n\n\tfor ( ; ; ) {\n\t\tif ( (n = Read(fd, line, MAXLINE)) == 0)\n\t\t\tbreak;\t\t/* server closed connection */\n\n\t\tprintf(\"read %d bytes of home page\\n\", n);\n\t\t/* do whatever with data */\n\t}\n\tprintf(\"end-of-file on home page\\n\");\n\tClose(fd);\n}\n"
  },
  {
    "path": "threads/web03.lc",
    "content": "#include    \"unpthread.h\"##  1 ##src/threads/web03.c##\n#include    <thread.h>          /* Solaris threads */##  2 ##src/threads/web03.c##\n\n#define MAXFILES    20##  3 ##src/threads/web03.c##\n#define SERV        \"80\"        /* port number or service name */##  4 ##src/threads/web03.c##\n\nstruct file {##  5 ##src/threads/web03.c##\n    char   *f_name;             /* filename */##  6 ##src/threads/web03.c##\n    char   *f_host;             /* hostname or IP address */##  7 ##src/threads/web03.c##\n    int     f_fd;               /* descriptor */##  8 ##src/threads/web03.c##\n    int     f_flags;            /* F_xxx below */##  9 ##src/threads/web03.c##\n    pthread_t f_tid;            /* thread ID */## 10 ##src/threads/web03.c##\n} file[MAXFILES];## 11 ##src/threads/web03.c##\n#define F_CONNECTING    1       /* connect() in progress */## 12 ##src/threads/web03.c##\n#define F_READING       2       /* connect() complete; now reading */## 13 ##src/threads/web03.c##\n#define F_DONE          4       /* all done */## 14 ##src/threads/web03.c##\n#define F_JOINED        8       /* main has pthread_join'ed */## 15 ##src/threads/web03.c##\n\n#define GET_CMD     \"GET %s HTTP/1.0\\r\\n\\r\\n\"## 16 ##src/threads/web03.c##\n\nint     nconn, nfiles, nlefttoconn, nlefttoread;## 17 ##src/threads/web03.c##\n\nint     ndone;                  /* number of terminated threads */## 18 ##src/threads/web03.c##\npthread_mutex_t ndone_mutex = PTHREAD_MUTEX_INITIALIZER;## 19 ##src/threads/web03.c##\npthread_cond_t ndone_cond = PTHREAD_COND_INITIALIZER;## 20 ##src/threads/web03.c##\n\nvoid   *do_get_read(void *);## 21 ##src/threads/web03.c##\nvoid    home_page(const char *, const char *);## 22 ##src/threads/web03.c##\nvoid    write_get_cmd(struct file *);## 23 ##src/threads/web03.c##\n\nint## 24 ##src/threads/web03.c##\nmain(int argc, char **argv)## 25 ##src/threads/web03.c##\n{## 26 ##src/threads/web03.c##\n    int     i, maxnconn;## 27 ##src/threads/web03.c##\n    pthread_t tid;## 28 ##src/threads/web03.c##\n    struct file *fptr;## 29 ##src/threads/web03.c##\n\n    if (argc < 5)## 30 ##src/threads/web03.c##\n        err_quit(\"usage: web <#conns> <IPaddr> <homepage> file1 ...\");## 31 ##src/threads/web03.c##\n    maxnconn = atoi(argv[1]);## 32 ##src/threads/web03.c##\n\n    nfiles = min(argc - 4, MAXFILES);## 33 ##src/threads/web03.c##\n    for (i = 0; i < nfiles; i++) {## 34 ##src/threads/web03.c##\n        file[i].f_name = argv[i + 4];## 35 ##src/threads/web03.c##\n        file[i].f_host = argv[2];## 36 ##src/threads/web03.c##\n        file[i].f_flags = 0;## 37 ##src/threads/web03.c##\n    }## 38 ##src/threads/web03.c##\n    printf(\"nfiles = %d\\n\", nfiles);## 39 ##src/threads/web03.c##\n\n    home_page(argv[2], argv[3]);## 40 ##src/threads/web03.c##\n\n    nlefttoread = nlefttoconn = nfiles;## 41 ##src/threads/web03.c##\n    nconn = 0;## 42 ##src/threads/web03.c##\n/* include web2 */\n    while (nlefttoread > 0) {## 43 ##src/threads/web03.c##\n        while (nconn < maxnconn && nlefttoconn > 0) {## 44 ##src/threads/web03.c##\n            /* 4find a file to read */## 45 ##src/threads/web03.c##\n            for (i = 0; i < nfiles; i++)## 46 ##src/threads/web03.c##\n                if (file[i].f_flags == 0)## 47 ##src/threads/web03.c##\n                    break;## 48 ##src/threads/web03.c##\n            if (i == nfiles)## 49 ##src/threads/web03.c##\n                err_quit(\"nlefttoconn = %d but nothing found\", nlefttoconn);## 50 ##src/threads/web03.c##\n\n            file[i].f_flags = F_CONNECTING;## 51 ##src/threads/web03.c##\n            Pthread_create(&tid, NULL, &do_get_read, &file[i]);## 52 ##src/threads/web03.c##\n            file[i].f_tid = tid;## 53 ##src/threads/web03.c##\n            nconn++;## 54 ##src/threads/web03.c##\n            nlefttoconn--;## 55 ##src/threads/web03.c##\n        }## 56 ##src/threads/web03.c##\n\n        /* 4Wait for one of the threads to terminate */## 57 ##src/threads/web03.c##\n        Pthread_mutex_lock(&ndone_mutex);## 58 ##src/threads/web03.c##\n        while (ndone == 0)## 59 ##src/threads/web03.c##\n            Pthread_cond_wait(&ndone_cond, &ndone_mutex);## 60 ##src/threads/web03.c##\n\n        for (i = 0; i < nfiles; i++) {## 61 ##src/threads/web03.c##\n            if (file[i].f_flags & F_DONE) {## 62 ##src/threads/web03.c##\n                Pthread_join(file[i].f_tid, (void **) &fptr);## 63 ##src/threads/web03.c##\n\n                if (&file[i] != fptr)## 64 ##src/threads/web03.c##\n                    err_quit(\"file[i] != fptr\");## 65 ##src/threads/web03.c##\n                fptr->f_flags = F_JOINED;   /* clears F_DONE */## 66 ##src/threads/web03.c##\n                ndone--;## 67 ##src/threads/web03.c##\n                nconn--;## 68 ##src/threads/web03.c##\n                nlefttoread--;## 69 ##src/threads/web03.c##\n                printf(\"thread %d for %s done\\n\", fptr->f_tid, fptr->f_name);## 70 ##src/threads/web03.c##\n            }## 71 ##src/threads/web03.c##\n        }## 72 ##src/threads/web03.c##\n        Pthread_mutex_unlock(&ndone_mutex);## 73 ##src/threads/web03.c##\n    }## 74 ##src/threads/web03.c##\n\n    exit(0);## 75 ##src/threads/web03.c##\n}## 76 ##src/threads/web03.c##\n/* end web2 */\n\nvoid   *## 77 ##src/threads/web03.c##\ndo_get_read(void *vptr)## 78 ##src/threads/web03.c##\n{## 79 ##src/threads/web03.c##\n    int     fd, n;## 80 ##src/threads/web03.c##\n    char    line[MAXLINE];## 81 ##src/threads/web03.c##\n    struct file *fptr;## 82 ##src/threads/web03.c##\n\n    fptr = (struct file *) vptr;## 83 ##src/threads/web03.c##\n\n    fd = Tcp_connect(fptr->f_host, SERV);## 84 ##src/threads/web03.c##\n    fptr->f_fd = fd;## 85 ##src/threads/web03.c##\n    printf(\"do_get_read for %s, fd %d, thread %d\\n\",## 86 ##src/threads/web03.c##\n           fptr->f_name, fd, fptr->f_tid);## 87 ##src/threads/web03.c##\n\n    write_get_cmd(fptr);        /* write() the GET command */## 88 ##src/threads/web03.c##\n\n    /* 4Read server's reply */## 89 ##src/threads/web03.c##\n    for (;;) {## 90 ##src/threads/web03.c##\n        if ((n = Read(fd, line, MAXLINE)) == 0)## 91 ##src/threads/web03.c##\n            break;              /* server closed connection */## 92 ##src/threads/web03.c##\n\n        printf(\"read %d bytes from %s\\n\", n, fptr->f_name);## 93 ##src/threads/web03.c##\n    }## 94 ##src/threads/web03.c##\n    printf(\"end-of-file on %s\\n\", fptr->f_name);## 95 ##src/threads/web03.c##\n    Close(fd);## 96 ##src/threads/web03.c##\n    fptr->f_flags = F_DONE;     /* clears F_READING */## 97 ##src/threads/web03.c##\n\n    Pthread_mutex_lock(&ndone_mutex);## 98 ##src/threads/web03.c##\n    ndone++;## 99 ##src/threads/web03.c##\n    Pthread_cond_signal(&ndone_cond);##100 ##src/threads/web03.c##\n    Pthread_mutex_unlock(&ndone_mutex);##101 ##src/threads/web03.c##\n\n    return (fptr);              /* terminate thread */##102 ##src/threads/web03.c##\n}##103 ##src/threads/web03.c##\n\nvoid##104 ##src/threads/web03.c##\nwrite_get_cmd(struct file *fptr)##105 ##src/threads/web03.c##\n{##106 ##src/threads/web03.c##\n    int     n;##107 ##src/threads/web03.c##\n    char    line[MAXLINE];##108 ##src/threads/web03.c##\n\n    n = snprintf(line, sizeof(line), GET_CMD, fptr->f_name);##109 ##src/threads/web03.c##\n    Writen(fptr->f_fd, line, n);##110 ##src/threads/web03.c##\n    printf(\"wrote %d bytes for %s\\n\", n, fptr->f_name);##111 ##src/threads/web03.c##\n\n    fptr->f_flags = F_READING;  /* clears F_CONNECTING */##112 ##src/threads/web03.c##\n}##113 ##src/threads/web03.c##\n\nvoid##114 ##src/threads/web03.c##\nhome_page(const char *host, const char *fname)##115 ##src/threads/web03.c##\n{##116 ##src/threads/web03.c##\n    int     fd, n;##117 ##src/threads/web03.c##\n    char    line[MAXLINE];##118 ##src/threads/web03.c##\n\n    fd = Tcp_connect(host, SERV);   /* blocking connect() */##119 ##src/threads/web03.c##\n\n    n = snprintf(line, sizeof(line), GET_CMD, fname);##120 ##src/threads/web03.c##\n    Writen(fd, line, n);##121 ##src/threads/web03.c##\n\n    for (;;) {##122 ##src/threads/web03.c##\n        if ((n = Read(fd, line, MAXLINE)) == 0)##123 ##src/threads/web03.c##\n            break;              /* server closed connection */##124 ##src/threads/web03.c##\n\n        printf(\"read %d bytes of home page\\n\", n);##125 ##src/threads/web03.c##\n        /* do whatever with data */##126 ##src/threads/web03.c##\n    }##127 ##src/threads/web03.c##\n    printf(\"end-of-file on home page\\n\");##128 ##src/threads/web03.c##\n    Close(fd);##129 ##src/threads/web03.c##\n}##130 ##src/threads/web03.c##\n"
  },
  {
    "path": "traceroute/Makefile",
    "content": "include ../Make.defines\n\nOBJS = main.o icmpcode_v4.o icmpcode_v6.o recv_v4.o recv_v6.o \\\n\t\tsig_alrm.o traceloop.o tv_sub.o\nPROGS =\ttraceroute\n\nall:\t${PROGS}\n\ntraceroute:\t${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ ${OBJS} ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "traceroute/icmpcode_v4.c",
    "content": "#include\t\"trace.h\"\n\nconst char *\nicmpcode_v4(int code)\n{\n\tstatic char errbuf[100];\n\tswitch (code) {\n\tcase  0:\treturn(\"network unreachable\");\n\tcase  1:\treturn(\"host unreachable\");\n\tcase  2:\treturn(\"protocol unreachable\");\n\tcase  3:\treturn(\"port unreachable\");\n\tcase  4:\treturn(\"fragmentation required but DF bit set\");\n\tcase  5:\treturn(\"source route failed\");\n\tcase  6:\treturn(\"destination network unknown\");\n\tcase  7:\treturn(\"destination host unknown\");\n\tcase  8:\treturn(\"source host isolated (obsolete)\");\n\tcase  9:\treturn(\"destination network administratively prohibited\");\n\tcase 10:\treturn(\"destination host administratively prohibited\");\n\tcase 11:\treturn(\"network unreachable for TOS\");\n\tcase 12:\treturn(\"host unreachable for TOS\");\n\tcase 13:\treturn(\"communication administratively prohibited by filtering\");\n\tcase 14:\treturn(\"host recedence violation\");\n\tcase 15:\treturn(\"precedence cutoff in effect\");\n\tdefault:\tsprintf(errbuf, \"[unknown code %d]\", code);\n\t\t\t\treturn errbuf;\n\t}\n}\n"
  },
  {
    "path": "traceroute/icmpcode_v6.c",
    "content": "#include\t\"trace.h\"\n\nconst char *\nicmpcode_v6(int code)\n{\n#ifdef\tIPV6\n\tstatic char errbuf[100];\n\tswitch (code) {\n\tcase  ICMP6_DST_UNREACH_NOROUTE:\n\t\treturn(\"no route to host\");\n\tcase  ICMP6_DST_UNREACH_ADMIN:\n\t\treturn(\"administratively prohibited\");\n\tcase  ICMP6_DST_UNREACH_NOTNEIGHBOR:\n\t\treturn(\"not a neighbor\");\n\tcase  ICMP6_DST_UNREACH_ADDR:\n\t\treturn(\"address unreachable\");\n\tcase  ICMP6_DST_UNREACH_NOPORT:\n\t\treturn(\"port unreachable\");\n\tdefault:\n\t\tsprintf(errbuf, \"[unknown code %d]\", code);\n\t\treturn errbuf;\n\t}\n#endif\n}\n"
  },
  {
    "path": "traceroute/main.c",
    "content": "#include\t\"trace.h\"\n\nstruct proto\tproto_v4 = { icmpcode_v4, recv_v4, NULL, NULL, NULL, NULL, 0,\n\t\t\t\t\t\t\t IPPROTO_ICMP, IPPROTO_IP, IP_TTL };\n\n#ifdef\tIPV6\nstruct proto\tproto_v6 = { icmpcode_v6, recv_v6, NULL, NULL, NULL, NULL, 0,\n\t\t\t\t\t\t\t IPPROTO_ICMPV6, IPPROTO_IPV6, IPV6_UNICAST_HOPS };\n#endif\n\nint\t\tdatalen = sizeof(struct rec);\t/* defaults */\nint\t\tmax_ttl = 30;\nint\t\tnprobes = 3;\nu_short\tdport = 32768 + 666;\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tc;\n\tstruct addrinfo\t*ai;\n\tchar *h;\n\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"m:v\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 'm':\n\t\t\tif ( (max_ttl = atoi(optarg)) <= 1)\n\t\t\t\terr_quit(\"invalid -m value\");\n\t\t\tbreak;\n\n\t\tcase 'v':\n\t\t\tverbose++;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\terr_quit(\"unrecognized option: %c\", c);\n\t\t}\n\t}\n\n\tif (optind != argc-1)\n\t\terr_quit(\"usage: traceroute [ -m <maxttl> -v ] <hostname>\");\n\thost = argv[optind];\n\n\tpid = getpid();\n\tSignal(SIGALRM, sig_alrm);\n\n\tai = Host_serv(host, NULL, 0, 0);\n\n\th = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);\n\tprintf(\"traceroute to %s (%s): %d hops max, %d data bytes\\n\",\n\t\t   ai->ai_canonname ? ai->ai_canonname : h,\n\t\t   h, max_ttl, datalen);\n\n\t\t/* initialize according to protocol */\n\tif (ai->ai_family == AF_INET) {\n\t\tpr = &proto_v4;\n#ifdef\tIPV6\n\t} else if (ai->ai_family == AF_INET6) {\n\t\tpr = &proto_v6;\n\t\tif (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr)))\n\t\t\terr_quit(\"cannot traceroute IPv4-mapped IPv6 address\");\n#endif\n\t} else\n\t\terr_quit(\"unknown address family %d\", ai->ai_family);\n\n\tpr->sasend = ai->ai_addr;\t\t/* contains destination address */\n\tpr->sarecv = Calloc(1, ai->ai_addrlen);\n\tpr->salast = Calloc(1, ai->ai_addrlen);\n\tpr->sabind = Calloc(1, ai->ai_addrlen);\n\tpr->salen = ai->ai_addrlen;\n\n\ttraceloop();\n\n\texit(0);\n}\n"
  },
  {
    "path": "traceroute/main.lc",
    "content": "#include    \"trace.h\"##  1 ##src/traceroute/main.c##\n\nstruct proto proto_v4 = { icmpcode_v4, recv_v4, NULL, NULL, NULL, NULL, 0,##  2 ##src/traceroute/main.c##\n    IPPROTO_ICMP, IPPROTO_IP, IP_TTL##  3 ##src/traceroute/main.c##\n};##  4 ##src/traceroute/main.c##\n\n#ifdef  IPV6##  5 ##src/traceroute/main.c##\nstruct proto proto_v6 = { icmpcode_v6, recv_v6, NULL, NULL, NULL, NULL, 0,##  6 ##src/traceroute/main.c##\n    IPPROTO_ICMPV6, IPPROTO_IPV6, IPV6_UNICAST_HOPS##  7 ##src/traceroute/main.c##\n};##  8 ##src/traceroute/main.c##\n#endif##  9 ##src/traceroute/main.c##\n\nint     datalen = sizeof(struct rec);   /* defaults */## 10 ##src/traceroute/main.c##\nint     max_ttl = 30;## 11 ##src/traceroute/main.c##\nint     nprobes = 3;## 12 ##src/traceroute/main.c##\nu_short dport = 32768 + 666;## 13 ##src/traceroute/main.c##\n\nint## 14 ##src/traceroute/main.c##\nmain(int argc, char **argv)## 15 ##src/traceroute/main.c##\n{## 16 ##src/traceroute/main.c##\n    int     c;## 17 ##src/traceroute/main.c##\n    struct addrinfo *ai;## 18 ##src/traceroute/main.c##\n\n    opterr = 0;                 /* don't want getopt() writing to stderr */## 19 ##src/traceroute/main.c##\n    while ((c = getopt(argc, argv, \"m:v\")) != -1) {## 20 ##src/traceroute/main.c##\n        switch (c) {## 21 ##src/traceroute/main.c##\n        case 'm':## 22 ##src/traceroute/main.c##\n            if ((max_ttl = atoi(optarg)) <= 1)## 23 ##src/traceroute/main.c##\n                err_quit(\"invalid -m value\");## 24 ##src/traceroute/main.c##\n            break;## 25 ##src/traceroute/main.c##\n\n        case 'v':## 26 ##src/traceroute/main.c##\n            verbose++;## 27 ##src/traceroute/main.c##\n            break;## 28 ##src/traceroute/main.c##\n\n        case '?':## 29 ##src/traceroute/main.c##\n            err_quit(\"unrecognized option: %c\", c);## 30 ##src/traceroute/main.c##\n        }## 31 ##src/traceroute/main.c##\n    }## 32 ##src/traceroute/main.c##\n\n    if (optind != argc - 1)## 33 ##src/traceroute/main.c##\n        err_quit(\"usage: traceroute [ -m <maxttl> -v ] <hostname>\");## 34 ##src/traceroute/main.c##\n    host = argv[optind];## 35 ##src/traceroute/main.c##\n\n    pid = getpid();## 36 ##src/traceroute/main.c##\n    Signal(SIGALRM, sig_alrm);## 37 ##src/traceroute/main.c##\n\n    ai = Host_serv(host, NULL, 0, 0);## 38 ##src/traceroute/main.c##\n\n    printf(\"traceroute to %s (%s): %d hops max, %d data bytes\\n\",## 39 ##src/traceroute/main.c##\n           ai->ai_canonname,## 40 ##src/traceroute/main.c##\n           Sock_ntop_host(ai->ai_addr, ai->ai_addrlen), max_ttl, datalen);## 41 ##src/traceroute/main.c##\n\n    /* initialize according to protocol */## 42 ##src/traceroute/main.c##\n    if (ai->ai_family == AF_INET) {## 43 ##src/traceroute/main.c##\n        pr = &proto_v4;## 44 ##src/traceroute/main.c##\n#ifdef  IPV6## 45 ##src/traceroute/main.c##\n    } else if (ai->ai_family == AF_INET6) {## 46 ##src/traceroute/main.c##\n        pr = &proto_v6;## 47 ##src/traceroute/main.c##\n        if (IN6_IS_ADDR_V4MAPPED## 48 ##src/traceroute/main.c##\n            (&(((struct sockaddr_in6 *) ai->ai_addr)->sin6_addr)))## 49 ##src/traceroute/main.c##\n            err_quit(\"cannot traceroute IPv4-mapped IPv6 address\");## 50 ##src/traceroute/main.c##\n#endif## 51 ##src/traceroute/main.c##\n    } else## 52 ##src/traceroute/main.c##\n        err_quit(\"unknown address family %d\", ai->ai_family);## 53 ##src/traceroute/main.c##\n\n    pr->sasend = ai->ai_addr;   /* contains destination address */## 54 ##src/traceroute/main.c##\n    pr->sarecv = Calloc(1, ai->ai_addrlen);## 55 ##src/traceroute/main.c##\n    pr->salast = Calloc(1, ai->ai_addrlen);## 56 ##src/traceroute/main.c##\n    pr->sabind = Calloc(1, ai->ai_addrlen);## 57 ##src/traceroute/main.c##\n    pr->salen = ai->ai_addrlen;## 58 ##src/traceroute/main.c##\n\n    traceloop();## 59 ##src/traceroute/main.c##\n\n    exit(0);## 60 ##src/traceroute/main.c##\n}## 61 ##src/traceroute/main.c##\n"
  },
  {
    "path": "traceroute/recv_v4.c",
    "content": "#include\t\"trace.h\"\n\nextern int gotalarm;\n\n/*\n * Return: -3 on timeout\n *\t\t   -2 on ICMP time exceeded in transit (caller keeps going)\n *\t\t   -1 on ICMP port unreachable (caller is done)\n *\t\t >= 0 return value is some other ICMP unreachable code\n */\n\nint\nrecv_v4(int seq, struct timeval *tv)\n{\n\tint\t\t\t\thlen1, hlen2, icmplen, ret;\n\tsocklen_t\t\tlen;\n\tssize_t\t\t\tn;\n\tstruct ip\t\t*ip, *hip;\n\tstruct icmp\t\t*icmp;\n\tstruct udphdr\t*udp;\n\n\tgotalarm = 0;\n\talarm(3);\n\tfor ( ; ; ) {\n\t\tif (gotalarm)\n\t\t\treturn(-3);\t\t/* alarm expired */\n\t\tlen = pr->salen;\n\t\tn = recvfrom(recvfd, recvbuf, sizeof(recvbuf), 0, pr->sarecv, &len);\n\t\tif (n < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\n\t\t\telse\n\t\t\t\terr_sys(\"recvfrom error\");\n\t\t}\n\n\t\tip = (struct ip *) recvbuf;\t/* start of IP header */\n\t\thlen1 = ip->ip_hl << 2;\t\t/* length of IP header */\n\t\n\t\ticmp = (struct icmp *) (recvbuf + hlen1); /* start of ICMP header */\n\t\tif ( (icmplen = n - hlen1) < 8)\n\t\t\tcontinue;\t\t\t\t/* not enough to look at ICMP header */\n\t\n\t\tif (icmp->icmp_type == ICMP_TIMXCEED &&\n\t\t\ticmp->icmp_code == ICMP_TIMXCEED_INTRANS) {\n\t\t\tif (icmplen < 8 + sizeof(struct ip))\n\t\t\t\tcontinue;\t\t\t/* not enough data to look at inner IP */\n\n\t\t\thip = (struct ip *) (recvbuf + hlen1 + 8);\n\t\t\thlen2 = hip->ip_hl << 2;\n\t\t\tif (icmplen < 8 + hlen2 + 4)\n\t\t\t\tcontinue;\t\t\t/* not enough data to look at UDP ports */\n\n\t\t\tudp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);\n \t\t\tif (hip->ip_p == IPPROTO_UDP &&\n\t\t\t\tudp->uh_sport == htons(sport) &&\n\t\t\t\tudp->uh_dport == htons(dport + seq)) {\n\t\t\t\tret = -2;\t\t/* we hit an intermediate router */\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t} else if (icmp->icmp_type == ICMP_UNREACH) {\n\t\t\tif (icmplen < 8 + sizeof(struct ip))\n\t\t\t\tcontinue;\t\t\t/* not enough data to look at inner IP */\n\n\t\t\thip = (struct ip *) (recvbuf + hlen1 + 8);\n\t\t\thlen2 = hip->ip_hl << 2;\n\t\t\tif (icmplen < 8 + hlen2 + 4)\n\t\t\t\tcontinue;\t\t\t/* not enough data to look at UDP ports */\n\n\t\t\tudp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);\n \t\t\tif (hip->ip_p == IPPROTO_UDP &&\n\t\t\t\tudp->uh_sport == htons(sport) &&\n\t\t\t\tudp->uh_dport == htons(dport + seq)) {\n\t\t\t\tif (icmp->icmp_code == ICMP_UNREACH_PORT)\n\t\t\t\t\tret = -1;\t/* have reached destination */\n\t\t\t\telse\n\t\t\t\t\tret = icmp->icmp_code;\t/* 0, 1, 2, ... */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (verbose) {\n\t\t\tprintf(\" (from %s: type = %d, code = %d)\\n\",\n\t\t\t\t\tSock_ntop_host(pr->sarecv, pr->salen),\n\t\t\t\t\ticmp->icmp_type, icmp->icmp_code);\n\t\t}\n\t\t/* Some other ICMP error, recvfrom() again */\n\t}\n\talarm(0);\t\t\t\t\t/* don't leave alarm running */\n\tGettimeofday(tv, NULL);\t\t/* get time of packet arrival */\n\treturn(ret);\n}\n"
  },
  {
    "path": "traceroute/recv_v4.lc",
    "content": "#include    \"trace.h\"##  1 ##src/traceroute/recv_v4.c##\n\n/*##  2 ##src/traceroute/recv_v4.c##\n * Return: -3 on timeout##  3 ##src/traceroute/recv_v4.c##\n *         -2 on ICMP time exceeded in transit (caller keeps going)##  4 ##src/traceroute/recv_v4.c##\n *         -1 on ICMP port unreachable (caller is done)##  5 ##src/traceroute/recv_v4.c##\n *       >= 0 return value is some other ICMP unreachable code##  6 ##src/traceroute/recv_v4.c##\n */##  7 ##src/traceroute/recv_v4.c##\n\nint##  8 ##src/traceroute/recv_v4.c##\nrecv_v4(int seq, struct timeval *tv)##  9 ##src/traceroute/recv_v4.c##\n{## 10 ##src/traceroute/recv_v4.c##\n    int     hlen1, hlen2, icmplen;## 11 ##src/traceroute/recv_v4.c##\n    socklen_t len;## 12 ##src/traceroute/recv_v4.c##\n    ssize_t n;## 13 ##src/traceroute/recv_v4.c##\n    struct ip *ip, *hip;## 14 ##src/traceroute/recv_v4.c##\n    struct icmp *icmp;## 15 ##src/traceroute/recv_v4.c##\n    struct udphdr *udp;## 16 ##src/traceroute/recv_v4.c##\n\n    alarm(3);## 17 ##src/traceroute/recv_v4.c##\n    for (;;) {## 18 ##src/traceroute/recv_v4.c##\n        len = pr->salen;## 19 ##src/traceroute/recv_v4.c##\n        n = recvfrom(recvfd, recvbuf, sizeof(recvbuf), 0, pr->sarecv, &len);## 20 ##src/traceroute/recv_v4.c##\n        if (n < 0) {## 21 ##src/traceroute/recv_v4.c##\n            if (errno == EINTR)## 22 ##src/traceroute/recv_v4.c##\n                return (-3);    /* alarm expired */## 23 ##src/traceroute/recv_v4.c##\n            else## 24 ##src/traceroute/recv_v4.c##\n                err_sys(\"recvfrom error\");## 25 ##src/traceroute/recv_v4.c##\n        }## 26 ##src/traceroute/recv_v4.c##\n        Gettimeofday(tv, NULL); /* get time of packet arrival */## 27 ##src/traceroute/recv_v4.c##\n\n        ip = (struct ip *) recvbuf; /* start of IP header */## 28 ##src/traceroute/recv_v4.c##\n        hlen1 = ip->ip_hl << 2; /* length of IP header */## 29 ##src/traceroute/recv_v4.c##\n\n        icmp = (struct icmp *) (recvbuf + hlen1);   /* start of ICMP header */## 30 ##src/traceroute/recv_v4.c##\n        if ((icmplen = n - hlen1) < 8)## 31 ##src/traceroute/recv_v4.c##\n            err_quit(\"icmplen (%d) < 8\", icmplen);## 32 ##src/traceroute/recv_v4.c##\n\n        if (icmp->icmp_type == ICMP_TIMXCEED &&## 33 ##src/traceroute/recv_v4.c##\n            icmp->icmp_code == ICMP_TIMXCEED_INTRANS) {## 34 ##src/traceroute/recv_v4.c##\n            if (icmplen < 8 + 20 + 8)## 35 ##src/traceroute/recv_v4.c##\n                err_quit(\"icmplen (%d) < 8 + 20 + 8\", icmplen);## 36 ##src/traceroute/recv_v4.c##\n\n            hip = (struct ip *) (recvbuf + hlen1 + 8);## 37 ##src/traceroute/recv_v4.c##\n            hlen2 = hip->ip_hl << 2;## 38 ##src/traceroute/recv_v4.c##\n            udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);## 39 ##src/traceroute/recv_v4.c##\n            if (hip->ip_p == IPPROTO_UDP &&## 40 ##src/traceroute/recv_v4.c##\n                udp->uh_sport == htons(sport) &&## 41 ##src/traceroute/recv_v4.c##\n                udp->uh_dport == htons(dport + seq))## 42 ##src/traceroute/recv_v4.c##\n                return (-2);    /* we hit an intermediate router */## 43 ##src/traceroute/recv_v4.c##\n\n        } else if (icmp->icmp_type == ICMP_UNREACH) {## 44 ##src/traceroute/recv_v4.c##\n            if (icmplen < 8 + 20 + 8)## 45 ##src/traceroute/recv_v4.c##\n                err_quit(\"icmplen (%d) < 8 + 20 + 8\", icmplen);## 46 ##src/traceroute/recv_v4.c##\n\n            hip = (struct ip *) (recvbuf + hlen1 + 8);## 47 ##src/traceroute/recv_v4.c##\n            hlen2 = hip->ip_hl << 2;## 48 ##src/traceroute/recv_v4.c##\n            udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);## 49 ##src/traceroute/recv_v4.c##\n            if (hip->ip_p == IPPROTO_UDP &&## 50 ##src/traceroute/recv_v4.c##\n                udp->uh_sport == htons(sport) &&## 51 ##src/traceroute/recv_v4.c##\n                udp->uh_dport == htons(dport + seq)) {## 52 ##src/traceroute/recv_v4.c##\n                if (icmp->icmp_code == ICMP_UNREACH_PORT)## 53 ##src/traceroute/recv_v4.c##\n                    return (-1);    /* have reached destination */## 54 ##src/traceroute/recv_v4.c##\n                else## 55 ##src/traceroute/recv_v4.c##\n                    return (icmp->icmp_code);   /* 0, 1, 2, ... */## 56 ##src/traceroute/recv_v4.c##\n            }## 57 ##src/traceroute/recv_v4.c##\n        } else if (verbose) {## 58 ##src/traceroute/recv_v4.c##\n            printf(\" (from %s: type = %d, code = %d)\\n\",## 59 ##src/traceroute/recv_v4.c##\n                   Sock_ntop_host(pr->sarecv, pr->salen),## 60 ##src/traceroute/recv_v4.c##\n                   icmp->icmp_type, icmp->icmp_code);## 61 ##src/traceroute/recv_v4.c##\n        }## 62 ##src/traceroute/recv_v4.c##\n        /* Some other ICMP error, recvfrom() again */## 63 ##src/traceroute/recv_v4.c##\n    }## 64 ##src/traceroute/recv_v4.c##\n}## 65 ##src/traceroute/recv_v4.c##\n"
  },
  {
    "path": "traceroute/recv_v6.c",
    "content": "#include\t\"trace.h\"\n\nextern int gotalarm;\n\n/*\n * Return: -3 on timeout\n *\t\t   -2 on ICMP time exceeded in transit (caller keeps going)\n *\t\t   -1 on ICMP port unreachable (caller is done)\n *\t\t >= 0 return value is some other ICMP unreachable code\n */\n\nint\nrecv_v6(int seq, struct timeval *tv)\n{\n#ifdef\tIPV6\n\tint\t\t\t\t\thlen2, icmp6len, ret;\n\tssize_t\t\t\t\tn;\n\tsocklen_t\t\t\tlen;\n\tstruct ip6_hdr\t\t*hip6;\n\tstruct icmp6_hdr\t*icmp6;\n\tstruct udphdr\t\t*udp;\n\n\tgotalarm = 0;\n\talarm(3);\n\tfor ( ; ; ) {\n\t\tif (gotalarm)\n\t\t\treturn(-3);\t\t/* alarm expired */\n\t\tlen = pr->salen;\n\t\tn = recvfrom(recvfd, recvbuf, sizeof(recvbuf), 0, pr->sarecv, &len);\n\t\tif (n < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\n\t\t\telse\n\t\t\t\terr_sys(\"recvfrom error\");\n\t\t}\n\n\t\ticmp6 = (struct icmp6_hdr *) recvbuf; /* ICMP header */\n\t\tif ( ( icmp6len = n ) < 8)\n\t\t\tcontinue;\t\t\t\t/* not enough to look at ICMP header */\n\t\n\t\tif (icmp6->icmp6_type == ICMP6_TIME_EXCEEDED &&\n\t\t\ticmp6->icmp6_code == ICMP6_TIME_EXCEED_TRANSIT) {\n\t\t\tif (icmp6len < 8 + sizeof(struct ip6_hdr) + 4)\n\t\t\t\tcontinue;\t\t\t/* not enough data to look at inner header */\n\n\t\t\thip6 = (struct ip6_hdr *) (recvbuf + 8);\n\t\t\thlen2 = sizeof(struct ip6_hdr);\n\t\t\tudp = (struct udphdr *) (recvbuf + 8 + hlen2);\n\t\t\tif (hip6->ip6_nxt == IPPROTO_UDP &&\n\t\t\t\tudp->uh_sport == htons(sport) &&\n\t\t\t\tudp->uh_dport == htons(dport + seq))\n\t\t\t\tret = -2;\t\t/* we hit an intermediate router */\n\t\t\t\tbreak;\n\n\t\t} else if (icmp6->icmp6_type == ICMP6_DST_UNREACH) {\n\t\t\tif (icmp6len < 8 + sizeof(struct ip6_hdr) + 4)\n\t\t\t\tcontinue;\t\t\t/* not enough data to look at inner header */\n\n\t\t\thip6 = (struct ip6_hdr *) (recvbuf + 8);\n\t\t\thlen2 = sizeof(struct ip6_hdr);\n\t\t\tudp = (struct udphdr *) (recvbuf + 8 + hlen2);\n\t\t\tif (hip6->ip6_nxt == IPPROTO_UDP &&\n\t\t\t\tudp->uh_sport == htons(sport) &&\n\t\t\t\tudp->uh_dport == htons(dport + seq)) {\n\t\t\t\tif (icmp6->icmp6_code == ICMP6_DST_UNREACH_NOPORT)\n\t\t\t\t\tret = -1;\t/* have reached destination */\n\t\t\t\telse\n\t\t\t\t\tret = icmp6->icmp6_code;\t/* 0, 1, 2, ... */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (verbose) {\n\t\t\tprintf(\" (from %s: type = %d, code = %d)\\n\",\n\t\t\t\t\tSock_ntop_host(pr->sarecv, pr->salen),\n\t\t\t\t\ticmp6->icmp6_type, icmp6->icmp6_code);\n\t\t}\n\t\t/* Some other ICMP error, recvfrom() again */\n\t}\n\talarm(0);\t\t\t\t\t/* don't leave alarm running */\n\tGettimeofday(tv, NULL);\t\t/* get time of packet arrival */\n\treturn(ret);\n#endif\n}\n"
  },
  {
    "path": "traceroute/recv_v6.lc",
    "content": "#include    \"trace.h\"##  1 ##src/traceroute/recv_v6.c##\n\n/*##  2 ##src/traceroute/recv_v6.c##\n * Return: -3 on timeout##  3 ##src/traceroute/recv_v6.c##\n *         -2 on ICMP time exceeded in transit (caller keeps going)##  4 ##src/traceroute/recv_v6.c##\n *         -1 on ICMP port unreachable (caller is done)##  5 ##src/traceroute/recv_v6.c##\n *       >= 0 return value is some other ICMP unreachable code##  6 ##src/traceroute/recv_v6.c##\n */##  7 ##src/traceroute/recv_v6.c##\n\nint##  8 ##src/traceroute/recv_v6.c##\nrecv_v6(int seq, struct timeval *tv)##  9 ##src/traceroute/recv_v6.c##\n{## 10 ##src/traceroute/recv_v6.c##\n#ifdef  IPV6## 11 ##src/traceroute/recv_v6.c##\n    int     hlen1, hlen2, icmp6len;## 12 ##src/traceroute/recv_v6.c##\n    ssize_t n;## 13 ##src/traceroute/recv_v6.c##\n    socklen_t len;## 14 ##src/traceroute/recv_v6.c##\n    struct ip6_hdr *ip6, *hip6;## 15 ##src/traceroute/recv_v6.c##\n    struct icmp6_hdr *icmp6;## 16 ##src/traceroute/recv_v6.c##\n    struct udphdr *udp;## 17 ##src/traceroute/recv_v6.c##\n\n    alarm(3);## 18 ##src/traceroute/recv_v6.c##\n    for (;;) {## 19 ##src/traceroute/recv_v6.c##\n        len = pr->salen;## 20 ##src/traceroute/recv_v6.c##\n        n = recvfrom(recvfd, recvbuf, sizeof(recvbuf), 0, pr->sarecv, &len);## 21 ##src/traceroute/recv_v6.c##\n        if (n < 0) {## 22 ##src/traceroute/recv_v6.c##\n            if (errno == EINTR)## 23 ##src/traceroute/recv_v6.c##\n                return (-3);    /* alarm expired */## 24 ##src/traceroute/recv_v6.c##\n            else## 25 ##src/traceroute/recv_v6.c##\n                err_sys(\"recvfrom error\");## 26 ##src/traceroute/recv_v6.c##\n        }## 27 ##src/traceroute/recv_v6.c##\n        Gettimeofday(tv, NULL); /* get time of packet arrival */## 28 ##src/traceroute/recv_v6.c##\n\n        ip6 = (struct ip6_hdr *) recvbuf;   /* start of IPv6 header */## 29 ##src/traceroute/recv_v6.c##\n        hlen1 = sizeof(struct ip6_hdr);## 30 ##src/traceroute/recv_v6.c##\n\n        icmp6 = (struct icmp6_hdr *) (recvbuf + hlen1); /* ICMP hdr */## 31 ##src/traceroute/recv_v6.c##\n        if ((icmp6len = n - hlen1) < 8)## 32 ##src/traceroute/recv_v6.c##\n            err_quit(\"icmp6len (%d) < 8\", icmp6len);## 33 ##src/traceroute/recv_v6.c##\n\n        if (icmp6->icmp6_type == ICMP6_TIME_EXCEEDED &&## 34 ##src/traceroute/recv_v6.c##\n            icmp6->icmp6_code == ICMP6_TIME_EXCEED_TRANSIT) {## 35 ##src/traceroute/recv_v6.c##\n            if (icmp6len < 8 + 40 + 8)## 36 ##src/traceroute/recv_v6.c##\n                err_quit(\"icmp6len (%d) < 8 + 40 + 8\", icmp6len);## 37 ##src/traceroute/recv_v6.c##\n\n            hip6 = (struct ip6_hdr *) (recvbuf + hlen1 + 8);## 38 ##src/traceroute/recv_v6.c##\n            hlen2 = sizeof(struct ip6_hdr);## 39 ##src/traceroute/recv_v6.c##\n            udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);## 40 ##src/traceroute/recv_v6.c##\n            if (hip6->ip6_nxt == IPPROTO_UDP &&## 41 ##src/traceroute/recv_v6.c##\n                udp->uh_sport == htons(sport) &&## 42 ##src/traceroute/recv_v6.c##\n                udp->uh_dport == htons(dport + seq))## 43 ##src/traceroute/recv_v6.c##\n                return (-2);    /* we hit an intermediate router */## 44 ##src/traceroute/recv_v6.c##\n\n        } else if (icmp6->icmp6_type == ICMP6_DST_UNREACH) {## 45 ##src/traceroute/recv_v6.c##\n            if (icmp6len < 8 + 40 + 8)## 46 ##src/traceroute/recv_v6.c##\n                err_quit(\"icmp6len (%d) < 8 + 40 + 8\", icmp6len);## 47 ##src/traceroute/recv_v6.c##\n\n            hip6 = (struct ip6_hdr *) (recvbuf + hlen1 + 8);## 48 ##src/traceroute/recv_v6.c##\n            hlen2 = 40;## 49 ##src/traceroute/recv_v6.c##\n            udp = (struct udphdr *) (recvbuf + hlen1 + 8 + hlen2);## 50 ##src/traceroute/recv_v6.c##\n            if (hip6->ip6_nxt == IPPROTO_UDP &&## 51 ##src/traceroute/recv_v6.c##\n                udp->uh_sport == htons(sport) &&## 52 ##src/traceroute/recv_v6.c##\n                udp->uh_dport == htons(dport + seq)) {## 53 ##src/traceroute/recv_v6.c##\n                if (icmp6->icmp6_code == ICMP6_DST_UNREACH_NOPORT)## 54 ##src/traceroute/recv_v6.c##\n                    return (-1);    /* have reached destination */## 55 ##src/traceroute/recv_v6.c##\n                else## 56 ##src/traceroute/recv_v6.c##\n                    return (icmp6->icmp6_code); /* 0, 1, 2, ... */## 57 ##src/traceroute/recv_v6.c##\n            }## 58 ##src/traceroute/recv_v6.c##\n        } else if (verbose) {## 59 ##src/traceroute/recv_v6.c##\n            printf(\" (from %s: type = %d, code = %d)\\n\",## 60 ##src/traceroute/recv_v6.c##\n                   Sock_ntop_host(pr->sarecv, pr->salen),## 61 ##src/traceroute/recv_v6.c##\n                   icmp6->icmp6_type, icmp6->icmp6_code);## 62 ##src/traceroute/recv_v6.c##\n        }## 63 ##src/traceroute/recv_v6.c##\n        /* Some other ICMP error, recvfrom() again */## 64 ##src/traceroute/recv_v6.c##\n    }## 65 ##src/traceroute/recv_v6.c##\n#endif## 66 ##src/traceroute/recv_v6.c##\n}## 67 ##src/traceroute/recv_v6.c##\n"
  },
  {
    "path": "traceroute/sig_alrm.c",
    "content": "#include\t\"trace.h\"\n\nint gotalarm;\n\nvoid\nsig_alrm(int signo)\n{\n\tgotalarm = 1;\t/* set flag to note that alarm occurred */\n\treturn;\t\t\t/* and interrupt the recvfrom() */\n}\n"
  },
  {
    "path": "traceroute/trace.h",
    "content": "#include\t\"unp.h\"\n#include\t<netinet/in_systm.h>\n#include\t<netinet/ip.h>\n#include\t<netinet/ip_icmp.h>\n#include\t<netinet/udp.h>\n\n#define\tBUFSIZE\t\t1500\n\nstruct rec {\t\t\t\t\t/* format of outgoing UDP data */\n  u_short\trec_seq;\t\t\t/* sequence number */\n  u_short\trec_ttl;\t\t\t/* TTL packet left with */\n  struct timeval\trec_tv;\t\t/* time packet left */\n};\n\n\t\t\t/* globals */\nchar\t recvbuf[BUFSIZE];\nchar\t sendbuf[BUFSIZE];\n\nint\t\t datalen;\t\t\t/* # bytes of data following ICMP header */\nchar\t*host;\nu_short\t sport, dport;\nint\t\t nsent;\t\t\t\t/* add 1 for each sendto() */\npid_t\t pid;\t\t\t\t/* our PID */\nint\t\t probe, nprobes;\nint\t\t sendfd, recvfd;\t/* send on UDP sock, read on raw ICMP sock */\nint\t\t ttl, max_ttl;\nint\t\t verbose;\n\n\t\t\t/* function prototypes */\nconst char\t*icmpcode_v4(int);\nconst char\t*icmpcode_v6(int);\nint\t\t recv_v4(int, struct timeval *);\nint\t\t recv_v6(int, struct timeval *);\nvoid\t sig_alrm(int);\nvoid\t traceloop(void);\nvoid\t tv_sub(struct timeval *, struct timeval *);\n\nstruct proto {\n  const char\t*(*icmpcode)(int);\n  int\t (*recv)(int, struct timeval *);\n  struct sockaddr  *sasend;\t/* sockaddr{} for send, from getaddrinfo */\n  struct sockaddr  *sarecv;\t/* sockaddr{} for receiving */\n  struct sockaddr  *salast;\t/* last sockaddr{} for receiving */\n  struct sockaddr  *sabind;\t/* sockaddr{} for binding source port */\n  socklen_t   \t\tsalen;\t/* length of sockaddr{}s */\n  int\t\t\ticmpproto;\t/* IPPROTO_xxx value for ICMP */\n  int\t   ttllevel;\t\t/* setsockopt() level to set TTL */\n  int\t   ttloptname;\t\t/* setsockopt() name to set TTL */\n} *pr;\n\n#ifdef\tIPV6\n\n#include\t<netinet/ip6.h>\n#include\t<netinet/icmp6.h>\n\n#endif\n"
  },
  {
    "path": "traceroute/trace.lh",
    "content": "#include    \"unp.h\"##  1 ##src/traceroute/trace.h##\n#include    <netinet/in_systm.h>##  2 ##src/traceroute/trace.h##\n#include    <netinet/ip.h>##  3 ##src/traceroute/trace.h##\n#include    <netinet/ip_icmp.h>##  4 ##src/traceroute/trace.h##\n#include    <netinet/udp.h>##  5 ##src/traceroute/trace.h##\n\n#define BUFSIZE     1500##  6 ##src/traceroute/trace.h##\n\nstruct rec {                    /* of outgoing UDP data */##  7 ##src/traceroute/trace.h##\n    u_short rec_seq;            /* sequence number */##  8 ##src/traceroute/trace.h##\n    u_short rec_ttl;            /* TTL packet left with */##  9 ##src/traceroute/trace.h##\n    struct timeval rec_tv;      /* time packet left */## 10 ##src/traceroute/trace.h##\n};## 11 ##src/traceroute/trace.h##\n\n            /* globals */## 12 ##src/traceroute/trace.h##\nchar    recvbuf[BUFSIZE];## 13 ##src/traceroute/trace.h##\nchar    sendbuf[BUFSIZE];## 14 ##src/traceroute/trace.h##\n\nint     datalen;                /* #bytes of data, following ICMP header */## 15 ##src/traceroute/trace.h##\nchar   *host;## 16 ##src/traceroute/trace.h##\nu_short sport, dport;## 17 ##src/traceroute/trace.h##\nint     nsent;                  /* add 1 for each sendto() */## 18 ##src/traceroute/trace.h##\npid_t   pid;                    /* our PID */## 19 ##src/traceroute/trace.h##\nint     probe, nprobes;## 20 ##src/traceroute/trace.h##\nint     sendfd, recvfd;         /* send on UDP sock, read on raw ICMP sock */## 21 ##src/traceroute/trace.h##\nint     ttl, max_ttl;## 22 ##src/traceroute/trace.h##\nint     verbose;## 23 ##src/traceroute/trace.h##\n\n            /* function prototypes */## 24 ##src/traceroute/trace.h##\nconst char *icmpcode_v4(int);## 25 ##src/traceroute/trace.h##\nconst char *icmpcode_v6(int);## 26 ##src/traceroute/trace.h##\nint     recv_v4(int, struct timeval *);## 27 ##src/traceroute/trace.h##\nint     recv_v6(int, struct timeval *);## 28 ##src/traceroute/trace.h##\nvoid    sig_alrm(int);## 29 ##src/traceroute/trace.h##\nvoid    traceloop(void);## 30 ##src/traceroute/trace.h##\nvoid    tv_sub(struct timeval *, struct timeval *);## 31 ##src/traceroute/trace.h##\n\nstruct proto {## 32 ##src/traceroute/trace.h##\n    const char *(*icmpcode) (int);## 33 ##src/traceroute/trace.h##\n    int     (*recv) (int, struct timeval *);## 34 ##src/traceroute/trace.h##\n    struct sockaddr *sasend;    /* sockaddr{} for send, from getaddrinfo */## 35 ##src/traceroute/trace.h##\n    struct sockaddr *sarecv;    /* sockaddr{} for receiving */## 36 ##src/traceroute/trace.h##\n    struct sockaddr *salast;    /* last sockaddr{} for receiving */## 37 ##src/traceroute/trace.h##\n    struct sockaddr *sabind;    /* sockaddr{} for binding source port */## 38 ##src/traceroute/trace.h##\n    socklen_t salen;            /* length of sockaddr{}s */## 39 ##src/traceroute/trace.h##\n    int     icmpproto;          /* IPPROTO_xxx value for ICMP */## 40 ##src/traceroute/trace.h##\n    int     ttllevel;           /* setsockopt() level to set TTL */## 41 ##src/traceroute/trace.h##\n    int     ttloptname;         /* setsockopt() name to set TTL */## 42 ##src/traceroute/trace.h##\n}      *pr;## 43 ##src/traceroute/trace.h##\n\n#ifdef  IPV6## 44 ##src/traceroute/trace.h##\n\n#include    <netinet/ip6.h>## 45 ##src/traceroute/trace.h##\n#include    <netinet/icmp6.h>## 46 ##src/traceroute/trace.h##\n\n#endif## 47 ##src/traceroute/trace.h##\n"
  },
  {
    "path": "traceroute/traceloop.c",
    "content": "#include\t\"trace.h\"\n\nvoid\ntraceloop(void)\n{\n\tint\t\t\t\t\tseq, code, done;\n\tdouble\t\t\t\trtt;\n\tstruct rec\t\t\t*rec;\n\tstruct timeval\t\ttvrecv;\n\n\trecvfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);\n\tsetuid(getuid());\t\t/* don't need special permissions anymore */\n\n#ifdef\tIPV6\n\tif (pr->sasend->sa_family == AF_INET6 && verbose == 0) {\n\t\tstruct icmp6_filter myfilt;\n\t\tICMP6_FILTER_SETBLOCKALL(&myfilt);\n\t\tICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &myfilt);\n\t\tICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &myfilt);\n\t\tsetsockopt(recvfd, IPPROTO_IPV6, ICMP6_FILTER,\n\t\t\t\t\t&myfilt, sizeof(myfilt));\n\t}\n#endif\n\n\tsendfd = Socket(pr->sasend->sa_family, SOCK_DGRAM, 0);\n\n\tpr->sabind->sa_family = pr->sasend->sa_family;\n\tsport = (getpid() & 0xffff) | 0x8000;\t/* our source UDP port # */\n\tsock_set_port(pr->sabind, pr->salen, htons(sport));\n\tBind(sendfd, pr->sabind, pr->salen);\n\n\tsig_alrm(SIGALRM);\n\n\tseq = 0;\n\tdone = 0;\n\tfor (ttl = 1; ttl <= max_ttl && done == 0; ttl++) {\n\t\tSetsockopt(sendfd, pr->ttllevel, pr->ttloptname, &ttl, sizeof(int));\n\t\tbzero(pr->salast, pr->salen);\n\n\t\tprintf(\"%2d \", ttl);\n\t\tfflush(stdout);\n\n\t\tfor (probe = 0; probe < nprobes; probe++) {\n\t\t\trec = (struct rec *) sendbuf;\n\t\t\trec->rec_seq = ++seq;\n\t\t\trec->rec_ttl = ttl;\n\t\t\tGettimeofday(&rec->rec_tv, NULL);\n\n\t\t\tsock_set_port(pr->sasend, pr->salen, htons(dport + seq));\n\t\t\tSendto(sendfd, sendbuf, datalen, 0, pr->sasend, pr->salen);\n\n\t\t\tif ( (code = (*pr->recv)(seq, &tvrecv)) == -3)\n\t\t\t\tprintf(\" *\");\t\t/* timeout, no reply */\n\t\t\telse {\n\t\t\t\tchar\tstr[NI_MAXHOST];\n\n\t\t\t\tif (sock_cmp_addr(pr->sarecv, pr->salast, pr->salen) != 0) {\n\t\t\t\t\tif (getnameinfo(pr->sarecv, pr->salen, str, sizeof(str),\n\t\t\t\t\t\t\t\t\tNULL, 0, 0) == 0)\n\t\t\t\t\t\tprintf(\" %s (%s)\", str,\n\t\t\t\t\t\t\t\tSock_ntop_host(pr->sarecv, pr->salen));\n\t\t\t\t\telse\n\t\t\t\t\t\tprintf(\" %s\",\n\t\t\t\t\t\t\t\tSock_ntop_host(pr->sarecv, pr->salen));\n\t\t\t\t\tmemcpy(pr->salast, pr->sarecv, pr->salen);\n\t\t\t\t}\n\t\t\t\ttv_sub(&tvrecv, &rec->rec_tv);\n\t\t\t\trtt = tvrecv.tv_sec * 1000.0 + tvrecv.tv_usec / 1000.0;\n\t\t\t\tprintf(\"  %.3f ms\", rtt);\n\n\t\t\t\tif (code == -1)\t\t/* port unreachable; at destination */\n\t\t\t\t\tdone++;\n\t\t\t\telse if (code >= 0)\n\t\t\t\t\tprintf(\" (ICMP %s)\", (*pr->icmpcode)(code));\n\t\t\t}\n\t\t\tfflush(stdout);\n\t\t}\n\t\tprintf(\"\\n\");\n\t}\n}\n"
  },
  {
    "path": "traceroute/traceloop.lc",
    "content": "#include    \"trace.h\"##  1 ##src/traceroute/traceloop.c##\n\nvoid##  2 ##src/traceroute/traceloop.c##\ntraceloop(void)##  3 ##src/traceroute/traceloop.c##\n{##  4 ##src/traceroute/traceloop.c##\n    int     seq, code, done;##  5 ##src/traceroute/traceloop.c##\n    double  rtt;##  6 ##src/traceroute/traceloop.c##\n    struct rec *rec;##  7 ##src/traceroute/traceloop.c##\n    struct timeval tvrecv;##  8 ##src/traceroute/traceloop.c##\n\n    recvfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);##  9 ##src/traceroute/traceloop.c##\n    setuid(getuid());           /* don't need special permissions any more */## 10 ##src/traceroute/traceloop.c##\n\n#ifdef  IPV6## 11 ##src/traceroute/traceloop.c##\n    if (pr->sasend->sa_family == AF_INET && verbose == 0) {## 12 ##src/traceroute/traceloop.c##\n        struct icmp6_filter myfilt;## 13 ##src/traceroute/traceloop.c##\n        ICMP6_FILTER_SETBLOCKALL(&myfilt);## 14 ##src/traceroute/traceloop.c##\n        ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &myfilt);## 15 ##src/traceroute/traceloop.c##\n        ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &myfilt);## 16 ##src/traceroute/traceloop.c##\n        setsockopt(recvfd, IPPROTO_IPV6, ICMP6_FILTER,## 17 ##src/traceroute/traceloop.c##\n                   &myfilt, sizeof(myfilt));## 18 ##src/traceroute/traceloop.c##\n    }## 19 ##src/traceroute/traceloop.c##\n#endif## 20 ##src/traceroute/traceloop.c##\n\n    sendfd = Socket(pr->sasend->sa_family, SOCK_DGRAM, 0);## 21 ##src/traceroute/traceloop.c##\n\n    pr->sabind->sa_family = pr->sasend->sa_family;## 22 ##src/traceroute/traceloop.c##\n    sport = (getpid() & 0xffff) | 0x8000;   /* our source UDP port# */## 23 ##src/traceroute/traceloop.c##\n    sock_set_port(pr->sabind, pr->salen, htons(sport));## 24 ##src/traceroute/traceloop.c##\n    Bind(sendfd, pr->sabind, pr->salen);## 25 ##src/traceroute/traceloop.c##\n\n    sig_alrm(SIGALRM);## 26 ##src/traceroute/traceloop.c##\n\n    seq = 0;## 27 ##src/traceroute/traceloop.c##\n    done = 0;## 28 ##src/traceroute/traceloop.c##\n    for (ttl = 1; ttl <= max_ttl && done == 0; ttl++) {## 29 ##src/traceroute/traceloop.c##\n        Setsockopt(sendfd, pr->ttllevel, pr->ttloptname, &ttl, sizeof(int));## 30 ##src/traceroute/traceloop.c##\n        bzero(pr->salast, pr->salen);## 31 ##src/traceroute/traceloop.c##\n\n        printf(\"%2d  \", ttl);## 32 ##src/traceroute/traceloop.c##\n        fflush(stdout);## 33 ##src/traceroute/traceloop.c##\n\n        for (probe = 0; probe < nprobes; probe++) {## 34 ##src/traceroute/traceloop.c##\n            rec = (struct rec *) sendbuf;## 35 ##src/traceroute/traceloop.c##\n            rec->rec_seq = ++seq;## 36 ##src/traceroute/traceloop.c##\n            rec->rec_ttl = ttl;## 37 ##src/traceroute/traceloop.c##\n            Gettimeofday(&rec->rec_tv, NULL);## 38 ##src/traceroute/traceloop.c##\n\n            sock_set_port(pr->sasend, pr->salen, htons(dport + seq));## 39 ##src/traceroute/traceloop.c##\n            Sendto(sendfd, sendbuf, datalen, 0, pr->sasend, pr->salen);## 40 ##src/traceroute/traceloop.c##\n\n            if ((code = (*pr->recv) (seq, &tvrecv)) == -3)## 41 ##src/traceroute/traceloop.c##\n                printf(\" *\");   /* timeout, no reply */## 42 ##src/traceroute/traceloop.c##\n            else {## 43 ##src/traceroute/traceloop.c##\n                char    str[NI_MAXHOST];## 44 ##src/traceroute/traceloop.c##\n\n                if (sock_cmp_addr(pr->sarecv, pr->salast, pr->salen) != 0) {## 45 ##src/traceroute/traceloop.c##\n                    if (getnameinfo(pr->sarecv, pr->salen, str, sizeof(str),## 46 ##src/traceroute/traceloop.c##\n                                    NULL, 0, 0) == 0)## 47 ##src/traceroute/traceloop.c##\n                        printf(\" %s (%s)\", str,## 48 ##src/traceroute/traceloop.c##\n                               Sock_ntop_host(pr->sarecv, pr->salen));## 49 ##src/traceroute/traceloop.c##\n                    else## 50 ##src/traceroute/traceloop.c##\n                        printf(\" %s\", Sock_ntop_host(pr->sarecv, pr->salen));## 51 ##src/traceroute/traceloop.c##\n                    memcpy(pr->salast, pr->sarecv, pr->salen);## 52 ##src/traceroute/traceloop.c##\n                }## 53 ##src/traceroute/traceloop.c##\n                tv_sub(&tvrecv, &rec->rec_tv);## 54 ##src/traceroute/traceloop.c##\n                rtt = tvrecv.tv_sec * 1000.0 + tvrecv.tv_usec / 1000.0;## 55 ##src/traceroute/traceloop.c##\n                printf(\"  %.3f ms\", rtt);## 56 ##src/traceroute/traceloop.c##\n\n                if (code == -1) /* port unreachable; at destination */## 57 ##src/traceroute/traceloop.c##\n                    done++;## 58 ##src/traceroute/traceloop.c##\n                else if (code >= 0)## 59 ##src/traceroute/traceloop.c##\n                    printf(\" (ICMP %s)\", (*pr->icmpcode) (code));## 60 ##src/traceroute/traceloop.c##\n            }## 61 ##src/traceroute/traceloop.c##\n            fflush(stdout);## 62 ##src/traceroute/traceloop.c##\n        }## 63 ##src/traceroute/traceloop.c##\n        printf(\"\\n\");## 64 ##src/traceroute/traceloop.c##\n    }## 65 ##src/traceroute/traceloop.c##\n}## 66 ##src/traceroute/traceloop.c##\n"
  },
  {
    "path": "traceroute/tv_sub.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ntv_sub(struct timeval *out, struct timeval *in)\n{\n\tif ( (out->tv_usec -= in->tv_usec) < 0) {\t/* out -= in */\n\t\t--out->tv_sec;\n\t\tout->tv_usec += 1000000;\n\t}\n\tout->tv_sec -= in->tv_sec;\n}\n"
  },
  {
    "path": "udpcksum/Makefile",
    "content": "include ../Make.defines\n\nOBJS = main.o cleanup.o pcap.o udpcksum.o senddnsquery-raw.o udpread.o udpwrite.o\nOBJSNET = main.o cleanup.o pcap.o udpcksum.o senddnsquery-libnet.o udpread.o\nPROGS =\tudpcksum udpcksum-libnet\n\nall:\t${PROGS}\n\nudpcksum:\t${OBJS}\n\t\t${CC} ${CFLAGS} -o $@ ${OBJS} -L/usr/local/lib -lpcap ${LIBS}\n\n# Include special linking flags from libnet-config program\nudpcksum-libnet:\t${OBJSNET}\n\t\t${CC} ${CFLAGS} -o $@ ${OBJSNET} -L/usr/local/lib -lpcap ${LIBS} `libnet-config --libs`\n\n# Include special compilation flags from libnet-config program\nsenddnsquery-libnet.o:\tsenddnsquery-libnet.c\n\t\t${CC} ${CFLAGS} `libnet-config --defines --cflags` -c -o $@ $<\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "udpcksum/cleanup.c",
    "content": "#include\t\"udpcksum.h\"\n\n/* include cleanup */\nvoid\ncleanup(int signo)\n{\n\tstruct pcap_stat\tstat;\n\n\tputc('\\n', stdout);\n\n\tif (verbose) {\n\t\tif (pcap_stats(pd, &stat) < 0)\n\t\t\terr_quit(\"pcap_stats: %s\\n\", pcap_geterr(pd));\n\t\tprintf(\"%d packets received by filter\\n\", stat.ps_recv);\n\t\tprintf(\"%d packets dropped by kernel\\n\", stat.ps_drop);\n\t}\n\n\texit(0);\n}\n/* end cleanup */\n"
  },
  {
    "path": "udpcksum/cleanup.lc",
    "content": "#include    \"udpcksum.h\"##  1 ##src/udpcksum/cleanup.c##\n\n/* include cleanup */\nvoid##  2 ##src/udpcksum/cleanup.c##\ncleanup(int signo)##  3 ##src/udpcksum/cleanup.c##\n{##  4 ##src/udpcksum/cleanup.c##\n    struct pcap_stat stat;##  5 ##src/udpcksum/cleanup.c##\n\n    fflush(stdout);##  6 ##src/udpcksum/cleanup.c##\n    putc('\\n', stdout);##  7 ##src/udpcksum/cleanup.c##\n\n    if (verbose) {##  8 ##src/udpcksum/cleanup.c##\n        if (pcap_stats(pd, &stat) < 0)##  9 ##src/udpcksum/cleanup.c##\n            err_quit(\"pcap_stats: %s\\n\", pcap_geterr(pd));## 10 ##src/udpcksum/cleanup.c##\n        printf(\"%d packets received by filter\\n\", stat.ps_recv);## 11 ##src/udpcksum/cleanup.c##\n        printf(\"%d packets dropped by kernel\\n\", stat.ps_drop);## 12 ##src/udpcksum/cleanup.c##\n    }## 13 ##src/udpcksum/cleanup.c##\n\n    exit(0);## 14 ##src/udpcksum/cleanup.c##\n}## 15 ##src/udpcksum/cleanup.c##\n/* end cleanup */\n"
  },
  {
    "path": "udpcksum/main.c",
    "content": "/* include main1 */\n#include\t\"udpcksum.h\"\n\n\t\t\t/* DefinE global variables */\nstruct sockaddr\t*dest, *local;\nstruct sockaddr_in locallookup;\nsocklen_t\t\tdestlen, locallen;\n\nint\t\tdatalink;\t\t/* from pcap_datalink(), in <net/bpf.h> */\nchar   *device;\t\t\t/* pcap device */\npcap_t *pd;\t\t\t\t/* packet capture struct pointer */\nint\t\trawfd;\t\t\t/* raw socket to write on */\nint\t\tsnaplen = 200;\t/* amount of data to capture */\nint\t\tverbose;\nint\t\tzerosum;\t\t/* send UDP query with no checksum */\n\nstatic void\tusage(const char *);\n\nint\nmain(int argc, char *argv[])\n{\n\tint\t\t\t\tc, lopt=0;\n\tchar\t\t\t*ptr, localname[1024], *localport;\n\tstruct addrinfo\t*aip;\n/* end main1 */\n\n/* include main2 */\n\topterr = 0;\t\t/* don't want getopt() writing to stderr */\n\twhile ( (c = getopt(argc, argv, \"0i:l:v\")) != -1) {\n\t\tswitch (c) {\n\n\t\tcase '0':\n\t\t\tzerosum = 1;\n\t\t\tbreak;\n\n\t\tcase 'i':\n\t\t\tdevice = optarg;\t\t\t/* pcap device */\n\t\t\tbreak;\n\n\t\tcase 'l':\t\t\t/* local IP address and port #: a.b.c.d.p */\n\t\t\tif ( (ptr = strrchr(optarg, '.')) == NULL)\n\t\t\t\tusage(\"invalid -l option\");\n\n\t\t\t*ptr++ = 0;\t\t\t\t\t/* null replaces final period */\n\t\t\tlocalport = ptr;\t\t\t/* service name or port number */\n\t\t\tstrncpy(localname, optarg, sizeof(localname));\n\t\t\tlopt = 1;\n\t\t\tbreak;\n\n\t\tcase 'v':\n\t\t\tverbose = 1;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\t\tusage(\"unrecognized option\");\n\t\t}\n\t}\n/* end main2 */\n/* include main3 */\n\tif (optind != argc-2)\n\t\tusage(\"missing <host> and/or <serv>\");\n\n\t\t/* 4convert destination name and service */\n\taip = Host_serv(argv[optind], argv[optind+1], AF_INET, SOCK_DGRAM);\n\tdest = aip->ai_addr;\t\t/* don't freeaddrinfo() */\n\tdestlen = aip->ai_addrlen;\n\n\t/*\n\t * Need local IP address for source IP address for UDP datagrams.\n\t * Can't specify 0 and let IP choose, as we need to know it for\n\t * the pseudoheader to calculate the UDP checksum.\n\t * If -l option supplied, then use those values; otherwise,\n\t * connect a UDP socket to the destination to determine the right\n\t * source address.\n\t */\n\tif (lopt) {\n\t\t    /* 4convert local name and service */\n\t    aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);\n\t    local = aip->ai_addr;\t\t/* don't freeaddrinfo() */\n\t    locallen = aip->ai_addrlen;\n\t} else {\n\t\tint s;\n\t\ts = Socket(AF_INET, SOCK_DGRAM, 0);\n\t\tConnect(s, dest, destlen);\n\t\t/* kernel chooses correct local address for dest */\n\t\tlocallen = sizeof(locallookup);\n\t    local = (struct sockaddr *)&locallookup;\n\t\tGetsockname(s, local, &locallen);\n\t\tif (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))\n\t\t\terr_quit(\"Can't determine local address - use -l\\n\");\n\t\tclose(s);\n\t}\n\n\topen_output();\t\t/* open output, either raw socket or libnet */\n\n\topen_pcap();\t\t/* open packet capture device */\n\n\tsetuid(getuid());\t/* don't need superuser privileges anymore */\n\n\tSignal(SIGTERM, cleanup);\n\tSignal(SIGINT, cleanup);\n\tSignal(SIGHUP, cleanup);\n\n\ttest_udp();\n\n\tcleanup(0);\n}\n/* end main3 */\n\nstatic void\nusage(const char *msg)\n{\n\terr_msg(\n\"usage: udpcksum [ options ] <host> <serv>\\n\"\n\"options: -0    send UDP datagram with checksum set to 0\\n\"\n\"         -i s  packet capture device\\n\"\n\"         -l a.b.c.d.p  local IP=a.b.c.d, local port=p\\n\"\n\"         -v    verbose output\"\n);\n\n\tif (msg[0] != 0)\n\t\terr_quit(\"%s\", msg);\n\texit(1);\n}\n"
  },
  {
    "path": "udpcksum/main.lc",
    "content": "/* include main1 */\n#include    \"udpcksum.h\"##  1 ##src/udpcksum/main.c##\n\n            /* define global variables */##  2 ##src/udpcksum/main.c##\nstruct sockaddr *dest, *local;##  3 ##src/udpcksum/main.c##\nstruct sockaddr_in locallookup;##  4 ##src/udpcksum/main.c##\nsocklen_t destlen, locallen;##  5 ##src/udpcksum/main.c##\n\nint     datalink;               /* from pcap_datalink(), in <net/bpf.h> */##  6 ##src/udpcksum/main.c##\nchar   *device;                 /* pcap device */##  7 ##src/udpcksum/main.c##\npcap_t *pd;                     /* packet capture struct pointer */##  8 ##src/udpcksum/main.c##\nint     rawfd;                  /* raw socket to write on */##  9 ##src/udpcksum/main.c##\nint     snaplen = 200;          /* amount of data to capture */## 10 ##src/udpcksum/main.c##\nint     verbose;## 11 ##src/udpcksum/main.c##\nint     zerosum;                /* send UDP query with no checksum */## 12 ##src/udpcksum/main.c##\n\nstatic void usage(const char *);## 13 ##src/udpcksum/main.c##\n\nint## 14 ##src/udpcksum/main.c##\nmain(int argc, char *argv[])## 15 ##src/udpcksum/main.c##\n{## 16 ##src/udpcksum/main.c##\n    int     c, lopt = 0;## 17 ##src/udpcksum/main.c##\n    char   *ptr, localname[1024], *localport;## 18 ##src/udpcksum/main.c##\n    struct addrinfo *aip;## 19 ##src/udpcksum/main.c##\n\n    if (argc < 2)## 20 ##src/udpcksum/main.c##\n        usage(\"\");## 21 ##src/udpcksum/main.c##\n/* end main1 */\n\n/* include main2 */\n    opterr = 0;                 /* don't want getopt() writing to stderr */## 22 ##src/udpcksum/main.c##\n    while ((c = getopt(argc, argv, \"0i:l:v\")) != -1) {## 23 ##src/udpcksum/main.c##\n        switch (c) {## 24 ##src/udpcksum/main.c##\n\n        case '0':## 25 ##src/udpcksum/main.c##\n            zerosum = 1;## 26 ##src/udpcksum/main.c##\n            break;## 27 ##src/udpcksum/main.c##\n\n        case 'i':## 28 ##src/udpcksum/main.c##\n            device = optarg;    /* pcap device */## 29 ##src/udpcksum/main.c##\n            break;## 30 ##src/udpcksum/main.c##\n\n        case 'l':               /* local IP address and port#: a.b.c.d.p */## 31 ##src/udpcksum/main.c##\n            if ((ptr = strrchr(optarg, '.')) == NULL)## 32 ##src/udpcksum/main.c##\n                usage(\"invalid -l option\");## 33 ##src/udpcksum/main.c##\n\n            *ptr++ = 0;         /* null replaces final period */## 34 ##src/udpcksum/main.c##\n            localport = ptr;    /* service name or port number */## 35 ##src/udpcksum/main.c##\n            strncpy(localname, optarg, sizeof(localname));## 36 ##src/udpcksum/main.c##\n            lopt = 1;## 37 ##src/udpcksum/main.c##\n            break;## 38 ##src/udpcksum/main.c##\n\n        case 'v':## 39 ##src/udpcksum/main.c##\n            verbose = 1;## 40 ##src/udpcksum/main.c##\n            break;## 41 ##src/udpcksum/main.c##\n\n        case '?':## 42 ##src/udpcksum/main.c##\n            usage(\"unrecognized option\");## 43 ##src/udpcksum/main.c##\n        }## 44 ##src/udpcksum/main.c##\n    }## 45 ##src/udpcksum/main.c##\n/* end main2 */\n/* include main3 */\n    if (optind != argc - 2)## 46 ##src/udpcksum/main.c##\n        usage(\"missing <host> and/or <serv>\");## 47 ##src/udpcksum/main.c##\n\n    /* 4convert destination name and service */## 48 ##src/udpcksum/main.c##\n    aip = Host_serv(argv[optind], argv[optind + 1], AF_INET, SOCK_DGRAM);## 49 ##src/udpcksum/main.c##\n    dest = aip->ai_addr;        /* don't freeaddrinfo() */## 50 ##src/udpcksum/main.c##\n    destlen = aip->ai_addrlen;## 51 ##src/udpcksum/main.c##\n\n    /* ## 52 ##src/udpcksum/main.c##\n     * Need local IP address for source IP address for UDP datagrams.## 53 ##src/udpcksum/main.c##\n     * Can't specify 0 and let IP choose, as we need to know it for## 54 ##src/udpcksum/main.c##\n     * the pseudo-header to calculate the UDP checksum.## 55 ##src/udpcksum/main.c##\n     * If -l option supplied, then use those values; otherwise,## 56 ##src/udpcksum/main.c##\n     * connect a UDP socket to the destination to determine the right## 57 ##src/udpcksum/main.c##\n     * source address.## 58 ##src/udpcksum/main.c##\n     */## 59 ##src/udpcksum/main.c##\n    if (lopt) {## 60 ##src/udpcksum/main.c##\n        /* 4convert local name and service */## 61 ##src/udpcksum/main.c##\n        aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);## 62 ##src/udpcksum/main.c##\n        local = aip->ai_addr;   /* don't freeaddrinfo() */## 63 ##src/udpcksum/main.c##\n        locallen = aip->ai_addrlen;## 64 ##src/udpcksum/main.c##\n    } else {## 65 ##src/udpcksum/main.c##\n        int     s;## 66 ##src/udpcksum/main.c##\n        s = Socket(AF_INET, SOCK_DGRAM, 0);## 67 ##src/udpcksum/main.c##\n        Connect(s, dest, destlen);## 68 ##src/udpcksum/main.c##\n        /* the kernel chooses the correct local address for dest */## 69 ##src/udpcksum/main.c##\n        locallen = sizeof(locallookup);## 70 ##src/udpcksum/main.c##\n        local = (struct sockaddr *) &locallookup;## 71 ##src/udpcksum/main.c##\n        Getsockname(s, local, &locallen);## 72 ##src/udpcksum/main.c##\n        if (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))## 73 ##src/udpcksum/main.c##\n            err_quit(\"Can't determine local address - use -l\\n\");## 74 ##src/udpcksum/main.c##\n        close(s);## 75 ##src/udpcksum/main.c##\n    }## 76 ##src/udpcksum/main.c##\n\n    open_output();              /* open output, either raw socket or libnet */## 77 ##src/udpcksum/main.c##\n\n    open_pcap();                /* open packet capture device */## 78 ##src/udpcksum/main.c##\n\n    setuid(getuid());           /* don't need superuser privileges any more */## 79 ##src/udpcksum/main.c##\n\n    Signal(SIGTERM, cleanup);## 80 ##src/udpcksum/main.c##\n    Signal(SIGINT, cleanup);## 81 ##src/udpcksum/main.c##\n    Signal(SIGHUP, cleanup);## 82 ##src/udpcksum/main.c##\n\n    test_udp();## 83 ##src/udpcksum/main.c##\n\n    cleanup(0);## 84 ##src/udpcksum/main.c##\n}## 85 ##src/udpcksum/main.c##\n/* end main3 */\n\nstatic void## 86 ##src/udpcksum/main.c##\nusage(const char *msg)## 87 ##src/udpcksum/main.c##\n{## 88 ##src/udpcksum/main.c##\n    err_msg(\"usage: udpcksum [ options ] <host> <serv>\\n\"## 89 ##src/udpcksum/main.c##\n            \"options: -0    send UDP datagram with checksum set to 0\\n\"## 90 ##src/udpcksum/main.c##\n            \"         -i s  packet capture device\\n\"## 91 ##src/udpcksum/main.c##\n            \"         -l a.b.c.d.p  local IP=a.b.c.d, local port=p\\n\"## 92 ##src/udpcksum/main.c##\n            \"         -v    verbose output\");## 93 ##src/udpcksum/main.c##\n\n    if (msg[0] != 0)## 94 ##src/udpcksum/main.c##\n        err_quit(\"%s\", msg);## 95 ##src/udpcksum/main.c##\n    exit(1);## 96 ##src/udpcksum/main.c##\n}## 97 ##src/udpcksum/main.c##\n"
  },
  {
    "path": "udpcksum/pcap.c",
    "content": "/* include open_pcap */\n#include\t\"udpcksum.h\"\n\n#define\tCMD\t\t\"udp and src host %s and src port %d\"\n\nvoid\nopen_pcap(void)\n{\n\tuint32_t\t\t\tlocalnet, netmask;\n\tchar\t\t\t\tcmd[MAXLINE], errbuf[PCAP_ERRBUF_SIZE],\n\t\t\t\t\t\tstr1[INET_ADDRSTRLEN], str2[INET_ADDRSTRLEN];\n\tstruct bpf_program\tfcode;\n\n\tif (device == NULL) {\n\t\tif ( (device = pcap_lookupdev(errbuf)) == NULL)\n\t\t\terr_quit(\"pcap_lookup: %s\", errbuf);\n\t}\n\tprintf(\"device = %s\\n\", device);\n\n\t\t/* 4hardcode: promisc=0, to_ms=500 */\n\tif ( (pd = pcap_open_live(device, snaplen, 0, 500, errbuf)) == NULL)\n\t\terr_quit(\"pcap_open_live: %s\", errbuf);\n\n\tif (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)\n\t\terr_quit(\"pcap_lookupnet: %s\", errbuf);\n\tif (verbose)\n\t\tprintf(\"localnet = %s, netmask = %s\\n\",\n\t\t\t   Inet_ntop(AF_INET, &localnet, str1, sizeof(str1)),\n\t\t\t   Inet_ntop(AF_INET, &netmask, str2, sizeof(str2)));\n\n\tsnprintf(cmd, sizeof(cmd), CMD,\n\t\t\t Sock_ntop_host(dest, destlen),\n\t\t\t ntohs(sock_get_port(dest, destlen)));\n\tif (verbose)\n\t\tprintf(\"cmd = %s\\n\", cmd);\n\tif (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0)\n\t\terr_quit(\"pcap_compile: %s\", pcap_geterr(pd));\n\n\tif (pcap_setfilter(pd, &fcode) < 0)\n\t\terr_quit(\"pcap_setfilter: %s\", pcap_geterr(pd));\n\n\tif ( (datalink = pcap_datalink(pd)) < 0)\n\t\terr_quit(\"pcap_datalink: %s\", pcap_geterr(pd));\n\tif (verbose)\n\t\tprintf(\"datalink = %d\\n\", datalink);\n}\n/* end open_pcap */\n\n/* include next_pcap */\nchar *\nnext_pcap(int *len)\n{\n\tchar\t\t\t\t*ptr;\n\tstruct pcap_pkthdr\thdr;\n\n\t\t/* 4keep looping until packet ready */\n\twhile ( (ptr = (char *) pcap_next(pd, &hdr)) == NULL)\n\t\t;\n\n\t*len = hdr.caplen;\t/* captured length */\n\treturn(ptr);\n}\n/* end next_pcap */\n"
  },
  {
    "path": "udpcksum/pcap.lc",
    "content": "/* include open_pcap */\n#include    \"udpcksum.h\"##  1 ##src/udpcksum/pcap.c##\n\n#define CMD     \"udp and src host %s and src port %d\"##  2 ##src/udpcksum/pcap.c##\n\nvoid##  3 ##src/udpcksum/pcap.c##\nopen_pcap(void)##  4 ##src/udpcksum/pcap.c##\n{##  5 ##src/udpcksum/pcap.c##\n    uint32_t localnet, netmask;##  6 ##src/udpcksum/pcap.c##\n    char    cmd[MAXLINE], errbuf[PCAP_ERRBUF_SIZE],##  7 ##src/udpcksum/pcap.c##\n        str1[INET_ADDRSTRLEN], str2[INET_ADDRSTRLEN];##  8 ##src/udpcksum/pcap.c##\n    struct bpf_program fcode;##  9 ##src/udpcksum/pcap.c##\n\n    if (device == NULL) {## 10 ##src/udpcksum/pcap.c##\n        if ((device = pcap_lookupdev(errbuf)) == NULL)## 11 ##src/udpcksum/pcap.c##\n            err_quit(\"pcap_lookup: %s\", errbuf);## 12 ##src/udpcksum/pcap.c##\n    }## 13 ##src/udpcksum/pcap.c##\n    printf(\"device = %s\\n\", device);## 14 ##src/udpcksum/pcap.c##\n\n    /* 4hardcode: promisc=0, to_ms=500 */## 15 ##src/udpcksum/pcap.c##\n    if ((pd = pcap_open_live(device, snaplen, 0, 500, errbuf)) == NULL)## 16 ##src/udpcksum/pcap.c##\n        err_quit(\"pcap_open_live: %s\", errbuf);## 17 ##src/udpcksum/pcap.c##\n\n    if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)## 18 ##src/udpcksum/pcap.c##\n        err_quit(\"pcap_lookupnet: %s\", errbuf);## 19 ##src/udpcksum/pcap.c##\n    if (verbose)## 20 ##src/udpcksum/pcap.c##\n        printf(\"localnet = %s, netmask = %s\\n\",## 21 ##src/udpcksum/pcap.c##\n               Inet_ntop(AF_INET, &localnet, str1, sizeof(str1)),## 22 ##src/udpcksum/pcap.c##\n               Inet_ntop(AF_INET, &netmask, str2, sizeof(str2)));## 23 ##src/udpcksum/pcap.c##\n\n    snprintf(cmd, sizeof(cmd), CMD,## 24 ##src/udpcksum/pcap.c##\n             Sock_ntop_host(dest, destlen),## 25 ##src/udpcksum/pcap.c##\n             ntohs(sock_get_port(dest, destlen)));## 26 ##src/udpcksum/pcap.c##\n    if (verbose)## 27 ##src/udpcksum/pcap.c##\n        printf(\"cmd = %s\\n\", cmd);## 28 ##src/udpcksum/pcap.c##\n    if (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0)## 29 ##src/udpcksum/pcap.c##\n        err_quit(\"pcap_compile: %s\", pcap_geterr(pd));## 30 ##src/udpcksum/pcap.c##\n\n    if (pcap_setfilter(pd, &fcode) < 0)## 31 ##src/udpcksum/pcap.c##\n        err_quit(\"pcap_setfilter: %s\", pcap_geterr(pd));## 32 ##src/udpcksum/pcap.c##\n\n    if ((datalink = pcap_datalink(pd)) < 0)## 33 ##src/udpcksum/pcap.c##\n        err_quit(\"pcap_datalink: %s\", pcap_geterr(pd));## 34 ##src/udpcksum/pcap.c##\n    if (verbose)## 35 ##src/udpcksum/pcap.c##\n        printf(\"datalink = %d\\n\", datalink);## 36 ##src/udpcksum/pcap.c##\n}## 37 ##src/udpcksum/pcap.c##\n/* end open_pcap */\n\n/* include next_pcap */\nchar   *## 38 ##src/udpcksum/pcap.c##\nnext_pcap(int *len)## 39 ##src/udpcksum/pcap.c##\n{## 40 ##src/udpcksum/pcap.c##\n    char   *ptr;## 41 ##src/udpcksum/pcap.c##\n    struct pcap_pkthdr hdr;## 42 ##src/udpcksum/pcap.c##\n\n    /* 4keep looping until packet ready */## 43 ##src/udpcksum/pcap.c##\n    while ((ptr = (char *) pcap_next(pd, &hdr)) == NULL) ;## 44 ##src/udpcksum/pcap.c##\n\n    *len = hdr.caplen;          /* captured length */## 45 ##src/udpcksum/pcap.c##\n    return (ptr);## 46 ##src/udpcksum/pcap.c##\n}## 47 ##src/udpcksum/pcap.c##\n/* end next_pcap */\n"
  },
  {
    "path": "udpcksum/senddnsquery-libnet.c",
    "content": "#include\t\"udpcksum.h\"\n#include\t<libnet.h>\n\n/*\n * Build a DNS A query for \"a.root-servers.net\" and write it to\n * the raw socket.\n */\n\n/* include open_output_libnet */\nstatic libnet_t *l;\t\t/* libnet descriptor */\n\nvoid\nopen_output(void)\n{\n\tchar errbuf[LIBNET_ERRBUF_SIZE];\n\n\t/* Initialize libnet with an IPv4 raw socket */\n\tl = libnet_init(LIBNET_RAW4, NULL, errbuf);\n\tif (l == NULL) {\n\t\terr_quit(\"Can't initialize libnet: %s\", errbuf);\n\t}\n}\n/* end open_output_libnet */\n\n/* include send_dns_query_libnet */\nvoid\nsend_dns_query(void)\n{\n\tchar\t\t\t\t qbuf[24], *ptr;\n\tu_int16_t\t\t\t one;\n\tint\t\t\t\t\t packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;\n\tstatic libnet_ptag_t ip_tag, udp_tag, dns_tag;\n\n\t/* build query portion of DNS packet */\n\tptr = qbuf;\n\tmemcpy(ptr, \"\\001a\\014root-servers\\003net\\000\", 20);\n\tptr += 20;\n\tone = htons(1);\n\tmemcpy(ptr, &one, 2);\t\t\t\t/* query type = A */\n\tptr += 2;\n\tmemcpy(ptr, &one, 2);\t\t\t\t/* query class = 1 (IP addr) */\n\n\t/* build DNS packet */\n\tdns_tag = libnet_build_dnsv4(\n\t\t\t1234 /* identification */,\n\t\t\t0x0100 /* flags: recursion desired */,\n\t\t\t1 /* # questions */, \t0 /* # answer RRs */,\n\t\t\t0 /* # authority RRs */, 0 /* # additional RRs */,\n\t\t\tqbuf /* query */, 24 /* length of query */, l, dns_tag);\n\t/* build UDP header */\n\tudp_tag = libnet_build_udp(\n\t\t\t((struct sockaddr_in *) local)->sin_port /* source port */,\n\t\t\t((struct sockaddr_in *) dest)->sin_port /* dest port */,\n\t\t\tpacket_size /* length */, 0 /* checksum */,\n\t\t\tNULL /* payload */, 0 /* payload length */, l, udp_tag);\n\t/* Since we specified the checksum as 0, libnet will automatically */\n\t/* calculate the UDP checksum.  Turn it off if the user doesn't want it. */\n\tif (zerosum)\n\t\tif (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)\n\t\t\terr_quit(\"turning off checksums: %s\\n\", libnet_geterror(l));\n\t/* build IP header */\n/* *INDENT-OFF* */\n\tip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* len */,\n\t\t\t0 /* tos */, 0 /* IP ID */, 0 /* fragment */,\n\t\t\tTTL_OUT /* ttl */, IPPROTO_UDP /* protocol */,\n\t\t\t0 /* checksum */,\n\t\t\t((struct sockaddr_in *) local)->sin_addr.s_addr /* source */,\n\t\t\t((struct sockaddr_in *) dest)->sin_addr.s_addr /* dest */,\n\t\t\tNULL /* payload */, 0 /* payload length */, l, ip_tag);\n/* *INDENT-ON* */\n\n\tif (libnet_write(l) < 0) {\n\t\terr_quit(\"libnet_write: %s\\n\", libnet_geterror(l));\n\t}\n\tif (verbose)\n\t\tprintf(\"sent: %d bytes of data\\n\", packet_size);\n}\n/* end send_dns_query_libnet */\n"
  },
  {
    "path": "udpcksum/senddnsquery-libnet.lc",
    "content": "#include    \"udpcksum.h\"##  1 ##src/udpcksum/senddnsquery-libnet.c##\n#include    <libnet.h>##  2 ##src/udpcksum/senddnsquery-libnet.c##\n\n/*##  3 ##src/udpcksum/senddnsquery-libnet.c##\n * Build a DNS A query for \"a.root-servers.net\" and write it to##  4 ##src/udpcksum/senddnsquery-libnet.c##\n * the raw socket.##  5 ##src/udpcksum/senddnsquery-libnet.c##\n */##  6 ##src/udpcksum/senddnsquery-libnet.c##\n\n/* include open_output_libnet */\nstatic libnet_t *l;             /* libnet descriptor */##  7 ##src/udpcksum/senddnsquery-libnet.c##\n\nvoid##  8 ##src/udpcksum/senddnsquery-libnet.c##\nopen_output(void)##  9 ##src/udpcksum/senddnsquery-libnet.c##\n{## 10 ##src/udpcksum/senddnsquery-libnet.c##\n    char    errbuf[LIBNET_ERRBUF_SIZE];## 11 ##src/udpcksum/senddnsquery-libnet.c##\n\n    /* Initialize libnet, with an IPv4 raw socket. */## 12 ##src/udpcksum/senddnsquery-libnet.c##\n    l = libnet_init(LIBNET_RAW4, NULL, errbuf);## 13 ##src/udpcksum/senddnsquery-libnet.c##\n    if (l == NULL) {## 14 ##src/udpcksum/senddnsquery-libnet.c##\n        err_quit(\"Can't initialize libnet: %s\", errbuf);## 15 ##src/udpcksum/senddnsquery-libnet.c##\n    }## 16 ##src/udpcksum/senddnsquery-libnet.c##\n}## 17 ##src/udpcksum/senddnsquery-libnet.c##\n/* end open_output_libnet */\n\n/* include send_dns_query_libnet */\nvoid## 18 ##src/udpcksum/senddnsquery-libnet.c##\nsend_dns_query(void)## 19 ##src/udpcksum/senddnsquery-libnet.c##\n{## 20 ##src/udpcksum/senddnsquery-libnet.c##\n    char    qbuf[24], *ptr;## 21 ##src/udpcksum/senddnsquery-libnet.c##\n    u_int16_t one;## 22 ##src/udpcksum/senddnsquery-libnet.c##\n    int     packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;## 23 ##src/udpcksum/senddnsquery-libnet.c##\n    static libnet_ptag_t ip_tag, udp_tag, dns_tag;## 24 ##src/udpcksum/senddnsquery-libnet.c##\n\n    /* Build the query portion of the DNS packet. */## 25 ##src/udpcksum/senddnsquery-libnet.c##\n    ptr = qbuf;## 26 ##src/udpcksum/senddnsquery-libnet.c##\n    memcpy(ptr, \"\\001a\\014root-servers\\003net\\000\", 20);## 27 ##src/udpcksum/senddnsquery-libnet.c##\n    ptr += 20;## 28 ##src/udpcksum/senddnsquery-libnet.c##\n    one = htons(1);## 29 ##src/udpcksum/senddnsquery-libnet.c##\n    memcpy(ptr, &one, 2);       /* query type = A */## 30 ##src/udpcksum/senddnsquery-libnet.c##\n    ptr += 2;## 31 ##src/udpcksum/senddnsquery-libnet.c##\n    memcpy(ptr, &one, 2);       /* query class = 1 (IP addr) */## 32 ##src/udpcksum/senddnsquery-libnet.c##\n\n    /* Build the DNS packet. */## 33 ##src/udpcksum/senddnsquery-libnet.c##\n    dns_tag = libnet_build_dnsv4(1234 /* identification */ ,## 34 ##src/udpcksum/senddnsquery-libnet.c##\n                                 0x0100 /* flags: recursion desired */ ,## 35 ##src/udpcksum/senddnsquery-libnet.c##\n                                 1 /* #questions */ , 0 /* #answer RRs */ ,## 36 ##src/udpcksum/senddnsquery-libnet.c##\n                                 0 /* #authority RRs */ ,## 37 ##src/udpcksum/senddnsquery-libnet.c##\n                                 0 /* #additional RRs */ ,## 38 ##src/udpcksum/senddnsquery-libnet.c##\n                                 qbuf /* query */ ,## 39 ##src/udpcksum/senddnsquery-libnet.c##\n                                 24 /* length of query */ , l, dns_tag);## 40 ##src/udpcksum/senddnsquery-libnet.c##\n    /* Build the UDP header. */## 41 ##src/udpcksum/senddnsquery-libnet.c##\n    udp_tag = libnet_build_udp(((struct sockaddr_in *) local)->## 42 ##src/udpcksum/senddnsquery-libnet.c##\n                               sin_port /* source port */ ,## 43 ##src/udpcksum/senddnsquery-libnet.c##\n                               ((struct sockaddr_in *) dest)->## 44 ##src/udpcksum/senddnsquery-libnet.c##\n                               sin_port /* dest port */ ,## 45 ##src/udpcksum/senddnsquery-libnet.c##\n                               packet_size /* length */ , 0 /* checksum */ ,## 46 ##src/udpcksum/senddnsquery-libnet.c##\n                               NULL /* payload */ , 0 /* payload length */ ,## 47 ##src/udpcksum/senddnsquery-libnet.c##\n                               l, udp_tag);## 48 ##src/udpcksum/senddnsquery-libnet.c##\n    /* Since we specified the checksum as 0, libnet will automatically */## 49 ##src/udpcksum/senddnsquery-libnet.c##\n    /* calculate the udp checksum.  Turn it off if the user doesn't want it */## 50 ##src/udpcksum/senddnsquery-libnet.c##\n    if (zerosum)## 51 ##src/udpcksum/senddnsquery-libnet.c##\n        if (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)## 52 ##src/udpcksum/senddnsquery-libnet.c##\n            err_quit(\"turning off checksums: %s\\n\", libnet_geterror(l));## 53 ##src/udpcksum/senddnsquery-libnet.c##\n    /* Build the IP header. */## 54 ##src/udpcksum/senddnsquery-libnet.c##\n    ip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* len */,## 55 ##src/udpcksum/senddnsquery-libnet.c##\n            0 /* tos */, 0 /* IP ID */, 0 /* fragment */,## 56 ##src/udpcksum/senddnsquery-libnet.c##\n            TTL_OUT /* ttl */, IPPROTO_UDP /* protocol */,## 57 ##src/udpcksum/senddnsquery-libnet.c##\n            0 /* checksum */,## 58 ##src/udpcksum/senddnsquery-libnet.c##\n            ((struct sockaddr_in *) local)->sin_addr.s_addr /* source */,## 59 ##src/udpcksum/senddnsquery-libnet.c##\n            ((struct sockaddr_in *) dest)->sin_addr.s_addr /* dest */,## 60 ##src/udpcksum/senddnsquery-libnet.c##\n            NULL /* payload */, 0 /* payload length */, l, ip_tag);## 61 ##src/udpcksum/senddnsquery-libnet.c##\n\n    if (libnet_write(l) < 0) {## 62 ##src/udpcksum/senddnsquery-libnet.c##\n        err_quit(\"libnet_write: %s\\n\", libnet_geterror(l));## 63 ##src/udpcksum/senddnsquery-libnet.c##\n    }## 64 ##src/udpcksum/senddnsquery-libnet.c##\n    if (verbose)## 65 ##src/udpcksum/senddnsquery-libnet.c##\n        printf(\"sent: %d bytes of data\\n\", packet_size);## 66 ##src/udpcksum/senddnsquery-libnet.c##\n}## 67 ##src/udpcksum/senddnsquery-libnet.c##\n/* end send_dns_query_libnet */\n"
  },
  {
    "path": "udpcksum/senddnsquery-raw.c",
    "content": "#include\t\"udpcksum.h\"\n\n/*\n * Build a DNS A query for \"a.root-servers.net\" and write it to\n * the raw socket.\n */\n\n/* include send_dns_query */\nvoid\nsend_dns_query(void)\n{\n\tsize_t\t\tnbytes;\n\tchar\t\t*buf, *ptr;\n\n\tbuf = Malloc(sizeof(struct udpiphdr) + 100);\n\tptr = buf + sizeof(struct udpiphdr);/* leave room for IP/UDP headers */\n\n\t*((uint16_t *) ptr) = htons(1234);\t/* identification */\n\tptr += 2;\n\t*((uint16_t *) ptr) = htons(0x0100);\t/* flags: recursion desired */\n\tptr += 2;\n\t*((uint16_t *) ptr) = htons(1);\t\t/* # questions */\n\tptr += 2;\n\t*((uint16_t *) ptr) = 0;\t\t\t/* # answer RRs */\n\tptr += 2;\n\t*((uint16_t *) ptr) = 0;\t\t\t/* # authority RRs */\n\tptr += 2;\n\t*((uint16_t *) ptr) = 0;\t\t\t/* # additional RRs */\n\tptr += 2;\n\n\tmemcpy(ptr, \"\\001a\\014root-servers\\003net\\000\", 20);\n\tptr += 20;\n\t*((uint16_t *) ptr) = htons(1);\t\t/* query type = A */\n\tptr += 2;\n\t*((uint16_t *) ptr) = htons(1);\t\t/* query class = 1 (IP addr) */\n\tptr += 2;\n\n\tnbytes = (ptr - buf) - sizeof(struct udpiphdr);\n\tudp_write(buf, nbytes);\n\tif (verbose)\n\t\tprintf(\"sent: %d bytes of data\\n\", nbytes);\n}\n/* end send_dns_query */\n"
  },
  {
    "path": "udpcksum/senddnsquery-raw.lc",
    "content": "#include    \"udpcksum.h\"##  1 ##src/udpcksum/senddnsquery-raw.c##\n\n/*##  2 ##src/udpcksum/senddnsquery-raw.c##\n * Build a DNS A query for \"a.root-servers.net\" and write it to##  3 ##src/udpcksum/senddnsquery-raw.c##\n * the raw socket.##  4 ##src/udpcksum/senddnsquery-raw.c##\n */##  5 ##src/udpcksum/senddnsquery-raw.c##\n\n/* include send_dns_query */\nvoid##  6 ##src/udpcksum/senddnsquery-raw.c##\nsend_dns_query(void)##  7 ##src/udpcksum/senddnsquery-raw.c##\n{##  8 ##src/udpcksum/senddnsquery-raw.c##\n    size_t  nbytes;##  9 ##src/udpcksum/senddnsquery-raw.c##\n    char    buf[sizeof(struct udpiphdr) + 100], *ptr;## 10 ##src/udpcksum/senddnsquery-raw.c##\n    uint16_t one;## 11 ##src/udpcksum/senddnsquery-raw.c##\n\n    ptr = buf + sizeof(struct udpiphdr);    /* leave room for IP/UDP headers */## 12 ##src/udpcksum/senddnsquery-raw.c##\n\n    *((uint16_t *) ptr) = htons(1234);  /* identification */## 13 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 14 ##src/udpcksum/senddnsquery-raw.c##\n    *((uint16_t *) ptr) = htons(0x0100);    /* flags: recursion desired */## 15 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 16 ##src/udpcksum/senddnsquery-raw.c##\n    *((uint16_t *) ptr) = htons(1); /* #questions */## 17 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 18 ##src/udpcksum/senddnsquery-raw.c##\n    *((uint16_t *) ptr) = 0;    /* #answer RRs */## 19 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 20 ##src/udpcksum/senddnsquery-raw.c##\n    *((uint16_t *) ptr) = 0;    /* #authority RRs */## 21 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 22 ##src/udpcksum/senddnsquery-raw.c##\n    *((uint16_t *) ptr) = 0;    /* #additional RRs */## 23 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 24 ##src/udpcksum/senddnsquery-raw.c##\n\n    memcpy(ptr, \"\\001a\\014root-servers\\003net\\000\", 20);## 25 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 20;## 26 ##src/udpcksum/senddnsquery-raw.c##\n    one = htons(1);## 27 ##src/udpcksum/senddnsquery-raw.c##\n    memcpy(ptr, &one, 2);       /* query type = A */## 28 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 29 ##src/udpcksum/senddnsquery-raw.c##\n    memcpy(ptr, &one, 2);       /* query class = 1 (IP addr) */## 30 ##src/udpcksum/senddnsquery-raw.c##\n    ptr += 2;## 31 ##src/udpcksum/senddnsquery-raw.c##\n\n    nbytes = 36;## 32 ##src/udpcksum/senddnsquery-raw.c##\n    udp_write(buf, nbytes);## 33 ##src/udpcksum/senddnsquery-raw.c##\n    if (verbose)## 34 ##src/udpcksum/senddnsquery-raw.c##\n        printf(\"sent: %d bytes of data\\n\", nbytes);## 35 ##src/udpcksum/senddnsquery-raw.c##\n}## 36 ##src/udpcksum/senddnsquery-raw.c##\n/* end send_dns_query */\n"
  },
  {
    "path": "udpcksum/udpcksum.c",
    "content": "/* include sig_alrm */\n#include\t\"udpcksum.h\"\n#include\t<setjmp.h>\n\nstatic sigjmp_buf\tjmpbuf;\nstatic int\t\t\tcanjump;\n\nvoid\nsig_alrm(int signo)\n{\n\tif (canjump == 0)\n\t\treturn;\n\tsiglongjmp(jmpbuf, 1);\n}\n/* end sig_alrm */\n\n/* include test_udp */\nvoid\ntest_udp(void)\n{\n\tvolatile int\tnsent = 0, timeout = 3;\n\tstruct udpiphdr\t*ui;\n\n\tSignal(SIGALRM, sig_alrm);\n\n\tif (sigsetjmp(jmpbuf, 1)) {\n\t\tif (nsent >= 3)\n\t\t\terr_quit(\"no response\");\n\t\tprintf(\"timeout\\n\");\n\t\ttimeout *= 2;\t\t/* exponential backoff: 3, 6, 12 */\n\t}\n\tcanjump = 1;\t/* siglongjmp is now OK */\n\n\tsend_dns_query();\n\tnsent++;\n\n\talarm(timeout);\n\tui = udp_read();\n\tcanjump = 0;\n\talarm(0);\n\n\tif (ui->ui_sum == 0)\n\t\tprintf(\"UDP checksums off\\n\");\n\telse\n\t\tprintf(\"UDP checksums on\\n\");\n\tif (verbose)\n\t\tprintf(\"received UDP checksum = %x\\n\", ntohs(ui->ui_sum));\n}\n/* end test_udp */\n"
  },
  {
    "path": "udpcksum/udpcksum.h",
    "content": "#include\t\"unp.h\"\n#include\t<pcap.h>\n\n#include\t<netinet/in_systm.h>\t/* required for ip.h */\n#include\t<netinet/in.h>\n#include\t<netinet/ip.h>\n#include\t<netinet/ip_var.h>\n#include\t<netinet/udp.h>\n#include\t<netinet/udp_var.h>\n#include\t<net/if.h>\n#include\t<netinet/if_ether.h>\n\n#define\tTTL_OUT\t\t64\t\t\t\t/* outgoing TTL */\n\n\t\t\t\t\t/* declare global variables */\nextern struct sockaddr\t*dest, *local;\nextern socklen_t\t\tdestlen, locallen;\nextern int\t\tdatalink;\nextern char    *device;\nextern pcap_t  *pd;\nextern int\t\trawfd;\nextern int\t\tsnaplen;\nextern int\t\tverbose;\nextern int\t\tzerosum;\n\n\t\t\t\t\t/* function prototypes */\nvoid\t\t\t cleanup(int);\nchar\t\t\t*next_pcap(int *);\nvoid\t\t\t open_output(void);\nvoid\t\t\t open_pcap(void);\nvoid\t\t\t send_dns_query(void);\nvoid\t\t\t test_udp(void);\nvoid\t\t\t udp_write(char *, int);\nstruct udpiphdr *udp_read(void);\n"
  },
  {
    "path": "udpcksum/udpcksum.lc",
    "content": "/* include sig_alrm */\n#include    \"udpcksum.h\"##  1 ##src/udpcksum/udpcksum.c##\n#include    <setjmp.h>##  2 ##src/udpcksum/udpcksum.c##\n\nstatic sigjmp_buf jmpbuf;##  3 ##src/udpcksum/udpcksum.c##\nstatic int canjump;##  4 ##src/udpcksum/udpcksum.c##\n\nvoid##  5 ##src/udpcksum/udpcksum.c##\nsig_alrm(int signo)##  6 ##src/udpcksum/udpcksum.c##\n{##  7 ##src/udpcksum/udpcksum.c##\n    if (canjump == 0)##  8 ##src/udpcksum/udpcksum.c##\n        return;##  9 ##src/udpcksum/udpcksum.c##\n    siglongjmp(jmpbuf, 1);## 10 ##src/udpcksum/udpcksum.c##\n}## 11 ##src/udpcksum/udpcksum.c##\n/* end sig_alrm */\n\n/* include test_udp */\nvoid## 12 ##src/udpcksum/udpcksum.c##\ntest_udp(void)## 13 ##src/udpcksum/udpcksum.c##\n{## 14 ##src/udpcksum/udpcksum.c##\n    volatile int nsent = 0, timeout = 3;## 15 ##src/udpcksum/udpcksum.c##\n    struct udpiphdr *ui;## 16 ##src/udpcksum/udpcksum.c##\n\n    Signal(SIGALRM, sig_alrm);## 17 ##src/udpcksum/udpcksum.c##\n\n    if (sigsetjmp(jmpbuf, 1)) {## 18 ##src/udpcksum/udpcksum.c##\n        if (nsent >= 3)## 19 ##src/udpcksum/udpcksum.c##\n            err_quit(\"no response\");## 20 ##src/udpcksum/udpcksum.c##\n        printf(\"timeout\\n\");## 21 ##src/udpcksum/udpcksum.c##\n        timeout *= 2;           /* exponential backoff: 3, 6, 12 */## 22 ##src/udpcksum/udpcksum.c##\n    }## 23 ##src/udpcksum/udpcksum.c##\n    canjump = 1;                /* siglongjmp is now OK */## 24 ##src/udpcksum/udpcksum.c##\n\n    send_dns_query();## 25 ##src/udpcksum/udpcksum.c##\n    nsent++;## 26 ##src/udpcksum/udpcksum.c##\n\n    alarm(timeout);## 27 ##src/udpcksum/udpcksum.c##\n    ui = udp_read();## 28 ##src/udpcksum/udpcksum.c##\n    canjump = 0;## 29 ##src/udpcksum/udpcksum.c##\n    alarm(0);## 30 ##src/udpcksum/udpcksum.c##\n\n    if (ui->ui_sum == 0)## 31 ##src/udpcksum/udpcksum.c##\n        printf(\"UDP checksums off\\n\");## 32 ##src/udpcksum/udpcksum.c##\n    else## 33 ##src/udpcksum/udpcksum.c##\n        printf(\"UDP checksums on\\n\");## 34 ##src/udpcksum/udpcksum.c##\n    if (verbose)## 35 ##src/udpcksum/udpcksum.c##\n        printf(\"received UDP checksum = %x\\n\", ntohs(ui->ui_sum));## 36 ##src/udpcksum/udpcksum.c##\n}## 37 ##src/udpcksum/udpcksum.c##\n/* end test_udp */\n"
  },
  {
    "path": "udpcksum/udpread.c",
    "content": "#include\t\"udpcksum.h\"\n\nstruct udpiphdr\t*udp_check(char *, int);\n\n/*\n * Read from the network until a UDP datagram is read that matches\n * the arguments.\n */\n\n/* include udp_read */\nstruct udpiphdr *\nudp_read(void)\n{\n\tint\t\t\t\t\tlen;\n\tchar\t\t\t\t*ptr;\n\tstruct ether_header\t*eptr;\n\n\tfor ( ; ; ) {\n\t\tptr = next_pcap(&len);\n\n\t\tswitch (datalink) {\n\t\tcase DLT_NULL:\t/* loopback header = 4 bytes */\n\t\t\treturn(udp_check(ptr+4, len-4));\n\n\t\tcase DLT_EN10MB:\n\t\t\teptr = (struct ether_header *) ptr;\n\t\t\tif (ntohs(eptr->ether_type) != ETHERTYPE_IP)\n\t\t\t\terr_quit(\"Ethernet type %x not IP\", ntohs(eptr->ether_type));\n\t\t\treturn(udp_check(ptr+14, len-14));\n\n\t\tcase DLT_SLIP:\t/* SLIP header = 24 bytes */\n\t\t\treturn(udp_check(ptr+24, len-24));\n\n\t\tcase DLT_PPP:\t/* PPP header = 24 bytes */\n\t\t\treturn(udp_check(ptr+24, len-24));\n\n\t\tdefault:\n\t\t\terr_quit(\"unsupported datalink (%d)\", datalink);\n\t\t}\n\t}\n}\n/* end udp_read */\n\n/*\n * Check the received packet.\n * If UDP and OK, return pointer to packet.\n * If ICMP error, return NULL.\n * We assume the filter picks out desired UDP datagrams.\n */\n\n/* include udp_check */\nstruct udpiphdr *\nudp_check(char *ptr, int len)\n{\n\tint\t\t\t\t\thlen;\n\tstruct ip\t\t\t*ip;\n\tstruct udpiphdr\t\t*ui;\n/* *INDENT-OFF* */\n\n\tif (len < sizeof(struct ip) + sizeof(struct udphdr))\n\t\terr_quit(\"len = %d\", len);\n/* *INDENT-ON* */\n\n\t\t/* 4minimal verification of IP header */\n\tip = (struct ip *) ptr;\n\tif (ip->ip_v != IPVERSION)\n\t\terr_quit(\"ip_v = %d\", ip->ip_v);\n\thlen = ip->ip_hl << 2;\n/* *INDENT-OFF* */\n\tif (hlen < sizeof(struct ip))\n\t\terr_quit(\"ip_hl = %d\", ip->ip_hl);\n\tif (len < hlen + sizeof(struct udphdr))\n\t\terr_quit(\"len = %d, hlen = %d\", len, hlen);\n/* *INDENT-ON* */\n\n\tif ( (ip->ip_sum = in_cksum((uint16_t *) ip, hlen)) != 0)\n\t\terr_quit(\"ip checksum error\");\n\n\tif (ip->ip_p == IPPROTO_UDP) {\n\t\tui = (struct udpiphdr *) ip;\n\t\treturn(ui);\n\t} else\n\t\terr_quit(\"not a UDP packet\");\n}\n/* end udp_check */\n"
  },
  {
    "path": "udpcksum/udpread.c.bad",
    "content": "#include\t\"udpcksum.h\"\n\nstruct udpiphdr *udp_check (char *, int);\n\n/*\n * Read from the network until a UDP datagram is read that matches\n * the arguments.\n */\n\n/* include udp_read */\nstruct udpiphdr *\nudp_read (void)\n{\n  int len;\n  char *ptr;\n  struct ether_header *eptr;\n\n  for (;;)\n    {\n      ptr = next_pcap (&len);\n\n      switch (datalink)\n\t{\n\tcase DLT_NULL:\t\t/* loopback header = 4 bytes */\n\t  return (udp_check (ptr + 4, len - 4));\n\n\tcase DLT_EN10MB:\n\t  eptr = (struct ether_header *) ptr;\n\t  if (ntohs (eptr->ether_type) != ETHERTYPE_IP)\n\t    err_quit (\"Ethernet type %x not IP\", ntohs (eptr->ether_type));\n\t  return (udp_check (ptr + 14, len - 14));\n\n\tcase DLT_SLIP:\t\t/* SLIP header = 24 bytes */\n\t  return (udp_check (ptr + 24, len - 24));\n\n\tcase DLT_PPP:\t\t/* PPP header = 24 bytes */\n\t  return (udp_check (ptr + 24, len - 24));\n\n\tdefault:\n\t  err_quit (\"unsupported data link (%d)\", datalink);\n\t}\n    }\n}\n/* end udp_read */\n\n/*\n * Check the received packet.\n * If UDP and OK, return pointer to packet.\n * If ICMP error, return NULL.\n * We assume the filter picks out desired UDP datagrams.\n */\n\n/* include udp_check */\nstruct udpiphdr *\nudp_check (char *ptr, int len)\n{\n  int hlen;\n  struct ip *ip;\n  struct udpiphdr *ui;\n\n  if (len < sizeof (struct ip) + sizeof (struct udphdr))\n      err_quit (\"len = %d\", len);\n\n  /* minimal verification of IP header */\n  ip = (struct ip *) ptr;\n  if (ip->ip_v != IPVERSION)\n    err_quit (\"ip_v = %d\", ip->ip_v);\n  hlen = ip->ip_hl << 2;\n  if (hlen < sizeof (struct ip))\n      err_quit (\"ip_hl = %d\", ip->ip_hl);\n  if (len < hlen + sizeof (struct udphdr))\n      err_quit (\"len = %d, hlen = %d\", len, hlen);\n\n  if ((ip->ip_sum = in_cksum ((u_short *) ip, hlen)) != 0)\n    err_quit (\"ip checksum error\");\n\n  if (ip->ip_p == IPPROTO_UDP)\n    {\n      ui = (struct udpiphdr *) ip;\n      return (ui);\n    }\n  else\n    err_quit (\"not a UDP packet\");\n}\n/* end udp_check */\n"
  },
  {
    "path": "udpcksum/udpread.lc",
    "content": "#include    \"udpcksum.h\"##  1 ##src/udpcksum/udpread.c##\n\nstruct udpiphdr *udp_check(char *, int);##  2 ##src/udpcksum/udpread.c##\n\n/*##  3 ##src/udpcksum/udpread.c##\n * Read from the network until a UDP datagram is read that matches##  4 ##src/udpcksum/udpread.c##\n * the arguments.##  5 ##src/udpcksum/udpread.c##\n */##  6 ##src/udpcksum/udpread.c##\n\n/* include udp_read */\nstruct udpiphdr *##  7 ##src/udpcksum/udpread.c##\nudp_read(void)##  8 ##src/udpcksum/udpread.c##\n{##  9 ##src/udpcksum/udpread.c##\n    int     len;## 10 ##src/udpcksum/udpread.c##\n    char   *ptr;## 11 ##src/udpcksum/udpread.c##\n    struct ether_header *eptr;## 12 ##src/udpcksum/udpread.c##\n\n    for (;;) {## 13 ##src/udpcksum/udpread.c##\n        ptr = next_pcap(&len);## 14 ##src/udpcksum/udpread.c##\n\n        switch (datalink) {## 15 ##src/udpcksum/udpread.c##\n        case DLT_NULL:          /* loopback header = 4 bytes */## 16 ##src/udpcksum/udpread.c##\n            return (udp_check(ptr + 4, len - 4));## 17 ##src/udpcksum/udpread.c##\n\n        case DLT_EN10MB:## 18 ##src/udpcksum/udpread.c##\n            eptr = (struct ether_header *) ptr;## 19 ##src/udpcksum/udpread.c##\n            if (ntohs(eptr->ether_type) != ETHERTYPE_IP)## 20 ##src/udpcksum/udpread.c##\n                err_quit(\"Ethernet type %x not IP\", ntohs(eptr->ether_type));## 21 ##src/udpcksum/udpread.c##\n            return (udp_check(ptr + 14, len - 14));## 22 ##src/udpcksum/udpread.c##\n\n        case DLT_SLIP:          /* SLIP header = 24 bytes */## 23 ##src/udpcksum/udpread.c##\n            return (udp_check(ptr + 24, len - 24));## 24 ##src/udpcksum/udpread.c##\n\n        case DLT_PPP:           /* PPP header = 24 bytes */## 25 ##src/udpcksum/udpread.c##\n            return (udp_check(ptr + 24, len - 24));## 26 ##src/udpcksum/udpread.c##\n\n        default:## 27 ##src/udpcksum/udpread.c##\n            err_quit(\"unsupported datalink (%d)\", datalink);## 28 ##src/udpcksum/udpread.c##\n        }## 29 ##src/udpcksum/udpread.c##\n    }## 30 ##src/udpcksum/udpread.c##\n}## 31 ##src/udpcksum/udpread.c##\n/* end udp_read */\n\n/*## 32 ##src/udpcksum/udpread.c##\n * Check the received packet.## 33 ##src/udpcksum/udpread.c##\n * If UDP and OK, return pointer to packet.## 34 ##src/udpcksum/udpread.c##\n * If ICMP error, return NULL.## 35 ##src/udpcksum/udpread.c##\n * We assume the filter picks out desired UDP datagrams.## 36 ##src/udpcksum/udpread.c##\n */## 37 ##src/udpcksum/udpread.c##\n\n/* include udp_check */\nstruct udpiphdr *## 38 ##src/udpcksum/udpread.c##\nudp_check(char *ptr, int len)## 39 ##src/udpcksum/udpread.c##\n{## 40 ##src/udpcksum/udpread.c##\n    int     hlen;## 41 ##src/udpcksum/udpread.c##\n    struct ip *ip;## 42 ##src/udpcksum/udpread.c##\n    struct udpiphdr *ui;## 43 ##src/udpcksum/udpread.c##\n\n    if (len < sizeof(struct ip) + sizeof(struct udphdr))## 44 ##src/udpcksum/udpread.c##\n        err_quit(\"len = %d\", len);## 45 ##src/udpcksum/udpread.c##\n\n    /* 4minimal verification of IP header */## 46 ##src/udpcksum/udpread.c##\n    ip = (struct ip *) ptr;## 47 ##src/udpcksum/udpread.c##\n    if (ip->ip_v != IPVERSION)## 48 ##src/udpcksum/udpread.c##\n        err_quit(\"ip_v = %d\", ip->ip_v);## 49 ##src/udpcksum/udpread.c##\n    hlen = ip->ip_hl << 2;## 50 ##src/udpcksum/udpread.c##\n    if (hlen < sizeof(struct ip))## 51 ##src/udpcksum/udpread.c##\n        err_quit(\"ip_hl = %d\", ip->ip_hl);## 52 ##src/udpcksum/udpread.c##\n    if (len < hlen + sizeof(struct udphdr))## 53 ##src/udpcksum/udpread.c##\n        err_quit(\"len = %d, hlen = %d\", len, hlen);## 54 ##src/udpcksum/udpread.c##\n\n    if ((ip->ip_sum = in_cksum((uint16_t *) ip, hlen)) != 0)## 55 ##src/udpcksum/udpread.c##\n        err_quit(\"ip checksum error\");## 56 ##src/udpcksum/udpread.c##\n\n    if (ip->ip_p == IPPROTO_UDP) {## 57 ##src/udpcksum/udpread.c##\n        ui = (struct udpiphdr *) ip;## 58 ##src/udpcksum/udpread.c##\n        return (ui);## 59 ##src/udpcksum/udpread.c##\n    } else## 60 ##src/udpcksum/udpread.c##\n        err_quit(\"not a UDP packet\");## 61 ##src/udpcksum/udpread.c##\n}## 62 ##src/udpcksum/udpread.c##\n/* end udp_check */\n"
  },
  {
    "path": "udpcksum/udpwrite.c",
    "content": "#include\t\"udpcksum.h\"\n\n/* include open_output_raw */\nint\t\trawfd;\t\t\t/* raw socket to write on */\n\nvoid\nopen_output(void)\n{\n\tint\ton=1;\n\t/*\n\t * Need a raw socket to write our own IP datagrams to.\n\t * Process must have superuser privileges to create this socket.\n\t * Also must set IP_HDRINCL so we can write our own IP headers.\n\t */\n\n\trawfd = Socket(dest->sa_family, SOCK_RAW, 0);\n\n\tSetsockopt(rawfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));\n}\n/* end open_output_raw */\n\n/*\n * \"buf\" points to an empty IP/UDP header,\n * followed by \"ulen\" bytes of user data.\n */\n\n/* include udp_write */\nvoid\nudp_write(char *buf, int userlen)\n{\n\tstruct udpiphdr\t\t*ui;\n\tstruct ip\t\t\t*ip;\n\n\t\t/* 4fill in and checksum UDP header */\n\tip = (struct ip *) buf;\n\tui = (struct udpiphdr *) buf;\n\tbzero(ui, sizeof(*ui));\n\t\t\t/* 8add 8 to userlen for pseudoheader length */\n\tui->ui_len = htons((uint16_t) (sizeof(struct udphdr) + userlen));\n\t\t\t/* 8then add 28 for IP datagram length */\n\tuserlen += sizeof(struct udpiphdr);\n\n\tui->ui_pr = IPPROTO_UDP;\n\tui->ui_src.s_addr = ((struct sockaddr_in *) local)->sin_addr.s_addr;\n\tui->ui_dst.s_addr = ((struct sockaddr_in *) dest)->sin_addr.s_addr;\n\tui->ui_sport = ((struct sockaddr_in *) local)->sin_port;\n\tui->ui_dport = ((struct sockaddr_in *) dest)->sin_port;\n\tui->ui_ulen = ui->ui_len;\n\tif (zerosum == 0) {\n#if 1\t/* change to if 0 for Solaris 2.x, x < 6 */\n\t\tif ( (ui->ui_sum = in_cksum((u_int16_t *) ui, userlen)) == 0)\n\t\t\tui->ui_sum = 0xffff;\n#else\n\t\tui->ui_sum = ui->ui_len;\n#endif\n\t}\n\n\t\t/* 4fill in rest of IP header; */\n\t\t/* 4ip_output() calcuates & stores IP header checksum */\n\tip->ip_v = IPVERSION;\n\tip->ip_hl = sizeof(struct ip) >> 2;\n\tip->ip_tos = 0;\n#if defined(linux) || defined(__OpenBSD__)\n\tip->ip_len = htons(userlen);\t/* network byte order */\n#else\n\tip->ip_len = userlen;\t\t\t/* host byte order */\n#endif\n\tip->ip_id = 0;\t\t\t/* let IP set this */\n\tip->ip_off = 0;\t\t\t/* frag offset, MF and DF flags */\n\tip->ip_ttl = TTL_OUT;\n\n\tSendto(rawfd, buf, userlen, 0, dest, destlen);\n}\n/* end udp_write */\n"
  },
  {
    "path": "udpcksum/udpwrite.lc",
    "content": "#include    \"udpcksum.h\"##  1 ##src/udpcksum/udpwrite.c##\n\n/* include open_output_raw */\nint     rawfd;                  /* raw socket to write on */##  2 ##src/udpcksum/udpwrite.c##\n\nvoid##  3 ##src/udpcksum/udpwrite.c##\nopen_output(void)##  4 ##src/udpcksum/udpwrite.c##\n{##  5 ##src/udpcksum/udpwrite.c##\n    int     on = 1;##  6 ##src/udpcksum/udpwrite.c##\n    /* ##  7 ##src/udpcksum/udpwrite.c##\n     * Need a raw socket to write our own IP datagrams to.##  8 ##src/udpcksum/udpwrite.c##\n     * Process must have superuser privileges to create this socket.##  9 ##src/udpcksum/udpwrite.c##\n     * Also must set IP_HDRINCL so we can write our own IP headers.## 10 ##src/udpcksum/udpwrite.c##\n     */## 11 ##src/udpcksum/udpwrite.c##\n\n    rawfd = Socket(dest->sa_family, SOCK_RAW, 0);## 12 ##src/udpcksum/udpwrite.c##\n\n    Setsockopt(rawfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));## 13 ##src/udpcksum/udpwrite.c##\n}## 14 ##src/udpcksum/udpwrite.c##\n/* end open_output_raw */\n\n/*## 15 ##src/udpcksum/udpwrite.c##\n * \"buf\" points to an empty IP/UDP header,## 16 ##src/udpcksum/udpwrite.c##\n * followed by \"ulen\" bytes of user data.## 17 ##src/udpcksum/udpwrite.c##\n */## 18 ##src/udpcksum/udpwrite.c##\n\n/* include udp_write */\nvoid## 19 ##src/udpcksum/udpwrite.c##\nudp_write(char *buf, int userlen)## 20 ##src/udpcksum/udpwrite.c##\n{## 21 ##src/udpcksum/udpwrite.c##\n    struct udpiphdr *ui;## 22 ##src/udpcksum/udpwrite.c##\n    struct ip *ip;## 23 ##src/udpcksum/udpwrite.c##\n\n    /* 4Fill in and checksum UDP header */## 24 ##src/udpcksum/udpwrite.c##\n    ip = (struct ip *) buf;## 25 ##src/udpcksum/udpwrite.c##\n    ui = (struct udpiphdr *) buf;## 26 ##src/udpcksum/udpwrite.c##\n    bzero(ui, sizeof(*ui));## 27 ##src/udpcksum/udpwrite.c##\n    /* 8add 8 to userlen for pseudo-header length */## 28 ##src/udpcksum/udpwrite.c##\n    ui->ui_len = htons((uint16_t) (sizeof(struct udphdr) + userlen));## 29 ##src/udpcksum/udpwrite.c##\n    /* 8then add 28 for IP datagram length */## 30 ##src/udpcksum/udpwrite.c##\n    userlen += sizeof(struct udpiphdr);## 31 ##src/udpcksum/udpwrite.c##\n\n    ui->ui_pr = IPPROTO_UDP;## 32 ##src/udpcksum/udpwrite.c##\n    ui->ui_src.s_addr = ((struct sockaddr_in *) local)->sin_addr.s_addr;## 33 ##src/udpcksum/udpwrite.c##\n    ui->ui_dst.s_addr = ((struct sockaddr_in *) dest)->sin_addr.s_addr;## 34 ##src/udpcksum/udpwrite.c##\n    ui->ui_sport = ((struct sockaddr_in *) local)->sin_port;## 35 ##src/udpcksum/udpwrite.c##\n    ui->ui_dport = ((struct sockaddr_in *) dest)->sin_port;## 36 ##src/udpcksum/udpwrite.c##\n    ui->ui_ulen = ui->ui_len;## 37 ##src/udpcksum/udpwrite.c##\n    if (zerosum == 0) {## 38 ##src/udpcksum/udpwrite.c##\n#if 1                           /* change to if 0 for Solaris 2.x, x < 6 */## 39 ##src/udpcksum/udpwrite.c##\n        if ((ui->ui_sum = in_cksum((u_int16_t *) ui, userlen)) == 0)## 40 ##src/udpcksum/udpwrite.c##\n            ui->ui_sum = 0xffff;## 41 ##src/udpcksum/udpwrite.c##\n#else## 42 ##src/udpcksum/udpwrite.c##\n        ui->ui_sum = ui->ui_len;## 43 ##src/udpcksum/udpwrite.c##\n#endif## 44 ##src/udpcksum/udpwrite.c##\n    }## 45 ##src/udpcksum/udpwrite.c##\n\n    /* 4Fill in rest of IP header; */## 46 ##src/udpcksum/udpwrite.c##\n    /* 4ip_output() calcuates & stores IP header checksum */## 47 ##src/udpcksum/udpwrite.c##\n    ip->ip_v = IPVERSION;## 48 ##src/udpcksum/udpwrite.c##\n    ip->ip_hl = sizeof(struct ip) >> 2;## 49 ##src/udpcksum/udpwrite.c##\n    ip->ip_tos = 0;## 50 ##src/udpcksum/udpwrite.c##\n#if defined(linux) || defined(__OpenBSD__)## 51 ##src/udpcksum/udpwrite.c##\n    ip->ip_len = htons(userlen);    /* network byte order */## 52 ##src/udpcksum/udpwrite.c##\n#else## 53 ##src/udpcksum/udpwrite.c##\n    ip->ip_len = userlen;       /* host byte order */## 54 ##src/udpcksum/udpwrite.c##\n#endif## 55 ##src/udpcksum/udpwrite.c##\n    ip->ip_id = 0;              /* let IP set this */## 56 ##src/udpcksum/udpwrite.c##\n    ip->ip_off = 0;             /* frag offset, MF and DF flags */## 57 ##src/udpcksum/udpwrite.c##\n    ip->ip_ttl = TTL_OUT;## 58 ##src/udpcksum/udpwrite.c##\n\n    Sendto(rawfd, buf, userlen, 0, dest, destlen);## 59 ##src/udpcksum/udpwrite.c##\n}## 60 ##src/udpcksum/udpwrite.c##\n/* end udp_write */\n"
  },
  {
    "path": "udpcliserv/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tudpcli01 udpserv01 udpcli02 udpcli03 udpcli04 \\\n\t\tudpcli06 udpserv06 udpserv07 udpcli08 udpcli09 udpcli10 \\\n\t\tudpservselect01\n\nall:\t${PROGS}\n\nudpcli01:\tudpcli01.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli01.o ${LIBS}\n\nudpserv01:\tudpserv01.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv01.o ${LIBS}\n\nudpcli02:\tudpcli02.o dgcliaddr.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli02.o dgcliaddr.o ${LIBS}\n\nudpcli03:\tudpcli03.o dgcliinetaddr.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli03.o dgcliinetaddr.o ${LIBS}\n\nudpcli04:\tudpcli04.o dgcliconnect.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli04.o dgcliconnect.o ${LIBS}\n\nudpcli06:\tudpcli06.o dgcliloop1.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli06.o dgcliloop1.o ${LIBS}\n\nudpserv06:\tudpserv06.o dgecholoop1.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv06.o dgecholoop1.o ${LIBS}\n\nudpcli07:\tudpcli07.o dgcliloop2.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli07.o dgcliloop2.o ${LIBS}\n\nudpserv07:\tudpserv07.o dgecholoop2.o\n\t\t${CC} ${CFLAGS} -o $@ udpserv07.o dgecholoop2.o ${LIBS}\n\nudpcli08:\tudpcli08.o dgcliloop3.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli08.o dgcliloop3.o ${LIBS}\n\nudpcli09:\tudpcli09.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli09.o ${LIBS}\n\nudpcli10:\tudpcli10.o dgclibig.o\n\t\t${CC} ${CFLAGS} -o $@ udpcli10.o dgclibig.o ${LIBS}\n\nudpservselect01:\tudpservselect01.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ udpservselect01.o sigchldwaitpid.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "udpcliserv/dgcliaddr.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*preply_addr;\n\n\tpreply_addr = Malloc(servlen);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tlen = servlen;\n\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);\n\t\tif (len != servlen || memcmp(pservaddr, preply_addr, len) != 0) {\n\t\t\tprintf(\"reply from %s (ignored)\\n\",\n\t\t\t\t\tSock_ntop(preply_addr, len));\n\t\t\tcontinue;\n\t\t}\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "udpcliserv/dgclibig.c",
    "content": "#include\t\"unp.h\"\n\n#undef\tMAXLINE\n#define\tMAXLINE 65507\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\tsize;\n\tchar\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tssize_t\t\tn;\n\n\tsize = 70000;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));\n\tSetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));\n\n\tSendto(sockfd, sendline, MAXLINE, 0, pservaddr, servlen);\n\n\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);\n\n\tprintf(\"received %d bytes\\n\", n);\n}\n"
  },
  {
    "path": "udpcliserv/dgclibig.lc",
    "content": "#include    \"unp.h\"##  1 ##src/udpcliserv/dgclibig.c##\n\n#undef  MAXLINE##  2 ##src/udpcliserv/dgclibig.c##\n#define MAXLINE 65507##  3 ##src/udpcliserv/dgclibig.c##\n\nvoid##  4 ##src/udpcliserv/dgclibig.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  5 ##src/udpcliserv/dgclibig.c##\n{##  6 ##src/udpcliserv/dgclibig.c##\n    int     size;##  7 ##src/udpcliserv/dgclibig.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  8 ##src/udpcliserv/dgclibig.c##\n    ssize_t n;##  9 ##src/udpcliserv/dgclibig.c##\n\n    size = 70000;## 10 ##src/udpcliserv/dgclibig.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));## 11 ##src/udpcliserv/dgclibig.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));## 12 ##src/udpcliserv/dgclibig.c##\n\n    Sendto(sockfd, sendline, MAXLINE, 0, pservaddr, servlen);## 13 ##src/udpcliserv/dgclibig.c##\n\n    n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);## 14 ##src/udpcliserv/dgclibig.c##\n\n    printf(\"received %d bytes\\n\", n);## 15 ##src/udpcliserv/dgclibig.c##\n}## 16 ##src/udpcliserv/dgclibig.c##\n"
  },
  {
    "path": "udpcliserv/dgcliconnect.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\tn;\n\tchar\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\n\tConnect(sockfd, (SA *) pservaddr, servlen);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tWrite(sockfd, sendline, strlen(sendline));\n\n\t\tn = Read(sockfd, recvline, MAXLINE);\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "udpcliserv/dgcliconnect.lc",
    "content": "#include    \"unp.h\"##  1 ##src/udpcliserv/dgcliconnect.c##\n\nvoid##  2 ##src/udpcliserv/dgcliconnect.c##\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)##  3 ##src/udpcliserv/dgcliconnect.c##\n{##  4 ##src/udpcliserv/dgcliconnect.c##\n    int     n;##  5 ##src/udpcliserv/dgcliconnect.c##\n    char    sendline[MAXLINE], recvline[MAXLINE + 1];##  6 ##src/udpcliserv/dgcliconnect.c##\n\n    Connect(sockfd, (SA *) pservaddr, servlen);##  7 ##src/udpcliserv/dgcliconnect.c##\n\n    while (Fgets(sendline, MAXLINE, fp) != NULL) {##  8 ##src/udpcliserv/dgcliconnect.c##\n\n        Write(sockfd, sendline, strlen(sendline));##  9 ##src/udpcliserv/dgcliconnect.c##\n\n        n = Read(sockfd, recvline, MAXLINE);## 10 ##src/udpcliserv/dgcliconnect.c##\n\n        recvline[n] = 0;        /* null terminate */## 11 ##src/udpcliserv/dgcliconnect.c##\n        Fputs(recvline, stdout);## 12 ##src/udpcliserv/dgcliconnect.c##\n    }## 13 ##src/udpcliserv/dgcliconnect.c##\n}## 14 ##src/udpcliserv/dgcliconnect.c##\n"
  },
  {
    "path": "udpcliserv/dgcliinetaddr.c",
    "content": "#include\t\"unp.h\"\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\t\t\tn;\n\tchar\t\t\tsendline[MAXLINE], recvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr_in\t*replyaddr;\n\n\treplyaddr = Malloc(servlen);\n\n\twhile (Fgets(sendline, MAXLINE, fp) != NULL) {\n\n\t\tSendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);\n\n\t\tlen = servlen;\n\t\tn = Recvfrom(sockfd, recvline, MAXLINE, 0, (SA *) replyaddr, &len);\n\t\tprintf(\"received reply from %s, port %d\\n\",\n\t\t\t   inet_ntoa(replyaddr->sin_addr), htons(replyaddr->sin_port));\n\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tFputs(recvline, stdout);\n\t}\n}\n"
  },
  {
    "path": "udpcliserv/dgcliloop1.c",
    "content": "#include\t\"unp.h\"\n\n#define\tNDG\t\t2000\t/* datagrams to send */\n#define\tDGLEN\t1400\t/* length of each datagram */\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\ti;\n\tchar\tsendline[DGLEN];\n\n\tfor (i = 0; i < NDG; i++) {\n\t\tSendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);\n\t}\n}\n"
  },
  {
    "path": "udpcliserv/dgcliloop3.c",
    "content": "#include\t\"unp.h\"\n\n/* Try and get ENOBUFS from sendto() by sending huge datagrams.\n   But I still cannot get the error. */\n\n#define\tNDG\t\t 2000\t/* datagrams to send */\n#define\tDGLEN\t65507\t/* length of each datagram */\n\nvoid\ndg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)\n{\n\tint\t\ti, n;\n\tchar\tsendline[DGLEN];\n\n\tn = 100 * 1024;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &n, sizeof(n));\n\n\tfor (i = 0; i < NDG; i++) {\n\t\tSendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);\n\t}\n}\n"
  },
  {
    "path": "udpcliserv/dgecholoop1.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_int(int);\nstatic int\tcount;\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tsocklen_t\tlen;\n\tchar\t\tmesg[MAXLINE];\n\n\tSignal(SIGINT, recvfrom_int);\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tRecvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);\n\n\t\tcount++;\n\t}\n}\n\nstatic void\nrecvfrom_int(int signo)\n{\n\tprintf(\"\\nreceived %d datagrams\\n\", count);\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/dgecholoop2.c",
    "content": "#include\t\"unp.h\"\n\nstatic void\trecvfrom_int(int);\nstatic int\tcount;\n\nvoid\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)\n{\n\tint\t\t\tn;\n\tsocklen_t\tlen;\n\tchar\t\tmesg[MAXLINE];\n\n\tSignal(SIGINT, recvfrom_int);\n\n\tn = 220 * 1024;\n\tSetsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));\n\n\tfor ( ; ; ) {\n\t\tlen = clilen;\n\t\tRecvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);\n\n\t\tcount++;\n\t}\n}\n\nstatic void\nrecvfrom_int(int signo)\n{\n\tprintf(\"\\nreceived %d datagrams\\n\", count);\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/dgecholoop2.lc",
    "content": "#include    \"unp.h\"##  1 ##src/udpcliserv/dgecholoop2.c##\n\nstatic void recvfrom_int(int);##  2 ##src/udpcliserv/dgecholoop2.c##\nstatic int count;##  3 ##src/udpcliserv/dgecholoop2.c##\n\nvoid##  4 ##src/udpcliserv/dgecholoop2.c##\ndg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)##  5 ##src/udpcliserv/dgecholoop2.c##\n{##  6 ##src/udpcliserv/dgecholoop2.c##\n    int     n;##  7 ##src/udpcliserv/dgecholoop2.c##\n    socklen_t len;##  8 ##src/udpcliserv/dgecholoop2.c##\n    char    mesg[MAXLINE];##  9 ##src/udpcliserv/dgecholoop2.c##\n\n    Signal(SIGINT, recvfrom_int);## 10 ##src/udpcliserv/dgecholoop2.c##\n\n    n = 240 * 1024;## 11 ##src/udpcliserv/dgecholoop2.c##\n    Setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));## 12 ##src/udpcliserv/dgecholoop2.c##\n\n    for (;;) {## 13 ##src/udpcliserv/dgecholoop2.c##\n        len = clilen;## 14 ##src/udpcliserv/dgecholoop2.c##\n        Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);## 15 ##src/udpcliserv/dgecholoop2.c##\n\n        count++;## 16 ##src/udpcliserv/dgecholoop2.c##\n    }## 17 ##src/udpcliserv/dgecholoop2.c##\n}## 18 ##src/udpcliserv/dgecholoop2.c##\n\nstatic void## 19 ##src/udpcliserv/dgecholoop2.c##\nrecvfrom_int(int signo)## 20 ##src/udpcliserv/dgecholoop2.c##\n{## 21 ##src/udpcliserv/dgecholoop2.c##\n    printf(\"\\nreceived %d datagrams\\n\", count);## 22 ##src/udpcliserv/dgecholoop2.c##\n    exit(0);## 23 ##src/udpcliserv/dgecholoop2.c##\n}## 24 ##src/udpcliserv/dgecholoop2.c##\n"
  },
  {
    "path": "udpcliserv/sigchldwaitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)\n\t\tprintf(\"child %d terminated\\n\", pid);\n\treturn;\n}\n"
  },
  {
    "path": "udpcliserv/udpcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n#ifdef\tHAVE_SOCKADDR_SA_LEN\n\tservaddr.sin_len = sizeof(servaddr);\n#endif\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli03.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(7);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli04.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli05.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&cliaddr, sizeof(cliaddr));\n\tcliaddr.sin_family = AF_INET;\n\tcliaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tcliaddr.sin_port = htons(0); /* force assignment of ephemeral port */\n\tBind(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli08.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(9);\t\t/* discard server */\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli09.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: udpcli <IPaddress>\");\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family = AF_INET;\n\tservaddr.sin_port = htons(SERV_PORT);\n\tInet_pton(AF_INET, argv[1], &servaddr.sin_addr);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tlen = sizeof(cliaddr);\n\tGetsockname(sockfd, (SA *) &cliaddr, &len);\n\tprintf(\"local address %s\\n\", Sock_ntop((SA *) &cliaddr, len));\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpcli10.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tsocklen_t\t\t\tsalen;\n\tstruct sockaddr\t\t*sa;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: udpcli02 <hostname> <service>\");\n\n\tsockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);\n\n\tdg_cli(stdin, sockfd, sa, salen);\n\n\texit(0);\n}\n"
  },
  {
    "path": "udpcliserv/udpserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "udpcliserv/udpserv06.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "udpcliserv/udpserv07.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_in\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "udpcliserv/udpservselect01.c",
    "content": "/* include udpservselect01 */\n#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd, udpfd, nready, maxfdp1;\n\tchar\t\t\t\tmesg[MAXLINE];\n\tpid_t\t\t\t\tchildpid;\n\tfd_set\t\t\t\trset;\n\tssize_t\t\t\t\tn;\n\tsocklen_t\t\t\tlen;\n\tconst int\t\t\ton = 1;\n\tstruct sockaddr_in\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\t\t/* 4create listening TCP socket */\n\tlistenfd = Socket(AF_INET, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tSetsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\t\t/* 4create UDP socket */\n\tudpfd = Socket(AF_INET, SOCK_DGRAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sin_family      = AF_INET;\n\tservaddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tservaddr.sin_port        = htons(SERV_PORT);\n\n\tBind(udpfd, (SA *) &servaddr, sizeof(servaddr));\n/* end udpservselect01 */\n\n/* include udpservselect02 */\n\tSignal(SIGCHLD, sig_chld);\t/* must call waitpid() */\n\n\tFD_ZERO(&rset);\n\tmaxfdp1 = max(listenfd, udpfd) + 1;\n\tfor ( ; ; ) {\n\t\tFD_SET(listenfd, &rset);\n\t\tFD_SET(udpfd, &rset);\n\t\tif ( (nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"select error\");\n\t\t}\n\n\t\tif (FD_ISSET(listenfd, &rset)) {\n\t\t\tlen = sizeof(cliaddr);\n\t\t\tconnfd = Accept(listenfd, (SA *) &cliaddr, &len);\n\t\n\t\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\t\texit(0);\n\t\t\t}\n\t\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t\t}\n\n\t\tif (FD_ISSET(udpfd, &rset)) {\n\t\t\tlen = sizeof(cliaddr);\n\t\t\tn = Recvfrom(udpfd, mesg, MAXLINE, 0, (SA *) &cliaddr, &len);\n\n\t\t\tSendto(udpfd, mesg, n, 0, (SA *) &cliaddr, len);\n\t\t}\n\t}\n}\n/* end udpservselect02 */\n"
  },
  {
    "path": "udpcliserv/udpservselect01.lc",
    "content": "/* include udpservselect01 */\n#include    \"unp.h\"##  1 ##src/udpcliserv/udpservselect01.c##\n\nint##  2 ##src/udpcliserv/udpservselect01.c##\nmain(int argc, char **argv)##  3 ##src/udpcliserv/udpservselect01.c##\n{##  4 ##src/udpcliserv/udpservselect01.c##\n    int     listenfd, connfd, udpfd, nready, maxfdp1;##  5 ##src/udpcliserv/udpservselect01.c##\n    char    mesg[MAXLINE];##  6 ##src/udpcliserv/udpservselect01.c##\n    pid_t   childpid;##  7 ##src/udpcliserv/udpservselect01.c##\n    fd_set  rset;##  8 ##src/udpcliserv/udpservselect01.c##\n    ssize_t n;##  9 ##src/udpcliserv/udpservselect01.c##\n    socklen_t len;## 10 ##src/udpcliserv/udpservselect01.c##\n    const int on = 1;## 11 ##src/udpcliserv/udpservselect01.c##\n    struct sockaddr_in cliaddr, servaddr;## 12 ##src/udpcliserv/udpservselect01.c##\n    void    sig_chld(int);## 13 ##src/udpcliserv/udpservselect01.c##\n\n    /* 4create listening TCP socket */## 14 ##src/udpcliserv/udpservselect01.c##\n    listenfd = Socket(AF_INET, SOCK_STREAM, 0);## 15 ##src/udpcliserv/udpservselect01.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 16 ##src/udpcliserv/udpservselect01.c##\n    servaddr.sin_family = AF_INET;## 17 ##src/udpcliserv/udpservselect01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 18 ##src/udpcliserv/udpservselect01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 19 ##src/udpcliserv/udpservselect01.c##\n\n    Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));## 20 ##src/udpcliserv/udpservselect01.c##\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 21 ##src/udpcliserv/udpservselect01.c##\n\n    Listen(listenfd, LISTENQ);## 22 ##src/udpcliserv/udpservselect01.c##\n\n    /* 4create UDP socket */## 23 ##src/udpcliserv/udpservselect01.c##\n    udpfd = Socket(AF_INET, SOCK_DGRAM, 0);## 24 ##src/udpcliserv/udpservselect01.c##\n\n    bzero(&servaddr, sizeof(servaddr));## 25 ##src/udpcliserv/udpservselect01.c##\n    servaddr.sin_family = AF_INET;## 26 ##src/udpcliserv/udpservselect01.c##\n    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);## 27 ##src/udpcliserv/udpservselect01.c##\n    servaddr.sin_port = htons(SERV_PORT);## 28 ##src/udpcliserv/udpservselect01.c##\n\n    Bind(udpfd, (SA *) &servaddr, sizeof(servaddr));## 29 ##src/udpcliserv/udpservselect01.c##\n/* end udpservselect01 */\n\n/* include udpservselect02 */\n    Signal(SIGCHLD, sig_chld);  /* must call waitpid() */## 30 ##src/udpcliserv/udpservselect01.c##\n\n    FD_ZERO(&rset);## 31 ##src/udpcliserv/udpservselect01.c##\n    maxfdp1 = max(listenfd, udpfd) + 1;## 32 ##src/udpcliserv/udpservselect01.c##\n    for (;;) {## 33 ##src/udpcliserv/udpservselect01.c##\n        FD_SET(listenfd, &rset);## 34 ##src/udpcliserv/udpservselect01.c##\n        FD_SET(udpfd, &rset);## 35 ##src/udpcliserv/udpservselect01.c##\n        if ((nready = select(maxfdp1, &rset, NULL, NULL, NULL)) < 0) {## 36 ##src/udpcliserv/udpservselect01.c##\n            if (errno == EINTR)## 37 ##src/udpcliserv/udpservselect01.c##\n                continue;       /* back to for() */## 38 ##src/udpcliserv/udpservselect01.c##\n            else## 39 ##src/udpcliserv/udpservselect01.c##\n                err_sys(\"select error\");## 40 ##src/udpcliserv/udpservselect01.c##\n        }## 41 ##src/udpcliserv/udpservselect01.c##\n\n        if (FD_ISSET(listenfd, &rset)) {## 42 ##src/udpcliserv/udpservselect01.c##\n            len = sizeof(cliaddr);## 43 ##src/udpcliserv/udpservselect01.c##\n            connfd = Accept(listenfd, (SA *) &cliaddr, &len);## 44 ##src/udpcliserv/udpservselect01.c##\n\n            if ((childpid = Fork()) == 0) { /* child process */## 45 ##src/udpcliserv/udpservselect01.c##\n                Close(listenfd);    /* close listening socket */## 46 ##src/udpcliserv/udpservselect01.c##\n                str_echo(connfd);   /* process the request */## 47 ##src/udpcliserv/udpservselect01.c##\n                exit(0);## 48 ##src/udpcliserv/udpservselect01.c##\n            }## 49 ##src/udpcliserv/udpservselect01.c##\n            Close(connfd);      /* parent closes connected socket */## 50 ##src/udpcliserv/udpservselect01.c##\n        }## 51 ##src/udpcliserv/udpservselect01.c##\n\n        if (FD_ISSET(udpfd, &rset)) {## 52 ##src/udpcliserv/udpservselect01.c##\n            len = sizeof(cliaddr);## 53 ##src/udpcliserv/udpservselect01.c##\n            n = Recvfrom(udpfd, mesg, MAXLINE, 0, (SA *) &cliaddr, &len);## 54 ##src/udpcliserv/udpservselect01.c##\n\n            Sendto(udpfd, mesg, n, 0, (SA *) &cliaddr, len);## 55 ##src/udpcliserv/udpservselect01.c##\n        }## 56 ##src/udpcliserv/udpservselect01.c##\n    }## 57 ##src/udpcliserv/udpservselect01.c##\n}## 58 ##src/udpcliserv/udpservselect01.c##\n/* end udpservselect02 */\n"
  },
  {
    "path": "unixdomain/Makefile",
    "content": "include ../Make.defines\n\nPROGS =\tdaytimetcpcli daytimetcpsrv2 mycat openfile \\\n\ttfcred01 unixbind unixstrcli01 unixstrserv01 unixstrserv02\n\nall:\t${PROGS}\n\ndaytimetcpcli:\tdaytimetcpcli.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpcli.o ${LIBS}\n\ndaytimetcpsrv2:\tdaytimetcpsrv2.o\n\t\t${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}\n\nmycat:\t\tmycat.o myopen.o\n\t\t${CC} ${CFLAGS} -o $@ mycat.o myopen.o ${LIBS}\n\nopenfile:\topenfile.o\n\t\t${CC} ${CFLAGS} -o $@ openfile.o ${LIBS}\n\ntfcred01:\ttfcred01.o\n\t\t${CC} ${CFLAGS} -o $@ tfcred01.o ${LIBS}\n\nunixbind:\tunixbind.o\n\t\t${CC} ${CFLAGS} -o $@ unixbind.o ${LIBS}\n\nunixdgcli01:\tunixdgcli01.o\n\t\t${CC} ${CFLAGS} -o $@ unixdgcli01.o ${LIBS}\n\nunixdgserv01:\tunixdgserv01.o\n\t\t${CC} ${CFLAGS} -o $@ unixdgserv01.o ${LIBS}\n\nunixstrcli01:\tunixstrcli01.o\n\t\t${CC} ${CFLAGS} -o $@ unixstrcli01.o ${LIBS}\n\nunixstrserv01:\tunixstrserv01.o sigchldwaitpid.o\n\t\t${CC} ${CFLAGS} -o $@ unixstrserv01.o sigchldwaitpid.o ${LIBS}\n\nunixstrserv02:\tunixstrserv02.o strecho.o sigchldwaitpid.o readcred.o\n\t\t${CC} ${CFLAGS} -o $@ unixstrserv02.o strecho.o sigchldwaitpid.o \\\n\t\t\t\treadcred.o ${LIBS}\n\nclean:\n\t\trm -f ${PROGS} ${CLEANFILES}\n"
  },
  {
    "path": "unixdomain/daytimetcpcli.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\tsockfd, n;\n\tchar\t\t\trecvline[MAXLINE + 1];\n\tsocklen_t\t\tlen;\n\tstruct sockaddr\t*sa;\n\n\tif (argc != 3)\n\t\terr_quit(\"usage: daytimetcpcli <hostname/IPaddress> <service/port#>\");\n\n\tsockfd = Tcp_connect(argv[1], argv[2]);\n\n\tsa = Malloc(sizeof(struct sockaddr_storage));\n\tlen = sizeof(struct sockaddr_storage);\n\tGetpeername(sockfd, sa, &len);\n\tprintf(\"connected to %s\\n\", Sock_ntop_host(sa, len));\n\tsleep(5);\n\n\twhile ( (n = Read(sockfd, recvline, MAXLINE)) > 0) {\n\t\trecvline[n] = 0;\t/* null terminate */\n\t\tprintf(\"%d bytes: %s\", n, recvline);\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/daytimetcpsrv2.c",
    "content": "#include\t\"unp.h\"\n#include\t<time.h>\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\ti, listenfd, connfd;\n\tsocklen_t\t\taddrlen, len;\n\tstruct sockaddr\t*cliaddr;\n\tchar\t\t\tbuff[MAXLINE];\n\ttime_t\t\t\tticks;\n\n\tif (argc == 2)\n\t\tlistenfd = Tcp_listen(NULL, argv[1], &addrlen);\n\telse if (argc == 3)\n\t\tlistenfd = Tcp_listen(argv[1], argv[2], &addrlen);\n\telse\n\t\terr_quit(\"usage: daytimetcpsrv2 [ <host> ] <service or port>\");\n\n\tcliaddr = Malloc(addrlen);\n\n\tfor ( ; ; ) {\n\t\tlen = addrlen;\n\t\tconnfd = Accept(listenfd, cliaddr, &len);\n\t\tprintf(\"connection from %s\\n\", Sock_ntop(cliaddr, len));\n\n        ticks = time(NULL);\n        snprintf(buff, sizeof(buff), \"%.24s\\r\\n\", ctime(&ticks));\n\t\tfor (i = 0; i < strlen(buff); i++)\n        \tSend(connfd, &buff[i], 1, MSG_EOR);\n\n\t\tClose(connfd);\n\t}\n}\n"
  },
  {
    "path": "unixdomain/mycat.c",
    "content": "#include\t\"unp.h\"\n\nint\t\tmy_open(const char *, int);\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tfd, n;\n\tchar\tbuff[BUFFSIZE];\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: mycat <pathname>\");\n\n\tif ( (fd = my_open(argv[1], O_RDONLY)) < 0)\n\t\terr_sys(\"cannot open %s\", argv[1]);\n\n\twhile ( (n = Read(fd, buff, BUFFSIZE)) > 0)\n\t\tWrite(STDOUT_FILENO, buff, n);\n\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/mycat.lc",
    "content": "#include    \"unp.h\"##  1 ##src/unixdomain/mycat.c##\n\nint     my_open(const char *, int);##  2 ##src/unixdomain/mycat.c##\n\nint##  3 ##src/unixdomain/mycat.c##\nmain(int argc, char **argv)##  4 ##src/unixdomain/mycat.c##\n{##  5 ##src/unixdomain/mycat.c##\n    int     fd, n;##  6 ##src/unixdomain/mycat.c##\n    char    buff[BUFFSIZE];##  7 ##src/unixdomain/mycat.c##\n\n    if (argc != 2)##  8 ##src/unixdomain/mycat.c##\n        err_quit(\"usage: mycat <pathname>\");##  9 ##src/unixdomain/mycat.c##\n\n    if ((fd = my_open(argv[1], O_RDONLY)) < 0)## 10 ##src/unixdomain/mycat.c##\n        err_sys(\"cannot open %s\", argv[1]);## 11 ##src/unixdomain/mycat.c##\n\n    while ((n = Read(fd, buff, BUFFSIZE)) > 0)## 12 ##src/unixdomain/mycat.c##\n        Write(STDOUT_FILENO, buff, n);## 13 ##src/unixdomain/mycat.c##\n\n    exit(0);## 14 ##src/unixdomain/mycat.c##\n}## 15 ##src/unixdomain/mycat.c##\n"
  },
  {
    "path": "unixdomain/myopen.c",
    "content": "#include\t\"unp.h\"\n\nint\nmy_open(const char *pathname, int mode)\n{\n\tint\t\t\tfd, sockfd[2], status;\n\tpid_t\t\tchildpid;\n\tchar\t\tc, argsockfd[10], argmode[10];\n\n\tSocketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);\n\n\tif ( (childpid = Fork()) == 0) {\t\t/* child process */\n\t\tClose(sockfd[0]);\n\t\tsnprintf(argsockfd, sizeof(argsockfd), \"%d\", sockfd[1]);\n\t\tsnprintf(argmode, sizeof(argmode), \"%d\", mode);\n\t\texecl(\"./openfile\", \"openfile\", argsockfd, pathname, argmode,\n\t\t\t  (char *) NULL);\n\t\terr_sys(\"execl error\");\n\t}\n\n\t/* parent process - wait for the child to terminate */\n\tClose(sockfd[1]);\t\t\t/* close the end we don't use */\n\n\tWaitpid(childpid, &status, 0);\n\tif (WIFEXITED(status) == 0)\n\t\terr_quit(\"child did not terminate\");\n\tif ( (status = WEXITSTATUS(status)) == 0)\n\t\tRead_fd(sockfd[0], &c, 1, &fd);\n\telse {\n\t\terrno = status;\t\t/* set errno value from child's status */\n\t\tfd = -1;\n\t}\n\n\tClose(sockfd[0]);\n\treturn(fd);\n}\n"
  },
  {
    "path": "unixdomain/openfile.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\tfd;\n\n\tif (argc != 4)\n\t\terr_quit(\"openfile <sockfd#> <filename> <mode>\");\n\n\tif ( (fd = open(argv[2], atoi(argv[3]))) < 0)\n\t\texit( (errno > 0) ? errno : 255 );\n\n\tif (write_fd(atoi(argv[1]), \"\", 1, fd) < 0)\n\t\texit( (errno > 0) ? errno : 255 );\n\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/readcred.c",
    "content": "#include\t\"unp.h\"\n\n#define\tCONTROL_LEN\t(sizeof(struct cmsghdr) + sizeof(struct cmsgcred))\n\nssize_t\nread_cred(int fd, void *ptr, size_t nbytes, struct cmsgcred *cmsgcredptr)\n{\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov[1];\n\tchar\t\t\tcontrol[CONTROL_LEN];\n\tint\t\t\t\tn;\n\n\tmsg.msg_name = NULL;\n\tmsg.msg_namelen = 0;\n\tiov[0].iov_base = ptr;\n\tiov[0].iov_len = nbytes;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\tmsg.msg_control = control;\n\tmsg.msg_controllen = sizeof(control);\n\tmsg.msg_flags = 0;\n\n\tif ( (n = recvmsg(fd, &msg, 0)) < 0)\n\t\treturn(n);\n\n\tcmsgcredptr->cmcred_ngroups = 0;\t/* indicates no credentials returned */\n\tif (cmsgcredptr && msg.msg_controllen > 0) {\n\t\tstruct cmsghdr\t*cmptr = (struct cmsghdr *) control;\n\n\t\tif (cmptr->cmsg_len < CONTROL_LEN)\n\t\t\terr_quit(\"control length = %d\", cmptr->cmsg_len);\n\t\tif (cmptr->cmsg_level != SOL_SOCKET)\n\t\t\terr_quit(\"control level != SOL_SOCKET\");\n\t\tif (cmptr->cmsg_type != SCM_CREDS)\n\t\t\terr_quit(\"control type != SCM_CREDS\");\n\t\tmemcpy(cmsgcredptr, CMSG_DATA(cmptr), sizeof(struct cmsgcred));\n\t}\n\n\treturn(n);\n}\n"
  },
  {
    "path": "unixdomain/sigchldwaitpid.c",
    "content": "#include\t\"unp.h\"\n\nvoid\nsig_chld(int signo)\n{\n\tpid_t\tpid;\n\tint\t\tstat;\n\n\twhile ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {\n\t\tprintf(\"child %d terminated\\n\", pid);\n\t}\n\treturn;\n}\n"
  },
  {
    "path": "unixdomain/strecho.c",
    "content": "#include\t\"unp.h\"\n\nssize_t\tread_cred(int, void *, size_t, struct cmsgcred *);\n\nvoid\nstr_echo(int sockfd)\n{\n\tssize_t\t\t\tn;\n\tint\t\t\ti;\n\tchar\t\t\tbuf[MAXLINE];\n\tstruct cmsgcred\tcred;\n\nagain:\n\twhile ( (n = read_cred(sockfd, buf, MAXLINE, &cred)) > 0) {\n\t\tif (cred.cmcred_ngroups == 0) {\n\t\t\tprintf(\"(no credentials returned)\\n\");\n\t\t} else {\n\t\t\tprintf(\"PID of sender = %d\\n\", cred.cmcred_pid);\n\t\t\tprintf(\"real user ID = %d\\n\", cred.cmcred_uid);\n\t\t\tprintf(\"real group ID = %d\\n\", cred.cmcred_gid);\n\t\t\tprintf(\"effective user ID = %d\\n\", cred.cmcred_euid);\n\t\t\tprintf(\"%d groups:\", cred.cmcred_ngroups - 1);\n\t\t\tfor (i = 1; i < cred.cmcred_ngroups; i++)\n\t\t\t\tprintf(\" %d\", cred.cmcred_groups[i]);\n\t\t\tprintf(\"\\n\");\n\t\t}\n\t\tWriten(sockfd, buf, n);\n\t}\n\n\tif (n < 0 && errno == EINTR)\n\t\tgoto again;\n\telse if (n < 0)\n\t\terr_sys(\"str_echo: read error\");\n}\n"
  },
  {
    "path": "unixdomain/testfcred.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/param.h>\n#include\t<sys/ucred.h>\n\nmain()\n{\n\tprintf(\"sizeof(struct fcred) = %d\\n\", sizeof(struct fcred));\n\tprintf(\"sizeof(struct cmsghdr) = %d\\n\", sizeof(struct cmsghdr));\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/tfcred01.c",
    "content": "#include\t\"unp.h\"\n#include\t<sys/param.h>\n#include\t<sys/ucred.h>\n\nssize_t\trecv_cred(int, void *, size_t, struct fcred *);\n\nmain()\n{\n\tint\t\t\t\tfd[2], on, n;\n\tchar\t\t\tbuf[100];\n\tstruct fcred\tcred;\n\n\tif (socketpair(AF_LOCAL, SOCK_STREAM, 0, fd) < 0)\n\t\terr_sys(\"socketpair error\");\n\n\t\t/* must set the socket option on the *receiving* socket */\n\ton = 1;\n\tSetsockopt(fd[1], 0, LOCAL_CREDS, &on, sizeof(on));\n\n\tWrite(fd[0], \"hello, world\\n\", 13);\n\n\tif ( (n = recv_cred(fd[1], buf, sizeof(buf), &cred)) < 0)\n\t\terr_sys(\"recv_cred error\");\n\telse if (n == 0)\n\t\terr_quit(\"recv_cred, unexpected EOF\");\n\n\tbuf[n] = 0;\t\t\t/* null terminate */\n\tprintf(\"data: %s\", buf);\n\n\tif (cred.fc_ngroups == 0)\n\t\tprintf(\"(no credentials returned)\\n\");\n\telse {\n\t\tprintf(\"real user ID = %d\\n\", cred.fc_ruid);\n\t\tprintf(\"real group ID = %d\\n\", cred.fc_rgid);\n\t\tprintf(\"login name = %-*s\\n\", MAXLOGNAME, cred.fc_login);\n\t\tprintf(\"effective user ID = %d\\n\", cred.fc_uid);\n\t\tprintf(\"effective group ID = %d\\n\", cred.fc_gid);\n\t\tprintf(\"%d supplementary groups:\", cred.fc_ngroups - 1);\n\t\tfor (n = 1; n < cred.fc_ngroups; n++)\t/* [0] is the egid */\n\t\t\tprintf(\" %d\", cred.fc_groups[n]);\n\t\tprintf(\"\\n\");\n\t}\n\n\texit(0);\n}\n\n#define\tCONTROL_LEN\t(sizeof(struct cmsghdr) + sizeof(struct fcred))\n\nssize_t\nrecv_cred(int fd, void *ptr, size_t nbytes, struct fcred *fcredptr)\n{\n\tstruct msghdr\tmsg;\n\tstruct iovec\tiov[1];\n\tchar\t\t\tcontrol[CONTROL_LEN + 20];\n\tint\t\t\t\tn;\n\n\tmsg.msg_name = NULL;\n\tmsg.msg_namelen = 0;\n\tiov[0].iov_base = ptr;\n\tiov[0].iov_len = nbytes;\n\tmsg.msg_iov = iov;\n\tmsg.msg_iovlen = 1;\n\tmsg.msg_control = control;\n\tmsg.msg_controllen = sizeof(control);\n\tmsg.msg_flags = 0;\n\n\tif ( (n = recvmsg(fd, &msg, 0)) < 0)\n\t\treturn(n);\n\n\tfcredptr->fc_ngroups = 0;\t/* indicates no credentials returned */\n\tif (fcredptr && msg.msg_controllen > 0) {\n\t\tstruct cmsghdr\t*cmptr = (struct cmsghdr *) control;\n\n\t\tif (cmptr->cmsg_len != sizeof(struct cmsghdr) + sizeof(struct fcred))\n\t\t\terr_quit(\"control length = %d\", cmptr->cmsg_len);\n\t\tif (cmptr->cmsg_level != SOL_SOCKET)\n\t\t\terr_quit(\"control level != SOL_SOCKET\");\n\t\tif (cmptr->cmsg_type != SCM_CREDS)\n\t\t\terr_quit(\"control type != SCM_CREDS\");\n\t\tmemcpy(fcredptr, CMSG_DATA(cmptr), sizeof(struct fcred));\n\t}\n\n\treturn(n);\n}\n"
  },
  {
    "path": "unixdomain/unixbind.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tsocklen_t\t\t\tlen;\n\tstruct sockaddr_un\taddr1, addr2;\n\n\tif (argc != 2)\n\t\terr_quit(\"usage: unixbind <pathname>\");\n\n\tsockfd = Socket(AF_LOCAL, SOCK_STREAM, 0);\n\n\tunlink(argv[1]);\t\t/* OK if this fails */\n\n\tbzero(&addr1, sizeof(addr1));\n\taddr1.sun_family = AF_LOCAL;\n\tstrncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path)-1);\n\tBind(sockfd, (SA *) &addr1, SUN_LEN(&addr1));\n\n\tlen = sizeof(addr2);\n\tGetsockname(sockfd, (SA *) &addr2, &len);\n\tprintf(\"bound name = %s, returned len = %d\\n\", addr2.sun_path, len);\n\t\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/unixbind.lc",
    "content": "#include    \"unp.h\"##  1 ##src/unixdomain/unixbind.c##\n\nint##  2 ##src/unixdomain/unixbind.c##\nmain(int argc, char **argv)##  3 ##src/unixdomain/unixbind.c##\n{##  4 ##src/unixdomain/unixbind.c##\n    int     sockfd;##  5 ##src/unixdomain/unixbind.c##\n    socklen_t len;##  6 ##src/unixdomain/unixbind.c##\n    struct sockaddr_un addr1, addr2;##  7 ##src/unixdomain/unixbind.c##\n\n    if (argc != 2)##  8 ##src/unixdomain/unixbind.c##\n        err_quit(\"usage: unixbind <pathname>\");##  9 ##src/unixdomain/unixbind.c##\n\n    sockfd = Socket(AF_LOCAL, SOCK_STREAM, 0);## 10 ##src/unixdomain/unixbind.c##\n\n    unlink(argv[1]);            /* OK if this fails */## 11 ##src/unixdomain/unixbind.c##\n\n    bzero(&addr1, sizeof(addr1));## 12 ##src/unixdomain/unixbind.c##\n    addr1.sun_family = AF_LOCAL;## 13 ##src/unixdomain/unixbind.c##\n    strncpy(addr1.sun_path, argv[1], sizeof(addr1.sun_path) - 1);## 14 ##src/unixdomain/unixbind.c##\n    Bind(sockfd, (SA *) &addr1, SUN_LEN(&addr1));## 15 ##src/unixdomain/unixbind.c##\n\n    len = sizeof(addr2);## 16 ##src/unixdomain/unixbind.c##\n    Getsockname(sockfd, (SA *) &addr2, &len);## 17 ##src/unixdomain/unixbind.c##\n    printf(\"bound name = %s, returned len = %d\\n\", addr2.sun_path, len);## 18 ##src/unixdomain/unixbind.c##\n\n    exit(0);## 19 ##src/unixdomain/unixbind.c##\n}## 20 ##src/unixdomain/unixbind.c##\n"
  },
  {
    "path": "unixdomain/unixdgcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_un\tcliaddr, servaddr;\n\n\tsockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);\n\n\tbzero(&cliaddr, sizeof(cliaddr));\t\t/* bind an address for us */\n\tcliaddr.sun_family = AF_LOCAL;\n\tstrcpy(cliaddr.sun_path, tmpnam(NULL));\n\n\tBind(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n\n\tbzero(&servaddr, sizeof(servaddr));\t/* fill in server's address */\n\tservaddr.sun_family = AF_LOCAL;\n\tstrcpy(servaddr.sun_path, UNIXDG_PATH);\n\n\tdg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/unixdgcli01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/unixdomain/unixdgcli01.c##\n\nint##  2 ##src/unixdomain/unixdgcli01.c##\nmain(int argc, char **argv)##  3 ##src/unixdomain/unixdgcli01.c##\n{##  4 ##src/unixdomain/unixdgcli01.c##\n    int     sockfd;##  5 ##src/unixdomain/unixdgcli01.c##\n    struct sockaddr_un cliaddr, servaddr;##  6 ##src/unixdomain/unixdgcli01.c##\n\n    sockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);##  7 ##src/unixdomain/unixdgcli01.c##\n\n    bzero(&cliaddr, sizeof(cliaddr));   /* bind an address for us */##  8 ##src/unixdomain/unixdgcli01.c##\n    cliaddr.sun_family = AF_LOCAL;##  9 ##src/unixdomain/unixdgcli01.c##\n    strcpy(cliaddr.sun_path, tmpnam(NULL));## 10 ##src/unixdomain/unixdgcli01.c##\n\n    Bind(sockfd, (SA *) &cliaddr, sizeof(cliaddr));## 11 ##src/unixdomain/unixdgcli01.c##\n\n    bzero(&servaddr, sizeof(servaddr)); /* fill in server's address */## 12 ##src/unixdomain/unixdgcli01.c##\n    servaddr.sun_family = AF_LOCAL;## 13 ##src/unixdomain/unixdgcli01.c##\n    strcpy(servaddr.sun_path, UNIXDG_PATH);## 14 ##src/unixdomain/unixdgcli01.c##\n\n    dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));## 15 ##src/unixdomain/unixdgcli01.c##\n\n    exit(0);## 16 ##src/unixdomain/unixdgcli01.c##\n}## 17 ##src/unixdomain/unixdgcli01.c##\n"
  },
  {
    "path": "unixdomain/unixdgserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_un\tservaddr, cliaddr;\n\n\tsockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);\n\n\tunlink(UNIXDG_PATH);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sun_family = AF_LOCAL;\n\tstrcpy(servaddr.sun_path, UNIXDG_PATH);\n\n\tBind(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tdg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));\n}\n"
  },
  {
    "path": "unixdomain/unixstrcli01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tsockfd;\n\tstruct sockaddr_un\tservaddr;\n\n\tsockfd = Socket(AF_LOCAL, SOCK_STREAM, 0);\n\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sun_family = AF_LOCAL;\n\tstrcpy(servaddr.sun_path, UNIXSTR_PATH);\n\n\tConnect(sockfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tstr_cli(stdin, sockfd);\t\t/* do it all */\n\n\texit(0);\n}\n"
  },
  {
    "path": "unixdomain/unixstrserv01.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_un\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_LOCAL, SOCK_STREAM, 0);\n\n\tunlink(UNIXSTR_PATH);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sun_family = AF_LOCAL;\n\tstrcpy(servaddr.sun_path, UNIXSTR_PATH);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  },
  {
    "path": "unixdomain/unixstrserv01.lc",
    "content": "#include    \"unp.h\"##  1 ##src/unixdomain/unixstrserv01.c##\n\nint##  2 ##src/unixdomain/unixstrserv01.c##\nmain(int argc, char **argv)##  3 ##src/unixdomain/unixstrserv01.c##\n{##  4 ##src/unixdomain/unixstrserv01.c##\n    int     listenfd, connfd;##  5 ##src/unixdomain/unixstrserv01.c##\n    pid_t   childpid;##  6 ##src/unixdomain/unixstrserv01.c##\n    socklen_t clilen;##  7 ##src/unixdomain/unixstrserv01.c##\n    struct sockaddr_un cliaddr, servaddr;##  8 ##src/unixdomain/unixstrserv01.c##\n    void    sig_chld(int);##  9 ##src/unixdomain/unixstrserv01.c##\n\n    listenfd = Socket(AF_LOCAL, SOCK_STREAM, 0);## 10 ##src/unixdomain/unixstrserv01.c##\n\n    unlink(UNIXSTR_PATH);## 11 ##src/unixdomain/unixstrserv01.c##\n    bzero(&servaddr, sizeof(servaddr));## 12 ##src/unixdomain/unixstrserv01.c##\n    servaddr.sun_family = AF_LOCAL;## 13 ##src/unixdomain/unixstrserv01.c##\n    strcpy(servaddr.sun_path, UNIXSTR_PATH);## 14 ##src/unixdomain/unixstrserv01.c##\n\n    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));## 15 ##src/unixdomain/unixstrserv01.c##\n\n    Listen(listenfd, LISTENQ);## 16 ##src/unixdomain/unixstrserv01.c##\n\n    Signal(SIGCHLD, sig_chld);## 17 ##src/unixdomain/unixstrserv01.c##\n\n    for (;;) {## 18 ##src/unixdomain/unixstrserv01.c##\n        clilen = sizeof(cliaddr);## 19 ##src/unixdomain/unixstrserv01.c##\n        if ((connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {## 20 ##src/unixdomain/unixstrserv01.c##\n            if (errno == EINTR)## 21 ##src/unixdomain/unixstrserv01.c##\n                continue;       /* back to for() */## 22 ##src/unixdomain/unixstrserv01.c##\n            else## 23 ##src/unixdomain/unixstrserv01.c##\n                err_sys(\"accept error\");## 24 ##src/unixdomain/unixstrserv01.c##\n        }## 25 ##src/unixdomain/unixstrserv01.c##\n\n        if ((childpid = Fork()) == 0) { /* child process */## 26 ##src/unixdomain/unixstrserv01.c##\n            Close(listenfd);    /* close listening socket */## 27 ##src/unixdomain/unixstrserv01.c##\n            str_echo(connfd);   /* process the request */## 28 ##src/unixdomain/unixstrserv01.c##\n            exit(0);## 29 ##src/unixdomain/unixstrserv01.c##\n        }## 30 ##src/unixdomain/unixstrserv01.c##\n        Close(connfd);          /* parent closes connected socket */## 31 ##src/unixdomain/unixstrserv01.c##\n    }## 32 ##src/unixdomain/unixstrserv01.c##\n}## 33 ##src/unixdomain/unixstrserv01.c##\n"
  },
  {
    "path": "unixdomain/unixstrserv02.c",
    "content": "#include\t\"unp.h\"\n\nint\nmain(int argc, char **argv)\n{\n\tint\t\t\t\t\tlistenfd, connfd;\n\tpid_t\t\t\t\tchildpid;\n\tsocklen_t\t\t\tclilen;\n\tstruct sockaddr_un\tcliaddr, servaddr;\n\tvoid\t\t\t\tsig_chld(int);\n\n\tlistenfd = Socket(AF_LOCAL, SOCK_STREAM, 0);\n\n\tunlink(UNIXSTR_PATH);\n\tbzero(&servaddr, sizeof(servaddr));\n\tservaddr.sun_family = AF_LOCAL;\n\tstrcpy(servaddr.sun_path, UNIXSTR_PATH);\n\n\tBind(listenfd, (SA *) &servaddr, sizeof(servaddr));\n\n\tListen(listenfd, LISTENQ);\n\n\tSignal(SIGCHLD, sig_chld);\n\n\tfor ( ; ; ) {\n\t\tclilen = sizeof(cliaddr);\n\t\tif ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {\n\t\t\tif (errno == EINTR)\n\t\t\t\tcontinue;\t\t/* back to for() */\n\t\t\telse\n\t\t\t\terr_sys(\"accept error\");\n\t\t}\n\n\t\tif ( (childpid = Fork()) == 0) {\t/* child process */\n\t\t\tClose(listenfd);\t/* close listening socket */\n\t\t\tstr_echo(connfd);\t/* process the request */\n\t\t\texit(0);\n\t\t}\n\t\tClose(connfd);\t\t\t/* parent closes connected socket */\n\t}\n}\n"
  }
]