Hi!

----

Attached is a small patch ("ksh93_libcmd_fds_ipv6_001.diff.txt") to add
IPv6 support to ksh93/libcmd's "fds" command. The patch fixes some minor
other issues, too - including that it now correctly handles |OPEN_MAX|
and supports OSes where |getsockopt(i, SOL_SOCKET, SO_PROTOTYPE, ...)|
is not (yet) supported (e.g. Solaris <= 10) ...

----

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)
@@ -34,6 +34,7 @@
 
 #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,122 @@
        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;
+                       s = NULL;
+                       switch (type)
                        {
-                               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";
+                       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
                        }
+                       
+                       sfprintf(sfstdout, "%02d %s%s %s ", i, m, x, 
fmtmode(st.st_mode, 0));
+                       
+                       if (!s)
+                       {
+                               sfprintf(sfstdout, "/dev/type.%d.prot.%d\n", 
type, prot);
+                               continue;
+                       }
+                       
+#ifdef INET6_ADDRSTRLEN
+                       inet_ntop(addr.sin_family, &addr.sin_addr, addrname, 
sizeof(addrname));
+#else
+                       strcpy(addrname, inet_ntoa(addr.sin_addr));
 #endif
-                       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/%s/%s/%d\n",
+                                s,
+                                addrname,
+                                (int)ntohs(addr.sin_port));
+                       continue;
                }
-               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;
 }

Reply via email to