Change 14279 by jhi@alpha on 2002/01/15 14:43:04

        Subject: [PATCH] Socket::sockaddr_family
        From: Gisle Aas <[EMAIL PROTECTED]> 
        Date: 15 Jan 2002 06:35:28 -0800
        Message-ID: <[EMAIL PROTECTED]>

Affected files ...

.... //depot/perl/ext/Socket/Socket.pm#25 edit
.... //depot/perl/ext/Socket/Socket.t#7 edit
.... //depot/perl/ext/Socket/Socket.xs#49 edit

Differences ...

==== //depot/perl/ext/Socket/Socket.pm#25 (text) ====
Index: perl/ext/Socket/Socket.pm
--- perl/ext/Socket/Socket.pm.~1~       Tue Jan 15 08:00:05 2002
+++ perl/ext/Socket/Socket.pm   Tue Jan 15 08:00:05 2002
@@ -112,6 +112,15 @@
 Returns the 4-byte 'invalid' ip address.  Normally equivalent
 to inet_aton('255.255.255.255').
 
+=item sockaddr_family SOCKADDR
+
+Takes a sockaddr structure (as returned by pack_sockaddr_in(),
+pack_sockaddr_un() or the perl builtin functions getsockname() and
+getpeername()) and returns the address family tag.  It will match the
+constant AF_INET for a sockaddr_in and AF_UNIX for a sockaddr_un.  It
+can be used to figure out what unpacker to use for a sockaddr of
+unknown type.
+
 =item sockaddr_in PORT, ADDRESS
 
 =item sockaddr_in SOCKADDR_IN
@@ -173,7 +182,9 @@
 use XSLoader ();
 @ISA = qw(Exporter);
 @EXPORT = qw(
-       inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in
+       inet_aton inet_ntoa
+       sockaddr_family
+       pack_sockaddr_in unpack_sockaddr_in
        pack_sockaddr_un unpack_sockaddr_un
        sockaddr_in sockaddr_un
        INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE

==== //depot/perl/ext/Socket/Socket.t#7 (xtext) ====
Index: perl/ext/Socket/Socket.t
--- perl/ext/Socket/Socket.t.~1~        Tue Jan 15 08:00:05 2002
+++ perl/ext/Socket/Socket.t    Tue Jan 15 08:00:05 2002
@@ -13,7 +13,7 @@
        
 use Socket;
 
-print "1..14\n";
+print "1..16\n";
 
 if (socket(T,PF_INET,SOCK_STREAM,6)) {
   print "ok 1\n";
@@ -103,3 +103,12 @@
                                     
 eval { inet_ntoa(v10.20.30.400) };
 print (($@ =~ /^Wide character in Socket::inet_ntoa at/) ? "ok 14\n" : "not ok 14\n");
+
+if (sockaddr_family(pack_sockaddr_in(100,inet_aton("10.250.230.10"))) == AF_INET) {
+    print "ok 15\n";
+} else {
+    print "not ok 15\n";
+}
+
+eval { sockaddr_family("") };
+print (($@ =~ /^Bad arg length for Socket::sockaddr_family, length is 0, should be at 
+least \d+/) ? "ok 16\n" : "not ok 16\n");

==== //depot/perl/ext/Socket/Socket.xs#49 (text) ====
Index: perl/ext/Socket/Socket.xs
--- perl/ext/Socket/Socket.xs.~1~       Tue Jan 15 08:00:05 2002
+++ perl/ext/Socket/Socket.xs   Tue Jan 15 08:00:05 2002
@@ -273,6 +273,20 @@
        }
 
 void
+sockaddr_family(sockaddr)
+       SV *    sockaddr
+       PREINIT:
+       STRLEN sockaddr_len;
+       char *sockaddr_pv = SvPV(sockaddr, sockaddr_len);
+       CODE:
+       if (sockaddr_len < offsetof(struct sockaddr, sa_data)) {
+           croak("Bad arg length for %s, length is %d, should be at least %d",
+                 "Socket::sockaddr_family", sockaddr_len,
+                 offsetof(struct sockaddr, sa_data));
+       }
+       ST(0) = sv_2mortal(newSViv(((struct sockaddr*)sockaddr_pv)->sa_family));
+
+void
 pack_sockaddr_un(pathname)
        char *  pathname
        CODE:
End of Patch.

Reply via email to