summaryrefslogtreecommitdiff
path: root/net/netatalk-devel/files/patch-macusers
blob: 66d75c4d2f65d5cc46a42d32dd3c41304f2d6912 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
--- contrib/macusers/macusers.orig	Fri May 18 14:09:26 2001
+++ contrib/macusers/macusers	Fri May 18 14:08:28 2001
@@ -1,52 +1,92 @@
 #!/usr/bin/perl
 
+use strict;
+use Socket;
+use vars qw($MAC_PROCESS $PS_STR $MATCH_STR $ASIP_PORT_NO $ASIP_PORT $LSOF);
+
 # Written for linux; may have to be modified for your brand of Unix.
 
-$MAC_PROCESS="afpd";
-$PS_STR="-ef";
-$ASIP_PORT="afpovertcp";
+# Support for FreeBSD added by Joe Clarke <marcus@marcuscom.com>.
+# Support could probably be extended for *BSD, but I do not have Net or
+# OpenBSD machines to test with.  Code has also been cleaned up and made
+# to compile under strict.
+#
+# The new lsof call should also be quicker as it does not involve a 
+# second pipeline.
+#
+# Support has also been added for 16 character usernames.
+
+$MAC_PROCESS = "afpd";
+if ( $^O eq "freebsd" ) {
+        $PS_STR    = "-awwxouser,pid,ppid,start,command";
+        $MATCH_STR = '(\w+)\s+(\d+)\s+(\d+)\s+([\d\w:]+)';
+}
+else {
+        $PS_STR    = "-ef";
+        $MATCH_STR = '\s*(\w+)\s+(\d+)\s+(\d+)\s+\d+\s+([\d\w:]+)';
+}
+$ASIP_PORT    = "afpovertcp";
+$ASIP_PORT_NO = 548;
 
 # Change to 0 if you don't have lsof
-$LSOF=1;
+$LSOF = 0;
+my %mac = ();
+
+if ( $LSOF == 1 ) {
+        open( LSOF, "lsof -i :$ASIP_PORT |" );
+
+        while (<LSOF>) {
+                next if ( $_ !~ /$ASIP_PORT/ );
+                $_ =~ /\w+\s+(\d+).*->([\w\.-]+).*/;
+                my ( $pid, $host );
+                $pid = $1;
+                $host = $2;
+                ($host) = ( $host =~ /(^[\w\d\-]+)/ );
+                $mac{$pid} = $host;
+        }
+        print
+"PID      UID      Username         Name                 Logintime Mac\n";
+        close(LSOF);
+}
+elsif ( $^O eq "freebsd" ) {
+        open( SOCKSTAT, "sockstat -4 | grep $MAC_PROCESS | grep -v grep |" );
+
+        while (<SOCKSTAT>) {
+                next if ( $_ !~ /$MAC_PROCESS/ );
+                $_ =~
+                  /\S+\s+\S+\s+(\d+)\s+\d+\s+[\w\d]+\s+[\d\.:]+\s+([\d\.]+)/;
+                my ( $pid, $addr, $host );
+                $pid  = $1;
+                $addr = $2;
+                $host =
+                  gethostbyaddr( pack( 'C4', split ( /\./, $addr ) ), AF_INET );
+                ($host) = ( $host =~ /(^[\w\d\-]+)/ );
+                $mac{$pid} = $host;
+        }
+        print
+"PID      UID      Username         Name                 Logintime Mac\n";
+}
+else {
+        print
+          "PID      UID      Username         Name                 Logintime\n";
+}
+
+open( PS, "ps $PS_STR |" ) || die "Unable to open a pipe to ``ps''";
 
-if ($LSOF == 1 )
-{
-  open(LSOF,"lsof -i | grep $ASIP_PORT |");
-
-  while(<LSOF>)
-  {
-    if ($_ !~ /$ASIP_PORT/)
-    {
-      next;
-    }
-    $_=~/\w+\s+(\d+).*->([\w-]+).*/;
-    $pid=$1; $host=$2;
-    $mac{$pid}=$host;
-  }
-
-  close(LSOF);
-  print "PID      UID      Usercode Name                 Logintime Mac\n";
-}
-else
-{
-  print "PID      UID      Usercode Name                 Logintime\n";
-}
-
-open(PS," ps $PS_STR |") || die "cannot do ps";
-
-while(<PS>)
-{
-  if ($_ !~ /$MAC_PROCESS/ )
-  {
-    next;
-  }
-  $_=~ /\s*(\w+)\s+(\d+)\s+(\d+)\s+\d+\s+([\d\w:]+)/;
-  $user=$1; $pid=$2; $ppid=$3; $time=$4;
-  if ($ppid != 1)
-  {
-    ($t,$t,$uid,$t,$t,$t,$name,$t,$t)=getpwnam($user);
-    printf "%-8d %-8d %-8s %-20s %-9s %s\n",$pid,$uid,$user,$name,$time,$mac{$pid};
-  }
+while (<PS>) {
+        next if ( $_ !~ /$MAC_PROCESS/ );
+        my ( $user, $pid, $ppid, $time, $name, $uid, $t );
+        $_ =~ /$MATCH_STR/;
+        $user = $1;
+        $pid  = $2;
+        $ppid = $3;
+        $time = $4;
+
+        if ( $ppid != 1 ) {
+                ( $t, $t, $uid, $t, $t, $t, $name, $t, $t ) = getpwnam($user);
+                printf "%-8d %-8d %-16s %-20s %-9s %s\n", $pid, $uid, $user,
+                  $name, $time, $mac{$pid};
+        }
 }
 
-close(PS);  
+close(PS);