From 79462e3ebc2c5ae8bfcbfe64df6bd50c7099f8d6 Mon Sep 17 00:00:00 2001 From: Vijay Kumar Banerjee Date: Wed, 24 Feb 2021 19:06:38 -0700 Subject: cpukit: Remove libnetworking Update #3850 --- cpukit/libmisc/dummy/dummy-networking.c | 42 - cpukit/libmisc/monitor/mon-network.c | 342 --- cpukit/libmisc/shell/main_ifconfig.c | 275 --- cpukit/libmisc/shell/main_netstats.c | 137 -- cpukit/libmisc/shell/main_ping.c | 1982 ----------------- cpukit/libmisc/shell/main_route.c | 151 -- cpukit/libnetworking/README | 68 - cpukit/libnetworking/arpa/nameser.h | 450 ---- cpukit/libnetworking/arpa/nameser_compat.h | 193 -- cpukit/libnetworking/bpfilter.h | 1 - cpukit/libnetworking/dev/mii/mii.h | 206 -- cpukit/libnetworking/headers.am | 125 -- cpukit/libnetworking/ifaddrs.h | 56 - cpukit/libnetworking/kern/kern_mib.c | 384 ---- cpukit/libnetworking/kern/kern_subr.c | 157 -- cpukit/libnetworking/kern/kern_sysctl.c | 1547 -------------- cpukit/libnetworking/kern/uipc_domain.c | 220 -- cpukit/libnetworking/kern/uipc_mbuf.c | 742 ------- cpukit/libnetworking/kern/uipc_socket.c | 1139 ---------- cpukit/libnetworking/kern/uipc_socket2.c | 939 -------- cpukit/libnetworking/lib/README | 1 - cpukit/libnetworking/lib/getprotoby.c | 48 - cpukit/libnetworking/lib/rtems_bsdnet_ntp.c | 219 -- cpukit/libnetworking/lib/syslog.c | 170 -- cpukit/libnetworking/libc/base64.c | 318 --- cpukit/libnetworking/libc/byteorder.3 | 76 - cpukit/libnetworking/libc/ethers.3 | 192 -- cpukit/libnetworking/libc/gethostbydns.c | 779 ------- cpukit/libnetworking/libc/gethostbyht.c | 349 --- cpukit/libnetworking/libc/gethostbyname.3 | 304 --- cpukit/libnetworking/libc/gethostbynis.c | 144 -- cpukit/libnetworking/libc/gethostnamadr.c | 447 ---- cpukit/libnetworking/libc/getifaddrs.c | 421 ---- cpukit/libnetworking/libc/getnameinfo.c | 61 - cpukit/libnetworking/libc/getnetbydns.c | 313 --- cpukit/libnetworking/libc/getnetbyht.c | 175 -- cpukit/libnetworking/libc/getnetbynis.c | 179 -- cpukit/libnetworking/libc/getnetent.3 | 158 -- cpukit/libnetworking/libc/getnetnamadr.c | 193 -- cpukit/libnetworking/libc/getproto.c | 62 - cpukit/libnetworking/libc/getprotoent.3 | 146 -- cpukit/libnetworking/libc/getprotoent.c | 121 -- cpukit/libnetworking/libc/getprotoname.c | 69 - cpukit/libnetworking/libc/getservbyname.c | 101 - cpukit/libnetworking/libc/getservbyport.c | 94 - cpukit/libnetworking/libc/getservent.3 | 155 -- cpukit/libnetworking/libc/getservent.c | 281 --- cpukit/libnetworking/libc/herror.c | 129 -- cpukit/libnetworking/libc/if_indextoname.c | 93 - cpukit/libnetworking/libc/if_nameindex.c | 152 -- cpukit/libnetworking/libc/inet.3 | 209 -- cpukit/libnetworking/libc/inet_addr.c | 218 -- cpukit/libnetworking/libc/inet_lnaof.c | 61 - cpukit/libnetworking/libc/inet_makeaddr.c | 65 - cpukit/libnetworking/libc/inet_netof.c | 60 - cpukit/libnetworking/libc/inet_network.c | 92 - cpukit/libnetworking/libc/inet_ntoa.c | 82 - cpukit/libnetworking/libc/inet_ntop.c | 208 -- cpukit/libnetworking/libc/inet_pton.c | 216 -- cpukit/libnetworking/libc/linkaddr.3 | 137 -- cpukit/libnetworking/libc/linkaddr.c | 164 -- cpukit/libnetworking/libc/map_v4v6.c | 128 -- cpukit/libnetworking/libc/ns.3 | 130 -- cpukit/libnetworking/libc/ns_name.c | 595 ------ cpukit/libnetworking/libc/ns_netint.c | 56 - cpukit/libnetworking/libc/ns_parse.c | 192 -- cpukit/libnetworking/libc/ns_print.c | 748 ------- cpukit/libnetworking/libc/ns_ttl.c | 153 -- cpukit/libnetworking/libc/nsap_addr.c | 107 - cpukit/libnetworking/libc/port_after.h | 0 cpukit/libnetworking/libc/port_before.h | 0 cpukit/libnetworking/libc/rcmd.3 | 203 -- cpukit/libnetworking/libc/rcmd.c | 550 ----- cpukit/libnetworking/libc/recv.c | 53 - cpukit/libnetworking/libc/res_comp.c | 252 --- cpukit/libnetworking/libc/res_config.h | 16 - cpukit/libnetworking/libc/res_data.c | 85 - cpukit/libnetworking/libc/res_debug.c | 973 --------- cpukit/libnetworking/libc/res_init.c | 503 ----- cpukit/libnetworking/libc/res_mkquery.c | 199 -- cpukit/libnetworking/libc/res_mkupdate.c | 414 ---- cpukit/libnetworking/libc/res_query.c | 412 ---- cpukit/libnetworking/libc/res_send.c | 941 --------- cpukit/libnetworking/libc/res_stubs.c | 81 - cpukit/libnetworking/libc/res_update.c | 521 ----- cpukit/libnetworking/libc/resolver.3 | 351 --- cpukit/libnetworking/libc/send.c | 53 - cpukit/libnetworking/librtemsNfs.h | 231 -- cpukit/libnetworking/loop.h | 16 - cpukit/libnetworking/machine/_align.h | 23 - cpukit/libnetworking/machine/_kernel_if.h | 44 - cpukit/libnetworking/machine/_kernel_lock.h | 1 - cpukit/libnetworking/machine/_kernel_socket.h | 83 - cpukit/libnetworking/machine/cpu.h | 1 - cpukit/libnetworking/machine/cpufunc.h | 1 - cpukit/libnetworking/machine/in_cksum.h | 295 --- cpukit/libnetworking/machine/limits.h | 1 - .../libnetworking/machine/rtems-bsd-kernel-space.h | 42 - .../libnetworking/machine/rtems-bsd-user-space.h | 40 - cpukit/libnetworking/machine/vmparam.h | 1 - cpukit/libnetworking/net/bpf.h | 236 --- cpukit/libnetworking/net/ethernet.h | 384 ---- cpukit/libnetworking/net/if.c | 789 ------- cpukit/libnetworking/net/if_arp.h | 130 -- cpukit/libnetworking/net/if_dl.h | 83 - cpukit/libnetworking/net/if_ethersubr.c | 896 -------- cpukit/libnetworking/net/if_llc.h | 163 -- cpukit/libnetworking/net/if_loop.c | 287 --- cpukit/libnetworking/net/if_media.h | 531 ----- cpukit/libnetworking/net/if_ppp.c | 1768 ---------------- cpukit/libnetworking/net/if_ppp.h | 141 -- cpukit/libnetworking/net/if_pppvar.h | 161 -- cpukit/libnetworking/net/if_types.h | 252 --- cpukit/libnetworking/net/if_var.h | 256 --- cpukit/libnetworking/net/netisr.h | 74 - cpukit/libnetworking/net/ppp_comp.h | 165 -- cpukit/libnetworking/net/ppp_defs.h | 159 -- cpukit/libnetworking/net/ppp_tty.c | 957 --------- cpukit/libnetworking/net/radix.c | 1045 --------- cpukit/libnetworking/net/radix.h | 162 -- cpukit/libnetworking/net/raw_cb.c | 154 -- cpukit/libnetworking/net/raw_cb.h | 75 - cpukit/libnetworking/net/raw_usrreq.c | 306 --- cpukit/libnetworking/net/route.c | 948 --------- cpukit/libnetworking/net/route.h | 293 --- cpukit/libnetworking/net/rtsock.c | 801 ------- cpukit/libnetworking/net/slcompress.c | 603 ------ cpukit/libnetworking/net/slcompress.h | 161 -- cpukit/libnetworking/netinet/icmp_var.h | 81 - cpukit/libnetworking/netinet/if_ether.c | 644 ------ cpukit/libnetworking/netinet/if_ether.h | 176 -- cpukit/libnetworking/netinet/igmp.c | 473 ----- cpukit/libnetworking/netinet/igmp.h | 97 - cpukit/libnetworking/netinet/igmp_var.h | 105 - cpukit/libnetworking/netinet/in.c | 711 ------- cpukit/libnetworking/netinet/in_cksum.c | 186 -- cpukit/libnetworking/netinet/in_cksum_arm.h | 236 --- cpukit/libnetworking/netinet/in_cksum_i386.h | 202 -- cpukit/libnetworking/netinet/in_cksum_m68k.h | 221 -- cpukit/libnetworking/netinet/in_cksum_nios2.h | 248 --- cpukit/libnetworking/netinet/in_cksum_powerpc.h | 172 -- cpukit/libnetworking/netinet/in_cksum_sparc.h | 269 --- cpukit/libnetworking/netinet/in_pcb.c | 733 ------- cpukit/libnetworking/netinet/in_pcb.h | 152 -- cpukit/libnetworking/netinet/in_proto.c | 217 -- cpukit/libnetworking/netinet/in_rmx.c | 386 ---- cpukit/libnetworking/netinet/in_systm.h | 58 - cpukit/libnetworking/netinet/in_var.h | 240 --- cpukit/libnetworking/netinet/ip.h | 230 -- cpukit/libnetworking/netinet/ip_divert.c | 387 ---- cpukit/libnetworking/netinet/ip_fw.c | 1082 ---------- cpukit/libnetworking/netinet/ip_fw.h | 183 -- cpukit/libnetworking/netinet/ip_icmp.c | 771 ------- cpukit/libnetworking/netinet/ip_icmp.h | 212 -- cpukit/libnetworking/netinet/ip_input.c | 1510 ------------- cpukit/libnetworking/netinet/ip_mroute.c | 2232 -------------------- cpukit/libnetworking/netinet/ip_mroute.h | 271 --- cpukit/libnetworking/netinet/ip_output.c | 1336 ------------ cpukit/libnetworking/netinet/ip_var.h | 215 -- cpukit/libnetworking/netinet/raw_ip.c | 492 ----- cpukit/libnetworking/netinet/tcp_debug.c | 172 -- cpukit/libnetworking/netinet/tcp_debug.h | 69 - cpukit/libnetworking/netinet/tcp_fsm.h | 91 - cpukit/libnetworking/netinet/tcp_input.c | 2151 ------------------- cpukit/libnetworking/netinet/tcp_output.c | 757 ------- cpukit/libnetworking/netinet/tcp_seq.h | 99 - cpukit/libnetworking/netinet/tcp_subr.c | 729 ------- cpukit/libnetworking/netinet/tcp_timer.c | 385 ---- cpukit/libnetworking/netinet/tcp_timer.h | 133 -- cpukit/libnetworking/netinet/tcp_usrreq.c | 845 -------- cpukit/libnetworking/netinet/tcp_var.h | 414 ---- cpukit/libnetworking/netinet/tcpip.h | 67 - cpukit/libnetworking/netinet/udp.h | 50 - cpukit/libnetworking/netinet/udp_usrreq.c | 736 ------- cpukit/libnetworking/netinet/udp_var.h | 106 - cpukit/libnetworking/nfs/bootp_subr.c | 1213 ----------- cpukit/libnetworking/nfs/nfsproto.h | 423 ---- cpukit/libnetworking/nfs/rpcv2.h | 108 - cpukit/libnetworking/nfs/xdr_subs.h | 87 - cpukit/libnetworking/nfsclient/nfsargs.h | 92 - cpukit/libnetworking/nfsclient/nfsdiskless.h | 100 - cpukit/libnetworking/opt_atalk.h | 1 - cpukit/libnetworking/opt_bdg.h | 1 - cpukit/libnetworking/opt_compat.h | 1 - cpukit/libnetworking/opt_inet.h | 1 - cpukit/libnetworking/opt_inet6.h | 1 - cpukit/libnetworking/opt_ipfw.h | 1 - cpukit/libnetworking/opt_ipsec.h | 1 - cpukit/libnetworking/opt_ipx.h | 1 - cpukit/libnetworking/opt_mac.h | 1 - cpukit/libnetworking/opt_mrouting.h | 1 - cpukit/libnetworking/opt_netgraph.h | 1 - cpukit/libnetworking/opt_ppp.h | 10 - cpukit/libnetworking/opt_tcpdebug.h | 12 - cpukit/libnetworking/resolv.h | 303 --- cpukit/libnetworking/rpc/auth.h | 262 --- cpukit/libnetworking/rpc/auth_unix.h | 85 - cpukit/libnetworking/rpc/clnt.h | 310 --- cpukit/libnetworking/rpc/clnt_soc.h | 109 - cpukit/libnetworking/rpc/clnt_stat.h | 84 - cpukit/libnetworking/rpc/pmap_clnt.h | 89 - cpukit/libnetworking/rpc/pmap_prot.h | 105 - cpukit/libnetworking/rpc/pmap_rmt.h | 64 - cpukit/libnetworking/rpc/rpc.h | 118 -- cpukit/libnetworking/rpc/rpc_com.h | 65 - cpukit/libnetworking/rpc/rpc_msg.h | 205 -- cpukit/libnetworking/rpc/rpcent.h | 71 - cpukit/libnetworking/rpc/svc.h | 297 --- cpukit/libnetworking/rpc/svc_auth.h | 58 - cpukit/libnetworking/rpc/svc_soc.h | 125 -- cpukit/libnetworking/rpc/types.h | 68 - cpukit/libnetworking/rpc/xdr.h | 312 --- cpukit/libnetworking/rtems/bootp.h | 44 - cpukit/libnetworking/rtems/bsdnet/_types.h | 41 - cpukit/libnetworking/rtems/bsdnet/servers.h | 18 - cpukit/libnetworking/rtems/dhcp.h | 47 - cpukit/libnetworking/rtems/mkrootfs.c | 248 --- cpukit/libnetworking/rtems/mkrootfs.h | 80 - cpukit/libnetworking/rtems/rtems_bootp.c | 42 - cpukit/libnetworking/rtems/rtems_bsdnet.h | 339 --- cpukit/libnetworking/rtems/rtems_bsdnet_internal.h | 285 --- .../rtems/rtems_bsdnet_malloc_starvation.c | 19 - cpukit/libnetworking/rtems/rtems_dhcp.c | 1287 ----------- cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c | 380 ---- cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h | 64 - cpukit/libnetworking/rtems/rtems_glue.c | 1264 ----------- cpukit/libnetworking/rtems/rtems_malloc_mbuf.c | 33 - cpukit/libnetworking/rtems/rtems_mii_ioctl.c | 172 -- cpukit/libnetworking/rtems/rtems_mii_ioctl.h | 139 -- cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c | 260 --- cpukit/libnetworking/rtems/rtems_netdb.h | 52 - cpukit/libnetworking/rtems/rtems_netinet_in.h | 80 - cpukit/libnetworking/rtems/rtems_select.c | 179 -- cpukit/libnetworking/rtems/rtems_showicmpstat.c | 70 - cpukit/libnetworking/rtems/rtems_showifstat.c | 157 -- cpukit/libnetworking/rtems/rtems_showipstat.c | 68 - cpukit/libnetworking/rtems/rtems_showmbuf.c | 69 - cpukit/libnetworking/rtems/rtems_showroute.c | 240 --- cpukit/libnetworking/rtems/rtems_showtcpstat.c | 106 - cpukit/libnetworking/rtems/rtems_showudpstat.c | 52 - cpukit/libnetworking/rtems/rtems_socketpair.c | 53 - cpukit/libnetworking/rtems/rtems_syscall.c | 835 -------- cpukit/libnetworking/rtems/rtems_syscall.h | 70 - cpukit/libnetworking/rtems/rtems_syscall_api.c | 22 - cpukit/libnetworking/rtems/sghostname.c | 54 - cpukit/libnetworking/sys/callout.h | 53 - cpukit/libnetworking/sys/conf.h | 57 - cpukit/libnetworking/sys/domain.h | 70 - cpukit/libnetworking/sys/kernel.h | 188 -- cpukit/libnetworking/sys/libkern.h | 93 - cpukit/libnetworking/sys/linker_set.h | 109 - cpukit/libnetworking/sys/malloc.h | 354 ---- cpukit/libnetworking/sys/mbuf.h | 438 ---- cpukit/libnetworking/sys/mount.h | 120 -- cpukit/libnetworking/sys/proc.h | 6 - cpukit/libnetworking/sys/protosw.h | 300 --- cpukit/libnetworking/sys/reboot.h | 105 - cpukit/libnetworking/sys/resourcevar.h | 1 - cpukit/libnetworking/sys/selinfo.h | 55 - cpukit/libnetworking/sys/signalvar.h | 176 -- cpukit/libnetworking/sys/socketvar.h | 271 --- cpukit/libnetworking/sys/sysctl.h | 642 ------ cpukit/libnetworking/sys/systm.h | 108 - cpukit/libnetworking/sys/ucred.h | 60 - cpukit/libnetworking/vm/vm.h | 97 - cpukit/libnetworking/vm/vm_extern.h | 42 - cpukit/libnetworking/vm/vm_kern.h | 78 - cpukit/libnetworking/vm/vm_param.h | 130 -- cpukit/librpc/README_RTEMS | 64 - cpukit/librpc/include/rpcsvc/bootparam_prot.x | 103 - cpukit/librpc/include/rpcsvc/crypt.x | 91 - cpukit/librpc/include/rpcsvc/key_prot.x | 282 --- cpukit/librpc/include/rpcsvc/klm_prot.x | 139 -- cpukit/librpc/include/rpcsvc/mount.x | 257 --- cpukit/librpc/include/rpcsvc/nfs_prot.x | 1265 ----------- cpukit/librpc/include/rpcsvc/nis.x | 466 ---- cpukit/librpc/include/rpcsvc/nis_cache.x | 87 - cpukit/librpc/include/rpcsvc/nis_callback.x | 76 - cpukit/librpc/include/rpcsvc/nis_db.h | 164 -- cpukit/librpc/include/rpcsvc/nis_object.x | 317 --- cpukit/librpc/include/rpcsvc/nis_tags.h | 137 -- cpukit/librpc/include/rpcsvc/nislib.h | 317 --- cpukit/librpc/include/rpcsvc/nlm_prot.x | 183 -- cpukit/librpc/include/rpcsvc/pmap_prot.x | 284 --- cpukit/librpc/include/rpcsvc/rex.x | 235 --- cpukit/librpc/include/rpcsvc/rnusers.x | 122 -- cpukit/librpc/include/rpcsvc/rquota.x | 67 - cpukit/librpc/include/rpcsvc/rstat.x | 151 -- cpukit/librpc/include/rpcsvc/rwall.x | 57 - cpukit/librpc/include/rpcsvc/sm_inter.x | 122 -- cpukit/librpc/include/rpcsvc/spray.x | 90 - cpukit/librpc/include/rpcsvc/yp.x | 379 ---- cpukit/librpc/include/rpcsvc/yp_prot.h | 330 --- cpukit/librpc/include/rpcsvc/ypclnt.h | 93 - cpukit/librpc/include/rpcsvc/yppasswd.x | 75 - cpukit/librpc/include/rpcsvc/ypupdate_prot.x | 88 - cpukit/librpc/include/rpcsvc/ypxfrd.x | 173 -- cpukit/librpc/src/rpc/DISCLAIMER | 28 - cpukit/librpc/src/rpc/README | 233 -- cpukit/librpc/src/rpc/auth_none.c | 140 -- cpukit/librpc/src/rpc/auth_unix.c | 347 --- cpukit/librpc/src/rpc/authunix_prot.c | 73 - cpukit/librpc/src/rpc/bindresvport.3 | 106 - cpukit/librpc/src/rpc/bindresvport.c | 162 -- cpukit/librpc/src/rpc/clnt_generic.c | 147 -- cpukit/librpc/src/rpc/clnt_perror.c | 261 --- cpukit/librpc/src/rpc/clnt_raw.c | 250 --- cpukit/librpc/src/rpc/clnt_simple.c | 129 -- cpukit/librpc/src/rpc/clnt_tcp.c | 608 ------ cpukit/librpc/src/rpc/clnt_udp.c | 582 ----- cpukit/librpc/src/rpc/des_crypt.3 | 130 -- cpukit/librpc/src/rpc/get_myaddress.c | 143 -- cpukit/librpc/src/rpc/getrpcent.3 | 98 - cpukit/librpc/src/rpc/getrpcent.c | 303 --- cpukit/librpc/src/rpc/getrpcport.3 | 31 - cpukit/librpc/src/rpc/getrpcport.c | 71 - cpukit/librpc/src/rpc/netname.c | 141 -- cpukit/librpc/src/rpc/netnamer.c | 333 --- cpukit/librpc/src/rpc/pmap_clnt.c | 153 -- cpukit/librpc/src/rpc/pmap_getmaps.c | 93 - cpukit/librpc/src/rpc/pmap_getport.c | 99 - cpukit/librpc/src/rpc/pmap_prot.c | 65 - cpukit/librpc/src/rpc/pmap_prot2.c | 124 -- cpukit/librpc/src/rpc/pmap_rmt.c | 444 ---- cpukit/librpc/src/rpc/publickey.3 | 47 - cpukit/librpc/src/rpc/publickey.5 | 38 - cpukit/librpc/src/rpc/rpc.3 | 1767 ---------------- cpukit/librpc/src/rpc/rpc.5 | 35 - cpukit/librpc/src/rpc/rpc_callmsg.c | 198 -- cpukit/librpc/src/rpc/rpc_commondata.c | 47 - cpukit/librpc/src/rpc/rpc_dtablesize.c | 67 - cpukit/librpc/src/rpc/rpc_prot.c | 338 --- cpukit/librpc/src/rpc/rpc_secure.3 | 254 --- cpukit/librpc/src/rpc/rpcdname.c | 86 - cpukit/librpc/src/rpc/rstat.1 | 58 - cpukit/librpc/src/rpc/rstat_svc.8 | 22 - cpukit/librpc/src/rpc/rtems-rpc-config.h | 40 - cpukit/librpc/src/rpc/rtems_portmapper.c | 502 ----- cpukit/librpc/src/rpc/rtems_rpc.c | 127 -- cpukit/librpc/src/rpc/rtime.3 | 47 - cpukit/librpc/src/rpc/rtime.c | 165 -- cpukit/librpc/src/rpc/svc.c | 502 ----- cpukit/librpc/src/rpc/svc_auth.c | 222 -- cpukit/librpc/src/rpc/svc_auth_unix.c | 154 -- cpukit/librpc/src/rpc/svc_raw.c | 175 -- cpukit/librpc/src/rpc/svc_run.c | 91 - cpukit/librpc/src/rpc/svc_simple.c | 163 -- cpukit/librpc/src/rpc/svc_tcp.c | 491 ----- cpukit/librpc/src/rpc/svc_udp.c | 486 ----- cpukit/librpc/src/xdr/xdr.3 | 837 -------- cpukit/librpc/src/xdr/xdr.c | 858 -------- cpukit/librpc/src/xdr/xdr_array.c | 160 -- cpukit/librpc/src/xdr/xdr_float.c | 344 --- cpukit/librpc/src/xdr/xdr_mem.c | 245 --- cpukit/librpc/src/xdr/xdr_rec.c | 608 ------ cpukit/librpc/src/xdr/xdr_reference.c | 142 -- cpukit/librpc/src/xdr/xdr_sizeof.c | 167 -- cpukit/librpc/src/xdr/xdr_stdio.c | 194 -- 358 files changed, 94818 deletions(-) delete mode 100644 cpukit/libmisc/dummy/dummy-networking.c delete mode 100644 cpukit/libmisc/monitor/mon-network.c delete mode 100644 cpukit/libmisc/shell/main_ifconfig.c delete mode 100644 cpukit/libmisc/shell/main_netstats.c delete mode 100644 cpukit/libmisc/shell/main_ping.c delete mode 100644 cpukit/libmisc/shell/main_route.c delete mode 100644 cpukit/libnetworking/README delete mode 100644 cpukit/libnetworking/arpa/nameser.h delete mode 100644 cpukit/libnetworking/arpa/nameser_compat.h delete mode 100644 cpukit/libnetworking/bpfilter.h delete mode 100644 cpukit/libnetworking/dev/mii/mii.h delete mode 100644 cpukit/libnetworking/headers.am delete mode 100644 cpukit/libnetworking/ifaddrs.h delete mode 100644 cpukit/libnetworking/kern/kern_mib.c delete mode 100644 cpukit/libnetworking/kern/kern_subr.c delete mode 100644 cpukit/libnetworking/kern/kern_sysctl.c delete mode 100644 cpukit/libnetworking/kern/uipc_domain.c delete mode 100644 cpukit/libnetworking/kern/uipc_mbuf.c delete mode 100644 cpukit/libnetworking/kern/uipc_socket.c delete mode 100644 cpukit/libnetworking/kern/uipc_socket2.c delete mode 100644 cpukit/libnetworking/lib/README delete mode 100644 cpukit/libnetworking/lib/getprotoby.c delete mode 100644 cpukit/libnetworking/lib/rtems_bsdnet_ntp.c delete mode 100644 cpukit/libnetworking/lib/syslog.c delete mode 100644 cpukit/libnetworking/libc/base64.c delete mode 100644 cpukit/libnetworking/libc/byteorder.3 delete mode 100644 cpukit/libnetworking/libc/ethers.3 delete mode 100644 cpukit/libnetworking/libc/gethostbydns.c delete mode 100644 cpukit/libnetworking/libc/gethostbyht.c delete mode 100644 cpukit/libnetworking/libc/gethostbyname.3 delete mode 100644 cpukit/libnetworking/libc/gethostbynis.c delete mode 100644 cpukit/libnetworking/libc/gethostnamadr.c delete mode 100644 cpukit/libnetworking/libc/getifaddrs.c delete mode 100644 cpukit/libnetworking/libc/getnameinfo.c delete mode 100644 cpukit/libnetworking/libc/getnetbydns.c delete mode 100644 cpukit/libnetworking/libc/getnetbyht.c delete mode 100644 cpukit/libnetworking/libc/getnetbynis.c delete mode 100644 cpukit/libnetworking/libc/getnetent.3 delete mode 100644 cpukit/libnetworking/libc/getnetnamadr.c delete mode 100644 cpukit/libnetworking/libc/getproto.c delete mode 100644 cpukit/libnetworking/libc/getprotoent.3 delete mode 100644 cpukit/libnetworking/libc/getprotoent.c delete mode 100644 cpukit/libnetworking/libc/getprotoname.c delete mode 100644 cpukit/libnetworking/libc/getservbyname.c delete mode 100644 cpukit/libnetworking/libc/getservbyport.c delete mode 100644 cpukit/libnetworking/libc/getservent.3 delete mode 100644 cpukit/libnetworking/libc/getservent.c delete mode 100644 cpukit/libnetworking/libc/herror.c delete mode 100644 cpukit/libnetworking/libc/if_indextoname.c delete mode 100644 cpukit/libnetworking/libc/if_nameindex.c delete mode 100644 cpukit/libnetworking/libc/inet.3 delete mode 100644 cpukit/libnetworking/libc/inet_addr.c delete mode 100644 cpukit/libnetworking/libc/inet_lnaof.c delete mode 100644 cpukit/libnetworking/libc/inet_makeaddr.c delete mode 100644 cpukit/libnetworking/libc/inet_netof.c delete mode 100644 cpukit/libnetworking/libc/inet_network.c delete mode 100644 cpukit/libnetworking/libc/inet_ntoa.c delete mode 100644 cpukit/libnetworking/libc/inet_ntop.c delete mode 100644 cpukit/libnetworking/libc/inet_pton.c delete mode 100644 cpukit/libnetworking/libc/linkaddr.3 delete mode 100644 cpukit/libnetworking/libc/linkaddr.c delete mode 100644 cpukit/libnetworking/libc/map_v4v6.c delete mode 100644 cpukit/libnetworking/libc/ns.3 delete mode 100644 cpukit/libnetworking/libc/ns_name.c delete mode 100644 cpukit/libnetworking/libc/ns_netint.c delete mode 100644 cpukit/libnetworking/libc/ns_parse.c delete mode 100644 cpukit/libnetworking/libc/ns_print.c delete mode 100644 cpukit/libnetworking/libc/ns_ttl.c delete mode 100644 cpukit/libnetworking/libc/nsap_addr.c delete mode 100644 cpukit/libnetworking/libc/port_after.h delete mode 100644 cpukit/libnetworking/libc/port_before.h delete mode 100644 cpukit/libnetworking/libc/rcmd.3 delete mode 100644 cpukit/libnetworking/libc/rcmd.c delete mode 100644 cpukit/libnetworking/libc/recv.c delete mode 100644 cpukit/libnetworking/libc/res_comp.c delete mode 100644 cpukit/libnetworking/libc/res_config.h delete mode 100644 cpukit/libnetworking/libc/res_data.c delete mode 100644 cpukit/libnetworking/libc/res_debug.c delete mode 100644 cpukit/libnetworking/libc/res_init.c delete mode 100644 cpukit/libnetworking/libc/res_mkquery.c delete mode 100644 cpukit/libnetworking/libc/res_mkupdate.c delete mode 100644 cpukit/libnetworking/libc/res_query.c delete mode 100644 cpukit/libnetworking/libc/res_send.c delete mode 100644 cpukit/libnetworking/libc/res_stubs.c delete mode 100644 cpukit/libnetworking/libc/res_update.c delete mode 100644 cpukit/libnetworking/libc/resolver.3 delete mode 100644 cpukit/libnetworking/libc/send.c delete mode 100644 cpukit/libnetworking/librtemsNfs.h delete mode 100644 cpukit/libnetworking/loop.h delete mode 100644 cpukit/libnetworking/machine/_align.h delete mode 100644 cpukit/libnetworking/machine/_kernel_if.h delete mode 100644 cpukit/libnetworking/machine/_kernel_lock.h delete mode 100644 cpukit/libnetworking/machine/_kernel_socket.h delete mode 100644 cpukit/libnetworking/machine/cpu.h delete mode 100644 cpukit/libnetworking/machine/cpufunc.h delete mode 100644 cpukit/libnetworking/machine/in_cksum.h delete mode 100644 cpukit/libnetworking/machine/limits.h delete mode 100644 cpukit/libnetworking/machine/rtems-bsd-kernel-space.h delete mode 100644 cpukit/libnetworking/machine/rtems-bsd-user-space.h delete mode 100644 cpukit/libnetworking/machine/vmparam.h delete mode 100644 cpukit/libnetworking/net/bpf.h delete mode 100644 cpukit/libnetworking/net/ethernet.h delete mode 100644 cpukit/libnetworking/net/if.c delete mode 100644 cpukit/libnetworking/net/if_arp.h delete mode 100644 cpukit/libnetworking/net/if_dl.h delete mode 100644 cpukit/libnetworking/net/if_ethersubr.c delete mode 100644 cpukit/libnetworking/net/if_llc.h delete mode 100644 cpukit/libnetworking/net/if_loop.c delete mode 100644 cpukit/libnetworking/net/if_media.h delete mode 100644 cpukit/libnetworking/net/if_ppp.c delete mode 100644 cpukit/libnetworking/net/if_ppp.h delete mode 100644 cpukit/libnetworking/net/if_pppvar.h delete mode 100644 cpukit/libnetworking/net/if_types.h delete mode 100644 cpukit/libnetworking/net/if_var.h delete mode 100644 cpukit/libnetworking/net/netisr.h delete mode 100644 cpukit/libnetworking/net/ppp_comp.h delete mode 100644 cpukit/libnetworking/net/ppp_defs.h delete mode 100644 cpukit/libnetworking/net/ppp_tty.c delete mode 100644 cpukit/libnetworking/net/radix.c delete mode 100644 cpukit/libnetworking/net/radix.h delete mode 100644 cpukit/libnetworking/net/raw_cb.c delete mode 100644 cpukit/libnetworking/net/raw_cb.h delete mode 100644 cpukit/libnetworking/net/raw_usrreq.c delete mode 100644 cpukit/libnetworking/net/route.c delete mode 100644 cpukit/libnetworking/net/route.h delete mode 100644 cpukit/libnetworking/net/rtsock.c delete mode 100644 cpukit/libnetworking/net/slcompress.c delete mode 100644 cpukit/libnetworking/net/slcompress.h delete mode 100644 cpukit/libnetworking/netinet/icmp_var.h delete mode 100644 cpukit/libnetworking/netinet/if_ether.c delete mode 100644 cpukit/libnetworking/netinet/if_ether.h delete mode 100644 cpukit/libnetworking/netinet/igmp.c delete mode 100644 cpukit/libnetworking/netinet/igmp.h delete mode 100644 cpukit/libnetworking/netinet/igmp_var.h delete mode 100644 cpukit/libnetworking/netinet/in.c delete mode 100644 cpukit/libnetworking/netinet/in_cksum.c delete mode 100644 cpukit/libnetworking/netinet/in_cksum_arm.h delete mode 100644 cpukit/libnetworking/netinet/in_cksum_i386.h delete mode 100644 cpukit/libnetworking/netinet/in_cksum_m68k.h delete mode 100644 cpukit/libnetworking/netinet/in_cksum_nios2.h delete mode 100644 cpukit/libnetworking/netinet/in_cksum_powerpc.h delete mode 100644 cpukit/libnetworking/netinet/in_cksum_sparc.h delete mode 100644 cpukit/libnetworking/netinet/in_pcb.c delete mode 100644 cpukit/libnetworking/netinet/in_pcb.h delete mode 100644 cpukit/libnetworking/netinet/in_proto.c delete mode 100644 cpukit/libnetworking/netinet/in_rmx.c delete mode 100644 cpukit/libnetworking/netinet/in_systm.h delete mode 100644 cpukit/libnetworking/netinet/in_var.h delete mode 100644 cpukit/libnetworking/netinet/ip.h delete mode 100644 cpukit/libnetworking/netinet/ip_divert.c delete mode 100644 cpukit/libnetworking/netinet/ip_fw.c delete mode 100644 cpukit/libnetworking/netinet/ip_fw.h delete mode 100644 cpukit/libnetworking/netinet/ip_icmp.c delete mode 100644 cpukit/libnetworking/netinet/ip_icmp.h delete mode 100644 cpukit/libnetworking/netinet/ip_input.c delete mode 100644 cpukit/libnetworking/netinet/ip_mroute.c delete mode 100644 cpukit/libnetworking/netinet/ip_mroute.h delete mode 100644 cpukit/libnetworking/netinet/ip_output.c delete mode 100644 cpukit/libnetworking/netinet/ip_var.h delete mode 100644 cpukit/libnetworking/netinet/raw_ip.c delete mode 100644 cpukit/libnetworking/netinet/tcp_debug.c delete mode 100644 cpukit/libnetworking/netinet/tcp_debug.h delete mode 100644 cpukit/libnetworking/netinet/tcp_fsm.h delete mode 100644 cpukit/libnetworking/netinet/tcp_input.c delete mode 100644 cpukit/libnetworking/netinet/tcp_output.c delete mode 100644 cpukit/libnetworking/netinet/tcp_seq.h delete mode 100644 cpukit/libnetworking/netinet/tcp_subr.c delete mode 100644 cpukit/libnetworking/netinet/tcp_timer.c delete mode 100644 cpukit/libnetworking/netinet/tcp_timer.h delete mode 100644 cpukit/libnetworking/netinet/tcp_usrreq.c delete mode 100644 cpukit/libnetworking/netinet/tcp_var.h delete mode 100644 cpukit/libnetworking/netinet/tcpip.h delete mode 100644 cpukit/libnetworking/netinet/udp.h delete mode 100644 cpukit/libnetworking/netinet/udp_usrreq.c delete mode 100644 cpukit/libnetworking/netinet/udp_var.h delete mode 100644 cpukit/libnetworking/nfs/bootp_subr.c delete mode 100644 cpukit/libnetworking/nfs/nfsproto.h delete mode 100644 cpukit/libnetworking/nfs/rpcv2.h delete mode 100644 cpukit/libnetworking/nfs/xdr_subs.h delete mode 100644 cpukit/libnetworking/nfsclient/nfsargs.h delete mode 100644 cpukit/libnetworking/nfsclient/nfsdiskless.h delete mode 100644 cpukit/libnetworking/opt_atalk.h delete mode 100644 cpukit/libnetworking/opt_bdg.h delete mode 100644 cpukit/libnetworking/opt_compat.h delete mode 100644 cpukit/libnetworking/opt_inet.h delete mode 100644 cpukit/libnetworking/opt_inet6.h delete mode 100644 cpukit/libnetworking/opt_ipfw.h delete mode 100644 cpukit/libnetworking/opt_ipsec.h delete mode 100644 cpukit/libnetworking/opt_ipx.h delete mode 100644 cpukit/libnetworking/opt_mac.h delete mode 100644 cpukit/libnetworking/opt_mrouting.h delete mode 100644 cpukit/libnetworking/opt_netgraph.h delete mode 100644 cpukit/libnetworking/opt_ppp.h delete mode 100644 cpukit/libnetworking/opt_tcpdebug.h delete mode 100644 cpukit/libnetworking/resolv.h delete mode 100644 cpukit/libnetworking/rpc/auth.h delete mode 100644 cpukit/libnetworking/rpc/auth_unix.h delete mode 100644 cpukit/libnetworking/rpc/clnt.h delete mode 100644 cpukit/libnetworking/rpc/clnt_soc.h delete mode 100644 cpukit/libnetworking/rpc/clnt_stat.h delete mode 100644 cpukit/libnetworking/rpc/pmap_clnt.h delete mode 100644 cpukit/libnetworking/rpc/pmap_prot.h delete mode 100644 cpukit/libnetworking/rpc/pmap_rmt.h delete mode 100644 cpukit/libnetworking/rpc/rpc.h delete mode 100644 cpukit/libnetworking/rpc/rpc_com.h delete mode 100644 cpukit/libnetworking/rpc/rpc_msg.h delete mode 100644 cpukit/libnetworking/rpc/rpcent.h delete mode 100644 cpukit/libnetworking/rpc/svc.h delete mode 100644 cpukit/libnetworking/rpc/svc_auth.h delete mode 100644 cpukit/libnetworking/rpc/svc_soc.h delete mode 100644 cpukit/libnetworking/rpc/types.h delete mode 100644 cpukit/libnetworking/rpc/xdr.h delete mode 100644 cpukit/libnetworking/rtems/bootp.h delete mode 100644 cpukit/libnetworking/rtems/bsdnet/_types.h delete mode 100644 cpukit/libnetworking/rtems/bsdnet/servers.h delete mode 100644 cpukit/libnetworking/rtems/dhcp.h delete mode 100644 cpukit/libnetworking/rtems/mkrootfs.c delete mode 100644 cpukit/libnetworking/rtems/mkrootfs.h delete mode 100644 cpukit/libnetworking/rtems/rtems_bootp.c delete mode 100644 cpukit/libnetworking/rtems/rtems_bsdnet.h delete mode 100644 cpukit/libnetworking/rtems/rtems_bsdnet_internal.h delete mode 100644 cpukit/libnetworking/rtems/rtems_bsdnet_malloc_starvation.c delete mode 100644 cpukit/libnetworking/rtems/rtems_dhcp.c delete mode 100644 cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c delete mode 100644 cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h delete mode 100644 cpukit/libnetworking/rtems/rtems_glue.c delete mode 100644 cpukit/libnetworking/rtems/rtems_malloc_mbuf.c delete mode 100644 cpukit/libnetworking/rtems/rtems_mii_ioctl.c delete mode 100644 cpukit/libnetworking/rtems/rtems_mii_ioctl.h delete mode 100644 cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c delete mode 100644 cpukit/libnetworking/rtems/rtems_netdb.h delete mode 100644 cpukit/libnetworking/rtems/rtems_netinet_in.h delete mode 100644 cpukit/libnetworking/rtems/rtems_select.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showicmpstat.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showifstat.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showipstat.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showmbuf.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showroute.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showtcpstat.c delete mode 100644 cpukit/libnetworking/rtems/rtems_showudpstat.c delete mode 100644 cpukit/libnetworking/rtems/rtems_socketpair.c delete mode 100644 cpukit/libnetworking/rtems/rtems_syscall.c delete mode 100644 cpukit/libnetworking/rtems/rtems_syscall.h delete mode 100644 cpukit/libnetworking/rtems/rtems_syscall_api.c delete mode 100644 cpukit/libnetworking/rtems/sghostname.c delete mode 100644 cpukit/libnetworking/sys/callout.h delete mode 100644 cpukit/libnetworking/sys/conf.h delete mode 100644 cpukit/libnetworking/sys/domain.h delete mode 100644 cpukit/libnetworking/sys/kernel.h delete mode 100644 cpukit/libnetworking/sys/libkern.h delete mode 100644 cpukit/libnetworking/sys/linker_set.h delete mode 100644 cpukit/libnetworking/sys/malloc.h delete mode 100644 cpukit/libnetworking/sys/mbuf.h delete mode 100644 cpukit/libnetworking/sys/mount.h delete mode 100644 cpukit/libnetworking/sys/proc.h delete mode 100644 cpukit/libnetworking/sys/protosw.h delete mode 100644 cpukit/libnetworking/sys/reboot.h delete mode 100644 cpukit/libnetworking/sys/resourcevar.h delete mode 100644 cpukit/libnetworking/sys/selinfo.h delete mode 100644 cpukit/libnetworking/sys/signalvar.h delete mode 100644 cpukit/libnetworking/sys/socketvar.h delete mode 100644 cpukit/libnetworking/sys/sysctl.h delete mode 100644 cpukit/libnetworking/sys/systm.h delete mode 100644 cpukit/libnetworking/sys/ucred.h delete mode 100644 cpukit/libnetworking/vm/vm.h delete mode 100644 cpukit/libnetworking/vm/vm_extern.h delete mode 100644 cpukit/libnetworking/vm/vm_kern.h delete mode 100644 cpukit/libnetworking/vm/vm_param.h delete mode 100644 cpukit/librpc/README_RTEMS delete mode 100644 cpukit/librpc/include/rpcsvc/bootparam_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/crypt.x delete mode 100644 cpukit/librpc/include/rpcsvc/key_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/klm_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/mount.x delete mode 100644 cpukit/librpc/include/rpcsvc/nfs_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/nis.x delete mode 100644 cpukit/librpc/include/rpcsvc/nis_cache.x delete mode 100644 cpukit/librpc/include/rpcsvc/nis_callback.x delete mode 100644 cpukit/librpc/include/rpcsvc/nis_db.h delete mode 100644 cpukit/librpc/include/rpcsvc/nis_object.x delete mode 100644 cpukit/librpc/include/rpcsvc/nis_tags.h delete mode 100644 cpukit/librpc/include/rpcsvc/nislib.h delete mode 100644 cpukit/librpc/include/rpcsvc/nlm_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/pmap_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/rex.x delete mode 100644 cpukit/librpc/include/rpcsvc/rnusers.x delete mode 100644 cpukit/librpc/include/rpcsvc/rquota.x delete mode 100644 cpukit/librpc/include/rpcsvc/rstat.x delete mode 100644 cpukit/librpc/include/rpcsvc/rwall.x delete mode 100644 cpukit/librpc/include/rpcsvc/sm_inter.x delete mode 100644 cpukit/librpc/include/rpcsvc/spray.x delete mode 100644 cpukit/librpc/include/rpcsvc/yp.x delete mode 100644 cpukit/librpc/include/rpcsvc/yp_prot.h delete mode 100644 cpukit/librpc/include/rpcsvc/ypclnt.h delete mode 100644 cpukit/librpc/include/rpcsvc/yppasswd.x delete mode 100644 cpukit/librpc/include/rpcsvc/ypupdate_prot.x delete mode 100644 cpukit/librpc/include/rpcsvc/ypxfrd.x delete mode 100644 cpukit/librpc/src/rpc/DISCLAIMER delete mode 100644 cpukit/librpc/src/rpc/README delete mode 100644 cpukit/librpc/src/rpc/auth_none.c delete mode 100644 cpukit/librpc/src/rpc/auth_unix.c delete mode 100644 cpukit/librpc/src/rpc/authunix_prot.c delete mode 100644 cpukit/librpc/src/rpc/bindresvport.3 delete mode 100644 cpukit/librpc/src/rpc/bindresvport.c delete mode 100644 cpukit/librpc/src/rpc/clnt_generic.c delete mode 100644 cpukit/librpc/src/rpc/clnt_perror.c delete mode 100644 cpukit/librpc/src/rpc/clnt_raw.c delete mode 100644 cpukit/librpc/src/rpc/clnt_simple.c delete mode 100644 cpukit/librpc/src/rpc/clnt_tcp.c delete mode 100644 cpukit/librpc/src/rpc/clnt_udp.c delete mode 100644 cpukit/librpc/src/rpc/des_crypt.3 delete mode 100644 cpukit/librpc/src/rpc/get_myaddress.c delete mode 100644 cpukit/librpc/src/rpc/getrpcent.3 delete mode 100644 cpukit/librpc/src/rpc/getrpcent.c delete mode 100644 cpukit/librpc/src/rpc/getrpcport.3 delete mode 100644 cpukit/librpc/src/rpc/getrpcport.c delete mode 100644 cpukit/librpc/src/rpc/netname.c delete mode 100644 cpukit/librpc/src/rpc/netnamer.c delete mode 100644 cpukit/librpc/src/rpc/pmap_clnt.c delete mode 100644 cpukit/librpc/src/rpc/pmap_getmaps.c delete mode 100644 cpukit/librpc/src/rpc/pmap_getport.c delete mode 100644 cpukit/librpc/src/rpc/pmap_prot.c delete mode 100644 cpukit/librpc/src/rpc/pmap_prot2.c delete mode 100644 cpukit/librpc/src/rpc/pmap_rmt.c delete mode 100644 cpukit/librpc/src/rpc/publickey.3 delete mode 100644 cpukit/librpc/src/rpc/publickey.5 delete mode 100644 cpukit/librpc/src/rpc/rpc.3 delete mode 100644 cpukit/librpc/src/rpc/rpc.5 delete mode 100644 cpukit/librpc/src/rpc/rpc_callmsg.c delete mode 100644 cpukit/librpc/src/rpc/rpc_commondata.c delete mode 100644 cpukit/librpc/src/rpc/rpc_dtablesize.c delete mode 100644 cpukit/librpc/src/rpc/rpc_prot.c delete mode 100644 cpukit/librpc/src/rpc/rpc_secure.3 delete mode 100644 cpukit/librpc/src/rpc/rpcdname.c delete mode 100644 cpukit/librpc/src/rpc/rstat.1 delete mode 100644 cpukit/librpc/src/rpc/rstat_svc.8 delete mode 100644 cpukit/librpc/src/rpc/rtems-rpc-config.h delete mode 100644 cpukit/librpc/src/rpc/rtems_portmapper.c delete mode 100644 cpukit/librpc/src/rpc/rtems_rpc.c delete mode 100644 cpukit/librpc/src/rpc/rtime.3 delete mode 100644 cpukit/librpc/src/rpc/rtime.c delete mode 100644 cpukit/librpc/src/rpc/svc.c delete mode 100644 cpukit/librpc/src/rpc/svc_auth.c delete mode 100644 cpukit/librpc/src/rpc/svc_auth_unix.c delete mode 100644 cpukit/librpc/src/rpc/svc_raw.c delete mode 100644 cpukit/librpc/src/rpc/svc_run.c delete mode 100644 cpukit/librpc/src/rpc/svc_simple.c delete mode 100644 cpukit/librpc/src/rpc/svc_tcp.c delete mode 100644 cpukit/librpc/src/rpc/svc_udp.c delete mode 100644 cpukit/librpc/src/xdr/xdr.3 delete mode 100644 cpukit/librpc/src/xdr/xdr.c delete mode 100644 cpukit/librpc/src/xdr/xdr_array.c delete mode 100644 cpukit/librpc/src/xdr/xdr_float.c delete mode 100644 cpukit/librpc/src/xdr/xdr_mem.c delete mode 100644 cpukit/librpc/src/xdr/xdr_rec.c delete mode 100644 cpukit/librpc/src/xdr/xdr_reference.c delete mode 100644 cpukit/librpc/src/xdr/xdr_sizeof.c delete mode 100644 cpukit/librpc/src/xdr/xdr_stdio.c diff --git a/cpukit/libmisc/dummy/dummy-networking.c b/cpukit/libmisc/dummy/dummy-networking.c deleted file mode 100644 index 379e23e947..0000000000 --- a/cpukit/libmisc/dummy/dummy-networking.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Dummy configuration file - * - * COPYRIGHT (c) 1989-2008. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -/* Loopback Network Configuration */ -#if defined(RTEMS_NETWORKING) - #include - #include - #include - - struct rtems_bsdnet_config rtems_bsdnet_config = { - NULL, /* Network interface */ - NULL, /* Use fixed network configuration */ - 0, /* Default network task priority */ - 0, /* Default mbuf capacity */ - 0, /* Default mbuf cluster capacity */ - "testSystem", /* Host name */ - "nowhere.com", /* Domain name */ - "127.0.0.1", /* Gateway */ - "127.0.0.1", /* Log host */ - {"127.0.0.1" }, /* Name server(s) */ - {"127.0.0.1" }, /* NTP server(s) */ - 1, /* sb_efficiency */ - 0, /* udp_tx_buf_size */ - 0, /* udp_rx_buf_size */ - 0, /* tcp_tx_buf_size */ - 0 /* tcp_rx_buf_size */ - }; -#endif diff --git a/cpukit/libmisc/monitor/mon-network.c b/cpukit/libmisc/monitor/mon-network.c deleted file mode 100644 index 2140044abe..0000000000 --- a/cpukit/libmisc/monitor/mon-network.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - * COPYRIGHT (c) 1989-2007. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -void mon_ifconfig(int argc, char *argv[], - uint32_t command_arg RTEMS_UNUSED, - bool verbose RTEMS_UNUSED) -{ - struct sockaddr_in ipaddr; - struct sockaddr_in dstaddr; - struct sockaddr_in netmask; - struct sockaddr_in broadcast; - char *iface; - int f_ip = 0; - int f_ptp = 0; - int f_netmask = 0; - int f_up = 0; - int f_down = 0; - int f_bcast = 0; - int cur_idx; - int rc; - int flags; - - memset(&ipaddr, 0, sizeof(ipaddr)); - memset(&dstaddr, 0, sizeof(dstaddr)); - memset(&netmask, 0, sizeof(netmask)); - memset(&broadcast, 0, sizeof(broadcast)); - - ipaddr.sin_len = sizeof(ipaddr); - ipaddr.sin_family = AF_INET; - - dstaddr.sin_len = sizeof(dstaddr); - dstaddr.sin_family = AF_INET; - - netmask.sin_len = sizeof(netmask); - netmask.sin_family = AF_INET; - - broadcast.sin_len = sizeof(broadcast); - broadcast.sin_family = AF_INET; - - cur_idx = 0; - if (argc <= 1) { - /* display all interfaces */ - iface = NULL; - cur_idx += 1; - } else { - iface = argv[1]; - if (isdigit((unsigned char)*argv[2])) { - if (inet_pton(AF_INET, argv[2], &ipaddr.sin_addr) < 0) { - printf("bad ip address: %s\n", argv[2]); - return; - } - f_ip = 1; - cur_idx += 3; - } else { - cur_idx += 2; - } - } - - if ((f_down !=0) && (f_ip != 0)) { - f_up = 1; - } - - while(argc > cur_idx) { - if (strcmp(argv[cur_idx], "up") == 0) { - f_up = 1; - if (f_down != 0) { - printf("Can't make interface up and down\n"); - } - } else if(strcmp(argv[cur_idx], "down") == 0) { - f_down = 1; - if (f_up != 0) { - printf("Can't make interface up and down\n"); - } - } else if(strcmp(argv[cur_idx], "netmask") == 0) { - if ((cur_idx + 1) >= argc) { - printf("No netmask address\n"); - return; - } - if (inet_pton(AF_INET, argv[cur_idx+1], &netmask.sin_addr) < 0) { - printf("bad netmask: %s\n", argv[cur_idx]); - return; - } - f_netmask = 1; - cur_idx += 1; - } else if(strcmp(argv[cur_idx], "broadcast") == 0) { - if ((cur_idx + 1) >= argc) { - printf("No broadcast address\n"); - return; - } - if (inet_pton(AF_INET, argv[cur_idx+1], &broadcast.sin_addr) < 0) { - printf("bad broadcast: %s\n", argv[cur_idx]); - return; - } - f_bcast = 1; - cur_idx += 1; - } else if(strcmp(argv[cur_idx], "pointopoint") == 0) { - if ((cur_idx + 1) >= argc) { - printf("No pointopoint address\n"); - return; - } - if (inet_pton(AF_INET, argv[cur_idx+1], &dstaddr.sin_addr) < 0) { - printf("bad pointopoint: %s\n", argv[cur_idx]); - return; - } - - f_ptp = 1; - cur_idx += 1; - } else { - printf("Bad parameter: %s\n", argv[cur_idx]); - return; - } - - cur_idx += 1; - } - - printf("ifconfig "); - if (iface != NULL) { - printf("%s ", iface); - if (f_ip != 0) { - char str[256]; - inet_ntop(AF_INET, &ipaddr.sin_addr, str, 256); - printf("%s ", str); - } - - if (f_netmask != 0) { - char str[256]; - inet_ntop(AF_INET, &netmask.sin_addr, str, 256); - printf("netmask %s ", str); - } - - if (f_bcast != 0) { - char str[256]; - inet_ntop(AF_INET, &broadcast.sin_addr, str, 256); - printf("broadcast %s ", str); - } - - if (f_ptp != 0) { - char str[256]; - inet_ntop(AF_INET, &dstaddr.sin_addr, str, 256); - printf("pointopoint %s ", str); - } - - if (f_up != 0) { - printf("up\n"); - } else if (f_down != 0) { - printf("down\n"); - } else { - printf("\n"); - } - } - - if ((iface == NULL) || ((f_ip == 0) && (f_down == 0) && (f_up == 0))) { - rtems_bsdnet_show_if_stats(); - return; - } - - flags = 0; - if (f_netmask) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFNETMASK, &netmask); - if (rc < 0) { - printf("Could not set netmask: %s\n", strerror(errno)); - return; - } - } - - if (f_bcast) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFBRDADDR, &broadcast); - if (rc < 0) { - printf("Could not set broadcast: %s\n", strerror(errno)); - return; - } - } - - if (f_ptp) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFDSTADDR, &dstaddr); - if (rc < 0) { - printf("Could not set destination address: %s\n", strerror(errno)); - return; - } - flags |= IFF_POINTOPOINT; - } - - /* This must come _after_ setting the netmask, broadcast addresses */ - if (f_ip) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFADDR, &ipaddr); - if (rc < 0) { - printf("Could not set IP address: %s\n", strerror(errno)); - return; - } - } - - if (f_up != 0) { - flags |= IFF_UP; - } - - if (f_down != 0) { - printf("Warning: taking interfaces down is not supported\n"); - } - - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFFLAGS, &flags); - if (rc < 0) { - printf("Could not set interface flags: %s\n", strerror(errno)); - return; - } -} - - - -void mon_route(int argc, char *argv[], - uint32_t command_arg RTEMS_UNUSED, - bool verbose RTEMS_UNUSED) -{ - int cmd; - struct sockaddr_in dst; - struct sockaddr_in gw; - struct sockaddr_in netmask; - int f_host; - int f_gw = 0; - int cur_idx; - int flags; - int rc; - - memset(&dst, 0, sizeof(dst)); - memset(&gw, 0, sizeof(gw)); - memset(&netmask, 0, sizeof(netmask)); - - dst.sin_len = sizeof(dst); - dst.sin_family = AF_INET; - dst.sin_addr.s_addr = inet_addr("0.0.0.0"); - - gw.sin_len = sizeof(gw); - gw.sin_family = AF_INET; - gw.sin_addr.s_addr = inet_addr("0.0.0.0"); - - netmask.sin_len = sizeof(netmask); - netmask.sin_family = AF_INET; - netmask.sin_addr.s_addr = inet_addr("255.255.255.0"); - - if (argc < 2) { - rtems_bsdnet_show_inet_routes(); - return; - } - - if (strcmp(argv[1], "add") == 0) { - cmd = RTM_ADD; - } else if (strcmp(argv[1], "del") == 0) { - cmd = RTM_DELETE; - } else { - printf("invalid command: %s\n", argv[1]); - printf("\tit should be 'add' or 'del'\n"); - return; - } - - if (argc < 3) { - printf("not enough arguments\n"); - return; - } - - if (strcmp(argv[2], "-host") == 0) { - f_host = 1; - } else if (strcmp(argv[2], "-net") == 0) { - f_host = 0; - } else { - printf("Invalid type: %s\n", argv[1]); - printf("\tit should be '-host' or '-net'\n"); - return; - } - - if (argc < 4) { - printf("not enough arguments\n"); - return; - } - - inet_pton(AF_INET, argv[3], &dst.sin_addr); - - cur_idx = 4; - while(cur_idx < argc) { - if (strcmp(argv[cur_idx], "gw") == 0) { - if ((cur_idx +1) >= argc) { - printf("no gateway address\n"); - return; - } - f_gw = 1; - inet_pton(AF_INET, argv[cur_idx + 1], &gw.sin_addr); - cur_idx += 1; - } else if(strcmp(argv[cur_idx], "netmask") == 0) { - if ((cur_idx +1) >= argc) { - printf("no netmask address\n"); - return; - } - f_gw = 1; - inet_pton(AF_INET, argv[cur_idx + 1], &netmask.sin_addr); - cur_idx += 1; - } else { - printf("Unknown argument: %s\n", argv[cur_idx]); - return; - } - cur_idx += 1; - } - - flags = RTF_STATIC; - if (f_gw != 0) { - flags |= RTF_GATEWAY; - } - if (f_host != 0) { - flags |= RTF_HOST; - } - - rc = rtems_bsdnet_rtrequest(cmd, - (struct sockaddr*) &dst, - (struct sockaddr*) &gw, - (struct sockaddr*) &netmask, flags, NULL); - if (rc < 0) { - printf("Error adding route\n"); - } -} diff --git a/cpukit/libmisc/shell/main_ifconfig.c b/cpukit/libmisc/shell/main_ifconfig.c deleted file mode 100644 index c19048f14f..0000000000 --- a/cpukit/libmisc/shell/main_ifconfig.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * IFCONFIG Command Implmentation - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - - -#include -#include -#include -#include "internal.h" - - -static const char IFCONFIG_USAGE[] = - "ifconfig [iface]\n" - "ifconfig iface options | addr\n" - " iface: name of the interface\n" - " options: iface \n" - " up: bring the interface up\n" - " down: take the interface down\n" - " netmask addr: network mask\n" - " broadcast addr: boardcast address\n" - " pointopoint addr: destination address for a PTP link\n" - "\n" - " addr: IP address"; - - -static int rtems_shell_main_ifconfig( - int argc, - char *argv[] -) -{ - struct sockaddr_in ipaddr; - struct sockaddr_in dstaddr; - struct sockaddr_in netmask; - struct sockaddr_in broadcast; - char *iface = NULL; - int f_ip = 0; - int f_ptp = 0; - int f_netmask = 0; - int f_up = 0; - int f_down = 0; - int f_bcast = 0; - int f_usage = 0; - int cur_idx; - int rc; - int flags; - - memset(&ipaddr, 0, sizeof(ipaddr)); - memset(&dstaddr, 0, sizeof(dstaddr)); - memset(&netmask, 0, sizeof(netmask)); - memset(&broadcast, 0, sizeof(broadcast)); - - ipaddr.sin_len = sizeof(ipaddr); - ipaddr.sin_family = AF_INET; - - dstaddr.sin_len = sizeof(dstaddr); - dstaddr.sin_family = AF_INET; - - netmask.sin_len = sizeof(netmask); - netmask.sin_family = AF_INET; - - broadcast.sin_len = sizeof(broadcast); - broadcast.sin_family = AF_INET; - - cur_idx = 0; - if (argc <= 1) { - /* display all interfaces */ - iface = NULL; - cur_idx += 1; - } else { - if ( 0 == strcmp( "--help", argv[1] ) ) { - f_usage = 1; - cur_idx += 2; - } else if ( 0 == strcmp( "-help", argv[1] ) ) { - f_usage = 1; - cur_idx += 2; - } else { - iface = argv[1]; - if ( argc >= 3 ) { - if (isdigit((unsigned char)*argv[2])) { - if (inet_pton(AF_INET, argv[2], &ipaddr.sin_addr) < 0) { - printf("bad ip address: %s\n", argv[2]); - return 0; - } - f_ip = 1; - cur_idx += 3; - } else { - cur_idx += 2; - } - } else { - cur_idx += 2; - } - } - } - - if ((f_down !=0) && (f_ip != 0)) { - f_up = 1; - } - - while(argc > cur_idx) { - if (strcmp(argv[cur_idx], "up") == 0) { - f_up = 1; - if (f_down != 0) { - printf("Can't make interface up and down\n"); - return -1; - } - } else if(strcmp(argv[cur_idx], "down") == 0) { - f_down = 1; - if (f_up != 0) { - printf("Can't make interface up and down\n"); - return -1; - } - } else if(strcmp(argv[cur_idx], "netmask") == 0) { - if ((cur_idx + 1) >= argc) { - printf("No netmask address\n"); - return -1; - } - if (inet_pton(AF_INET, argv[cur_idx+1], &netmask.sin_addr) < 0) { - printf("bad netmask: %s\n", argv[cur_idx]); - return -1; - } - f_netmask = 1; - cur_idx += 1; - } else if(strcmp(argv[cur_idx], "broadcast") == 0) { - if ((cur_idx + 1) >= argc) { - printf("No broadcast address\n"); - return -1; - } - if (inet_pton(AF_INET, argv[cur_idx+1], &broadcast.sin_addr) < 0) { - printf("bad broadcast: %s\n", argv[cur_idx]); - return -1; - } - f_bcast = 1; - cur_idx += 1; - } else if(strcmp(argv[cur_idx], "pointopoint") == 0) { - if ((cur_idx + 1) >= argc) { - printf("No pointopoint address\n"); - return -1; - } - if (inet_pton(AF_INET, argv[cur_idx+1], &dstaddr.sin_addr) < 0) { - printf("bad pointopoint: %s\n", argv[cur_idx]); - return -1; - } - f_ptp = 1; - cur_idx += 1; - } else { - printf("Bad parameter: %s\n", argv[cur_idx]); - return -1; - } - cur_idx += 1; - } - - printf("ifconfig "); - if (iface != NULL) { - printf("%s ", iface); - if (f_ip != 0) { - char str[256]; - inet_ntop(AF_INET, &ipaddr.sin_addr, str, 256); - printf("%s ", str); - } - - if (f_netmask != 0) { - char str[256]; - inet_ntop(AF_INET, &netmask.sin_addr, str, 256); - printf("netmask %s ", str); - } - - if (f_bcast != 0) { - char str[256]; - inet_ntop(AF_INET, &broadcast.sin_addr, str, 256); - printf("broadcast %s ", str); - } - - if (f_ptp != 0) { - char str[256]; - inet_ntop(AF_INET, &dstaddr.sin_addr, str, 256); - printf("pointopoint %s ", str); - } - - if (f_up != 0) { - printf("up\n"); - } else if (f_down != 0) { - printf("down\n"); - } else { - printf("\n"); - } - } else if (f_usage != 0) { - printf ( "\n" ); - printf ( IFCONFIG_USAGE ); - } - - if ( ! f_usage ) { - if ((iface == NULL) || ((f_ip == 0) && (f_down == 0) && (f_up == 0))) { - rtems_bsdnet_show_if_stats(); - return 0; - } - } - - flags = 0; - if (f_netmask) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFNETMASK, &netmask); - if (rc < 0) { - printf("Could not set netmask: %s\n", strerror(errno)); - return -1; - } - } - - if (f_bcast) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFBRDADDR, &broadcast); - if (rc < 0) { - printf("Could not set broadcast: %s\n", strerror(errno)); - return -1; - } - } - - if (f_ptp) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFDSTADDR, &dstaddr); - if (rc < 0) { - printf("Could not set destination address: %s\n", strerror(errno)); - return -1; - } - flags |= IFF_POINTOPOINT; - } - - /* This must come _after_ setting the netmask, broadcast addresses */ - if (f_ip) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFADDR, &ipaddr); - if (rc < 0) { - printf("Could not set IP address: %s\n", strerror(errno)); - return -1; - } - } - - if (f_up != 0) { - flags |= IFF_UP; - } - - if ( ! f_usage ) { - rc = rtems_bsdnet_ifconfig(iface, SIOCSIFFLAGS, &flags); - if (rc < 0) { - printf("Could not set interface flags: %s\n", strerror(errno)); - return -1; - } - } - - return 0; -} - -rtems_shell_cmd_t rtems_shell_IFCONFIG_Command = { - "ifconfig", /* name */ - IFCONFIG_USAGE, /* usage */ - "network", /* topic */ - rtems_shell_main_ifconfig, /* command */ - NULL, /* alias */ - NULL /* next */ -}; diff --git a/cpukit/libmisc/shell/main_netstats.c b/cpukit/libmisc/shell/main_netstats.c deleted file mode 100644 index 30007a6832..0000000000 --- a/cpukit/libmisc/shell/main_netstats.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Network Statistics Shell Command Implmentation - * - * COPYRIGHT (c) 1989-2008. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#define __need_getopt_newlib -#include - -#include -#include -#include -#include "internal.h" - -static void netstats_usage(void) -{ - printf( - "netstats [-vAimfpcut] where:\n" - " -A print All statistics\n" - " -i print Inet Routes\n" - " -m print MBUF Statistics\n" - " -f print IF Statistics\n" - " -p print IP Statistics\n" - " -c print ICMP Statistics\n" - " -u print UDP Statistics\n" - " -t print TCP Statistics\n" - ); -} - -static int rtems_shell_main_netstats( /* command */ - int argc, - char *argv[] -) -{ - int option; - int doAll = 0; - int doInetRoutes = 0; - int doMBUFStats = 0; - int doIFStats = 0; - int doIPStats = 0; - int doICMPStats = 0; - int doUDPStats = 0; - int doTCPStats = 0; - int verbose = 0; - struct getopt_data getopt_reent; - - memset(&getopt_reent, 0, sizeof(getopt_data)); - while ( (option = getopt_r( argc, argv, "Aimfpcutv", &getopt_reent)) != -1 ) { - - switch ((char)option) { - case 'A': doAll = 1; break; - case 'i': doInetRoutes = 1; break; - case 'm': doMBUFStats = 1; break; - case 'f': doIFStats = 1; break; - case 'p': doIPStats = 1; break; - case 'c': doICMPStats = 1; break; - case 'u': doUDPStats = 1; break; - case 't': doTCPStats = 1; break; - case 'v': verbose = 1; break; - case '?': - default: - netstats_usage(); - return -1; - } - } - - if ( verbose ) { - printf( - "doAll=%d\n" - "doInetRoutes=%d\n" - "doMBUFStats=%d\n" - "doIFStats=%d\n" - "doIPStats=%d\n" - "doICMPStats=%d\n" - "doUDPStats=%d\n" - "doTCPStats=%d\n", - doAll, - doInetRoutes, - doMBUFStats, - doIFStats, - doIPStats, - doICMPStats, - doUDPStats, - doTCPStats - ); - } - - if ( doInetRoutes == 1 || doAll == 1 ) { - rtems_bsdnet_show_inet_routes(); - } - - if ( doMBUFStats == 1 || doAll == 1 ) { - rtems_bsdnet_show_mbuf_stats(); - } - - if ( doIFStats == 1 || doAll == 1 ) { - rtems_bsdnet_show_if_stats(); - } - - if ( doIPStats == 1 || doAll == 1 ) { - rtems_bsdnet_show_ip_stats(); - } - - if ( doICMPStats == 1 || doAll == 1 ) { - rtems_bsdnet_show_icmp_stats(); - } - - if ( doUDPStats == 1 || doAll == 1 ) { - rtems_bsdnet_show_udp_stats(); - } - - if ( doTCPStats == 1 || doAll == 1 ) { - rtems_bsdnet_show_tcp_stats(); - } - - return 0; -} - -rtems_shell_cmd_t rtems_shell_NETSTATS_Command = { - "netstats", /* name */ - "netstats [-Aimfpcutv]", /* usage */ - "network", /* topic */ - rtems_shell_main_netstats, /* command */ - NULL, /* alias */ - NULL /* next */ -}; diff --git a/cpukit/libmisc/shell/main_ping.c b/cpukit/libmisc/shell/main_ping.c deleted file mode 100644 index 05dee34c89..0000000000 --- a/cpukit/libmisc/shell/main_ping.c +++ /dev/null @@ -1,1982 +0,0 @@ -#ifdef __rtems__ -#define __need_getopt_newlib -#include -#endif -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Muuss. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if !__rtems__ -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1989, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93"; -#endif /* not lint */ -#endif -#include -__FBSDID("$FreeBSD$"); - -/* - * P I N G . C - * - * Using the Internet Control Message Protocol (ICMP) "ECHO" facility, - * measure round-trip-delays and packet loss across network paths. - * - * Author - - * Mike Muuss - * U. S. Army Ballistic Research Laboratory - * December, 1983 - * - * Status - - * Public Domain. Distribution Unlimited. - * Bugs - - * More statistics could always be gathered. - * This program has to run SUID to ROOT to access the ICMP socket. - */ - -#include /* NB: we rely on this for */ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifdef IPSEC -#include -#endif /*IPSEC*/ - -#include -//#include "err.h" -#include -#if !defined(__rtems__) -#include -#endif -#include -#include -#include -#include -#include -//#include -#include - -#include "err.h" -#include "sysexits.h" -#include -#ifdef __rtems__ -#include -#endif /* __rtems__ */ - -#define INADDR_LEN ((int)sizeof(in_addr_t)) -#define TIMEVAL_LEN ((int)sizeof(struct tv32)) -#define MASK_LEN (ICMP_MASKLEN - ICMP_MINLEN) -#define TS_LEN (ICMP_TSLEN - ICMP_MINLEN) -#define DEFDATALEN 56 /* default data length */ -#define FLOOD_BACKOFF 20000 /* usecs to back off if F_FLOOD mode */ - /* runs out of buffer space */ -#define MAXIPLEN (sizeof(struct ip) + MAX_IPOPTLEN) -#define MAXICMPLEN (ICMP_ADVLENMIN + MAX_IPOPTLEN) -#define MAXWAIT 10000 /* max ms to wait for response */ -#define MAXALARM (60 * 60) /* max seconds for alarm timeout */ -#define MAXTOS 255 - -#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */ -#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */ -#define SET(bit) (A(bit) |= B(bit)) -#define CLR(bit) (A(bit) &= (~B(bit))) -#define TST(bit) (A(bit) & B(bit)) - -struct tv32 { - int32_t tv32_sec; - int32_t tv32_usec; -}; - -/* various options */ -#if !__rtems__ -int options; -#endif -#define F_FLOOD 0x0001 -#define F_INTERVAL 0x0002 -#define F_NUMERIC 0x0004 -#define F_PINGFILLED 0x0008 -#define F_QUIET 0x0010 -#define F_RROUTE 0x0020 -#define F_SO_DEBUG 0x0040 -#define F_SO_DONTROUTE 0x0080 -#define F_VERBOSE 0x0100 -#define F_QUIET2 0x0200 -#define F_NOLOOP 0x0400 -#define F_MTTL 0x0800 -#define F_MIF 0x1000 -#define F_AUDIBLE 0x2000 -#ifdef IPSEC -#ifdef IPSEC_POLICY_IPSEC -#define F_POLICY 0x4000 -#endif /*IPSEC_POLICY_IPSEC*/ -#endif /*IPSEC*/ -#define F_TTL 0x8000 -#define F_MISSED 0x10000 -#define F_ONCE 0x20000 -#define F_HDRINCL 0x40000 -#define F_MASK 0x80000 -#define F_TIME 0x100000 -#define F_SWEEP 0x200000 -#define F_WAITTIME 0x400000 - -/* - * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum - * number of received sequence numbers we can keep track of. Change 128 - * to 8192 for complete accuracy... - */ -#define MAX_DUP_CHK (8 * 128) -#if !__rtems__ -int mx_dup_ck = MAX_DUP_CHK; -char rcvd_tbl[MAX_DUP_CHK / 8]; - -struct sockaddr_in whereto; /* who to ping */ -int datalen = DEFDATALEN; -int maxpayload; -int s; /* socket file descriptor */ -u_char outpackhdr[IP_MAXPACKET], *outpack; -#endif -char BBELL = '\a'; /* characters written for MISSED and AUDIBLE */ -char BSPACE = '\b'; /* characters written for flood */ -char DOT = '.'; -#if !__rtems__ -char *hostname; -char *shostname; -int ident; /* process id to identify our packets */ -int uid; /* cached uid for micro-optimization */ -u_char icmp_type = ICMP_ECHO; -u_char icmp_type_rsp = ICMP_ECHOREPLY; -int phdr_len = 0; -int send_len; - -/* counters */ -long nmissedmax; /* max value of ntransmitted - nreceived - 1 */ -long npackets; /* max packets to transmit */ -long nreceived; /* # of packets we got back */ -long nrepeats; /* number of duplicates */ -long ntransmitted; /* sequence # for outbound packets = #sent */ -long snpackets; /* max packets to transmit in one sweep */ -long snreceived; /* # of packets we got back in this sweep */ -long sntransmitted; /* # of packets we sent in this sweep */ -int sweepmax; /* max value of payload in sweep */ -int sweepmin = 0; /* start value of payload in sweep */ -int sweepincr = 1; /* payload increment in sweep */ -int interval = 1000; /* interval between packets, ms */ -int waittime = MAXWAIT; /* timeout for each packet */ -long nrcvtimeout = 0; /* # of packets we got back after waittime */ - -/* timing */ -int timing; /* flag to do timing */ -double tmin = 999999999.0; /* minimum round trip time */ -double tmax = 0.0; /* maximum round trip time */ -double tsum = 0.0; /* sum of all times, for doing average */ -double tsumsq = 0.0; /* sum of all times squared, for std. dev. */ - -volatile sig_atomic_t finish_up; /* nonzero if we've been told to finish up */ -volatile sig_atomic_t siginfo_p; - -static void fill(char *, char *); -static u_short in_cksum(u_short *, int); -static void check_status(void); -static void finish(void) __dead2; -static void pinger(void); -static char *pr_addr(struct in_addr); -static char *pr_ntime(n_time); -static void pr_icmph(struct icmp *); -static void pr_iph(struct ip *); -static void pr_pack(char *, int, struct sockaddr_in *, struct timeval *); -static void pr_retip(struct ip *); -static void status(int); -static void stopit(int); -static void tvsub(struct timeval *, struct timeval *); -static void usage(void) __dead2; -#endif - -#if __rtems__ -#define CMSG_SPACE(l) (_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(l)) -#define CMSG_LEN(l) (_ALIGN(sizeof(struct cmsghdr)) + (l)) -typedef struct -{ - int options; - int mx_dup_ck; - char rcvd_tbl[MAX_DUP_CHK / 8]; - struct sockaddr_in whereto; - int datalen; - int maxpayload; - int s; - u_char outpackhdr[IP_MAXPACKET]; - u_char *outpack; - char *hostname; - char *shostname; - int ident; - int uid; - u_char icmp_type; - u_char icmp_type_rsp; - int phdr_len; - int send_len; - long nmissedmax; - long npackets; - long nreceived; - long nrepeats; - long ntransmitted; - long snpackets; - long snreceived; - long sntransmitted; - int sweepmax; - int sweepmin; - int sweepincr; - int interval; - int waittime; - long nrcvtimeout; - int timing; - double tmin; - double tmax; - double tsum; - double tsumsq; - volatile sig_atomic_t finish_up; - volatile sig_atomic_t siginfo_p; - - /* main */ - u_char packet[IP_MAXPACKET] __aligned(4); - - /* pr_pack */ - int old_rrlen; - char old_rr[MAX_IPOPTLEN]; - - int exit_code; - jmp_buf exit_jmp; -} rtems_shell_globals_t; - -#define options_ globals->options -#define mx_dup_ck globals->mx_dup_ck -#define rcvd_tbl globals->rcvd_tbl -#define whereto globals->whereto -#define datalen globals->datalen -#define maxpayload globals->maxpayload -#define s globals->s -#define outpackhdr globals->outpackhdr -#define outpack globals->outpack -#define hostname globals->hostname -#define shostname globals->shostname -#define ident globals->ident -#define uid globals->uid -#define icmp_type_ globals->icmp_type -#define icmp_type_rsp globals->icmp_type_rsp -#define phdr_len globals->phdr_len -#define send_len globals->send_len -#define nmissedmax globals->nmissedmax -#define npackets globals->npackets -#define nreceived globals->nreceived -#define nrepeats globals->nrepeats -#define ntransmitted globals->ntransmitted -#define snpackets globals->snpackets -#define snreceived globals->snreceived -#define sntransmitted globals->sntransmitted -#define sweepmax globals->sweepmax -#define sweepmin globals->sweepmin -#define sweepincr globals->sweepincr -#define interval globals->interval -#define waittime globals->waittime -#define nrcvtimeout globals->nrcvtimeout -#define timing globals->timing -#define tmin globals->tmin -#define tmax globals->tmax -#define tsum globals->tsum -#define tsumsq globals->tsumsq -#define finish_up globals->finish_up -#define siginfo_p globals->siginfo_p - -#define old_rrlen globals->old_rrlen -#define old_rr globals->old_rr - -#define packet_ globals->packet - -static u_short in_cksum(u_short *, int); -static char *pr_ntime(n_time); -static void pr_icmph(struct icmp *); -static void pr_iph(struct ip *); -static void pr_retip(struct ip *); -static void stopit(int); -static void tvsub(struct timeval *, struct timeval *); - -#define fill(_a1, _a2) g_fill(_a1, _a2, globals) -static void g_fill(char *_a1, char *_a2, rtems_shell_globals_t* globals); - -#define check_status() g_check_status(globals) -static void g_check_status(rtems_shell_globals_t* globals); - -#define finish() g_finish(globals) -static void g_finish(rtems_shell_globals_t* globals) __dead2; - -#define pinger() g_pinger(globals) -static void g_pinger(rtems_shell_globals_t* globals); - -#define pr_addr(_a1) g_pr_addr(_a1, globals) -static char *g_pr_addr(struct in_addr, rtems_shell_globals_t* globals); - -#define pr_pack(_a1, _a2, _a3, _a4) g_pr_pack(_a1, _a2, _a3, _a4, globals) -static void g_pr_pack(char *, int, struct sockaddr_in *, struct timeval *, rtems_shell_globals_t* globals); - -#define usage() g_usage(globals) -static void g_usage(rtems_shell_globals_t* globals) __dead2; - -static void -rtems_shell_ping_exit (rtems_shell_globals_t* globals, int code) -{ - globals->exit_code = code; - longjmp (globals->exit_jmp, 1); -} - -#define exit(_c) rtems_shell_ping_exit (globals, _c) -#define _exit(_c) exit(_c) - -static int main_ping(int argc, char *const *argv, rtems_shell_globals_t* globals); -static int rtems_shell_main_ping(int argc, char *argv[]) -{ - rtems_shell_globals_t* globals = malloc(sizeof(rtems_shell_globals_t)); - if (!globals) - { - printf("error: no memory\n"); - return 1; - } - memset (globals, 0, sizeof (rtems_shell_globals_t)); - npackets = 5; - datalen = DEFDATALEN; - icmp_type_ = ICMP_ECHO; - icmp_type_rsp = ICMP_ECHOREPLY; - phdr_len = 0; - sweepmin = 0; - sweepincr = 1; - interval = 1000; - waittime = MAXWAIT; - nrcvtimeout = 0; - tmin = 999999999.0; - tmax = 0.0; - tsum = 0.0; - tsumsq = 0.0; - globals->exit_code = 1; - if (setjmp (globals->exit_jmp) == 0) - return main_ping (argc, argv, globals); - return globals->exit_code; -} -#endif - - - -int -#ifdef __rtems__ -main_ping(argc, argv, globals) -#else -main(argc, argv) -#endif - int argc; - char *const *argv; - rtems_shell_globals_t* globals; -{ - struct sockaddr_in from, sock_in; - struct in_addr ifaddr; - struct timeval last, intvl; - struct iovec iov; - struct ip *ip; - struct msghdr msg; - struct sigaction si_sa; - size_t sz; -#if !__rtems__ - u_char *datap, packet[IP_MAXPACKET] __aligned(4); -#else - u_char *datap; -#endif - char *ep, *source, *target, *payload; - struct hostent *hp; -#ifdef IPSEC_POLICY_IPSEC - char *policy_in, *policy_out; -#endif - struct sockaddr_in *to; - double t; - u_long alarmtimeout, ultmp; - int almost_done, ch, df, hold, i, icmp_len, mib[4], preload, sockerrno, - tos, ttl; - char ctrl[CMSG_SPACE(sizeof(struct timeval))]; - char hnamebuf[MAXHOSTNAMELEN], snamebuf[MAXHOSTNAMELEN]; -#ifdef IP_OPTIONS - char rspace[MAX_IPOPTLEN]; /* record route space */ -#endif - unsigned char loop, mttl; -#ifdef __rtems__ - struct getopt_data getopt_reent; -#define optarg getopt_reent.optarg -#define optind getopt_reent.optind -#define opterr getopt.reent.opterr -#define optopt getopt.reent.optopt -#endif - - payload = source = NULL; -#ifdef IPSEC_POLICY_IPSEC - policy_in = policy_out = NULL; -#endif - - /* - * Do the stuff that we need root priv's for *first*, and - * then drop our setuid bit. Save error reporting for - * after arg parsing. - */ - s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); - sockerrno = errno; - - setuid(getuid()); - uid = getuid(); - - alarmtimeout = df = preload = tos = 0; - - outpack = outpackhdr + sizeof(struct ip); -#ifdef __rtems__ - memset(&getopt_reent, 0, sizeof(getopt_data)); - while ((ch = getopt_r(argc, argv, -#else - while ((ch = getopt(argc, argv, -#endif - "Aac:DdfG:g:h:I:i:Ll:M:m:nop:QqRrS:s:T:t:vW:z:" -#ifdef IPSEC -#ifdef IPSEC_POLICY_IPSEC - "P:" -#endif /*IPSEC_POLICY_IPSEC*/ -#endif /*IPSEC*/ -#ifdef __rtems__ - , &getopt_reent -#endif - )) != -1) - { - switch(ch) { - case 'A': - options_ |= F_MISSED; - break; - case 'a': - options_ |= F_AUDIBLE; - break; - case 'c': - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg || ultmp > LONG_MAX || !ultmp) - errx(&globals->exit_jmp, EX_USAGE, - "invalid count of packets to transmit: `%s'", - optarg); - npackets = ultmp; - break; - case 'D': - options_ |= F_HDRINCL; - df = 1; - break; - case 'd': - options_ |= F_SO_DEBUG; - break; - case 'f': - if (uid) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, "-f flag"); - } - options_ |= F_FLOOD; - setbuf(stdout, (char *)NULL); - break; - case 'G': /* Maximum packet size for ping sweep */ - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg) - errx(&globals->exit_jmp, EX_USAGE, "invalid packet size: `%s'", - optarg); - if (uid != 0 && ultmp > DEFDATALEN) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, - "packet size too large: %lu > %u", - ultmp, DEFDATALEN); - } - options_ |= F_SWEEP; - sweepmax = ultmp; - break; - case 'g': /* Minimum packet size for ping sweep */ - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg) - errx(&globals->exit_jmp, EX_USAGE, "invalid packet size: `%s'", - optarg); - if (uid != 0 && ultmp > DEFDATALEN) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, - "packet size too large: %lu > %u", - ultmp, DEFDATALEN); - } - options_ |= F_SWEEP; - sweepmin = ultmp; - break; - case 'h': /* Packet size increment for ping sweep */ - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg || ultmp < 1) - errx(&globals->exit_jmp, EX_USAGE, "invalid increment size: `%s'", - optarg); - if (uid != 0 && ultmp > DEFDATALEN) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, - "packet size too large: %lu > %u", - ultmp, DEFDATALEN); - } - options_ |= F_SWEEP; - sweepincr = ultmp; - break; - case 'I': /* multicast interface */ - if (inet_aton(optarg, &ifaddr) == 0) - errx(&globals->exit_jmp, EX_USAGE, - "invalid multicast interface: `%s'", - optarg); - options_ |= F_MIF; - break; - case 'i': /* wait between sending packets */ - t = strtod(optarg, &ep) * 1000.0; - if (*ep || ep == optarg || t > (double)INT_MAX) - errx(&globals->exit_jmp, EX_USAGE, "invalid timing interval: `%s'", - optarg); - options_ |= F_INTERVAL; - interval = (int)t; - if (uid && interval < 1000) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, "-i interval too short"); - } - break; - case 'L': - options_ |= F_NOLOOP; - loop = 0; - break; - case 'l': - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg || ultmp > INT_MAX) - errx(&globals->exit_jmp, EX_USAGE, - "invalid preload value: `%s'", optarg); - if (uid) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, "-l flag"); - } - preload = ultmp; - break; - case 'M': - switch(optarg[0]) { - case 'M': - case 'm': - options_ |= F_MASK; - break; - case 'T': - case 't': - options_ |= F_TIME; - break; - default: - errx(&globals->exit_jmp, EX_USAGE, "invalid message: `%c'", optarg[0]); - break; - } - break; - case 'm': /* TTL */ - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg || ultmp > MAXTTL) - errx(&globals->exit_jmp, EX_USAGE, "invalid TTL: `%s'", optarg); - ttl = ultmp; - options_ |= F_TTL; - break; - case 'n': - options_ |= F_NUMERIC; - break; - case 'o': - options_ |= F_ONCE; - break; -#ifdef IPSEC -#ifdef IPSEC_POLICY_IPSEC - case 'P': - options_ |= F_POLICY; - if (!strncmp("in", optarg, 2)) - policy_in = strdup(optarg); - else if (!strncmp("out", optarg, 3)) - policy_out = strdup(optarg); - else - errx(&globals->exit_jmp, 1, "invalid security policy"); - break; -#endif /*IPSEC_POLICY_IPSEC*/ -#endif /*IPSEC*/ - case 'p': /* fill buffer with user pattern */ - options_ |= F_PINGFILLED; - payload = optarg; - break; - case 'Q': - options_ |= F_QUIET2; - break; - case 'q': - options_ |= F_QUIET; - break; - case 'R': - options_ |= F_RROUTE; - break; - case 'r': - options_ |= F_SO_DONTROUTE; - break; - case 'S': - source = optarg; - break; - case 's': /* size of packet to send */ - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg) - errx(&globals->exit_jmp, EX_USAGE, "invalid packet size: `%s'", - optarg); - if (uid != 0 && ultmp > DEFDATALEN) { - errno = EPERM; - err(&globals->exit_jmp, EX_NOPERM, - "packet size too large: %lu > %u", - ultmp, DEFDATALEN); - } - datalen = ultmp; - break; - case 'T': /* multicast TTL */ - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg || ultmp > MAXTTL) - errx(&globals->exit_jmp, EX_USAGE, "invalid multicast TTL: `%s'", - optarg); - mttl = ultmp; - options_ |= F_MTTL; - break; - case 't': - alarmtimeout = strtoul(optarg, &ep, 0); - if ((alarmtimeout < 1) || (alarmtimeout == ULONG_MAX)) - errx(&globals->exit_jmp, EX_USAGE, "invalid timeout: `%s'", - optarg); - if (alarmtimeout > MAXALARM) - errx(&globals->exit_jmp, EX_USAGE, "invalid timeout: `%s' > %d", - optarg, MAXALARM); - alarm((int)alarmtimeout); - break; - case 'v': - options_ |= F_VERBOSE; - break; - case 'W': /* wait ms for answer */ - t = strtod(optarg, &ep); - if (*ep || ep == optarg || t > (double)INT_MAX) - errx(&globals->exit_jmp, EX_USAGE, "invalid timing interval: `%s'", - optarg); - options_ |= F_WAITTIME; - waittime = (int)t; - break; - case 'z': - options_ |= F_HDRINCL; - ultmp = strtoul(optarg, &ep, 0); - if (*ep || ep == optarg || ultmp > MAXTOS) - errx(&globals->exit_jmp, EX_USAGE, "invalid TOS: `%s'", optarg); - tos = ultmp; - break; - default: - usage(); - - } - } - - if (argc - optind != 1) - usage(); - - target = argv[optind]; - - switch (options_ & (F_MASK|F_TIME)) { - case 0: break; - case F_MASK: - icmp_type_ = ICMP_MASKREQ; - icmp_type_rsp = ICMP_MASKREPLY; - phdr_len = MASK_LEN; - if (!(options_ & F_QUIET)) - (void)printf("ICMP_MASKREQ\n"); - break; - case F_TIME: - icmp_type_ = ICMP_TSTAMP; - icmp_type_rsp = ICMP_TSTAMPREPLY; - phdr_len = TS_LEN; - if (!(options_ & F_QUIET)) - (void)printf("ICMP_TSTAMP\n"); - break; - default: - errx(&globals->exit_jmp, EX_USAGE, "ICMP_TSTAMP and ICMP_MASKREQ are exclusive."); - break; - } - icmp_len = sizeof(struct ip) + ICMP_MINLEN + phdr_len; - if (options_ & F_RROUTE) - icmp_len += MAX_IPOPTLEN; - maxpayload = IP_MAXPACKET - icmp_len; - if (datalen > maxpayload) - errx(&globals->exit_jmp, EX_USAGE, "packet size too large: %d > %d", datalen, - maxpayload); - send_len = icmp_len + datalen; - datap = &outpack[ICMP_MINLEN + phdr_len + TIMEVAL_LEN]; - if (options_ & F_PINGFILLED) { - fill((char *)datap, payload); - } - if (source) { - bzero((char *)&sock_in, sizeof(sock_in)); - sock_in.sin_family = AF_INET; - if (inet_aton(source, &sock_in.sin_addr) != 0) { - shostname = source; - } else { - hp = gethostbyname2(source, AF_INET); - if (!hp) - errx(&globals->exit_jmp, EX_NOHOST, "cannot resolve %s: %s", - source, hstrerror(h_errno)); - - sock_in.sin_len = sizeof sock_in; - if ((unsigned)hp->h_length > sizeof(sock_in.sin_addr) || - hp->h_length < 0) - errx(&globals->exit_jmp, 1, "gethostbyname2: illegal address"); - memcpy(&sock_in.sin_addr, hp->h_addr_list[0], - sizeof(sock_in.sin_addr)); - (void)strncpy(snamebuf, hp->h_name, - sizeof(snamebuf) - 1); - snamebuf[sizeof(snamebuf) - 1] = '\0'; - shostname = snamebuf; - } - if (bind(s, (struct sockaddr *)&sock_in, sizeof sock_in) == -1) - err(&globals->exit_jmp, 1, "bind"); - } - - bzero(&whereto, sizeof(whereto)); - to = &whereto; - to->sin_family = AF_INET; - to->sin_len = sizeof *to; - if (inet_aton(target, &to->sin_addr) != 0) { - hostname = target; - } else { - hp = gethostbyname2(target, AF_INET); - if (!hp) - errx(&globals->exit_jmp, EX_NOHOST, "cannot resolve %s: %s", - target, hstrerror(h_errno)); - - if ((unsigned)hp->h_length > sizeof(to->sin_addr)) - errx(&globals->exit_jmp, 1, "gethostbyname2 returned an illegal address"); - memcpy(&to->sin_addr, hp->h_addr_list[0], sizeof to->sin_addr); - (void)strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1); - hnamebuf[sizeof(hnamebuf) - 1] = '\0'; - hostname = hnamebuf; - } - - if (options_ & F_FLOOD && options_ & F_INTERVAL) - errx(&globals->exit_jmp, EX_USAGE, "-f and -i: incompatible options"); - - if (options_ & F_FLOOD && IN_MULTICAST(ntohl(to->sin_addr.s_addr))) - errx(&globals->exit_jmp, EX_USAGE, - "-f flag cannot be used with multicast destination"); - if (options_ & (F_MIF | F_NOLOOP | F_MTTL) - && !IN_MULTICAST(ntohl(to->sin_addr.s_addr))) - errx(&globals->exit_jmp, EX_USAGE, - "-I, -L, -T flags cannot be used with unicast destination"); - - if (datalen >= TIMEVAL_LEN) /* can we time transfer */ - timing = 1; - - if (!(options_ & F_PINGFILLED)) - for (i = TIMEVAL_LEN; i < datalen; ++i) - *datap++ = i; - - ident = getpid() & 0xFFFF; - - if (s < 0) { - errno = sockerrno; - err(&globals->exit_jmp, EX_OSERR, "socket"); - } - hold = 1; - if (options_ & F_SO_DEBUG) - (void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&hold, - sizeof(hold)); - if (options_ & F_SO_DONTROUTE) - (void)setsockopt(s, SOL_SOCKET, SO_DONTROUTE, (char *)&hold, - sizeof(hold)); -#ifdef IPSEC -#ifdef IPSEC_POLICY_IPSEC - if (options_ & F_POLICY) { - char *buf; - if (policy_in != NULL) { - buf = ipsec_set_policy(policy_in, strlen(policy_in)); - if (buf == NULL) - errx(&globals->exit_jmp, EX_CONFIG, "%s", ipsec_strerror()); - if (setsockopt(s, IPPROTO_IP, IP_IPSEC_POLICY, - buf, ipsec_get_policylen(buf)) < 0) - err(EX_CONFIG, - "ipsec policy cannot be configured"); - free(buf); - } - - if (policy_out != NULL) { - buf = ipsec_set_policy(policy_out, strlen(policy_out)); - if (buf == NULL) - errx(&globals->exit_jmp, EX_CONFIG, "%s", ipsec_strerror()); - if (setsockopt(s, IPPROTO_IP, IP_IPSEC_POLICY, - buf, ipsec_get_policylen(buf)) < 0) - err(EX_CONFIG, - "ipsec policy cannot be configured"); - free(buf); - } - } -#endif /*IPSEC_POLICY_IPSEC*/ -#endif /*IPSEC*/ - - if (options_ & F_HDRINCL) { - ip = (struct ip*)outpackhdr; - if (!(options_ & (F_TTL | F_MTTL))) { - mib[0] = CTL_NET; - mib[1] = PF_INET; - mib[2] = IPPROTO_IP; - mib[3] = IPCTL_DEFTTL; - sz = sizeof(ttl); - if (sysctl(mib, 4, &ttl, &sz, NULL, 0) == -1) - err(&globals->exit_jmp, 1, "sysctl(net.inet.ip.ttl)"); - } - setsockopt(s, IPPROTO_IP, IP_HDRINCL, &hold, sizeof(hold)); - ip->ip_v = IPVERSION; - ip->ip_hl = sizeof(struct ip) >> 2; - ip->ip_tos = tos; - ip->ip_id = 0; - ip->ip_off = df ? IP_DF : 0; - ip->ip_ttl = ttl; - ip->ip_p = IPPROTO_ICMP; - ip->ip_src.s_addr = source ? sock_in.sin_addr.s_addr : INADDR_ANY; - ip->ip_dst = to->sin_addr; - } - /* record route option */ - if (options_ & F_RROUTE) { -#ifdef IP_OPTIONS - bzero(rspace, sizeof(rspace)); - rspace[IPOPT_OPTVAL] = IPOPT_RR; - rspace[IPOPT_OLEN] = sizeof(rspace) - 1; - rspace[IPOPT_OFFSET] = IPOPT_MINOFF; - rspace[sizeof(rspace) - 1] = IPOPT_EOL; - if (setsockopt(s, IPPROTO_IP, IP_OPTIONS, rspace, - sizeof(rspace)) < 0) - err(&globals->exit_jmp, EX_OSERR, "setsockopt IP_OPTIONS"); -#else - errx(&globals->exit_jmp, EX_UNAVAILABLE, - "record route not available in this implementation"); -#endif /* IP_OPTIONS */ - } - - if (options_ & F_TTL) { - if (setsockopt(s, IPPROTO_IP, IP_TTL, &ttl, - sizeof(ttl)) < 0) { - err(&globals->exit_jmp, EX_OSERR, "setsockopt IP_TTL"); - } - } - if (options_ & F_NOLOOP) { - if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, - sizeof(loop)) < 0) { - err(&globals->exit_jmp, EX_OSERR, "setsockopt IP_MULTICAST_LOOP"); - } - } - if (options_ & F_MTTL) { - if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &mttl, - sizeof(mttl)) < 0) { - err(&globals->exit_jmp, EX_OSERR, "setsockopt IP_MULTICAST_TTL"); - } - } - if (options_ & F_MIF) { - if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &ifaddr, - sizeof(ifaddr)) < 0) { - err(&globals->exit_jmp, EX_OSERR, "setsockopt IP_MULTICAST_IF"); - } - } -#ifdef SO_TIMESTAMP - { int on = 1; - if (setsockopt(s, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on)) < 0) - err(&globals->exit_jmp, EX_OSERR, "setsockopt SO_TIMESTAMP"); - } -#endif - if (sweepmax) { - if (sweepmin >= sweepmax) - errx(&globals->exit_jmp, EX_USAGE, "Maximum packet size must be greater than the minimum packet size"); - - if (datalen != DEFDATALEN) - errx(&globals->exit_jmp, EX_USAGE, "Packet size and ping sweep are mutually exclusive"); - - if (npackets > 0) { - snpackets = npackets; - npackets = 0; - } else - snpackets = 1; - datalen = sweepmin; - send_len = icmp_len + sweepmin; - } - if (options_ & F_SWEEP && !sweepmax) - errx(&globals->exit_jmp, EX_USAGE, "Maximum sweep size must be specified"); - - /* - * When pinging the broadcast address, you can get a lot of answers. - * Doing something so evil is useful if you are trying to stress the - * ethernet, or just want to fill the arp cache to get some stuff for - * /etc/ethers. But beware: RFC 1122 allows hosts to ignore broadcast - * or multicast pings if they wish. - */ - - /* - * XXX receive buffer needs undetermined space for mbuf overhead - * as well. - */ - hold = IP_MAXPACKET + 128; - (void)setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&hold, - sizeof(hold)); - if (uid == 0) - (void)setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&hold, - sizeof(hold)); - - if (to->sin_family == AF_INET) { - (void)printf("PING %s (%s)", hostname, - inet_ntoa(to->sin_addr)); - if (source) - (void)printf(" from %s", shostname); - if (sweepmax) - (void)printf(": (%d ... %d) data bytes\n", - sweepmin, sweepmax); - else - (void)printf(": %d data bytes\n", datalen); - - } else { - if (sweepmax) - (void)printf("PING %s: (%d ... %d) data bytes\n", - hostname, sweepmin, sweepmax); - else - (void)printf("PING %s: %d data bytes\n", hostname, datalen); - } - - /* - * Use sigaction() instead of signal() to get unambiguous semantics, - * in particular with SA_RESTART not set. - */ - - sigemptyset(&si_sa.sa_mask); - si_sa.sa_flags = 0; - - si_sa.sa_handler = stopit; - if (sigaction(SIGINT, &si_sa, 0) == -1) { - err(&globals->exit_jmp, EX_OSERR, "sigaction SIGINT"); - } - -#ifdef SIGINFO - si_sa.sa_handler = status; - if (sigaction(SIGINFO, &si_sa, 0) == -1) { - err(EX_OSERR, "sigaction"); - } -#endif - - if (alarmtimeout > 0) { - si_sa.sa_handler = stopit; - if (sigaction(SIGALRM, &si_sa, 0) == -1) - err(&globals->exit_jmp, EX_OSERR, "sigaction SIGALRM"); - } - - bzero(&msg, sizeof(msg)); - msg.msg_name = (caddr_t)&from; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; -#ifdef SO_TIMESTAMP - msg.msg_control = (caddr_t)ctrl; -#endif - iov.iov_base = packet_; - iov.iov_len = IP_MAXPACKET; - - if (preload == 0) - pinger(); /* send the first ping */ - else { - if (npackets != 0 && preload > npackets) - preload = npackets; - while (preload--) /* fire off them quickies */ - pinger(); - } - (void)gettimeofday(&last, NULL); - - if (options_ & F_FLOOD) { - intvl.tv_sec = 0; - intvl.tv_usec = 10000; - } else { - intvl.tv_sec = interval / 1000; - intvl.tv_usec = interval % 1000 * 1000; - } - - almost_done = 0; - while (!finish_up) { - struct timeval now, timeout; - fd_set rfds; - int cc, n; - - check_status(); - if ((unsigned)s >= FD_SETSIZE) - errx(&globals->exit_jmp, EX_OSERR, "descriptor too large"); - FD_ZERO(&rfds); - FD_SET(s, &rfds); - (void)gettimeofday(&now, NULL); - timeout.tv_sec = last.tv_sec + intvl.tv_sec - now.tv_sec; - timeout.tv_usec = last.tv_usec + intvl.tv_usec - now.tv_usec; - while (timeout.tv_usec < 0) { - timeout.tv_usec += 1000000; - timeout.tv_sec--; - } - while (timeout.tv_usec >= 1000000) { - timeout.tv_usec -= 1000000; - timeout.tv_sec++; - } - if (timeout.tv_sec < 0) - timeout.tv_sec = timeout.tv_usec = 0; - n = select(s + 1, &rfds, NULL, NULL, &timeout); - if (n < 0) - continue; /* Must be EINTR. */ - if (n == 1) { - struct timeval *tv = NULL; -#ifdef SO_TIMESTAMP - struct cmsghdr *cmsg = (struct cmsghdr *)&ctrl; - - msg.msg_controllen = sizeof(ctrl); -#endif - - bzero(&msg, sizeof(msg)); - msg.msg_name = (caddr_t)&from; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; -#ifdef SO_TIMESTAMP - msg.msg_control = (caddr_t)ctrl; -#endif - iov.iov_base = packet_; - iov.iov_len = IP_MAXPACKET; - - msg.msg_namelen = sizeof(from); - if ((cc = recvmsg(s, &msg, 0)) < 0) { - if (errno == EINTR) - continue; - warn("recvmsg"); - continue; - } -#ifdef SO_TIMESTAMP - if (cmsg->cmsg_level == SOL_SOCKET && - cmsg->cmsg_type == SCM_TIMESTAMP && - cmsg->cmsg_len == CMSG_LEN(sizeof *tv)) { - /* Copy to avoid alignment problems: */ - memcpy(&now, CMSG_DATA(cmsg), sizeof(now)); - tv = &now; - } -#endif - if (tv == NULL) { - (void)gettimeofday(&now, NULL); - tv = &now; - } - pr_pack((char *)packet_, cc, &from, tv); - if ((options_ & F_ONCE && nreceived) || - (npackets && nreceived >= npackets)) - break; - } - if (n == 0 || options_ & F_FLOOD) { - if (sweepmax && sntransmitted == snpackets) { - for (i = 0; i < sweepincr ; ++i) - *datap++ = i; - datalen += sweepincr; - if (datalen > sweepmax) - break; - send_len = icmp_len + datalen; - sntransmitted = 0; - } - if (!npackets || ntransmitted < npackets) - pinger(); - else { - if (almost_done) - break; - almost_done = 1; - intvl.tv_usec = 0; - if (nreceived) { - intvl.tv_sec = 2 * tmax / 1000; - if (!intvl.tv_sec) - intvl.tv_sec = 1; - } else { - intvl.tv_sec = waittime / 1000; - intvl.tv_usec = waittime % 1000 * 1000; - } - } - (void)gettimeofday(&last, NULL); - if (ntransmitted - nreceived - 1 > nmissedmax) { - nmissedmax = ntransmitted - nreceived - 1; - if (options_ & F_MISSED) - (void)write(STDOUT_FILENO, &BBELL, 1); - } - } - } - finish(); -#ifdef __rtems__ - /* RTEMS shell programs return -- they do not exit */ - if (nreceived) - return(0); - else - return(2); -#endif - /* NOTREACHED */ - exit(0); /* Make the compiler happy */ -} - -/* - * stopit -- - * Set the global bit that causes the main loop to quit. - * Do NOT call finish() from here, since finish() does far too much - * to be called from a signal handler. - */ -void -stopit(sig) - int sig __unused; -{ -#if !__rtems__ - /* - * When doing reverse DNS lookups, the finish_up flag might not - * be noticed for a while. Just exit if we get a second SIGINT. - */ - if (!(options_ & F_NUMERIC) && finish_up) - _exit(nreceived ? 0 : 2); - finish_up = 1; -#endif -} - -/* - * pinger -- - * Compose and transmit an ICMP ECHO REQUEST packet. The IP packet - * will be added on by the kernel. The ID field is our UNIX process ID, - * and the sequence number is an ascending integer. The first TIMEVAL_LEN - * bytes of the data portion are used to hold a UNIX "timeval" struct in - * host byte-order, to compute the round-trip time. - */ -static void -g_pinger(globals) - rtems_shell_globals_t* globals; -{ - struct timeval now; - struct tv32 tv32; - struct ip *ip; - struct icmp *icp; - int cc, i; - u_char *packet; - - packet = outpack; - icp = (struct icmp *)outpack; - icp->icmp_type = icmp_type_; - icp->icmp_code = 0; - icp->icmp_cksum = 0; - icp->icmp_seq = htons(ntransmitted); - icp->icmp_id = ident; /* ID */ - - CLR(ntransmitted % mx_dup_ck); - - if ((options_ & F_TIME) || timing) { - (void)gettimeofday(&now, NULL); - - tv32.tv32_sec = htonl(now.tv_sec); - tv32.tv32_usec = htonl(now.tv_usec); - if (options_ & F_TIME) - icp->icmp_otime = htonl((now.tv_sec % (24*60*60)) - * 1000 + now.tv_usec / 1000); - if (timing) - bcopy((void *)&tv32, - (void *)&outpack[ICMP_MINLEN + phdr_len], - sizeof(tv32)); - } - - cc = ICMP_MINLEN + phdr_len + datalen; - - /* compute ICMP checksum here */ - icp->icmp_cksum = in_cksum((u_short *)icp, cc); - - if (options_ & F_HDRINCL) { - cc += sizeof(struct ip); - ip = (struct ip *)outpackhdr; - ip->ip_len = cc; - ip->ip_sum = in_cksum((u_short *)outpackhdr, cc); - packet = outpackhdr; - } - i = sendto(s, (char *)packet, cc, 0, (struct sockaddr *)&whereto, - sizeof(whereto)); - - if (i < 0 || i != cc) { - if (i < 0) { - if (options_ & F_FLOOD && errno == ENOBUFS) { - usleep(FLOOD_BACKOFF); - return; - } - warn("sendto"); - } else { - warn("%s: partial write: %d of %d bytes", - hostname, i, cc); - } - } - ntransmitted++; - sntransmitted++; - if (!(options_ & F_QUIET) && options_ & F_FLOOD) - (void)write(STDOUT_FILENO, &DOT, 1); -} - -/* - * pr_pack -- - * Print out the packet, if it came from us. This logic is necessary - * because ALL readers of the ICMP socket get a copy of ALL ICMP packets - * which arrive ('tis only fair). This permits multiple copies of this - * program to be run without having intermingled output (or statistics!). - */ -static void -g_pr_pack(buf, cc, from, tv, globals) - char *buf; - int cc; - struct sockaddr_in *from; - struct timeval *tv; - rtems_shell_globals_t* globals; -{ - struct in_addr ina; - u_char *cp, *dp; - struct icmp *icp; - struct ip *ip; - const void *tp; - double triptime; - int dupflag, hlen, i, j, recv_len, seq; -#if !__rtems__ - static int old_rrlen; - static char old_rr[MAX_IPOPTLEN]; -#endif - - /* Check the IP header */ - ip = (struct ip *)buf; - hlen = ip->ip_hl << 2; - recv_len = cc; - if (cc < hlen + ICMP_MINLEN) { - if (options_ & F_VERBOSE) - warn("packet too short (%d bytes) from %s", cc, - inet_ntoa(from->sin_addr)); - return; - } - - /* Now the ICMP part */ - cc -= hlen; - icp = (struct icmp *)(buf + hlen); - if (icp->icmp_type == icmp_type_rsp) { - if (icp->icmp_id != ident) - return; /* 'Twas not our ECHO */ - ++nreceived; - triptime = 0.0; - if (timing) { - struct timeval tv1; - struct tv32 tv32; -#ifndef icmp_data - tp = &icp->icmp_ip; -#else - tp = icp->icmp_data; -#endif - tp = (const char *)tp + phdr_len; - - if (cc - ICMP_MINLEN - phdr_len >= (int) sizeof(tv1)) { - /* Copy to avoid alignment problems: */ - memcpy(&tv32, tp, sizeof(tv32)); - tv1.tv_sec = ntohl(tv32.tv32_sec); - tv1.tv_usec = ntohl(tv32.tv32_usec); - tvsub(tv, &tv1); - triptime = ((double)tv->tv_sec) * 1000.0 + - ((double)tv->tv_usec) / 1000.0; - tsum += triptime; - tsumsq += triptime * triptime; - if (triptime < tmin) - tmin = triptime; - if (triptime > tmax) - tmax = triptime; - } else - timing = 0; - } - - seq = ntohs(icp->icmp_seq); - - if (TST(seq % mx_dup_ck)) { - ++nrepeats; - --nreceived; - dupflag = 1; - } else { - SET(seq % mx_dup_ck); - dupflag = 0; - } - - if (options_ & F_QUIET) - return; - - if (options_ & F_WAITTIME && triptime > waittime) { - ++nrcvtimeout; - return; - } - - if (options_ & F_FLOOD) - (void)write(STDOUT_FILENO, &BSPACE, 1); - else { - (void)printf("%d bytes from %s: icmp_seq=%u", cc, - inet_ntoa(*(struct in_addr *)&from->sin_addr.s_addr), - seq); - (void)printf(" ttl=%d", ip->ip_ttl); - if (timing) - (void)printf(" time=%.3f ms", triptime); - if (dupflag) - (void)printf(" (DUP!)"); - if (options_ & F_AUDIBLE) - (void)write(STDOUT_FILENO, &BBELL, 1); - if (options_ & F_MASK) { - /* Just prentend this cast isn't ugly */ - (void)printf(" mask=%s", - pr_addr(*(struct in_addr *)&(icp->icmp_mask))); - } - if (options_ & F_TIME) { - (void)printf(" tso=%s", pr_ntime(icp->icmp_otime)); - (void)printf(" tsr=%s", pr_ntime(icp->icmp_rtime)); - (void)printf(" tst=%s", pr_ntime(icp->icmp_ttime)); - } - if (recv_len != send_len) { - (void)printf( - "\nwrong total length %d instead of %d", - recv_len, send_len); - } - /* check the data */ - cp = (u_char*)&icp->icmp_data[phdr_len]; - dp = &outpack[ICMP_MINLEN + phdr_len]; - cc -= ICMP_MINLEN + phdr_len; - i = 0; - if (timing) { /* don't check variable timestamp */ - cp += TIMEVAL_LEN; - dp += TIMEVAL_LEN; - cc -= TIMEVAL_LEN; - i += TIMEVAL_LEN; - } - for (; i < datalen && cc > 0; ++i, ++cp, ++dp, --cc) { - if (*cp != *dp) { - (void)printf("\nwrong data byte #%d should be 0x%x but was 0x%x", - i, *dp, *cp); - (void)printf("\ncp:"); - cp = (u_char*)&icp->icmp_data[0]; - for (i = 0; i < datalen; ++i, ++cp) { - if ((i % 16) == 8) - (void)printf("\n\t"); - (void)printf("%2x ", *cp); - } - (void)printf("\ndp:"); - cp = &outpack[ICMP_MINLEN]; - for (i = 0; i < datalen; ++i, ++cp) { - if ((i % 16) == 8) - (void)printf("\n\t"); - (void)printf("%2x ", *cp); - } - break; - } - } - } - } else { - /* - * We've got something other than an ECHOREPLY. - * See if it's a reply to something that we sent. - * We can compare IP destination, protocol, - * and ICMP type and ID. - * - * Only print all the error messages if we are running - * as root to avoid leaking information not normally - * available to those not running as root. - */ -#ifndef icmp_data - struct ip *oip = &icp->icmp_ip; -#else - struct ip *oip = (struct ip *)icp->icmp_data; -#endif - struct icmp *oicmp = (struct icmp *)(oip + 1); - - if (((options_ & F_VERBOSE) && uid == 0) || - (!(options_ & F_QUIET2) && - (oip->ip_dst.s_addr == whereto.sin_addr.s_addr) && - (oip->ip_p == IPPROTO_ICMP) && - (oicmp->icmp_type == ICMP_ECHO) && - (oicmp->icmp_id == ident))) { - (void)printf("%d bytes from %s: ", cc, - pr_addr(from->sin_addr)); - pr_icmph(icp); - } else - return; - } - - /* Display any IP options */ - cp = (u_char *)buf + sizeof(struct ip); - - for (; hlen > (int)sizeof(struct ip); --hlen, ++cp) - switch (*cp) { - case IPOPT_EOL: - hlen = 0; - break; - case IPOPT_LSRR: - case IPOPT_SSRR: - (void)printf(*cp == IPOPT_LSRR ? - "\nLSRR: " : "\nSSRR: "); - j = cp[IPOPT_OLEN] - IPOPT_MINOFF + 1; - hlen -= 2; - cp += 2; - if (j >= INADDR_LEN && - j <= hlen - (int)sizeof(struct ip)) { - for (;;) { - bcopy(++cp, &ina.s_addr, INADDR_LEN); - if (ina.s_addr == 0) - (void)printf("\t0.0.0.0"); - else - (void)printf("\t%s", - pr_addr(ina)); - hlen -= INADDR_LEN; - cp += INADDR_LEN - 1; - j -= INADDR_LEN; - if (j < INADDR_LEN) - break; - (void)putchar('\n'); - } - } else - (void)printf("\t(truncated route)\n"); - break; - case IPOPT_RR: - j = cp[IPOPT_OLEN]; /* get length */ - i = cp[IPOPT_OFFSET]; /* and pointer */ - hlen -= 2; - cp += 2; - if (i > j) - i = j; - i = i - IPOPT_MINOFF + 1; - if (i < 0 || i > (hlen - (int)sizeof(struct ip))) { - old_rrlen = 0; - continue; - } - if (i == old_rrlen - && !bcmp((char *)cp, old_rr, i) - && !(options_ & F_FLOOD)) { - (void)printf("\t(same route)"); - hlen -= i; - cp += i; - break; - } - old_rrlen = i; - bcopy((char *)cp, old_rr, i); - (void)printf("\nRR: "); - if (i >= INADDR_LEN && - i <= hlen - (int)sizeof(struct ip)) { - for (;;) { - bcopy(++cp, &ina.s_addr, INADDR_LEN); - if (ina.s_addr == 0) - (void)printf("\t0.0.0.0"); - else - (void)printf("\t%s", - pr_addr(ina)); - hlen -= INADDR_LEN; - cp += INADDR_LEN - 1; - i -= INADDR_LEN; - if (i < INADDR_LEN) - break; - (void)putchar('\n'); - } - } else - (void)printf("\t(truncated route)"); - break; - case IPOPT_NOP: - (void)printf("\nNOP"); - break; - default: - (void)printf("\nunknown option %x", *cp); - break; - } - if (!(options_ & F_FLOOD)) { - (void)putchar('\n'); - (void)fflush(stdout); - } -} - -/* - * in_cksum -- - * Checksum routine for Internet Protocol family headers (C Version) - */ -u_short -in_cksum(addr, len) - u_short *addr; - int len; -{ - int nleft, sum; - u_short *w; - union { - u_short us; - u_char uc[2]; - } last; - u_short answer; - - nleft = len; - sum = 0; - w = addr; - - /* - * Our algorithm is simple, using a 32 bit accumulator (sum), we add - * sequential 16 bit words to it, and at the end, fold back all the - * carry bits from the top 16 bits into the lower 16 bits. - */ - while (nleft > 1) { - sum += *w++; - nleft -= 2; - } - - /* mop up an odd byte, if necessary */ - if (nleft == 1) { - last.uc[0] = *(u_char *)w; - last.uc[1] = 0; - sum += last.us; - } - - /* add back carry outs from top 16 bits to low 16 bits */ - sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ - sum += (sum >> 16); /* add carry */ - answer = ~sum; /* truncate to 16 bits */ - return(answer); -} - -/* - * tvsub -- - * Subtract 2 timeval structs: out = out - in. Out is assumed to - * be >= in. - */ -static void -tvsub(out, in) - struct timeval *out, *in; -{ - - if ((out->tv_usec -= in->tv_usec) < 0) { - --out->tv_sec; - out->tv_usec += 1000000; - } - out->tv_sec -= in->tv_sec; -} - -/* - * status -- - * Print out statistics when SIGINFO is received. - */ - -#if !defined(__rtems__) -static void -status(sig) - int sig __unused; -{ - siginfo_p = 1; -} -#endif - -static void -g_check_status(globals) - rtems_shell_globals_t* globals; -{ - if (siginfo_p) { - siginfo_p = 0; - (void)fprintf(stderr, "\r%ld/%ld packets received (%.1f%%)", - nreceived, ntransmitted, - ntransmitted ? nreceived * 100.0 / ntransmitted : 0.0); - if (nreceived && timing) - (void)fprintf(stderr, " %.3f min / %.3f avg / %.3f max", - tmin, tsum / (nreceived + nrepeats), tmax); - (void)fprintf(stderr, "\n"); - } -} - -/* - * finish -- - * Print out statistics, and give up. - */ -static void -g_finish(globals) - rtems_shell_globals_t* globals; -{ - - (void)signal(SIGINT, SIG_IGN); - (void)signal(SIGALRM, SIG_IGN); - (void)putchar('\n'); - (void)fflush(stdout); - (void)printf("--- %s ping statistics ---\n", hostname); - (void)printf("%ld packets transmitted, ", ntransmitted); - (void)printf("%ld packets received, ", nreceived); - if (nrepeats) - (void)printf("+%ld duplicates, ", nrepeats); - if (ntransmitted) { - if (nreceived > ntransmitted) - (void)printf("-- somebody's printing up packets!"); - else - (void)printf("%.1f%% packet loss", - ((ntransmitted - nreceived) * 100.0) / - ntransmitted); - } - if (nrcvtimeout) - (void)printf(", %ld packets out of wait time", nrcvtimeout); - (void)putchar('\n'); - if (nreceived && timing) { - double n = nreceived + nrepeats; - double avg = tsum / n; -#if defined(__rtems__) - (void) printf( - "round-trip min/avg/max/stddev = %.3f/%.3f/%.3f ms\n", - tmin, avg, tmax); -#else - double vari = tsumsq / n - avg * avg; - (void)printf( - "round-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms\n", - tmin, avg, tmax, sqrt(vari)); -#endif - } - if (nreceived) - exit(0); - else - exit(2); - while (1); -} - -#ifdef notdef -static char *ttab[] = { - "Echo Reply", /* ip + seq + udata */ - "Dest Unreachable", /* net, host, proto, port, frag, sr + IP */ - "Source Quench", /* IP */ - "Redirect", /* redirect type, gateway, + IP */ - "Echo", - "Time Exceeded", /* transit, frag reassem + IP */ - "Parameter Problem", /* pointer + IP */ - "Timestamp", /* id + seq + three timestamps */ - "Timestamp Reply", /* " */ - "Info Request", /* id + sq */ - "Info Reply" /* " */ -}; -#endif - -/* - * pr_icmph -- - * Print a descriptive string about an ICMP header. - */ -static void -pr_icmph(icp) - struct icmp *icp; -{ - - switch(icp->icmp_type) { - case ICMP_ECHOREPLY: - (void)printf("Echo Reply\n"); - /* XXX ID + Seq + Data */ - break; - case ICMP_UNREACH: - switch(icp->icmp_code) { - case ICMP_UNREACH_NET: - (void)printf("Destination Net Unreachable\n"); - break; - case ICMP_UNREACH_HOST: - (void)printf("Destination Host Unreachable\n"); - break; - case ICMP_UNREACH_PROTOCOL: - (void)printf("Destination Protocol Unreachable\n"); - break; - case ICMP_UNREACH_PORT: - (void)printf("Destination Port Unreachable\n"); - break; - case ICMP_UNREACH_NEEDFRAG: - (void)printf("frag needed and DF set (MTU %d)\n", - ntohs(icp->icmp_nextmtu)); - break; - case ICMP_UNREACH_SRCFAIL: - (void)printf("Source Route Failed\n"); - break; - case ICMP_UNREACH_FILTER_PROHIB: - (void)printf("Communication prohibited by filter\n"); - break; - default: - (void)printf("Dest Unreachable, Bad Code: %d\n", - icp->icmp_code); - break; - } - /* Print returned IP header information */ -#ifndef icmp_data - pr_retip(&icp->icmp_ip); -#else - pr_retip((struct ip *)icp->icmp_data); -#endif - break; - case ICMP_SOURCEQUENCH: - (void)printf("Source Quench\n"); -#ifndef icmp_data - pr_retip(&icp->icmp_ip); -#else - pr_retip((struct ip *)icp->icmp_data); -#endif - break; - case ICMP_REDIRECT: - switch(icp->icmp_code) { - case ICMP_REDIRECT_NET: - (void)printf("Redirect Network"); - break; - case ICMP_REDIRECT_HOST: - (void)printf("Redirect Host"); - break; - case ICMP_REDIRECT_TOSNET: - (void)printf("Redirect Type of Service and Network"); - break; - case ICMP_REDIRECT_TOSHOST: - (void)printf("Redirect Type of Service and Host"); - break; - default: - (void)printf("Redirect, Bad Code: %d", icp->icmp_code); - break; - } - (void)printf("(New addr: %s)\n", inet_ntoa(icp->icmp_gwaddr)); -#ifndef icmp_data - pr_retip(&icp->icmp_ip); -#else - pr_retip((struct ip *)icp->icmp_data); -#endif - break; - case ICMP_ECHO: - (void)printf("Echo Request\n"); - /* XXX ID + Seq + Data */ - break; - case ICMP_TIMXCEED: - switch(icp->icmp_code) { - case ICMP_TIMXCEED_INTRANS: - (void)printf("Time to live exceeded\n"); - break; - case ICMP_TIMXCEED_REASS: - (void)printf("Frag reassembly time exceeded\n"); - break; - default: - (void)printf("Time exceeded, Bad Code: %d\n", - icp->icmp_code); - break; - } -#ifndef icmp_data - pr_retip(&icp->icmp_ip); -#else - pr_retip((struct ip *)icp->icmp_data); -#endif - break; - case ICMP_PARAMPROB: - (void)printf("Parameter problem: pointer = 0x%02x\n", - icp->icmp_hun.ih_pptr); -#ifndef icmp_data - pr_retip(&icp->icmp_ip); -#else - pr_retip((struct ip *)icp->icmp_data); -#endif - break; - case ICMP_TSTAMP: - (void)printf("Timestamp\n"); - /* XXX ID + Seq + 3 timestamps */ - break; - case ICMP_TSTAMPREPLY: - (void)printf("Timestamp Reply\n"); - /* XXX ID + Seq + 3 timestamps */ - break; - case ICMP_IREQ: - (void)printf("Information Request\n"); - /* XXX ID + Seq */ - break; - case ICMP_IREQREPLY: - (void)printf("Information Reply\n"); - /* XXX ID + Seq */ - break; - case ICMP_MASKREQ: - (void)printf("Address Mask Request\n"); - break; - case ICMP_MASKREPLY: - (void)printf("Address Mask Reply\n"); - break; - case ICMP_ROUTERADVERT: - (void)printf("Router Advertisement\n"); - break; - case ICMP_ROUTERSOLICIT: - (void)printf("Router Solicitation\n"); - break; - default: - (void)printf("Bad ICMP type: %d\n", icp->icmp_type); - } -} - -/* - * pr_iph -- - * Print an IP header with options. - */ -static void -pr_iph(ip) - struct ip *ip; -{ - u_char *cp; - int hlen; - - hlen = ip->ip_hl << 2; - cp = (u_char *)ip + 20; /* point to options */ - - (void)printf("Vr HL TOS Len ID Flg off TTL Pro cks Src Dst\n"); - (void)printf(" %1x %1x %02x %04x %04x", - ip->ip_v, ip->ip_hl, ip->ip_tos, ntohs(ip->ip_len), - ntohs(ip->ip_id)); - (void)printf(" %1lx %04lx", - (u_long) (ntohl(ip->ip_off) & 0xe000) >> 13, - (u_long) ntohl(ip->ip_off) & 0x1fff); - (void)printf(" %02x %02x %04x", ip->ip_ttl, ip->ip_p, - ntohs(ip->ip_sum)); - (void)printf(" %s ", inet_ntoa(*(struct in_addr *)&ip->ip_src.s_addr)); - (void)printf(" %s ", inet_ntoa(*(struct in_addr *)&ip->ip_dst.s_addr)); - /* dump any option bytes */ - while (hlen-- > 20) { - (void)printf("%02x", *cp++); - } - (void)putchar('\n'); -} - -/* - * pr_addr -- - * Return an ascii host address as a dotted quad and optionally with - * a hostname. - */ -static char * -g_pr_addr(ina, globals) - struct in_addr ina; - rtems_shell_globals_t* globals; -{ - struct hostent *hp; - static char buf[16 + 3 + MAXHOSTNAMELEN]; - - if ((options_ & F_NUMERIC) || - !(hp = gethostbyaddr((char *)&ina, 4, AF_INET))) - return inet_ntoa(ina); - else - (void)snprintf(buf, sizeof(buf), "%s (%s)", hp->h_name, - inet_ntoa(ina)); - return(buf); -} - -/* - * pr_retip -- - * Dump some info on a returned (via ICMP) IP packet. - */ -static void -pr_retip(ip) - struct ip *ip; -{ - u_char *cp; - int hlen; - - pr_iph(ip); - hlen = ip->ip_hl << 2; - cp = (u_char *)ip + hlen; - - if (ip->ip_p == 6) - (void)printf("TCP: from port %u, to port %u (decimal)\n", - (*cp * 256 + *(cp + 1)), (*(cp + 2) * 256 + *(cp + 3))); - else if (ip->ip_p == 17) - (void)printf("UDP: from port %u, to port %u (decimal)\n", - (*cp * 256 + *(cp + 1)), (*(cp + 2) * 256 + *(cp + 3))); -} - -static char * -pr_ntime (n_time timestamp) -{ - static char buf[10]; - int hour, min, sec; - - sec = ntohl(timestamp) / 1000; - hour = sec / 60 / 60; - min = (sec % (60 * 60)) / 60; - sec = (sec % (60 * 60)) % 60; - - (void)snprintf(buf, sizeof(buf), "%02d:%02d:%02d", hour, min, sec); - - return (buf); -} - -static void -g_fill(bp, patp, globals) - char *bp, *patp; - rtems_shell_globals_t* globals; -{ - char *cp; - int pat[16]; - u_int ii, jj, kk; - - for (cp = patp; *cp; cp++) { - if (!isxdigit((int)*cp)) - errx(&globals->exit_jmp, EX_USAGE, - "patterns must be specified as hex digits"); - - } - ii = sscanf(patp, - "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", - &pat[0], &pat[1], &pat[2], &pat[3], &pat[4], &pat[5], &pat[6], - &pat[7], &pat[8], &pat[9], &pat[10], &pat[11], &pat[12], - &pat[13], &pat[14], &pat[15]); - - if (ii > 0) - for (kk = 0; kk <= maxpayload - (TIMEVAL_LEN + ii); kk += ii) - for (jj = 0; jj < ii; ++jj) - bp[jj + kk] = pat[jj]; - if (!(options_ & F_QUIET)) { - (void)printf("PATTERN: 0x"); - for (jj = 0; jj < ii; ++jj) - (void)printf("%02x", bp[jj] & 0xFF); - (void)printf("\n"); - } -} - -#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) -#define SECOPT " [-P policy]" -#else -#define SECOPT "" -#endif -static void -g_usage(globals) - rtems_shell_globals_t* globals; -{ - (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", -"usage: ping [-AaDdfnoQqRrv] [-c count] [-G sweepmaxsize] [-g sweepminsize]", -" [-h sweepincrsize] [-i wait] [-l preload] [-M mask | time] [-m ttl]", -" " SECOPT " [-p pattern] [-S src_addr] [-s packetsize] [-t timeout]", -" [-W waittime] [-z tos] host", -" ping [-AaDdfLnoQqRrv] [-c count] [-I iface] [-i wait] [-l preload]", -" [-M mask | time] [-m ttl]" SECOPT " [-p pattern] [-S src_addr]", -" [-s packetsize] [-T ttl] [-t timeout] [-W waittime]", -" [-z tos] mcast-group"); - exit(EX_USAGE); - while (1); -} - -#if __rtems__ - rtems_shell_cmd_t rtems_shell_PING_Command = { - "ping", /* name */ - "ping [args]", /* usage */ - "network", /* topic */ - rtems_shell_main_ping, /* command */ - NULL, /* alias */ - NULL /* next */ - }; -#endif diff --git a/cpukit/libmisc/shell/main_route.c b/cpukit/libmisc/shell/main_route.c deleted file mode 100644 index 3b322ca8b9..0000000000 --- a/cpukit/libmisc/shell/main_route.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * ROUTE Command Implmentation - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include "internal.h" - -static int rtems_shell_main_route( - int argc, - char *argv[] -) -{ - int cmd; - struct sockaddr_in dst; - struct sockaddr_in gw; - struct sockaddr_in netmask; - int f_host; - int f_gw = 0; - int cur_idx; - int flags; - int rc; - - memset(&dst, 0, sizeof(dst)); - memset(&gw, 0, sizeof(gw)); - memset(&netmask, 0, sizeof(netmask)); - - dst.sin_len = sizeof(dst); - dst.sin_family = AF_INET; - dst.sin_addr.s_addr = inet_addr("0.0.0.0"); - - gw.sin_len = sizeof(gw); - gw.sin_family = AF_INET; - gw.sin_addr.s_addr = inet_addr("0.0.0.0"); - - netmask.sin_len = sizeof(netmask); - netmask.sin_family = AF_INET; - netmask.sin_addr.s_addr = inet_addr("255.255.255.0"); - - if (argc < 2) { - rtems_bsdnet_show_inet_routes(); - return 0; - } - - if (strcmp(argv[1], "add") == 0) { - cmd = RTM_ADD; - } else if (strcmp(argv[1], "del") == 0) { - cmd = RTM_DELETE; - } else { - printf("invalid command: %s\n", argv[1]); - printf("\tit should be 'add' or 'del'\n"); - return -1; - } - - if (argc < 3) { - printf("not enough arguments\n"); - return -1; - } - - if (strcmp(argv[2], "-host") == 0) { - f_host = 1; - } else if (strcmp(argv[2], "-net") == 0) { - f_host = 0; - } else { - printf("Invalid type: %s\n", argv[1]); - printf("\tit should be '-host' or '-net'\n"); - return -1; - } - - if (argc < 4) { - printf("not enough arguments\n"); - return -1; - } - - inet_pton(AF_INET, argv[3], &dst.sin_addr); - - cur_idx = 4; - while(cur_idx < argc) { - if (strcmp(argv[cur_idx], "gw") == 0) { - if ((cur_idx +1) >= argc) { - printf("no gateway address\n"); - return -1; - } - f_gw = 1; - inet_pton(AF_INET, argv[cur_idx + 1], &gw.sin_addr); - cur_idx += 1; - } else if(strcmp(argv[cur_idx], "netmask") == 0) { - if ((cur_idx +1) >= argc) { - printf("no netmask address\n"); - return -1; - } - f_gw = 1; - inet_pton(AF_INET, argv[cur_idx + 1], &netmask.sin_addr); - cur_idx += 1; - } else { - printf("Unknown argument\n"); - return -1; - } - cur_idx += 1; - } - - flags = RTF_STATIC; - if (f_gw != 0) { - flags |= RTF_GATEWAY; - } - if (f_host != 0) { - flags |= RTF_HOST; - } - - rc = rtems_bsdnet_rtrequest( - cmd, - (struct sockaddr *)&dst, - (struct sockaddr *)&gw, - (struct sockaddr *)&netmask, - flags, - NULL - ); - if (rc < 0) { - printf("Error adding route\n"); - } - - return 0; -} - -rtems_shell_cmd_t rtems_shell_ROUTE_Command = { - "route", /* name */ - "TBD", /* usage */ - "network", /* topic */ - rtems_shell_main_route, /* command */ - NULL, /* alias */ - NULL /* next */ -}; diff --git a/cpukit/libnetworking/README b/cpukit/libnetworking/README deleted file mode 100644 index 2029b9179c..0000000000 --- a/cpukit/libnetworking/README +++ /dev/null @@ -1,68 +0,0 @@ -This is a snapshot of my attempt to fit the FreeBSD networking code into -RTEMS. Things seem to be working! - -Things that need to be done: - 1) More documentation! - 2) Figure out what's still not working :-) - 3) Rationalize the include files. Right now I have a special - hack in the Makefile to ensure that I pick up the FreeBSD versions - of the include files that are duplicated between RTEMS - and FreeBSD. - The network device driver source should move to the BSP source tree. - 4) Have a look at all the FIXME comments. - 5) Go through and make sure that all the source files are - free of undesired copyright restrictions. - -Initial Changes -=============== - -19-AUG-1998 snapshot - - Pulled BOOTP initialization out of rtems_glue. Applications which - don't used BOOTP are now about 5k smaller. - - Loopback interface is not installed by default, rather it is - attached like any other interface. Saves about 0.5 kbytes. - - Add rtems_bsdnet_show_if_stats(); - - Moved test programs from below freebsd directory. - -18-AUG-1998 snapshot - - Removed some include files that were already part of RTEMS. - - Cleaned up machine/types.h to prepare for inclusion in RTEMS source. - - Added syslog library routines -- much simpler than KA9Q version. - Sockets can be shared among tasks (as long as the send is - protected by a mutex) so there's no need for a Syslog Daemon. - -16-AUG-1998 snapshot - - Table-driven configuration (networkconfig.h). - - Cleaned up rtems_bsdnet.h. - - BOOTP now retries properly -- Note to Joel: - The dichotomy between RTEMS and UNIX error codes is - a real pain! - -14-AUG-1998 snapshot - - Added dummy getprotobyname() and getprotobynum() functions. - - Added socket ioctl. - - Added application-level entry to manipulate routing tables. - - Added non-BOOTP network initialization. - -13-AUG-1998 snapshot - - Changed some BOOTP addresses from sockaddr_in to inaddr; - - Get DNS information from BOOTP reply. - - Got DNS lookups working. - Bloatware comes to RTEMS -- invoking gethostbyname() drags in - and extra 40 kbytes of code! - - Added hostname lookup program. - -12-AUG-1998 snapshot - - Added startup delay to network initialization. - - More statistic-printing routines. - - Added TFTP driver and test program - - Modified TFTP test program to use networkconfig.h. - - Removed unused include files. - - Added from ftp://ftp.ca.FreeBSD.ORG/pub/FreeBSD/FreeBSD-current/src/lib/libc/net. - -11-AUG-1998 snapshot. - - Added getpeername() - - Added M68k versions of IP checksum code - - Added TCP timing program to snapshot. - -02-AUG-1998 snapshot. diff --git a/cpukit/libnetworking/arpa/nameser.h b/cpukit/libnetworking/arpa/nameser.h deleted file mode 100644 index d499611875..0000000000 --- a/cpukit/libnetworking/arpa/nameser.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 1983, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * From: Id: nameser.h,v 8.16 1998/02/06 00:35:58 halley Exp - * $FreeBSD: src/include/arpa/nameser.h,v 1.16 2002/03/23 17:24:55 imp Exp $ - */ - - -#ifndef _ARPA_NAMESER_H_ -#define _ARPA_NAMESER_H_ - -#define BIND_4_COMPAT - -#include -#include - -/* - * revision information. this is the release date in YYYYMMDD format. - * it can change every day so the right thing to do with it is use it - * in preprocessor commands such as "#if (__NAMESER > 19931104)". do not - * compare for equality; rather, use it to determine whether your libnameser.a - * is new enough to contain a certain feature. - */ - -/* XXXRTH I made this bigger than __BIND in 4.9.5 T6B */ -#define __NAMESER 19961001 /* New interface version stamp. */ - -/* - * Define constants based on RFC 883, RFC 1034, RFC 1035 - */ -#define NS_PACKETSZ 512 /* maximum packet size */ -#define NS_MAXDNAME 1025 /* maximum domain name */ -#define NS_MAXCDNAME 255 /* maximum compressed domain name */ -#define NS_MAXLABEL 63 /* maximum length of domain label */ -#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ -#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ -#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ -#define NS_INT32SZ 4 /* #/bytes of data in a u_int32_t */ -#define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */ -#define NS_INT8SZ 1 /* #/bytes of data in a u_int8_t */ -#define NS_INADDRSZ 4 /* IPv4 T_A */ -#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */ -#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ -#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ - -/* - * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord() - * in synch with it. - */ -typedef enum __ns_sect { - ns_s_qd = 0, /* Query: Question. */ - ns_s_zn = 0, /* Update: Zone. */ - ns_s_an = 1, /* Query: Answer. */ - ns_s_pr = 1, /* Update: Prerequisites. */ - ns_s_ns = 2, /* Query: Name servers. */ - ns_s_ud = 2, /* Update: Update. */ - ns_s_ar = 3, /* Query|Update: Additional records. */ - ns_s_max = 4 -} ns_sect; - -/* - * This is a message handle. It is caller allocated and has no dynamic data. - * This structure is intended to be opaque to all but ns_parse.c, thus the - * leading _'s on the member names. Use the accessor functions, not the _'s. - */ -typedef struct __ns_msg { - const u_char *_msg, *_eom; - u_int16_t _id, _flags, _counts[ns_s_max]; - const u_char *_sections[ns_s_max]; - ns_sect _sect; - int _rrnum; - const u_char *_ptr; -} ns_msg; - -/* Private data structure - do not use from outside library. */ -struct _ns_flagdata { int mask, shift; }; -extern struct _ns_flagdata _ns_flagdata[]; - -/* Accessor macros - this is part of the public interface. */ -#define ns_msg_getflag(handle, flag) ( \ - ((handle)._flags & _ns_flagdata[flag].mask) \ - >> _ns_flagdata[flag].shift \ - ) -#define ns_msg_id(handle) ((handle)._id + 0) -#define ns_msg_base(handle) ((handle)._msg + 0) -#define ns_msg_end(handle) ((handle)._eom + 0) -#define ns_msg_size(handle) ((handle)._eom - (handle)._msg) -#define ns_msg_count(handle, section) ((handle)._counts[section] + 0) - -/* - * This is a parsed record. It is caller allocated and has no dynamic data. - */ -typedef struct __ns_rr { - char name[NS_MAXDNAME]; /* XXX need to malloc */ - u_int16_t type; - u_int16_t rr_class; - u_int32_t ttl; - u_int16_t rdlength; - const u_char *rdata; -} ns_rr; - -/* Accessor macros - this is part of the public interface. */ -#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".") -#define ns_rr_type(rr) ((rr).type + 0) -#define ns_rr_class(rr) ((rr).rr_class + 0) -#define ns_rr_ttl(rr) ((rr).ttl + 0) -#define ns_rr_rdlen(rr) ((rr).rdlength + 0) -#define ns_rr_rdata(rr) ((rr).rdata + 0) - -/* - * These don't have to be in the same order as in the packet flags word, - * and they can even overlap in some cases, but they will need to be kept - * in synch with ns_parse.c:ns_flagdata[]. - */ -typedef enum __ns_flag { - ns_f_qr, /* Question/Response. */ - ns_f_opcode, /* Operation code. */ - ns_f_aa, /* Authoritative Answer. */ - ns_f_tc, /* Truncation occurred. */ - ns_f_rd, /* Recursion Desired. */ - ns_f_ra, /* Recursion Available. */ - ns_f_z, /* MBZ. */ - ns_f_ad, /* Authentic Data (DNSSEC). */ - ns_f_cd, /* Checking Disabled (DNSSEC). */ - ns_f_rcode, /* Response code. */ - ns_f_max -} ns_flag; - -/* - * Currently defined opcodes. - */ -typedef enum __ns_opcode { - ns_o_query = 0, /* Standard query. */ - ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ - ns_o_status = 2, /* Name server status query (unsupported). */ - /* Opcode 3 is undefined/reserved. */ - ns_o_notify = 4, /* Zone change notification. */ - ns_o_update = 5, /* Zone update message. */ - ns_o_max = 6 -} ns_opcode; - -/* - * Currently defined response codes. - */ -typedef enum __ns_rcode { - ns_r_noerror = 0, /* No error occurred. */ - ns_r_formerr = 1, /* Format error. */ - ns_r_servfail = 2, /* Server failure. */ - ns_r_nxdomain = 3, /* Name error. */ - ns_r_notimpl = 4, /* Unimplemented. */ - ns_r_refused = 5, /* Operation refused. */ - /* these are for BIND_UPDATE */ - ns_r_yxdomain = 6, /* Name exists */ - ns_r_yxrrset = 7, /* RRset exists */ - ns_r_nxrrset = 8, /* RRset does not exist */ - ns_r_notauth = 9, /* Not authoritative for zone */ - ns_r_notzone = 10, /* Zone of record different from zone section */ - ns_r_max = 11 -} ns_rcode; - -/* BIND_UPDATE */ -typedef enum __ns_update_operation { - ns_uop_delete = 0, - ns_uop_add = 1, - ns_uop_max = 2 -} ns_update_operation; - -/* - * This RR-like structure is particular to UPDATE. - */ -struct ns_updrec { - struct ns_updrec *r_prev; /* prev record */ - struct ns_updrec *r_next; /* next record */ - u_int8_t r_section; /* ZONE/PREREQUISITE/UPDATE */ - char * r_dname; /* owner of the RR */ - u_int16_t r_class; /* class number */ - u_int16_t r_type; /* type number */ - u_int32_t r_ttl; /* time to live */ - u_char * r_data; /* rdata fields as text string */ - u_int16_t r_size; /* size of r_data field */ - int r_opcode; /* type of operation */ - /* following fields for private use by the resolver/server routines */ - struct ns_updrec *r_grpnext; /* next record when grouped */ - struct databuf *r_dp; /* databuf to process */ - struct databuf *r_deldp; /* databuf's deleted/overwritten */ - u_int16_t r_zone; /* zone number on server */ -}; -typedef struct ns_updrec ns_updrec; - -/* - * Currently defined type values for resources and queries. - */ -typedef enum __ns_type { - ns_t_a = 1, /* Host address. */ - ns_t_ns = 2, /* Authoritative server. */ - ns_t_md = 3, /* Mail destination. */ - ns_t_mf = 4, /* Mail forwarder. */ - ns_t_cname = 5, /* Canonical name. */ - ns_t_soa = 6, /* Start of authority zone. */ - ns_t_mb = 7, /* Mailbox domain name. */ - ns_t_mg = 8, /* Mail group member. */ - ns_t_mr = 9, /* Mail rename name. */ - ns_t_null = 10, /* Null resource record. */ - ns_t_wks = 11, /* Well known service. */ - ns_t_ptr = 12, /* Domain name pointer. */ - ns_t_hinfo = 13, /* Host information. */ - ns_t_minfo = 14, /* Mailbox information. */ - ns_t_mx = 15, /* Mail routing information. */ - ns_t_txt = 16, /* Text strings. */ - ns_t_rp = 17, /* Responsible person. */ - ns_t_afsdb = 18, /* AFS cell database. */ - ns_t_x25 = 19, /* X_25 calling address. */ - ns_t_isdn = 20, /* ISDN calling address. */ - ns_t_rt = 21, /* Router. */ - ns_t_nsap = 22, /* NSAP address. */ - ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ - ns_t_sig = 24, /* Security signature. */ - ns_t_key = 25, /* Security key. */ - ns_t_px = 26, /* X.400 mail mapping. */ - ns_t_gpos = 27, /* Geographical position (withdrawn). */ - ns_t_aaaa = 28, /* Ip6 Address. */ - ns_t_loc = 29, /* Location Information. */ - ns_t_nxt = 30, /* Next domain (security). */ - ns_t_eid = 31, /* Endpoint identifier. */ - ns_t_nimloc = 32, /* Nimrod Locator. */ - ns_t_srv = 33, /* Server Selection. */ - ns_t_atma = 34, /* ATM Address */ - ns_t_naptr = 35, /* Naming Authority PoinTeR */ - ns_t_opt = 41, /* OPT pseudo-RR, RFC2761 */ - /* Query type values which do not appear in resource records. */ - ns_t_ixfr = 251, /* Incremental zone transfer. */ - ns_t_axfr = 252, /* Transfer zone of authority. */ - ns_t_mailb = 253, /* Transfer mailbox records. */ - ns_t_maila = 254, /* Transfer mail agent records. */ - ns_t_any = 255, /* Wildcard match. */ - ns_t_max = 65536 -} ns_type; - -/* - * Values for class field - */ -typedef enum __ns_class { - ns_c_in = 1, /* Internet. */ - /* Class 2 unallocated/unsupported. */ - ns_c_chaos = 3, /* MIT Chaos-net. */ - ns_c_hs = 4, /* MIT Hesiod. */ - /* Query class values which do not appear in resource records */ - ns_c_none = 254, /* for prereq. sections in update requests */ - ns_c_any = 255, /* Wildcard match. */ - ns_c_max = 65536 -} ns_class; - -/* - * Flags field of the KEY RR rdata - */ -#define NS_KEY_TYPEMASK 0xC000 /* Mask for "type" bits */ -#define NS_KEY_TYPE_AUTH_CONF 0x0000 /* Key usable for both */ -#define NS_KEY_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */ -#define NS_KEY_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */ -#define NS_KEY_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */ -/* The type bits can also be interpreted independently, as single bits: */ -#define NS_KEY_NO_AUTH 0x8000 /* Key unusable for authentication */ -#define NS_KEY_NO_CONF 0x4000 /* Key unusable for confidentiality */ -#define NS_KEY_EXPERIMENTAL 0x2000 /* Security is *mandatory* if bit=0 */ -#define NS_KEY_RESERVED3 0x1000 /* reserved - must be zero */ -#define NS_KEY_RESERVED4 0x0800 /* reserved - must be zero */ -#define NS_KEY_USERACCOUNT 0x0400 /* key is assoc. with a user acct */ -#define NS_KEY_ENTITY 0x0200 /* key is assoc. with entity eg host */ -#define NS_KEY_ZONEKEY 0x0100 /* key is zone key */ -#define NS_KEY_IPSEC 0x0080 /* key is for IPSEC (host or user)*/ -#define NS_KEY_EMAIL 0x0040 /* key is for email (MIME security) */ -#define NS_KEY_RESERVED10 0x0020 /* reserved - must be zero */ -#define NS_KEY_RESERVED11 0x0010 /* reserved - must be zero */ -#define NS_KEY_SIGNATORYMASK 0x000F /* key can sign RR's of same name */ - -#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED3 | \ - NS_KEY_RESERVED4 | \ - NS_KEY_RESERVED10 | \ - NS_KEY_RESERVED11 ) - -/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */ -#define NS_ALG_MD5RSA 1 /* MD5 with RSA */ -#define NS_ALG_EXPIRE_ONLY 253 /* No alg, no security */ -#define NS_ALG_PRIVATE_OID 254 /* Key begins with OID giving alg */ - -/* Signatures */ -#define NS_MD5RSA_MIN_BITS 512 /* Size of a mod or exp in bits */ -#define NS_MD5RSA_MAX_BITS 2552 - /* Total of binary mod and exp */ -#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3) - /* Max length of text sig block */ -#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4) - -/* Offsets into SIG record rdata to find various values */ -#define NS_SIG_TYPE 0 /* Type flags */ -#define NS_SIG_ALG 2 /* Algorithm */ -#define NS_SIG_LABELS 3 /* How many labels in name */ -#define NS_SIG_OTTL 4 /* Original TTL */ -#define NS_SIG_EXPIR 8 /* Expiration time */ -#define NS_SIG_SIGNED 12 /* Signature time */ -#define NS_SIG_FOOT 16 /* Key footprint */ -#define NS_SIG_SIGNER 18 /* Domain name of who signed it */ - -/* How RR types are represented as bit-flags in NXT records */ -#define NS_NXT_BITS 8 -#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS))) -#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS))) -#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS))) - - -/* - * Inline versions of get/put short/long. Pointer is advanced. - */ -#define NS_GET16(s, cp) { \ - register u_char *t_cp = (u_char *)(cp); \ - (s) = ((u_int16_t)t_cp[0] << 8) \ - | ((u_int16_t)t_cp[1]) \ - ; \ - (cp) += NS_INT16SZ; \ -} - -#define NS_GET32(l, cp) { \ - register u_char *t_cp = (u_char *)(cp); \ - (l) = ((u_int32_t)t_cp[0] << 24) \ - | ((u_int32_t)t_cp[1] << 16) \ - | ((u_int32_t)t_cp[2] << 8) \ - | ((u_int32_t)t_cp[3]) \ - ; \ - (cp) += NS_INT32SZ; \ -} - -#define NS_PUT16(s, cp) { \ - register u_int16_t t_s = (u_int16_t)(s); \ - register u_char *t_cp = (u_char *)(cp); \ - *t_cp++ = t_s >> 8; \ - *t_cp = t_s; \ - (cp) += NS_INT16SZ; \ -} - -#define NS_PUT32(l, cp) { \ - register u_int32_t t_l = (u_int32_t)(l); \ - register u_char *t_cp = (u_char *)(cp); \ - *t_cp++ = t_l >> 24; \ - *t_cp++ = t_l >> 16; \ - *t_cp++ = t_l >> 8; \ - *t_cp = t_l; \ - (cp) += NS_INT32SZ; \ -} - -/* - * ANSI C identifier hiding. - */ -#define ns_get16 __ns_get16 -#define ns_get32 __ns_get32 -#define ns_put16 __ns_put16 -#define ns_put32 __ns_put32 -#define ns_initparse __ns_initparse -#define ns_parserr __ns_parserr -#define ns_sprintrr __ns_sprintrr -#define ns_sprintrrf __ns_sprintrrf -#define ns_format_ttl __ns_format_ttl -#define ns_parse_ttl __ns_parse_ttl -#define ns_name_ntop __ns_name_ntop -#define ns_name_pton __ns_name_pton -#define ns_name_unpack __ns_name_unpack -#define ns_name_pack __ns_name_pack -#define ns_name_compress __ns_name_compress -#define ns_name_uncompress __ns_name_uncompress - -__BEGIN_DECLS -u_int ns_get16(const u_char *); -u_long ns_get32(const u_char *); -void ns_put16(u_int, u_char *); -void ns_put32(u_long, u_char *); -int ns_initparse(const u_char *, int, ns_msg *); -int ns_parserr(ns_msg *, ns_sect, int, ns_rr *); -int ns_sprintrr(const ns_msg *, const ns_rr *, - const char *, const char *, char *, size_t); -int ns_sprintrrf(const u_char *, size_t, const char *, - ns_class, ns_type, u_long, const u_char *, - size_t, const char *, const char *, - char *, size_t); -int ns_format_ttl(u_long, char *, size_t); -int ns_parse_ttl(const char *, u_long *); -int ns_name_ntop(const u_char *, char *, size_t); -int ns_name_pton(const char *, u_char *, size_t); -int ns_name_unpack(const u_char *, const u_char *, - const u_char *, u_char *, size_t); -int ns_name_pack(const u_char *, u_char *, int, - const u_char **, const u_char **); -int ns_name_uncompress(const u_char *, const u_char *, - const u_char *, char *, size_t); -int ns_name_compress(const char *, u_char *, size_t, - const u_char **, const u_char **); -int ns_name_skip(const u_char **, const u_char *); -__END_DECLS - -#ifdef BIND_4_COMPAT -#include -#endif - -#endif /* !_ARPA_NAMESER_H_ */ diff --git a/cpukit/libnetworking/arpa/nameser_compat.h b/cpukit/libnetworking/arpa/nameser_compat.h deleted file mode 100644 index 8fcceaa6c1..0000000000 --- a/cpukit/libnetworking/arpa/nameser_compat.h +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (c) 1983, 1989 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * from nameser.h 8.1 (Berkeley) 6/2/93 - * From: Id: nameser_compat.h,v 8.9 1998/03/20 23:25:10 halley Exp - */ - -#ifndef _ARPA_NAMESER_COMPAT_ -#define _ARPA_NAMESER_COMPAT_ - -#define __BIND 19950621 /* (DEAD) interface version stamp. */ - -#include - -#if !defined(BYTE_ORDER) || \ - (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \ - BYTE_ORDER != PDP_ENDIAN) - /* you must determine what the correct bit order is for - * your compiler - the next line is an intentional error - * which will force your compiles to bomb until you fix - * the above macros. - */ - error "Undefined or invalid BYTE_ORDER"; -#endif - -/* - * Structure for query header. The order of the fields is machine- and - * compiler-dependent, depending on the byte/bit order and the layout - * of bit fields. We use bit fields only in int variables, as this - * is all ANSI requires. This requires a somewhat confusing rearrangement. - */ - -typedef struct { - unsigned id :16; /* query identification number */ -#if BYTE_ORDER == BIG_ENDIAN - /* fields in third byte */ - unsigned qr: 1; /* response flag */ - unsigned opcode: 4; /* purpose of message */ - unsigned aa: 1; /* authoritive answer */ - unsigned tc: 1; /* truncated message */ - unsigned rd: 1; /* recursion desired */ - /* fields in fourth byte */ - unsigned ra: 1; /* recursion available */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ad: 1; /* authentic data from named */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned rcode :4; /* response code */ -#endif -#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN - /* fields in third byte */ - unsigned rd :1; /* recursion desired */ - unsigned tc :1; /* truncated message */ - unsigned aa :1; /* authoritive answer */ - unsigned opcode :4; /* purpose of message */ - unsigned qr :1; /* response flag */ - /* fields in fourth byte */ - unsigned rcode :4; /* response code */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned ad: 1; /* authentic data from named */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ra :1; /* recursion available */ -#endif - /* remaining bytes */ - unsigned qdcount :16; /* number of question entries */ - unsigned ancount :16; /* number of answer entries */ - unsigned nscount :16; /* number of authority entries */ - unsigned arcount :16; /* number of resource entries */ -} HEADER; - -#define PACKETSZ NS_PACKETSZ -#define MAXDNAME NS_MAXDNAME -#define MAXCDNAME NS_MAXCDNAME -#define MAXLABEL NS_MAXLABEL -#define HFIXEDSZ NS_HFIXEDSZ -#define QFIXEDSZ NS_QFIXEDSZ -#define RRFIXEDSZ NS_RRFIXEDSZ -#define INT32SZ NS_INT32SZ -#define INT16SZ NS_INT16SZ -#define INADDRSZ NS_INADDRSZ -#define IN6ADDRSZ NS_IN6ADDRSZ -#define INDIR_MASK NS_CMPRSFLGS -#define NAMESERVER_PORT NS_DEFAULTPORT - -#define S_ZONE ns_s_zn -#define S_PREREQ ns_s_pr -#define S_UPDATE ns_s_ud -#define S_ADDT ns_s_ar - -#define QUERY ns_o_query -#define IQUERY ns_o_iquery -#define STATUS ns_o_status -#define NS_NOTIFY_OP ns_o_notify -#define NS_UPDATE_OP ns_o_update - -#define NOERROR ns_r_noerror -#define FORMERR ns_r_formerr -#define SERVFAIL ns_r_servfail -#define NXDOMAIN ns_r_nxdomain -#define NOTIMP ns_r_notimpl -#define REFUSED ns_r_refused -#define YXDOMAIN ns_r_yxdomain -#define YXRRSET ns_r_yxrrset -#define NXRRSET ns_r_nxrrset -#define NOTAUTH ns_r_notauth -#define NOTZONE ns_r_notzone - -#define DELETE ns_uop_delete -#define ADD ns_uop_add - -#define T_A ns_t_a -#define T_NS ns_t_ns -#define T_MD ns_t_md -#define T_MF ns_t_mf -#define T_CNAME ns_t_cname -#define T_SOA ns_t_soa -#define T_MB ns_t_mb -#define T_MG ns_t_mg -#define T_MR ns_t_mr -#define T_NULL ns_t_null -#define T_WKS ns_t_wks -#define T_PTR ns_t_ptr -#define T_HINFO ns_t_hinfo -#define T_MINFO ns_t_minfo -#define T_MX ns_t_mx -#define T_TXT ns_t_txt -#define T_RP ns_t_rp -#define T_AFSDB ns_t_afsdb -#define T_X25 ns_t_x25 -#define T_ISDN ns_t_isdn -#define T_RT ns_t_rt -#define T_NSAP ns_t_nsap -#define T_NSAP_PTR ns_t_nsap_ptr -#define T_SIG ns_t_sig -#define T_KEY ns_t_key -#define T_PX ns_t_px -#define T_GPOS ns_t_gpos -#define T_AAAA ns_t_aaaa -#define T_LOC ns_t_loc -#define T_NXT ns_t_nxt -#define T_EID ns_t_eid -#define T_NIMLOC ns_t_nimloc -#define T_SRV ns_t_srv -#define T_ATMA ns_t_atma -#define T_NAPTR ns_t_naptr -#define T_IXFR ns_t_ixfr -#define T_AXFR ns_t_axfr -#define T_MAILB ns_t_mailb -#define T_MAILA ns_t_maila -#define T_ANY ns_t_any - -#define C_IN ns_c_in -#define C_CHAOS ns_c_chaos -#define C_HS ns_c_hs -/* BIND_UPDATE */ -#define C_NONE ns_c_none -#define C_ANY ns_c_any - -#define GETSHORT NS_GET16 -#define GETLONG NS_GET32 -#define PUTSHORT NS_PUT16 -#define PUTLONG NS_PUT32 - -#endif /* _ARPA_NAMESER_COMPAT_ */ diff --git a/cpukit/libnetworking/bpfilter.h b/cpukit/libnetworking/bpfilter.h deleted file mode 100644 index 87fc20463c..0000000000 --- a/cpukit/libnetworking/bpfilter.h +++ /dev/null @@ -1 +0,0 @@ -/* intentionally empty file */ diff --git a/cpukit/libnetworking/dev/mii/mii.h b/cpukit/libnetworking/dev/mii/mii.h deleted file mode 100644 index 14e45b0462..0000000000 --- a/cpukit/libnetworking/dev/mii/mii.h +++ /dev/null @@ -1,206 +0,0 @@ -/* $NetBSD: mii.h,v 1.9 2001/05/31 03:07:14 thorpej Exp $ */ - -/* - * Copyright (c) 1997 Manuel Bouyer. All rights reserved. - * - * Modification to match BSD/OS 3.0 MII interface by Jason R. Thorpe, - * Numerical Aerospace Simulation Facility, NASA Ames Research Center. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Manuel Bouyer. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: /repoman/r/ncvs/src/sys/dev/mii/mii.h,v 1.4 2002/04/29 11:57:28 phk Exp $ - */ - -#ifndef _DEV_MII_MII_H_ -#define _DEV_MII_MII_H_ - -/* - * Registers common to all PHYs. - */ - -#define MII_NPHY 32 /* max # of PHYs per MII */ - -/* - * MII commands, used if a device must drive the MII lines - * manually. - */ -#define MII_COMMAND_START 0x01 -#define MII_COMMAND_READ 0x02 -#define MII_COMMAND_WRITE 0x01 -#define MII_COMMAND_ACK 0x02 - -#define MII_BMCR 0x00 /* Basic mode control register (rw) */ -#define BMCR_RESET 0x8000 /* reset */ -#define BMCR_LOOP 0x4000 /* loopback */ -#define BMCR_SPEED0 0x2000 /* speed selection (LSB) */ -#define BMCR_AUTOEN 0x1000 /* autonegotiation enable */ -#define BMCR_PDOWN 0x0800 /* power down */ -#define BMCR_ISO 0x0400 /* isolate */ -#define BMCR_STARTNEG 0x0200 /* restart autonegotiation */ -#define BMCR_FDX 0x0100 /* Set duplex mode */ -#define BMCR_CTEST 0x0080 /* collision test */ -#define BMCR_SPEED1 0x0040 /* speed selection (MSB) */ - -#define BMCR_S10 0x0000 /* 10 Mb/s */ -#define BMCR_S100 BMCR_SPEED0 /* 100 Mb/s */ -#define BMCR_S1000 BMCR_SPEED1 /* 1000 Mb/s */ - -#define BMCR_SPEED(x) ((x) & (BMCR_SPEED0|BMCR_SPEED1)) - -#define MII_BMSR 0x01 /* Basic mode status register (ro) */ -#define BMSR_100T4 0x8000 /* 100 base T4 capable */ -#define BMSR_100TXFDX 0x4000 /* 100 base Tx full duplex capable */ -#define BMSR_100TXHDX 0x2000 /* 100 base Tx half duplex capable */ -#define BMSR_10TFDX 0x1000 /* 10 base T full duplex capable */ -#define BMSR_10THDX 0x0800 /* 10 base T half duplex capable */ -#define BMSR_100T2FDX 0x0400 /* 100 base T2 full duplex capable */ -#define BMSR_100T2HDX 0x0200 /* 100 base T2 half duplex capable */ -#define BMSR_EXTSTAT 0x0100 /* Extended status in register 15 */ -#define BMSR_MFPS 0x0040 /* MII Frame Preamble Suppression */ -#define BMSR_ACOMP 0x0020 /* Autonegotiation complete */ -#define BMSR_RFAULT 0x0010 /* Link partner fault */ -#define BMSR_ANEG 0x0008 /* Autonegotiation capable */ -#define BMSR_LINK 0x0004 /* Link status */ -#define BMSR_JABBER 0x0002 /* Jabber detected */ -#define BMSR_EXTCAP 0x0001 /* Extended capability */ - -/* - * Note that the EXTSTAT bit indicates that there is extended status - * info available in register 15, but 802.3 section 22.2.4.3 also - * states that that all 1000 Mb/s capable PHYs will set this bit to 1. - */ -#if 0 -#define BMSR_MEDIAMASK (BMSR_100T4|BMSR_100TXFDX|BMSR_100TXHDX|BMSR_10TFDX| \ - BMSR_10THDX|BMSR_ANEG) - -#else -/* NetBSD uses: */ -#define BMSR_MEDIAMASK (BMSR_100T4|BMSR_100TXFDX|BMSR_100TXHDX| \ - BMSR_10TFDX|BMSR_10THDX|BMSR_100T2FDX|BMSR_100T2HDX) -#endif - -/* - * Convert BMSR media capabilities to ANAR bits for autonegotiation. - * Note the shift chopps off the BMSR_ANEG bit. - */ -#define BMSR_MEDIA_TO_ANAR(x) (((x) & BMSR_MEDIAMASK) >> 6) - -#define MII_PHYIDR1 0x02 /* ID register 1 (ro) */ - -#define MII_PHYIDR2 0x03 /* ID register 2 (ro) */ -#define IDR2_OUILSB 0xfc00 /* OUI LSB */ -#define IDR2_MODEL 0x03f0 /* vendor model */ -#define IDR2_REV 0x000f /* vendor revision */ - -#define MII_OUI(id1, id2) (((id1) << 6) | ((id2) >> 10)) -#define MII_MODEL(id2) (((id2) & IDR2_MODEL) >> 4) -#define MII_REV(id2) ((id2) & IDR2_REV) - -#define MII_ANAR 0x04 /* Autonegotiation advertisement (rw) */ - /* section 28.2.4.1 and 37.2.6.1 */ -#define ANAR_NP 0x8000 /* Next page (ro) */ -#define ANAR_ACK 0x4000 /* link partner abilities acknowledged (ro) */ -#define ANAR_RF 0x2000 /* remote fault (ro) */ -#define ANAR_FC 0x0400 /* local device supports PAUSE */ -#define ANAR_T4 0x0200 /* local device supports 100bT4 */ -#define ANAR_TX_FD 0x0100 /* local device supports 100bTx FD */ -#define ANAR_TX 0x0080 /* local device supports 100bTx */ -#define ANAR_10_FD 0x0040 /* local device supports 10bT FD */ -#define ANAR_10 0x0020 /* local device supports 10bT */ -#define ANAR_CSMA 0x0001 /* protocol selector CSMA/CD */ - -#define ANAR_X_FD 0x0020 /* local device supports 1000BASE-X FD */ -#define ANAR_X_HD 0x0040 /* local device supports 1000BASE-X HD */ -#define ANAR_X_PAUSE_NONE (0 << 7) -#define ANAR_X_PAUSE_SYM (1 << 7) -#define ANAR_X_PAUSE_ASYM (2 << 7) -#define ANAR_X_PAUSE_TOWARDS (3 << 7) - -#define MII_ANLPAR 0x05 /* Autonegotiation lnk partner abilities (rw) */ - /* section 28.2.4.1 and 37.2.6.1 */ -#define ANLPAR_NP 0x8000 /* Next page (ro) */ -#define ANLPAR_ACK 0x4000 /* link partner accepted ACK (ro) */ -#define ANLPAR_RF 0x2000 /* remote fault (ro) */ -#define ANLPAR_FC 0x0400 /* link partner supports PAUSE */ -#define ANLPAR_T4 0x0200 /* link partner supports 100bT4 */ -#define ANLPAR_TX_FD 0x0100 /* link partner supports 100bTx FD */ -#define ANLPAR_TX 0x0080 /* link partner supports 100bTx */ -#define ANLPAR_10_FD 0x0040 /* link partner supports 10bT FD */ -#define ANLPAR_10 0x0020 /* link partner supports 10bT */ -#define ANLPAR_CSMA 0x0001 /* protocol selector CSMA/CD */ - -#define ANLPAR_X_FD 0x0020 /* local device supports 1000BASE-X FD */ -#define ANLPAR_X_HD 0x0040 /* local device supports 1000BASE-X HD */ -#define ANLPAR_X_PAUSE_MASK (3 << 7) -#define ANLPAR_X_PAUSE_NONE (0 << 7) -#define ANLPAR_X_PAUSE_SYM (1 << 7) -#define ANLPAR_X_PAUSE_ASYM (2 << 7) -#define ANLPAR_X_PAUSE_TOWARDS (3 << 7) - -#define MII_ANER 0x06 /* Autonegotiation expansion (ro) */ - /* section 28.2.4.1 and 37.2.6.1 */ -#define ANER_MLF 0x0010 /* multiple link detection fault */ -#define ANER_LPNP 0x0008 /* link parter next page-able */ -#define ANER_NP 0x0004 /* next page-able */ -#define ANER_PAGE_RX 0x0002 /* Page received */ -#define ANER_LPAN 0x0001 /* link parter autoneg-able */ - -#define MII_ANNP 0x07 /* Autonegotiation next page */ - /* section 28.2.4.1 and 37.2.6.1 */ - -#define MII_ANLPRNP 0x08 /* Autonegotiation link partner rx next page */ - /* section 32.5.1 and 37.2.6.1 */ - - /* This is also the 1000baseT control register */ -#define MII_100T2CR 0x09 /* 100base-T2 control register */ -#define GTCR_TEST_MASK 0xe000 /* see 802.3ab ss. 40.6.1.1.2 */ -#define GTCR_MAN_MS 0x1000 /* enable manual master/slave control */ -#define GTCR_ADV_MS 0x0800 /* 1 = adv. master, 0 = adv. slave */ -#define GTCR_PORT_TYPE 0x0400 /* 1 = DCE, 0 = DTE (NIC) */ -#define GTCR_ADV_1000TFDX 0x0200 /* adv. 1000baseT FDX */ -#define GTCR_ADV_1000THDX 0x0100 /* adv. 1000baseT HDX */ - - /* This is also the 1000baseT status register */ -#define MII_100T2SR 0x0a /* 100base-T2 status register */ -#define GTSR_MAN_MS_FLT 0x8000 /* master/slave config fault */ -#define GTSR_MS_RES 0x4000 /* result: 1 = master, 0 = slave */ -#define GTSR_LRS 0x2000 /* local rx status, 1 = ok */ -#define GTSR_RRS 0x1000 /* remove rx status, 1 = ok */ -#define GTSR_LP_1000TFDX 0x0800 /* link partner 1000baseT FDX capable */ -#define GTSR_LP_1000THDX 0x0400 /* link partner 1000baseT HDX capable */ -#define GTSR_LP_ASM_DIR 0x0200 /* link partner asym. pause dir. capable */ -#define GTSR_IDLE_ERR 0x00ff /* IDLE error count */ - -#define MII_EXTSR 0x0f /* Extended status register */ -#define EXTSR_1000XFDX 0x8000 /* 1000X full-duplex capable */ -#define EXTSR_1000XHDX 0x4000 /* 1000X half-duplex capable */ -#define EXTSR_1000TFDX 0x2000 /* 1000T full-duplex capable */ -#define EXTSR_1000THDX 0x1000 /* 1000T half-duplex capable */ - -#define EXTSR_MEDIAMASK (EXTSR_1000XFDX|EXTSR_1000XHDX| \ - EXTSR_1000TFDX|EXTSR_1000THDX) - -#endif /* _DEV_MII_MII_H_ */ diff --git a/cpukit/libnetworking/headers.am b/cpukit/libnetworking/headers.am deleted file mode 100644 index 3d52fa216a..0000000000 --- a/cpukit/libnetworking/headers.am +++ /dev/null @@ -1,125 +0,0 @@ -## In contrast to the other headers.am files, this file must be maintained by -## hand. - -include_HEADERS += libnetworking/ifaddrs.h -include_HEADERS += libnetworking/librtemsNfs.h -include_HEADERS += libnetworking/loop.h -include_HEADERS += libnetworking/resolv.h - -include_arpa_HEADERS += libnetworking/arpa/nameser.h -include_arpa_HEADERS += libnetworking/arpa/nameser_compat.h - -include_dev_mii_HEADERS += libnetworking/dev/mii/mii.h - -include_machine_HEADERS += libnetworking/machine/_align.h -include_machine_HEADERS += libnetworking/machine/_kernel_if.h -include_machine_HEADERS += libnetworking/machine/_kernel_lock.h -include_machine_HEADERS += libnetworking/machine/_kernel_socket.h -include_machine_HEADERS += libnetworking/machine/cpu.h -include_machine_HEADERS += libnetworking/machine/cpufunc.h -include_machine_HEADERS += libnetworking/machine/in_cksum.h -include_machine_HEADERS += libnetworking/machine/limits.h -include_machine_HEADERS += libnetworking/machine/vmparam.h - -include_net_HEADERS += libnetworking/net/bpf.h -include_net_HEADERS += libnetworking/net/ethernet.h -include_net_HEADERS += libnetworking/net/if_arp.h -include_net_HEADERS += libnetworking/net/if_dl.h -include_net_HEADERS += libnetworking/net/if_llc.h -include_net_HEADERS += libnetworking/net/if_media.h -include_net_HEADERS += libnetworking/net/if_ppp.h -include_net_HEADERS += libnetworking/net/if_pppvar.h -include_net_HEADERS += libnetworking/net/if_types.h -include_net_HEADERS += libnetworking/net/if_var.h -include_net_HEADERS += libnetworking/net/netisr.h -include_net_HEADERS += libnetworking/net/ppp_comp.h -include_net_HEADERS += libnetworking/net/ppp_defs.h -include_net_HEADERS += libnetworking/net/radix.h -include_net_HEADERS += libnetworking/net/raw_cb.h -include_net_HEADERS += libnetworking/net/route.h -include_net_HEADERS += libnetworking/net/slcompress.h - -include_netinet_HEADERS += libnetworking/netinet/icmp_var.h -include_netinet_HEADERS += libnetworking/netinet/if_ether.h -include_netinet_HEADERS += libnetworking/netinet/igmp.h -include_netinet_HEADERS += libnetworking/netinet/igmp_var.h -include_netinet_HEADERS += libnetworking/netinet/in_pcb.h -include_netinet_HEADERS += libnetworking/netinet/in_systm.h -include_netinet_HEADERS += libnetworking/netinet/in_var.h -include_netinet_HEADERS += libnetworking/netinet/ip.h -include_netinet_HEADERS += libnetworking/netinet/ip_fw.h -include_netinet_HEADERS += libnetworking/netinet/ip_icmp.h -include_netinet_HEADERS += libnetworking/netinet/ip_mroute.h -include_netinet_HEADERS += libnetworking/netinet/ip_var.h -include_netinet_HEADERS += libnetworking/netinet/tcp_debug.h -include_netinet_HEADERS += libnetworking/netinet/tcp_fsm.h -include_netinet_HEADERS += libnetworking/netinet/tcp_seq.h -include_netinet_HEADERS += libnetworking/netinet/tcp_timer.h -include_netinet_HEADERS += libnetworking/netinet/tcp_var.h -include_netinet_HEADERS += libnetworking/netinet/tcpip.h -include_netinet_HEADERS += libnetworking/netinet/udp.h -include_netinet_HEADERS += libnetworking/netinet/udp_var.h - -include_nfs_HEADERS += libnetworking/nfs/nfsproto.h -include_nfs_HEADERS += libnetworking/nfs/rpcv2.h -include_nfs_HEADERS += libnetworking/nfs/xdr_subs.h - -include_nfsclient_HEADERS += libnetworking/nfsclient/nfsargs.h -include_nfsclient_HEADERS += libnetworking/nfsclient/nfsdiskless.h - -include_rpc_HEADERS += libnetworking/rpc/auth.h -include_rpc_HEADERS += libnetworking/rpc/auth_unix.h -include_rpc_HEADERS += libnetworking/rpc/clnt.h -include_rpc_HEADERS += libnetworking/rpc/clnt_soc.h -include_rpc_HEADERS += libnetworking/rpc/clnt_stat.h -include_rpc_HEADERS += libnetworking/rpc/pmap_clnt.h -include_rpc_HEADERS += libnetworking/rpc/pmap_prot.h -include_rpc_HEADERS += libnetworking/rpc/pmap_rmt.h -include_rpc_HEADERS += libnetworking/rpc/rpc.h -include_rpc_HEADERS += libnetworking/rpc/rpc_com.h -include_rpc_HEADERS += libnetworking/rpc/rpc_msg.h -include_rpc_HEADERS += libnetworking/rpc/rpcent.h -include_rpc_HEADERS += libnetworking/rpc/svc.h -include_rpc_HEADERS += libnetworking/rpc/svc_auth.h -include_rpc_HEADERS += libnetworking/rpc/svc_soc.h -include_rpc_HEADERS += libnetworking/rpc/types.h -include_rpc_HEADERS += libnetworking/rpc/xdr.h - -include_rtems_HEADERS += libnetworking/rtems/bootp.h -include_rtems_HEADERS += libnetworking/rtems/dhcp.h -include_rtems_HEADERS += libnetworking/rtems/mkrootfs.h -include_rtems_HEADERS += libnetworking/rtems/rtems_bsdnet.h -include_rtems_HEADERS += libnetworking/rtems/rtems_bsdnet_internal.h -include_rtems_HEADERS += libnetworking/rtems/rtems_dhcp_failsafe.h -include_rtems_HEADERS += libnetworking/rtems/rtems_mii_ioctl.h -include_rtems_HEADERS += libnetworking/rtems/rtems_netdb.h -include_rtems_HEADERS += libnetworking/rtems/rtems_netinet_in.h -include_rtems_HEADERS += libnetworking/rtems/rtems_syscall.h - -include_rtems_bsdnet_HEADERS += libnetworking/rtems/bsdnet/_types.h -include_rtems_bsdnet_HEADERS += libnetworking/rtems/bsdnet/servers.h - -include_sys_HEADERS += libnetworking/sys/callout.h -include_sys_HEADERS += libnetworking/sys/conf.h -include_sys_HEADERS += libnetworking/sys/domain.h -include_sys_HEADERS += libnetworking/sys/kernel.h -include_sys_HEADERS += libnetworking/sys/libkern.h -include_sys_HEADERS += libnetworking/sys/linker_set.h -include_sys_HEADERS += libnetworking/sys/malloc.h -include_sys_HEADERS += libnetworking/sys/mbuf.h -include_sys_HEADERS += libnetworking/sys/mount.h -include_sys_HEADERS += libnetworking/sys/proc.h -include_sys_HEADERS += libnetworking/sys/protosw.h -include_sys_HEADERS += libnetworking/sys/reboot.h -include_sys_HEADERS += libnetworking/sys/resourcevar.h -include_sys_HEADERS += libnetworking/sys/selinfo.h -include_sys_HEADERS += libnetworking/sys/signalvar.h -include_sys_HEADERS += libnetworking/sys/socketvar.h -include_sys_HEADERS += libnetworking/sys/sysctl.h -include_sys_HEADERS += libnetworking/sys/systm.h -include_sys_HEADERS += libnetworking/sys/ucred.h - -include_vm_HEADERS += libnetworking/vm/vm.h -include_vm_HEADERS += libnetworking/vm/vm_extern.h -include_vm_HEADERS += libnetworking/vm/vm_kern.h -include_vm_HEADERS += libnetworking/vm/vm_param.h diff --git a/cpukit/libnetworking/ifaddrs.h b/cpukit/libnetworking/ifaddrs.h deleted file mode 100644 index 7d3aa953ec..0000000000 --- a/cpukit/libnetworking/ifaddrs.h +++ /dev/null @@ -1,56 +0,0 @@ -/* $FreeBSD: src/include/ifaddrs.h,v 1.3 2003/11/14 18:53:22 bms Exp $ */ - -/* - * Copyright (c) 1995, 1999 - * Berkeley Software Design, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp - */ - -#ifndef _IFADDRS_H_ -#define _IFADDRS_H_ - -struct ifaddrs { - struct ifaddrs *ifa_next; - char *ifa_name; - u_int ifa_flags; - struct sockaddr *ifa_addr; - struct sockaddr *ifa_netmask; - struct sockaddr *ifa_dstaddr; - void *ifa_data; -}; - -/* - * This may have been defined in . Note that if is - * to be included it must be included before this header file. - */ -#ifndef ifa_broadaddr -#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ -#endif - -#include - -__BEGIN_DECLS -extern int getifaddrs(struct ifaddrs **); -extern void freeifaddrs(struct ifaddrs *); -__END_DECLS - -#endif diff --git a/cpukit/libnetworking/kern/kern_mib.c b/cpukit/libnetworking/kern/kern_mib.c deleted file mode 100644 index c429ad4a8e..0000000000 --- a/cpukit/libnetworking/kern/kern_mib.c +++ /dev/null @@ -1,384 +0,0 @@ -#include - -/*- - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Karels at Berkeley Software Design, Inc. - * - * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD - * project, to make these variables more userfriendly. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 - * $FreeBSD: src/sys/kern/kern_mib.c,v 1.74 2005/02/28 21:42:56 wes Exp $ - */ - - -#ifndef __rtems__ -#include "opt_posix.h" -#endif - -#include -#include -#include -#include -#include -#ifndef __rtems__ -#include -#include -#include -#include -#endif -#include - -#ifdef __rtems__ -char machine[] = "SET ME"; -char osrelease[] = RTEMS_VERSION; -char ostype[] = "RTEMS"; -#endif - -SYSCTL_NODE(, 0, sysctl, CTLFLAG_RW, 0, - "Sysctl internal magic"); -SYSCTL_NODE(, CTL_KERN, kern, CTLFLAG_RW, 0, - "High kernel, proc, limits &c"); -#ifndef __rtems__ -SYSCTL_NODE(, CTL_VM, vm, CTLFLAG_RW, 0, - "Virtual memory"); -SYSCTL_NODE(, CTL_VFS, vfs, CTLFLAG_RW, 0, - "File system"); -#endif -SYSCTL_NODE(, CTL_NET, net, CTLFLAG_RW, 0, - "Network, (see socket.h)"); -#ifndef __rtems__ -SYSCTL_NODE(, CTL_DEBUG, debug, CTLFLAG_RW, 0, - "Debugging"); -SYSCTL_NODE(_debug, OID_AUTO, sizeof, CTLFLAG_RW, 0, - "Sizeof various things"); -SYSCTL_NODE(, CTL_HW, hw, CTLFLAG_RW, 0, - "hardware"); -SYSCTL_NODE(, CTL_MACHDEP, machdep, CTLFLAG_RW, 0, - "machine dependent"); -SYSCTL_NODE(, CTL_USER, user, CTLFLAG_RW, 0, - "user-level"); -SYSCTL_NODE(, CTL_P1003_1B, p1003_1b, CTLFLAG_RW, 0, - "p1003_1b, (see p1003_1b.h)"); - -SYSCTL_NODE(, OID_AUTO, compat, CTLFLAG_RW, 0, - "Compatibility code"); -SYSCTL_NODE(, OID_AUTO, security, CTLFLAG_RW, 0, - "Security"); -#ifdef REGRESSION -SYSCTL_NODE(, OID_AUTO, regression, CTLFLAG_RW, 0, - "Regression test MIB"); -#endif - -SYSCTL_STRING(_kern, OID_AUTO, ident, CTLFLAG_RD, - kern_ident, 0, "Kernel identifier"); -#endif /* __rtems__ */ - -SYSCTL_STRING(_kern, KERN_OSRELEASE, osrelease, CTLFLAG_RD, - osrelease, 0, "Operating system release"); - -SYSCTL_INT(_kern, KERN_OSREV, osrevision, CTLFLAG_RD, - 0, BSD, "Operating system revision"); - -#ifndef __rtems__ -SYSCTL_STRING(_kern, KERN_VERSION, version, CTLFLAG_RD, - version, 0, "Kernel version"); -#endif - -SYSCTL_STRING(_kern, KERN_OSTYPE, ostype, CTLFLAG_RD, - ostype, 0, "Operating system type"); - -#ifndef __rtems__ -extern int osreldate; -SYSCTL_INT(_kern, KERN_OSRELDATE, osreldate, CTLFLAG_RD, - &osreldate, 0, "Operating system release date"); - -SYSCTL_INT(_kern, KERN_MAXPROC, maxproc, CTLFLAG_RD, - &maxproc, 0, "Maximum number of processes"); - -SYSCTL_INT(_kern, KERN_MAXPROCPERUID, maxprocperuid, CTLFLAG_RW, - &maxprocperuid, 0, "Maximum processes allowed per userid"); - -SYSCTL_INT(_kern, OID_AUTO, maxusers, CTLFLAG_RD, - &maxusers, 0, "Hint for kernel tuning"); - -SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD, - 0, ARG_MAX, "Maximum bytes of argument to execve(2)"); - -SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD, - 0, _POSIX_VERSION, "Version of POSIX attempting to comply to"); - -SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RD, - 0, NGROUPS_MAX, "Maximum number of groups a user can belong to"); - -SYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD, - 0, 1, "Whether job control is available"); - -#ifdef _POSIX_SAVED_IDS -SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD, - 0, 1, "Whether saved set-group/user ID is available"); -#else -SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD, - 0, 0, "Whether saved set-group/user ID is available"); -#endif - -char kernelname[MAXPATHLEN] = "/kernel"; /* XXX bloat */ - -SYSCTL_STRING(_kern, KERN_BOOTFILE, bootfile, CTLFLAG_RW, - kernelname, sizeof kernelname, "Name of kernel file booted"); - -#ifdef SMP -SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD, - &mp_ncpus, 0, "Number of active CPUs"); -#else -SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD, - 0, 1, "Number of active CPUs"); -#endif - -SYSCTL_INT(_hw, HW_BYTEORDER, byteorder, CTLFLAG_RD, - 0, BYTE_ORDER, "System byte order"); - -SYSCTL_INT(_hw, HW_PAGESIZE, pagesize, CTLFLAG_RD, - 0, PAGE_SIZE, "System memory page size"); - -static int -sysctl_hw_physmem(SYSCTL_HANDLER_ARGS) -{ - u_long val; - - val = ctob(physmem); - return (sysctl_handle_long(oidp, &val, 0, req)); -} - -SYSCTL_PROC(_hw, HW_PHYSMEM, physmem, CTLTYPE_ULONG | CTLFLAG_RD, - 0, 0, sysctl_hw_physmem, "LU", ""); - -static int -sysctl_hw_usermem(SYSCTL_HANDLER_ARGS) -{ - u_long val; - - val = ctob(physmem - cnt.v_wire_count); - return (sysctl_handle_long(oidp, &val, 0, req)); -} - -SYSCTL_PROC(_hw, HW_USERMEM, usermem, CTLTYPE_ULONG | CTLFLAG_RD, - 0, 0, sysctl_hw_usermem, "LU", ""); - -SYSCTL_ULONG(_hw, OID_AUTO, availpages, CTLFLAG_RD, &physmem, 0, ""); - -static char machine_arch[] = MACHINE_ARCH; -SYSCTL_STRING(_hw, HW_MACHINE_ARCH, machine_arch, CTLFLAG_RD, - machine_arch, 0, "System architecture"); - -char hostname[MAXHOSTNAMELEN]; - -static int -sysctl_hostname(SYSCTL_HANDLER_ARGS) -{ - struct prison *pr; - char tmphostname[MAXHOSTNAMELEN]; - int error; - - pr = req->td->td_ucred->cr_prison; - if (pr != NULL) { - if (!jail_set_hostname_allowed && req->newptr) - return (EPERM); - /* - * Process is in jail, so make a local copy of jail - * hostname to get/set so we don't have to hold the jail - * mutex during the sysctl copyin/copyout activities. - */ - mtx_lock(&pr->pr_mtx); - bcopy(pr->pr_host, tmphostname, MAXHOSTNAMELEN); - mtx_unlock(&pr->pr_mtx); - - error = sysctl_handle_string(oidp, tmphostname, - sizeof pr->pr_host, req); - - if (req->newptr != NULL && error == 0) { - /* - * Copy the locally set hostname to the jail, if - * appropriate. - */ - mtx_lock(&pr->pr_mtx); - bcopy(tmphostname, pr->pr_host, MAXHOSTNAMELEN); - mtx_unlock(&pr->pr_mtx); - } - } else - error = sysctl_handle_string(oidp, - hostname, sizeof hostname, req); - return (error); -} - -SYSCTL_PROC(_kern, KERN_HOSTNAME, hostname, - CTLTYPE_STRING|CTLFLAG_RW|CTLFLAG_PRISON, - 0, 0, sysctl_hostname, "A", "Hostname"); - -static int regression_securelevel_nonmonotonic = 0; - -#ifdef REGRESSION -SYSCTL_INT(_regression, OID_AUTO, securelevel_nonmonotonic, CTLFLAG_RW, - ®ression_securelevel_nonmonotonic, 0, "securelevel may be lowered"); -#endif - -int securelevel = -1; -struct mtx securelevel_mtx; - -MTX_SYSINIT(securelevel_lock, &securelevel_mtx, "securelevel mutex lock", - MTX_DEF); - -static int -sysctl_kern_securelvl(SYSCTL_HANDLER_ARGS) -{ - struct prison *pr; - int error, level; - - pr = req->td->td_ucred->cr_prison; - - /* - * If the process is in jail, return the maximum of the global and - * local levels; otherwise, return the global level. - */ - if (pr != NULL) { - mtx_lock(&pr->pr_mtx); - level = imax(securelevel, pr->pr_securelevel); - mtx_unlock(&pr->pr_mtx); - } else - level = securelevel; - error = sysctl_handle_int(oidp, &level, 0, req); - if (error || !req->newptr) - return (error); - /* - * Permit update only if the new securelevel exceeds the - * global level, and local level if any. - */ - if (pr != NULL) { - mtx_lock(&pr->pr_mtx); - if (!regression_securelevel_nonmonotonic && - (level < imax(securelevel, pr->pr_securelevel))) { - mtx_unlock(&pr->pr_mtx); - return (EPERM); - } - pr->pr_securelevel = level; - mtx_unlock(&pr->pr_mtx); - } else { - mtx_lock(&securelevel_mtx); - if (!regression_securelevel_nonmonotonic && - (level < securelevel)) { - mtx_unlock(&securelevel_mtx); - return (EPERM); - } - securelevel = level; - mtx_unlock(&securelevel_mtx); - } - return (error); -} - -SYSCTL_PROC(_kern, KERN_SECURELVL, securelevel, - CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0, sysctl_kern_securelvl, - "I", "Current secure level"); - -char domainname[MAXHOSTNAMELEN]; -SYSCTL_STRING(_kern, KERN_NISDOMAINNAME, domainname, CTLFLAG_RW, - &domainname, sizeof(domainname), "Name of the current YP/NIS domain"); - -u_long hostid; -SYSCTL_ULONG(_kern, KERN_HOSTID, hostid, CTLFLAG_RW, &hostid, 0, "Host ID"); - -/* - * This is really cheating. These actually live in the libc, something - * which I'm not quite sure is a good idea anyway, but in order for - * getnext and friends to actually work, we define dummies here. - */ -SYSCTL_STRING(_user, USER_CS_PATH, cs_path, CTLFLAG_RD, - "", 0, "PATH that finds all the standard utilities"); -SYSCTL_INT(_user, USER_BC_BASE_MAX, bc_base_max, CTLFLAG_RD, - 0, 0, "Max ibase/obase values in bc(1)"); -SYSCTL_INT(_user, USER_BC_DIM_MAX, bc_dim_max, CTLFLAG_RD, - 0, 0, "Max array size in bc(1)"); -SYSCTL_INT(_user, USER_BC_SCALE_MAX, bc_scale_max, CTLFLAG_RD, - 0, 0, "Max scale value in bc(1)"); -SYSCTL_INT(_user, USER_BC_STRING_MAX, bc_string_max, CTLFLAG_RD, - 0, 0, "Max string length in bc(1)"); -SYSCTL_INT(_user, USER_COLL_WEIGHTS_MAX, coll_weights_max, CTLFLAG_RD, - 0, 0, "Maximum number of weights assigned to an LC_COLLATE locale entry"); -SYSCTL_INT(_user, USER_EXPR_NEST_MAX, expr_nest_max, CTLFLAG_RD, 0, 0, ""); -SYSCTL_INT(_user, USER_LINE_MAX, line_max, CTLFLAG_RD, - 0, 0, "Max length (bytes) of a text-processing utility's input line"); -SYSCTL_INT(_user, USER_RE_DUP_MAX, re_dup_max, CTLFLAG_RD, - 0, 0, "Maximum number of repeats of a regexp permitted"); -SYSCTL_INT(_user, USER_POSIX2_VERSION, posix2_version, CTLFLAG_RD, - 0, 0, - "The version of POSIX 1003.2 with which the system attempts to comply"); -SYSCTL_INT(_user, USER_POSIX2_C_BIND, posix2_c_bind, CTLFLAG_RD, - 0, 0, "Whether C development supports the C bindings option"); -SYSCTL_INT(_user, USER_POSIX2_C_DEV, posix2_c_dev, CTLFLAG_RD, - 0, 0, "Whether system supports the C development utilities option"); -SYSCTL_INT(_user, USER_POSIX2_CHAR_TERM, posix2_char_term, CTLFLAG_RD, - 0, 0, ""); -SYSCTL_INT(_user, USER_POSIX2_FORT_DEV, posix2_fort_dev, CTLFLAG_RD, - 0, 0, "Whether system supports FORTRAN development utilities"); -SYSCTL_INT(_user, USER_POSIX2_FORT_RUN, posix2_fort_run, CTLFLAG_RD, - 0, 0, "Whether system supports FORTRAN runtime utilities"); -SYSCTL_INT(_user, USER_POSIX2_LOCALEDEF, posix2_localedef, CTLFLAG_RD, - 0, 0, "Whether system supports creation of locales"); -SYSCTL_INT(_user, USER_POSIX2_SW_DEV, posix2_sw_dev, CTLFLAG_RD, - 0, 0, "Whether system supports software development utilities"); -SYSCTL_INT(_user, USER_POSIX2_UPE, posix2_upe, CTLFLAG_RD, - 0, 0, "Whether system supports the user portability utilities"); -SYSCTL_INT(_user, USER_STREAM_MAX, stream_max, CTLFLAG_RD, - 0, 0, "Min Maximum number of streams a process may have open at one time"); -SYSCTL_INT(_user, USER_TZNAME_MAX, tzname_max, CTLFLAG_RD, - 0, 0, "Min Maximum number of types supported for timezone names"); - -#include -SYSCTL_INT(_debug_sizeof, OID_AUTO, vnode, CTLFLAG_RD, - 0, sizeof(struct vnode), "sizeof(struct vnode)"); - -SYSCTL_INT(_debug_sizeof, OID_AUTO, proc, CTLFLAG_RD, - 0, sizeof(struct proc), "sizeof(struct proc)"); - -#include -SYSCTL_INT(_debug_sizeof, OID_AUTO, cdev, CTLFLAG_RD, - 0, sizeof(struct cdev), "sizeof(struct cdev)"); - -#include -#include -SYSCTL_INT(_debug_sizeof, OID_AUTO, bio, CTLFLAG_RD, - 0, sizeof(struct bio), "sizeof(struct bio)"); -SYSCTL_INT(_debug_sizeof, OID_AUTO, buf, CTLFLAG_RD, - 0, sizeof(struct buf), "sizeof(struct buf)"); - -#include -SYSCTL_INT(_debug_sizeof, OID_AUTO, kinfo_proc, CTLFLAG_RD, - 0, sizeof(struct kinfo_proc), "sizeof(struct kinfo_proc)"); - -#endif /* __rtems__ */ diff --git a/cpukit/libnetworking/kern/kern_subr.c b/cpukit/libnetworking/kern/kern_subr.c deleted file mode 100644 index 0c4b803eb5..0000000000 --- a/cpukit/libnetworking/kern/kern_subr.c +++ /dev/null @@ -1,157 +0,0 @@ -#include - -/* - * Copyright (c) 1982, 1986, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94 - */ - -#include -#include -#include -#include -#include -#include - -int -uiomove(void *cp, int n, struct uio *uio) -{ - register struct iovec *iov; - u_int cnt; - int error; - -#ifdef DIAGNOSTIC - if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) - panic("uiomove: mode"); -#endif - while (n > 0 && uio->uio_resid) { - iov = uio->uio_iov; - cnt = iov->iov_len; - if (cnt == 0) { - uio->uio_iov++; - uio->uio_iovcnt--; - continue; - } - if (cnt > n) - cnt = n; - - switch (uio->uio_segflg) { - - case UIO_USERSPACE: - if (uio->uio_rw == UIO_READ) - error = copyout(cp, iov->iov_base, cnt); - else - error = copyin(iov->iov_base, cp, cnt); - if (error) - return (error); - break; - - case UIO_SYSSPACE: - if (uio->uio_rw == UIO_READ) - bcopy((caddr_t)cp, iov->iov_base, cnt); - else - bcopy(iov->iov_base, (caddr_t)cp, cnt); - break; - case UIO_NOCOPY: - break; - } - iov->iov_base += cnt; - iov->iov_len -= cnt; - uio->uio_resid -= cnt; - uio->uio_offset += cnt; - cp += cnt; - n -= cnt; - } - return (0); -} - -/* - * General routine to allocate a hash table. - */ -void * -hashinit(elements, type, hashmask) - int elements, type; - u_long *hashmask; -{ - long hashsize; - LIST_HEAD(generic, generic) *hashtbl; - int i; - - if (elements <= 0) - panic("hashinit: bad elements"); - for (hashsize = 1; hashsize <= elements; hashsize <<= 1) - continue; - hashsize >>= 1; - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); - for (i = 0; i < hashsize; i++) - LIST_INIT(&hashtbl[i]); - *hashmask = hashsize - 1; - return (hashtbl); -} - -#define NPRIMES 27 -static int primes[] = { 1, 13, 31, 61, 127, 251, 509, 761, 1021, 1531, 2039, - 2557, 3067, 3583, 4093, 4603, 5119, 5623, 6143, 6653, - 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; - -/* - * General routine to allocate a prime number sized hash table. - */ -void * -phashinit(elements, type, nentries) - int elements, type; - u_long *nentries; -{ - long hashsize; - LIST_HEAD(generic, generic) *hashtbl; - int i; - - if (elements <= 0) - panic("phashinit: bad elements"); - for (i = 1, hashsize = primes[1]; hashsize <= elements;) { - i++; - if (i == NPRIMES) - break; - hashsize = primes[i]; - } - hashsize = primes[i - 1]; - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); - for (i = 0; i < hashsize; i++) - LIST_INIT(&hashtbl[i]); - *nentries = hashsize; - return (hashtbl); -} diff --git a/cpukit/libnetworking/kern/kern_sysctl.c b/cpukit/libnetworking/kern/kern_sysctl.c deleted file mode 100644 index c0a38f311b..0000000000 --- a/cpukit/libnetworking/kern/kern_sysctl.c +++ /dev/null @@ -1,1547 +0,0 @@ -#include - -/*- - * Copyright (c) 1982, 1986, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Karels at Berkeley Software Design, Inc. - * - * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD - * project, to make these variables more userfriendly. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 - * $FreeBSD: src/sys/kern/kern_sysctl.c,v 1.135 2002/10/27 07:12:34 rwatson Exp $ - */ - -#include "opt_compat.h" -#include "opt_mac.h" - -#include -#include -#include -#include -#include -#include -#ifndef __rtems__ -#include -#include -#include -#include -#include -#else -#include - -#include /* for snprintf() */ -size_t strlcpy(char *, const char *, size_t); -#endif -#include -#include - -#ifndef __rtems__ -static MALLOC_DEFINE(M_SYSCTL, "sysctl", "sysctl internal magic"); -static MALLOC_DEFINE(M_SYSCTLOID, "sysctloid", "sysctl dynamic oids"); -static MALLOC_DEFINE(M_SYSCTLTMP, "sysctltmp", "sysctl temp output buffer"); -#else -/* - * Currently these mean nothing on RTEMS. - */ -#define M_SYSCTLOID 1 -#define M_SYSCTLTMP 2 -#define M_ZERO 0 - -#define mtx_lock(l) -#define mtx_unlock(l) - -#endif - -#ifndef __rtems__ -/* - * Locking - this locks the sysctl tree in memory. - */ -static struct sx sysctllock; -#endif - -#ifdef __rtems__ -#define SYSCTL_LOCK() -#define SYSCTL_UNLOCK() -#define SYSCTL_INIT() -#else -#define SYSCTL_LOCK() sx_xlock(&sysctllock) -#define SYSCTL_UNLOCK() sx_xunlock(&sysctllock) -#define SYSCTL_INIT() sx_init(&sysctllock, "sysctl lock") -#endif - -static int sysctl_root(struct sysctl_oid *oidp, const void *arg1, - intptr_t arg2, struct sysctl_req *req); - -struct sysctl_oid_list sysctl__children; /* root list */ - -static struct sysctl_oid * -sysctl_find_oidname(const char *name, struct sysctl_oid_list *list) -{ - struct sysctl_oid *oidp; - - SLIST_FOREACH(oidp, list, oid_link) { - if (strcmp(oidp->oid_name, name) == 0) { - return (oidp); - } - } - return (NULL); -} - -/* - * Initialization of the MIB tree. - * - * Order by number in each list. - */ - -void -sysctl_register_oid(struct sysctl_oid *oidp) -{ - struct sysctl_oid_list *parent = oidp->oid_parent; - struct sysctl_oid *p; - struct sysctl_oid *q; - - /* - * First check if another oid with the same name already - * exists in the parent's list. - */ - p = sysctl_find_oidname(oidp->oid_name, parent); - if (p != NULL) { - if ((p->oid_kind & CTLTYPE) == CTLTYPE_NODE) { - p->oid_refcnt++; - return; - } else { - printf("can't re-use a leaf (%s)!\n", p->oid_name); - return; - } - } - /* - * If this oid has a number OID_AUTO, give it a number which - * is greater than any current oid. - * NOTE: DO NOT change the starting value here, change it in - * , and make sure it is at least 256 to - * accomodate e.g. net.inet.raw as a static sysctl node. - */ - if (oidp->oid_number == OID_AUTO) { - static int32_t newoid = CTL_AUTO_START; - - oidp->oid_number = newoid++; - if (newoid == 0x7fffffff) - panic("out of oids"); - } -#if 0 - else if (oidp->oid_number >= CTL_AUTO_START) { - /* do not panic; this happens when unregistering sysctl sets */ - printf("static sysctl oid too high: %d", oidp->oid_number); - } -#endif - - /* - * Insert the oid into the parent's list in order. - */ - q = NULL; - SLIST_FOREACH(p, parent, oid_link) { - if (oidp->oid_number < p->oid_number) - break; - q = p; - } - if (q) - SLIST_INSERT_AFTER(q, oidp, oid_link); - else - SLIST_INSERT_HEAD(parent, oidp, oid_link); -} - -void -sysctl_unregister_oid(struct sysctl_oid *oidp) -{ - SLIST_REMOVE(oidp->oid_parent, oidp, sysctl_oid, oid_link); -} - -/* Initialize a new context to keep track of dynamically added sysctls. */ -int -sysctl_ctx_init(struct sysctl_ctx_list *c) -{ - - if (c == NULL) { - return (EINVAL); - } - TAILQ_INIT(c); - return (0); -} - -/* Free the context, and destroy all dynamic oids registered in this context */ -int -sysctl_ctx_free(struct sysctl_ctx_list *clist) -{ - struct sysctl_ctx_entry *e, *e1; - int error; - - error = 0; - /* - * First perform a "dry run" to check if it's ok to remove oids. - * XXX FIXME - * XXX This algorithm is a hack. But I don't know any - * XXX better solution for now... - */ - TAILQ_FOREACH(e, clist, link) { - error = sysctl_remove_oid(e->entry, 0, 0); - if (error) - break; - } - /* - * Restore deregistered entries, either from the end, - * or from the place where error occured. - * e contains the entry that was not unregistered - */ - if (error) - e1 = TAILQ_PREV(e, sysctl_ctx_list, link); - else - e1 = TAILQ_LAST(clist, sysctl_ctx_list); - while (e1 != NULL) { - sysctl_register_oid(e1->entry); - e1 = TAILQ_PREV(e1, sysctl_ctx_list, link); - } - if (error) - return(EBUSY); - /* Now really delete the entries */ - e = TAILQ_FIRST(clist); - while (e != NULL) { - e1 = TAILQ_NEXT(e, link); - error = sysctl_remove_oid(e->entry, 1, 0); - if (error) - panic("sysctl_remove_oid: corrupt tree, entry: %s", - e->entry->oid_name); - free(e, M_SYSCTLOID); - e = e1; - } - return (error); -} - -/* Add an entry to the context */ -struct sysctl_ctx_entry * -sysctl_ctx_entry_add(struct sysctl_ctx_list *clist, struct sysctl_oid *oidp) -{ - struct sysctl_ctx_entry *e; - - if (clist == NULL || oidp == NULL) - return(NULL); - e = malloc(sizeof(struct sysctl_ctx_entry), M_SYSCTLOID, M_WAITOK); - e->entry = oidp; - TAILQ_INSERT_HEAD(clist, e, link); - return (e); -} - -/* Find an entry in the context */ -struct sysctl_ctx_entry * -sysctl_ctx_entry_find(struct sysctl_ctx_list *clist, struct sysctl_oid *oidp) -{ - struct sysctl_ctx_entry *e; - - if (clist == NULL || oidp == NULL) - return(NULL); - TAILQ_FOREACH(e, clist, link) { - if(e->entry == oidp) - return(e); - } - return (e); -} - -/* - * Delete an entry from the context. - * NOTE: this function doesn't free oidp! You have to remove it - * with sysctl_remove_oid(). - */ -int -sysctl_ctx_entry_del(struct sysctl_ctx_list *clist, struct sysctl_oid *oidp) -{ - struct sysctl_ctx_entry *e; - - if (clist == NULL || oidp == NULL) - return (EINVAL); - e = sysctl_ctx_entry_find(clist, oidp); - if (e != NULL) { - TAILQ_REMOVE(clist, e, link); - free(e, M_SYSCTLOID); - return (0); - } else - return (ENOENT); -} - -/* - * Remove dynamically created sysctl trees. - * oidp - top of the tree to be removed - * del - if 0 - just deregister, otherwise free up entries as well - * recurse - if != 0 traverse the subtree to be deleted - */ -int -sysctl_remove_oid(struct sysctl_oid *oidp, int del, int recurse) -{ - struct sysctl_oid *p; - int error; - - if (oidp == NULL) - return(EINVAL); - if ((oidp->oid_kind & CTLFLAG_DYN) == 0) { - printf("can't remove non-dynamic nodes!\n"); - return (EINVAL); - } - /* - * WARNING: normal method to do this should be through - * sysctl_ctx_free(). Use recursing as the last resort - * method to purge your sysctl tree of leftovers... - * However, if some other code still references these nodes, - * it will panic. - */ - if ((oidp->oid_kind & CTLTYPE) == CTLTYPE_NODE) { - if (oidp->oid_refcnt == 1) { - SLIST_FOREACH(p, SYSCTL_CHILDREN(oidp), oid_link) { - if (!recurse) - return (ENOTEMPTY); - error = sysctl_remove_oid(p, del, recurse); - if (error) - return (error); - } - if (del) - free(SYSCTL_CHILDREN(oidp), M_SYSCTLOID); - } - } - if (oidp->oid_refcnt > 1 ) { - oidp->oid_refcnt--; - } else { - if (oidp->oid_refcnt == 0) { - printf("Warning: bad oid_refcnt=%u (%s)!\n", - oidp->oid_refcnt, oidp->oid_name); - return (EINVAL); - } - sysctl_unregister_oid(oidp); - if (del) { - if (oidp->descr) - free((void *)(uintptr_t)(const void *)oidp->descr, M_SYSCTLOID); - free((void *)(uintptr_t)(const void *)oidp->oid_name, - M_SYSCTLOID); - free(oidp, M_SYSCTLOID); - } - } - return (0); -} - -/* - * Create new sysctls at run time. - * clist may point to a valid context initialized with sysctl_ctx_init(). - */ -struct sysctl_oid * -sysctl_add_oid(struct sysctl_ctx_list *clist, struct sysctl_oid_list *parent, - int number, const char *name, int kind, void *arg1, int arg2, - int (*handler)(SYSCTL_HANDLER_ARGS), const char *fmt, const char *descr) -{ - struct sysctl_oid *oidp; - ssize_t len; - char *newname; - - /* You have to hook up somewhere.. */ - if (parent == NULL) - return(NULL); - /* Check if the node already exists, otherwise create it */ - oidp = sysctl_find_oidname(name, parent); - if (oidp != NULL) { - if ((oidp->oid_kind & CTLTYPE) == CTLTYPE_NODE) { - oidp->oid_refcnt++; - /* Update the context */ - if (clist != NULL) - sysctl_ctx_entry_add(clist, oidp); - return (oidp); - } else { - printf("can't re-use a leaf (%s)!\n", name); - return (NULL); - } - } - oidp = malloc(sizeof(struct sysctl_oid), M_SYSCTLOID, M_WAITOK|M_ZERO); - oidp->oid_parent = parent; - SLIST_NEXT(oidp, oid_link) = NULL; - oidp->oid_number = number; - oidp->oid_refcnt = 1; - len = strlen(name); - newname = malloc(len + 1, M_SYSCTLOID, M_WAITOK); - bcopy(name, newname, len + 1); - newname[len] = '\0'; - oidp->oid_name = newname; - oidp->oid_handler = handler; - oidp->oid_kind = CTLFLAG_DYN | kind; - if ((kind & CTLTYPE) == CTLTYPE_NODE) { - /* Allocate space for children */ - SYSCTL_CHILDREN_SET(oidp, malloc(sizeof(struct sysctl_oid_list), - M_SYSCTLOID, M_WAITOK)); - SLIST_INIT(SYSCTL_CHILDREN(oidp)); - } else { - oidp->oid_arg1 = arg1; - oidp->oid_arg2 = arg2; - } - oidp->oid_fmt = fmt; - if (descr) { - int len = strlen(descr) + 1; - oidp->descr = malloc(len, M_SYSCTLOID, M_WAITOK); - if (oidp->descr) - strcpy((char *)(uintptr_t)(const void *)oidp->descr, descr); - } - /* Update the context, if used */ - if (clist != NULL) - sysctl_ctx_entry_add(clist, oidp); - /* Register this oid */ - sysctl_register_oid(oidp); - return (oidp); -} - -/* - * Register the kernel's oids on startup. - */ -SET_DECLARE(sysctl_set, struct sysctl_oid); - -#if defined(__rtems__) -void -#else -static void -#endif -sysctl_register_all(void *arg) -{ - struct sysctl_oid **oidp; - - SYSCTL_INIT(); - SET_FOREACH(oidp, sysctl_set) - sysctl_register_oid(*oidp); -} -SYSINIT(sysctl, SI_SUB_KMEM, SI_ORDER_ANY, sysctl_register_all, 0); - -/* - * "Staff-functions" - * - * These functions implement a presently undocumented interface - * used by the sysctl program to walk the tree, and get the type - * so it can print the value. - * This interface is under work and consideration, and should probably - * be killed with a big axe by the first person who can find the time. - * (be aware though, that the proper interface isn't as obvious as it - * may seem, there are various conflicting requirements. - * - * {0,0} printf the entire MIB-tree. - * {0,1,...} return the name of the "..." OID. - * {0,2,...} return the next OID. - * {0,3} return the OID of the name in "new" - * {0,4,...} return the kind & format info for the "..." OID. - * {0,5,...} return the description the "..." OID. - */ - -static void -sysctl_sysctl_debug_dump_node(struct sysctl_oid_list *l, int i) -{ - int k; - struct sysctl_oid *oidp; - - SLIST_FOREACH(oidp, l, oid_link) { - - for (k=0; koid_number, oidp->oid_name); - - printf("%c%c", - oidp->oid_kind & CTLFLAG_RD ? 'R':' ', - oidp->oid_kind & CTLFLAG_WR ? 'W':' '); - - if (oidp->oid_handler) - printf(" *Handler"); - - switch (oidp->oid_kind & CTLTYPE) { - case CTLTYPE_NODE: - printf(" Node\n"); - if (!oidp->oid_handler) { - sysctl_sysctl_debug_dump_node( - oidp->oid_arg1, i+2); - } - break; - case CTLTYPE_INT: printf(" Int\n"); break; - case CTLTYPE_STRING: printf(" String\n"); break; - case CTLTYPE_QUAD: printf(" Quad\n"); break; - case CTLTYPE_OPAQUE: printf(" Opaque/struct\n"); break; - default: printf("\n"); - } - - } -} - -static int -sysctl_sysctl_debug(SYSCTL_HANDLER_ARGS) -{ -#ifndef __rtems__ - int error; - - error = suser(req->td); - if (error) - return error; -#endif - sysctl_sysctl_debug_dump_node(&sysctl__children, 0); - return ENOENT; -} - -SYSCTL_PROC(_sysctl, 0, debug, CTLTYPE_STRING|CTLFLAG_RD, - 0, 0, sysctl_sysctl_debug, "-", ""); - -static int -sysctl_sysctl_name(SYSCTL_HANDLER_ARGS) -{ - int *name = (int *) arg1; - u_int namelen = arg2; - int error = 0; - struct sysctl_oid *oid; - struct sysctl_oid_list *lsp = &sysctl__children, *lsp2; - char buf[10]; - - while (namelen) { - if (!lsp) { - snprintf(buf,sizeof(buf),"%d",*name); - if (req->oldidx) - error = SYSCTL_OUT(req, ".", 1); - if (!error) - error = SYSCTL_OUT(req, buf, strlen(buf)); - if (error) - return (error); - namelen--; - name++; - continue; - } - lsp2 = 0; - SLIST_FOREACH(oid, lsp, oid_link) { - if (oid->oid_number != *name) - continue; - - if (req->oldidx) - error = SYSCTL_OUT(req, ".", 1); - if (!error) - error = SYSCTL_OUT(req, oid->oid_name, - strlen(oid->oid_name)); - if (error) - return (error); - - namelen--; - name++; - - if ((oid->oid_kind & CTLTYPE) != CTLTYPE_NODE) - break; - - if (oid->oid_handler) - break; - - lsp2 = (struct sysctl_oid_list *)oid->oid_arg1; - break; - } - lsp = lsp2; - } - return (SYSCTL_OUT(req, "", 1)); -} - -SYSCTL_NODE(_sysctl, 1, name, CTLFLAG_RD, sysctl_sysctl_name, ""); - -static int -sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int *name, u_int namelen, - int *next, int *len, int level, struct sysctl_oid **oidpp) -{ - struct sysctl_oid *oidp; - - *len = level; - SLIST_FOREACH(oidp, lsp, oid_link) { - *next = oidp->oid_number; - *oidpp = oidp; - - if (oidp->oid_kind & CTLFLAG_SKIP) - continue; - - if (!namelen) { - if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE) - return 0; - if (oidp->oid_handler) - /* We really should call the handler here...*/ - return 0; - lsp = (struct sysctl_oid_list *)oidp->oid_arg1; - if (!sysctl_sysctl_next_ls(lsp, 0, 0, next+1, - len, level+1, oidpp)) - return 0; - goto emptynode; - } - - if (oidp->oid_number < *name) - continue; - - if (oidp->oid_number > *name) { - if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE) - return 0; - if (oidp->oid_handler) - return 0; - lsp = (struct sysctl_oid_list *)oidp->oid_arg1; - if (!sysctl_sysctl_next_ls(lsp, name+1, namelen-1, - next+1, len, level+1, oidpp)) - return (0); - goto next; - } - if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE) - continue; - - if (oidp->oid_handler) - continue; - - lsp = (struct sysctl_oid_list *)oidp->oid_arg1; - if (!sysctl_sysctl_next_ls(lsp, name+1, namelen-1, next+1, - len, level+1, oidpp)) - return (0); - next: - namelen = 1; - emptynode: - *len = level; - } - return 1; -} - -static int -sysctl_sysctl_next(SYSCTL_HANDLER_ARGS) -{ - int *name = (int *) arg1; - u_int namelen = arg2; - int i, j, error; - struct sysctl_oid *oid; - struct sysctl_oid_list *lsp = &sysctl__children; - int newoid[CTL_MAXNAME]; - - i = sysctl_sysctl_next_ls(lsp, name, namelen, newoid, &j, 1, &oid); - if (i) - return ENOENT; - error = SYSCTL_OUT(req, newoid, j * sizeof (int)); - return (error); -} - -SYSCTL_NODE(_sysctl, 2, next, CTLFLAG_RD, sysctl_sysctl_next, ""); - -static int -name2oid (char *name, int *oid, int *len, struct sysctl_oid **oidpp) -{ - int i; - struct sysctl_oid *oidp; - struct sysctl_oid_list *lsp = &sysctl__children; - char *p; - - if (!*name) - return ENOENT; - - p = name + strlen(name) - 1 ; - if (*p == '.') - *p = '\0'; - - *len = 0; - - for (p = name; *p && *p != '.'; p++) - ; - i = *p; - if (i == '.') - *p = '\0'; - - oidp = SLIST_FIRST(lsp); - - while (oidp && *len < CTL_MAXNAME) { - if (strcmp(name, oidp->oid_name)) { - oidp = SLIST_NEXT(oidp, oid_link); - continue; - } - *oid++ = oidp->oid_number; - (*len)++; - - if (!i) { - if (oidpp) - *oidpp = oidp; - return (0); - } - - if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE) - break; - - if (oidp->oid_handler) - break; - - lsp = (struct sysctl_oid_list *)oidp->oid_arg1; - oidp = SLIST_FIRST(lsp); - name = p+1; - for (p = name; *p && *p != '.'; p++) - ; - i = *p; - if (i == '.') - *p = '\0'; - } - return ENOENT; -} - -static int -sysctl_sysctl_name2oid(SYSCTL_HANDLER_ARGS) -{ - char *p; - int error, oid[CTL_MAXNAME], len=0; - struct sysctl_oid *op = 0; - - if (!req->newlen) - return ENOENT; - if (req->newlen >= MAXPATHLEN) /* XXX arbitrary, undocumented */ - return (ENAMETOOLONG); - - p = malloc(req->newlen+1, M_SYSCTL, M_WAITOK); - - error = SYSCTL_IN(req, p, req->newlen); - if (error) { - free(p, M_SYSCTL); - return (error); - } - - p [req->newlen] = '\0'; - - error = name2oid(p, oid, &len, &op); - - free(p, M_SYSCTL); - - if (error) - return (error); - - error = SYSCTL_OUT(req, oid, len * sizeof *oid); - return (error); -} - -SYSCTL_PROC(_sysctl, 3, name2oid, CTLFLAG_RW|CTLFLAG_ANYBODY, 0, 0, - sysctl_sysctl_name2oid, "I", ""); - -static int -sysctl_sysctl_oidfmt(SYSCTL_HANDLER_ARGS) -{ - struct sysctl_oid *oid; - int error; - - error = sysctl_find_oid(arg1, arg2, &oid, NULL, req); - if (error) - return (error); - - if (!oid->oid_fmt) - return (ENOENT); - error = SYSCTL_OUT(req, &oid->oid_kind, sizeof(oid->oid_kind)); - if (error) - return (error); - error = SYSCTL_OUT(req, oid->oid_fmt, strlen(oid->oid_fmt) + 1); - return (error); -} - - -SYSCTL_NODE(_sysctl, 4, oidfmt, CTLFLAG_RD, sysctl_sysctl_oidfmt, ""); - -static int -sysctl_sysctl_oiddescr(SYSCTL_HANDLER_ARGS) -{ - struct sysctl_oid *oid; - int error; - - error = sysctl_find_oid(arg1, arg2, &oid, NULL, req); - if (error) - return (error); - - if (!oid->descr) - return (ENOENT); - error = SYSCTL_OUT(req, oid->descr, strlen(oid->descr) + 1); - return (error); -} - -SYSCTL_NODE(_sysctl, 5, oiddescr, CTLFLAG_RD, sysctl_sysctl_oiddescr, ""); - -/* - * Default "handler" functions. - */ - -/* - * Handle an int, signed or unsigned. - * Two cases: - * a variable: point arg1 at it. - * a constant: pass it in arg2. - */ - -int -sysctl_handle_int(SYSCTL_HANDLER_ARGS) -{ - int tmpout, error = 0; - - /* - * Attempt to get a coherent snapshot by making a copy of the data. - */ - if (arg1) - tmpout = *(int *)arg1; - else - tmpout = arg2; - error = SYSCTL_OUT(req, &tmpout, sizeof(int)); - - if (error || !req->newptr) - return (error); - - if (!arg1) - error = EPERM; - else - error = SYSCTL_IN(req, arg1, sizeof(int)); - return (error); -} - -/* - * Handle a long, signed or unsigned. arg1 points to it. - */ - -int -sysctl_handle_long(SYSCTL_HANDLER_ARGS) -{ - int error = 0; - long tmpout; - - /* - * Attempt to get a coherent snapshot by making a copy of the data. - */ - if (!arg1) - return (EINVAL); - tmpout = *(long *)arg1; - error = SYSCTL_OUT(req, &tmpout, sizeof(long)); - - if (error || !req->newptr) - return (error); - - error = SYSCTL_IN(req, arg1, sizeof(long)); - return (error); -} - -/* - * Handle our generic '\0' terminated 'C' string. - * Two cases: - * a variable string: point arg1 at it, arg2 is max length. - * a constant string: point arg1 at it, arg2 is zero. - */ - -int -sysctl_handle_string(SYSCTL_HANDLER_ARGS) -{ - int error=0; - char *tmparg; - size_t outlen; - - /* - * Attempt to get a coherent snapshot by copying to a - * temporary kernel buffer. - */ -retry: - outlen = strlen((char *)arg1)+1; - tmparg = malloc(outlen, M_SYSCTLTMP, M_WAITOK); - - if (strlcpy(tmparg, (char *)arg1, outlen) >= outlen) { - free(tmparg, M_SYSCTLTMP); - goto retry; - } - - error = SYSCTL_OUT(req, tmparg, outlen); - free(tmparg, M_SYSCTLTMP); - - if (error || !req->newptr) - return (error); - - if ((req->newlen - req->newidx) >= arg2) { - error = EINVAL; - } else { - arg2 = (req->newlen - req->newidx); - error = SYSCTL_IN(req, arg1, arg2); - ((char *)arg1)[arg2] = '\0'; - } - - return (error); -} - -/* - * Handle any kind of opaque data. - * arg1 points to it, arg2 is the size. - */ - -int -sysctl_handle_opaque(SYSCTL_HANDLER_ARGS) -{ - int error; - void *tmparg; - - /* - * Attempt to get a coherent snapshot, either by wiring the - * user space buffer or copying to a temporary kernel buffer - * depending on the size of the data. - */ - if (arg2 > PAGE_SIZE) { - sysctl_wire_old_buffer(req, arg2); - error = SYSCTL_OUT(req, arg1, arg2); - } else { - tmparg = malloc(arg2, M_SYSCTLTMP, M_WAITOK); - bcopy(arg1, tmparg, arg2); - error = SYSCTL_OUT(req, tmparg, arg2); - free(tmparg, M_SYSCTLTMP); - } - - if (error || !req->newptr) - return (error); - - error = SYSCTL_IN(req, arg1, arg2); - - return (error); -} - -/* - * Transfer functions to/from kernel space. - * XXX: rather untested at this point - */ -static int -sysctl_old_kernel(struct sysctl_req *req, const void *p, size_t l) -{ - size_t i = 0; - - if (req->oldptr) { - i = l; - if (req->oldlen <= req->oldidx) - i = 0; - else - if (i > req->oldlen - req->oldidx) - i = req->oldlen - req->oldidx; - if (i > 0) - bcopy(p, (char *)req->oldptr + req->oldidx, i); - } - req->oldidx += l; - if (req->oldptr && i != l) - return (ENOMEM); - return (0); -} - -static int -sysctl_new_kernel(struct sysctl_req *req, void *p, size_t l) -{ - if (!req->newptr) - return 0; - if (req->newlen - req->newidx < l) - return (EINVAL); - bcopy((char *)req->newptr + req->newidx, p, l); - req->newidx += l; - return (0); -} - -int -kernel_sysctl(struct thread *td, int *name, u_int namelen, void *old, - size_t *oldlenp, void *new, size_t newlen, size_t *retval) -{ - int error = 0; - struct sysctl_req req; - - bzero(&req, sizeof req); - - req.td = td; - - if (oldlenp) { - req.oldlen = *oldlenp; - } - - if (old) { - req.oldptr= old; - } - - if (new != NULL) { - req.newlen = newlen; - req.newptr = new; - } - - req.oldfunc = sysctl_old_kernel; - req.newfunc = sysctl_new_kernel; - req.lock = REQ_LOCKED; - - SYSCTL_LOCK(); - - error = sysctl_root(0, name, namelen, &req); - - if (req.lock == REQ_WIRED) -#ifdef __rtems__ - printf ("kern_sysctl: vsunlock needs to be called!\n"); -#else - vsunlock(req.oldptr, req.oldlen); -#endif - - SYSCTL_UNLOCK(); - - if (error && error != ENOMEM) - return (error); - - if (retval) { - if (req.oldptr && req.oldidx > req.oldlen) - *retval = req.oldlen; - else - *retval = req.oldidx; - } - return (error); -} - -int -kernel_sysctlbyname(struct thread *td, char *name, void *old, size_t *oldlenp, - void *new, size_t newlen, size_t *retval) -{ - int oid[CTL_MAXNAME]; - size_t oidlen, plen; - int error; - - plen = 0; /* RTEMS - to avoid warnings */ - - oid[0] = 0; /* sysctl internal magic */ - oid[1] = 3; /* name2oid */ - oidlen = sizeof(oid); - - error = kernel_sysctl(td, oid, 2, oid, &oidlen, - (void *)name, strlen(name), &plen); - if (error) - return (error); - - error = kernel_sysctl(td, oid, plen / sizeof(int), old, oldlenp, - new, newlen, retval); - return (error); -} - -/* - * Transfer function to/from user space. - */ -static int -sysctl_old_user(struct sysctl_req *req, const void *p, size_t l) -{ - int error = 0; - size_t i = 0; - -#ifndef __rtems__ - if (req->lock == 1 && req->oldptr) - WITNESS_SLEEP(1, NULL); -#endif - if (req->oldptr) { - i = l; - if (req->oldlen <= req->oldidx) - i = 0; - else - if (i > req->oldlen - req->oldidx) - i = req->oldlen - req->oldidx; - if (i > 0) - error = copyout(p, (char *)req->oldptr + req->oldidx, - i); - } - req->oldidx += l; - if (error) - return (error); - if (req->oldptr && i < l) - return (ENOMEM); - return (0); -} - -static int -sysctl_new_user(struct sysctl_req *req, void *p, size_t l) -{ - int error; - - if (!req->newptr) - return 0; - if (req->newlen - req->newidx < l) - return (EINVAL); - error = copyin((char *)req->newptr + req->newidx, p, l); - req->newidx += l; - return (error); -} - -/* - * Wire the user space destination buffer. If set to a value greater than - * zero, the len parameter limits the maximum amount of wired memory. - * - * XXX - The len parameter is currently ignored due to the lack of - * a place to save it in the sysctl_req structure so that the matching - * amount of memory can be unwired in the sysctl exit code. - */ -int -sysctl_wire_old_buffer(struct sysctl_req *req, size_t len) -{ - if (req->lock == REQ_LOCKED && req->oldptr && - req->oldfunc == sysctl_old_user) { -#ifndef __rtems__ - vslock(req->oldptr, req->oldlen); -#endif - req->lock = REQ_WIRED; - } - return (0); -} - -int -sysctl_find_oid(const int *name, u_int namelen, struct sysctl_oid **noid, - int *nindx, struct sysctl_req *req) -{ - struct sysctl_oid *oid; - int indx; - - oid = SLIST_FIRST(&sysctl__children); - indx = 0; - while (oid && indx < CTL_MAXNAME) { - if (oid->oid_number == name[indx]) { - indx++; - if (oid->oid_kind & CTLFLAG_NOLOCK) - req->lock = REQ_UNLOCKED; - if ((oid->oid_kind & CTLTYPE) == CTLTYPE_NODE) { - if (oid->oid_handler != NULL || - indx == namelen) { - *noid = oid; - if (nindx != NULL) - *nindx = indx; - return (0); - } - oid = SLIST_FIRST( - (struct sysctl_oid_list *)oid->oid_arg1); - } else if (indx == namelen) { - *noid = oid; - if (nindx != NULL) - *nindx = indx; - return (0); - } else { - return (ENOTDIR); - } - } else { - oid = SLIST_NEXT(oid, oid_link); - } - } - return (ENOENT); -} - -/* - * Traverse our tree, and find the right node, execute whatever it points - * to, and return the resulting error code. - */ - -static int -sysctl_root(struct sysctl_oid *oidp, const void *arg1, intptr_t arg2, - struct sysctl_req *req) -{ - struct sysctl_oid *oid; - int error, indx; - - error = sysctl_find_oid(arg1, arg2, &oid, &indx, req); - if (error) - return (error); - - if ((oid->oid_kind & CTLTYPE) == CTLTYPE_NODE) { - /* - * You can't call a sysctl when it's a node, but has - * no handler. Inform the user that it's a node. - * The indx may or may not be the same as namelen. - */ - if (oid->oid_handler == NULL) - return (EISDIR); - } - - /* Is this sysctl writable? */ - if (req->newptr && !(oid->oid_kind & CTLFLAG_WR)) - return (EPERM); - -#ifndef __rtems__ - KASSERT(req->td != NULL, ("sysctl_root(): req->td == NULL")); - - /* Is this sysctl sensitive to securelevels? */ - if (req->newptr && (oid->oid_kind & CTLFLAG_SECURE)) { - error = securelevel_gt(req->td->td_ucred, 0); - if (error) - return (error); - } - - /* Is this sysctl writable by only privileged users? */ - if (req->newptr && !(oid->oid_kind & CTLFLAG_ANYBODY)) { - int flags; - - if (oid->oid_kind & CTLFLAG_PRISON) - flags = PRISON_ROOT; - else - flags = 0; - error = suser_cred(req->td->td_ucred, flags); - if (error) - return (error); - } -#endif - - if (!oid->oid_handler) - return EINVAL; - - if ((oid->oid_kind & CTLTYPE) == CTLTYPE_NODE) - error = oid->oid_handler(oid, (int *)arg1 + indx, arg2 - indx, - req); - else - error = oid->oid_handler(oid, oid->oid_arg1, oid->oid_arg2, - req); - return (error); -} - -#ifndef __rtems__ -#ifndef _SYS_SYSPROTO_H_ -struct sysctl_args { - int *name; - u_int namelen; - void *old; - size_t *oldlenp; - void *new; - size_t newlen; -}; -#endif - -/* - * MPSAFE - */ -int -__sysctl(struct thread *td, struct sysctl_args *uap) -{ - int error, name[CTL_MAXNAME]; - size_t j; - - if (uap->namelen > CTL_MAXNAME || uap->namelen < 2) - return (EINVAL); - - error = copyin(uap->name, &name, uap->namelen * sizeof(int)); - if (error) - return (error); - - mtx_lock(&Giant); - - error = userland_sysctl(td, name, uap->namelen, - uap->old, uap->oldlenp, 0, - uap->new, uap->newlen, &j); - if (error && error != ENOMEM) - goto done2; - if (uap->oldlenp) { - int i = copyout(&j, uap->oldlenp, sizeof(j)); - if (i) - error = i; - } -done2: - mtx_unlock(&Giant); - return (error); -} -#endif /* __rtems__ */ - -/* - * This is used from various compatibility syscalls too. That's why name - * must be in kernel space. - */ -int -userland_sysctl(struct thread *td, const int *name, u_int namelen, void *old, - size_t *oldlenp, int inkernel, const void *new, size_t newlen, size_t *retval) -{ - int error = 0; - struct sysctl_req req, req2; - - bzero(&req, sizeof req); - - req.td = td; - - if (oldlenp) { - if (inkernel) { - req.oldlen = *oldlenp; - } else { - error = copyin(oldlenp, &req.oldlen, sizeof(*oldlenp)); - if (error) - return (error); - } - } - - if (old) { -#ifndef __rtems__ - if (!useracc(old, req.oldlen, VM_PROT_WRITE)) - return (EFAULT); -#endif - req.oldptr= old; - } - - if (new != NULL) { -#ifndef __rtems__ - if (!useracc(new, req.newlen, VM_PROT_READ)) - return (EFAULT); -#endif - req.newlen = newlen; - req.newptr = new; - } - - req.oldfunc = sysctl_old_user; - req.newfunc = sysctl_new_user; - req.lock = REQ_LOCKED; - - SYSCTL_LOCK(); - -#ifdef MAC - error = mac_check_system_sysctl(td->td_ucred, name, namelen, old, - oldlenp, inkernel, new, newlen); - if (error) { - SYSCTL_UNLOCK(); - return (error); - } -#endif - - do { - req2 = req; - error = sysctl_root(0, name, namelen, &req2); - } while (error == EAGAIN); - - req = req2; -#ifndef __rtems__ - if (req.lock == REQ_WIRED) - vsunlock(req.oldptr, req.oldlen); -#endif - - SYSCTL_UNLOCK(); - - if (error && error != ENOMEM) - return (error); - - if (retval) { - if (req.oldptr && req.oldidx > req.oldlen) - *retval = req.oldlen; - else - *retval = req.oldidx; - } - return (error); -} - -#ifdef COMPAT_43 -#include -#include - -#define KINFO_PROC (0<<8) -#define KINFO_RT (1<<8) -#define KINFO_VNODE (2<<8) -#define KINFO_FILE (3<<8) -#define KINFO_METER (4<<8) -#define KINFO_LOADAVG (5<<8) -#define KINFO_CLOCKRATE (6<<8) - -/* Non-standard BSDI extension - only present on their 4.3 net-2 releases */ -#define KINFO_BSDI_SYSINFO (101<<8) - -/* - * XXX this is bloat, but I hope it's better here than on the potentially - * limited kernel stack... -Peter - */ - -static struct { - int bsdi_machine; /* "i386" on BSD/386 */ -/* ^^^ this is an offset to the string, relative to the struct start */ - char *pad0; - long pad1; - long pad2; - long pad3; - u_long pad4; - u_long pad5; - u_long pad6; - - int bsdi_ostype; /* "BSD/386" on BSD/386 */ - int bsdi_osrelease; /* "1.1" on BSD/386 */ - long pad7; - long pad8; - char *pad9; - - long pad10; - long pad11; - int pad12; - long pad13; - quad_t pad14; - long pad15; - - struct timeval pad16; - /* we dont set this, because BSDI's uname used gethostname() instead */ - int bsdi_hostname; /* hostname on BSD/386 */ - - /* the actual string data is appended here */ - -} bsdi_si; -/* - * this data is appended to the end of the bsdi_si structure during copyout. - * The "char *" offsets are relative to the base of the bsdi_si struct. - * This contains "FreeBSD\02.0-BUILT-nnnnnn\0i386\0", and these strings - * should not exceed the length of the buffer here... (or else!! :-) - */ -static char bsdi_strings[80]; /* It had better be less than this! */ - -#ifndef _SYS_SYSPROTO_H_ -struct getkerninfo_args { - int op; - char *where; - size_t *size; - int arg; -}; -#endif - -/* - * MPSAFE - */ -int -ogetkerninfo(struct thread *td, struct getkerninfo_args *uap) -{ - int error, name[6]; - size_t size; - u_int needed = 0; - - mtx_lock(&Giant); - - switch (uap->op & 0xff00) { - - case KINFO_RT: - name[0] = CTL_NET; - name[1] = PF_ROUTE; - name[2] = 0; - name[3] = (uap->op & 0xff0000) >> 16; - name[4] = uap->op & 0xff; - name[5] = uap->arg; - error = userland_sysctl(td, name, 6, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_VNODE: - name[0] = CTL_KERN; - name[1] = KERN_VNODE; - error = userland_sysctl(td, name, 2, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_PROC: - name[0] = CTL_KERN; - name[1] = KERN_PROC; - name[2] = uap->op & 0xff; - name[3] = uap->arg; - error = userland_sysctl(td, name, 4, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_FILE: - name[0] = CTL_KERN; - name[1] = KERN_FILE; - error = userland_sysctl(td, name, 2, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_METER: - name[0] = CTL_VM; - name[1] = VM_TOTAL; - error = userland_sysctl(td, name, 2, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_LOADAVG: - name[0] = CTL_VM; - name[1] = VM_LOADAVG; - error = userland_sysctl(td, name, 2, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_CLOCKRATE: - name[0] = CTL_KERN; - name[1] = KERN_CLOCKRATE; - error = userland_sysctl(td, name, 2, uap->where, uap->size, - 0, 0, 0, &size); - break; - - case KINFO_BSDI_SYSINFO: { - /* - * this is pretty crude, but it's just enough for uname() - * from BSDI's 1.x libc to work. - * - * *size gives the size of the buffer before the call, and - * the amount of data copied after a successful call. - * If successful, the return value is the amount of data - * available, which can be larger than *size. - * - * BSDI's 2.x product apparently fails with ENOMEM if *size - * is too small. - */ - - u_int left; - char *s; - - bzero((char *)&bsdi_si, sizeof(bsdi_si)); - bzero(bsdi_strings, sizeof(bsdi_strings)); - - s = bsdi_strings; - - bsdi_si.bsdi_ostype = (s - bsdi_strings) + sizeof(bsdi_si); - strcpy(s, ostype); - s += strlen(s) + 1; - - bsdi_si.bsdi_osrelease = (s - bsdi_strings) + sizeof(bsdi_si); - strcpy(s, osrelease); - s += strlen(s) + 1; - - bsdi_si.bsdi_machine = (s - bsdi_strings) + sizeof(bsdi_si); - strcpy(s, machine); - s += strlen(s) + 1; - - needed = sizeof(bsdi_si) + (s - bsdi_strings); - - if ((uap->where == NULL) || (uap->size == NULL)) { - /* process is asking how much buffer to supply.. */ - size = needed; - error = 0; - break; - } - - if ((error = copyin(uap->size, &size, sizeof(size))) != 0) - break; - - /* if too much buffer supplied, trim it down */ - if (size > needed) - size = needed; - - /* how much of the buffer is remaining */ - left = size; - - if ((error = copyout((char *)&bsdi_si, uap->where, left)) != 0) - break; - - /* is there any point in continuing? */ - if (left > sizeof(bsdi_si)) { - left -= sizeof(bsdi_si); - error = copyout(&bsdi_strings, - uap->where + sizeof(bsdi_si), left); - } - break; - } - - default: - error = EOPNOTSUPP; - break; - } - if (error == 0) { - td->td_retval[0] = needed ? needed : size; - if (uap->size) { - error = copyout(&size, uap->size, sizeof(size)); - } - } - mtx_unlock(&Giant); - return (error); -} -#endif /* COMPAT_43 */ diff --git a/cpukit/libnetworking/kern/uipc_domain.c b/cpukit/libnetworking/kern/uipc_domain.c deleted file mode 100644 index 2e4b15182c..0000000000 --- a/cpukit/libnetworking/kern/uipc_domain.c +++ /dev/null @@ -1,220 +0,0 @@ -#include - -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_domain.c 8.2 (Berkeley) 10/18/93 - */ - -#include -#include -#include -#include -#include -#include -#include - -/* - * System initialization - * - * Note: domain initialization wants to take place on a per domain basis - * as a result of traversing a linker set. Most likely, each domain - * want to call a registration function rather than being handled here - * in domaininit(). Probably this will look like: - * - * SYSINIT(unique, SI_SUB_PROTO_DOMAI, SI_ORDER_ANY, domain_add, xxx) - * - * Where 'xxx' is replaced by the address of a parameter struct to be - * passed to the doamin_add() function. - */ - -#if !defined(__rtems__) -static int x_save_spl; /* used by kludge*/ -static void kludge_splimp(void *); -static void kludge_splx(void *); - void domaininit(void *); -SYSINIT(splimp, SI_SUB_PROTO_BEGIN, SI_ORDER_FIRST, kludge_splimp, &x_save_spl) -SYSINIT(domain, SI_SUB_PROTO_DOMAIN, SI_ORDER_FIRST, domaininit, NULL) -SYSINIT(splx, SI_SUB_PROTO_END, SI_ORDER_FIRST, kludge_splx, &x_save_spl) -#endif - -static void pffasttimo(void *); -static void pfslowtimo(void *); - -struct domain *domains; - -#define ADDDOMAIN(x) { \ - __CONCAT(x,domain.dom_next) = domains; \ - domains = &__CONCAT(x,domain); \ -} - -/* ARGSUSED*/ -void -domaininit(void *dummy) -{ - register struct domain *dp; - register struct protosw *pr; - -/* - not in our sources -#ifdef ISDN - ADDDOMAIN(isdn); -#endif -*/ - - for (dp = domains; dp; dp = dp->dom_next) { - if (dp->dom_init) - (*dp->dom_init)(); - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++){ -#ifdef PRU_OLDSTYLE - /* See comments in uipc_socket2.c. */ - if (pr->pr_usrreqs == 0 && pr->pr_ousrreq) - pr->pr_usrreqs = &pru_oldstyle; -#endif - if (pr->pr_init) - (*pr->pr_init)(); - } - } - - if (max_linkhdr < 16) /* XXX */ - max_linkhdr = 16; - max_hdr = max_linkhdr + max_protohdr; - max_datalen = MHLEN - max_hdr; - timeout(pffasttimo, (void *)0, 1); - timeout(pfslowtimo, (void *)0, 1); -} - - -#if !defined(__rtems__) -/* - * The following two operations are kludge code. Most likely, they should - * be done as a "domainpreinit()" for the first function and then rolled - * in as the last act of "domaininit()" for the second. - * - * In point of fact, it is questionable why other initialization prior - * to this does not also take place at splimp by default. - */ -static void -kludge_splimp(void *udata) -{ - int *savesplp = udata; - - *savesplp = splimp(); -} - -static void -kludge_splx(void *udata) -{ - int *savesplp = udata; - - splx( *savesplp); -} -#endif /* !defined(__rtems__) */ - -struct protosw * -pffindtype(int family, int type) -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - if (dp->dom_family == family) - goto found; - return (0); -found: - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_type && pr->pr_type == type) - return (pr); - return (0); -} - -struct protosw * -pffindproto(int family, int protocol, int type) -{ - register struct domain *dp; - register struct protosw *pr; - struct protosw *maybe = 0; - - if (family == 0) - return (0); - for (dp = domains; dp; dp = dp->dom_next) - if (dp->dom_family == family) - goto found; - return (0); -found: - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { - if ((pr->pr_protocol == protocol) && (pr->pr_type == type)) - return (pr); - - if (type == SOCK_RAW && pr->pr_type == SOCK_RAW && - pr->pr_protocol == 0 && maybe == (struct protosw *)0) - maybe = pr; - } - return (maybe); -} - -void -pfctlinput(int cmd, struct sockaddr *sa) -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_ctlinput) - (*pr->pr_ctlinput)(cmd, sa, (void *)0); -} - -static void -pfslowtimo(void *arg) -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_slowtimo) - (*pr->pr_slowtimo)(); - timeout(pfslowtimo, (void *)0, hz/2); -} - -static void -pffasttimo(void *arg) -{ - register struct domain *dp; - register struct protosw *pr; - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_fasttimo) - (*pr->pr_fasttimo)(); - timeout(pffasttimo, (void *)0, hz/5); -} diff --git a/cpukit/libnetworking/kern/uipc_mbuf.c b/cpukit/libnetworking/kern/uipc_mbuf.c deleted file mode 100644 index 2267ddbe61..0000000000 --- a/cpukit/libnetworking/kern/uipc_mbuf.c +++ /dev/null @@ -1,742 +0,0 @@ -#include - -/* - * Copyright (c) 1982, 1986, 1988, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 - */ - -#include -#include -#include -#include -#define MBTYPES -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#if !defined(__rtems__) -static void mbinit (void *) __attribute__ ((unused)); -SYSINIT(mbuf, SI_SUB_MBUF, SI_ORDER_FIRST, mbinit, NULL) -#endif - -struct mbuf *mbutl; -char *mclrefcnt; -struct mbstat mbstat; -struct mbuf *mmbfree; -union mcluster *mclfree; -int max_linkhdr; -int max_protohdr; -int max_hdr; -int max_datalen; - -/* "number of clusters of pages" */ -#define NCL_INIT 1 - -#define NMB_INIT 16 - -/* - * When MGET failes, ask protocols to free space when short of memory, - * then re-attempt to allocate an mbuf. - */ -struct mbuf * -m_retry(int i, int t) -{ - register struct mbuf *m; - - m_reclaim(); -#define m_retry(i, t) (struct mbuf *)0 - MGET(m, i, t); -#undef m_retry - if (m != NULL) - mbstat.m_wait++; - else - mbstat.m_drops++; - return (m); -} - -/* - * As above; retry an MGETHDR. - */ -struct mbuf * -m_retryhdr(int i, int t) -{ - register struct mbuf *m; - - m_reclaim(); -#define m_retryhdr(i, t) (struct mbuf *)0 - MGETHDR(m, i, t); -#undef m_retryhdr - if (m != NULL) - mbstat.m_wait++; - else - mbstat.m_drops++; - return (m); -} - -void -m_reclaim(void) -{ - register struct domain *dp; - register struct protosw *pr; - int s = splimp(); - - for (dp = domains; dp; dp = dp->dom_next) - for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) - if (pr->pr_drain) - (*pr->pr_drain)(); - splx(s); - mbstat.m_drain++; -} - -/* - * Space allocation routines. - * These are also available as macros - * for critical paths. - */ -struct mbuf * -m_get(int nowait, int type) -{ - register struct mbuf *m; - - MGET(m, nowait, type); - return (m); -} - -struct mbuf * -m_gethdr(int nowait, int type) -{ - register struct mbuf *m; - - MGETHDR(m, nowait, type); - return (m); -} - -struct mbuf * -m_getclr(int nowait, int type) -{ - register struct mbuf *m; - - MGET(m, nowait, type); - if (m == 0) - return (0); - bzero(mtod(m, caddr_t), MLEN); - return (m); -} - -struct mbuf * -m_free(struct mbuf *m) -{ - struct mbuf *n; - - MFREE(m, n); - return (n); -} - -void -m_freem(struct mbuf *mb) -{ - struct mbuf *n; - - if (mb == NULL) - return; - do { - MFREE(mb, n); - mb = n; - } while (mb); -} - -/* - * Mbuffer utility routines. - */ - -/* - * Lesser-used path for M_PREPEND: - * allocate new mbuf to prepend to chain, - * copy junk along. - */ -struct mbuf * -m_prepend(struct mbuf *m, int len, int how) -{ - struct mbuf *mn; - - MGET(mn, how, m->m_type); - if (mn == (struct mbuf *)NULL) { - m_freem(m); - return ((struct mbuf *)NULL); - } - if (m->m_flags & M_PKTHDR) { - M_COPY_PKTHDR(mn, m); - m->m_flags &= ~M_PKTHDR; - } - mn->m_next = m; - m = mn; - if (len < MHLEN) - MH_ALIGN(m, len); - m->m_len = len; - return (m); -} - -/* - * Make a copy of an mbuf chain starting "off0" bytes from the beginning, - * continuing for "len" bytes. If len is M_COPYALL, copy to end of mbuf. - * The wait parameter is a choice of M_WAIT/M_DONTWAIT from caller. - */ -static int MCFail; - -struct mbuf * -m_copym(struct mbuf *m, int off0, uint32_t len, int wait) -{ - struct mbuf *n, **np; - int off = off0; - struct mbuf *top; - int copyhdr = 0; - - if (off < 0 || len < 0) - panic("m_copym"); - if (off == 0 && m->m_flags & M_PKTHDR) - copyhdr = 1; - while (off > 0) { - if (m == NULL) - panic("m_copym"); - if (off < m->m_len) - break; - off -= m->m_len; - m = m->m_next; - } - np = ⊤ - top = 0; - while (len > 0) { - if (m == NULL) { - if (len != M_COPYALL) - panic("m_copym"); - break; - } - MGET(n, wait, m->m_type); - *np = n; - if (n == NULL) - goto nospace; - if (copyhdr) { - M_COPY_PKTHDR(n, m); - if (len == M_COPYALL) - n->m_pkthdr.len -= off0; - else - n->m_pkthdr.len = len; - copyhdr = 0; - } - n->m_len = min(len, m->m_len - off); - if (m->m_flags & M_EXT) { - n->m_data = m->m_data + off; - if(!m->m_ext.ext_ref) - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; - else - (*(m->m_ext.ext_ref))(m->m_ext.ext_buf, - m->m_ext.ext_size); - n->m_ext = m->m_ext; - n->m_flags |= M_EXT; - } else - bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t), - (unsigned)n->m_len); - if (len != M_COPYALL) - len -= n->m_len; - off = 0; - m = m->m_next; - np = &n->m_next; - } - if (top == NULL) - MCFail++; - return (top); -nospace: - m_freem(top); - MCFail++; - return (NULL); -} - -/* - * Copy an entire packet, including header (which must be present). - * An optimization of the common case `m_copym(m, 0, M_COPYALL, how)'. - */ -struct mbuf * -m_copypacket(struct mbuf *m, int how) -{ - struct mbuf *top, *n, *o; - - MGET(n, how, m->m_type); - top = n; - if (!n) - goto nospace; - - M_COPY_PKTHDR(n, m); - n->m_len = m->m_len; - if (m->m_flags & M_EXT) { - n->m_data = m->m_data; - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; - n->m_ext = m->m_ext; - n->m_flags |= M_EXT; - } else { - bcopy(mtod(m, char *), mtod(n, char *), n->m_len); - } - - m = m->m_next; - while (m) { - MGET(o, how, m->m_type); - if (!o) - goto nospace; - - n->m_next = o; - n = n->m_next; - - n->m_len = m->m_len; - if (m->m_flags & M_EXT) { - n->m_data = m->m_data; - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; - n->m_ext = m->m_ext; - n->m_flags |= M_EXT; - } else { - bcopy(mtod(m, char *), mtod(n, char *), n->m_len); - } - - m = m->m_next; - } - return top; -nospace: - m_freem(top); - MCFail++; - return 0; -} - -/* - * Copy data from an mbuf chain starting "off" bytes from the beginning, - * continuing for "len" bytes, into the indicated buffer. Return -1 if requested - * size is bigger than available - */ -int -m_copydata(const struct mbuf *m, int off, int len, caddr_t cp) -{ - u_int count; - - if (off < 0 || len < 0) - panic("m_copydata"); - while (off > 0) { - if (m == 0) { - /*printf("m_copydata: offset > mbuf length ("); - while(m0) { - printf("[%d] ",m0->m_len); - m0 = m0->m_next; - } - printf(")\n");*/ - return -1; - } - if (off < m->m_len) - break; - off -= m->m_len; - m = m->m_next; - } - while (len > 0) { - if (m == 0) { - /*printf("m_copydata: length > mbuf length ("); - while(m0) { - printf("[%d] ",m0->m_len); - m0 = m0->m_next; - } - printf(")\n");*/ - - return -1; - } - count = min(m->m_len - off, len); - bcopy(mtod(m, caddr_t) + off, cp, count); - len -= count; - cp += count; - off = 0; - m = m->m_next; - } - return 0; -} - -/* - * Concatenate mbuf chain n to m. - * Both chains must be of the same type (e.g. MT_DATA). - * Any m_pkthdr is not updated. - */ -void -m_cat(struct mbuf *m, struct mbuf *n) -{ - while (m->m_next) - m = m->m_next; - while (n) { - if (m->m_flags & M_EXT || - m->m_data + m->m_len + n->m_len >= &m->m_dat[MLEN]) { - /* just join the two chains */ - m->m_next = n; - return; - } - /* splat the data from one into the other */ - bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, - (u_int)n->m_len); - m->m_len += n->m_len; - n = m_free(n); - } -} - -void -m_adj(struct mbuf *mp, int req_len) -{ - int len = req_len; - struct mbuf *m; - int count; - - if ((m = mp) == NULL) - return; - if (len >= 0) { - /* - * Trim from head. - */ - while (m != NULL && len > 0) { - if (m->m_len <= len) { - len -= m->m_len; - m->m_len = 0; - m = m->m_next; - } else { - m->m_len -= len; - m->m_data += len; - len = 0; - } - } - m = mp; - if (mp->m_flags & M_PKTHDR) - m->m_pkthdr.len -= (req_len - len); - } else { - /* - * Trim from tail. Scan the mbuf chain, - * calculating its length and finding the last mbuf. - * If the adjustment only affects this mbuf, then just - * adjust and return. Otherwise, rescan and truncate - * after the remaining size. - */ - len = -len; - count = 0; - for (;;) { - count += m->m_len; - if (m->m_next == (struct mbuf *)0) - break; - m = m->m_next; - } - if (m->m_len >= len) { - m->m_len -= len; - if (mp->m_flags & M_PKTHDR) - mp->m_pkthdr.len -= len; - return; - } - count -= len; - if (count < 0) - count = 0; - /* - * Correct length for chain is "count". - * Find the mbuf with last data, adjust its length, - * and toss data from remaining mbufs on chain. - */ - m = mp; - if (m->m_flags & M_PKTHDR) - m->m_pkthdr.len = count; - for (; m; m = m->m_next) { - if (m->m_len >= count) { - m->m_len = count; - break; - } - count -= m->m_len; - } - while (m->m_next) - (m = m->m_next) ->m_len = 0; - } -} - -/* - * Rearange an mbuf chain so that len bytes are contiguous - * and in the data area of an mbuf (so that mtod and dtom - * will work for a structure of size len). Returns the resulting - * mbuf chain on success, frees it and returns null on failure. - * If there is room, it will add up to max_protohdr-len extra bytes to the - * contiguous region in an attempt to avoid being called next time. - */ -static int MPFail; - -struct mbuf * -m_pullup(struct mbuf *n, int len) -{ - struct mbuf *m; - int count; - int space; - - /* - * If first mbuf has no cluster, and has room for len bytes - * without shifting current data, pullup into it, - * otherwise allocate a new mbuf to prepend to the chain. - */ - if ((n->m_flags & M_EXT) == 0 && - n->m_data + len < &n->m_dat[MLEN] && n->m_next) { - if (n->m_len >= len) - return (n); - m = n; - n = n->m_next; - len -= m->m_len; - } else { - if (len > MHLEN) - goto bad; - MGET(m, M_DONTWAIT, n->m_type); - if (m == NULL) - goto bad; - m->m_len = 0; - if (n->m_flags & M_PKTHDR) { - M_COPY_PKTHDR(m, n); - n->m_flags &= ~M_PKTHDR; - } - } - space = &m->m_dat[MLEN] - (m->m_data + m->m_len); - do { - count = min(min(max(len, max_protohdr), space), n->m_len); - bcopy(mtod(n, caddr_t), mtod(m, caddr_t) + m->m_len, - (unsigned)count); - len -= count; - m->m_len += count; - n->m_len -= count; - space -= count; - if (n->m_len) - n->m_data += count; - else - n = m_free(n); - } while (len > 0 && n); - if (len > 0) { - (void) m_free(m); - goto bad; - } - m->m_next = n; - return (m); - bad: - m_freem(n); - MPFail++; - return (NULL); -} - -/* - * Partition an mbuf chain in two pieces, returning the tail -- - * all but the first len0 bytes. In case of failure, it returns NULL and - * attempts to restore the chain to its original state. - */ -struct mbuf * -m_split(struct mbuf *m0, int len0, int wait) -{ - struct mbuf *m, *n; - u_int len = len0, remain; - - for (m = m0; m && len > m->m_len; m = m->m_next) - len -= m->m_len; - if (m == NULL) - return (NULL); - remain = m->m_len - len; - if (m0->m_flags & M_PKTHDR) { - MGETHDR(n, wait, m0->m_type); - if (n == NULL) - return (NULL); - n->m_pkthdr.rcvif = m0->m_pkthdr.rcvif; - n->m_pkthdr.len = m0->m_pkthdr.len - len0; - m0->m_pkthdr.len = len0; - if (m->m_flags & M_EXT) - goto extpacket; - if (remain > MHLEN) { - /* m can't be the lead packet */ - MH_ALIGN(n, 0); - n->m_next = m_split(m, len, wait); - if (n->m_next == 0) { - (void) m_free(n); - return (0); - } else - return (n); - } else - MH_ALIGN(n, remain); - } else if (remain == 0) { - n = m->m_next; - m->m_next = NULL; - return (n); - } else { - MGET(n, wait, m->m_type); - if (n == 0) - return (0); - M_ALIGN(n, remain); - } -extpacket: - if (m->m_flags & M_EXT) { - n->m_flags |= M_EXT; - n->m_ext = m->m_ext; - if(!m->m_ext.ext_ref) - mclrefcnt[mtocl(m->m_ext.ext_buf)]++; - else - (*(m->m_ext.ext_ref))(m->m_ext.ext_buf, - m->m_ext.ext_size); - m->m_ext.ext_size = 0; /* For Accounting XXXXXX danger */ - n->m_data = m->m_data + len; - } else { - bcopy(mtod(m, caddr_t) + len, mtod(n, caddr_t), remain); - } - n->m_len = remain; - m->m_len = len; - n->m_next = m->m_next; - m->m_next = NULL; - return (n); -} -/* - * Routine to copy from device local memory into mbufs. - */ -struct mbuf * -m_devget(char *buf, int totlen, int off0, struct ifnet *ifp, - void (*copy)(char *from, caddr_t to, u_int len)) -{ - struct mbuf *m; - struct mbuf *top = NULL, **mp = ⊤ - int len; - int off = off0; - char *cp; - char *epkt; - - cp = buf; - epkt = cp + totlen; - if (off) { - cp += off + 2 * sizeof(u_short); - totlen -= 2 * sizeof(u_short); - } - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == 0) - return (0); - m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = totlen; - m->m_len = MHLEN; - - while (totlen > 0) { - if (top) { - MGET(m, M_DONTWAIT, MT_DATA); - if (m == 0) { - m_freem(top); - return (0); - } - m->m_len = MLEN; - } - len = min(totlen, epkt - cp); - if (len >= MINCLSIZE) { - MCLGET(m, M_DONTWAIT); - if (m->m_flags & M_EXT) - m->m_len = len = min(len, MCLBYTES); - else - len = m->m_len; - } else { - /* - * Place initial small packet/header at end of mbuf. - */ - if (len < m->m_len) { - if (top == 0 && len + max_linkhdr <= m->m_len) - m->m_data += max_linkhdr; - m->m_len = len; - } else - len = m->m_len; - } - if (copy) - copy(cp, mtod(m, caddr_t), (u_int)len); - else - bcopy(cp, mtod(m, caddr_t), (u_int)len); - cp += len; - *mp = m; - mp = &m->m_next; - totlen -= len; - if (cp == epkt) - cp = buf; - } - return (top); -} - -/* - * Copy data from a buffer back into the indicated mbuf chain, - * starting "off" bytes from the beginning, extending the mbuf - * chain if necessary. - */ -int -m_copyback(struct mbuf *m0, int off, int len, caddr_t cp) -{ - int mlen; - struct mbuf *m = m0, *n; - int totlen = 0; - - if (m0 == NULL) - return 0; - while (off > (mlen = m->m_len)) { - off -= mlen; - totlen += mlen; - if (m->m_next == NULL) { - n = m_getclr(M_DONTWAIT, m->m_type); - if (n == NULL) { - /*panic("m_copyback() : malformed chain\n");*/ - return -1; - } - n->m_len = min(MLEN, len + off); - m->m_next = n; - } - m = m->m_next; - } - while (len > 0) { - mlen = min (m->m_len - off, len); - bcopy(cp, off + mtod(m, caddr_t), (u_int)mlen); - cp += mlen; - len -= mlen; - mlen += off; - off = 0; - totlen += mlen; - if (len == 0) { - /* m->m_len = mlen; */ - break; - } - if (m->m_next == NULL) { - n = m_get(M_DONTWAIT, m->m_type); - if (n == 0) { - /*panic("m_copyback() : malformed chain 2\n");*/ - return -1; - }; - n->m_len = min(MLEN, len); - m->m_next = n; - } - /* m->m_len = mlen; */ - m = m->m_next; - } -/*out:*/ - if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) - m->m_pkthdr.len = totlen; - return 0; -} diff --git a/cpukit/libnetworking/kern/uipc_socket.c b/cpukit/libnetworking/kern/uipc_socket.c deleted file mode 100644 index c6220bd34e..0000000000 --- a/cpukit/libnetworking/kern/uipc_socket.c +++ /dev/null @@ -1,1139 +0,0 @@ -#include - -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __rtems__ -/* - * This socket option was removed 1997 from the upstream FreeBSD network stack. - * Turn this feature into essentially dead code. - */ -#define SO_PRIVSTATE 0x1009 /* get/deny privileged state */ - -#include -#endif /* __rtems__ */ - -static int somaxconn = SOMAXCONN; -SYSCTL_INT(_kern, KIPC_SOMAXCONN, somaxconn, CTLFLAG_RW, &somaxconn, 0, ""); - -/* - * Socket operation routines. - * These routines are called by the routines in - * sys_socket.c or from a system process, and - * implement the semantics of socket operations by - * switching out to the protocol specific routines. - */ -/*ARGSUSED*/ -int -socreate(int dom, struct socket **aso, int type, int proto, - struct proc *p) -{ - register struct protosw *prp; - register struct socket *so; - register int error; - - if (proto) - prp = pffindproto(dom, proto, type); - else - prp = pffindtype(dom, type); - if (prp == 0 || prp->pr_usrreqs == 0) - return (EPROTONOSUPPORT); - if (prp->pr_type != type) - return (EPROTOTYPE); - MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_WAIT); - bzero((caddr_t)so, sizeof(*so)); - TAILQ_INIT(&so->so_incomp); - TAILQ_INIT(&so->so_comp); - so->so_type = type; - so->so_state = SS_PRIV; - so->so_proto = prp; - error = (*prp->pr_usrreqs->pru_attach)(so, proto); - if (error) { - so->so_state |= SS_NOFDREF; - sofree(so); - return (error); - } - *aso = so; - return (0); -} - -int -sobind(struct socket *so, struct mbuf *nam) -{ - int s = splnet(); - int error; - - error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam); - splx(s); - return (error); -} - -int -solisten(struct socket *so, int backlog) -{ - int s = splnet(), error; - - error = (*so->so_proto->pr_usrreqs->pru_listen)(so); - if (error) { - splx(s); - return (error); - } - if (so->so_comp.tqh_first == NULL) - so->so_options |= SO_ACCEPTCONN; - if (backlog < 0 || backlog > somaxconn) - backlog = somaxconn; - so->so_qlimit = backlog; - splx(s); - return (0); -} - -void -sofree(struct socket *so) -{ - struct socket *head = so->so_head; - - if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) - return; - if (head != NULL) { - if (so->so_state & SS_INCOMP) { - TAILQ_REMOVE(&head->so_incomp, so, so_list); - head->so_incqlen--; - } else if (so->so_state & SS_COMP) { - TAILQ_REMOVE(&head->so_comp, so, so_list); - } else { - panic("sofree: not queued"); - } - head->so_qlen--; - so->so_state &= ~(SS_INCOMP|SS_COMP); - so->so_head = NULL; - } - sbrelease(&so->so_snd); - sorflush(so); - FREE(so, M_SOCKET); -} - -static void -rtems_socket_close_notify(struct socket *so) -{ - if (so->so_pgid) { - rtems_event_system_send(so->so_pgid, RTEMS_EVENT_SYSTEM_NETWORK_CLOSE); - } -} - -static void -rtems_sockbuf_close_notify(struct socket *so, struct sockbuf *sb) -{ - if (sb->sb_flags & SB_WAIT) { - rtems_event_system_send(sb->sb_sel.si_pid, - RTEMS_EVENT_SYSTEM_NETWORK_CLOSE); - } - - if (sb->sb_wakeup) - (*sb->sb_wakeup)(so, sb->sb_wakeuparg); -} - -/* - * Close a socket on last file table reference removal. - * Initiate disconnect if connected. - * Free socket when disconnect complete. - */ -int -soclose(struct socket *so) -{ - int s = splnet(); /* conservative */ - int error = 0; - - rtems_socket_close_notify(so); - rtems_sockbuf_close_notify(so, &so->so_snd); - rtems_sockbuf_close_notify(so, &so->so_rcv); - - if (so->so_options & SO_ACCEPTCONN) { - struct socket *sp, *sonext; - - for (sp = so->so_incomp.tqh_first; sp != NULL; sp = sonext) { - sonext = sp->so_list.tqe_next; - (void) soabort(sp); - } - for (sp = so->so_comp.tqh_first; sp != NULL; sp = sonext) { - sonext = sp->so_list.tqe_next; - (void) soabort(sp); - } - } - if (so->so_pcb == 0) - goto discard; - if (so->so_state & SS_ISCONNECTED) { - if ((so->so_state & SS_ISDISCONNECTING) == 0) { - error = sodisconnect(so); - if (error) - goto drop; - } - if (so->so_options & SO_LINGER) { - if ((so->so_state & SS_ISDISCONNECTING) && - (so->so_state & SS_NBIO)) - goto drop; - while (so->so_state & SS_ISCONNECTED) { - soconnsleep (so); - } - } - } -drop: - if (so->so_pcb) { - int error2 = (*so->so_proto->pr_usrreqs->pru_detach)(so); - if (error == 0) - error = error2; - } -discard: - if (so->so_state & SS_NOFDREF) - panic("soclose: NOFDREF"); - so->so_state |= SS_NOFDREF; - sofree(so); - splx(s); - return (error); -} - -/* - * Must be called at splnet... - */ -int -soabort(struct socket *so) -{ - - return (*so->so_proto->pr_usrreqs->pru_abort)(so); -} - -int -soaccept(struct socket *so, struct mbuf *nam) -{ - int s = splnet(); - int error; - - if ((so->so_state & SS_NOFDREF) == 0) - panic("soaccept: !NOFDREF"); - so->so_state &= ~SS_NOFDREF; - error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam); - splx(s); - return (error); -} - -int -soconnect(struct socket *so, struct mbuf *nam) -{ - int s; - int error; - - if (so->so_options & SO_ACCEPTCONN) - return (EOPNOTSUPP); - s = splnet(); - /* - * If protocol is connection-based, can only connect once. - * Otherwise, if connected, try to disconnect first. - * This allows user to disconnect by connecting to, e.g., - * a null address. - */ - if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && - ((so->so_proto->pr_flags & PR_CONNREQUIRED) || - (error = sodisconnect(so)))) - error = EISCONN; - else - error = (*so->so_proto->pr_usrreqs->pru_connect)(so, nam); - splx(s); - return (error); -} - -int -soconnect2(struct socket *so1,struct socket *so2) -{ - int s = splnet(); - int error; - - error = (*so1->so_proto->pr_usrreqs->pru_connect2)(so1, so2); - splx(s); - return (error); -} - -int -sodisconnect(struct socket *so) -{ - int s = splnet(); - int error; - - if ((so->so_state & SS_ISCONNECTED) == 0) { - error = ENOTCONN; - goto bad; - } - if (so->so_state & SS_ISDISCONNECTING) { - error = EALREADY; - goto bad; - } - error = (*so->so_proto->pr_usrreqs->pru_disconnect)(so); -bad: - splx(s); - return (error); -} - -#define SBLOCKWAIT(f) (((f) & MSG_DONTWAIT) ? M_NOWAIT : M_WAITOK) -/* - * Send on a socket. - * If send must go all at once and message is larger than - * send buffering, then hard error. - * Lock against other senders. - * If must go all at once and not enough room now, then - * inform user that this would block and do nothing. - * Otherwise, if nonblocking, send as much as possible. - * The data to be sent is described by "uio" if nonzero, - * otherwise by the mbuf chain "top" (which must be null - * if uio is not). Data provided in mbuf chain must be small - * enough to send all at once. - * - * Returns nonzero on error, timeout or signal; callers - * must check for short counts if EINTR/ERESTART are returned. - * Data and control buffers are freed on return. - */ -int -sosend(struct socket *so, struct mbuf *addr, struct uio *uio, - struct mbuf *top, struct mbuf *control, int flags) -{ - struct mbuf **mp; - register struct mbuf *m; - register long space, len, resid; - int clen = 0, error, s, dontroute, mlen; - int atomic = sosendallatonce(so) || top; - - if (uio) - resid = uio->uio_resid; - else - resid = top->m_pkthdr.len; - /* - * In theory resid should be unsigned. - * However, space must be signed, as it might be less than 0 - * if we over-committed, and we must use a signed comparison - * of space and resid. On the other hand, a negative resid - * causes us to loop sending 0-length segments to the protocol. - * - * Also check to make sure that MSG_EOR isn't used on SOCK_STREAM - * type sockets since that's an error. - */ - if ((resid < 0) || (so->so_type == SOCK_STREAM && (flags & MSG_EOR))) { - error = EINVAL; - goto out; - } - - dontroute = - (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 && - (so->so_proto->pr_flags & PR_ATOMIC); - if (control) - clen = control->m_len; -#define snderr(errno) { error = errno; splx(s); goto release; } - -restart: - error = sblock(&so->so_snd, SBLOCKWAIT(flags)); - if (error) - goto out; - do { - s = splnet(); - if (so->so_state & SS_CANTSENDMORE) - snderr(EPIPE); - if (so->so_error) { - error = so->so_error; - so->so_error = 0; - splx(s); - goto release; - } - if ((so->so_state & SS_ISCONNECTED) == 0) { - /* - * `sendto' and `sendmsg' is allowed on a connection- - * based socket if it supports implied connect. - * Return ENOTCONN if not connected and no address is - * supplied. - */ - if ((so->so_proto->pr_flags & PR_CONNREQUIRED) && - (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) { - if ((so->so_state & SS_ISCONFIRMING) == 0 && - !(resid == 0 && clen != 0)) - snderr(ENOTCONN); - } else if (addr == 0) - snderr(so->so_proto->pr_flags & PR_CONNREQUIRED ? - ENOTCONN : EDESTADDRREQ); - } - space = sbspace(&so->so_snd); - if (flags & MSG_OOB) - space += 1024; - if ((atomic && resid > so->so_snd.sb_hiwat) || - clen > so->so_snd.sb_hiwat) - snderr(EMSGSIZE); - if (space < resid + clen && uio && - (atomic || space < so->so_snd.sb_lowat || space < clen)) { - if (so->so_state & SS_NBIO) - snderr(EWOULDBLOCK); - sbunlock(&so->so_snd); - error = sbwait(&so->so_snd); - splx(s); - if (error) - goto out; - goto restart; - } - splx(s); - mp = ⊤ - space -= clen; - do { - if (uio == NULL) { - /* - * Data is prepackaged in "top". - */ - resid = 0; - if (flags & MSG_EOR) - top->m_flags |= M_EOR; - } else do { - if (top == 0) { - MGETHDR(m, M_WAIT, MT_DATA); - mlen = MHLEN; - m->m_pkthdr.len = 0; - m->m_pkthdr.rcvif = (struct ifnet *)0; - } else { - MGET(m, M_WAIT, MT_DATA); - mlen = MLEN; - } - if (resid >= MINCLSIZE) { - MCLGET(m, M_WAIT); - if ((m->m_flags & M_EXT) == 0) - goto nopages; - mlen = MCLBYTES; - len = min(min(mlen, resid), space); - } else { -nopages: - len = min(min(mlen, resid), space); - /* - * For datagram protocols, leave room - * for protocol headers in first mbuf. - */ - if (atomic && top == 0 && len < mlen) - MH_ALIGN(m, len); - } - space -= len; - error = uiomove(mtod(m, caddr_t), (int)len, uio); - resid = uio->uio_resid; - m->m_len = len; - *mp = m; - top->m_pkthdr.len += len; - if (error) - goto release; - mp = &m->m_next; - if (resid <= 0) { - if (flags & MSG_EOR) - top->m_flags |= M_EOR; - break; - } - } while (space > 0 && atomic); - if (dontroute) - so->so_options |= SO_DONTROUTE; - s = splnet(); /* XXX */ - error = (*so->so_proto->pr_usrreqs->pru_send)(so, - (flags & MSG_OOB) ? PRUS_OOB : - /* - * If the user set MSG_EOF, the protocol - * understands this flag and nothing left to - * send then use PRU_SEND_EOF instead of PRU_SEND. - */ - ((flags & MSG_EOF) && - (so->so_proto->pr_flags & PR_IMPLOPCL) && - (resid <= 0)) ? - PRUS_EOF : 0, - top, addr, control); - splx(s); - if (dontroute) - so->so_options &= ~SO_DONTROUTE; - clen = 0; - control = 0; - top = 0; - mp = ⊤ - if (error) - goto release; - } while (resid && space > 0); - } while (resid); - -release: - sbunlock(&so->so_snd); -out: - if (top) - m_freem(top); - if (control) - m_freem(control); - return (error); -} - -/* - * Implement receive operations on a socket. - * We depend on the way that records are added to the sockbuf - * by sbappend*. In particular, each record (mbufs linked through m_next) - * must begin with an address if the protocol so specifies, - * followed by an optional mbuf or mbufs containing ancillary data, - * and then zero or more mbufs of data. - * In order to avoid blocking network interrupts for the entire time here, - * we splx() while doing the actual copy to user space. - * Although the sockbuf is locked, new data may still be appended, - * and thus we must maintain consistency of the sockbuf during that time. - * - * The caller may receive the data as a single mbuf chain by supplying - * an mbuf **mp0 for use in returning the chain. The uio is then used - * only for the count in uio_resid. - */ -int -soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio, - struct mbuf **mp0, struct mbuf **controlp, int *flagsp) -{ - register struct mbuf *m, **mp; - register int flags, len, error, s, offset; - struct protosw *pr = so->so_proto; - struct mbuf *nextrecord; - int moff, type = 0; - int orig_resid = uio->uio_resid; - - mp = mp0; - if (paddr) - *paddr = 0; - if (controlp) - *controlp = 0; - if (flagsp) - flags = *flagsp &~ MSG_EOR; - else - flags = 0; - if (flags & MSG_OOB) { - m = m_get(M_WAIT, MT_DATA); - error = (*pr->pr_usrreqs->pru_rcvoob)(so, m, flags & MSG_PEEK); - if (error) - goto bad; - do { - error = uiomove(mtod(m, caddr_t), - (int) min(uio->uio_resid, m->m_len), uio); - m = m_free(m); - } while (uio->uio_resid && error == 0 && m); -bad: - if (m) - m_freem(m); - return (error); - } - if (mp) - *mp = (struct mbuf *)0; - if (so->so_state & SS_ISCONFIRMING && uio->uio_resid) - (*pr->pr_usrreqs->pru_rcvd)(so, 0); - -restart: - error = sblock(&so->so_rcv, SBLOCKWAIT(flags)); - if (error) - return (error); - s = splnet(); - - m = so->so_rcv.sb_mb; - /* - * If we have less data than requested, block awaiting more - * (subject to any timeout) if: - * 1. the current count is less than the low water mark, or - * 2. MSG_WAITALL is set, and it is possible to do the entire - * receive operation at once if we block (resid <= hiwat). - * 3. MSG_DONTWAIT is not set - * If MSG_WAITALL is set but resid is larger than the receive buffer, - * we have to do the receive in sections, and thus risk returning - * a short count if a timeout or signal occurs after we start. - */ - if (m == 0 || (((flags & MSG_DONTWAIT) == 0 && - so->so_rcv.sb_cc < uio->uio_resid) && - (so->so_rcv.sb_cc < so->so_rcv.sb_lowat || - ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) && - m->m_nextpkt == 0 && (pr->pr_flags & PR_ATOMIC) == 0)) { -#ifdef DIAGNOSTIC - if (m == 0 && so->so_rcv.sb_cc) - panic("receive 1"); -#endif - if (so->so_error) { - if (m) - goto dontblock; - error = so->so_error; - if ((flags & MSG_PEEK) == 0) - so->so_error = 0; - goto release; - } - if (so->so_state & SS_CANTRCVMORE) { - if (m) - goto dontblock; - else - goto release; - } - for (; m; m = m->m_next) - if (m->m_type == MT_OOBDATA || (m->m_flags & M_EOR)) { - m = so->so_rcv.sb_mb; - goto dontblock; - } - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && - (so->so_proto->pr_flags & PR_CONNREQUIRED)) { - error = ENOTCONN; - goto release; - } - if (uio->uio_resid == 0) - goto release; - if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { - error = EWOULDBLOCK; - goto release; - } - sbunlock(&so->so_rcv); - error = sbwait(&so->so_rcv); - splx(s); - if (error) - return (error); - goto restart; - } -dontblock: - nextrecord = m->m_nextpkt; - if (pr->pr_flags & PR_ADDR) { -#ifdef DIAGNOSTIC - if (m->m_type != MT_SONAME) - panic("receive 1a"); -#endif - orig_resid = 0; - if (flags & MSG_PEEK) { - if (paddr) - *paddr = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (paddr) { - *paddr = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } - } - } - while (m && m->m_type == MT_CONTROL && error == 0) { - if (flags & MSG_PEEK) { - if (controlp) - *controlp = m_copy(m, 0, m->m_len); - m = m->m_next; - } else { - sbfree(&so->so_rcv, m); - if (controlp) { - if (pr->pr_domain->dom_externalize && - mtod(m, struct cmsghdr *)->cmsg_type == - SCM_RIGHTS) - error = (*pr->pr_domain->dom_externalize)(m); - *controlp = m; - so->so_rcv.sb_mb = m->m_next; - m->m_next = 0; - m = so->so_rcv.sb_mb; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } - } - if (controlp) { - orig_resid = 0; - controlp = &(*controlp)->m_next; - } - } - if (m) { - if ((flags & MSG_PEEK) == 0) - m->m_nextpkt = nextrecord; - type = m->m_type; - if (type == MT_OOBDATA) - flags |= MSG_OOB; - } - moff = 0; - offset = 0; - while (m && uio->uio_resid > 0 && error == 0) { - if (m->m_type == MT_OOBDATA) { - if (type != MT_OOBDATA) - break; - } else if (type == MT_OOBDATA) - break; -#ifdef DIAGNOSTIC - else if (m->m_type != MT_DATA && m->m_type != MT_HEADER) - panic("receive 3"); -#endif - so->so_state &= ~SS_RCVATMARK; - len = uio->uio_resid; - if (so->so_oobmark && len > so->so_oobmark - offset) - len = so->so_oobmark - offset; - if (len > m->m_len - moff) - len = m->m_len - moff; - /* - * If mp is set, just pass back the mbufs. - * Otherwise copy them out via the uio, then free. - * Sockbuf must be consistent here (points to current mbuf, - * it points to next record) when we drop priority; - * we must note any additions to the sockbuf when we - * block interrupts again. - */ - if (mp == 0) { - splx(s); - error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio); - s = splnet(); - if (error) - goto release; - } else - uio->uio_resid -= len; - if (len == m->m_len - moff) { - if (m->m_flags & M_EOR) - flags |= MSG_EOR; - if (flags & MSG_PEEK) { - m = m->m_next; - moff = 0; - } else { - nextrecord = m->m_nextpkt; - sbfree(&so->so_rcv, m); - if (mp) { - *mp = m; - mp = &m->m_next; - so->so_rcv.sb_mb = m = m->m_next; - *mp = (struct mbuf *)0; - } else { - MFREE(m, so->so_rcv.sb_mb); - m = so->so_rcv.sb_mb; - } - if (m) - m->m_nextpkt = nextrecord; - } - } else { - if (flags & MSG_PEEK) - moff += len; - else { - if (mp) - *mp = m_copym(m, 0, len, M_WAIT); - m->m_data += len; - m->m_len -= len; - so->so_rcv.sb_cc -= len; - } - } - if (so->so_oobmark) { - if ((flags & MSG_PEEK) == 0) { - so->so_oobmark -= len; - if (so->so_oobmark == 0) { - so->so_state |= SS_RCVATMARK; - break; - } - } else { - offset += len; - if (offset == so->so_oobmark) - break; - } - } - if (flags & MSG_EOR) - break; - /* - * If the MSG_WAITALL flag is set (for non-atomic socket), - * we must not quit until "uio->uio_resid == 0" or an error - * termination. If a signal/timeout occurs, return - * with a short count but without error. - * Keep sockbuf locked against other readers. - */ - while (flags & MSG_WAITALL && m == 0 && uio->uio_resid > 0 && - !sosendallatonce(so) && !nextrecord) { - if (so->so_error || so->so_state & SS_CANTRCVMORE) - break; - error = sbwait(&so->so_rcv); - if (error) { - if (error != ENXIO) - sbunlock(&so->so_rcv); - splx(s); - return (0); - } - m = so->so_rcv.sb_mb; - if (m) - nextrecord = m->m_nextpkt; - } - } - - if (m && pr->pr_flags & PR_ATOMIC) { - flags |= MSG_TRUNC; - if ((flags & MSG_PEEK) == 0) - (void) sbdroprecord(&so->so_rcv); - } - if ((flags & MSG_PEEK) == 0) { - if (m == 0) - so->so_rcv.sb_mb = nextrecord; - if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) - (*pr->pr_usrreqs->pru_rcvd)(so, flags); - } - if (orig_resid == uio->uio_resid && orig_resid && - (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) { - sbunlock(&so->so_rcv); - splx(s); - goto restart; - } - - if (flagsp) - *flagsp |= flags; -release: - sbunlock(&so->so_rcv); - splx(s); - return (error); -} - -int -soshutdown(struct socket *so, int how ) -{ - register struct protosw *pr = so->so_proto; - - how++; - if (how & FREAD) - sorflush(so); - if (how & FWRITE) - return ((*pr->pr_usrreqs->pru_shutdown)(so)); - return (0); -} - -void -sorflush(struct socket *so) -{ - register struct sockbuf *sb = &so->so_rcv; - register struct protosw *pr = so->so_proto; - register int s; - struct sockbuf asb; - - sb->sb_flags |= SB_NOINTR; - (void) sblock(sb, M_WAITOK); - s = splimp(); - socantrcvmore(so); - sbunlock(sb); - asb = *sb; - bzero((caddr_t)sb, sizeof (*sb)); - splx(s); - if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose) - (*pr->pr_domain->dom_dispose)(asb.sb_mb); - sbrelease(&asb); -} - -int -sosetopt(struct socket *so, int level, int optname, struct mbuf *m0) -{ - int error = 0; - register struct mbuf *m = m0; - - if (level != SOL_SOCKET) { - if (so->so_proto && so->so_proto->pr_ctloutput) - return ((*so->so_proto->pr_ctloutput) - (PRCO_SETOPT, so, level, optname, &m0)); - error = ENOPROTOOPT; - } else { - switch (optname) { - - case SO_LINGER: - if (m == NULL || m->m_len != sizeof (struct linger)) { - error = EINVAL; - goto bad; - } - so->so_linger = mtod(m, struct linger *)->l_linger; - /* fall thru... */ - - case SO_DEBUG: - case SO_KEEPALIVE: - case SO_DONTROUTE: - case SO_USELOOPBACK: - case SO_BROADCAST: - case SO_REUSEADDR: - case SO_REUSEPORT: - case SO_OOBINLINE: - case SO_TIMESTAMP: - if (m == NULL || m->m_len < sizeof (int)) { - error = EINVAL; - goto bad; - } - if (*mtod(m, int *)) - so->so_options |= optname; - else - so->so_options &= ~optname; - break; - - case SO_SNDBUF: - case SO_RCVBUF: - case SO_SNDLOWAT: - case SO_RCVLOWAT: - { - int optval; - - if (m == NULL || m->m_len < sizeof (int)) { - error = EINVAL; - goto bad; - } - - /* - * Values < 1 make no sense for any of these - * options, so disallow them. - */ - optval = *mtod(m, int *); - if (optval < 1) { - error = EINVAL; - goto bad; - } - - switch (optname) { - - case SO_SNDBUF: - case SO_RCVBUF: - if (sbreserve(optname == SO_SNDBUF ? - &so->so_snd : &so->so_rcv, - (u_long) optval) == 0) { - error = ENOBUFS; - goto bad; - } - break; - - /* - * Make sure the low-water is never greater than - * the high-water. - */ - case SO_SNDLOWAT: - so->so_snd.sb_lowat = - (optval > so->so_snd.sb_hiwat) ? - so->so_snd.sb_hiwat : optval; - break; - case SO_RCVLOWAT: - so->so_rcv.sb_lowat = - (optval > so->so_rcv.sb_hiwat) ? - so->so_rcv.sb_hiwat : optval; - break; - } - break; - } - - case SO_SNDTIMEO: - case SO_RCVTIMEO: - { - struct timeval *tv; - unsigned long val; - - if (m == NULL || m->m_len < sizeof (*tv)) { - error = EINVAL; - goto bad; - } - tv = mtod(m, struct timeval *); - if (tv->tv_sec >= (ULONG_MAX - hz) / hz) { - error = EDOM; - goto bad; - } - - val = tv->tv_sec * hz + tv->tv_usec / tick; - if ((val == 0) && (tv->tv_sec || tv->tv_usec)) - val = 1; - - switch (optname) { - - case SO_SNDTIMEO: - so->so_snd.sb_timeo = val; - break; - case SO_RCVTIMEO: - so->so_rcv.sb_timeo = val; - break; - } - break; - } - - case SO_PRIVSTATE: - /* we don't care what the parameter is... */ - so->so_state &= ~SS_PRIV; - break; - - case SO_SNDWAKEUP: - case SO_RCVWAKEUP: - { - /* RTEMS addition. */ - struct sockwakeup *sw; - struct sockbuf *sb; - - if (m == NULL - || m->m_len != sizeof (struct sockwakeup)) { - error = EINVAL; - goto bad; - } - sw = mtod(m, struct sockwakeup *); - sb = (optname == SO_SNDWAKEUP - ? &so->so_snd - : &so->so_rcv); - sb->sb_wakeup = sw->sw_pfn; - sb->sb_wakeuparg = sw->sw_arg; - if (sw->sw_pfn) - sb->sb_flags |= SB_ASYNC; - else - sb->sb_flags &=~ SB_ASYNC; - break; - } - - default: - error = ENOPROTOOPT; - break; - } - if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) { - (void) ((*so->so_proto->pr_ctloutput) - (PRCO_SETOPT, so, level, optname, &m0)); - m = NULL; /* freed by protocol */ - } - } -bad: - if (m) - (void) m_free(m); - return (error); -} - -int -sogetopt(struct socket *so, int level, int optname, struct mbuf **mp) -{ - register struct mbuf *m; - - if (level != SOL_SOCKET) { - if (so->so_proto && so->so_proto->pr_ctloutput) { - return ((*so->so_proto->pr_ctloutput) - (PRCO_GETOPT, so, level, optname, mp)); - } else - return (ENOPROTOOPT); - } else { - m = m_get(M_WAIT, MT_SOOPTS); - m->m_len = sizeof (int); - - switch (optname) { - - case SO_LINGER: - m->m_len = sizeof (struct linger); - mtod(m, struct linger *)->l_onoff = - so->so_options & SO_LINGER; - mtod(m, struct linger *)->l_linger = so->so_linger; - break; - - case SO_USELOOPBACK: - case SO_DONTROUTE: - case SO_DEBUG: - case SO_KEEPALIVE: - case SO_REUSEADDR: - case SO_REUSEPORT: - case SO_BROADCAST: - case SO_OOBINLINE: - case SO_TIMESTAMP: - *mtod(m, int *) = so->so_options & optname; - break; - - case SO_PRIVSTATE: - *mtod(m, int *) = so->so_state & SS_PRIV; - break; - - case SO_TYPE: - *mtod(m, int *) = so->so_type; - break; - - case SO_ERROR: - *mtod(m, int *) = so->so_error; - so->so_error = 0; - break; - - case SO_SNDBUF: - *mtod(m, int *) = so->so_snd.sb_hiwat; - break; - - case SO_RCVBUF: - *mtod(m, int *) = so->so_rcv.sb_hiwat; - break; - - case SO_SNDLOWAT: - *mtod(m, int *) = so->so_snd.sb_lowat; - break; - - case SO_RCVLOWAT: - *mtod(m, int *) = so->so_rcv.sb_lowat; - break; - - case SO_SNDTIMEO: - case SO_RCVTIMEO: - { - unsigned long val = (optname == SO_SNDTIMEO ? - so->so_snd.sb_timeo : so->so_rcv.sb_timeo); - - m->m_len = sizeof(struct timeval); - mtod(m, struct timeval *)->tv_sec = val / hz; - mtod(m, struct timeval *)->tv_usec = - (val % hz) * tick; - break; - } - - case SO_SNDWAKEUP: - case SO_RCVWAKEUP: - { - struct sockbuf *sb; - struct sockwakeup *sw; - - /* RTEMS additions. */ - sb = (optname == SO_SNDWAKEUP - ? &so->so_snd - : &so->so_rcv); - m->m_len = sizeof (struct sockwakeup); - sw = mtod(m, struct sockwakeup *); - sw->sw_pfn = sb->sb_wakeup; - sw->sw_arg = sb->sb_wakeuparg; - break; - } - - default: - (void)m_free(m); - return (ENOPROTOOPT); - } - *mp = m; - return (0); - } -} - -void -sohasoutofband(struct socket *so) -{ -#if 0 /* FIXME: For now we just ignore out of band data */ - struct proc *p; - - if (so->so_pgid < 0) - gsignal(-so->so_pgid, SIGURG); - else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0) - psignal(p, SIGURG); - selwakeup(&so->so_rcv.sb_sel); -#endif -} diff --git a/cpukit/libnetworking/kern/uipc_socket2.c b/cpukit/libnetworking/kern/uipc_socket2.c deleted file mode 100644 index 137eb0f5f0..0000000000 --- a/cpukit/libnetworking/kern/uipc_socket2.c +++ /dev/null @@ -1,939 +0,0 @@ -#include - -/* - * This file has undergone several changes to reflect the - * differences between the RTEMS and FreeBSD kernels. - */ - -/* - * Copyright (c) 1982, 1986, 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Primitive routines for operating on sockets and socket buffers - */ - -u_long sb_max = SB_MAX; /* XXX should be static */ -SYSCTL_INT(_kern, KIPC_MAXSOCKBUF, maxsockbuf, CTLFLAG_RW, &sb_max, 0, ""); - -static u_long sb_efficiency = 8; /* parameter for sbreserve() */ -SYSCTL_INT(_kern, OID_AUTO, sockbuf_waste_factor, CTLFLAG_RW, &sb_efficiency, - 0, ""); - -#if defined(__rtems__) - void rtems_set_sb_efficiency( - u_long efficiency - ) - { - sb_efficiency = (efficiency == 0) ? 2 : efficiency; - } -#endif - -/* - * Procedures to manipulate state flags of socket - * and do appropriate wakeups. Normal sequence from the - * active (originating) side is that soisconnecting() is - * called during processing of connect() call, - * resulting in an eventual call to soisconnected() if/when the - * connection is established. When the connection is torn down - * soisdisconnecting() is called during processing of disconnect() call, - * and soisdisconnected() is called when the connection to the peer - * is totally severed. The semantics of these routines are such that - * connectionless protocols can call soisconnected() and soisdisconnected() - * only, bypassing the in-progress calls when setting up a ``connection'' - * takes no time. - * - * From the passive side, a socket is created with - * two queues of sockets: so_q0 for connections in progress - * and so_q for connections already made and awaiting user acceptance. - * As a protocol is preparing incoming connections, it creates a socket - * structure queued on so_q0 by calling sonewconn(). When the connection - * is established, soisconnected() is called, and transfers the - * socket structure to so_q, making it available to accept(). - * - * If a socket is closed with sockets on either - * so_q0 or so_q, these sockets are dropped. - * - * If higher level protocols are implemented in - * the kernel, the wakeups done here will sometimes - * cause software-interrupt process scheduling. - */ - -void -soisconnecting(struct socket *so) -{ - - so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING); - so->so_state |= SS_ISCONNECTING; -} - -void -soisconnected(struct socket *so) -{ - register struct socket *head = so->so_head; - - so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING); - so->so_state |= SS_ISCONNECTED; - if (head && (so->so_state & SS_INCOMP)) { - TAILQ_REMOVE(&head->so_incomp, so, so_list); - head->so_incqlen--; - so->so_state &= ~SS_INCOMP; - TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); - so->so_state |= SS_COMP; - sorwakeup(head); - soconnwakeup(head); - } else { - soconnwakeup(so); - sorwakeup(so); - sowwakeup(so); - } -} - -void -soisdisconnecting(struct socket *so) -{ - - so->so_state &= ~SS_ISCONNECTING; - so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE); - soconnwakeup(so); - sowwakeup(so); - sorwakeup(so); -} - -void -soisdisconnected(struct socket *so) -{ - - so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); - so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE); - soconnwakeup(so); - sowwakeup(so); - sorwakeup(so); -} - -/* - * Return a random connection that hasn't been serviced yet and - * is eligible for discard. There is a one in qlen chance that - * we will return a null, saying that there are no dropable - * requests. In this case, the protocol specific code should drop - * the new request. This insures fairness. - * - * This may be used in conjunction with protocol specific queue - * congestion routines. - */ -struct socket * -sodropablereq(struct socket *head) -{ - register struct socket *so; - uint32_t i, j, qlen, m; - - static int rnd; - static long old_mono_secs; - static unsigned int cur_cnt, old_cnt; - - if ((i = (m = rtems_bsdnet_seconds_since_boot()) - old_mono_secs) != 0) { - old_mono_secs = m; - old_cnt = cur_cnt / i; - cur_cnt = 0; - } - - so = TAILQ_FIRST(&head->so_incomp); - if (!so) - return (so); - - qlen = head->so_incqlen; - if (++cur_cnt > qlen || old_cnt > qlen) { - rnd = (314159 * rnd + 66329) & 0xffff; - j = ((qlen + 1) * rnd) >> 16; - - while (j-- && so) - so = TAILQ_NEXT(so, so_list); - } - - return (so); -} - -/* - * When an attempt at a new connection is noted on a socket - * which accepts connections, sonewconn is called. If the - * connection is possible (subject to space constraints, etc.) - * then we allocate a new structure, propoerly linked into the - * data structure of the original socket, and return this. - * Connstatus may be 0, or SO_ISCONFIRMING, or SO_ISCONNECTED. - * - * Currently, sonewconn() is defined as sonewconn1() in socketvar.h - * to catch calls that are missing the (new) second parameter. - */ -struct socket * -sonewconn1(struct socket *head, int connstatus) -{ - register struct socket *so; - - if (head->so_qlen > 3 * head->so_qlimit / 2) - return ((struct socket *)0); - MALLOC(so, struct socket *, sizeof(*so), M_SOCKET, M_DONTWAIT); - if (so == NULL) - return ((struct socket *)0); - bzero((caddr_t)so, sizeof(*so)); - so->so_head = head; - so->so_type = head->so_type; - so->so_options = head->so_options &~ SO_ACCEPTCONN; - so->so_linger = head->so_linger; - so->so_state = head->so_state | SS_NOFDREF; - so->so_proto = head->so_proto; - so->so_timeo = head->so_timeo; - (void) soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat); - if (connstatus) { - TAILQ_INSERT_TAIL(&head->so_comp, so, so_list); - so->so_state |= SS_COMP; - } else { - TAILQ_INSERT_TAIL(&head->so_incomp, so, so_list); - so->so_state |= SS_INCOMP; - head->so_incqlen++; - } - head->so_qlen++; - if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0)) { - if (so->so_state & SS_COMP) { - TAILQ_REMOVE(&head->so_comp, so, so_list); - } else { - TAILQ_REMOVE(&head->so_incomp, so, so_list); - head->so_incqlen--; - } - head->so_qlen--; - (void) free((caddr_t)so, M_SOCKET); - return ((struct socket *)0); - } - if (connstatus) { - sorwakeup(head); - soconnwakeup(head); - so->so_state |= connstatus; - } - return (so); -} - -/* - * Socantsendmore indicates that no more data will be sent on the - * socket; it would normally be applied to a socket when the user - * informs the system that no more data is to be sent, by the protocol - * code (in case PRU_SHUTDOWN). Socantrcvmore indicates that no more data - * will be received, and will normally be applied to the socket by a - * protocol when it detects that the peer will send no more data. - * Data queued for reading in the socket may yet be read. - */ - -void -socantsendmore(struct socket *so) -{ - - so->so_state |= SS_CANTSENDMORE; - sowwakeup(so); -} - -void -socantrcvmore(struct socket *so) -{ - - so->so_state |= SS_CANTRCVMORE; - sorwakeup(so); -} - -/* - * Socket buffer (struct sockbuf) utility routines. - * - * Each socket contains two socket buffers: one for sending data and - * one for receiving data. Each buffer contains a queue of mbufs, - * information about the number of mbufs and amount of data in the - * queue, and other fields allowing select() statements and notification - * on data availability to be implemented. - * - * Data stored in a socket buffer is maintained as a list of records. - * Each record is a list of mbufs chained together with the m_next - * field. Records are chained together with the m_nextpkt field. The upper - * level routine soreceive() expects the following conventions to be - * observed when placing information in the receive buffer: - * - * 1. If the protocol requires each message be preceded by the sender's - * name, then a record containing that name must be present before - * any associated data (mbuf's must be of type MT_SONAME). - * 2. If the protocol supports the exchange of ``access rights'' (really - * just additional data associated with the message), and there are - * ``rights'' to be received, then a record containing this data - * should be present (mbuf's must be of type MT_RIGHTS). - * 3. If a name or rights record exists, then it must be followed by - * a data record, perhaps of zero length. - * - * Before using a new socket structure it is first necessary to reserve - * buffer space to the socket, by calling sbreserve(). This should commit - * some of the available buffer space in the system buffer pool for the - * socket (currently, it does nothing but enforce limits). The space - * should be released by calling sbrelease() when the socket is destroyed. - */ - -int -soreserve(struct socket *so, u_long sndcc, u_long rcvcc) -{ - - if (sbreserve(&so->so_snd, sndcc) == 0) - goto bad; - if (sbreserve(&so->so_rcv, rcvcc) == 0) - goto bad2; - if (so->so_rcv.sb_lowat == 0) - so->so_rcv.sb_lowat = 1; - if (so->so_snd.sb_lowat == 0) - so->so_snd.sb_lowat = MCLBYTES; - if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat) - so->so_snd.sb_lowat = so->so_snd.sb_hiwat; - return (0); -bad2: - sbrelease(&so->so_snd); -bad: - return (ENOBUFS); -} - -/* - * Allot mbufs to a sockbuf. - * Attempt to scale mbmax so that mbcnt doesn't become limiting - * if buffering efficiency is near the normal case. - */ -int -sbreserve(struct sockbuf *sb, u_long cc) -{ - - if (cc > sb_max * MCLBYTES / (_SYS_MBUF_LEGACY_MSIZE + MCLBYTES)) - return (0); - sb->sb_hiwat = cc; - sb->sb_mbmax = min(cc * sb_efficiency, sb_max); - if (sb->sb_lowat > sb->sb_hiwat) - sb->sb_lowat = sb->sb_hiwat; - return (1); -} - -/* - * Free mbufs held by a socket, and reserved mbuf space. - */ -void -sbrelease(struct sockbuf *sb) -{ - - sbflush(sb); - sb->sb_hiwat = sb->sb_mbmax = 0; -} - -/* - * Routines to add and remove - * data from an mbuf queue. - * - * The routines sbappend() or sbappendrecord() are normally called to - * append new mbufs to a socket buffer, after checking that adequate - * space is available, comparing the function sbspace() with the amount - * of data to be added. sbappendrecord() differs from sbappend() in - * that data supplied is treated as the beginning of a new record. - * To place a sender's address, optional access rights, and data in a - * socket receive buffer, sbappendaddr() should be used. To place - * access rights and data in a socket receive buffer, sbappendrights() - * should be used. In either case, the new data begins a new record. - * Note that unlike sbappend() and sbappendrecord(), these routines check - * for the caller that there will be enough space to store the data. - * Each fails if there is not enough space, or if it cannot find mbufs - * to store additional information in. - * - * Reliable protocols may use the socket send buffer to hold data - * awaiting acknowledgement. Data is normally copied from a socket - * send buffer in a protocol with m_copy for output to a peer, - * and then removing the data from the socket buffer with sbdrop() - * or sbdroprecord() when the data is acknowledged by the peer. - */ - -/* - * Append mbuf chain m to the last record in the - * socket buffer sb. The additional space associated - * the mbuf chain is recorded in sb. Empty mbufs are - * discarded and mbufs are compacted where possible. - */ -void -sbappend(struct sockbuf *sb, struct mbuf *m) -{ - register struct mbuf *n; - - if (m == 0) - return; - n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - do { - if (n->m_flags & M_EOR) { - sbappendrecord(sb, m); /* XXXXXX!!!! */ - return; - } - } while (n->m_next && (n = n->m_next)); - } - sbcompress(sb, m, n); -} - -#ifdef SOCKBUF_DEBUG -void -sbcheck(struct sockbuf *sb) -{ - register struct mbuf *m; - register int len = 0, mbcnt = 0; - - for (m = sb->sb_mb; m; m = m->m_next) { - len += m->m_len; - mbcnt += _SYS_MBUF_LEGACY_MSIZE; - if (m->m_flags & M_EXT) /*XXX*/ /* pretty sure this is bogus */ - mbcnt += m->m_ext.ext_size; - if (m->m_nextpkt) - panic("sbcheck nextpkt"); - } - if (len != sb->sb_cc || mbcnt != sb->sb_mbcnt) { - printf("cc %d != %d || mbcnt %d != %d\n", len, sb->sb_cc, - mbcnt, sb->sb_mbcnt); - panic("sbcheck"); - } -} -#endif - -/* - * As above, except the mbuf chain - * begins a new record. - */ -void -sbappendrecord(struct sockbuf *sb, struct mbuf *m0) -{ - register struct mbuf *m; - - if (m0 == 0) - return; - m = sb->sb_mb; - if (m) - while (m->m_nextpkt) - m = m->m_nextpkt; - /* - * Put the first mbuf on the queue. - * Note this permits zero length records. - */ - sballoc(sb, m0); - if (m) - m->m_nextpkt = m0; - else - sb->sb_mb = m0; - m = m0->m_next; - m0->m_next = 0; - if (m && (m0->m_flags & M_EOR)) { - m0->m_flags &= ~M_EOR; - m->m_flags |= M_EOR; - } - sbcompress(sb, m, m0); -} - -/* - * As above except that OOB data - * is inserted at the beginning of the sockbuf, - * but after any other OOB data. - */ -void -sbinsertoob(struct sockbuf *sb, struct mbuf *m0) -{ - register struct mbuf *m; - register struct mbuf **mp; - - if (m0 == 0) - return; - for (mp = &sb->sb_mb; *mp ; mp = &((*mp)->m_nextpkt)) { - m = *mp; - again: - switch (m->m_type) { - - case MT_OOBDATA: - continue; /* WANT next train */ - - case MT_CONTROL: - m = m->m_next; - if (m) - goto again; /* inspect THIS train further */ - } - break; - } - /* - * Put the first mbuf on the queue. - * Note this permits zero length records. - */ - sballoc(sb, m0); - m0->m_nextpkt = *mp; - *mp = m0; - m = m0->m_next; - m0->m_next = 0; - if (m && (m0->m_flags & M_EOR)) { - m0->m_flags &= ~M_EOR; - m->m_flags |= M_EOR; - } - sbcompress(sb, m, m0); -} - -/* - * Append address and data, and optionally, control (ancillary) data - * to the receive queue of a socket. If present, - * m0 must include a packet header with total length. - * Returns 0 if no space in sockbuf or insufficient mbufs. - */ -int -sbappendaddr(struct sockbuf *sb, struct sockaddr *asa, - struct mbuf *m0, struct mbuf *control) -{ - register struct mbuf *m, *n; - int space = asa->sa_len; - -if (m0 && (m0->m_flags & M_PKTHDR) == 0) -panic("sbappendaddr"); - if (m0) - space += m0->m_pkthdr.len; - for (n = control; n; n = n->m_next) { - space += n->m_len; - if (n->m_next == 0) /* keep pointer to last control buf */ - break; - } - if (space > sbspace(sb)) - return (0); - if (asa->sa_len > MLEN) - return (0); - MGET(m, M_DONTWAIT, MT_SONAME); - if (m == 0) - return (0); - m->m_len = asa->sa_len; - bcopy((caddr_t)asa, mtod(m, caddr_t), asa->sa_len); - if (n) - n->m_next = m0; /* concatenate data to control */ - else - control = m0; - m->m_next = control; - for (n = m; n; n = n->m_next) - sballoc(sb, n); - n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - n->m_nextpkt = m; - } else - sb->sb_mb = m; - return (1); -} - -int -sbappendcontrol(struct sockbuf *sb, struct mbuf *m0, - struct mbuf *control) -{ - register struct mbuf *m, *n; - int space = 0; - - if (control == 0) - panic("sbappendcontrol"); - for (m = control; ; m = m->m_next) { - space += m->m_len; - if (m->m_next == 0) - break; - } - n = m; /* save pointer to last control buffer */ - for (m = m0; m; m = m->m_next) - space += m->m_len; - if (space > sbspace(sb)) - return (0); - n->m_next = m0; /* concatenate data to control */ - for (m = control; m; m = m->m_next) - sballoc(sb, m); - n = sb->sb_mb; - if (n) { - while (n->m_nextpkt) - n = n->m_nextpkt; - n->m_nextpkt = control; - } else - sb->sb_mb = control; - return (1); -} - -/* - * Compress mbuf chain m into the socket - * buffer sb following mbuf n. If n - * is null, the buffer is presumed empty. - */ -void -sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n) -{ - register int eor = 0; - register struct mbuf *o; - - while (m) { - eor |= m->m_flags & M_EOR; - if (m->m_len == 0 && - (eor == 0 || - (((o = m->m_next) || (o = n)) && - o->m_type == m->m_type))) { - m = m_free(m); - continue; - } - if (n && (n->m_flags & (M_EXT | M_EOR)) == 0 && - (n->m_data + n->m_len + m->m_len) < &n->m_dat[MLEN] && - n->m_type == m->m_type) { - bcopy(mtod(m, caddr_t), mtod(n, caddr_t) + n->m_len, - (unsigned)m->m_len); - n->m_len += m->m_len; - sb->sb_cc += m->m_len; - m = m_free(m); - continue; - } - if (n) - n->m_next = m; - else - sb->sb_mb = m; - sballoc(sb, m); - n = m; - m->m_flags &= ~M_EOR; - m = m->m_next; - n->m_next = 0; - } - if (eor) { - if (n) - n->m_flags |= eor; - else - printf("semi-panic: sbcompress\n"); - } -} - -/* - * Free all mbufs in a sockbuf. - * Check that all resources are reclaimed. - */ -void -sbflush(struct sockbuf *sb) -{ - - if (sb->sb_flags & SB_LOCK) - panic("sbflush"); - while (sb->sb_mbcnt) - sbdrop(sb, (int)sb->sb_cc); - if (sb->sb_cc || sb->sb_mb) - panic("sbflush 2"); -} - -/* - * Drop data from (the front of) a sockbuf. - */ -void -sbdrop(struct sockbuf *sb, int len) -{ - register struct mbuf *m, *mn; - struct mbuf *next; - - next = (m = sb->sb_mb) ? m->m_nextpkt : 0; - while (len > 0) { - if (m == 0) { - if (next == 0) - panic("sbdrop"); - m = next; - next = m->m_nextpkt; - continue; - } - if (m->m_len > len) { - m->m_len -= len; - m->m_data += len; - sb->sb_cc -= len; - break; - } - len -= m->m_len; - sbfree(sb, m); - MFREE(m, mn); - m = mn; - } - while (m && m->m_len == 0) { - sbfree(sb, m); - MFREE(m, mn); - m = mn; - } - if (m) { - sb->sb_mb = m; - m->m_nextpkt = next; - } else - sb->sb_mb = next; -} - -/* - * Drop a record off the front of a sockbuf - * and move the next record to the front. - */ -void -sbdroprecord(struct sockbuf *sb) -{ - register struct mbuf *m, *mn; - - m = sb->sb_mb; - if (m) { - sb->sb_mb = m->m_nextpkt; - do { - sbfree(sb, m); - MFREE(m, mn); - m = mn; - } while (m); - } -} - -/* - * Create a "control" mbuf containing the specified data - * with the specified type for presentation on a socket buffer. - */ -struct mbuf * -sbcreatecontrol(caddr_t p, int size, int type, int level) -{ - register struct cmsghdr *cp; - struct mbuf *m; - - if ((m = m_get(M_DONTWAIT, MT_CONTROL)) == NULL) - return ((struct mbuf *) NULL); - cp = mtod(m, struct cmsghdr *); - /* XXX check size? */ - (void)memcpy(CMSG_DATA(cp), p, size); - size += sizeof(*cp); - m->m_len = size; - cp->cmsg_len = size; - cp->cmsg_level = level; - cp->cmsg_type = type; - return (m); -} - -#ifdef PRU_OLDSTYLE -/* - * The following routines mediate between the old-style `pr_usrreq' - * protocol implementations and the new-style `struct pr_usrreqs' - * calling convention. - */ - -/* syntactic sugar */ -#define nomb (struct mbuf *)0 - -static int -old_abort(struct socket *so) -{ - return so->so_proto->pr_ousrreq(so, PRU_ABORT, nomb, nomb, nomb); -} - -static int -old_accept(struct socket *so, struct mbuf *nam) -{ - return so->so_proto->pr_ousrreq(so, PRU_ACCEPT, nomb, nam, nomb); -} - -static int -old_attach(struct socket *so, intptr_t proto) -{ - return so->so_proto->pr_ousrreq(so, PRU_ATTACH, nomb, - (struct mbuf *)proto, /* XXX */ - nomb); -} - -static int -old_bind(struct socket *so, struct mbuf *nam) -{ - return so->so_proto->pr_ousrreq(so, PRU_BIND, nomb, nam, nomb); -} - -static int -old_connect(struct socket *so, struct mbuf *nam) -{ - return so->so_proto->pr_ousrreq(so, PRU_CONNECT, nomb, nam, nomb); -} - -static int -old_connect2(struct socket *so1, struct socket *so2) -{ - return so1->so_proto->pr_ousrreq(so1, PRU_CONNECT2, nomb, - (struct mbuf *)so2, nomb); -} - -static int -old_control(struct socket *so, intptr_t cmd, caddr_t data, struct ifnet *ifp) -{ - return so->so_proto->pr_ousrreq(so, PRU_CONTROL, (struct mbuf *)cmd, - (struct mbuf *)data, - (struct mbuf *)ifp); -} - -static int -old_detach(struct socket *so) -{ - return so->so_proto->pr_ousrreq(so, PRU_DETACH, nomb, nomb, nomb); -} - -static int -old_disconnect(struct socket *so) -{ - return so->so_proto->pr_ousrreq(so, PRU_DISCONNECT, nomb, nomb, nomb); -} - -static int -old_listen(struct socket *so) -{ - return so->so_proto->pr_ousrreq(so, PRU_LISTEN, nomb, nomb, nomb); -} - -static int -old_peeraddr(struct socket *so, struct mbuf *nam) -{ - return so->so_proto->pr_ousrreq(so, PRU_PEERADDR, nomb, nam, nomb); -} - -static int -old_rcvd(struct socket *so, intptr_t flags) -{ - return so->so_proto->pr_ousrreq(so, PRU_RCVD, nomb, - (struct mbuf *)flags, /* XXX */ - nomb); -} - -static int -old_rcvoob(struct socket *so, struct mbuf *m, intptr_t flags) -{ - return so->so_proto->pr_ousrreq(so, PRU_RCVOOB, m, - (struct mbuf *)flags, /* XXX */ - nomb); -} - -static int -old_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *addr, - struct mbuf *control) -{ - int req; - - if (flags & PRUS_OOB) { - req = PRU_SENDOOB; - } else if(flags & PRUS_EOF) { - req = PRU_SEND_EOF; - } else { - req = PRU_SEND; - } - return so->so_proto->pr_ousrreq(so, req, m, addr, control); -} - -static int -old_sense(struct socket *so, struct stat *sb) -{ - return so->so_proto->pr_ousrreq(so, PRU_SENSE, (struct mbuf *)sb, - nomb, nomb); -} - -static int -old_shutdown(struct socket *so) -{ - return so->so_proto->pr_ousrreq(so, PRU_SHUTDOWN, nomb, nomb, nomb); -} - -static int -old_sockaddr(struct socket *so, struct mbuf *nam) -{ - return so->so_proto->pr_ousrreq(so, PRU_SOCKADDR, nomb, nam, nomb); -} - -struct pr_usrreqs pru_oldstyle = { - old_abort, old_accept, old_attach, old_bind, old_connect, - old_connect2, old_control, old_detach, old_disconnect, - old_listen, old_peeraddr, old_rcvd, old_rcvoob, old_send, - old_sense, old_shutdown, old_sockaddr -}; - -#endif /* PRU_OLDSTYLE */ - -/* - * Some routines that return EOPNOTSUPP for entry points that are not - * supported by a protocol. Fill in as needed. - */ -int -pru_accept_notsupp(struct socket *so, struct mbuf *nam) -{ - return EOPNOTSUPP; -} - -int -pru_connect2_notsupp(struct socket *so1, struct socket *so2) -{ - return EOPNOTSUPP; -} - -int -pru_control_notsupp(struct socket *so, int cmd, caddr_t data, - struct ifnet *ifp) -{ - return EOPNOTSUPP; -} - -int -pru_listen_notsupp(struct socket *so) -{ - return EOPNOTSUPP; -} - -int -pru_rcvd_notsupp(struct socket *so, int flags) -{ - return EOPNOTSUPP; -} - -int -pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags) -{ - return EOPNOTSUPP; -} - -/* - * This isn't really a ``null'' operation, but it's the default one - * and doesn't do anything destructive. - */ -int -pru_sense_null(struct socket *so, struct stat *sb) -{ - sb->st_blksize = so->so_snd.sb_hiwat; - return 0; -} diff --git a/cpukit/libnetworking/lib/README b/cpukit/libnetworking/lib/README deleted file mode 100644 index 787c24c012..0000000000 --- a/cpukit/libnetworking/lib/README +++ /dev/null @@ -1 +0,0 @@ -Sources from application-level (as opposed to kernel-level) libraries. diff --git a/cpukit/libnetworking/lib/getprotoby.c b/cpukit/libnetworking/lib/getprotoby.c deleted file mode 100644 index 4eeec598f8..0000000000 --- a/cpukit/libnetworking/lib/getprotoby.c +++ /dev/null @@ -1,48 +0,0 @@ -#include - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include - -static const struct protoent prototab[] = { - { "ip", NULL, IPPROTO_IP }, - { "icmp", NULL, IPPROTO_ICMP }, - { "tcp", NULL, IPPROTO_TCP }, - { "udp", NULL, IPPROTO_UDP }, - }; - -/* - * Dummy version of BSD getprotobyname() - */ -struct protoent * -getprotobyname_static (const char *name) -{ - int i; - - for (i = 0 ; i < (sizeof prototab / sizeof prototab[0]) ; i++) { - if (strcmp (name, prototab[i].p_name) == 0) - return (struct protoent *) &prototab[i]; - } - return NULL; -} - -/* - * Dummy version of BSD getprotobynumber() - */ -struct protoent * -getprotobynumber_static (int proto) -{ - int i; - - for (i = 0 ; i < (sizeof prototab / sizeof prototab[0]) ; i++) { - if (proto == prototab[i].p_proto) - return (struct protoent *) &prototab[i]; - } - return NULL; -} diff --git a/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c b/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c deleted file mode 100644 index e6757599ac..0000000000 --- a/cpukit/libnetworking/lib/rtems_bsdnet_ntp.c +++ /dev/null @@ -1,219 +0,0 @@ -#include - -/* - * Synchronize with an NTP server - * - * This program may be distributed and used for any purpose. - * I ask only that you: - * 1. Leave this author information intact. - * 2. Document any changes you make. - * - * W. Eric Norum - * Canadian Light Source - * University of Saskatchewan - * Saskatoon, Saskatchewan, CANADA - * eric@cls.usask.ca - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include /* close */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/* - * RTEMS base: 1988, January 1 - * UNIX base: 1970, January 1 - * NTP base: 1900, January 1 - */ -#define UNIX_BASE_TO_NTP_BASE (uint32_t)(((70UL*365UL)+17UL) * (24UL*60UL*60UL)) - -struct ntpPacket { - struct ntpPacketSmall ntp; - char authenticator[96]; -}; - -static int -processPacket (struct ntpPacketSmall *p, int state, void *unused) -{ - time_t tbuf; - struct tm *lt; - rtems_time_of_day rt; - rtems_interval ticks_per_second; - - if ( state ) - return 0; - - ticks_per_second = rtems_clock_get_ticks_per_second(); - tbuf = ntohl (p->transmit_timestamp.integer) - UNIX_BASE_TO_NTP_BASE - rtems_bsdnet_timeoffset; - lt = gmtime (&tbuf); - rt.year = lt->tm_year + 1900; - rt.month = lt->tm_mon + 1; - rt.day = lt->tm_mday; - rt.hour = lt->tm_hour; - rt.minute = lt->tm_min; - rt.second = lt->tm_sec; - rt.ticks = ntohl (p->transmit_timestamp.fraction) / (ULONG_MAX / ticks_per_second); - if (rt.ticks >= ticks_per_second) - rt.ticks = ticks_per_second - 1; - rtems_clock_set (&rt); - return 0; -} - -static int -getServerTimespec(struct ntpPacketSmall *p, int state, void *usr_data) -{ -struct timespec *ts = usr_data; -unsigned long long tmp; - - if ( 0 == state ) { - ts->tv_sec = ntohl( p->transmit_timestamp.integer ); - ts->tv_sec -= rtems_bsdnet_timeoffset + UNIX_BASE_TO_NTP_BASE; - - tmp = 1000000000 * (unsigned long long)ntohl(p->transmit_timestamp.fraction); - - ts->tv_nsec = (unsigned long) (tmp>>32); - } - return 0; -} - -int rtems_bsdnet_ntp_retry_count = 5; -int rtems_bsdnet_ntp_timeout_secs = 5; -int rtems_bsdnet_ntp_bcast_timeout_secs = 80; - -static int -tryServer (int i, int s, rtems_bsdnet_ntp_callback_t callback, void *usr_data) -{ - int l = 0; - struct timeval tv; - socklen_t farlen; - struct sockaddr_in farAddr; - struct ntpPacketSmall packet; - - if (i < 0) - tv.tv_sec = rtems_bsdnet_ntp_bcast_timeout_secs; - else - tv.tv_sec = rtems_bsdnet_ntp_timeout_secs; - tv.tv_usec = 0; - if (setsockopt (s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv) < 0) { - fprintf (stderr, "rtems_bsdnet_get_ntp() Can't set socket receive timeout: %s\n", strerror (errno)); - close (s); - return -1; - } - if (i >= 0) { - memset (&farAddr, 0, sizeof farAddr); - farAddr.sin_family = AF_INET; - farAddr.sin_port = htons (123); - farAddr.sin_addr = rtems_bsdnet_ntpserver[i]; - memset (&packet, 0, sizeof packet); - packet.li_vn_mode = (3 << 3) | 3; /* NTP version 3, client */ - if ( callback( &packet, 1, usr_data ) ) - return -1; - l = sendto (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, sizeof farAddr); - if (l != sizeof packet) { - fprintf (stderr, "rtems_bsdnet_get_ntp() Can't send: %s\n", strerror (errno)); - return -1; - } - } else { - if ( callback( &packet, -1, usr_data ) ) - return -1; - } - farlen = sizeof farAddr; - i = recvfrom (s, &packet, sizeof packet, 0, (struct sockaddr *)&farAddr, &farlen); - if (i == 0) - fprintf (stderr, "rtems_bsdnet_get_ntp() Unexpected EOF"); - if (i < 0) { - if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) - return -1; - fprintf (stderr, "rtems_bsdnet_get_ntp() Can't receive: %s\n", strerror (errno)); - } - - if ( i >= sizeof packet && - (((packet.li_vn_mode & (0x7 << 3)) == (3 << 3)) || - ((packet.li_vn_mode & (0x7 << 3)) == (4 << 3))) && - ((packet.transmit_timestamp.integer != 0) || (packet.transmit_timestamp.fraction != 0)) && - 0 == callback( &packet, 0 , usr_data) ) - return 0; - - return -1; -} - -int rtems_bsdnet_get_ntp(int sock, rtems_bsdnet_ntp_callback_t callback, void *usr_data) -{ -int s = -1; -int i; -int retry; -struct sockaddr_in myAddr; -int reuseFlag; -int ret; - - if ( !callback ) - callback = getServerTimespec; - - if ( sock < 0 ) { - s = socket (AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - fprintf (stderr, "rtems_bsdnet_get_ntp() Can't create socket: %s\n", strerror (errno)); - return -1; - } - reuseFlag = 1; - if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuseFlag, sizeof reuseFlag) < 0) { - fprintf (stderr, "rtems_bsdnet_get_ntp() Can't set socket reuse: %s\n", strerror (errno)); - close (s); - return -1; - } - memset (&myAddr, 0, sizeof myAddr); - myAddr.sin_family = AF_INET; - myAddr.sin_port = htons (123); - myAddr.sin_addr.s_addr = htonl (INADDR_ANY); - if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0) { - fprintf (stderr, "rtems_bsdnet_get_ntp() Can't bind socket: %s\n", strerror (errno)); - close (s); - return -1; - } - sock = s; - } - ret = -1; - for (retry = 0 ; (ret == -1) && (retry < rtems_bsdnet_ntp_retry_count) ; retry++) { - /* - * If there's no server we just have to wait - * and hope that there's an NTP broadcast - * server out there somewhere. - */ - if (rtems_bsdnet_ntpserver_count <= 0) { - ret = tryServer (-1, sock, callback, usr_data); - } - else { - for (i = 0 ; (ret == -1) && (i < rtems_bsdnet_ntpserver_count) ; i++) { - ret = tryServer (i, sock, callback, usr_data); - } - } - } - if ( s >= 0 ) - close (s); - return ret; -} - -int -rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority) -{ - if (interval != 0) { - fprintf (stderr, "Daemon-mode note yet supported.\n"); - errno = EINVAL; - return -1; - } - return rtems_bsdnet_get_ntp( -1, processPacket, 0); -} diff --git a/cpukit/libnetworking/lib/syslog.c b/cpukit/libnetworking/lib/syslog.c deleted file mode 100644 index 8e167a41de..0000000000 --- a/cpukit/libnetworking/lib/syslog.c +++ /dev/null @@ -1,170 +0,0 @@ -#include - -/* - * RTEMS version of syslog and associated routines - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -static int LogStatus = LOG_CONS; -static const char *LogTag = "syslog"; -static int LogFacility = LOG_USER; -static int LogMask = 0xff; - -static int LogFd = -1; -static rtems_recursive_mutex LogSemaphore = - RTEMS_RECURSIVE_MUTEX_INITIALIZER("syslog"); -extern struct in_addr rtems_bsdnet_log_host_address; - -#define SYSLOG_PORT 514 - -void -syslog (int pri, const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - vsyslog (pri, fmt, ap); - va_end (ap); -} - -/* - * FIXME: Should cbuf be static? It could be if we put the mutex - * around the entire body of this routine. Then we wouldn't - * have to worry about blowing stacks with a local variable - * that large. Could make cbuf bigger, too. - */ -void -vsyslog (int pri, const char *fmt, va_list ap) -{ - int cnt; - char *msgp, cbuf[200]; - int sent; - - if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) { - syslog (LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID, - "syslog: unknown facility/priority: %#x", pri); - pri &= LOG_PRIMASK|LOG_FACMASK; - } - - if (!(LOG_MASK(LOG_PRI(pri)) & LogMask)) - return; - - if ((pri & LOG_FACMASK) == 0) - pri |= LogFacility; - - cnt = snprintf (cbuf, sizeof (cbuf), "<%d>", pri); - msgp = cbuf + (cnt < sizeof (cbuf) ? cnt : sizeof (cbuf) - 1); - if (LogTag && cnt < sizeof (cbuf) - 1) - cnt += snprintf (cbuf + cnt, sizeof (cbuf) - cnt, "%s", LogTag); - if (LogStatus & LOG_PID && cnt < sizeof (cbuf) - 1) { - rtems_id tid; - rtems_task_ident (RTEMS_SELF, 0, &tid); - cnt += snprintf (cbuf + cnt, sizeof (cbuf) - cnt, "[%#lx]", (unsigned long)tid); - } - if (LogTag && cnt < sizeof (cbuf) - 1) - cnt += snprintf (cbuf + cnt, sizeof (cbuf) - cnt, ": "); - cnt += vsnprintf (cbuf + cnt, sizeof (cbuf) - cnt, fmt, ap); - if (cnt > sizeof (cbuf) - 1) - cnt = sizeof (cbuf) - 1; - while (cnt > 0 && cbuf[cnt-1] == '\n') - cbuf[--cnt] = '\0'; - - if (LogStatus & LOG_PERROR) - printf ("%s\n", cbuf); - - /* - * Grab the mutex - */ - sent = 0; - if ((rtems_bsdnet_log_host_address.s_addr != INADDR_ANY) - && (LogFd >= 0)) { - /* - * Set the destination address/port - */ - struct sockaddr_in farAddress; - farAddress.sin_family = AF_INET; - farAddress.sin_port = htons (SYSLOG_PORT); - farAddress.sin_addr = rtems_bsdnet_log_host_address; - memset (farAddress.sin_zero, '\0', sizeof farAddress.sin_zero); - - rtems_recursive_mutex_lock (&LogSemaphore); - /* - * Send the message - */ - if (sendto (LogFd, cbuf, cnt, 0, (struct sockaddr *)&farAddress, sizeof farAddress) >= 0) - sent = 1; - rtems_recursive_mutex_unlock (&LogSemaphore); - } - if (!sent && (LogStatus & LOG_CONS) && !(LogStatus & LOG_PERROR)) - printf ("%s\n", msgp); -} - -void -openlog (const char *ident, int logstat, int logfac) -{ - struct sockaddr_in myAddress; - - if (ident != NULL) - LogTag = ident; - LogStatus = logstat; - if (logfac != 0 && (logfac & ~LOG_FACMASK) == 0) - LogFacility = logfac; - - /* - * Create the socket - */ - if ((LogFd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { - printf ("Can't create syslog socket: %d\n", errno); - return; - } - - /* - * Bind socket to name - */ - myAddress.sin_family = AF_INET; - myAddress.sin_addr.s_addr = INADDR_ANY; - myAddress.sin_port = htons (SYSLOG_PORT);; - memset (myAddress.sin_zero, '\0', sizeof myAddress.sin_zero); - if (bind (LogFd, (struct sockaddr *)&myAddress, sizeof (myAddress)) < 0) { - close (LogFd); - LogFd = -1; - printf ("Can't bind syslog socket: %d\n", errno); - return; - } -} - -void -closelog(void) -{ - if (LogFd >= 0) { - close (LogFd); - LogFd = -1; - } -} - -int -setlogmask (int pmask) -{ - int omask; - - omask = LogMask; - if (pmask != 0) - LogMask = pmask; - return (omask); -} diff --git a/cpukit/libnetworking/libc/base64.c b/cpukit/libnetworking/libc/base64.c deleted file mode 100644 index 7369c36509..0000000000 --- a/cpukit/libnetworking/libc/base64.c +++ /dev/null @@ -1,318 +0,0 @@ -#include - -/* - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Portions Copyright (c) 1995 by International Business Machines, Inc. - * - * International Business Machines, Inc. (hereinafter called IBM) grants - * permission under its copyrights to use, copy, modify, and distribute this - * Software with or without fee, provided that the above copyright notice and - * all paragraphs of this notice appear in all copies, and that the name of IBM - * not be used in connection with the marketing of any product incorporating - * the Software or modifications thereof, without specific, written prior - * permission. - * - * To the extent it has a right to do so, IBM grants an immunity from suit - * under its patents, if any, for the use, sale or manufacture of products to - * the extent that such products are used for performing Domain Name System - * dynamic updates in TCP/IP networks by means of the Software. No immunity is - * granted for any product per se or for any other function of any product. - * - * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, - * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN - * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#define Assert(Cond) if (!(Cond)) abort() - -static const char Base64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static const char Pad64 = '='; - -/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) - The following encoding technique is taken from RFC 1521 by Borenstein - and Freed. It is reproduced here in a slightly edited form for - convenience. - - A 65-character subset of US-ASCII is used, enabling 6 bits to be - represented per printable character. (The extra 65th character, "=", - is used to signify a special processing function.) - - The encoding process represents 24-bit groups of input bits as output - strings of 4 encoded characters. Proceeding from left to right, a - 24-bit input group is formed by concatenating 3 8-bit input groups. - These 24 bits are then treated as 4 concatenated 6-bit groups, each - of which is translated into a single digit in the base64 alphabet. - - Each 6-bit group is used as an index into an array of 64 printable - characters. The character referenced by the index is placed in the - output string. - - Table 1: The Base64 Alphabet - - Value Encoding Value Encoding Value Encoding Value Encoding - 0 A 17 R 34 i 51 z - 1 B 18 S 35 j 52 0 - 2 C 19 T 36 k 53 1 - 3 D 20 U 37 l 54 2 - 4 E 21 V 38 m 55 3 - 5 F 22 W 39 n 56 4 - 6 G 23 X 40 o 57 5 - 7 H 24 Y 41 p 58 6 - 8 I 25 Z 42 q 59 7 - 9 J 26 a 43 r 60 8 - 10 K 27 b 44 s 61 9 - 11 L 28 c 45 t 62 + - 12 M 29 d 46 u 63 / - 13 N 30 e 47 v - 14 O 31 f 48 w (pad) = - 15 P 32 g 49 x - 16 Q 33 h 50 y - - Special processing is performed if fewer than 24 bits are available - at the end of the data being encoded. A full encoding quantum is - always completed at the end of a quantity. When fewer than 24 input - bits are available in an input group, zero bits are added (on the - right) to form an integral number of 6-bit groups. Padding at the - end of the data is performed using the '=' character. - - Since all base64 input is an integral number of octets, only the - ------------------------------------------------- - following cases can arise: - - (1) the final quantum of encoding input is an integral - multiple of 24 bits; here, the final unit of encoded - output will be an integral multiple of 4 characters - with no "=" padding, - (2) the final quantum of encoding input is exactly 8 bits; - here, the final unit of encoded output will be two - characters followed by two "=" padding characters, or - (3) the final quantum of encoding input is exactly 16 bits; - here, the final unit of encoded output will be three - characters followed by one "=" padding character. - */ - -int -b64_ntop(u_char const *src, size_t srclength, char *target, size_t targsize) { - size_t datalength = 0; - u_char input[3]; - u_char output[4]; - size_t i; - - while (2 < srclength) { - input[0] = *src++; - input[1] = *src++; - input[2] = *src++; - srclength -= 3; - - output[0] = input[0] >> 2; - output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); - output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); - output[3] = input[2] & 0x3f; - Assert(output[0] < 64); - Assert(output[1] < 64); - Assert(output[2] < 64); - Assert(output[3] < 64); - - if (datalength + 4 > targsize) - return (-1); - target[datalength++] = Base64[output[0]]; - target[datalength++] = Base64[output[1]]; - target[datalength++] = Base64[output[2]]; - target[datalength++] = Base64[output[3]]; - } - - /* Now we worry about padding. */ - if (0 != srclength) { - /* Get what's left. */ - input[0] = input[1] = input[2] = '\0'; - for (i = 0; i < srclength; i++) - input[i] = *src++; - - output[0] = input[0] >> 2; - output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); - output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); - Assert(output[0] < 64); - Assert(output[1] < 64); - Assert(output[2] < 64); - - if (datalength + 4 > targsize) - return (-1); - target[datalength++] = Base64[output[0]]; - target[datalength++] = Base64[output[1]]; - if (srclength == 1) - target[datalength++] = Pad64; - else - target[datalength++] = Base64[output[2]]; - target[datalength++] = Pad64; - } - if (datalength >= targsize) - return (-1); - target[datalength] = '\0'; /* Returned value doesn't count \0. */ - return (datalength); -} - -/* skips all whitespace anywhere. - converts characters, four at a time, starting at (or after) - src from base - 64 numbers into three 8 bit bytes in the target area. - it returns the number of data bytes stored at the target, or -1 on error. - */ - -int -b64_pton( - char const *src, - u_char *target, - size_t targsize) -{ - int tarindex, state, ch; - char *pos; - - state = 0; - tarindex = 0; - - while ((ch = *src++) != '\0') { - if (isspace(ch)) /* Skip whitespace anywhere. */ - continue; - - if (ch == Pad64) - break; - - pos = strchr(Base64, ch); - if (pos == 0) /* A non-base64 character. */ - return (-1); - - switch (state) { - case 0: - if (target) { - if ((size_t)tarindex >= targsize) - return (-1); - target[tarindex] = (pos - Base64) << 2; - } - state = 1; - break; - case 1: - if (target) { - if ((size_t)tarindex + 1 >= targsize) - return (-1); - target[tarindex] |= (pos - Base64) >> 4; - target[tarindex+1] = ((pos - Base64) & 0x0f) - << 4 ; - } - tarindex++; - state = 2; - break; - case 2: - if (target) { - if ((size_t)tarindex + 1 >= targsize) - return (-1); - target[tarindex] |= (pos - Base64) >> 2; - target[tarindex+1] = ((pos - Base64) & 0x03) - << 6; - } - tarindex++; - state = 3; - break; - case 3: - if (target) { - if ((size_t)tarindex >= targsize) - return (-1); - target[tarindex] |= (pos - Base64); - } - tarindex++; - state = 0; - break; - default: - abort(); - } - } - - /* - * We are done decoding Base-64 chars. Let's see if we ended - * on a byte boundary, and/or with erroneous trailing characters. - */ - - if (ch == Pad64) { /* We got a pad char. */ - ch = *src++; /* Skip it, get next. */ - switch (state) { - case 0: /* Invalid = in first position */ - case 1: /* Invalid = in second position */ - return (-1); - - case 2: /* Valid, means one byte of info */ - /* Skip any number of spaces. */ - for ((void)NULL; ch != '\0'; ch = *src++) - if (!isspace(ch)) - break; - /* Make sure there is another trailing = sign. */ - if (ch != Pad64) - return (-1); - ch = *src++; /* Skip the = */ - /* Fall through to "single trailing =" case. */ - /* FALLTHROUGH */ - - case 3: /* Valid, means two bytes of info */ - /* - * We know this char is an =. Is there anything but - * whitespace after it? - */ - for ((void)NULL; ch != '\0'; ch = *src++) - if (!isspace(ch)) - return (-1); - - /* - * Now make sure for cases 2 and 3 that the "extra" - * bits that slopped past the last full byte were - * zeros. If we don't check them, they become a - * subliminal channel. - */ - if (target && target[tarindex] != 0) - return (-1); - } - } else { - /* - * We ended by seeing the end of the string. Make sure we - * have no partial bytes lying around. - */ - if (state != 0) - return (-1); - } - - return (tarindex); -} diff --git a/cpukit/libnetworking/libc/byteorder.3 b/cpukit/libnetworking/libc/byteorder.3 deleted file mode 100644 index 666521bec3..0000000000 --- a/cpukit/libnetworking/libc/byteorder.3 +++ /dev/null @@ -1,76 +0,0 @@ -.\" Copyright (c) 1983, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)byteorder.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd June 4, 1993 -.Dt BYTEORDER 3 -.Os BSD 4.2 -.Sh NAME -.Nm htonl , -.Nm htons , -.Nm ntohl , -.Nm ntohs -.Nd convert values between host and network byte order -.Sh SYNOPSIS -.Fd #include -.Ft u_long -.Fn htonl "u_long hostlong" -.Ft u_short -.Fn htons "u_short hostshort" -.Ft u_long -.Fn ntohl "u_long netlong" -.Ft u_short -.Fn ntohs "u_short netshort" -.Sh DESCRIPTION -These routines convert 16 and 32 bit quantities between network -byte order and host byte order. -On machines which have a byte order which is the same as the network -order, routines are defined as null macros. -.Pp -These routines are most often used in conjunction with Internet -addresses and ports as returned by -.Xr gethostbyname 3 -and -.Xr getservent 3 . -.Sh SEE ALSO -.Xr gethostbyname 3 , -.Xr getservent 3 -.Sh HISTORY -The -.Nm byteorder -functions appeared in -.Bx 4.2 . -.Sh BUGS -On the -.Tn VAX -bytes are handled backwards from most everyone else in -the world. This is not expected to be fixed in the near future. diff --git a/cpukit/libnetworking/libc/ethers.3 b/cpukit/libnetworking/libc/ethers.3 deleted file mode 100644 index 888054ea49..0000000000 --- a/cpukit/libnetworking/libc/ethers.3 +++ /dev/null @@ -1,192 +0,0 @@ -.\" Copyright (c) 1995 -.\" Bill Paul . All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by Bill Paul. -.\" 4. Neither the name of the author nor the names of any co-contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" -.Dd April 12, 1995 -.Dt ETHERS 3 -.Os FreeBSD 2.1 -.Sh NAME -.Nm ethers , -.Nm ether_line , -.Nm ether_aton , -.Nm ether_ntoa , -.Nm ether_ntohost , -.Nm ether_hostton -.Nd Ethernet address conversion and lookup routines -.Sh SYNOPSIS -.Fd #include -.Fd #include -.Fd #include -.Ft int -.Fn ether_line "char *l" "struct ether_addr *e" "char *hostname" -.Ft struct ether_addr * -.Fn ether_aton "char *a" -.Ft char * -.Fn ether_ntoa "struct ether_addr *n" -.Ft int -.Fn ether_ntohost "char *hostname" "struct ether_addr *e" -.Ft int -.Fn ether_hostton "char *hostname" "struct ether_addr *e" -.Sh DESCRIPTION -These functions operate on ethernet addresses using an -.Ar ether_addr -structure, which is defined in the header file -.Aq Pa netinet/if_ether.h : -.Bd -literal -offset indent -/* - * The number of bytes in an ethernet (MAC) address. - */ -#define ETHER_ADDR_LEN 6 - -/* - * Structure of a 48-bit Ethernet address. - */ -struct ether_addr { - u_char octet[ETHER_ADDR_LEN]; -}; -.Ed -.Pp -The function -.Fn ether_line -scans -.Ar l , -an -.Tn ASCII -string in -.Xr ethers 5 -format and sets -.Ar e -to the ethernet address specified in the string and -.Ar h -to the hostname. This function is used to parse lines from -.Pa /etc/ethers -into their component parts. -.Pp -The -.Fn ether_aton -function converts an -.Tn ASCII -representation of an ethernet address into an -.Ar ether_addr -structure. Likewise, -.Fn ether_ntoa -converts an ethernet address specified as an -.Ar ether_addr -structure into an -.Tn ASCII -string. -.Pp -The -.Fn ether_ntohost -and -.Fn ether_hostton -functions map ethernet addresses to their corresponding hostnames -as specified in the -.Pa /etc/ethers -database. -.Fn ether_ntohost -converts from ethernet address to hostname, and -.Fn ether_hostton -converts from hostname to ethernet address. -.Sh RETURN VALUES -.Fn ether_line -returns zero on success and non-zero if it was unable to parse -any part of the supplied line -.Ar l . -It returns the extracted ethernet address in the supplied -.Ar ether_addr -structure -.Ar e -and the hostname in the supplied string -.Ar h . -.Pp -On success, -.Fn ether_ntoa -returns a pointer to a string containing an -.Tn ASCII -representation of an ethernet address. If it is unable to convert -the supplied -.Ar ether_addr -structure, it returns a -.Dv NULL -pointer. Likewise, -.Fn ether_aton -returns a pointer to an -.Ar ether_addr -structure on success and a -.Dv NULL -pointer on failure. -.Pp -The -.Fn ether_ntohost -and -.Fn ether_hostton -functions both return zero on success or non-zero if they were -unable to find a match in the -.Pa /etc/ethers -database. -.Sh NOTES -The user must insure that the hostname strings passed to the -the -.Fn ether_line , -.Fn ether_ntohost -and -.Fn ether_hostton -functions are large enough to contain the returned hostnames. -.Sh NIS INTERACTION -If the -.Pa /etc/ethers -contains a line with a single + in it, the -.Fn ether_ntohost -and -.Fn ether_hostton -functions will attempt to consult the NIS -.Pa ethers.byname -and -.Pa ethers.byaddr -maps in addition to the data in the -.Pa /etc/ethers -file. -.Sh SEE ALSO -.Xr yp 4 , -.Xr ethers 5 -.Sh BUGS -.Pp -The -.Fn ether_aton -and -.Fn ether_ntoa -functions returns values that are stored in static memory areas -which may be overwritten the next time they are called. -.Sh HISTORY -This particular implementation of the -.Nm ethers -library functions were written for and first appeared in -.Fx 2.1 . diff --git a/cpukit/libnetworking/libc/gethostbydns.c b/cpukit/libnetworking/libc/gethostbydns.c deleted file mode 100644 index 66f24e1cb8..0000000000 --- a/cpukit/libnetworking/libc/gethostbydns.c +++ /dev/null @@ -1,779 +0,0 @@ -#include - -/* - * ++Copyright++ 1985, 1988, 1993 - * - - * Copyright (c) 1985, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#endif -#include -#include -#include -#include -#include -#include - -#include "res_config.h" - -void abort(void); /* to avoid warning */ - -#define SPRINTF(x) ((size_t)sprintf x) - -#define MAXALIASES 35 -#define MAXADDRS 35 - -static const char AskedForGot[] = - "gethostby*.gethostanswer: asked for \"%s\", got \"%s\""; - -static char *h_addr_ptrs[MAXADDRS + 1]; - -static struct hostent host; -static char *host_aliases[MAXALIASES]; -static char hostbuf[8*1024]; -static u_char host_addr[16]; /* IPv4 or IPv6 */ - -#ifdef RESOLVSORT -static void addrsort(char **, int); -#endif - -#if PACKETSZ > 1024 -#define MAXPACKET PACKETSZ -#else -#define MAXPACKET 1024 -#endif - -typedef union { - HEADER hdr; - u_char buf[MAXPACKET]; -} querybuf; - -typedef union { - int32_t al; - char ac; -} align; - -int _dns_ttl_; - -#ifdef DEBUG -static void -debugprintf( - char *msg, - int num) -{ - if (_res.options & RES_DEBUG) { - int save = errno; - - printf(msg, num); - errno = save; - } -} -#else -#define debugprintf(msg, num) /*nada*/ -#endif - -#define BOUNDED_INCR(x) \ - do { \ - cp += x; \ - if (cp > eom) { \ - h_errno = NO_RECOVERY; \ - return (NULL); \ - } \ - } while (0) - -#define BOUNDS_CHECK(ptr, count) \ - do { \ - if ((ptr) + (count) > eom) { \ - h_errno = NO_RECOVERY; \ - return (NULL); \ - } \ - } while (0) - -static struct hostent * -gethostanswer( - const querybuf *answer, - int anslen, - const char *qname, - int qtype) -{ - const HEADER *hp; - const u_char *cp; - int n; - const u_char *eom, *erdata; - char *bp, **ap, **hap; - int type, class, buflen, ancount, qdcount; - int haveanswer, had_error; - int toobig = 0; - char tbuf[MAXDNAME]; - const char *tname; - int (*name_ok)(const char *); - - tname = qname; - host.h_name = NULL; - eom = answer->buf + anslen; - switch (qtype) { - case T_A: - case T_AAAA: - name_ok = res_hnok; - break; - case T_PTR: - name_ok = res_dnok; - break; - default: - h_errno = NO_RECOVERY; - return (NULL); /* XXX should be abort(); */ - } - /* - * find first satisfactory answer - */ - hp = &answer->hdr; - ancount = ntohs(hp->ancount); - qdcount = ntohs(hp->qdcount); - bp = hostbuf; - buflen = sizeof hostbuf; - cp = answer->buf; - BOUNDED_INCR(HFIXEDSZ); - if (qdcount != 1) { - h_errno = NO_RECOVERY; - return (NULL); - } - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !(*name_ok)(bp)) { - h_errno = NO_RECOVERY; - return (NULL); - } - BOUNDED_INCR(n + QFIXEDSZ); - if (qtype == T_A || qtype == T_AAAA) { - /* res_send() has already verified that the query name is the - * same as the one we sent; this just gets the expanded name - * (i.e., with the succeeding search-domain tacked on). - */ - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - h_errno = NO_RECOVERY; - return (NULL); - } - host.h_name = bp; - bp += n; - buflen -= n; - /* The qname can be abbreviated, but h_name is now absolute. */ - qname = host.h_name; - } - ap = host_aliases; - *ap = NULL; - host.h_aliases = host_aliases; - hap = h_addr_ptrs; - *hap = NULL; - host.h_addr_list = h_addr_ptrs; - haveanswer = 0; - had_error = 0; - _dns_ttl_ = -1; - while (ancount-- > 0 && cp < eom && !had_error) { - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !(*name_ok)(bp)) { - had_error++; - continue; - } - cp += n; /* name */ - BOUNDS_CHECK(cp, 3 * INT16SZ + INT32SZ); - type = _getshort(cp); - cp += INT16SZ; /* type */ - class = _getshort(cp); - cp += INT16SZ; /* class */ - if (qtype == T_A && type == T_A) - _dns_ttl_ = _getlong(cp); - cp += INT32SZ; /* TTL */ - n = _getshort(cp); - cp += INT16SZ; /* len */ - BOUNDS_CHECK(cp, n); - erdata = cp + n; - if (class != C_IN) { - /* XXX - debug? syslog? */ - cp += n; - continue; /* XXX - had_error++ ? */ - } - if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME) { - if (ap >= &host_aliases[MAXALIASES-1]) - continue; - n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); - if ((n < 0) || !(*name_ok)(tbuf)) { - had_error++; - continue; - } - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - /* Store alias. */ - *ap++ = bp; - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - bp += n; - buflen -= n; - /* Get canonical name. */ - n = strlen(tbuf) + 1; /* for the \0 */ - if (n > buflen || n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - strcpy(bp, tbuf); - host.h_name = bp; - bp += n; - buflen -= n; - continue; - } - if (qtype == T_PTR && type == T_CNAME) { - n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); - if (n < 0 || !res_dnok(tbuf)) { - had_error++; - continue; - } - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - /* Get canonical name. */ - n = strlen(tbuf) + 1; /* for the \0 */ - if (n > buflen || n >= MAXHOSTNAMELEN) { - had_error++; - continue; - } - strcpy(bp, tbuf); - tname = bp; - bp += n; - buflen -= n; - continue; - } - if (type != qtype) { - syslog(LOG_NOTICE|LOG_AUTH, - "gethostby*.gethostanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class(C_IN), p_type(qtype), - p_type(type)); - cp += n; - continue; /* XXX - had_error++ ? */ - } - switch (type) { - case T_PTR: - if (strcasecmp(tname, bp) != 0) { - syslog(LOG_NOTICE|LOG_AUTH, - AskedForGot, qname, bp); - cp += n; - continue; /* XXX - had_error++ ? */ - } - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !res_hnok(bp)) { - had_error++; - break; - } -#if MULTI_PTRS_ARE_ALIASES - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - if (!haveanswer) - host.h_name = bp; - else if (ap < &host_aliases[MAXALIASES-1]) - *ap++ = bp; - else - n = -1; - if (n != -1) { - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - had_error++; - break; - } - bp += n; - buflen -= n; - } - break; -#else - host.h_name = bp; - if (_res.options & RES_USE_INET6) { - n = strlen(bp) + 1; /* for the \0 */ - if (n >= MAXHOSTNAMELEN) { - had_error++; - break; - } - bp += n; - buflen -= n; - _map_v4v6_hostent(&host, &bp, &buflen); - } - h_errno = NETDB_SUCCESS; - return (&host); -#endif - case T_A: - case T_AAAA: - if (strcasecmp(host.h_name, bp) != 0) { - syslog(LOG_NOTICE|LOG_AUTH, - AskedForGot, host.h_name, bp); - cp += n; - continue; /* XXX - had_error++ ? */ - } - if (n != host.h_length) { - cp += n; - continue; - } - if (!haveanswer) { - register int nn; - - host.h_name = bp; - nn = strlen(bp) + 1; /* for the \0 */ - bp += nn; - buflen -= nn; - } - - bp += sizeof(align) - ((uintptr_t)bp % sizeof(align)); - - if (bp + n >= &hostbuf[sizeof hostbuf]) { - debugprintf("size (%d) too big\n", n); - had_error++; - continue; - } - if (hap >= &h_addr_ptrs[MAXADDRS-1]) { - if (!toobig++) - debugprintf("Too many addresses (%d)\n", - MAXADDRS); - cp += n; - continue; - } - memcpy(*hap++ = bp, cp, n); - bp += n; - buflen -= n; - cp += n; - if (cp != erdata) { - h_errno = NO_RECOVERY; - return (NULL); - } - break; - default: - debugprintf("Impossible condition (type=%d)\n", type); - h_errno = NO_RECOVERY; - return (NULL); - /* BIND has abort() here, too risky on bad data */ - } - if (!had_error) - haveanswer++; - } - if (haveanswer) { - *ap = NULL; - *hap = NULL; -# if defined(RESOLVSORT) - /* - * Note: we sort even if host can take only one address - * in its return structures - should give it the "best" - * address in that case, not some random one - */ - if (_res.nsort && haveanswer > 1 && qtype == T_A) - addrsort(h_addr_ptrs, haveanswer); -# endif /*RESOLVSORT*/ - if (!host.h_name) { - n = strlen(qname) + 1; /* for the \0 */ - if (n > buflen || n >= MAXHOSTNAMELEN) - goto no_recovery; - strcpy(bp, qname); - host.h_name = bp; - bp += n; - buflen -= n; - } - if (_res.options & RES_USE_INET6) - _map_v4v6_hostent(&host, &bp, &buflen); - h_errno = NETDB_SUCCESS; - return (&host); - } - no_recovery: - h_errno = NO_RECOVERY; - return (NULL); -} - -#if 0 -struct hostent * -__dns_getanswer(const char *answer, int anslen, const char *qname, int qtype) -{ - switch(qtype) { - case T_AAAA: - host.h_addrtype = AF_INET6; - host.h_length = IN6ADDRSZ; - break; - case T_A: - default: - host.h_addrtype = AF_INET; - host.h_length = INADDRSZ; - break; - } - - return(gethostanswer((const querybuf *)answer, anslen, qname, qtype)); -} -#endif - -struct hostent * -_gethostbydnsname( - const char *name, - int af) -{ - querybuf buf; - register const char *cp; - char *bp; - int n, size, type, len; - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - - switch (af) { - case AF_INET: - size = INADDRSZ; - type = T_A; - break; - case AF_INET6: - size = IN6ADDRSZ; - type = T_AAAA; - break; - default: - h_errno = NETDB_INTERNAL; - errno = EAFNOSUPPORT; - return (NULL); - } - - host.h_addrtype = af; - host.h_length = size; - - /* - * if there aren't any dots, it could be a user-level alias. - * this is also done in res_query() since we are not the only - * function that looks up host names. - */ - if (!strchr(name, '.') && (cp = __hostalias(name))) - name = cp; - - /* - * disallow names consisting only of digits/dots, unless - * they end in a dot. - */ - if (isdigit((unsigned char)name[0])) - for (cp = name;; ++cp) { - if (!*cp) { - if (*--cp == '.') - break; - /* - * All-numeric, no dot at the end. - * Fake up a hostent as if we'd actually - * done a lookup. - */ - if (inet_pton(af, name, host_addr) <= 0) { - h_errno = HOST_NOT_FOUND; - return (NULL); - } - strncpy(hostbuf, name, MAXDNAME); - hostbuf[MAXDNAME] = '\0'; - bp = hostbuf + MAXDNAME; - len = sizeof hostbuf - MAXDNAME; - host.h_name = hostbuf; - host.h_aliases = host_aliases; - host_aliases[0] = NULL; - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - host.h_addr_list = h_addr_ptrs; - if (_res.options & RES_USE_INET6) - _map_v4v6_hostent(&host, &bp, &len); - h_errno = NETDB_SUCCESS; - return (&host); - } - if (!isdigit((unsigned char)*cp) && *cp != '.') - break; - } - if ((isxdigit((unsigned char)name[0]) && strchr(name, ':') != NULL) || - name[0] == ':') - for (cp = name;; ++cp) { - if (!*cp) { - if (*--cp == '.') - break; - /* - * All-IPv6-legal, no dot at the end. - * Fake up a hostent as if we'd actually - * done a lookup. - */ - if (inet_pton(af, name, host_addr) <= 0) { - h_errno = HOST_NOT_FOUND; - return (NULL); - } - strncpy(hostbuf, name, MAXDNAME); - hostbuf[MAXDNAME] = '\0'; - bp = hostbuf + MAXDNAME; - len = sizeof hostbuf - MAXDNAME; - host.h_name = hostbuf; - host.h_aliases = host_aliases; - host_aliases[0] = NULL; - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - host.h_addr_list = h_addr_ptrs; - h_errno = NETDB_SUCCESS; - return (&host); - } - if (!isxdigit((unsigned char)*cp) && *cp != ':' && *cp != '.') - break; - } - - if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf))) < 0) { - debugprintf("res_search failed (%d)\n", n); - return (NULL); - } - return (gethostanswer(&buf, n, name, type)); -} - -struct hostent * -_gethostbydnsaddr( - const char *addr, /* XXX should have been def'd as u_char! */ - int len, - int af) -{ - const u_char *uaddr = (const u_char *)addr; - static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; - static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; - int n, size; - querybuf buf; - register struct hostent *hp; - char qbuf[MAXDNAME+1], *qp; -#ifdef SUNSECURITY - register struct hostent *rhp; - char **haddr; - u_long old_options; - char hname2[MAXDNAME+1]; -#endif /*SUNSECURITY*/ - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - if (af == AF_INET6 && len == IN6ADDRSZ && - (!bcmp(uaddr, mapped, sizeof mapped) || - !bcmp(uaddr, tunnelled, sizeof tunnelled))) { - /* Unmap. */ - addr += sizeof mapped; - uaddr += sizeof mapped; - af = AF_INET; - len = INADDRSZ; - } - switch (af) { - case AF_INET: - size = INADDRSZ; - break; - case AF_INET6: - size = IN6ADDRSZ; - break; - default: - errno = EAFNOSUPPORT; - h_errno = NETDB_INTERNAL; - return (NULL); - } - if (size != len) { - errno = EINVAL; - h_errno = NETDB_INTERNAL; - return (NULL); - } - switch (af) { - case AF_INET: - (void) sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", - (uaddr[3] & 0xff), - (uaddr[2] & 0xff), - (uaddr[1] & 0xff), - (uaddr[0] & 0xff)); - break; - case AF_INET6: - qp = qbuf; - for (n = IN6ADDRSZ - 1; n >= 0; n--) { - qp += SPRINTF((qp, "%x.%x.", - uaddr[n] & 0xf, - (uaddr[n] >> 4) & 0xf)); - } - strcpy(qp, "ip6.int"); - break; - default: - abort(); - } - n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); - if (n < 0) { - debugprintf("res_query failed (%d)\n", n); - return (NULL); - } - if (!(hp = gethostanswer(&buf, n, qbuf, T_PTR))) - return (NULL); /* h_errno was set by gethostanswer() */ -#ifdef SUNSECURITY - if (af == AF_INET) { - /* - * turn off search as the name should be absolute, - * 'localhost' should be matched by defnames - */ - strncpy(hname2, hp->h_name, MAXDNAME); - hname2[MAXDNAME] = '\0'; - old_options = _res.options; - _res.options &= ~RES_DNSRCH; - _res.options |= RES_DEFNAMES; - if (!(rhp = gethostbyname(hname2))) { - syslog(LOG_NOTICE|LOG_AUTH, - "gethostbyaddr: No A record for %s (verifying [%s])", - hname2, inet_ntoa(*((struct in_addr *)addr))); - _res.options = old_options; - h_errno = HOST_NOT_FOUND; - return (NULL); - } - _res.options = old_options; - for (haddr = rhp->h_addr_list; *haddr; haddr++) - if (!memcmp(*haddr, addr, INADDRSZ)) - break; - if (!*haddr) { - syslog(LOG_NOTICE|LOG_AUTH, - "gethostbyaddr: A record of %s != PTR record [%s]", - hname2, inet_ntoa(*((struct in_addr *)addr))); - h_errno = HOST_NOT_FOUND; - return (NULL); - } - } -#endif /*SUNSECURITY*/ - hp->h_addrtype = af; - hp->h_length = len; - memcpy(host_addr, addr, len); - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - if (af == AF_INET && (_res.options & RES_USE_INET6)) { - _map_v4v6_address((char*)host_addr, (char*)host_addr); - hp->h_addrtype = AF_INET6; - hp->h_length = IN6ADDRSZ; - } - h_errno = NETDB_SUCCESS; - return (hp); -} - -#ifdef RESOLVSORT -static void -addrsort( - char **ap, - int num) -{ - int i, j; - char **p; - short aval[MAXADDRS]; - int needsort = 0; - - p = ap; - for (i = 0; i < num; i++, p++) { - for (j = 0 ; (unsigned)j < _res.nsort; j++) - if (_res.sort_list[j].addr.s_addr == - (((struct in_addr *)(*p))->s_addr & _res.sort_list[j].mask)) - break; - aval[i] = j; - if (needsort == 0 && i > 0 && j < aval[i-1]) - needsort = i; - } - if (!needsort) - return; - - while (needsort < num) { - for (j = needsort - 1; j >= 0; j--) { - if (aval[j] > aval[j+1]) { - char *hp; - - i = aval[j]; - aval[j] = aval[j+1]; - aval[j+1] = i; - - hp = ap[j]; - ap[j] = ap[j+1]; - ap[j+1] = hp; - - } else - break; - } - needsort++; - } -} -#endif - -void -_sethostdnsent(int stayopen) -{ - if ((_res.options & RES_INIT) == 0 && res_init() == -1) - return; - if (stayopen) - _res.options |= RES_STAYOPEN | RES_USEVC; -} - -void -_endhostdnsent(void) -{ - _res.options &= ~(RES_STAYOPEN | RES_USEVC); - res_close(); -} diff --git a/cpukit/libnetworking/libc/gethostbyht.c b/cpukit/libnetworking/libc/gethostbyht.c deleted file mode 100644 index 50f31294a9..0000000000 --- a/cpukit/libnetworking/libc/gethostbyht.c +++ /dev/null @@ -1,349 +0,0 @@ -#include - -/*- - * Copyright (c) 1985, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include /* realloc, malloc, free */ -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#endif -#include /* XXX */ -#include /* XXX */ -#include - -#define MAXALIASES 35 - -static struct hostent host; -static char *host_aliases[MAXALIASES]; -static char hostbuf[BUFSIZ+1]; -static FILE *hostf = NULL; -static u_char host_addr[16]; /* IPv4 or IPv6 */ -static char *h_addr_ptrs[2]; -static int stayopen = 0; - -#ifdef _THREAD_SAFE -static char* hostmap = NULL; -static unsigned int hostlen = 0; -static char *cur; -#endif - -void -_sethosthtent(int f) -{ - if (!hostf) - hostf = fopen(_PATH_HOSTS, "r" ); - else - rewind(hostf); - stayopen = f; -} - -void -_endhosthtent(void) -{ - if (hostf && !stayopen) { - (void) fclose(hostf); - hostf = NULL; - } -} - -struct hostent * -gethostent(void) -{ - char *p; - register char *cp, **q; - int af, len; - - if (!hostf && !(hostf = fopen(_PATH_HOSTS, "r" ))) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - again: - if (!(p = fgets(hostbuf, sizeof hostbuf, hostf))) { - h_errno = HOST_NOT_FOUND; - return (NULL); - } - if (*p == '#') - goto again; - if (!(cp = strpbrk(p, "#\n"))) - goto again; - *cp = '\0'; - if (!(cp = strpbrk(p, " \t"))) - goto again; - *cp++ = '\0'; - if (inet_pton(AF_INET6, p, host_addr) > 0) { - af = AF_INET6; - len = IN6ADDRSZ; - } else if (inet_pton(AF_INET, p, host_addr) > 0) { - if (_res.options & RES_USE_INET6) { - _map_v4v6_address((char*)host_addr, (char*)host_addr); - af = AF_INET6; - len = IN6ADDRSZ; - } else { - af = AF_INET; - len = INADDRSZ; - } - } else { - goto again; - } - h_addr_ptrs[0] = (char *)host_addr; - h_addr_ptrs[1] = NULL; - host.h_addr_list = h_addr_ptrs; - host.h_length = len; - host.h_addrtype = af; - while (*cp == ' ' || *cp == '\t') - cp++; - host.h_name = cp; - q = host.h_aliases = host_aliases; - if ((cp = strpbrk(cp, " \t")) != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &host_aliases[MAXALIASES - 1]) - *q++ = cp; - if ((cp = strpbrk(cp, " \t")) != NULL) - *cp++ = '\0'; - } - *q = NULL; - h_errno = NETDB_SUCCESS; - return (&host); -} - -struct hostent * -_gethostbyhtname( - const char *name, - int af) -{ - register struct hostent *p; - register char **cp; - - sethostent(0); - while ((p = gethostent()) != NULL) { - if (p->h_addrtype != af) - continue; - if (strcasecmp(p->h_name, name) == 0) - break; - for (cp = p->h_aliases; *cp != 0; cp++) - if (strcasecmp(*cp, name) == 0) - goto found; - } -found: - endhostent(); - return (p); -} - -struct hostent * -_gethostbyhtaddr( - const char *addr, - int len, - int af) -{ - register struct hostent *p; - - sethostent(0); - while ((p = gethostent()) != NULL) - if (p->h_addrtype == af && !bcmp(p->h_addr, addr, len)) - break; - endhostent(); - return (p); -} - - -#ifdef _THREAD_SAFE -int -gethostent_r( - struct hostent *pe, - char *buf, - size_t len, - struct hostent **result, - int *h_errnop) -{ - char *dest; - char* last; - char* max=buf+len; - int aliasidx; - int curlen; - int rv; - - if (pe == NULL || buf == NULL || result == NULL || h_errnop == NULL) { - if (h_errnop != NULL) { - *h_errnop = NETDB_INTERNAL; - } - return EINVAL; - } - - *result = NULL; - *h_errnop = NETDB_INTERNAL; - rv = -1; - - if (!hostf) { - rv = ENOENT; - return rv; - } - fseek(hostf,0,SEEK_END); - curlen=ftell(hostf); - fseek(hostf,0,SEEK_SET); - - if (curlen > hostlen) { - if (hostmap) { - hostmap = realloc(hostmap,curlen); - } - else { - hostmap = malloc(curlen); - } - } - hostlen = curlen; - - if (hostmap) { - if (fread(hostmap,hostlen,1,hostf) != hostlen) { - hostmap=0; goto error; - } - cur=hostmap; - } - last=hostmap+hostlen; -again: - if ((size_t)lenh_name=0; - pe->h_aliases=(char**)dest; pe->h_aliases[0]=0; dest+=10*sizeof(char*); - pe->h_addr_list=(char**)dest; dest+=2*sizeof(char**); - if (cur>=last) { - rv = ERANGE; - return rv; - } - if (*cur=='#' || *cur=='\n') goto parseerror; - /* first, the ip number */ - pe->h_name=cur; - while (cur=last) { - rv = ERANGE; - return rv; - } - if (*cur=='\n') goto parseerror; - { - char save=*cur; - *cur=0; - pe->h_addr_list[0]=dest; - pe->h_addr_list[1]=0; - if (max-dest<16) goto nospace; - if (inet_pton(AF_INET6,pe->h_name,dest)>0) { - pe->h_addrtype=AF_INET6; - pe->h_length=16; - dest+=16; - } else if (inet_pton(AF_INET,pe->h_name,dest)>0) { - pe->h_addrtype=AF_INET; - pe->h_length=4; - dest+=4; - } else { - *cur=save; - goto parseerror; - } - *cur=save; - } - ++cur; - /* now the aliases */ - for (aliasidx=0;aliasidx<9;++aliasidx) { - while (curh_aliases[aliasidx]=cur; - while (curh_aliases[aliasidx]; - int len=cur-from; - if (max-desth_aliases[aliasidx]=dest; - memmove(dest,from,(size_t)(cur-from)); - dest+=len; - *dest=0; ++dest; - } - if (*cur=='\n') { ++cur; ++aliasidx; break; } - if (cur>=last || !isblank((unsigned char)*cur)) break; - cur++; - } - pe->h_aliases[aliasidx]=0; - pe->h_name=pe->h_aliases[0]; - pe->h_aliases++; - *result = pe; - *h_errnop = 0; - rv = 0; - return rv; -parseerror: - while (cur -.Vt extern int h_errno; -.Ft struct hostent * -.Fn gethostbyname "const char *name" -.Ft struct hostent * -.Fn gethostbyname2 "const char *name" "int af" -.Ft struct hostent * -.Fn gethostbyaddr "const char *addr" "int len" "int type" -.Ft struct hostent * -.Fn gethostent void -.Ft void -.Fn sethostent "int stayopen" -.Ft void -.Fn endhostent void -.Ft void -.Fn herror "const char *string" -.Ft const char * -.Fn hstrerror "int err" -.Sh DESCRIPTION -The -.Fn gethostbyname , -.Fn gethostbyname2 -and -.Fn gethostbyaddr -functions -each return a pointer to an object with the -following structure describing an internet host -referenced by name or by address, respectively. -This structure contains either the information obtained from the name server, -.Xr named 8 , -or broken-out fields from a line in -.Pa /etc/hosts . -If the local name server is not running these routines do a lookup in -.Pa /etc/hosts . -.Bd -literal -struct hostent { - char *h_name; /* official name of host */ - char **h_aliases; /* alias list */ - int h_addrtype; /* host address type */ - int h_length; /* length of address */ - char **h_addr_list; /* list of addresses from name server */ -}; -#define h_addr h_addr_list[0] /* address, for backward compatibility */ -.Ed -.Pp -The members of this structure are: -.Bl -tag -width h_addr_list -.It Fa h_name -Official name of the host. -.It Fa h_aliases -A NULL-terminated array of alternate names for the host. -.It Fa h_addrtype -The type of address being returned; usually -.Dv AF_INET . -.It Fa h_length -The length, in bytes, of the address. -.It Fa h_addr_list -A NULL-terminated array of network addresses for the host. -Host addresses are returned in network byte order. -.It Fa h_addr -The first address in -.Fa h_addr_list ; -this is for backward compatibility. -.El -.Pp -When using the nameserver, -.Fn gethostbyname -and -.Fn gethostbyname -will search for the named host in the current domain and its parents -unless the name ends in a dot. -If the name contains no dot, and if the environment variable -.Dq Ev HOSTALIASES -contains the name of an alias file, the alias file will first be searched -for an alias matching the input name. -See -.Xr hostname 7 -for the domain search procedure and the alias file format. -.Pp -The -.Fn gethostbyname2 -function is an evolution of -.Fn gethostbyname -which is intended to allow lookups in address families other than -.Dv AF_INET , -for example -.Dv AF_INET6 . -Currently the -.Fa af -argument must be specified as -.Dv AF_INET -else the function will return -.Dv NULL -after having set -.Va h_errno -to -.Dv NETDB_INTERNAL -.Pp -The -.Fn sethostent -function -may be used to request the use of a connected -.Tn TCP -socket for queries. -If the -.Fa stayopen -flag is non-zero, -this sets the option to send all queries to the name server using -.Tn TCP -and to retain the connection after each call to -.Fn gethostbyname , -.Fn gethostbyname2 -or -.Fn gethostbyaddr . -Otherwise, queries are performed using -.Tn UDP -datagrams. -.Pp -The -.Fn endhostent -function -closes the -.Tn TCP -connection. -.Pp -The -.Fn herror -function writes a message to the diagnostic output consisting of the -string parameter -.Fa s , -the constant string ": ", and a message corresponding to the value of -.Va h_errno . -.Pp -The -.Fn hstrerror -function returns a string which is the message text corresponding to the -value of the -.Fa err -parameter. -.Sh FILES -.Bl -tag -width /etc/resolv.conf -compact -.It Pa /etc/hosts -.It Pa /etc/host.conf -.It Pa /etc/resolv.conf -.El -.Sh DIAGNOSTICS -Error return status from -.Fn gethostbyname , -.Fn gethostbyname2 -and -.Fn gethostbyaddr -is indicated by return of a null pointer. -The external integer -.Va h_errno -may then be checked to see whether this is a temporary failure -or an invalid or unknown host. -The routine -.Fn herror -can be used to print an error message describing the failure. -If its argument -.Fa string -is -.Pf non Dv -NULL , -it is printed, followed by a colon and a space. -The error message is printed with a trailing newline. -.Pp -The variable -.Va h_errno -can have the following values: -.Bl -tag -width HOST_NOT_FOUND -.It Dv HOST_NOT_FOUND -No such host is known. -.It Dv TRY_AGAIN -This is usually a temporary error -and means that the local server did not receive -a response from an authoritative server. -A retry at some later time may succeed. -.It Dv NO_RECOVERY -Some unexpected server failure was encountered. -This is a non-recoverable error. -.It Dv NO_DATA -The requested name is valid but does not have an IP address; -this is not a temporary error. -This means that the name is known to the name server but there is no address -associated with this name. -Another type of request to the name server using this domain name -will result in an answer; -for example, a mail-forwarder may be registered for this domain. -.El -.Sh SEE ALSO -.Xr resolver 3 , -.Xr hosts 5 , -.Xr hostname 7 , -.Xr named 8 -.Sh CAVEAT -The -.Fn gethostent -function -is defined, and -.Fn sethostent -and -.Fn endhostent -are redefined, -when -.Xr libc 3 -is built to use only the routines to lookup in -.Pa /etc/hosts -and not the name server. -.Pp -The -.Fn gethostent -function -reads the next line of -.Pa /etc/hosts , -opening the file if necessary. -.Pp -The -.Fn sethostent -function -opens and/or rewinds the file -.Pa /etc/hosts . -If the -.Fa stayopen -argument is non-zero, -the file will not be closed after each call to -.Fn gethostbyname , -.Fn gethostbyname2 -or -.Fn gethostbyaddr . -.Pp -The -.Fn endhostent -function -closes the file. -.Sh HISTORY -The -.Fn herror -function appeared in -.Bx 4.3 . -The -.Fn endhostent , -.Fn gethostbyaddr , -.Fn gethostbyname , -.Fn gethostent , -and -.Fn sethostent -functions appeared in -.Bx 4.2 . -The -.Fn gethostbyname2 -function first appeared in bind-4.9.4. -.Sh BUGS -These functions use static data storage; -if the data is needed for future use, it should be -copied before any subsequent calls overwrite it. -Only the Internet -address format is currently understood. diff --git a/cpukit/libnetworking/libc/gethostbynis.c b/cpukit/libnetworking/libc/gethostbynis.c deleted file mode 100644 index 11cb020543..0000000000 --- a/cpukit/libnetworking/libc/gethostbynis.c +++ /dev/null @@ -1,144 +0,0 @@ -#include - -/*- - * Copyright (c) 1994, Garrett Wollman - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef YP -#include -#include -#include -#endif - -#define MAXALIASES 35 -#define MAXADDRS 35 - -#ifdef YP -static char *host_aliases[MAXALIASES]; -static char hostaddr[MAXADDRS]; -static char *host_addrs[2]; -#endif /* YP */ - -static struct hostent * -_gethostbynis( - const char *name, - char *map, - int af) -{ -#ifdef YP - register char *cp, **q; - char *result; - int resultlen; - static struct hostent h; - static char *domain = (char *)NULL; - static char ypbuf[YPMAXRECORD + 2]; - - switch(af) { - case AF_INET: - break; - default: - case AF_INET6: - errno = EAFNOSUPPORT; - return NULL; - } - - if (domain == (char *)NULL) - if (yp_get_default_domain (&domain)) - return ((struct hostent *)NULL); - - if (yp_match(domain, map, name, strlen(name), &result, &resultlen)) - return ((struct hostent *)NULL); - - /* avoid potential memory leak */ - bcopy((char *)result, (char *)&ypbuf, resultlen); - ypbuf[resultlen] = '\0'; - free(result); - result = (char *)&ypbuf; - - if ((cp = index(result, '\n'))) - *cp = '\0'; - - cp = strpbrk(result, " \t"); - *cp++ = '\0'; - h.h_addr_list = host_addrs; - h.h_addr = hostaddr; - *((u_long *)h.h_addr) = inet_addr(result); - h.h_length = sizeof(u_long); - h.h_addrtype = AF_INET; - while (*cp == ' ' || *cp == '\t') - cp++; - h.h_name = cp; - q = h.h_aliases = host_aliases; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &host_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - *q = NULL; - return (&h); -#else - return (NULL); -#endif /* YP */ -} - -struct hostent * -_gethostbynisname( - const char *name, - int af) -{ - return _gethostbynis(name, "hosts.byname", af); -} - -struct hostent * -_gethostbynisaddr( - const char *addr, - int len, - int af) -{ - return _gethostbynis(inet_ntoa(*(struct in_addr *)addr),"hosts.byaddr", af); -} diff --git a/cpukit/libnetworking/libc/gethostnamadr.c b/cpukit/libnetworking/libc/gethostnamadr.c deleted file mode 100644 index dfb760a4d5..0000000000 --- a/cpukit/libnetworking/libc/gethostnamadr.c +++ /dev/null @@ -1,447 +0,0 @@ -#include - -/*- - * Copyright (c) 1994, Garrett Wollman - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#endif -#include /* XXX hack for _res */ -#include /* XXX hack for _res */ - -#define _PATH_HOSTCONF "/etc/host.conf" - -enum service_type { - SERVICE_NONE = 0, - SERVICE_BIND, - SERVICE_HOSTS, - SERVICE_NIS }; -#define SERVICE_MAX SERVICE_NIS - -static struct { - const char *name; - enum service_type type; -} service_names[] = { - { "hosts", SERVICE_HOSTS }, - { "/etc/hosts", SERVICE_HOSTS }, - { "hosttable", SERVICE_HOSTS }, - { "htable", SERVICE_HOSTS }, - { "bind", SERVICE_BIND }, - { "dns", SERVICE_BIND }, - { "domain", SERVICE_BIND }, - { "yp", SERVICE_NIS }, - { "yellowpages", SERVICE_NIS }, - { "nis", SERVICE_NIS }, - { 0, SERVICE_NONE } -}; - -static enum service_type service_order[SERVICE_MAX + 1]; -static int service_done = 0; - -static enum service_type -get_service_name(const char *name) { - int i; - for(i = 0; service_names[i].type != SERVICE_NONE; i++) { - if(!strcasecmp(name, service_names[i].name)) { - return service_names[i].type; - } - } - return SERVICE_NONE; -} - -static void -init_services(void) -{ - char *cp, *p, buf[BUFSIZ]; - register int cc = 0; - FILE *fd; - - if ((fd = (FILE *)fopen(_PATH_HOSTCONF, "r")) == NULL) { - /* make some assumptions */ - service_order[0] = SERVICE_BIND; - service_order[1] = SERVICE_HOSTS; - service_order[2] = SERVICE_NONE; - } else { - while (fgets(buf, BUFSIZ, fd) != NULL && cc < SERVICE_MAX) { - if(buf[0] == '#') - continue; - - p = buf; - while ((cp = strsep(&p, "\n \t,:;")) != NULL && *cp == '\0') - ; - if (cp == NULL) - continue; - do { - if (isalpha((unsigned char)cp[0])) { - service_order[cc] = get_service_name(cp); - if(service_order[cc] != SERVICE_NONE) - cc++; - } - while ((cp = strsep(&p, "\n \t,:;")) != NULL && *cp == '\0') - ; - } while(cp != NULL && cc < SERVICE_MAX); - } - service_order[cc] = SERVICE_NONE; - fclose(fd); - } - service_done = 1; -} - -struct hostent * -gethostbyname(const char *name) -{ - struct hostent *hp; - - if (_res.options & RES_USE_INET6) { /* XXX */ - hp = gethostbyname2(name, AF_INET6); /* XXX */ - if (hp) /* XXX */ - return (hp); /* XXX */ - } /* XXX */ - return (gethostbyname2(name, AF_INET)); -} - -struct hostent * -gethostbyname2(const char *name, int type) -{ - struct hostent *hp = 0; - int nserv = 0; - - if (!service_done) - init_services(); - - while (!hp) { - switch (service_order[nserv]) { - case SERVICE_NONE: - return NULL; - case SERVICE_HOSTS: - hp = _gethostbyhtname(name, type); - break; - case SERVICE_BIND: - hp = _gethostbydnsname(name, type); - break; - case SERVICE_NIS: - hp = _gethostbynisname(name, type); - break; - } - nserv++; - } - return hp; -} - -int gethostbyaddr_r(const void *addr, socklen_t len, int type, - struct hostent *ret, char *buf, size_t buflen, - struct hostent **result, int *h_errnop) -{ - #warning "implement a proper gethostbyaddr_r" - - *result = gethostbyaddr( addr, len, type ); - if ( *result ) - return 0; - return -1; -} - -struct hostent * -gethostbyaddr(const void *addr, socklen_t len, int type) -{ - struct hostent *hp = 0; - int nserv = 0; - - if (!service_done) - init_services(); - - while (!hp) { - switch (service_order[nserv]) { - case SERVICE_NONE: - return 0; - case SERVICE_HOSTS: - hp = _gethostbyhtaddr(addr, len, type); - break; - case SERVICE_BIND: - hp = _gethostbydnsaddr(addr, len, type); - break; - case SERVICE_NIS: - hp = _gethostbynisaddr(addr, len, type); - break; - } - nserv++; - } - return hp; -} - -void -sethostent(int stayopen) -{ - _sethosthtent(stayopen); - _sethostdnsent(stayopen); -} - -void -endhostent(void) -{ - _endhosthtent(); - _endhostdnsent(); -} - -#ifdef _THREAD_SAFE - -/* return length of decoded data or -1 */ -static int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest, - unsigned int maxlen,unsigned char* behindpacket) { - unsigned char *tmp; - unsigned char *max=dest+maxlen; - unsigned char *after=packet+offset; - int ok=0; - for (tmp=after; maxlen>0&&*tmp; ) { - if (tmp>=behindpacket) return -1; - if ((*tmp>>6)==3) { /* goofy DNS decompression */ - unsigned int ofs=((unsigned int)(*tmp&0x3f)<<8)|*(tmp+1); - if (ofs>=(unsigned int)offset) return -1; /* RFC1035: "pointer to a _prior_ occurrance" */ - if (aftermax) return -1; - if (tmp+*tmp+1>=behindpacket) return -1; - for (duh=*tmp; duh>0; --duh) - *dest++=*++tmp; - *dest++='.'; ok=1; - ++tmp; - if (tmp>after) { after=tmp; if (!*tmp) ++after; } - } - } - if (ok) --dest; - *dest=0; - return after-packet; -} - -static int __dns_gethostbyx_r( - const char* name, - struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, - int *h_errnop, - int lookfor) -{ - - int names,ips; - unsigned char *cur; - unsigned char *max; - unsigned char inpkg[1500]; - char* tmp; - int size; - - if (lookfor==1) { - result->h_addrtype=AF_INET; - result->h_length=4; - } else { - result->h_addrtype=AF_INET6; - result->h_length=16; - } - result->h_aliases=(char**)(buf+8*sizeof(char*)); - result->h_addr_list=(char**)buf; - result->h_aliases[0]=0; - - cur=(unsigned char*)buf+16*sizeof(char*); - max=(unsigned char*)buf+buflen; - names=ips=0; - - if ((size=res_query(name,C_IN,lookfor,inpkg,512))<0) { -invalidpacket: - *h_errnop=HOST_NOT_FOUND; - return -1; - } - { - tmp=(char*)inpkg+12; - { - char Name[257]; - unsigned short q=((unsigned short)inpkg[4]<<8)+inpkg[5]; - while (q>0) { - if (tmp>(char*)inpkg+size) goto invalidpacket; - while (*tmp) { tmp+=*tmp+1; if (tmp>(char*)inpkg+size) goto invalidpacket; } - tmp+=5; - --q; - } - if (tmp>(char*)inpkg+size) goto invalidpacket; - q=((unsigned short)inpkg[6]<<8)+inpkg[7]; - if (q<1) goto nodata; - while (q>0) { - int decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),(unsigned char*)Name,256,inpkg+size); - if (decofs<0) break; - tmp=(char*)inpkg+decofs; - --q; - if (tmp[0]!=0 || tmp[1]!=lookfor || /* TYPE != A */ - tmp[2]!=0 || tmp[3]!=1) { /* CLASS != IN */ - if (tmp[1]==5) { /* CNAME */ - tmp+=10; - decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),(unsigned char*)Name,256,inpkg+size); - if (decofs<0) break; - tmp=(char*)inpkg+decofs; - } else - break; - continue; - } - tmp+=10; /* skip type, class, TTL and length */ - { - int slen; - if (lookfor==1 || lookfor==28) /* A or AAAA*/ { - slen=strlen(Name); - if (cur+slen+8+(lookfor==28?12:0)>=max) { *h_errnop=NO_RECOVERY; return -1; } - } else if (lookfor==12) /* PTR */ { - decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),(unsigned char*)Name,256,inpkg+size); - if (decofs<0) break; - tmp=(char*)inpkg+decofs; - slen=strlen(Name); - } else - slen=strlen(Name); - strcpy((char*)cur,Name); - if (names==0) - result->h_name=(char*)cur; - else - result->h_aliases[names-1]=(char*)cur; - result->h_aliases[names]=0; - if (names<8) ++names; -/* cur+=slen+1; */ - cur+=(slen|3)+1; - result->h_addr_list[ips++] = (char*)cur; - if (lookfor==1) /* A */ { - *(int*)cur=*(int*)tmp; - cur+=4; - result->h_addr_list[ips]=0; - } else if (lookfor==28) /* AAAA */ { - { - int k; - for (k=0; k<16; ++k) cur[k]=tmp[k]; - } - cur+=16; - result->h_addr_list[ips]=0; - } - } -/* puts(Name); */ - } - } - } - if (!names) { -nodata: - *h_errnop=NO_DATA; - return -1; - } - *h_errnop=0; - *RESULT=result; - return 0; -} - - - - -int gethostbyname_r(const char* name, - struct hostent* result, - char *buf, - size_t buflen, - struct hostent **RESULT, - int *h_errnop) -{ - uintptr_t current = (uintptr_t) buf; - uintptr_t end = current + buflen; - size_t L=strlen(name); - - *RESULT = NULL; - *h_errnop = 0; - - result->h_name = (char *) current; - current += L + 1; - if (current > end) { *h_errnop = ERANGE; return 1; } - strcpy(result->h_name, name); - - current += sizeof(char **); - current -= current & (sizeof(char **) - 1); - result->h_addr_list = (char **) current; - current += 2 * sizeof(char **); - result->h_aliases = (char **) current; - current += sizeof(char **); - if (current > end) { *h_errnop = ERANGE; return 1; } - result->h_addr_list [0]= (char *) current; - current += 16; - result->h_addr_list [1] = NULL; - result->h_aliases [0] = NULL; - if (current > end) { *h_errnop = ERANGE; return 1; } - if (inet_pton(AF_INET,name,result->h_addr_list[0])) { - result->h_addrtype=AF_INET; - result->h_length=4; - *RESULT=result; - return 0; - } else if (inet_pton(AF_INET6,name,result->h_addr_list[0])) { - result->h_addrtype=AF_INET6; - result->h_length=16; - *RESULT=result; - return 0; - } - - - { - struct hostent* r; - struct hostent* he_buf = (struct hostent *)buf; - char *work_buf = buf + sizeof(struct hostent); - size_t remain_len = buflen - sizeof(struct hostent); - int he_errno; - - sethostent(0); - while (gethostent_r(he_buf, work_buf, remain_len, &r, &he_errno) == 0) { - int i; - if (r->h_addrtype==AF_INET && !strcasecmp(r->h_name,name)) { /* found it! */ -found: - memmove(result,r,sizeof(struct hostent)); - *RESULT=result; - endhostent(); - return 0; - } - for (i=0; i<16; ++i) { - if (r->h_aliases[i]) { - if (!strcasecmp(r->h_aliases[i],name)) goto found; - } else break; - } - } - endhostent(); - } - - return __dns_gethostbyx_r(name,result,buf+L,buflen-L,RESULT,h_errnop,1); -} - -#endif - diff --git a/cpukit/libnetworking/libc/getifaddrs.c b/cpukit/libnetworking/libc/getifaddrs.c deleted file mode 100644 index 354b3f2e9d..0000000000 --- a/cpukit/libnetworking/libc/getifaddrs.c +++ /dev/null @@ -1,421 +0,0 @@ -#include - -/* $KAME: getifaddrs.c,v 1.9 2001/08/20 02:31:20 itojun Exp $ */ - -/* - * Copyright (c) 1995, 1999 - * Berkeley Software Design, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * BSDI getifaddrs.c,v 2.12 2000/02/23 14:51:59 dab Exp - */ -/* - * NOTE: SIOCGIFCONF case is not LP64 friendly. it also does not perform - * try-and-error for region size. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include -#include -#include -#ifdef NET_RT_IFLIST -#include -#include -#include -#include -#endif - -#include -#include -#include -#include - -#if !defined(AF_LINK) -#define SA_LEN(sa) sizeof(struct sockaddr) -#endif - -#if !defined(SA_LEN) -#define SA_LEN(sa) (sa)->sa_len -#endif - -#define SALIGN (sizeof(long) - 1) -#define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : (SALIGN + 1)) - -#ifndef ALIGNBYTES -/* - * On systems with a routing socket, ALIGNBYTES should match the value - * that the kernel uses when building the messages. - */ -#define ALIGNBYTES XXX -#endif -#ifndef ALIGN -#define ALIGN(p) (((u_long)(p) + ALIGNBYTES) &~ ALIGNBYTES) -#endif - -#if _BSDI_VERSION >= 199701 -#define HAVE_IFM_DATA -#endif - -#if _BSDI_VERSION >= 199802 -/* ifam_data is very specific to recent versions of bsdi */ -#define HAVE_IFAM_DATA -#endif - -#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) -#define HAVE_IFM_DATA -#endif - -#define MAX_SYSCTL_TRY 5 - -int -getifaddrs(struct ifaddrs **pif) -{ - int icnt = 1; - int dcnt = 0; - int ncnt = 0; -#ifdef NET_RT_IFLIST - int ntry = 0; - int mib[6]; - size_t needed; - char *buf; - char *next; - struct ifaddrs *cif = 0; - char *p, *p0; - struct rt_msghdr *rtm; - struct if_msghdr *ifm; - struct ifa_msghdr *ifam; - struct sockaddr_dl *dl; - struct sockaddr *sa; - struct ifaddrs *ifa, *ift; - u_short idx = 0; -#else /* NET_RT_IFLIST */ - char buf[1024]; - int m, sock; - struct ifconf ifc; - struct ifreq *ifr; - struct ifreq *lifr; -#endif /* NET_RT_IFLIST */ - int i; - size_t len, alen; - char *data; - char *names; - -#ifdef NET_RT_IFLIST - mib[0] = CTL_NET; - mib[1] = PF_ROUTE; - mib[2] = 0; /* protocol */ - mib[3] = 0; /* wildcard address family */ - mib[4] = NET_RT_IFLIST; - mib[5] = 0; /* no flags */ - do { - /* - * We'll try to get addresses several times in case that - * the number of addresses is unexpectedly increased during - * the two sysctl calls. This should rarely happen, but we'll - * try to do our best for applications that assume success of - * this library (which should usually be the case). - * Portability note: since FreeBSD does not add margin of - * memory at the first sysctl, the possibility of failure on - * the second sysctl call is a bit higher. - */ - - if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) - return (-1); - if ((buf = malloc(needed)) == NULL) - return (-1); - if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { - if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) { - free(buf); - return (-1); - } - free(buf); - buf = NULL; - } - } while (buf == NULL); - - for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { - rtm = (struct rt_msghdr *)(void *)next; - if (rtm->rtm_version != RTM_VERSION) - continue; - switch (rtm->rtm_type) { - case RTM_IFINFO: - ifm = (struct if_msghdr *)(void *)rtm; - if (ifm->ifm_addrs & RTA_IFP) { - idx = ifm->ifm_index; - ++icnt; - dl = (struct sockaddr_dl *)(void *)(ifm + 1); - dcnt += SA_RLEN((struct sockaddr *)(void*)dl) + - ALIGNBYTES; -#ifdef HAVE_IFM_DATA - dcnt += sizeof(ifm->ifm_data); -#endif /* HAVE_IFM_DATA */ - ncnt += dl->sdl_nlen + 1; - } else - idx = 0; - break; - - case RTM_NEWADDR: - ifam = (struct ifa_msghdr *)(void *)rtm; - if (idx && ifam->ifam_index != idx) - abort(); /* this cannot happen */ - -#define RTA_MASKS (RTA_NETMASK | RTA_IFA | RTA_BRD) - if (idx == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0) - break; - p = (char *)(void *)(ifam + 1); - ++icnt; -#ifdef HAVE_IFAM_DATA - dcnt += sizeof(ifam->ifam_data) + ALIGNBYTES; -#endif /* HAVE_IFAM_DATA */ - /* Scan to look for length of address */ - alen = 0; - for (p0 = p, i = 0; i < RTAX_MAX; i++) { - if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) - == 0) - continue; - sa = (struct sockaddr *)(void *)p; - len = SA_RLEN(sa); - if (i == RTAX_IFA) { - alen = len; - break; - } - p += len; - } - for (p = p0, i = 0; i < RTAX_MAX; i++) { - if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) - == 0) - continue; - sa = (struct sockaddr *)(void *)p; - len = SA_RLEN(sa); - if (i == RTAX_NETMASK && SA_LEN(sa) == 0) - dcnt += alen; - else - dcnt += len; - p += len; - } - break; - } - } -#else /* NET_RT_IFLIST */ - ifc.ifc_buf = buf; - ifc.ifc_len = sizeof(buf); - - if ((sock = _socket(AF_INET, SOCK_STREAM, 0)) < 0) - return (-1); - i = _ioctl(sock, SIOCGIFCONF, (char *)&ifc); - _close(sock); - if (i < 0) - return (-1); - - ifr = ifc.ifc_req; - lifr = (struct ifreq *)&ifc.ifc_buf[ifc.ifc_len]; - - while (ifr < lifr) { - struct sockaddr *sa; - - sa = &ifr->ifr_addr; - ++icnt; - dcnt += SA_RLEN(sa); - ncnt += sizeof(ifr->ifr_name) + 1; - - if (SA_LEN(sa) < sizeof(*sa)) - ifr = (struct ifreq *)(((char *)sa) + sizeof(*sa)); - else - ifr = (struct ifreq *)(((char *)sa) + SA_LEN(sa)); - } -#endif /* NET_RT_IFLIST */ - - if (icnt + dcnt + ncnt == 1) { - *pif = NULL; - free(buf); - return (0); - } - data = malloc(sizeof(struct ifaddrs) * icnt + dcnt + ncnt); - if (data == NULL) { - free(buf); - return(-1); - } - - ifa = (struct ifaddrs *)(void *)data; - data += sizeof(struct ifaddrs) * icnt; - names = data + dcnt; - - memset(ifa, 0, sizeof(struct ifaddrs) * icnt); - ift = ifa; - -#ifdef NET_RT_IFLIST - idx = 0; - for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { - rtm = (struct rt_msghdr *)(void *)next; - if (rtm->rtm_version != RTM_VERSION) - continue; - switch (rtm->rtm_type) { - case RTM_IFINFO: - ifm = (struct if_msghdr *)(void *)rtm; - if (ifm->ifm_addrs & RTA_IFP) { - idx = ifm->ifm_index; - dl = (struct sockaddr_dl *)(void *)(ifm + 1); - - cif = ift; - ift->ifa_name = names; - ift->ifa_flags = (int)ifm->ifm_flags; - memcpy(names, dl->sdl_data, - (size_t)dl->sdl_nlen); - names[dl->sdl_nlen] = 0; - names += dl->sdl_nlen + 1; - - ift->ifa_addr = (struct sockaddr *)(void *)data; - memcpy(data, dl, - (size_t)SA_LEN((struct sockaddr *) - (void *)dl)); - data += SA_RLEN((struct sockaddr *)(void *)dl); - -#ifdef HAVE_IFM_DATA - /* ifm_data needs to be aligned */ - ift->ifa_data = data = (void *)ALIGN(data); - memcpy(data, &ifm->ifm_data, sizeof(ifm->ifm_data)); - data += sizeof(ifm->ifm_data); -#else /* HAVE_IFM_DATA */ - ift->ifa_data = NULL; -#endif /* HAVE_IFM_DATA */ - - ift = (ift->ifa_next = ift + 1); - } else - idx = 0; - break; - - case RTM_NEWADDR: - ifam = (struct ifa_msghdr *)(void *)rtm; - if (idx && ifam->ifam_index != idx) - abort(); /* this cannot happen */ - - if (idx == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0) - break; - ift->ifa_name = cif->ifa_name; - ift->ifa_flags = cif->ifa_flags; - ift->ifa_data = NULL; - p = (char *)(void *)(ifam + 1); - /* Scan to look for length of address */ - alen = 0; - for (p0 = p, i = 0; i < RTAX_MAX; i++) { - if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) - == 0) - continue; - sa = (struct sockaddr *)(void *)p; - len = SA_RLEN(sa); - if (i == RTAX_IFA) { - alen = len; - break; - } - p += len; - } - for (p = p0, i = 0; i < RTAX_MAX; i++) { - if ((RTA_MASKS & ifam->ifam_addrs & (1 << i)) - == 0) - continue; - sa = (struct sockaddr *)(void *)p; - len = SA_RLEN(sa); - switch (i) { - case RTAX_IFA: - ift->ifa_addr = - (struct sockaddr *)(void *)data; - memcpy(data, p, len); - data += len; - break; - - case RTAX_NETMASK: - ift->ifa_netmask = - (struct sockaddr *)(void *)data; - if (SA_LEN(sa) == 0) { - memset(data, 0, alen); - data += alen; - break; - } - memcpy(data, p, len); - data += len; - break; - - case RTAX_BRD: - ift->ifa_broadaddr = - (struct sockaddr *)(void *)data; - memcpy(data, p, len); - data += len; - break; - } - p += len; - } - -#ifdef HAVE_IFAM_DATA - /* ifam_data needs to be aligned */ - ift->ifa_data = data = (void *)ALIGN(data); - memcpy(data, &ifam->ifam_data, sizeof(ifam->ifam_data)); - data += sizeof(ifam->ifam_data); -#endif /* HAVE_IFAM_DATA */ - - ift = (ift->ifa_next = ift + 1); - break; - } - } - - free(buf); -#else /* NET_RT_IFLIST */ - ifr = ifc.ifc_req; - lifr = (struct ifreq *)&ifc.ifc_buf[ifc.ifc_len]; - - while (ifr < lifr) { - struct sockaddr *sa; - - ift->ifa_name = names; - names[sizeof(ifr->ifr_name)] = 0; - strncpy(names, ifr->ifr_name, sizeof(ifr->ifr_name)); - while (*names++) - ; - - ift->ifa_addr = (struct sockaddr *)data; - sa = &ifr->ifr_addr; - memcpy(data, sa, SA_LEN(sa)); - data += SA_RLEN(sa); - - ifr = (struct ifreq *)(((char *)sa) + SA_LEN(sa)); - ift = (ift->ifa_next = ift + 1); - } -#endif /* NET_RT_IFLIST */ - if (--ift >= ifa) { - ift->ifa_next = NULL; - *pif = ifa; - } else { - *pif = NULL; - free(ifa); - } - return (0); -} - -void -freeifaddrs(struct ifaddrs *ifp) -{ - - free(ifp); -} diff --git a/cpukit/libnetworking/libc/getnameinfo.c b/cpukit/libnetworking/libc/getnameinfo.c deleted file mode 100644 index 2955bf4aa1..0000000000 --- a/cpukit/libnetworking/libc/getnameinfo.c +++ /dev/null @@ -1,61 +0,0 @@ -#include - -/* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include -#include -#include -#include -#include - -int -getnameinfo(const struct sockaddr *sa, socklen_t salen, char *node, - size_t nodelen, char *service, size_t servicelen, int flags) -{ - int af; - const struct sockaddr_in *sa_in = (const struct sockaddr_in *)sa; - - (void) salen; - - af = sa->sa_family; - if (af != AF_INET) { - return EAI_FAMILY; - } - - if ((flags & NI_NAMEREQD) != 0) { - return EAI_NONAME; - } - - /* FIXME: This return just the address value. Try resolving instead. */ - if (node != NULL && nodelen > 0) { - if (inet_ntop(af, &sa_in->sin_addr, node, nodelen) == NULL) { - return EAI_FAIL; - } - } - - if (service != NULL && servicelen > 0) { - in_port_t port = ntohs(sa_in->sin_port); - int rv; - - rv = snprintf(service, servicelen, "%u", port); - if (rv <= 0) { - return EAI_FAIL; - } else if ((unsigned)rv >= servicelen) { - return EAI_OVERFLOW; - } - } - - return 0; -} diff --git a/cpukit/libnetworking/libc/getnetbydns.c b/cpukit/libnetworking/libc/getnetbydns.c deleted file mode 100644 index f093347f53..0000000000 --- a/cpukit/libnetworking/libc/getnetbydns.c +++ /dev/null @@ -1,313 +0,0 @@ -#include - -/*- - * Copyright (c) 1985, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ -/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro - * Dep. Matematica Universidade de Coimbra, Portugal, Europe - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "res_config.h" - -#define BYADDR 0 -#define BYNAME 1 -#define MAXALIASES 35 - -#if PACKETSZ > 1024 -#define MAXPACKET PACKETSZ -#else -#define MAXPACKET 1024 -#endif - -typedef union { - HEADER hdr; - u_char buf[MAXPACKET]; -} querybuf; - -typedef union { - long al; - char ac; -} align; - -static struct netent * -getnetanswer( - querybuf *answer, - int anslen, - int net_i) -{ - - register HEADER *hp; - register u_char *cp; - register int n; - u_char *eom; - int type, class, buflen, ancount, qdcount, haveanswer, i, nchar; - char aux1[MAXHOSTNAMELEN], aux2[MAXHOSTNAMELEN], ans[MAXHOSTNAMELEN]; - char *in, *st, *pauxt, *bp, **ap; - char *paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0; -static struct netent net_entry; -static char *net_aliases[MAXALIASES], netbuf[PACKETSZ]; - - /* - * find first satisfactory answer - * - * answer --> +------------+ ( MESSAGE ) - * | Header | - * +------------+ - * | Question | the question for the name server - * +------------+ - * | Answer | RRs answering the question - * +------------+ - * | Authority | RRs pointing toward an authority - * | Additional | RRs holding additional information - * +------------+ - */ - eom = answer->buf + anslen; - hp = &answer->hdr; - ancount = ntohs(hp->ancount); /* #/records in the answer section */ - qdcount = ntohs(hp->qdcount); /* #/entries in the question section */ - bp = netbuf; - buflen = sizeof(netbuf); - cp = answer->buf + HFIXEDSZ; - if (!qdcount) { - if (hp->aa) - h_errno = HOST_NOT_FOUND; - else - h_errno = TRY_AGAIN; - return (NULL); - } - while (qdcount-- > 0) - cp += __dn_skipname(cp, eom) + QFIXEDSZ; - ap = net_aliases; - *ap = NULL; - net_entry.n_aliases = net_aliases; - haveanswer = 0; - while (--ancount >= 0 && cp < eom) { - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !res_dnok(bp)) - break; - cp += n; - ans[0] = '\0'; - (void)strncpy(&ans[0], bp, sizeof(ans) - 1); - ans[sizeof(ans) - 1] = '\0'; - GETSHORT(type, cp); - GETSHORT(class, cp); - cp += INT32SZ; /* TTL */ - GETSHORT(n, cp); - if (class == C_IN && type == T_PTR) { - n = dn_expand(answer->buf, eom, cp, bp, buflen); - if ((n < 0) || !res_hnok(bp)) { - cp += n; - return (NULL); - } - cp += n; - *ap++ = bp; - bp += strlen(bp) + 1; - net_entry.n_addrtype = - (class == C_IN) ? AF_INET : AF_UNSPEC; - haveanswer++; - } - } - if (haveanswer) { - *ap = NULL; - switch (net_i) { - case BYADDR: - net_entry.n_name = *net_entry.n_aliases; - net_entry.n_net = 0L; - break; - case BYNAME: - in = *net_entry.n_aliases; - net_entry.n_name = &ans[0]; - aux2[0] = '\0'; - for (i = 0; i < 4; i++) { - for (st = in, nchar = 0; - *st != '.'; - st++, nchar++) - ; - if (nchar != 1 || *in != '0' || flag) { - flag = 1; - (void)strncpy(paux1, - (i==0) ? in : in-1, - (i==0) ?nchar : nchar+1); - paux1[(i==0) ? nchar : nchar+1] = '\0'; - pauxt = paux2; - paux2 = strcat(paux1, paux2); - paux1 = pauxt; - } - in = ++st; - } - net_entry.n_net = inet_network(paux2); - break; - } - net_entry.n_aliases++; - return (&net_entry); - } - h_errno = TRY_AGAIN; - return (NULL); -} - -struct netent * -_getnetbydnsaddr( - register unsigned long net, - register int net_type ) -{ - unsigned int netbr[4]; - int nn, anslen; - querybuf buf; - char qbuf[MAXDNAME]; - unsigned long net2; - struct netent *net_entry; - - if (net_type != AF_INET) - return (NULL); - - for (nn = 4, net2 = net; net2; net2 >>= 8) - netbr[--nn] = net2 & 0xff; - switch (nn) { - case 3: /* Class A */ - sprintf(qbuf, "0.0.0.%u.in-addr.arpa", netbr[3]); - break; - case 2: /* Class B */ - sprintf(qbuf, "0.0.%u.%u.in-addr.arpa", netbr[3], netbr[2]); - break; - case 1: /* Class C */ - sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2], - netbr[1]); - break; - case 0: /* Class D - E */ - sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2], - netbr[1], netbr[0]); - break; - } - anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); - if (anslen < 0) { -#ifdef DEBUG - if (_res.options & RES_DEBUG) - printf("res_query failed\n"); -#endif - return (NULL); - } - net_entry = getnetanswer(&buf, anslen, BYADDR); - if (net_entry) { - unsigned u_net = net; /* maybe net should be unsigned ? */ - - /* Strip trailing zeros */ - while ((u_net & 0xff) == 0 && u_net != 0) - u_net >>= 8; - net_entry->n_net = u_net; - return (net_entry); - } - return (NULL); -} - -struct netent * -_getnetbydnsname( - register const char *net ) -{ - int anslen; - querybuf buf; - char qbuf[MAXDNAME]; - - if ((_res.options & RES_INIT) == 0 && res_init() == -1) { - h_errno = NETDB_INTERNAL; - return (NULL); - } - strncpy(qbuf, net, sizeof(qbuf) - 1); - qbuf[sizeof(qbuf) - 1] = '\0'; - anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); - if (anslen < 0) { -#ifdef DEBUG - if (_res.options & RES_DEBUG) - printf("res_query failed\n"); -#endif - return (NULL); - } - return getnetanswer(&buf, anslen, BYNAME); -} - -void -_setnetdnsent( - int stayopen) -{ - if (stayopen) - _res.options |= RES_STAYOPEN | RES_USEVC; -} - -void -_endnetdnsent(void) -{ - _res.options &= ~(RES_STAYOPEN | RES_USEVC); - res_close(); -} diff --git a/cpukit/libnetworking/libc/getnetbyht.c b/cpukit/libnetworking/libc/getnetbyht.c deleted file mode 100644 index b41220e8be..0000000000 --- a/cpukit/libnetworking/libc/getnetbyht.c +++ /dev/null @@ -1,175 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro - * Dep. Matematica Universidade de Coimbra, Portugal, Europe - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * from getnetent.c 1.1 (Coimbra) 93/06/02 - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#endif - -#define MAXALIASES 35 - -static FILE *netf; -static char line[BUFSIZ+1]; -static struct netent net; -static char *net_aliases[MAXALIASES]; -static int _net_stayopen; - -void -_setnethtent(int f) -{ - - if (netf == NULL) - netf = fopen(_PATH_NETWORKS, "r" ); - else - rewind(netf); - _net_stayopen |= f; -} - -void -_endnethtent(void) -{ - - if (netf) { - fclose(netf); - netf = NULL; - } - _net_stayopen = 0; -} - -struct netent * -getnetent(void) -{ - char *p; - register char *cp, **q; - - if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL) - return (NULL); -again: - p = fgets(line, sizeof line, netf); - if (p == NULL) - return (NULL); - if (*p == '#') - goto again; - cp = strpbrk(p, "#\n"); - if (cp == NULL) - goto again; - *cp = '\0'; - net.n_name = p; - cp = strpbrk(p, " \t"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - while (*cp == ' ' || *cp == '\t') - cp++; - p = strpbrk(cp, " \t"); - if (p != NULL) - *p++ = '\0'; - net.n_net = inet_network(cp); - net.n_addrtype = AF_INET; - q = net.n_aliases = net_aliases; - if (p != NULL) - cp = p; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &net_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - *q = NULL; - return (&net); -} - -struct netent * -_getnetbyhtname(const char *name) -{ - register struct netent *p; - register char **cp; - - setnetent(_net_stayopen); - while ( (p = getnetent()) ) { - if (strcasecmp(p->n_name, name) == 0) - break; - for (cp = p->n_aliases; *cp != 0; cp++) - if (strcasecmp(*cp, name) == 0) - goto found; - } -found: - if (!_net_stayopen) - endnetent(); - return (p); -} - -struct netent * -_getnetbyhtaddr( - unsigned long net, - int type) -{ - register struct netent *p; - - setnetent(_net_stayopen); - while ( (p = getnetent()) ) - if (p->n_addrtype == type && p->n_net == net) - break; - if (!_net_stayopen) - endnetent(); - return (p); -} diff --git a/cpukit/libnetworking/libc/getnetbynis.c b/cpukit/libnetworking/libc/getnetbynis.c deleted file mode 100644 index c2e40946a2..0000000000 --- a/cpukit/libnetworking/libc/getnetbynis.c +++ /dev/null @@ -1,179 +0,0 @@ -#include - -/*- - * Copyright (c) 1994, Garrett Wollman - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef YP -#include -#include -#include -#endif - -#define MAXALIASES 35 -#define MAXADDRS 35 - -#ifdef YP -static char *host_aliases[MAXALIASES]; -#endif /* YP */ - -static struct netent * -_getnetbynis( - const char *name, - char *map, - int af) -{ -#ifdef YP - register char *cp, **q; - static char *result; - int resultlen; - static struct netent h; - static char *domain = (char *)NULL; - static char ypbuf[YPMAXRECORD + 2]; - - switch(af) { - case AF_INET: - break; - default: - case AF_INET6: - errno = EAFNOSUPPORT; - return NULL; - } - - if (domain == (char *)NULL) - if (yp_get_default_domain (&domain)) - return (NULL); - - if (yp_match(domain, map, name, strlen(name), &result, &resultlen)) - return (NULL); - - bcopy((char *)result, (char *)&ypbuf, resultlen); - ypbuf[resultlen] = '\0'; - free(result); - result = (char *)&ypbuf; - - if ((cp = index(result, '\n'))) - *cp = '\0'; - - cp = strpbrk(result, " \t"); - *cp++ = '\0'; - h.n_name = result; - - while (*cp == ' ' || *cp == '\t') - cp++; - - h.n_net = inet_network(cp); - h.n_addrtype = AF_INET; - - q = h.n_aliases = host_aliases; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &host_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - *q = NULL; - return (&h); -#else - return (NULL); -#endif -} - -struct netent * -_getnetbynisname( - const char *name) -{ - return _getnetbynis(name, "networks.byname", AF_INET); -} - -struct netent * -_getnetbynisaddr( - unsigned long addr, - int af) -{ - char *str, *cp; - unsigned long net2; - int nn; - unsigned int netbr[4]; - char buf[MAXDNAME]; - - if (af != AF_INET) { - errno = EAFNOSUPPORT; - return (NULL); - } - - for (nn = 4, net2 = addr; net2; net2 >>= 8) { - netbr[--nn] = net2 & 0xff; - } - - switch (nn) { - case 3: /* Class A */ - sprintf(buf, "%u", netbr[3]); - break; - case 2: /* Class B */ - sprintf(buf, "%u.%u", netbr[2], netbr[3]); - break; - case 1: /* Class C */ - sprintf(buf, "%u.%u.%u", netbr[1], netbr[2], netbr[3]); - break; - case 0: /* Class D - E */ - sprintf(buf, "%u.%u.%u.%u", netbr[0], netbr[1], - netbr[2], netbr[3]); - break; - } - - str = (char *)&buf; - cp = str + (strlen(str) - 2); - - while(!strcmp(cp, ".0")) { - *cp = '\0'; - cp = str + (strlen(str) - 2); - } - - return _getnetbynis(str, "networks.byaddr", af); -} diff --git a/cpukit/libnetworking/libc/getnetent.3 b/cpukit/libnetworking/libc/getnetent.3 deleted file mode 100644 index 8fb13c0b75..0000000000 --- a/cpukit/libnetworking/libc/getnetent.3 +++ /dev/null @@ -1,158 +0,0 @@ -.\" Copyright (c) 1983, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)getnetent.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd June 4, 1993 -.Dt GETNETENT 3 -.Os BSD 4.2 -.Sh NAME -.Nm getnetent , -.Nm getnetbyaddr , -.Nm getnetbyname , -.Nm setnetent , -.Nm endnetent -.Nd get network entry -.Sh SYNOPSIS -.Fd #include -.Ft struct netent * -.Fn getnetent void -.Ft struct netent * -.Fn getnetbyname "const char *name" -.Ft struct netent * -.Fn getnetbyaddr "unsigned long net" "int type" -.Ft void -.Fn setnetent "int stayopen" -.Ft void -.Fn endnetent void -.Sh DESCRIPTION -The -.Fn getnetent , -.Fn getnetbyname , -and -.Fn getnetbyaddr -functions -each return a pointer to an object with the -following structure -containing the broken-out -fields of a line in the network data base, -.Pa /etc/networks . -.Bd -literal -offset indent -struct netent { - char *n_name; /* official name of net */ - char **n_aliases; /* alias list */ - int n_addrtype; /* net number type */ - unsigned long n_net; /* net number */ -}; -.Ed -.Pp -The members of this structure are: -.Bl -tag -width n_addrtype -.It Fa n_name -The official name of the network. -.It Fa n_aliases -A zero terminated list of alternate names for the network. -.It Fa n_addrtype -The type of the network number returned; currently only AF_INET. -.It Fa n_net -The network number. Network numbers are returned in machine byte -order. -.El -.Pp -The -.Fn getnetent -function -reads the next line of the file, opening the file if necessary. -.Pp -The -.Fn setnetent -function -opens and rewinds the file. If the -.Fa stayopen -flag is non-zero, -the net data base will not be closed after each call to -.Fn getnetbyname -or -.Fn getnetbyaddr . -.Pp -The -.Fn endnetent -function -closes the file. -.Pp -The -.Fn getnetbyname -function -and -.Fn getnetbyaddr -sequentially search from the beginning -of the file until a matching -net name or -net address and type is found, -or until -.Dv EOF -is encountered. The -.Fa type -must be -.Dv AF_INET . -Network numbers are supplied in host order. -.Sh FILES -.Bl -tag -width /etc/networks -compact -.It Pa /etc/networks -.El -.Sh DIAGNOSTICS -Null pointer -(0) returned on -.Dv EOF -or error. -.Sh SEE ALSO -.Xr networks 5 -.Pp -.%T RFC 1101 -.Sh HISTORY -The -.Fn getnetent , -.Fn getnetbyaddr , -.Fn getnetbyname , -.Fn setnetent , -and -.Fn endnetent -functions appeared in -.Bx 4.2 . -.Sh BUGS -The data space used by -these functions is static; if future use requires the data, it should be -copied before any subsequent calls to these functions overwrite it. -Only Internet network -numbers are currently understood. -Expecting network numbers to fit -in no more than 32 bits is probably -naive. diff --git a/cpukit/libnetworking/libc/getnetnamadr.c b/cpukit/libnetworking/libc/getnetnamadr.c deleted file mode 100644 index f16572e3e0..0000000000 --- a/cpukit/libnetworking/libc/getnetnamadr.c +++ /dev/null @@ -1,193 +0,0 @@ -#include - -/*- - * Copyright (c) 1994, Garrett Wollman - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include /* for strcasecmp */ -#endif - -#ifndef _PATH_NETCONF -#define _PATH_NETCONF "/etc/host.conf" -#endif - -enum service_type { - SERVICE_NONE = 0, - SERVICE_BIND, - SERVICE_TABLE, - SERVICE_NIS }; -#define SERVICE_MAX SERVICE_NIS - -static struct { - const char *name; - enum service_type type; -} service_names[] = { - { "hosts", SERVICE_TABLE }, - { "/etc/hosts", SERVICE_TABLE }, - { "hosttable", SERVICE_TABLE }, - { "htable", SERVICE_TABLE }, - { "bind", SERVICE_BIND }, - { "dns", SERVICE_BIND }, - { "domain", SERVICE_BIND }, - { "yp", SERVICE_NIS }, - { "yellowpages", SERVICE_NIS }, - { "nis", SERVICE_NIS }, - { 0, SERVICE_NONE } -}; - -static enum service_type service_order[SERVICE_MAX + 1]; -static int service_done = 0; - -static enum service_type -get_service_name(const char *name) { - int i; - for(i = 0; service_names[i].type != SERVICE_NONE; i++) { - if(!strcasecmp(name, service_names[i].name)) { - return service_names[i].type; - } - } - return SERVICE_NONE; -} - -static void -init_services(void) -{ - char *cp, *p, buf[BUFSIZ]; - register int cc = 0; - FILE *fd; - - if ((fd = (FILE *)fopen(_PATH_NETCONF, "r")) == NULL) { - /* make some assumptions */ - service_order[0] = SERVICE_TABLE; - service_order[1] = SERVICE_NONE; - } else { - while (fgets(buf, BUFSIZ, fd) != NULL && cc < SERVICE_MAX) { - if(buf[0] == '#') - continue; - - p = buf; - while ((cp = strsep(&p, "\n \t,:;")) != NULL && *cp == '\0') - ; - if (cp == NULL) - continue; - do { - if (isalpha((unsigned char)cp[0])) { - service_order[cc] = get_service_name(cp); - if(service_order[cc] != SERVICE_NONE) - cc++; - } - while ((cp = strsep(&p, "\n \t,:;")) != NULL && *cp == '\0') - ; - } while(cp != NULL && cc < SERVICE_MAX); - } - service_order[cc] = SERVICE_NONE; - fclose(fd); - } - service_done = 1; -} - -struct netent * -getnetbyname(const char *name) -{ - struct netent *hp = 0; - int nserv = 0; - - if (!service_done) - init_services(); - - while (!hp) { - switch (service_order[nserv]) { - case SERVICE_NONE: - return NULL; - case SERVICE_TABLE: - hp = _getnetbyhtname(name); - break; - case SERVICE_BIND: - hp = _getnetbydnsname(name); - break; - case SERVICE_NIS: - hp = _getnetbynisname(name); - break; - } - nserv++; - } - return hp; -} - -struct netent * -getnetbyaddr(uint32_t addr, int af) -{ - struct netent *hp = 0; - int nserv = 0; - - if (!service_done) - init_services(); - - while (!hp) { - switch (service_order[nserv]) { - case SERVICE_NONE: - return 0; - case SERVICE_TABLE: - hp = _getnetbyhtaddr(addr, af); - break; - case SERVICE_BIND: - hp = _getnetbydnsaddr(addr, af); - break; - case SERVICE_NIS: - hp = _getnetbynisaddr(addr, af); - break; - } - nserv++; - } - return hp; -} - -void -setnetent(int stayopen) -{ - _setnethtent(stayopen); - _setnetdnsent(stayopen); -} - -void -endnetent(void) -{ - _endnethtent(); - _endnetdnsent(); -} diff --git a/cpukit/libnetworking/libc/getproto.c b/cpukit/libnetworking/libc/getproto.c deleted file mode 100644 index 23bab628ea..0000000000 --- a/cpukit/libnetworking/libc/getproto.c +++ /dev/null @@ -1,62 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -extern int _proto_stayopen; - -extern struct protoent * getprotobynumber_static(int); - -struct protoent * -getprotobynumber( - int proto ) -{ - register struct protoent *p; - - setprotoent(_proto_stayopen); - while ( (p = getprotoent()) ) - if (p->p_proto == proto) - break; - if (!_proto_stayopen) - endprotoent(); - - if ( !p ) - p = getprotobynumber_static(proto); - return (p); -} diff --git a/cpukit/libnetworking/libc/getprotoent.3 b/cpukit/libnetworking/libc/getprotoent.3 deleted file mode 100644 index dbf3d1a1c3..0000000000 --- a/cpukit/libnetworking/libc/getprotoent.3 +++ /dev/null @@ -1,146 +0,0 @@ -.\" Copyright (c) 1983, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)getprotoent.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd June 4, 1993 -.Dt GETPROTOENT 3 -.Os BSD 4.2 -.Sh NAME -.Nm getprotoent , -.Nm getprotobynumber , -.Nm getprotobyname , -.Nm setprotoent , -.Nm endprotoent -.Nd get protocol entry -.Sh SYNOPSIS -.Fd #include -.Ft struct protoent * -.Fn getprotoent void -.Ft struct protoent * -.Fn getprotobyname "const char *name" -.Ft struct protoent * -.Fn getprotobynumber "int proto" -.Ft void -.Fn setprotoent "int stayopen" -.Ft void -.Fn endprotoent void -.Sh DESCRIPTION -The -.Fn getprotoent , -.Fn getprotobyname , -and -.Fn getprotobynumber -functions -each return a pointer to an object with the -following structure -containing the broken-out -fields of a line in the network protocol data base, -.Pa /etc/protocols . -.Bd -literal -offset indent -.Pp -struct protoent { - char *p_name; /* official name of protocol */ - char **p_aliases; /* alias list */ - int p_proto; /* protocol number */ -}; -.Ed -.Pp -The members of this structure are: -.Bl -tag -width p_aliases -.It Fa p_name -The official name of the protocol. -.It Fa p_aliases -A zero terminated list of alternate names for the protocol. -.It Fa p_proto -The protocol number. -.El -.Pp -The -.Fn getprotoent -function -reads the next line of the file, opening the file if necessary. -.Pp -The -.Fn setprotoent -function -opens and rewinds the file. If the -.Fa stayopen -flag is non-zero, -the net data base will not be closed after each call to -.Fn getprotobyname -or -.Fn getprotobynumber . -.Pp -The -.Fn endprotoent -function -closes the file. -.Pp -The -.Fn getprotobyname -function -and -.Fn getprotobynumber -sequentially search from the beginning -of the file until a matching -protocol name or -protocol number is found, -or until -.Dv EOF -is encountered. -.Sh RETURN VALUES -Null pointer -(0) returned on -.Dv EOF -or error. -.Sh FILES -.Bl -tag -width /etc/protocols -compact -.It Pa /etc/protocols -.El -.Sh SEE ALSO -.Xr protocols 5 -.Sh HISTORY -The -.Fn getprotoent , -.Fn getprotobynumber , -.Fn getprotobyname , -.Fn setprotoent , -and -.Fn endprotoent -functions appeared in -.Bx 4.2 . -.Sh BUGS -These functions use a static data space; -if the data is needed for future use, it should be -copied before any subsequent calls overwrite it. -Only the Internet -protocols are currently understood. diff --git a/cpukit/libnetworking/libc/getprotoent.c b/cpukit/libnetworking/libc/getprotoent.c deleted file mode 100644 index 6b3ef189f1..0000000000 --- a/cpukit/libnetworking/libc/getprotoent.c +++ /dev/null @@ -1,121 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include - -#define MAXALIASES 35 - -static FILE *protof = NULL; -static char line[BUFSIZ+1]; -static struct protoent proto; -static char *proto_aliases[MAXALIASES]; -int _proto_stayopen; - -void -setprotoent( - int f) -{ - if (protof == NULL) - protof = fopen(_PATH_PROTOCOLS, "r" ); - else - rewind(protof); - _proto_stayopen |= f; -} - -void -endprotoent(void) -{ - if (protof) { - fclose(protof); - protof = NULL; - } - _proto_stayopen = 0; -} - -struct protoent * -getprotoent(void) -{ - char *p; - register char *cp, **q; - - if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL) - return (NULL); -again: - if ((p = fgets(line, BUFSIZ, protof)) == NULL) - return (NULL); - if (*p == '#') - goto again; - cp = strpbrk(p, "#\n"); - if (cp == NULL) - goto again; - *cp = '\0'; - proto.p_name = p; - cp = strpbrk(p, " \t"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - while (*cp == ' ' || *cp == '\t') - cp++; - p = strpbrk(cp, " \t"); - if (p != NULL) - *p++ = '\0'; - proto.p_proto = atoi(cp); - q = proto.p_aliases = proto_aliases; - if (p != NULL) { - cp = p; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &proto_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - } - *q = NULL; - return (&proto); -} diff --git a/cpukit/libnetworking/libc/getprotoname.c b/cpukit/libnetworking/libc/getprotoname.c deleted file mode 100644 index e0e57fb90f..0000000000 --- a/cpukit/libnetworking/libc/getprotoname.c +++ /dev/null @@ -1,69 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -extern int _proto_stayopen; - -extern struct protoent *getprotobyname_static(const char *); - -struct protoent * -getprotobyname( - const char *name) -{ - register struct protoent *p; - register char **cp; - - setprotoent(_proto_stayopen); - while ( (p = getprotoent()) ) { - if (strcmp(p->p_name, name) == 0) - break; - for (cp = p->p_aliases; *cp != 0; cp++) - if (strcmp(*cp, name) == 0) - goto found; - } -found: - if (!_proto_stayopen) - endprotoent(); - - if ( !p ) - p = getprotobyname_static(name); - return (p); -} diff --git a/cpukit/libnetworking/libc/getservbyname.c b/cpukit/libnetworking/libc/getservbyname.c deleted file mode 100644 index bb662c2281..0000000000 --- a/cpukit/libnetworking/libc/getservbyname.c +++ /dev/null @@ -1,101 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -extern int _serv_stayopen; - -int getservbyname_r( - const char *name, - const char *proto, - struct servent *result_buf, - char *buf, - size_t buflen, - struct servent **result -) -{ - #warning "implement a proper getservbyport_r" - - *result = getservbyname(name, proto); - if ( *result ) - return 0; - - return -1; -} - - -struct servent * -getservbyname( - const char *name, - const char *proto ) -{ - register struct servent *p; - register char **cp; - -#ifdef YP - extern char *___getservbyname_yp; - extern char *___getservbyproto_yp; - - ___getservbyname_yp = (char *)name; - ___getservbyproto_yp = (char *)proto; -#endif - - setservent(_serv_stayopen); - while ( (p = getservent()) ) { - if (strcmp(name, p->s_name) == 0) - goto gotname; - for (cp = p->s_aliases; *cp; cp++) - if (strcmp(name, *cp) == 0) - goto gotname; - continue; -gotname: - if (proto == 0 || strcmp(p->s_proto, proto) == 0) - break; - } - if (!_serv_stayopen) - endservent(); - -#ifdef YP - ___getservbyname_yp = NULL; - ___getservbyproto_yp = NULL; -#endif - - return (p); -} diff --git a/cpukit/libnetworking/libc/getservbyport.c b/cpukit/libnetworking/libc/getservbyport.c deleted file mode 100644 index 4a47e843ce..0000000000 --- a/cpukit/libnetworking/libc/getservbyport.c +++ /dev/null @@ -1,94 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -extern int _serv_stayopen; - -int getservbyport_r( - int port, - const char *proto, - struct servent *result_buf, - char *buf, - size_t buflen, - struct servent **result -) -{ - #warning "implement a proper getservbyport_r" - - *result = getservbyport(port, proto); - if ( *result ) - return 0; - - return -1; -} - -struct servent * -getservbyport( - int port, - const char *proto) -{ - register struct servent *p; - -#ifdef YP - extern int ___getservbyport_yp; - extern char *___getservbyproto_yp; - - ___getservbyport_yp = port; - ___getservbyproto_yp = (char *)proto; -#endif - - setservent(_serv_stayopen); - while ( (p = getservent()) ) { - if (p->s_port != port) - continue; - if (proto == 0 || strcmp(p->s_proto, proto) == 0) - break; - } - if (!_serv_stayopen) - endservent(); - -#ifdef YP - ___getservbyport_yp = 0; - ___getservbyproto_yp = NULL; -#endif - - return (p); -} diff --git a/cpukit/libnetworking/libc/getservent.3 b/cpukit/libnetworking/libc/getservent.3 deleted file mode 100644 index 32a0a8d7d3..0000000000 --- a/cpukit/libnetworking/libc/getservent.3 +++ /dev/null @@ -1,155 +0,0 @@ -.\" Copyright (c) 1983, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" From: @(#)getservent.3 8.3 (Berkeley) 1/12/94 -.\" -.Dd July 9, 1995 -.Dt GETSERVENT 3 -.Os BSD 4.2 -.Sh NAME -.Nm getservent , -.Nm getservbyport , -.Nm getservbyname , -.Nm setservent , -.Nm endservent -.Nd get service entry -.Sh SYNOPSIS -.Fd #include -.Ft struct servent * -.Fn getservent -.Ft struct servent * -.Fn getservbyname "const char *name" "const char *proto" -.Ft struct servent * -.Fn getservbyport "int port" "const char *proto" -.Ft void -.Fn setservent "int stayopen" -.Ft void -.Fn endservent void -.Sh DESCRIPTION -The -.Fn getservent , -.Fn getservbyname , -and -.Fn getservbyport -functions -each return a pointer to an object with the -following structure -containing the broken-out -fields of a line in the network services data base, -.Pa /etc/services . -.Bd -literal -offset indent -struct servent { - char *s_name; /* official name of service */ - char **s_aliases; /* alias list */ - int s_port; /* port service resides at */ - char *s_proto; /* protocol to use */ -}; -.Ed -.Pp -The members of this structure are: -.Bl -tag -width s_aliases -.It Fa s_name -The official name of the service. -.It Fa s_aliases -A zero terminated list of alternate names for the service. -.It Fa s_port -The port number at which the service resides. -Port numbers are returned in network byte order. -.It Fa s_proto -The name of the protocol to use when contacting the -service. -.El -.Pp -The -.Fn getservent -function -reads the next line of the file, opening the file if necessary. -.Pp -The -.Fn setservent -function -opens and rewinds the file. If the -.Fa stayopen -flag is non-zero, -the net data base will not be closed after each call to -.Fn getservbyname -or -.Fn getservbyport . -.Pp -The -.Fn endservent -function -closes the file. -.Pp -The -.Fn getservbyname -and -.Fn getservbyport -functions -sequentially search from the beginning -of the file until a matching -protocol name or -port number is found, -or until -.Dv EOF -is encountered. -If a protocol name is also supplied (non- -.Dv NULL ) , -searches must also match the protocol. -.ne 1i -.Sh FILES -.Bl -tag -width /etc/services -compact -.It Pa /etc/services -.El -.Sh DIAGNOSTICS -Null pointer -(0) returned on -.Dv EOF -or error. -.Sh SEE ALSO -.Xr getprotoent 3 , -.Xr services 5 -.Sh HISTORY -The -.Fn getservent , -.Fn getservbyport , -.Fn getservbyname , -.Fn setservent , -and -.Fn endservent -functions appeared in -.Bx 4.2 . -.Sh BUGS -These functions use static data storage; -if the data is needed for future use, it should be -copied before any subsequent calls overwrite it. -Expecting port numbers to fit in a 32 bit -quantity is probably naive. diff --git a/cpukit/libnetworking/libc/getservent.c b/cpukit/libnetworking/libc/getservent.c deleted file mode 100644 index f79a0ed5cb..0000000000 --- a/cpukit/libnetworking/libc/getservent.c +++ /dev/null @@ -1,281 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#ifdef YP -#include -#include -#include -static int serv_stepping_yp = 0; -extern int _yp_check __P(( char ** )); -#endif - - -#define MAXALIASES 35 - -static FILE *servf = NULL; -static char line[BUFSIZ+1]; -static struct servent serv; -static char *serv_aliases[MAXALIASES]; -int _serv_stayopen; - -#ifdef YP -char *___getservbyname_yp = NULL; -char *___getservbyproto_yp = NULL; -int ___getservbyport_yp = 0; -static char *yp_domain = NULL; - -static int -_getservbyport_yp(line) - char *line; -{ - char *result; - int resultlen; - char buf[YPMAXRECORD + 2]; - int rv; - - snprintf(buf, sizeof(buf), "%d/%s", ntohs(___getservbyport_yp), - ___getservbyproto_yp); - - ___getservbyport_yp = 0; - ___getservbyproto_yp = NULL; - - if(!yp_domain) { - if(yp_get_default_domain(&yp_domain)) - return (0); - } - - /* - * We have to be a little flexible here. Ideally you're supposed - * to have both a services.byname and a services.byport map, but - * some systems have only services.byname. FreeBSD cheats a little - * by putting the services.byport information in the same map as - * services.byname so that either case will work. We allow for both - * possibilities here: if there is no services.byport map, we try - * services.byname instead. - */ - if ((rv = yp_match(yp_domain, "services.byport", buf, strlen(buf), - &result, &resultlen))) { - if (rv == YPERR_MAP) { - if (yp_match(yp_domain, "services.byname", buf, - strlen(buf), &result, &resultlen)) - return(0); - } else - return(0); - } - - /* getservent() expects lines terminated with \n -- make it happy */ - snprintf(line, BUFSIZ, "%.*s\n", resultlen, result); - - free(result); - return(1); -} - -static int -_getservbyname_yp(line) - char *line; -{ - char *result; - int resultlen; - char buf[YPMAXRECORD + 2]; - - if(!yp_domain) { - if(yp_get_default_domain(&yp_domain)) - return (0); - } - - snprintf(buf, sizeof(buf), "%s/%s", ___getservbyname_yp, - ___getservbyproto_yp); - - ___getservbyname_yp = 0; - ___getservbyproto_yp = NULL; - - if (yp_match(yp_domain, "services.byname", buf, strlen(buf), - &result, &resultlen)) { - return(0); - } - - /* getservent() expects lines terminated with \n -- make it happy */ - snprintf(line, BUFSIZ, "%.*s\n", resultlen, result); - - free(result); - return(1); -} - -static int -_getservent_yp(line) - char *line; -{ - static char *key = NULL; - static int keylen; - char *lastkey, *result; - int resultlen; - int rv; - - if(!yp_domain) { - if(yp_get_default_domain(&yp_domain)) - return (0); - } - - if (!serv_stepping_yp) { - if (key) - free(key); - if ((rv = yp_first(yp_domain, "services.byname", &key, &keylen, - &result, &resultlen))) { - serv_stepping_yp = 0; - return(0); - } - serv_stepping_yp = 1; - } else { - lastkey = key; - rv = yp_next(yp_domain, "services.byname", key, keylen, &key, - &keylen, &result, &resultlen); - free(lastkey); - if (rv) { - serv_stepping_yp = 0; - return (0); - } - } - - /* getservent() expects lines terminated with \n -- make it happy */ - snprintf(line, BUFSIZ, "%.*s\n", resultlen, result); - - free(result); - - return(1); -} -#endif - -void -setservent( - int f) -{ - if (servf == NULL) - servf = fopen(_PATH_SERVICES, "r" ); - else - rewind(servf); - _serv_stayopen |= f; -} - -void -endservent(void) -{ - if (servf) { - fclose(servf); - servf = NULL; - } - _serv_stayopen = 0; -} - -struct servent * -getservent(void) -{ - char *p; - register char *cp, **q; - -#ifdef YP - if (serv_stepping_yp && _getservent_yp(line)) { - p = (char *)&line; - goto unpack; - } -tryagain: -#endif - if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) - return (NULL); -again: - if ((p = fgets(line, BUFSIZ, servf)) == NULL) - return (NULL); -#ifdef YP - if (*p == '+' && _yp_check(NULL)) { - if (___getservbyname_yp != NULL) { - if (!_getservbyname_yp(line)) - goto tryagain; - } - else if (___getservbyport_yp != 0) { - if (!_getservbyport_yp(line)) - goto tryagain; - } - else if (!_getservent_yp(line)) - goto tryagain; - } -unpack: -#endif - if (*p == '#') - goto again; - cp = strpbrk(p, "#\n"); - if (cp == NULL) - goto again; - *cp = '\0'; - serv.s_name = p; - p = strpbrk(p, " \t"); - if (p == NULL) - goto again; - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - p++; - cp = strpbrk(p, ",/"); - if (cp == NULL) - goto again; - *cp++ = '\0'; - serv.s_port = htons((u_short)atoi(p)); - serv.s_proto = cp; - q = serv.s_aliases = serv_aliases; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &serv_aliases[MAXALIASES - 1]) - *q++ = cp; - cp = strpbrk(cp, " \t"); - if (cp != NULL) - *cp++ = '\0'; - } - *q = NULL; - return (&serv); -} diff --git a/cpukit/libnetworking/libc/herror.c b/cpukit/libnetworking/libc/herror.c deleted file mode 100644 index d65d60722b..0000000000 --- a/cpukit/libnetworking/libc/herror.c +++ /dev/null @@ -1,129 +0,0 @@ -#include - -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include - -const char *h_errlist[] = { - "Resolver Error 0 (no error)", - "Unknown host", /* 1 HOST_NOT_FOUND */ - "Host name lookup failure", /* 2 TRY_AGAIN */ - "Unknown server error", /* 3 NO_RECOVERY */ - "No address associated with name", /* 4 NO_ADDRESS */ -}; -int h_nerr = { sizeof h_errlist / sizeof h_errlist[0] }; - -int * -__h_errno(void) -{ - static int the_h_errno; - - return &the_h_errno; -} - -#define HERROR_USE_WRITEV - -/* - * herror -- - * print the error indicated by the h_errno value. - */ -void -herror(const char *s) -{ -#if defined(HERROR_USE_WRITEV) - struct iovec iov[4]; - register struct iovec *v = iov; - - if (s && *s) { - v->iov_base = (char *)s; - v->iov_len = strlen(s); - v++; - v->iov_base = ": "; - v->iov_len = 2; - v++; - } - v->iov_base = (char *)hstrerror(h_errno); - v->iov_len = strlen(v->iov_base); - v++; - v->iov_base = "\n"; - v->iov_len = 1; - writev(STDERR_FILENO, iov, (v - iov) + 1); -#else - /* - * no writev implementation available - */ - if (s && *s) { - write (2, s, strlen (s)); - write (2, ": ", 2); - } - s = (char *)hstrerror(h_errno); - write (2, s, strlen (s)); - write (2, "\n", 1); -#endif -} - -const char * -hstrerror(int err) -{ - if (err < 0) - return ("Resolver internal error"); - else if (err < h_nerr) - return (h_errlist[err]); - return ("Unknown resolver error"); -} diff --git a/cpukit/libnetworking/libc/if_indextoname.c b/cpukit/libnetworking/libc/if_indextoname.c deleted file mode 100644 index 467c2eb1e5..0000000000 --- a/cpukit/libnetworking/libc/if_indextoname.c +++ /dev/null @@ -1,93 +0,0 @@ -#include - -/* $KAME: if_indextoname.c,v 1.7 2000/11/08 03:09:30 itojun Exp $ */ - -/*- - * Copyright (c) 1997, 2000 - * Berkeley Software Design, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * BSDI Id: if_indextoname.c,v 2.3 2000/04/17 22:38:05 dab Exp - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * From RFC 2533: - * - * The second function maps an interface index into its corresponding - * name. - * - * #include - * - * char *if_indextoname(unsigned int ifindex, char *ifname); - * - * The ifname argument must point to a buffer of at least IF_NAMESIZE - * bytes into which the interface name corresponding to the specified - * index is returned. (IF_NAMESIZE is also defined in and - * its value includes a terminating null byte at the end of the - * interface name.) This pointer is also the return value of the - * function. If there is no interface corresponding to the specified - * index, NULL is returned, and errno is set to ENXIO, if there was a - * system error (such as running out of memory), if_indextoname returns - * NULL and errno would be set to the proper value (e.g., ENOMEM). - */ - -char * -if_indextoname(unsigned int ifindex, char *ifname) -{ - struct ifaddrs *ifaddrs, *ifa; - int error = 0; - - if (getifaddrs(&ifaddrs) < 0) - return(NULL); /* getifaddrs properly set errno */ - - for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr && - ifa->ifa_addr->sa_family == AF_LINK && - ifindex == ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index) - break; - } - - if (ifa == NULL) { - error = ENXIO; - ifname = NULL; - } - else - strncpy(ifname, ifa->ifa_name, IFNAMSIZ); - - freeifaddrs(ifaddrs); - - errno = error; - return(ifname); -} diff --git a/cpukit/libnetworking/libc/if_nameindex.c b/cpukit/libnetworking/libc/if_nameindex.c deleted file mode 100644 index 7c7777f543..0000000000 --- a/cpukit/libnetworking/libc/if_nameindex.c +++ /dev/null @@ -1,152 +0,0 @@ -#include - -/* $KAME: if_nameindex.c,v 1.8 2000/11/24 08:20:01 itojun Exp $ */ - -/*- - * Copyright (c) 1997, 2000 - * Berkeley Software Design, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * BSDI Id: if_nameindex.c,v 2.3 2000/04/17 22:38:05 dab Exp - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -/* - * From RFC 2553: - * - * 4.3 Return All Interface Names and Indexes - * - * The if_nameindex structure holds the information about a single - * interface and is defined as a result of including the - * header. - * - * struct if_nameindex { - * unsigned int if_index; - * char *if_name; - * }; - * - * The final function returns an array of if_nameindex structures, one - * structure per interface. - * - * struct if_nameindex *if_nameindex(void); - * - * The end of the array of structures is indicated by a structure with - * an if_index of 0 and an if_name of NULL. The function returns a NULL - * pointer upon an error, and would set errno to the appropriate value. - * - * The memory used for this array of structures along with the interface - * names pointed to by the if_name members is obtained dynamically. - * This memory is freed by the next function. - * - * 4.4. Free Memory - * - * The following function frees the dynamic memory that was allocated by - * if_nameindex(). - * - * #include - * - * void if_freenameindex(struct if_nameindex *ptr); - * - * The argument to this function must be a pointer that was returned by - * if_nameindex(). - */ - -struct if_nameindex * -if_nameindex(void) -{ - struct ifaddrs *ifaddrs, *ifa; - unsigned int ni; - int nbytes; - struct if_nameindex *ifni, *ifni2; - char *cp; - - if (getifaddrs(&ifaddrs) < 0) - return(NULL); - - /* - * First, find out how many interfaces there are, and how - * much space we need for the string names. - */ - ni = 0; - nbytes = 0; - for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr && - ifa->ifa_addr->sa_family == AF_LINK) { - nbytes += strlen(ifa->ifa_name) + 1; - ni++; - } - } - - /* - * Next, allocate a chunk of memory, use the first part - * for the array of structures, and the last part for - * the strings. - */ - cp = malloc((ni + 1) * sizeof(struct if_nameindex) + nbytes); - ifni = (struct if_nameindex *)cp; - if (ifni == NULL) - goto out; - cp += (ni + 1) * sizeof(struct if_nameindex); - - /* - * Now just loop through the list of interfaces again, - * filling in the if_nameindex array and making copies - * of all the strings. - */ - ifni2 = ifni; - for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr && - ifa->ifa_addr->sa_family == AF_LINK) { - ifni2->if_index = - ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index; - ifni2->if_name = cp; - strcpy(cp, ifa->ifa_name); - ifni2++; - cp += strlen(cp) + 1; - } - } - /* - * Finally, don't forget to terminate the array. - */ - ifni2->if_index = 0; - ifni2->if_name = NULL; -out: - freeifaddrs(ifaddrs); - return(ifni); -} - -void -if_freenameindex(struct if_nameindex *ptr) -{ - free(ptr); -} diff --git a/cpukit/libnetworking/libc/inet.3 b/cpukit/libnetworking/libc/inet.3 deleted file mode 100644 index 501f3db8dc..0000000000 --- a/cpukit/libnetworking/libc/inet.3 +++ /dev/null @@ -1,209 +0,0 @@ -.\" Copyright (c) 1983, 1990, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" From: @(#)inet.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd June 17, 1996 -.Dt INET 3 -.Os BSD 4.2 -.Sh NAME -.Nm inet_aton , -.Nm inet_addr , -.Nm inet_network , -.Nm inet_ntoa , -.Nm inet_makeaddr , -.Nm inet_lnaof , -.Nm inet_netof -.Nd Internet address manipulation routines -.Sh SYNOPSIS -.Fd #include -.Fd #include -.Fd #include -.Fd #include -.Ft int -.Fn inet_aton "const char *cp" "struct in_addr *pin" -.Ft unsigned long -.Fn inet_addr "const char *cp" -.Ft unsigned long -.Fn inet_network "const char *cp" -.Ft char * -.Fn inet_ntoa "struct in_addr in" -.Ft struct in_addr -.Fn inet_makeaddr "unsigned long net" "unsigned long lna" -.Ft unsigned long -.Fn inet_lnaof "struct in_addr in" -.Ft unsigned long -.Fn inet_netof "struct in_addr in" -.Sh DESCRIPTION -The routines -.Fn inet_aton , -.Fn inet_addr -and -.Fn inet_network -interpret character strings representing -numbers expressed in the Internet standard -.Ql \&. -notation. -The -.Fn inet_aton -routine interprets the specified character string as an Internet address, -placing the address into the structure provided. -It returns 1 if the string was successfully interpreted, -or 0 if the string is invalid. -The -.Fn inet_addr -and -.Fn inet_network -functions return numbers suitable for use -as Internet addresses and Internet network -numbers, respectively. -The routine -.Fn inet_ntoa -takes an Internet address and returns an -.Tn ASCII -string representing the address in -.Ql \&. -notation. The routine -.Fn inet_makeaddr -takes an Internet network number and a local -network address and constructs an Internet address -from it. The routines -.Fn inet_netof -and -.Fn inet_lnaof -break apart Internet host addresses, returning -the network number and local network address part, -respectively. -.Pp -All Internet addresses are returned in network -order (bytes ordered from left to right). -All network numbers and local address parts are -returned as machine format integer values. -.Sh INTERNET ADDRESSES -Values specified using the -.Ql \&. -notation take one -of the following forms: -.Bd -literal -offset indent -a.b.c.d -a.b.c -a.b -a -.Ed -.Pp -When four parts are specified, each is interpreted -as a byte of data and assigned, from left to right, -to the four bytes of an Internet address. Note -that when an Internet address is viewed as a 32-bit -integer quantity on the -.Tn VAX -the bytes referred to -above appear as -.Dq Li d.c.b.a . -That is, -.Tn VAX -bytes are -ordered from right to left. -.Pp -When a three part address is specified, the last -part is interpreted as a 16-bit quantity and placed -in the right-most two bytes of the network address. -This makes the three part address format convenient -for specifying Class B network addresses as -.Dq Li 128.net.host . -.Pp -When a two part address is supplied, the last part -is interpreted as a 24-bit quantity and placed in -the right most three bytes of the network address. -This makes the two part address format convenient -for specifying Class A network addresses as -.Dq Li net.host . -.Pp -When only one part is given, the value is stored -directly in the network address without any byte -rearrangement. -.Pp -All numbers supplied as -.Dq parts -in a -.Ql \&. -notation -may be decimal, octal, or hexadecimal, as specified -in the C language (i.e., a leading 0x or 0X implies -hexadecimal; otherwise, a leading 0 implies octal; -otherwise, the number is interpreted as decimal). -.Pp -The -.Fn inet_aton -and -.Fn inet_ntoa -functions are semi-deprecated in favor of the -.Xr addr2ascii 3 -family. However, since those functions are not yet widely implemented, -portable programs cannot rely on their presence and will continue -to use the -.Xr inet 3 -functions for some time. -.Sh DIAGNOSTICS -The constant -.Dv INADDR_NONE -is returned by -.Fn inet_addr -and -.Fn inet_network -for malformed requests. -.Sh SEE ALSO -.Xr addr2ascii 3 , -.Xr gethostbyname 3 , -.Xr getnetent 3 , -.Xr hosts 5 , -.Xr networks 5 -.Sh HISTORY -These -functions appeared in -.Bx 4.2 . -.Sh BUGS -The value -.Dv INADDR_NONE -(0xffffffff) is a valid broadcast address, but -.Fn inet_addr -cannot return that value without indicating failure. -The newer -.Fn inet_aton -function does not share this problem. -The problem of host byte ordering versus network byte ordering is -confusing. -The string returned by -.Fn inet_ntoa -resides in a static memory area. -.Pp -Inet_addr should return a -.Fa struct in_addr . diff --git a/cpukit/libnetworking/libc/inet_addr.c b/cpukit/libnetworking/libc/inet_addr.c deleted file mode 100644 index d014266ac2..0000000000 --- a/cpukit/libnetworking/libc/inet_addr.c +++ /dev/null @@ -1,218 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Portions Copyright (c) 1996-1999 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93"; -static const char rcsid[] = "$Id: inet_addr.c,v 1.5 2005/04/27 04:56:19 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ -#include -__FBSDID("$FreeBSD: head/lib/libc/inet/inet_addr.c 314436 2017-02-28 23:42:47Z imp $"); - -#include "port_before.h" - -#include - -#include -#include - -#include - -#include "port_after.h" - -/*% - * Ascii internet address interpretation routine. - * The value returned is in network order. - */ -in_addr_t /* XXX should be struct in_addr :( */ -inet_addr(const char *cp) { - struct in_addr val; - - if (inet_aton(cp, &val)) - return (val.s_addr); - return (INADDR_NONE); -} - -/*% - * Check whether "cp" is a valid ascii representation - * of an Internet address and convert to a binary address. - * Returns 1 if the address is valid, 0 if not. - * This replaces inet_addr, the return value from which - * cannot distinguish between failure and a local broadcast address. - */ -int -inet_aton(const char *cp, struct in_addr *addr) { - u_long val; - int base, n; - char c; - u_int8_t parts[4]; - u_int8_t *pp = parts; - int digit; - - c = *cp; - for (;;) { - /* - * Collect number up to ``.''. - * Values are specified as for C: - * 0x=hex, 0=octal, isdigit=decimal. - */ - if (!isdigit((unsigned char)c)) - return (0); - val = 0; base = 10; digit = 0; - if (c == '0') { - c = *++cp; - if (c == 'x' || c == 'X') - base = 16, c = *++cp; - else { - base = 8; - digit = 1 ; - } - } - for (;;) { - if (isascii(c) && isdigit((unsigned char)c)) { - if (base == 8 && (c == '8' || c == '9')) - return (0); - val = (val * base) + (c - '0'); - c = *++cp; - digit = 1; - } else if (base == 16 && isascii(c) && - isxdigit((unsigned char)c)) { - val = (val << 4) | - (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); - c = *++cp; - digit = 1; - } else - break; - } - if (c == '.') { - /* - * Internet format: - * a.b.c.d - * a.b.c (with c treated as 16 bits) - * a.b (with b treated as 24 bits) - */ - if (pp >= parts + 3 || val > 0xffU) - return (0); - *pp++ = val; - c = *++cp; - } else - break; - } - /* - * Check for trailing characters. - */ - if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c))) - return (0); - /* - * Did we get a valid digit? - */ - if (!digit) - return (0); - /* - * Concoct the address according to - * the number of parts specified. - */ - n = pp - parts + 1; - switch (n) { - case 1: /*%< a -- 32 bits */ - break; - - case 2: /*%< a.b -- 8.24 bits */ - if (val > 0xffffffU) - return (0); - val |= parts[0] << 24; - break; - - case 3: /*%< a.b.c -- 8.8.16 bits */ - if (val > 0xffffU) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 4: /*%< a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xffU) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - } - if (addr != NULL) - addr->s_addr = htonl(val); - return (1); -} - -#ifndef __rtems__ -/* - * Weak aliases for applications that use certain private entry points, - * and fail to include . - */ -#undef inet_addr -__weak_reference(__inet_addr, inet_addr); -#undef inet_aton -__weak_reference(__inet_aton, inet_aton); -#endif /* __rtems__ */ - -/*! \file */ diff --git a/cpukit/libnetworking/libc/inet_lnaof.c b/cpukit/libnetworking/libc/inet_lnaof.c deleted file mode 100644 index c88331dcc2..0000000000 --- a/cpukit/libnetworking/libc/inet_lnaof.c +++ /dev/null @@ -1,61 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -/* - * Return the local network address portion of an - * internet address; handles class a/b/c network - * number formats. - */ -in_addr_t -inet_lnaof( - struct in_addr in) -{ - register u_long i = ntohl(in.s_addr); - - if (IN_CLASSA(i)) - return ((i)&IN_CLASSA_HOST); - else if (IN_CLASSB(i)) - return ((i)&IN_CLASSB_HOST); - else - return ((i)&IN_CLASSC_HOST); -} diff --git a/cpukit/libnetworking/libc/inet_makeaddr.c b/cpukit/libnetworking/libc/inet_makeaddr.c deleted file mode 100644 index 4805af7516..0000000000 --- a/cpukit/libnetworking/libc/inet_makeaddr.c +++ /dev/null @@ -1,65 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -/* - * Formulate an Internet address from network + host. Used in - * building addresses stored in the ifnet structure. - */ -struct in_addr -inet_makeaddr( - in_addr_t net, - in_addr_t host ) -{ - u_long addr; - - if (net < 128) - addr = (net << IN_CLASSA_NSHIFT) | (host & IN_CLASSA_HOST); - else if (net < 65536) - addr = (net << IN_CLASSB_NSHIFT) | (host & IN_CLASSB_HOST); - else if (net < 16777216L) - addr = (net << IN_CLASSC_NSHIFT) | (host & IN_CLASSC_HOST); - else - addr = net | host; - addr = htonl(addr); - return (*(struct in_addr *)&addr); -} diff --git a/cpukit/libnetworking/libc/inet_netof.c b/cpukit/libnetworking/libc/inet_netof.c deleted file mode 100644 index 175f24f90f..0000000000 --- a/cpukit/libnetworking/libc/inet_netof.c +++ /dev/null @@ -1,60 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -/* - * Return the network number from an internet - * address; handles class a/b/c network #'s. - */ -in_addr_t -inet_netof( - struct in_addr in) -{ - register u_long i = ntohl(in.s_addr); - - if (IN_CLASSA(i)) - return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); - else if (IN_CLASSB(i)) - return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); - else - return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); -} diff --git a/cpukit/libnetworking/libc/inet_network.c b/cpukit/libnetworking/libc/inet_network.c deleted file mode 100644 index d838dc076f..0000000000 --- a/cpukit/libnetworking/libc/inet_network.c +++ /dev/null @@ -1,92 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -/* - * Internet network address interpretation routine. - * The library routines call this routine to interpret - * network numbers. - */ -in_addr_t -inet_network( - const char *cp) -{ - register u_long val, base, n, i; - register char c; - u_long parts[4], *pp = parts; - -again: - val = 0; base = 10; - if (*cp == '0') - base = 8, cp++; - if (*cp == 'x' || *cp == 'X') - base = 16, cp++; - while ((c = *cp) != 0) { - if (isdigit((unsigned char)c)) { - val = (val * base) + (c - '0'); - cp++; - continue; - } - if (base == 16 && isxdigit((unsigned char)c)) { - val = (val << 4) + (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); - cp++; - continue; - } - break; - } - if (*cp == '.') { - if (pp >= parts + 3) - return (INADDR_NONE); - *pp++ = val, cp++; - goto again; - } - if (*cp && !isspace((unsigned char)*cp)) - return (INADDR_NONE); - *pp++ = val; - n = pp - parts; - for (val = 0, i = 0; i < n; i++) { - val <<= 8; - val |= parts[i] & 0xff; - } - return (val); -} diff --git a/cpukit/libnetworking/libc/inet_ntoa.c b/cpukit/libnetworking/libc/inet_ntoa.c deleted file mode 100644 index c67678be27..0000000000 --- a/cpukit/libnetworking/libc/inet_ntoa.c +++ /dev/null @@ -1,82 +0,0 @@ -#include - -/*- - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)inet_ntoa.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: inet_ntoa.c,v 1.2 2005/04/27 04:56:21 sra Exp $"; -#endif /* LIBC_SCCS and not lint */ -#include -__FBSDID("$FreeBSD: head/lib/libc/inet/inet_ntoa.c 314436 2017-02-28 23:42:47Z imp $"); - -#include "port_before.h" - -#include -#include -#include -#include - -#include -#include - -#include "port_after.h" - -/*% - * Convert network-format internet address - * to base 256 d.d.d.d representation. - */ -/*const*/ char * -inet_ntoa(struct in_addr in) { - static char ret[18]; - - strcpy(ret, "[inet_ntoa error]"); - (void) inet_ntop(AF_INET, &in, ret, sizeof ret); - return (ret); -} - -char * -inet_ntoa_r(struct in_addr in, char *buf, socklen_t size) -{ - - (void) inet_ntop(AF_INET, &in, buf, size); - return (buf); -} - -#ifndef __rtems__ -/* - * Weak aliases for applications that use certain private entry points, - * and fail to include . - */ -#undef inet_ntoa -__weak_reference(__inet_ntoa, inet_ntoa); -__weak_reference(__inet_ntoa_r, inet_ntoa_r); -#endif /* __rtems__ */ - -/*! \file */ diff --git a/cpukit/libnetworking/libc/inet_ntop.c b/cpukit/libnetworking/libc/inet_ntop.c deleted file mode 100644 index d070ce8e18..0000000000 --- a/cpukit/libnetworking/libc/inet_ntop.c +++ /dev/null @@ -1,208 +0,0 @@ -#include - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: inet_ntop.c,v 1.5 2005/11/03 22:59:52 marka Exp $"; -#endif /* LIBC_SCCS and not lint */ -#include -__FBSDID("$FreeBSD: head/lib/libc/inet/inet_ntop.c 298226 2016-04-18 21:05:15Z avos $"); - -#include "port_before.h" - -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include "port_after.h" - -/*% - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static const char *inet_ntop4(const u_char *src, char *dst, socklen_t size); -static const char *inet_ntop6(const u_char *src, char *dst, socklen_t size); - -/* const char * - * inet_ntop(af, src, dst, size) - * convert a network format address to presentation format. - * return: - * pointer to presentation format address (`dst'), or NULL (see errno). - * author: - * Paul Vixie, 1996. - */ -const char * -inet_ntop(int af, const void * __restrict src, char * __restrict dst, - socklen_t size) -{ - switch (af) { - case AF_INET: - return (inet_ntop4(src, dst, size)); - case AF_INET6: - return (inet_ntop6(src, dst, size)); - default: - errno = EAFNOSUPPORT; - return (NULL); - } - /* NOTREACHED */ -} - -/* const char * - * inet_ntop4(src, dst, size) - * format an IPv4 address - * return: - * `dst' (as a const) - * notes: - * (1) uses no statics - * (2) takes a u_char* not an in_addr as input - * author: - * Paul Vixie, 1996. - */ -static const char * -inet_ntop4(const u_char *src, char *dst, socklen_t size) -{ - static const char fmt[] = "%u.%u.%u.%u"; - char tmp[sizeof "255.255.255.255"]; - int l; - - l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); - if (l <= 0 || (socklen_t) l >= size) { - errno = ENOSPC; - return (NULL); - } - strlcpy(dst, tmp, size); - return (dst); -} - -/* const char * - * inet_ntop6(src, dst, size) - * convert IPv6 binary address into presentation (printable) format - * author: - * Paul Vixie, 1996. - */ -static const char * -inet_ntop6(const u_char *src, char *dst, socklen_t size) -{ - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; - struct { int base, len; } best, cur; - u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; - - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - memset(words, '\0', sizeof words); - for (i = 0; i < NS_IN6ADDRSZ; i++) - words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); - best.base = -1; - best.len = 0; - cur.base = -1; - cur.len = 0; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - if (words[i] == 0) { - if (cur.base == -1) - cur.base = i, cur.len = 1; - else - cur.len++; - } else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - cur.base = -1; - } - } - } - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - } - if (best.base != -1 && best.len < 2) - best.base = -1; - - /* - * Format the result. - */ - tp = tmp; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) - *tp++ = ':'; - continue; - } - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) - *tp++ = ':'; - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && (best.len == 6 || - (best.len == 7 && words[7] != 0x0001) || - (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) { - errno = ENOSPC; - return (NULL); - } - tp += strlen(tp); - break; - } - tp += sprintf(tp, "%x", words[i]); - } - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == - (NS_IN6ADDRSZ / NS_INT16SZ)) - *tp++ = ':'; - *tp++ = '\0'; - - /* - * Check for overflow, copy, and we're done. - */ - if ((socklen_t)(tp - tmp) > size) { - errno = ENOSPC; - return (NULL); - } - strcpy(dst, tmp); - return (dst); -} - -#ifndef __rtems__ -/* - * Weak aliases for applications that use certain private entry points, - * and fail to include . - */ -#undef inet_ntop -__weak_reference(__inet_ntop, inet_ntop); -#endif /* __rtems__ */ - -/*! \file */ diff --git a/cpukit/libnetworking/libc/inet_pton.c b/cpukit/libnetworking/libc/inet_pton.c deleted file mode 100644 index de87cf5590..0000000000 --- a/cpukit/libnetworking/libc/inet_pton.c +++ /dev/null @@ -1,216 +0,0 @@ -#include - -/* Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - -static int inet_pton4(const char *src, u_char *dst); -static int inet_pton6(const char *src, u_char *dst); - -/* int - * inet_pton(af, src, dst) - * convert from presentation format (which usually means ASCII printable) - * to network format (which is usually some kind of binary format). - * return: - * 1 if the address was valid for the specified address family - * 0 if the address wasn't valid (`dst' is untouched in this case) - * -1 if some other error occurred (`dst' is untouched in this case, too) - * author: - * Paul Vixie, 1996. - */ -int -inet_pton( - int af, - const char *src, - void *dst) -{ - switch (af) { - case AF_INET: - return (inet_pton4(src, dst)); - case AF_INET6: - return (inet_pton6(src, dst)); - default: - errno = EAFNOSUPPORT; - return (-1); - } - /* NOTREACHED */ -} - -/* int - * inet_pton4(src, dst) - * like inet_aton() but without all the hexadecimal and shorthand. - * return: - * 1 if `src' is a valid dotted quad, else 0. - * notice: - * does not touch `dst' unless it's returning 1. - * author: - * Paul Vixie, 1996. - */ -static int -inet_pton4( - const char *src, - u_char *dst) -{ - static const char digits[] = "0123456789"; - int saw_digit, octets, ch; - u_char tmp[NS_INADDRSZ], *tp; - - saw_digit = 0; - octets = 0; - *(tp = tmp) = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr(digits, ch)) != NULL) { - u_int new = *tp * 10 + (pch - digits); - - if (new > 255) - return (0); - *tp = new; - if (! saw_digit) { - if (++octets > 4) - return (0); - saw_digit = 1; - } - } else if (ch == '.' && saw_digit) { - if (octets == 4) - return (0); - *++tp = 0; - saw_digit = 0; - } else - return (0); - } - if (octets < 4) - return (0); - - memcpy(dst, tmp, NS_INADDRSZ); - return (1); -} - -/* int - * inet_pton6(src, dst) - * convert presentation level address to network order binary form. - * return: - * 1 if `src' is a valid [RFC1884 2.2] address, else 0. - * notice: - * (1) does not touch `dst' unless it's returning 1. - * (2) :: in a full address is silently ignored. - * credit: - * inspired by Mark Andrews. - * author: - * Paul Vixie, 1996. - */ -static int -inet_pton6( - const char *src, - u_char *dst) -{ - static const char xdigits_l[] = "0123456789abcdef", - xdigits_u[] = "0123456789ABCDEF"; - u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; - const char *xdigits, *curtok; - int ch, saw_xdigit; - u_int val; - - memset((tp = tmp), '\0', NS_IN6ADDRSZ); - endp = tp + NS_IN6ADDRSZ; - colonp = NULL; - /* Leading :: requires some special handling. */ - if (*src == ':') - if (*++src != ':') - return (0); - curtok = src; - saw_xdigit = 0; - val = 0; - while ((ch = *src++) != '\0') { - const char *pch; - - if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) - pch = strchr((xdigits = xdigits_u), ch); - if (pch != NULL) { - val <<= 4; - val |= (pch - xdigits); - if (val > 0xffff) - return (0); - saw_xdigit = 1; - continue; - } - if (ch == ':') { - curtok = src; - if (!saw_xdigit) { - if (colonp) - return (0); - colonp = tp; - continue; - } - if (tp + NS_INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - saw_xdigit = 0; - val = 0; - continue; - } - if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && - inet_pton4(curtok, tp) > 0) { - tp += NS_INADDRSZ; - saw_xdigit = 0; - break; /* '\0' was seen by inet_pton4(). */ - } - return (0); - } - if (saw_xdigit) { - if (tp + NS_INT16SZ > endp) - return (0); - *tp++ = (u_char) (val >> 8) & 0xff; - *tp++ = (u_char) val & 0xff; - } - if (colonp != NULL) { - /* - * Since some memmove()'s erroneously fail to handle - * overlapping regions, we'll do the shift by hand. - */ - const int n = tp - colonp; - int i; - - for (i = 1; i <= n; i++) { - endp[- i] = colonp[n - i]; - colonp[n - i] = 0; - } - tp = endp; - } - if (tp != endp) - return (0); - memcpy(dst, tmp, NS_IN6ADDRSZ); - return (1); -} diff --git a/cpukit/libnetworking/libc/linkaddr.3 b/cpukit/libnetworking/libc/linkaddr.3 deleted file mode 100644 index 6fd61c7a60..0000000000 --- a/cpukit/libnetworking/libc/linkaddr.3 +++ /dev/null @@ -1,137 +0,0 @@ -.\" Copyright (c) 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" This code is derived from software contributed to Berkeley by -.\" Donn Seeley at BSDI. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" From: @(#)linkaddr.3 8.1 (Berkeley) 7/28/93 -.\" -.Dd June 17, 1996 -.Dt LINK_ADDR 3 -.Os BSD 4.4 -.Sh NAME -.Nm link_addr , -.Nm link_ntoa -.Nd elementary address specification routines for link level access -.Sh SYNOPSIS -.Fd #include -.Fd #include -.Fd #include -.Ft void -.Fn link_addr "const char *addr" "struct sockaddr_dl *sdl" -.Ft char * -.Fn link_ntoa "const struct sockaddr_dl *sdl" -.Sh DESCRIPTION -The routine -.Fn link_addr -interprets character strings representing -link-level addresses, returning binary information suitable -for use in system calls. -The routine -.Fn link_ntoa -takes -a link-level -address and returns an -.Tn ASCII -string representing some of the information present, -including the link level address itself, and the interface name -or number, if present. -This facility is experimental and is -still subject to change. -.Pp -For -.Fn link_addr , -the string -.Fa addr -may contain -an optional network interface identifier of the form -.Dq "name unit-number" , -suitable for the first argument to -.Xr ifconfig 8 , -followed in all cases by a colon and -an interface address in the form of -groups of hexadecimal digits -separated by periods. -Each group represents a byte of address; -address bytes are filled left to right from -low order bytes through high order bytes. -.Pp -.\" A regular expression may make this format clearer: -.\" .Bd -literal -offset indent -.\" ([a-z]+[0-9]+:)?[0-9a-f]+(\e.[0-9a-f]+)* -.\" .Ed -.\" .Pp -Thus -.Li le0:8.0.9.13.d.30 -represents an ethernet address -to be transmitted on the first Lance ethernet interface. -.Pp -The direct use of these functions is deprecated in favor of the -.Xr addr2ascii 3 -interface; however, portable programs cannot rely on the latter as it is -not yet widely implemented. -.Sh RETURN VALUES -.Fn link_ntoa -always returns a null terminated string. -.Fn link_addr -has no return value. -(See -.Sx BUGS . ) -.Sh SEE ALSO -.Xr addr2ascii 3 -.\" .Xr iso 4 -.Sh HISTORY -The -.Fn link_addr -and -.Fn link_ntoa -functions appeared in -.Bx 4.3 Reno . -.Sh BUGS -The returned values for link_ntoa -reside in a static memory area. -.Pp -The function -.Fn link_addr -should diagnose improperly formed input, and there should be an unambiguous -way to recognize this. -.Pp -If the -.Va sdl_len -field of the link socket address -.Fa sdl -is 0, -.Fn link_ntoa -will not insert a colon before the interface address bytes. -If this translated address is given to -.Fn link_addr -without inserting an initial colon, -the latter will not interpret it correctly. diff --git a/cpukit/libnetworking/libc/linkaddr.c b/cpukit/libnetworking/libc/linkaddr.c deleted file mode 100644 index dee7cb716f..0000000000 --- a/cpukit/libnetworking/libc/linkaddr.c +++ /dev/null @@ -1,164 +0,0 @@ -#include - -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#endif - -/* States*/ -#define NAMING 0 -#define GOTONE 1 -#define GOTTWO 2 -#define RESET 3 -/* Inputs */ -#define DIGIT (4*0) -#define END (4*1) -#define DELIM (4*2) -#define LETTER (4*3) - -void -link_addr( - const char *addr, - struct sockaddr_dl *sdl) -{ - char *cp = sdl->sdl_data; - char *cplim = sdl->sdl_len + (char *)sdl; - int byte = 0, state = NAMING, - new=0; /* new=0 to avoid warning */ - - bzero((char *)&sdl->sdl_family, sdl->sdl_len - 1); - sdl->sdl_family = AF_LINK; - do { - state &= ~LETTER; - if ((*addr >= '0') && (*addr <= '9')) { - new = *addr - '0'; - } else if ((*addr >= 'a') && (*addr <= 'f')) { - new = *addr - 'a' + 10; - } else if ((*addr >= 'A') && (*addr <= 'F')) { - new = *addr - 'A' + 10; - } else if (*addr == 0) { - state |= END; - } else if (state == NAMING && - (((*addr >= 'A') && (*addr <= 'Z')) || - ((*addr >= 'a') && (*addr <= 'z')))) - state |= LETTER; - else - state |= DELIM; - addr++; - switch (state /* | INPUT */) { - case NAMING | DIGIT: - case NAMING | LETTER: - *cp++ = addr[-1]; - continue; - case NAMING | DELIM: - state = RESET; - sdl->sdl_nlen = cp - sdl->sdl_data; - continue; - case GOTTWO | DIGIT: - *cp++ = byte; - /* FALLTHROUGH */ - case RESET | DIGIT: - state = GOTONE; - byte = new; - continue; - case GOTONE | DIGIT: - state = GOTTWO; - byte = new + (byte << 4); - continue; - default: /* | DELIM */ - state = RESET; - *cp++ = byte; - byte = 0; - continue; - case GOTONE | END: - case GOTTWO | END: - *cp++ = byte; - /* FALLTHROUGH */ - case RESET | END: - break; - } - break; - } while (cp < cplim); - sdl->sdl_alen = cp - LLADDR(sdl); - new = cp - (char *)sdl; - if (new > sizeof(*sdl)) - sdl->sdl_len = new; - return; -} - -static char hexlist[] = "0123456789abcdef"; - -char * -link_ntoa( - const struct sockaddr_dl *sdl) -{ - static char obuf[64]; - char *out = obuf; - int i; - u_char *in = (u_char *)LLADDR(sdl); - u_char *inlim = in + sdl->sdl_alen; - int firsttime = 1; - - if (sdl->sdl_nlen) { - memcpy(obuf, sdl->sdl_data, sdl->sdl_nlen); - out += sdl->sdl_nlen; - if (sdl->sdl_alen) - *out++ = ':'; - } - while (in < inlim) { - if (firsttime) - firsttime = 0; - else - *out++ = '.'; - i = *in++; - if (i > 0xf) { - out[1] = hexlist[i & 0xf]; - i >>= 4; - out[0] = hexlist[i]; - out += 2; - } else - *out++ = hexlist[i]; - } - *out = 0; - return (obuf); -} diff --git a/cpukit/libnetworking/libc/map_v4v6.c b/cpukit/libnetworking/libc/map_v4v6.c deleted file mode 100644 index 529262d01e..0000000000 --- a/cpukit/libnetworking/libc/map_v4v6.c +++ /dev/null @@ -1,128 +0,0 @@ -#include - -/* - * ++Copyright++ 1985, 1988, 1993 - * - - * Copyright (c) 1985, 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - - * --Copyright-- - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -typedef union { - int32_t al; - char ac; -} align; - -void -_map_v4v6_address(const char *src, char *dst) -{ - u_char *p = (u_char *)dst; - char tmp[INADDRSZ]; - int i; - - /* Stash a temporary copy so our caller can update in place. */ - memcpy(tmp, src, INADDRSZ); - /* Mark this ipv6 addr as a mapped ipv4. */ - for (i = 0; i < 10; i++) - *p++ = 0x00; - *p++ = 0xff; - *p++ = 0xff; - /* Retrieve the saved copy and we're done. */ - memcpy((void*)p, tmp, INADDRSZ); -} - -void -_map_v4v6_hostent( - struct hostent *hp, - char **bpp, - int *lenp) -{ - char **ap; - - if (hp->h_addrtype != AF_INET || hp->h_length != INADDRSZ) - return; - hp->h_addrtype = AF_INET6; - hp->h_length = IN6ADDRSZ; - for (ap = hp->h_addr_list; *ap; ap++) { - int i = sizeof(align) - ((uintptr_t)*bpp % sizeof(align)); - - if (*lenp < (i + IN6ADDRSZ)) { - /* Out of memory. Truncate address list here. XXX */ - *ap = NULL; - return; - } - *bpp += i; - *lenp -= i; - _map_v4v6_address(*ap, *bpp); - *ap = *bpp; - *bpp += IN6ADDRSZ; - *lenp -= IN6ADDRSZ; - } -} diff --git a/cpukit/libnetworking/libc/ns.3 b/cpukit/libnetworking/libc/ns.3 deleted file mode 100644 index 71e60afb8c..0000000000 --- a/cpukit/libnetworking/libc/ns.3 +++ /dev/null @@ -1,130 +0,0 @@ -.\" Copyright (c) 1986, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ns.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd June 4, 1993 -.Dt NS 3 -.Os BSD 4.3 -.Sh NAME -.Nm ns_addr , -.Nm ns_ntoa -.Nd Xerox -.Tn NS Ns (tm) -address conversion routines -.Sh SYNOPSIS -.Fd #include -.Fd #include -.Ft struct ns_addr -.Fn ns_addr "char *cp" -.Ft char * -.Fn ns_ntoa "struct ns_addr ns" -.Sh DESCRIPTION -The routine -.Fn ns_addr -interprets character strings representing -.Tn XNS -addresses, returning binary information suitable -for use in system calls. -The routine -.Fn ns_ntoa -takes -.Tn XNS -addresses and returns -.Tn ASCII -strings representing the address in a -notation in common use in the Xerox Development Environment: -.Bd -filled -offset indent -.. -.Ed -.Pp -Trailing zero fields are suppressed, and each number is printed in hexadecimal, -in a format suitable for input to -.Fn ns_addr . -Any fields lacking super-decimal digits will have a -trailing -.Ql H -appended. -.Pp -Unfortunately, no universal standard exists for representing -.Tn XNS -addresses. -An effort has been made to insure that -.Fn ns_addr -be compatible with most formats in common use. -It will first separate an address into 1 to 3 fields using a single delimiter -chosen from -period -.Ql \&. , -colon -.Ql \&: -or pound-sign -.Ql \&# . -Each field is then examined for byte separators (colon or period). -If there are byte separators, each subfield separated is taken to be -a small hexadecimal number, and the entirety is taken as a network-byte-ordered -quantity to be zero extended in the high-network-order bytes. -Next, the field is inspected for hyphens, in which case -the field is assumed to be a number in decimal notation -with hyphens separating the millenia. -Next, the field is assumed to be a number: -It is interpreted -as hexadecimal if there is a leading -.Ql 0x -(as in C), -a trailing -.Ql H -(as in Mesa), or there are any super-decimal digits present. -It is interpreted as octal is there is a leading -.Ql 0 -and there are no super-octal digits. -Otherwise, it is converted as a decimal number. -.Sh RETURN VALUES -None. (See -.Sx BUGS . ) -.Sh SEE ALSO -.Xr hosts 5 , -.Xr networks 5 -.Sh HISTORY -The -.Fn ns_addr -and -.Fn ns_toa -functions appeared in -.Bx 4.3 . -.Sh BUGS -The string returned by -.Fn ns_ntoa -resides in a static memory area. -The function -.Fn ns_addr -should diagnose improperly formed input, and there should be an unambiguous -way to recognize this. diff --git a/cpukit/libnetworking/libc/ns_name.c b/cpukit/libnetworking/libc/ns_name.c deleted file mode 100644 index 2032171ea2..0000000000 --- a/cpukit/libnetworking/libc/ns_name.c +++ /dev/null @@ -1,595 +0,0 @@ -#include - -/* - * Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include - -#include -#include -#include - -/* Data. */ - -static char digits[] = "0123456789"; - -/* Forward. */ - -static int special(int); -static int printable(int); -static int dn_find(const u_char *, const u_char *, - const u_char * const *, - const u_char * const *); - -/* Public. */ - -/* - * ns_name_ntop(src, dst, dstsiz) - * Convert an encoded domain name to printable ascii as per RFC1035. - * return: - * Number of bytes written to buffer, or -1 (with errno set) - * notes: - * The root is returned as "." - * All other domains are returned in non absolute form - */ -int -ns_name_ntop(const u_char *src, char *dst, size_t dstsiz) { - const u_char *cp; - char *dn, *eom; - u_char c; - u_int n; - - cp = src; - dn = dst; - eom = dst + dstsiz; - - while ((n = *cp++) != 0) { - if ((n & NS_CMPRSFLGS) != 0) { - /* Some kind of compression pointer. */ - errno = EMSGSIZE; - return (-1); - } - if (dn != dst) { - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '.'; - } - if (dn + n >= eom) { - errno = EMSGSIZE; - return (-1); - } - for ((void)NULL; n > 0; n--) { - c = *cp++; - if (special(c)) { - if (dn + 1 >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '\\'; - *dn++ = (char)c; - } else if (!printable(c)) { - if (dn + 3 >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '\\'; - *dn++ = digits[c / 100]; - *dn++ = digits[(c % 100) / 10]; - *dn++ = digits[c % 10]; - } else { - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = (char)c; - } - } - } - if (dn == dst) { - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '.'; - } - if (dn >= eom) { - errno = EMSGSIZE; - return (-1); - } - *dn++ = '\0'; - return (dn - dst); -} - -/* - * ns_name_pton(src, dst, dstsiz) - * Convert a ascii string into an encoded domain name as per RFC1035. - * return: - * -1 if it fails - * 1 if string was fully qualified - * 0 is string was not fully qualified - * notes: - * Enforces label and domain length limits. - */ - -int -ns_name_pton(const char *src, u_char *dst, size_t dstsiz) { - u_char *label, *bp, *eom; - int c, n, escaped; - char *cp; - - escaped = 0; - bp = dst; - eom = dst + dstsiz; - label = bp++; - - while ((c = *src++) != 0) { - if (escaped) { - if ((cp = strchr(digits, c)) != NULL) { - n = (cp - digits) * 100; - if ((c = *src++) == 0 || - (cp = strchr(digits, c)) == NULL) { - errno = EMSGSIZE; - return (-1); - } - n += (cp - digits) * 10; - if ((c = *src++) == 0 || - (cp = strchr(digits, c)) == NULL) { - errno = EMSGSIZE; - return (-1); - } - n += (cp - digits); - if (n > 255) { - errno = EMSGSIZE; - return (-1); - } - c = n; - } - escaped = 0; - } else if (c == '\\') { - escaped = 1; - continue; - } else if (c == '.') { - c = (bp - label - 1); - if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */ - errno = EMSGSIZE; - return (-1); - } - if (label >= eom) { - errno = EMSGSIZE; - return (-1); - } - *label = c; - /* Fully qualified ? */ - if (*src == '\0') { - if (c != 0) { - if (bp >= eom) { - errno = EMSGSIZE; - return (-1); - } - *bp++ = '\0'; - } - if ((bp - dst) > MAXCDNAME) { - errno = EMSGSIZE; - return (-1); - } - return (1); - } - if (c == 0) { - errno = EMSGSIZE; - return (-1); - } - label = bp++; - continue; - } - if (bp >= eom) { - errno = EMSGSIZE; - return (-1); - } - *bp++ = (u_char)c; - } - c = (bp - label - 1); - if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */ - errno = EMSGSIZE; - return (-1); - } - if (label >= eom) { - errno = EMSGSIZE; - return (-1); - } - *label = c; - if (c != 0) { - if (bp >= eom) { - errno = EMSGSIZE; - return (-1); - } - *bp++ = 0; - } - if ((bp - dst) > MAXCDNAME) { /* src too big */ - errno = EMSGSIZE; - return (-1); - } - return (0); -} - -/* - * ns_name_unpack(msg, eom, src, dst, dstsiz) - * Unpack a domain name from a message, source may be compressed. - * return: - * -1 if it fails, or consumed octets if it succeeds. - */ -int -ns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src, - u_char *dst, size_t dstsiz) -{ - const u_char *srcp, *dstlim; - u_char *dstp; - int n, len, checked; - - len = -1; - checked = 0; - dstp = dst; - srcp = src; - dstlim = dst + dstsiz; - if (srcp < msg || srcp >= eom) { - errno = EMSGSIZE; - return (-1); - } - /* Fetch next label in domain name. */ - while ((n = *srcp++) != 0) { - /* Check for indirection. */ - switch (n & NS_CMPRSFLGS) { - case 0: - /* Limit checks. */ - if (dstp + n + 1 >= dstlim || srcp + n >= eom) { - errno = EMSGSIZE; - return (-1); - } - checked += n + 1; - *dstp++ = n; - memcpy(dstp, srcp, n); - dstp += n; - srcp += n; - break; - - case NS_CMPRSFLGS: - if (srcp >= eom) { - errno = EMSGSIZE; - return (-1); - } - if (len < 0) - len = srcp - src + 1; - srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff)); - if (srcp < msg || srcp >= eom) { /* Out of range. */ - errno = EMSGSIZE; - return (-1); - } - checked += 2; - /* - * Check for loops in the compressed name; - * if we've looked at the whole message, - * there must be a loop. - */ - if (checked >= eom - msg) { - errno = EMSGSIZE; - return (-1); - } - break; - - default: - errno = EMSGSIZE; - return (-1); /* flag error */ - } - } - *dstp = '\0'; - if (len < 0) - len = srcp - src; - return (len); -} - -/* - * ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr) - * Pack domain name 'domain' into 'comp_dn'. - * return: - * Size of the compressed name, or -1. - * notes: - * 'dnptrs' is an array of pointers to previous compressed names. - * dnptrs[0] is a pointer to the beginning of the message. The array - * ends with NULL. - * 'lastdnptr' is a pointer to the end of the array pointed to - * by 'dnptrs'. - * Side effects: - * The list of pointers in dnptrs is updated for labels inserted into - * the message as we compress the name. If 'dnptr' is NULL, we don't - * try to compress names. If 'lastdnptr' is NULL, we don't update the - * list. - */ -int -ns_name_pack(const u_char *src, u_char *dst, int dstsiz, - const u_char **dnptrs, const u_char **lastdnptr) -{ - u_char *dstp; - const u_char **cpp, **lpp, *eob, *msg; - const u_char *srcp; - int n, l; - - srcp = src; - dstp = dst; - eob = dstp + dstsiz; - lpp = cpp = NULL; - if (dnptrs != NULL) { - if ((msg = *dnptrs++) != NULL) { - for (cpp = dnptrs; *cpp != NULL; cpp++) - (void)NULL; - lpp = cpp; /* end of list to search */ - } - } else - msg = NULL; - - /* make sure the domain we are about to add is legal */ - l = 0; - do { - n = *srcp; - if ((n & NS_CMPRSFLGS) != 0) { - errno = EMSGSIZE; - return (-1); - } - l += n + 1; - if (l > MAXCDNAME) { - errno = EMSGSIZE; - return (-1); - } - srcp += n + 1; - } while (n != 0); - - srcp = src; - do { - /* Look to see if we can use pointers. */ - n = *srcp; - if (n != 0 && msg != NULL) { - l = dn_find(srcp, msg, (const u_char * const *)dnptrs, - (const u_char * const *)lpp); - if (l >= 0) { - if (dstp + 1 >= eob) { - errno = EMSGSIZE; - return (-1); - } - *dstp++ = (l >> 8) | NS_CMPRSFLGS; - *dstp++ = l % 256; - return (dstp - dst); - } - /* Not found, save it. */ - if (lastdnptr != NULL && cpp < lastdnptr - 1 && - (dstp - msg) < 0x4000) { - *cpp++ = dstp; - *cpp = NULL; - } - } - /* copy label to buffer */ - if (n & NS_CMPRSFLGS) { /* Should not happen. */ - errno = EMSGSIZE; - return (-1); - } - if (dstp + 1 + n >= eob) { - errno = EMSGSIZE; - return (-1); - } - memcpy(dstp, srcp, n + 1); - srcp += n + 1; - dstp += n + 1; - } while (n != 0); - - if (dstp > eob) { - if (msg != NULL) - *lpp = NULL; - errno = EMSGSIZE; - return (-1); - } - return (dstp - dst); -} - -/* - * ns_name_uncompress(msg, eom, src, dst, dstsiz) - * Expand compressed domain name to presentation format. - * return: - * Number of bytes read out of `src', or -1 (with errno set). - * note: - * Root domain returns as "." not "". - */ -int -ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src, - char *dst, size_t dstsiz) -{ - u_char tmp[NS_MAXCDNAME]; - int n; - - if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1) - return (-1); - if (ns_name_ntop(tmp, dst, dstsiz) == -1) - return (-1); - return (n); -} - -/* - * ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr) - * Compress a domain name into wire format, using compression pointers. - * return: - * Number of bytes consumed in `dst' or -1 (with errno set). - * notes: - * 'dnptrs' is an array of pointers to previous compressed names. - * dnptrs[0] is a pointer to the beginning of the message. - * The list ends with NULL. 'lastdnptr' is a pointer to the end of the - * array pointed to by 'dnptrs'. Side effect is to update the list of - * pointers for labels inserted into the message as we compress the name. - * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr' - * is NULL, we don't update the list. - */ -int -ns_name_compress(const char *src, u_char *dst, size_t dstsiz, - const u_char **dnptrs, const u_char **lastdnptr) -{ - u_char tmp[NS_MAXCDNAME]; - - if (ns_name_pton(src, tmp, sizeof tmp) == -1) - return (-1); - return (ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr)); -} - -/* - * ns_name_skip(ptrptr, eom) - * Advance *ptrptr to skip over the compressed name it points at. - * return: - * 0 on success, -1 (with errno set) on failure. - */ -int -ns_name_skip(const u_char **ptrptr, const u_char *eom) { - const u_char *cp; - u_int n; - - cp = *ptrptr; - while (cp < eom && (n = *cp++) != 0) { - /* Check for indirection. */ - switch (n & NS_CMPRSFLGS) { - case 0: /* normal case, n == len */ - cp += n; - continue; - case NS_CMPRSFLGS: /* indirection */ - cp++; - break; - default: /* illegal type */ - errno = EMSGSIZE; - return (-1); - } - break; - } - if (cp > eom) { - errno = EMSGSIZE; - return (-1); - } - *ptrptr = cp; - return (0); -} - -/* Private. */ - -/* - * special(ch) - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this characted special ("in need of quoting") ? - * return: - * boolean. - */ -static int -special(int ch) { - switch (ch) { - case 0x22: /* '"' */ - case 0x2E: /* '.' */ - case 0x3B: /* ';' */ - case 0x5C: /* '\\' */ - /* Special modifiers in zone files. */ - case 0x40: /* '@' */ - case 0x24: /* '$' */ - return (1); - default: - return (0); - } -} - -/* - * printable(ch) - * Thinking in noninternationalized USASCII (per the DNS spec), - * is this character visible and not a space when printed ? - * return: - * boolean. - */ -static int -printable(int ch) { - return (ch > 0x20 && ch < 0x7f); -} - -/* - * Thinking in noninternationalized USASCII (per the DNS spec), - * convert this character to lower case if it's upper case. - */ -static int -mklower(int ch) { - if (ch >= 0x41 && ch <= 0x5A) - return (ch + 0x20); - return (ch); -} - -/* - * dn_find(domain, msg, dnptrs, lastdnptr) - * Search for the counted-label name in an array of compressed names. - * return: - * offset from msg if found, or -1. - * notes: - * dnptrs is the pointer to the first name on the list, - * not the pointer to the start of the message. - */ -static int -dn_find(const u_char *domain, const u_char *msg, - const u_char * const *dnptrs, - const u_char * const *lastdnptr) -{ - const u_char *dn, *cp, *sp; - const u_char * const *cpp; - u_int n; - - for (cpp = dnptrs; cpp < lastdnptr; cpp++) { - dn = domain; - sp = cp = *cpp; - while ((n = *cp++) != 0) { - /* - * check for indirection - */ - switch (n & NS_CMPRSFLGS) { - case 0: /* normal case, n == len */ - if (n != *dn++) - goto next; - for ((void)NULL; n > 0; n--) - if (mklower(*dn++) != mklower(*cp++)) - goto next; - /* Is next root for both ? */ - if (*dn == '\0' && *cp == '\0') - return (sp - msg); - if (*dn) - continue; - goto next; - - case NS_CMPRSFLGS: /* indirection */ - cp = msg + (((n & 0x3f) << 8) | *cp); - break; - - default: /* illegal type */ - errno = EMSGSIZE; - return (-1); - } - } - next: ; - } - errno = ENOENT; - return (-1); -} diff --git a/cpukit/libnetworking/libc/ns_netint.c b/cpukit/libnetworking/libc/ns_netint.c deleted file mode 100644 index da28e68e61..0000000000 --- a/cpukit/libnetworking/libc/ns_netint.c +++ /dev/null @@ -1,56 +0,0 @@ -#include - -/* - * Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* Import. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include -#include - -u_int -ns_get16(const u_char *src) { - u_int dst; - - NS_GET16(dst, src); - return (dst); -} - -u_long -ns_get32(const u_char *src) { - u_long dst; - - NS_GET32(dst, src); - return (dst); -} - -void -ns_put16(u_int src, u_char *dst) { - NS_PUT16(src, dst); -} - -void -ns_put32(u_long src, u_char *dst) { - NS_PUT32(src, dst); -} diff --git a/cpukit/libnetworking/libc/ns_parse.c b/cpukit/libnetworking/libc/ns_parse.c deleted file mode 100644 index c82c90c0b4..0000000000 --- a/cpukit/libnetworking/libc/ns_parse.c +++ /dev/null @@ -1,192 +0,0 @@ -#include - -/* - * Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include - -#include -#include -#include - -/* These need to be in the same order as the nres.h:ns_flag enum. */ -struct _ns_flagdata _ns_flagdata[16] = { - { 0x8000, 15 }, /* qr. */ - { 0x7800, 11 }, /* opcode. */ - { 0x0400, 10 }, /* aa. */ - { 0x0200, 9 }, /* tc. */ - { 0x0100, 8 }, /* rd. */ - { 0x0080, 7 }, /* ra. */ - { 0x0040, 6 }, /* z. */ - { 0x0020, 5 }, /* ad. */ - { 0x0010, 4 }, /* cd. */ - { 0x000f, 0 }, /* rcode. */ - { 0x0000, 0 }, /* expansion (1/6). */ - { 0x0000, 0 }, /* expansion (2/6). */ - { 0x0000, 0 }, /* expansion (3/6). */ - { 0x0000, 0 }, /* expansion (4/6). */ - { 0x0000, 0 }, /* expansion (5/6). */ - { 0x0000, 0 }, /* expansion (6/6). */ -}; - -static int -skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) { - const u_char *optr = ptr; - - for ((void)NULL; count > 0; count--) { - int b, rdlength; - - b = dn_skipname(ptr, eom); - if (b < 0) - goto emsgsize; - ptr += b/*Name*/ + NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/; - if (section != ns_s_qd) { - if (ptr + NS_INT32SZ > eom) - goto emsgsize; - ptr += NS_INT32SZ/*TTL*/; - if (ptr + NS_INT16SZ > eom) - goto emsgsize; - NS_GET16(rdlength, ptr); - ptr += rdlength/*RData*/; - } - } - if (ptr > eom) - goto emsgsize; - return (ptr - optr); - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -int -ns_initparse(const u_char *msg, int msglen, ns_msg *handle) { - const u_char *eom = msg + msglen; - int i; - - memset(handle, 0x5e, sizeof *handle); - handle->_msg = msg; - handle->_eom = eom; - if (msg + NS_INT16SZ > eom) - goto emsgsize; - NS_GET16(handle->_id, msg); - if (msg + NS_INT16SZ > eom) - goto emsgsize; - NS_GET16(handle->_flags, msg); - for (i = 0; i < ns_s_max; i++) { - if (msg + NS_INT16SZ > eom) - goto emsgsize; - NS_GET16(handle->_counts[i], msg); - } - for (i = 0; i < ns_s_max; i++) - if (handle->_counts[i] == 0) - handle->_sections[i] = NULL; - else { - int b = skiprr(msg, eom, (ns_sect)i, - handle->_counts[i]); - - if (b < 0) - return (-1); - handle->_sections[i] = msg; - msg += b; - } - if (msg != eom) - goto emsgsize; - handle->_sect = ns_s_max; - handle->_rrnum = -1; - handle->_ptr = NULL; - return (0); - emsgsize: - errno = EMSGSIZE; - return (-1); -} - -int -ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) { - int b; - - /* Make section right. */ - if ( /* section < 0 || */ section >= ns_s_max) - goto enodev; - if ((int)section != (int)handle->_sect) { - handle->_sect = section; - handle->_rrnum = 0; - handle->_ptr = handle->_sections[(int)section]; - } - - /* Make rrnum right. */ - if (rrnum == -1) - rrnum = handle->_rrnum; - if (rrnum < 0 || rrnum >= handle->_counts[(int)section]) - goto enodev; - if (rrnum < handle->_rrnum) { - handle->_rrnum = 0; - handle->_ptr = handle->_sections[(int)section]; - } - - b = skiprr(handle->_msg, handle->_eom, section, - rrnum - handle->_rrnum); - if (b < 0) - return (-1); - handle->_ptr += b; - handle->_rrnum = rrnum; - - /* Do the parse. */ - b = dn_expand(handle->_msg, handle->_eom, - handle->_ptr, rr->name, NS_MAXDNAME); - if (b < 0) - return (-1); - handle->_ptr += b; - if (handle->_ptr + NS_INT16SZ > handle->_eom) - goto emsgsize; - NS_GET16(rr->type, handle->_ptr); - if (handle->_ptr + NS_INT16SZ > handle->_eom) - goto emsgsize; - NS_GET16(rr->rr_class, handle->_ptr); - if (section == ns_s_qd) { - rr->ttl = 0; - rr->rdlength = 0; - rr->rdata = NULL; - } else { - if (handle->_ptr + NS_INT32SZ > handle->_eom) - goto emsgsize; - NS_GET32(rr->ttl, handle->_ptr); - if (handle->_ptr + NS_INT16SZ > handle->_eom) - goto emsgsize; - NS_GET16(rr->rdlength, handle->_ptr); - if (handle->_ptr + rr->rdlength > handle->_eom) - goto emsgsize; - rr->rdata = handle->_ptr; - handle->_ptr += rr->rdlength; - } - handle->_rrnum++; - - /* All done. */ - return (0); - enodev: - errno = ENODEV; - return (-1); - emsgsize: - errno = EMSGSIZE; - return (-1); -} diff --git a/cpukit/libnetworking/libc/ns_print.c b/cpukit/libnetworking/libc/ns_print.c deleted file mode 100644 index 0760f99b14..0000000000 --- a/cpukit/libnetworking/libc/ns_print.c +++ /dev/null @@ -1,748 +0,0 @@ -#include - -/* - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* Import. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#endif -#include - -#define SPRINTF(x) ((size_t)sprintf x) - -/* Forward. */ - -static size_t prune_origin(const char *name, const char *origin); -static int charstr(const u_char *rdata, const u_char *edata, - char **buf, size_t *buflen); -static int addname(const u_char *msg, size_t msglen, - const u_char **p, const char *origin, - char **buf, size_t *buflen); -static void addlen(size_t len, char **buf, size_t *buflen); -static int addstr(const char *src, size_t len, - char **buf, size_t *buflen); -static int addtab(size_t len, size_t target, int spaced, - char **buf, size_t *buflen); - -/* Macros. */ - -#define T(x) \ - do { \ - if ((x) < 0) \ - return (-1); \ - } while (0) - -/* Public. */ - -/* - * int - * ns_sprintrr(handle, rr, name_ctx, origin, buf, buflen) - * Convert an RR to presentation format. - * return: - * Number of characters written to buf, or -1 (check errno). - */ -int -ns_sprintrr(const ns_msg *handle, const ns_rr *rr, - const char *name_ctx, const char *origin, - char *buf, size_t buflen) -{ - int n; - - n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle), - ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr), - ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr), - name_ctx, origin, buf, buflen); - return (n); -} - -/* - * int - * ns_sprintrrf(msg, msglen, name, class, type, ttl, rdata, rdlen, - * name_ctx, origin, buf, buflen) - * Convert the fields of an RR into presentation format. - * return: - * Number of characters written to buf, or -1 (check errno). - */ -int -ns_sprintrrf(const u_char *msg, size_t msglen, - const char *name, ns_class class, ns_type type, - u_long ttl, const u_char *rdata, size_t rdlen, - const char *name_ctx, const char *origin, - char *buf, size_t buflen) -{ - const char *obuf = buf; - const u_char *edata = rdata + rdlen; - int spaced = 0; - - const char *comment; - char tmp[100]; - int len, x; - - /* - * Owner. - */ - if (name_ctx != NULL && strcasecmp(name_ctx, name) == 0) { - T(addstr("\t\t\t", 3, &buf, &buflen)); - } else { - len = prune_origin(name, origin); - if (len == 0) { - T(addstr("@\t\t\t", 4, &buf, &buflen)); - } else { - T(addstr(name, len, &buf, &buflen)); - /* Origin not used and no trailing dot? */ - if ((!origin || !origin[0] || name[len] == '\0') && - name[len - 1] != '.') { - T(addstr(".", 1, &buf, &buflen)); - len++; - } - T(spaced = addtab(len, 24, spaced, &buf, &buflen)); - } - } - - /* - * TTL, Class, Type. - */ - T(x = ns_format_ttl(ttl, buf, buflen)); - addlen(x, &buf, &buflen); - len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type))); - T(addstr(tmp, len, &buf, &buflen)); - T(spaced = addtab(x + len, 16, spaced, &buf, &buflen)); - - /* - * RData. - */ - switch (type) { - case ns_t_a: - if (rdlen != NS_INADDRSZ) - goto formerr; - (void) inet_ntop(AF_INET, rdata, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - break; - - case ns_t_cname: - case ns_t_mb: - case ns_t_mg: - case ns_t_mr: - case ns_t_ns: - case ns_t_ptr: - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - break; - - case ns_t_hinfo: - case ns_t_isdn: - /* First word. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Second word. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - break; - - case ns_t_soa: { - u_long t; - - /* Server name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Administrator name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" (\n", 3, &buf, &buflen)); - spaced = 0; - - if ((edata - rdata) != 5*NS_INT32SZ) - goto formerr; - - /* Serial number. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - len = SPRINTF((tmp, "%lu", t)); - T(addstr(tmp, len, &buf, &buflen)); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; serial\n", 9, &buf, &buflen)); - spaced = 0; - - /* Refresh interval. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; refresh\n", 10, &buf, &buflen)); - spaced = 0; - - /* Retry interval. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; retry\n", 8, &buf, &buflen)); - spaced = 0; - - /* Expiry. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; expiry\n", 9, &buf, &buflen)); - spaced = 0; - - /* Minimum TTL. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); - T(len = ns_format_ttl(t, buf, buflen)); - addlen(len, &buf, &buflen); - T(addstr(" )", 2, &buf, &buflen)); - T(spaced = addtab(len, 16, spaced, &buf, &buflen)); - T(addstr("; minimum\n", 10, &buf, &buflen)); - - break; - } - - case ns_t_mx: - case ns_t_afsdb: - case ns_t_rt: { - u_int t; - - if (rdlen < NS_INT16SZ) - goto formerr; - - /* Priority. */ - t = ns_get16(rdata); - rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u ", t)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Target. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - } - - case ns_t_px: { - u_int t; - - if (rdlen < NS_INT16SZ) - goto formerr; - - /* Priority. */ - t = ns_get16(rdata); - rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u ", t)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Name1. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Name2. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - } - - case ns_t_x25: - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - break; - - case ns_t_txt: - while (rdata < edata) { - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - if (rdata < edata) - T(addstr(" ", 1, &buf, &buflen)); - } - break; - - case ns_t_nsap: { - char t[255*3]; - - (void) inet_nsap_ntoa(rdlen, rdata, t); - T(addstr(t, strlen(t), &buf, &buflen)); - break; - } - - case ns_t_aaaa: - if (rdlen != NS_IN6ADDRSZ) - goto formerr; - (void) inet_ntop(AF_INET6, rdata, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - break; - - case ns_t_loc: { - char t[255]; - - /* XXX protocol format checking? */ - (void) loc_ntoa(rdata, t); - T(addstr(t, strlen(t), &buf, &buflen)); - break; - } - - case ns_t_naptr: { - u_int order, preference; - char t[50]; - - if (rdlen < 2*NS_INT16SZ) - goto formerr; - - /* Order, Precedence. */ - order = ns_get16(rdata); rdata += NS_INT16SZ; - preference = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((t, "%u %u ", order, preference)); - T(addstr(t, len, &buf, &buflen)); - - /* Flags. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Service. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Regexp. */ - T(len = charstr(rdata, edata, &buf, &buflen)); - if (len < 0) - return (-1); - if (len == 0) - goto formerr; - rdata += len; - T(addstr(" ", 1, &buf, &buflen)); - - /* Server. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - break; - } - - case ns_t_srv: { - u_int priority, weight, port; - char t[50]; - - if (rdlen < NS_INT16SZ*3) - goto formerr; - - /* Priority, Weight, Port. */ - priority = ns_get16(rdata); rdata += NS_INT16SZ; - weight = ns_get16(rdata); rdata += NS_INT16SZ; - port = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((t, "%u %u %u ", priority, weight, port)); - T(addstr(t, len, &buf, &buflen)); - - /* Server. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - break; - } - - case ns_t_minfo: - case ns_t_rp: - /* Name1. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - T(addstr(" ", 1, &buf, &buflen)); - - /* Name2. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - break; - - case ns_t_wks: { - int n, lcnt; - - if (rdlen < NS_INT32SZ + 1) - goto formerr; - - /* Address. */ - (void) inet_ntop(AF_INET, rdata, buf, buflen); - addlen(strlen(buf), &buf, &buflen); - rdata += NS_INADDRSZ; - - /* Protocol. */ - len = SPRINTF((tmp, " %u ( ", *rdata)); - T(addstr(tmp, len, &buf, &buflen)); - rdata += NS_INT8SZ; - - /* Bit map. */ - n = 0; - lcnt = 0; - while (rdata < edata) { - u_int c = *rdata++; - do { - if (c & 0200) { - if (lcnt == 0) { - T(addstr("\n\t\t\t\t", 5, - &buf, &buflen)); - lcnt = 10; - spaced = 0; - } - len = SPRINTF((tmp, "%d ", n)); - T(addstr(tmp, len, &buf, &buflen)); - lcnt--; - } - c <<= 1; - } while (++n & 07); - } - T(addstr(")", 1, &buf, &buflen)); - - break; - } - - case ns_t_key: { - char base64_key[NS_MD5RSA_MAX_BASE64]; - u_int keyflags, protocol, algorithm; - const char *leader; - int n; - - if (rdlen < NS_INT16SZ + NS_INT8SZ + NS_INT8SZ) - goto formerr; - - /* Key flags, Protocol, Algorithm. */ - keyflags = ns_get16(rdata); rdata += NS_INT16SZ; - protocol = *rdata++; - algorithm = *rdata++; - len = SPRINTF((tmp, "0x%04x %u %u", - keyflags, protocol, algorithm)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Public key data. */ - len = b64_ntop(rdata, edata - rdata, - base64_key, sizeof base64_key); - if (len < 0) - goto formerr; - if (len > 15) { - T(addstr(" (", 2, &buf, &buflen)); - leader = "\n\t\t"; - spaced = 0; - } else - leader = " "; - for (n = 0; n < len; n += 48) { - T(addstr(leader, strlen(leader), &buf, &buflen)); - T(addstr(base64_key + n, MIN(len - n, 48), - &buf, &buflen)); - } - if (len > 15) - T(addstr(" )", 2, &buf, &buflen)); - - break; - } - - case ns_t_sig: { - char base64_key[NS_MD5RSA_MAX_BASE64]; - u_int type, algorithm, labels, footprint; - const char *leader; - u_long t; - int n; - - if (rdlen < 22) - goto formerr; - - /* Type covered, Algorithm, Label count, Original TTL. */ - type = ns_get16(rdata); rdata += NS_INT16SZ; - algorithm = *rdata++; - labels = *rdata++; - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, " %s %d %lu ", - p_type(type), algorithm, t)); - T(addstr(tmp, len, &buf, &buflen)); - if (labels != (u_int)dn_count_labels(name)) - goto formerr; - - /* Signature expiry. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s ", p_secstodate(t))); - T(addstr(tmp, len, &buf, &buflen)); - - /* Time signed. */ - t = ns_get32(rdata); rdata += NS_INT32SZ; - len = SPRINTF((tmp, "%s ", p_secstodate(t))); - T(addstr(tmp, len, &buf, &buflen)); - - /* Signature Footprint. */ - footprint = ns_get16(rdata); rdata += NS_INT16SZ; - len = SPRINTF((tmp, "%u ", footprint)); - T(addstr(tmp, len, &buf, &buflen)); - - /* Signer's name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - /* Signature. */ - len = b64_ntop(rdata, edata - rdata, - base64_key, sizeof base64_key); - if (len > 15) { - T(addstr(" (", 2, &buf, &buflen)); - leader = "\n\t\t"; - spaced = 0; - } else - leader = " "; - if (len < 0) - goto formerr; - for (n = 0; n < len; n += 48) { - T(addstr(leader, strlen(leader), &buf, &buflen)); - T(addstr(base64_key + n, MIN(len - n, 48), - &buf, &buflen)); - } - if (len > 15) - T(addstr(" )", 2, &buf, &buflen)); - - break; - } - - case ns_t_nxt: { - int n, c; - - /* Next domain name. */ - T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); - - /* Type bit map. */ - n = edata - rdata; - for (c = 0; c < n*8; c++) - if (NS_NXT_BIT_ISSET(c, rdata)) { - len = SPRINTF((tmp, " %s", p_type(c))); - T(addstr(tmp, len, &buf, &buflen)); - } - break; - } - - default: - comment = "unknown RR type"; - goto hexify; - } - return (buf - obuf); - formerr: - comment = "RR format error"; - hexify: { - int n, m; - char *p; - - len = SPRINTF((tmp, "\\#(\t\t; %s", comment)); - T(addstr(tmp, len, &buf, &buflen)); - while (rdata < edata) { - p = tmp; - p += SPRINTF((p, "\n\t")); - spaced = 0; - n = MIN(16, edata - rdata); - for (m = 0; m < n; m++) - p += SPRINTF((p, "%02x ", rdata[m])); - T(addstr(tmp, p - tmp, &buf, &buflen)); - if (n < 16) { - T(addstr(")", 1, &buf, &buflen)); - T(addtab(p - tmp + 1, 48, spaced, &buf, &buflen)); - } - p = tmp; - p += SPRINTF((p, "; ")); - for (m = 0; m < n; m++) - *p++ = (isascii(rdata[m]) && isprint(rdata[m])) - ? rdata[m] - : '.'; - T(addstr(tmp, p - tmp, &buf, &buflen)); - rdata += n; - } - return (buf - obuf); - } -} - -/* Private. */ - -/* - * size_t - * prune_origin(name, origin) - * Find out if the name is at or under the current origin. - * return: - * Number of characters in name before start of origin, - * or length of name if origin does not match. - * notes: - * This function should share code with samedomain(). - */ -static size_t -prune_origin(const char *name, const char *origin) { - const char *oname = name; - - while (*name != '\0') { - if (origin != NULL && strcasecmp(name, origin) == 0) - return (name - oname - (name > oname)); - while (*name != '\0') { - if (*name == '\\') { - name++; - /* XXX need to handle \nnn form. */ - if (*name == '\0') - break; - } else if (*name == '.') { - name++; - break; - } - name++; - } - } - return (name - oname); -} - -/* - * int - * charstr(rdata, edata, buf, buflen) - * Format a into the presentation buffer. - * return: - * Number of rdata octets consumed - * 0 for protocol format error - * -1 for output buffer error - * side effects: - * buffer is advanced on success. - */ -static int -charstr(const u_char *rdata, const u_char *edata, char **buf, size_t *buflen) { - const u_char *odata = rdata; - size_t save_buflen = *buflen; - char *save_buf = *buf; - - if (addstr("\"", 1, buf, buflen) < 0) - goto enospc; - if (rdata < edata) { - int n = *rdata; - - if (rdata + 1 + n <= edata) { - rdata++; - while (n-- > 0) { - if (strchr("\n\"\\", *rdata) != NULL) - if (addstr("\\", 1, buf, buflen) < 0) - goto enospc; - if (addstr((const char *)rdata, 1, - buf, buflen) < 0) - goto enospc; - rdata++; - } - } - } - if (addstr("\"", 1, buf, buflen) < 0) - goto enospc; - return (rdata - odata); - enospc: - errno = ENOSPC; - *buf = save_buf; - *buflen = save_buflen; - return (-1); -} - -static int -addname(const u_char *msg, size_t msglen, - const u_char **pp, const char *origin, - char **buf, size_t *buflen) -{ - size_t newlen, save_buflen = *buflen; - char *save_buf = *buf; - int n; - - n = dn_expand(msg, msg + msglen, *pp, *buf, *buflen); - if (n < 0) - goto enospc; /* Guess. */ - newlen = prune_origin(*buf, origin); - if ((origin == NULL || origin[0] == '\0' || (*buf)[newlen] == '\0') && - (newlen == 0 || (*buf)[newlen - 1] != '.')) { - /* No trailing dot. */ - if (newlen + 2 > *buflen) - goto enospc; /* No room for ".\0". */ - (*buf)[newlen++] = '.'; - (*buf)[newlen] = '\0'; - } - if (newlen == 0) { - /* Use "@" instead of name. */ - if (newlen + 2 > *buflen) - goto enospc; /* No room for "@\0". */ - (*buf)[newlen++] = '@'; - (*buf)[newlen] = '\0'; - } - *pp += n; - addlen(newlen, buf, buflen); - **buf = '\0'; - return (newlen); - enospc: - errno = ENOSPC; - *buf = save_buf; - *buflen = save_buflen; - return (-1); -} - -static void -addlen(size_t len, char **buf, size_t *buflen) { - assert(len <= *buflen); - *buf += len; - *buflen -= len; -} - -static int -addstr(const char *src, size_t len, char **buf, size_t *buflen) { - if (len > *buflen) { - errno = ENOSPC; - return (-1); - } - memcpy(*buf, src, len); - addlen(len, buf, buflen); - **buf = '\0'; - return (0); -} - -static int -addtab(size_t len, size_t target, int spaced, char **buf, size_t *buflen) { - size_t save_buflen = *buflen; - char *save_buf = *buf; - int t; - - if (spaced || len >= target - 1) { - T(addstr(" ", 2, buf, buflen)); - spaced = 1; - } else { - for (t = (target - len - 1) / 8; t >= 0; t--) - if (addstr("\t", 1, buf, buflen) < 0) { - *buflen = save_buflen; - *buf = save_buf; - return (-1); - } - spaced = 0; - } - return (spaced); -} diff --git a/cpukit/libnetworking/libc/ns_ttl.c b/cpukit/libnetworking/libc/ns_ttl.c deleted file mode 100644 index df8674747a..0000000000 --- a/cpukit/libnetworking/libc/ns_ttl.c +++ /dev/null @@ -1,153 +0,0 @@ -#include - -/* - * Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* Import. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include - -#include -#include -#include -#include - -#define SPRINTF(x) ((size_t)sprintf x) - -/* Forward. */ - -static int fmt1(int t, char s, char **buf, size_t *buflen); - -/* Macros. */ - -#define T(x) if ((x) < 0) return (-1); else (void)NULL - -/* Public. */ - -int -ns_format_ttl(u_long src, char *dst, size_t dstlen) { - char *odst = dst; - int secs, mins, hours, days, weeks, x; - char *p; - - secs = src % 60; src /= 60; - mins = src % 60; src /= 60; - hours = src % 24; src /= 24; - days = src % 7; src /= 7; - weeks = src; src = 0; - - x = 0; - if (weeks) { - T(fmt1(weeks, 'W', &dst, &dstlen)); - x++; - } - if (days) { - T(fmt1(days, 'D', &dst, &dstlen)); - x++; - } - if (hours) { - T(fmt1(hours, 'H', &dst, &dstlen)); - x++; - } - if (mins) { - T(fmt1(mins, 'M', &dst, &dstlen)); - x++; - } - if (secs || !(weeks || days || hours || mins)) { - T(fmt1(secs, 'S', &dst, &dstlen)); - x++; - } - - if (x > 1) { - int ch; - - for (p = odst; (ch = *p) != '\0'; p++) - if (isascii(ch) && isupper(ch)) - *p = tolower(ch); - } - - return (dst - odst); -} - -int -ns_parse_ttl(const char *src, u_long *dst) { - u_long ttl, tmp; - int ch, digits, dirty; - - ttl = 0; - tmp = 0; - digits = 0; - dirty = 0; - while ((ch = *src++) != '\0') { - if (!isascii(ch) || !isprint(ch)) - goto einval; - if (isdigit(ch)) { - tmp *= 10; - tmp += (ch - '0'); - digits++; - continue; - } - if (digits == 0) - goto einval; - if (islower(ch)) - ch = toupper(ch); - switch (ch) { - case 'W': tmp *= 7; - case 'D': tmp *= 24; - case 'H': tmp *= 60; - case 'M': tmp *= 60; - case 'S': break; - default: goto einval; - } - ttl += tmp; - tmp = 0; - digits = 0; - dirty = 1; - } - if (digits > 0) { - if (dirty) - goto einval; - else - ttl += tmp; - } - *dst = ttl; - return (0); - - einval: - errno = EINVAL; - return (-1); -} - -/* Private. */ - -static int -fmt1(int t, char s, char **buf, size_t *buflen) { - char tmp[50]; - size_t len; - - len = SPRINTF((tmp, "%d%c", t, s)); - if (len + 1 > *buflen) - return (-1); - strcpy(*buf, tmp); - *buf += len; - *buflen -= len; - return (0); -} diff --git a/cpukit/libnetworking/libc/nsap_addr.c b/cpukit/libnetworking/libc/nsap_addr.c deleted file mode 100644 index deaa127b0f..0000000000 --- a/cpukit/libnetworking/libc/nsap_addr.c +++ /dev/null @@ -1,107 +0,0 @@ -#include - -/* - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -static char -xtob( - int c) -{ - return (c - (((c >= '0') && (c <= '9')) ? '0' : '7')); -} - -u_int -inet_nsap_addr( - const char *ascii, - u_char *binary, - int maxlen) -{ - u_char c, nib; - u_int len = 0; - - while ((c = *ascii++) != '\0' && len < (u_int)maxlen) { - if (c == '.' || c == '+' || c == '/') - continue; - if (!isascii(c)) - return (0); - if (islower(c)) - c = toupper(c); - if (isxdigit(c)) { - nib = xtob(c); - c = *ascii++; - if (c != '\0') { - c = toupper(c); - if (isxdigit(c)) { - *binary++ = (nib << 4) | xtob(c); - len++; - } else - return (0); - } - else - return (0); - } - else - return (0); - } - return (len); -} - -char * -inet_nsap_ntoa( - int binlen, - const u_char *binary, - char *ascii) -{ - register int nib; - int i; - static char tmpbuf[255*3]; - char *start; - - if (ascii) - start = ascii; - else { - ascii = tmpbuf; - start = tmpbuf; - } - - if (binlen > 255) - binlen = 255; - - for (i = 0; i < binlen; i++) { - nib = *binary >> 4; - *ascii++ = nib + (nib < 10 ? '0' : '7'); - nib = *binary++ & 0x0f; - *ascii++ = nib + (nib < 10 ? '0' : '7'); - if (((i % 2) == 0 && (i + 1) < binlen)) - *ascii++ = '.'; - } - *ascii = '\0'; - return (start); -} diff --git a/cpukit/libnetworking/libc/port_after.h b/cpukit/libnetworking/libc/port_after.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cpukit/libnetworking/libc/port_before.h b/cpukit/libnetworking/libc/port_before.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cpukit/libnetworking/libc/rcmd.3 b/cpukit/libnetworking/libc/rcmd.3 deleted file mode 100644 index a09f13ccce..0000000000 --- a/cpukit/libnetworking/libc/rcmd.3 +++ /dev/null @@ -1,203 +0,0 @@ -.\" Copyright (c) 1983, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" From: @(#)rcmd.3 8.1 (Berkeley) 6/4/93 -.\" -.Dd February 15, 1996 -.Dt RCMD 3 -.Os BSD 4.2 -.Sh NAME -.Nm rcmd , -.Nm rresvport , -.Nm iruserok , -.Nm ruserok -.Nd routines for returning a stream to a remote command -.Sh SYNOPSIS -.Fd #include -.Ft int -.Fn rcmd "char **ahost" "int inport" "const char *locuser" "const char *remuser" "const char *cmd" "int *fd2p" -.Ft int -.Fn rresvport "int *port" -.Ft int -.Fn iruserok "u_long raddr" "int superuser" "const char *ruser" "const char *luser" -.Ft int -.Fn ruserok "const char *rhost" "int superuser" "const char *ruser" "const char *luser" -.Sh DESCRIPTION -The -.Fn rcmd -function -is used by the super-user to execute a command on -a remote machine using an authentication scheme based -on reserved port numbers. -The -.Fn rresvport -function -returns a descriptor to a socket -with an address in the privileged port space. -The -.Fn ruserok -function -is used by servers -to authenticate clients requesting service with -.Fn rcmd . -All three functions are present in the same file and are used -by the -.Xr rshd 8 -server (among others). -.Pp -The -.Fn rcmd -function -looks up the host -.Fa *ahost -using -.Xr gethostbyname 3 , -returning \-1 if the host does not exist. -Otherwise -.Fa *ahost -is set to the standard name of the host -and a connection is established to a server -residing at the well-known Internet port -.Fa inport . -.Pp -If the connection succeeds, -a socket in the Internet domain of type -.Dv SOCK_STREAM -is returned to the caller, and given to the remote -command as -.Em stdin -and -.Em stdout . -If -.Fa fd2p -is non-zero, then an auxiliary channel to a control -process will be set up, and a descriptor for it will be placed -in -.Fa *fd2p . -The control process will return diagnostic -output from the command (unit 2) on this channel, and will also -accept bytes on this channel as being -.Tn UNIX -signal numbers, to be -forwarded to the process group of the command. -If -.Fa fd2p -is 0, then the -.Em stderr -(unit 2 of the remote -command) will be made the same as the -.Em stdout -and no -provision is made for sending arbitrary signals to the remote process, -although you may be able to get its attention by using out-of-band data. -.Pp -The protocol is described in detail in -.Xr rshd 8 . -.Pp -The -.Fn rresvport -function is used to obtain a socket with a privileged -address bound to it. This socket is suitable for use -by -.Fn rcmd -and several other functions. Privileged Internet ports are those -in the range 0 to 1023. Only the super-user -is allowed to bind an address of this sort to a socket. -.Pp -The -.Fn iruserok -and -.Fn ruserok -functions take a remote host's IP address or name, as returned by the -.Xr gethostbyname 3 -routines, two user names and a flag indicating whether the local user's -name is that of the super-user. -Then, if the user is -.Em NOT -the super-user, it checks the -.Pa /etc/hosts.equiv -file. -If that lookup is not done, or is unsuccessful, the -.Pa .rhosts -in the local user's home directory is checked to see if the request for -service is allowed. -.Pp -If this file does not exist, is not a regular file, is owned by anyone -other than the user or the super-user, or is writable by anyone other -than the owner, the check automatically fails. -Zero is returned if the machine name is listed in the -.Dq Pa hosts.equiv -file, or the host and remote user name are found in the -.Dq Pa .rhosts -file; otherwise -.Fn iruserok -and -.Fn ruserok -return \-1. -If the local domain (as obtained from -.Xr gethostname 3 ) -is the same as the remote domain, only the machine name need be specified. -.Pp -The -.Fn iruserok -function is strongly preferred for security reasons. -It requires trusting the local DNS at most, while the -.Fn ruserok -function requires trusting the entire DNS, which can be spoofed. -.Sh DIAGNOSTICS -The -.Fn rcmd -function -returns a valid socket descriptor on success. -It returns \-1 on error and prints a diagnostic message on the standard error. -.Pp -The -.Fn rresvport -function -returns a valid, bound socket descriptor on success. -It returns \-1 on error with the global value -.Va errno -set according to the reason for failure. -The error code -.Dv EAGAIN -is overloaded to mean ``All network ports in use.'' -.Sh SEE ALSO -.Xr rlogin 1 , -.Xr rsh 1 , -.Xr intro 2 , -.Xr rexec 3 , -.Xr rexecd 8 , -.Xr rlogind 8 , -.Xr rshd 8 -.Sh HISTORY -These -functions appeared in -.Bx 4.2 . diff --git a/cpukit/libnetworking/libc/rcmd.c b/cpukit/libnetworking/libc/rcmd.c deleted file mode 100644 index 2bb3b721e6..0000000000 --- a/cpukit/libnetworking/libc/rcmd.c +++ /dev/null @@ -1,550 +0,0 @@ -#include - -/* - * Copyright (c) 1983, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#if HAVE_DECL_RCMD - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef YP -#include -#include -#endif - -#ifndef __rtems__ -extern int innetgr( const char *, const char *, const char *, const char * ); -#endif - -#define max(a, b) ((a > b) ? a : b) - -#ifdef __rtems__ -int rresvport(int *alport); -#define bzero(a,s) memset((a),0,(s)) -#define bcmp memcmp -#define bcopy(s,d,i) memcpy(d,s,i) -#else /* __rtems__ */ - -int __ivaliduser(FILE *, u_int32_t, const char *, const char *); -static int __icheckhost(const struct sockaddr *, socklen_t, const char *); - -#endif - -int -rcmd( - char **ahost, - int rport, - const char *locuser, - const char *remuser, - const char *cmd, - int *fd2p ) -{ - struct hostent *hp; - struct sockaddr_in sin, from; - fd_set reads; -#ifndef __rtems__ - long oldmask; -#endif - pid_t pid; - int s, lport, timo; - char c; - - pid = getpid(); - hp = gethostbyname(*ahost); - if (hp == NULL) { - herror(*ahost); - return (-1); - } - *ahost = hp->h_name; -#ifndef __rtems__ - oldmask = sigblock(sigmask(SIGURG)); -#endif - for (timo = 1, lport = IPPORT_RESERVED - 1;;) { - s = rresvport(&lport); - if (s < 0) { - if (errno == EAGAIN) - (void)fprintf(stderr, - "rcmd: socket: All ports in use\n"); - else - (void)fprintf(stderr, "rcmd: socket: %s\n", - strerror(errno)); -#ifndef __rtems__ - sigsetmask(oldmask); -#endif - return (-1); - } - fcntl(s, F_SETOWN, pid); - bzero(&sin, sizeof sin); - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_family = hp->h_addrtype; - sin.sin_port = rport; - bcopy(hp->h_addr_list[0], &sin.sin_addr, MIN(hp->h_length, sizeof sin.sin_addr)); - if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0) - break; - (void)close(s); - if (errno == EADDRINUSE) { - lport--; - continue; - } - if (errno == ECONNREFUSED && timo <= 16) { - (void)sleep(timo); - timo *= 2; - continue; - } - if (hp->h_addr_list[1] != NULL) { - int oerrno = errno; - - (void)fprintf(stderr, "connect to address %s: ", - inet_ntoa(sin.sin_addr)); - errno = oerrno; - perror(0); - hp->h_addr_list++; - bcopy(hp->h_addr_list[0], &sin.sin_addr, MIN(hp->h_length, sizeof sin.sin_addr)); - (void)fprintf(stderr, "Trying %s...\n", - inet_ntoa(sin.sin_addr)); - continue; - } - (void)fprintf(stderr, "%s: %s\n", hp->h_name, strerror(errno)); -#ifndef __rtems__ - sigsetmask(oldmask); -#endif - return (-1); - } - lport--; - if (fd2p == 0) { - write(s, "", 1); - lport = 0; - } else { - char num[8]; - int s2 = rresvport(&lport), s3; - socklen_t len = sizeof(from); - int nfds; - - if (s2 < 0) - goto bad; - listen(s2, 1); - (void)snprintf(num, sizeof(num), "%d", lport); - if (write(s, num, strlen(num)+1) != strlen(num)+1) { - (void)fprintf(stderr, - "rcmd: write (setting up stderr): %s\n", - strerror(errno)); - (void)close(s2); - goto bad; - } - nfds = max(s, s2)+1; - if(nfds > FD_SETSIZE) { - fprintf(stderr, "rcmd: too many files\n"); - (void)close(s2); - goto bad; - } -again: - FD_ZERO(&reads); - FD_SET(s, &reads); - FD_SET(s2, &reads); - errno = 0; - if (select(nfds, &reads, 0, 0, 0) < 1 || !FD_ISSET(s2, &reads)){ - if (errno != 0) - (void)fprintf(stderr, - "rcmd: select (setting up stderr): %s\n", - strerror(errno)); - else - (void)fprintf(stderr, - "select: protocol failure in circuit setup\n"); - (void)close(s2); - goto bad; - } - s3 = accept(s2, (struct sockaddr *)&from, &len); - /* - * XXX careful for ftp bounce attacks. If discovered, shut them - * down and check for the real auxiliary channel to connect. - */ - if (from.sin_family == AF_INET && from.sin_port == htons(20)) { - close(s3); - goto again; - } - (void)close(s2); - if (s3 < 0) { - (void)fprintf(stderr, - "rcmd: accept: %s\n", strerror(errno)); - lport = 0; - goto bad; - } - *fd2p = s3; - from.sin_port = ntohs((u_short)from.sin_port); - if (from.sin_family != AF_INET || - from.sin_port >= IPPORT_RESERVED || - from.sin_port < IPPORT_RESERVED / 2) { - (void)fprintf(stderr, - "socket: protocol failure in circuit setup.\n"); - goto bad2; - } - } - (void)write(s, locuser, strlen(locuser)+1); - (void)write(s, remuser, strlen(remuser)+1); - (void)write(s, cmd, strlen(cmd)+1); - if (read(s, &c, 1) != 1) { - (void)fprintf(stderr, - "rcmd: %s: %s\n", *ahost, strerror(errno)); - goto bad2; - } - if (c != 0) { - while (read(s, &c, 1) == 1) { - (void)write(STDERR_FILENO, &c, 1); - if (c == '\n') - break; - } - goto bad2; - } -#ifndef __rtems__ - sigsetmask(oldmask); -#endif - return (s); -bad2: - if (lport) - (void)close(*fd2p); -bad: - (void)close(s); -#ifndef __rtems__ - sigsetmask(oldmask); -#endif - return (-1); -} - -int -rresvport(int *alport ) -{ - struct sockaddr_in sin; - int s; - - bzero(&sin, sizeof sin); - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = INADDR_ANY; - s = socket(AF_INET, SOCK_STREAM, 0); - if (s < 0) - return (-1); -#if 0 /* compat_exact_traditional_rresvport_semantics */ - sin.sin_port = htons((u_short)*alport); - if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0) - return (s); - if (errno != EADDRINUSE) { - (void)close(s); - return (-1); - } -#endif - sin.sin_port = 0; - if (bindresvport(s, &sin) == -1) { - (void)close(s); - return (-1); - } - *alport = (int)ntohs(sin.sin_port); - return (s); -} - -#ifndef __rtems__ -int __check_rhosts_file = 1; -char *__rcmd_errstr; - -int -ruserok(rhost, superuser, ruser, luser) - const char *rhost, *ruser, *luser; - int superuser; -{ - struct hostent *hp; - u_long addr; - char **ap; - - if ((hp = gethostbyname(rhost)) == NULL) - return (-1); - for (ap = hp->h_addr_list; *ap; ++ap) { - bcopy(*ap, &addr, sizeof(addr)); - if (iruserok(addr, superuser, ruser, luser) == 0) - return (0); - } - return (-1); -} - -/* - * New .rhosts strategy: We are passed an ip address. We spin through - * hosts.equiv and .rhosts looking for a match. When the .rhosts only - * has ip addresses, we don't have to trust a nameserver. When it - * contains hostnames, we spin through the list of addresses the nameserver - * gives us and look for a match. - * - * Returns 0 if ok, -1 if not ok. - */ -int -iruserok(raddr, superuser, ruser, luser) - u_long raddr; - int superuser; - const char *ruser, *luser; -{ - register char *cp; - struct stat sbuf; - struct passwd *pwd; - FILE *hostf; - uid_t uid; - int first; - char pbuf[MAXPATHLEN]; - - first = 1; - hostf = superuser ? NULL : fopen(_PATH_HEQUIV, "r"); -again: - if (hostf) { - if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { - (void)fclose(hostf); - return (0); - } - (void)fclose(hostf); - } - if (first == 1 && (__check_rhosts_file || superuser)) { - first = 0; - if ((pwd = getpwnam(luser)) == NULL) - return (-1); - (void)strcpy(pbuf, pwd->pw_dir); - (void)strcat(pbuf, "/.rhosts"); - - /* - * Change effective uid while opening .rhosts. If root and - * reading an NFS mounted file system, can't read files that - * are protected read/write owner only. - */ - uid = geteuid(); - (void)seteuid(pwd->pw_uid); - hostf = fopen(pbuf, "r"); - (void)seteuid(uid); - - if (hostf == NULL) - return (-1); - /* - * If not a regular file, or is owned by someone other than - * user or root or if writeable by anyone but the owner, quit. - */ - cp = NULL; - if (lstat(pbuf, &sbuf) < 0) - cp = ".rhosts lstat failed"; - else if (!S_ISREG(sbuf.st_mode)) - cp = ".rhosts not regular file"; - else if (fstat(fileno(hostf), &sbuf) < 0) - cp = ".rhosts fstat failed"; - else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) - cp = "bad .rhosts owner"; - else if (sbuf.st_mode & (S_IWGRP|S_IWOTH)) - cp = ".rhosts writeable by other than owner"; - /* If there were any problems, quit. */ - if (cp) { - __rcmd_errstr = cp; - (void)fclose(hostf); - return (-1); - } - goto again; - } - return (-1); -} - -/* - * XXX - * Don't make static, used by lpd(8). - * - * Returns 0 if ok, -1 if not ok. - */ -int -__ivaliduser(hostf, raddr, luser, ruser) - FILE *hostf; - u_long raddr; - const char *luser, *ruser; -{ - register char *user, *p; - int ch; - char buf[MAXHOSTNAMELEN + 128]; /* host + login */ - char hname[MAXHOSTNAMELEN]; - struct hostent *hp; - /* Presumed guilty until proven innocent. */ - int userok = 0, hostok = 0; -#ifdef YP - char *ypdomain; - - if (yp_get_default_domain(&ypdomain)) - ypdomain = NULL; -#else -#define ypdomain NULL -#endif - /* We need to get the damn hostname back for netgroup matching. */ - if ((hp = gethostbyaddr((char *)&raddr, sizeof(u_long), - AF_INET)) == NULL) - return (-1); - strncpy(hname, hp->h_name, sizeof(hname)); - hname[sizeof(hname) - 1] = '\0'; - - while (fgets(buf, sizeof(buf), hostf)) { - p = buf; - /* Skip lines that are too long. */ - if (strchr(p, '\n') == NULL) { - while ((ch = getc(hostf)) != '\n' && ch != EOF); - continue; - } - if (*p == '\n' || *p == '#') { - /* comment... */ - continue; - } - while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') { - *p = isupper(*p) ? tolower(*p) : *p; - p++; - } - if (*p == ' ' || *p == '\t') { - *p++ = '\0'; - while (*p == ' ' || *p == '\t') - p++; - user = p; - while (*p != '\n' && *p != ' ' && - *p != '\t' && *p != '\0') - p++; - } else - user = p; - *p = '\0'; - /* - * Do +/- and +@/-@ checking. This looks really nasty, - * but it matches SunOS's behavior so far as I can tell. - */ - switch(buf[0]) { - case '+': - if (!buf[1]) { /* '+' matches all hosts */ - hostok = 1; - break; - } - if (buf[1] == '@') /* match a host by netgroup */ - hostok = innetgr((char *)&buf[2], - (char *)&hname, NULL, ypdomain); - else /* match a host by addr */ - hostok = __icheckhost(raddr,(char *)&buf[1]); - break; - case '-': /* reject '-' hosts and all their users */ - if (buf[1] == '@') { - if (innetgr((char *)&buf[2], - (char *)&hname, NULL, ypdomain)) - return(-1); - } else { - if (__icheckhost(raddr,(char *)&buf[1])) - return(-1); - } - break; - default: /* if no '+' or '-', do a simple match */ - hostok = __icheckhost(raddr, buf); - break; - } - switch(*user) { - case '+': - if (!*(user+1)) { /* '+' matches all users */ - userok = 1; - break; - } - if (*(user+1) == '@') /* match a user by netgroup */ - userok = innetgr(user+2, NULL, ruser, ypdomain); - else /* match a user by direct specification */ - userok = !(strcmp(ruser, user+1)); - break; - case '-': /* if we matched a hostname, */ - if (hostok) { /* check for user field rejections */ - if (!*(user+1)) - return(-1); - if (*(user+1) == '@') { - if (innetgr(user+2, NULL, - ruser, ypdomain)) - return(-1); - } else { - if (!strcmp(ruser, user+1)) - return(-1); - } - } - break; - default: /* no rejections: try to match the user */ - if (hostok) - userok = !(strcmp(ruser,*user ? user : luser)); - break; - } - if (hostok && userok) - return(0); - } - return (-1); -} - -/* - * Returns "true" if match, 0 if no match. - */ -static int -__icheckhost(raddr, lhost) - u_long raddr; - register char *lhost; -{ - register struct hostent *hp; - register u_long laddr; - register char **pp; - - /* Try for raw ip address first. */ - if (isdigit(*lhost) && (long)(laddr = inet_addr(lhost)) != -1) - return (raddr == laddr); - - /* Better be a hostname. */ - if ((hp = gethostbyname(lhost)) == NULL) - return (0); - - /* Spin through ip addresses. */ - for (pp = hp->h_addr_list; *pp; ++pp) - if (!bcmp(&raddr, *pp, sizeof(u_long))) - return (1); - - /* No match. */ - return (0); -} -#endif -#endif diff --git a/cpukit/libnetworking/libc/recv.c b/cpukit/libnetworking/libc/recv.c deleted file mode 100644 index a3325d3447..0000000000 --- a/cpukit/libnetworking/libc/recv.c +++ /dev/null @@ -1,53 +0,0 @@ -#include - -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include - -ssize_t -recv( - int s, - void *buf, - size_t len, - int flags ) -{ - return (recvfrom(s, buf, len, flags, NULL, 0)); -} diff --git a/cpukit/libnetworking/libc/res_comp.c b/cpukit/libnetworking/libc/res_comp.c deleted file mode 100644 index e24d99dd0b..0000000000 --- a/cpukit/libnetworking/libc/res_comp.c +++ /dev/null @@ -1,252 +0,0 @@ -#include - -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Portions Copyright (c) 1993 by Digital Equipment Corporation. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies, and that - * the name of Digital Equipment Corporation not be used in advertising or - * publicity pertaining to distribution of the document or software without - * specific, written prior permission. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT - * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Portions Copyright (c) 1996 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "res_config.h" - -#define BIND_4_COMPAT - -/* - * Expand compressed domain name 'comp_dn' to full domain name. - * 'msg' is a pointer to the begining of the message, - * 'eomorig' points to the first location after the message, - * 'exp_dn' is a pointer to a buffer of size 'length' for the result. - * Return size of compressed name or -1 if there was an error. - */ -int -dn_expand(const u_char *msg, const u_char *eom, const u_char *src, - char *dst, int dstsiz) -{ - int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz); - - if (n > 0 && dst[0] == '.') - dst[0] = '\0'; - return (n); -} - -/* - * Pack domain name 'exp_dn' in presentation form into 'comp_dn'. - * Return the size of the compressed name or -1. - * 'length' is the size of the array pointed to by 'comp_dn'. - */ -int -dn_comp(const char *src, u_char *dst, int dstsiz, - u_char **dnptrs, u_char **lastdnptr) -{ - return (ns_name_compress(src, dst, (size_t)dstsiz, - (const u_char **)dnptrs, - (const u_char **)lastdnptr)); -} - -/* - * Skip over a compressed domain name. Return the size or -1. - */ -int -dn_skipname(const u_char *ptr, const u_char *eom) { - const u_char *saveptr = ptr; - - if (ns_name_skip(&ptr, eom) == -1) - return (-1); - return (ptr - saveptr); -} - -/* - * Verify that a domain name uses an acceptable character set. - */ - -/* - * Note the conspicuous absence of ctype macros in these definitions. On - * non-ASCII hosts, we can't depend on string literals or ctype macros to - * tell us anything about network-format data. The rest of the BIND system - * is not careful about this, but for some reason, we're doing it right here. - */ -#define PERIOD 0x2e -#define hyphenchar(c) ((c) == 0x2d) -#define bslashchar(c) ((c) == 0x5c) -#define periodchar(c) ((c) == PERIOD) -#define asterchar(c) ((c) == 0x2a) -#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \ - || ((c) >= 0x61 && (c) <= 0x7a)) -#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39) - -#define borderchar(c) (alphachar(c) || digitchar(c)) -#define middlechar(c) (borderchar(c) || hyphenchar(c)) -#define domainchar(c) ((c) > 0x20 && (c) < 0x7f) - -int -res_hnok(const char *dn) -{ - int pch = PERIOD, ch = *dn++; - - while (ch != '\0') { - int nch = *dn++; - - if (periodchar(ch)) { - (void)NULL; - } else if (periodchar(pch)) { - if (!borderchar(ch)) - return (0); - } else if (periodchar(nch) || nch == '\0') { - if (!borderchar(ch)) - return (0); - } else { - if (!middlechar(ch)) - return (0); - } - pch = ch, ch = nch; - } - return (1); -} - -/* - * hostname-like (A, MX, WKS) owners can have "*" as their first label - * but must otherwise be as a host name. - */ -int -res_ownok(const char *dn) -{ - if (asterchar(dn[0])) { - if (periodchar(dn[1])) - return (res_hnok(dn+2)); - if (dn[1] == '\0') - return (1); - } - return (res_hnok(dn)); -} - -/* - * SOA RNAMEs and RP RNAMEs can have any printable character in their first - * label, but the rest of the name has to look like a host name. - */ -int -res_mailok(const char *dn) -{ - int ch, escaped = 0; - - /* "." is a valid missing representation */ - if (*dn == '\0') - return (1); - - /* otherwise