Glenn Fowler wrote:
>
> in the patch the S_IFSOCK default assumes AF_INET without checking for it
Fixed (and platforms without |AF_INET| support should work now, too).
> and then makes inet_* calls to get the addr and port
> shouldn't AF_INET still guard inet_* addr translation?
Right...
.. I've attached a new patch ("ksh93_libcmd_fds_ipv6_002.diff.txt")
which fixes this.
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) roland.mainz at nrubsig.org
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 7950090
(;O/ \/ \O;)
-------------- next part --------------
Index: src/lib/libcmd/common/fds.c
===================================================================
--- src/lib/libcmd/common/fds.c (revision 694)
+++ src/lib/libcmd/common/fds.c (working copy)
@@ -21,7 +21,7 @@
#pragma prototyped
static const char usage[] =
-"[-?\n@(#)$Id: fds (AT&T Research) 2006-10-26 $\n]"
+"[-?\n@(#)$Id: fds (AT&T Research) 2007-05-11 $\n]"
USAGE_LICENSE
"[+NAME?fds - list open file descriptor status]"
"[+DESCRIPTION?\bfds\b lists the status for each open file descriptor. "
@@ -29,11 +29,12 @@
"calling shell, otherwise it lists the file descriptors passed across "
"\bexec\b(2).]"
"[l:long?List file descriptor details.]"
-"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \bgetgroups\b(2)]"
+"[+SEE ALSO?\blogname\b(1), \bwho\b(1), \blsof\b(1), \bgetgroups\b(2)]"
;
#include <cmd.h>
#include <ls.h>
+#include <stdio.h>
#include "FEATURE/sockets"
@@ -52,6 +53,9 @@
#define major(x) (int)(((unsigned int)(x)>>8)&0xff)
#endif
+#undef getconf
+#define getconf(x) strtol(astconf(x,NiL,NiL),NiL,0)
+
int
b_fds(int argc, char** argv, void* context)
{
@@ -61,13 +65,14 @@
register char* x;
int flags;
int details;
+ int open_max;
struct stat st;
#ifdef S_IFSOCK
struct sockaddr_in addr;
socklen_t len;
int type;
int prot;
- char num[32];
+ char addrname[256];
#endif
cmdinit(argc, argv, context, ERROR_CATALOG, 0);
@@ -91,78 +96,139 @@
argv += opt_info.index;
if (error_info.errors || *argv)
error(ERROR_USAGE|4, "%s", optusage(NiL));
- for (i = 0; i <= OPEN_MAX; i++)
+
+ open_max = getconf("OPEN_MAX");
+ if (open_max <= 0)
+ open_max = OPEN_MAX;
+
+ for (i = 0; i <= open_max; i++)
+ {
if (fstat(i, &st))
+ {
/* not open */;
- else if (details)
+ continue;
+ }
+
+ if (!details)
{
- if ((flags = fcntl(i, F_GETFL, (char*)0)) == -1)
- m = "--";
- else
- switch (flags & (O_RDONLY|O_WRONLY|O_RDWR))
- {
- case O_RDONLY:
- m = "r-";
- break;
- case O_WRONLY:
- m = "-w";
- break;
- case O_RDWR:
- m = "rw";
- break;
- default:
- m = "??";
- break;
- }
- x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-";
- if (isatty(i) && (s = ttyname(i)))
- sfprintf(sfstdout, "%02d %s%s %s %s\n", i, m,
x, fmtmode(st.st_mode, 0), s);
+ sfprintf(sfstdout, "%d\n", i);
+ continue;
+ }
+
+ if ((flags = fcntl(i, F_GETFL, (char*)0)) == -1)
+ m = "--";
+ else
+ switch (flags & (O_RDONLY|O_WRONLY|O_RDWR))
+ {
+ case O_RDONLY:
+ m = "r-";
+ break;
+ case O_WRONLY:
+ m = "-w";
+ break;
+ case O_RDWR:
+ m = "rw";
+ break;
+ default:
+ m = "??";
+ break;
+ }
+ x = (fcntl(i, F_GETFD, (char*)0) > 0) ? "x" : "-";
+ if (isatty(i) && (s = ttyname(i)))
+ {
+ sfprintf(sfstdout, "%02d %s%s %s %s\n", i, m, x,
fmtmode(st.st_mode, 0), s);
+ continue;
+ }
+
#ifdef S_IFSOCK
- else if ((len = sizeof(addr))
- && !getsockname(i, (struct sockaddr*)&addr,
(void*)&len)
- && len == sizeof(addr)
- && addr.sin_family == AF_INET
-#ifdef SO_TYPE
- && (len = sizeof(type))
- && !getsockopt(i, SOL_SOCKET, SO_TYPE,
(void*)&type, (void*)&len)
- && len == sizeof(type)
-#else
- && !(type = 0)
-#endif
+ memset(&addr, 0, sizeof(addr));
+ len = sizeof(addr);
+ if (!getsockname(i, (struct sockaddr*)&addr, (void*)&len))
+ {
+ type = 0 ; prot = 0;
+
+ len = sizeof(type); if (getsockopt(i, SOL_SOCKET,
SO_TYPE, (void*)&type, (void*)&len) != 0 ) type = -1;
#ifdef SO_PROTOTYPE
- && (len = sizeof(prot))
- && (!getsockopt(i, SOL_SOCKET, SO_PROTOTYPE,
(void*)&prot, (void*)&len) || !(prot = 0))
-#else
- && !(prot = 0)
+ len = sizeof(prot); if (getsockopt(i, SOL_SOCKET,
SO_PROTOTYPE, (void*)&prot, (void*)&len) != 0 ) prot = -1;
#endif
- )
+ if (!st.st_mode)
+ st.st_mode = S_IFSOCK|S_IRUSR|S_IWUSR;
+
+ sfprintf(sfstdout, "%02d %s%s %s ", i, m, x,
fmtmode(st.st_mode, 0));
+
+#ifdef AF_INET
+ if (addr.sin_family != AF_INET && addr.sin_family !=
AF_INET6)
+#endif
{
- if (!st.st_mode)
- st.st_mode = S_IFSOCK|S_IRUSR|S_IWUSR;
- s = 0;
- switch (type)
- {
- case SOCK_DGRAM:
- s = "udp";
- break;
- case SOCK_STREAM:
- if (prot == 0)
- s = "tcp";
+ sfprintf(sfstdout,
"/dev/type.%d.prot.%d/sin_family.%d\n", type, prot, addr.sin_family);
+ continue;
+ }
+
+#ifdef AF_INET
+ s = NULL;
+ switch (type)
+ {
+ case SOCK_DGRAM:
+ s = "udp";
+ break;
+ case SOCK_STREAM:
+#ifdef SO_PROTOTYPE
+ if (prot == -1 || prot == IPPROTO_TCP)
+ s = "tcp";
#ifdef IPPROTO_SCTP
- else if (prot == IPPROTO_SCTP)
- s = "sctp";
+ else if (prot == IPPROTO_SCTP)
+ s = "sctp";
+#endif /* IPPROTO_SCTP */
+#else
+ s = "tcp";
+#endif /* SO_PROTOTYPE */
+ break;
+#ifdef SOCK_RAW
+ case SOCK_RAW:
+ s = "raw";
+ break;
#endif
- break;
- }
- if (!s)
- sfprintf(sfstdout, s = num,
"type.%d.prot.%d", type, prot);
- sfprintf(sfstdout, "%02d %s%s %s
/dev/%s/%s/%d\n", i, m, x, fmtmode(st.st_mode, 0), s, inet_ntoa(addr.sin_addr),
ntohs(addr.sin_port));
+#ifdef SOCK_RDM
+ case SOCK_RDM:
+ s = "rdm";
+ break;
+#endif
+#ifdef SOCK_SEQPACKET
+ case SOCK_SEQPACKET:
+ s = "seqpacket";
+ break;
+#endif
}
+
+#ifdef INET6_ADDRSTRLEN
+ inet_ntop(addr.sin_family, &addr.sin_addr, addrname,
sizeof(addrname));
+#else
+ strcpy(addrname, inet_ntoa(addr.sin_addr));
#endif
+
+ if (s)
+ {
+ sfprintf(sfstdout, "/dev/%s/%s/%d\n",
+ s,
+ addrname,
+ (int)ntohs(addr.sin_port));
+
+ }
else
- sfprintf(sfstdout, "%02d %s%s %s
/dev/inode/%u/%u\n", i, m, x, fmtmode(st.st_mode, 0), st.st_dev, st.st_ino);
+ {
+ sfprintf(sfstdout,
"/dev/type.%d.prot.%d/%s/%d\n",
+ type, prot,
+ addrname,
+ (int)ntohs(addr.sin_port));
+ }
+
+ continue;
+#endif /* AF_INET */
}
- else
- sfprintf(sfstdout, "%d\n", i);
+#endif /* S_IFSOCK */
+
+ sfprintf(sfstdout, "%02d %s%s %s /dev/inode/%u/%u\n", i, m, x,
fmtmode(st.st_mode, 0), st.st_dev, st.st_ino);
+ }
+
return 0;
}