87
90
system library. In list context, the return values from the
88
91
various get routines are as follows:</p>
89
92
<pre class="verbatim"> <span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$passwd</span><span class="cm">,</span><span class="i">$uid</span><span class="cm">,</span><span class="i">$gid</span><span class="cm">,</span>
90
<span class="i">$quota</span><span class="cm">,</span><span class="i">$comment</span><span class="cm">,</span><span class="i">$gcos</span><span class="cm">,</span><span class="i">$dir</span><span class="cm">,</span><span class="i">$shell</span><span class="cm">,</span><span class="i">$expire</span><span class="s">)</span> = getpw*
91
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$passwd</span><span class="cm">,</span><span class="i">$gid</span><span class="cm">,</span><span class="i">$members</span><span class="s">)</span> = getgr*
92
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$addrtype</span><span class="cm">,</span><span class="i">$length</span><span class="cm">,</span><span class="i">@addrs</span><span class="s">)</span> = gethost*
93
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$addrtype</span><span class="cm">,</span><span class="i">$net</span><span class="s">)</span> = getnet*
94
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$proto</span><span class="s">)</span> = getproto*
95
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$port</span><span class="cm">,</span><span class="i">$proto</span><span class="s">)</span> = getserv*</pre>
93
<span class="i">$quota</span><span class="cm">,</span><span class="i">$comment</span><span class="cm">,</span><span class="i">$gcos</span><span class="cm">,</span><span class="i">$dir</span><span class="cm">,</span><span class="i">$shell</span><span class="cm">,</span><span class="i">$expire</span><span class="s">)</span> = <span class="w">getpw</span>*
94
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$passwd</span><span class="cm">,</span><span class="i">$gid</span><span class="cm">,</span><span class="i">$members</span><span class="s">)</span> = <span class="w">getgr</span>*
95
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$addrtype</span><span class="cm">,</span><span class="i">$length</span><span class="cm">,</span><span class="i">@addrs</span><span class="s">)</span> = <span class="w">gethost</span>*
96
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$addrtype</span><span class="cm">,</span><span class="i">$net</span><span class="s">)</span> = <span class="w">getnet</span>*
97
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$proto</span><span class="s">)</span> = <span class="w">getproto</span>*
98
<span class="s">(</span><span class="i">$name</span><span class="cm">,</span><span class="i">$aliases</span><span class="cm">,</span><span class="i">$port</span><span class="cm">,</span><span class="i">$proto</span><span class="s">)</span> = <span class="w">getserv</span>*</pre>
96
99
<p>(If the entry doesn't exist you get a null list.)</p>
97
100
<p>The exact meaning of the $gcos field varies but it usually contains
98
101
the real name of the user (as opposed to the login name) and other
124
127
in your system, please consult your getpwnam(3) documentation and your
125
128
<i>pwd.h</i> file. You can also find out from within Perl what your
126
129
$quota and $comment fields mean and whether you have the $expire field
127
by using the <code class="inline"><a class="l_w" href="../Config.html">Config</a></code> module and the values <code class="inline">d_pwquota</code>
128
, <code class="inline">d_pwage</code>
130
by using the <code class="inline"><span class="w">Config</span></code>
131
module and the values <code class="inline"><span class="w">d_pwquota</span></code>
132
, <code class="inline"><span class="w">d_pwage</span></code>
130
<code class="inline">d_pwchange</code>
131
, <code class="inline">d_pwcomment</code>
132
, and <code class="inline">d_pwexpire</code>
134
<code class="inline"><span class="w">d_pwchange</span></code>
135
, <code class="inline"><span class="w">d_pwcomment</span></code>
136
, and <code class="inline"><span class="w">d_pwexpire</span></code>
133
137
. Shadow password
134
138
files are only supported if your vendor has implemented them in the
135
139
intuitive fashion that calling the regular C library routines gets the
148
152
addresses returned by the corresponding system library call. In the
149
153
Internet domain, each address is four bytes long and you can unpack it
150
154
by saying something like:</p>
151
<pre class="verbatim"> <span class="s">(</span><span class="i">$a</span><span class="cm">,</span><span class="i">$b</span><span class="cm">,</span><span class="i">$c</span><span class="cm">,</span><span class="i">$d</span><span class="s">)</span> = <a class="l_k" href="../functions/unpack.html">unpack</a><span class="s">(</span><span class="q">'C4'</span><span class="cm">,</span><span class="i">$addr</span>[<span class="n">0</span>]<span class="s">)</span><span class="sc">;</span></pre>
155
<pre class="verbatim"> <span class="s">(</span><span class="i">$a</span><span class="cm">,</span><span class="i">$b</span><span class="cm">,</span><span class="i">$c</span><span class="cm">,</span><span class="i">$d</span><span class="s">)</span> = <a class="l_k" href="../functions/unpack.html">unpack</a><span class="s">(</span><span class="q">'W4'</span><span class="cm">,</span><span class="i">$addr</span>[<span class="n">0</span>]<span class="s">)</span><span class="sc">;</span></pre>
152
156
<p>The Socket library makes this slightly easier:</p>
153
<pre class="verbatim"> <a class="l_k" href="../functions/use.html">use</a> <a class="l_w" href="../Socket.html">Socket</a><span class="sc">;</span>
157
<pre class="verbatim"> <a class="l_k" href="../functions/use.html">use</a> <span class="w">Socket</span><span class="sc">;</span>
154
158
<span class="i">$iaddr</span> = <span class="i">inet_aton</span><span class="s">(</span><span class="q">"127.1"</span><span class="s">)</span><span class="sc">;</span> <span class="c"># or whatever address</span>
155
<span class="i">$name</span> = <a class="l_k" href="../functions/gethostbyaddr.html">gethostbyaddr</a><span class="s">(</span><span class="i">$iaddr</span><span class="cm">,</span> AF_INET<span class="s">)</span><span class="sc">;</span></pre>
159
<span class="i">$name</span> = <a class="l_k" href="../functions/gethostbyaddr.html">gethostbyaddr</a><span class="s">(</span><span class="i">$iaddr</span><span class="cm">,</span> <span class="w">AF_INET</span><span class="s">)</span><span class="sc">;</span></pre>
156
160
<pre class="verbatim"> <span class="c"># or going the other way</span>
157
161
<span class="i">$straddr</span> = <span class="i">inet_ntoa</span><span class="s">(</span><span class="i">$iaddr</span><span class="s">)</span><span class="sc">;</span></pre>
162
<p>In the opposite way, to resolve a hostname to the IP address
163
you can write this:</p>
164
<pre class="verbatim"> <a class="l_k" href="../functions/use.html">use</a> <span class="w">Socket</span><span class="sc">;</span>
165
<span class="i">$packed_ip</span> = <a class="l_k" href="../functions/gethostbyname.html">gethostbyname</a><span class="s">(</span><span class="q">"www.perl.org"</span><span class="s">)</span><span class="sc">;</span>
166
if <span class="s">(</span><a class="l_k" href="../functions/defined.html">defined</a> <span class="i">$packed_ip</span><span class="s">)</span> <span class="s">{</span>
167
<span class="i">$ip_address</span> = <span class="i">inet_ntoa</span><span class="s">(</span><span class="i">$packed_ip</span><span class="s">)</span><span class="sc">;</span>
168
<span class="s">}</span></pre>
169
<p>Make sure <gethostbyname()> is called in SCALAR context and that
170
its return value is checked for definedness.</p>
158
171
<p>If you get tired of remembering which element of the return list
159
172
contains which return value, by-name interfaces are provided
160
in standard modules: <code class="inline"><a class="l_w" href="../File/stat.html">File::stat</a></code>, <code class="inline"><a class="l_w" href="../Net/hostent.html">Net::hostent</a></code>, <code class="inline"><a class="l_w" href="../Net/netent.html">Net::netent</a></code>,
161
<code class="inline"><a class="l_w" href="../Net/protoent.html">Net::protoent</a></code>, <code class="inline"><a class="l_w" href="../Net/servent.html">Net::servent</a></code>, <code class="inline"><a class="l_w" href="../Time/gmtime.html">Time::gmtime</a></code>, <code class="inline"><a class="l_w" href="../Time/localtime.html">Time::localtime</a></code>,
162
and <code class="inline"><a class="l_w" href="../User/grent.html">User::grent</a></code>. These override the normal built-ins, supplying
173
in standard modules: <code class="inline"><span class="w">File::stat</span></code>
174
, <code class="inline"><span class="w">Net::hostent</span></code>
175
, <code class="inline"><span class="w">Net::netent</span></code>
177
<code class="inline"><span class="w">Net::protoent</span></code>
178
, <code class="inline"><span class="w">Net::servent</span></code>
179
, <code class="inline"><span class="w">Time::gmtime</span></code>
180
, <code class="inline"><span class="w">Time::localtime</span></code>
182
and <code class="inline"><span class="w">User::grent</span></code>
183
. These override the normal built-ins, supplying
163
184
versions that return objects with the appropriate names
164
185
for each field. For example:</p>
165
<pre class="verbatim"> <a class="l_k" href="../functions/use.html">use</a> <a class="l_w" href="../File/stat.html">File::stat</a><span class="sc">;</span>
166
<a class="l_k" href="../functions/use.html">use</a> <a class="l_w" href="../User/pwent.html">User::pwent</a><span class="sc">;</span>
186
<pre class="verbatim"> <a class="l_k" href="../functions/use.html">use</a> <span class="w">File::stat</span><span class="sc">;</span>
187
<a class="l_k" href="../functions/use.html">use</a> <span class="w">User::pwent</span><span class="sc">;</span>
167
188
<span class="i">$is_his</span> = <span class="s">(</span><a class="l_k" href="../functions/stat.html">stat</a><span class="s">(</span><span class="i">$filename</span><span class="s">)</span><span class="i">->uid</span> == <span class="i">pwent</span><span class="s">(</span><span class="i">$whoever</span><span class="s">)</span><span class="i">->uid</span><span class="s">)</span><span class="sc">;</span></pre>
168
189
<p>Even though it looks like they're the same method calls (uid),
169
they aren't, because a <code class="inline"><a class="l_w" href="../File/stat.html">File::stat</a></code> object is different from
170
a <code class="inline"><a class="l_w" href="../User/pwent.html">User::pwent</a></code> object.</p>
190
they aren't, because a <code class="inline"><span class="w">File::stat</span></code>
191
object is different from
192
a <code class="inline"><span class="w">User::pwent</span></code>