xref: /openbsd-src/gnu/usr.bin/perl/lib/User/grent.pm (revision e2e5c5d36e4398ba94879f0a31b0307421edcfdb)
1package User::grent;
2use strict;
3
4use 5.005_64;
5our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
6BEGIN {
7    use Exporter   ();
8    @EXPORT      = qw(getgrent getgrgid getgrnam getgr);
9    @EXPORT_OK   = qw($gr_name $gr_gid $gr_passwd $gr_mem @gr_members);
10    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
11}
12use vars      @EXPORT_OK;
13
14# Class::Struct forbids use of @ISA
15sub import { goto &Exporter::import }
16
17use Class::Struct qw(struct);
18struct 'User::grent' => [
19    name    => '$',
20    passwd  => '$',
21    gid	    => '$',
22    members => '@',
23];
24
25sub populate (@) {
26    return unless @_;
27    my $gob = new();
28    ($gr_name, $gr_passwd, $gr_gid) = @$gob[0,1,2] = @_[0,1,2];
29    @gr_members = @{$gob->[3]} = split ' ', $_[3];
30    return $gob;
31}
32
33sub getgrent ( ) { populate(CORE::getgrent()) }
34sub getgrnam ($) { populate(CORE::getgrnam(shift)) }
35sub getgrgid ($) { populate(CORE::getgrgid(shift)) }
36sub getgr    ($) { ($_[0] =~ /^\d+/) ? &getgrgid : &getgrnam }
37
381;
39__END__
40
41=head1 NAME
42
43User::grent - by-name interface to Perl's built-in getgr*() functions
44
45=head1 SYNOPSIS
46
47 use User::grent;
48 $gr = getgrgid(0) or die "No group zero";
49 if ( $gr->name eq 'wheel' && @{$gr->members} > 1 ) {
50     print "gid zero name wheel, with other members";
51 }
52
53 use User::grent qw(:FIELDS;
54 getgrgid(0) or die "No group zero";
55 if ( $gr_name eq 'wheel' && @gr_members > 1 ) {
56     print "gid zero name wheel, with other members";
57 }
58
59 $gr = getgr($whoever);
60
61=head1 DESCRIPTION
62
63This module's default exports override the core getgrent(), getgruid(),
64and getgrnam() functions, replacing them with versions that return
65"User::grent" objects.  This object has methods that return the similarly
66named structure field name from the C's passwd structure from F<grp.h>;
67namely name, passwd, gid, and members (not mem).  The first three
68return scalars, the last an array reference.
69
70You may also import all the structure fields directly into your namespace
71as regular variables using the :FIELDS import tag.  (Note that this still
72overrides your core functions.)  Access these fields as variables named
73with a preceding C<gr_>.  Thus, C<$group_obj-E<gt>gid()> corresponds
74to $gr_gid if you import the fields.  Array references are available as
75regular array variables, so C<@{ $group_obj-E<gt>members() }> would be
76simply @gr_members.
77
78The getpw() function is a simple front-end that forwards
79a numeric argument to getpwuid() and the rest to getpwnam().
80
81To access this functionality without the core overrides,
82pass the C<use> an empty import list, and then access
83function functions with their full qualified names.
84On the other hand, the built-ins are still available
85via the C<CORE::> pseudo-package.
86
87=head1 NOTE
88
89While this class is currently implemented using the Class::Struct
90module to build a struct-like class, you shouldn't rely upon this.
91
92=head1 AUTHOR
93
94Tom Christiansen
95