da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1992-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[-?\n@(#)$Id: fds (AT&T Research) 2009-09-09 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE_LICENSE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?fds - list open file descriptor status]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?\bfds\b lists the status for each open file descriptor. "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "When invoked as a shell builtin it accesses the file descriptors of the "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "calling shell, otherwise it lists the file descriptors passed across "
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "\bexec\b(2).]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[l:long?List file descriptor details.]"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[u:unit?Write output to \afd\a.]#[fd]"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2), \bgetsockname\b(2), \bgetsockopts\b(2)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <cmd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/sockets"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(S_IFSOCK) && _sys_socket && _hdr_arpa_inet && _hdr_netinet_in && _lib_getsockname && _lib_getsockopt && _lib_inet_ntoa
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/socket.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <netinet/in.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <arpa/inet.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef S_IFSOCK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef minor
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define minor(x) (int)((x)&0xff)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef major
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define major(x) (int)(((unsigned int)(x)>>8)&0xff)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#undef getconf
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define getconf(x) strtol(astconf(x,NiL,NiL),NiL,0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef S_IFSOCK
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct NV_s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin const char* name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int value;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} NV_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const NV_t family[] =
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_LOCAL
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "pipe", AF_LOCAL,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_UNIX
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "pipe", AF_UNIX,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_FILE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "FILE", AF_FILE,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_INET
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "INET", AF_INET,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_AX25
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "AX25", AF_AX25,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_IPX
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "IPX", AF_IPX,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_APPLETALK
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "APPLETALK", AF_APPLETALK,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_NETROM
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "NETROM", AF_NETROM,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_BRIDGE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "BRIDGE", AF_BRIDGE,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_ATMPVC
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "ATMPVC", AF_ATMPVC,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_X25
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "X25", AF_X25,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_INET6
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "INET6", AF_INET6,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_ROSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "ROSE", AF_ROSE,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_DECnet
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "DECnet", AF_DECnet,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_NETBEUI
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "NETBEUI", AF_NETBEUI,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_SECURITY
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "SECURITY", AF_SECURITY,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_KEY
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "KEY", AF_KEY,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_NETLINK
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "NETLINK", AF_NETLINK,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_ROUTE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "ROUTE", AF_ROUTE,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_PACKET
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "PACKET", AF_PACKET,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_ASH
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "ASH", AF_ASH,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_ECONET
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "ECONET", AF_ECONET,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_ATMSVC
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "ATMSVC", AF_ATMSVC,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_SNA
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "SNA", AF_SNA,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_IRDA
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "IRDA", AF_IRDA,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_PPPOX
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "PPPOX", AF_PPPOX,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_WANPIPE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "WANPIPE", AF_WANPIPE,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_BLUETOOTH
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "BLUETOOTH", AF_BLUETOOTH,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinb_fds(int argc, char** argv, void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int details;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int open_max;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int unit;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Sfio_t* sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat st;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef S_IFSOCK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct sockaddr_in addr;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char* a;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned char* b;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned char* e;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin socklen_t addrlen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin socklen_t len;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int type;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int port;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int prot;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char num[64];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char fam[64];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#ifdef INET6_ADDRSTRLEN
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char nam[256];
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cmdinit(argc, argv, context, ERROR_CATALOG, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin details = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unit = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (optget(argv, usage))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'l':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin details = opt_info.num;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case 'u':
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz unit = opt_info.num;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_USAGE|4, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (error_info.errors || *argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_USAGE|4, "%s", optusage(NiL));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((open_max = getconf("OPEN_MAX")) <= 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin open_max = OPEN_MAX;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (unit == 1)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sp = sfstdout;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz else if (fstat(unit, &st) || !(sp = sfnew(NiL, NiL, SF_UNBOUND, unit, SF_WRITE)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz error(ERROR_SYSTEM|3, "%d: cannot write to file descriptor");
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (i = 0; i <= open_max; i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fstat(i, &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* not open */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!details)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%d\n", i);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ((flags = fcntl(i, F_GETFL, (char*)0)) == -1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = "--";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (flags & (O_RDONLY|O_WRONLY|O_RDWR))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case O_RDONLY:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = "r-";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case O_WRONLY:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = "-w";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case O_RDWR:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = "rw";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin default:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m = "??";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (isatty(i) && (s = ttyname(i)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s %s\n", i, m, x, fmtmode(st.st_mode, 0), s);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef S_IFSOCK
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin addrlen = sizeof(addr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memset(&addr, 0, addrlen);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!getsockname(i, (struct sockaddr*)&addr, (void*)&addrlen))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin type = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin prot = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SO_TYPE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin len = sizeof(type);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (getsockopt(i, SOL_SOCKET, SO_TYPE, (void*)&type, (void*)&len))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin type = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SO_PROTOTYPE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin len = sizeof(prot);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (getsockopt(i, SOL_SOCKET, SO_PROTOTYPE, (void*)&prot, (void*)&len))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin prot = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!st.st_mode)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin st.st_mode = S_IFSOCK|S_IRUSR|S_IWUSR;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (type)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case SOCK_DGRAM:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (addr.sin_family)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case AF_INET:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_INET6
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case AF_INET6:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "udp";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case SOCK_STREAM:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin switch (addr.sin_family)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case AF_INET:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef AF_INET6
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case AF_INET6:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef IPPROTO_SCTP
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (prot == IPPROTO_SCTP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "sctp";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = "tcp";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef SOCK_RAW
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case SOCK_RAW:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = "raw";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef SOCK_RDM
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case SOCK_RDM:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = "rdm";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef SOCK_SEQPACKET
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case SOCK_SEQPACKET:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = "seqpacket";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!s)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (type = 0; family[type].name && family[type].value != addr.sin_family; type++);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!(s = (char*)family[type].name))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfsprintf(s = num, sizeof(num), "family.%d", addr.sin_family);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin port = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#ifdef INET6_ADDRSTRLEN
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (a = (char*)inet_ntop(addr.sin_family, &addr.sin_addr, nam, sizeof(nam)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin port = ntohs(addr.sin_port);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (addr.sin_family == AF_INET)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = inet_ntoa(addr.sin_addr);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin port = ntohs(addr.sin_port);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = fam;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin e = (b = (unsigned char*)&addr) + addrlen;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (b < e && a < &fam[sizeof(fam)-1])
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a += sfsprintf(a, &fam[sizeof(fam)] - a - 1, ".%d", *b++);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = a == fam ? "0" : fam + 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (port)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s /dev/%s/%s/%d\n", i, m, x, fmtmode(st.st_mode, 0), s, a, port);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s /dev/%s/%s\n", i, m, x, fmtmode(st.st_mode, 0), s, a);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s /dev/inode/%u/%u\n", i, m, x, fmtmode(st.st_mode, 0), st.st_dev, st.st_ino);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (sp != sfstdout)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfsetfd(sp, -1);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfclose(sp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}