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* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"[-?\n@(#)$Id: fds (AT&T Research) 2009-09-09 $\n]"
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#if defined(S_IFSOCK) && _sys_socket && _hdr_arpa_inet && _hdr_netinet_in && _lib_getsockname && _lib_getsockopt && _lib_inet_ntoa
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define getconf(x) strtol(astconf(x,NiL,NiL),NiL,0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* x;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned char* b;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned char* e;
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 /* not open */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-";
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s %s\n", i, m, x, fmtmode(st.st_mode, 0), s);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!getsockname(i, (struct sockaddr*)&addr, (void*)&addrlen))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (getsockopt(i, SOL_SOCKET, SO_TYPE, (void*)&type, (void*)&len))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (getsockopt(i, SOL_SOCKET, SO_PROTOTYPE, (void*)&prot, (void*)&len))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "udp";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "sctp";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s = "seqpacket";
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (type = 0; family[type].name && family[type].value != addr.sin_family; type++);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfsprintf(s = num, sizeof(num), "family.%d", addr.sin_family);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (a = (char*)inet_ntop(addr.sin_family, &addr.sin_addr, nam, sizeof(nam)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a += sfsprintf(a, &fam[sizeof(fam)] - a - 1, ".%d", *b++);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s /dev/%s/%s/%d\n", i, m, x, fmtmode(st.st_mode, 0), s, a, port);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "%02d %s%s %s /dev/%s/%s\n", i, m, x, fmtmode(st.st_mode, 0), s, a);