summaryrefslogtreecommitdiff
path: root/do/ggrent
blob: bf4a918e47c45cf8c6a98807134288816ecea23c (plain)
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
int
do_ggrent(which,gimme,arglast)
int which;
int gimme;
int *arglast;
{
#ifdef I_GRP
    register ARRAY *ary = stack;
    register int sp = arglast[0];
    register char **elem;
    register STR *TARG;
    struct group *getgrnam();
    struct group *getgrgid();
    struct group *getgrent();
    struct group *grent;

    if (which == O_GGRNAM) {
	char *name = str_get(ary->ary_array[sp+1]);

	grent = getgrnam(name);
    }
    else if (which == O_GGRGID) {
	int gid = (int)str_gnum(ary->ary_array[sp+1]);

	grent = getgrgid(gid);
    }
    else
	grent = getgrent();

    if (gimme != G_ARRAY) {
	astore(ary, ++sp, TARG = str_mortal(&str_undef));
	if (grent) {
	    if (which == O_GGRNAM)
		str_numset(TARG, (double)grent->gr_gid);
	    else
		str_set(TARG, grent->gr_name);
	}
	return sp;
    }

    if (grent) {
	(void)astore(ary, ++sp, TARG = str_mortal(&str_no));
	str_set(TARG, grent->gr_name);
	(void)astore(ary, ++sp, TARG = str_mortal(&str_no));
	str_set(TARG, grent->gr_passwd);
	(void)astore(ary, ++sp, TARG = str_mortal(&str_no));
	str_numset(TARG, (double)grent->gr_gid);
	(void)astore(ary, ++sp, TARG = str_mortal(&str_no));
	for (elem = grent->gr_mem; *elem; elem++) {
	    str_cat(TARG, *elem);
	    if (elem[1])
		str_ncat(TARG," ",1);
	}
    }

    return sp;
#else
    fatal("group routines not implemented");
#endif
}