522cb5b6dfb36c59f9375f153e9de16b73ab817c
[perl.git] / do / gpwent
1 int
2 do_gpwent(which,gimme,arglast)
3 int which;
4 int gimme;
5 int *arglast;
6 {
7 #ifdef I_PWD
8     register ARRAY *ary = stack;
9     register int sp = arglast[0];
10     register STR *TARG;
11     struct passwd *getpwnam();
12     struct passwd *getpwuid();
13     struct passwd *getpwent();
14     struct passwd *pwent;
15
16     if (which == O_GPWNAM) {
17         char *name = str_get(ary->ary_array[sp+1]);
18
19         pwent = getpwnam(name);
20     }
21     else if (which == O_GPWUID) {
22         int uid = (int)str_gnum(ary->ary_array[sp+1]);
23
24         pwent = getpwuid(uid);
25     }
26     else
27         pwent = getpwent();
28
29     if (gimme != G_ARRAY) {
30         astore(ary, ++sp, TARG = str_mortal(&str_undef));
31         if (pwent) {
32             if (which == O_GPWNAM)
33                 str_numset(TARG, (double)pwent->pw_uid);
34             else
35                 str_set(TARG, pwent->pw_name);
36         }
37         return sp;
38     }
39
40     if (pwent) {
41         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
42         str_set(TARG, pwent->pw_name);
43         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
44         str_set(TARG, pwent->pw_passwd);
45         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
46         str_numset(TARG, (double)pwent->pw_uid);
47         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
48         str_numset(TARG, (double)pwent->pw_gid);
49         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
50 #ifdef PWCHANGE
51         str_numset(TARG, (double)pwent->pw_change);
52 #else
53 #ifdef PWQUOTA
54         str_numset(TARG, (double)pwent->pw_quota);
55 #else
56 #ifdef PWAGE
57         str_set(TARG, pwent->pw_age);
58 #endif
59 #endif
60 #endif
61         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
62 #ifdef PWCLASS
63         str_set(TARG,pwent->pw_class);
64 #else
65 #ifdef PWCOMMENT
66         str_set(TARG, pwent->pw_comment);
67 #endif
68 #endif
69         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
70         str_set(TARG, pwent->pw_gecos);
71         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
72         str_set(TARG, pwent->pw_dir);
73         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
74         str_set(TARG, pwent->pw_shell);
75 #ifdef PWEXPIRE
76         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
77         str_numset(TARG, (double)pwent->pw_expire);
78 #endif
79     }
80
81     return sp;
82 #else
83     fatal("password routines not implemented");
84 #endif
85 }
86