1/*	$NetBSD$	*/
2
3/*
4 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5 * Copyright (c) 1996,1999 by Internet Software Consortium.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#if defined(LIBC_SCCS) && !defined(lint)
21static const char rcsid[] = "Id: util.c,v 1.3 2005/04/27 04:56:34 sra Exp ";
22#endif
23
24#include "port_before.h"
25
26#include <sys/types.h>
27#include <sys/socket.h>
28#include <netinet/in.h>
29#include <arpa/nameser.h>
30#include <resolv.h>
31
32#include <ctype.h>
33#include <errno.h>
34#include <stdio.h>
35#include <string.h>
36#include <stdlib.h>
37
38#include <irs.h>
39
40#include "port_after.h"
41
42#include "irs_p.h"
43
44#ifdef SPRINTF_CHAR
45# define SPRINTF(x) strlen(sprintf/**/x)
46#else
47# define SPRINTF(x) sprintf x
48#endif
49
50void
51map_v4v6_address(const char *src, char *dst) {
52	u_char *p = (u_char *)dst;
53	char tmp[NS_INADDRSZ];
54	int i;
55
56	/* Stash a temporary copy so our caller can update in place. */
57	memcpy(tmp, src, NS_INADDRSZ);
58	/* Mark this ipv6 addr as a mapped ipv4. */
59	for (i = 0; i < 10; i++)
60		*p++ = 0x00;
61	*p++ = 0xff;
62	*p++ = 0xff;
63	/* Retrieve the saved copy and we're done. */
64	memcpy((void*)p, tmp, NS_INADDRSZ);
65}
66
67int
68make_group_list(struct irs_gr *this, const char *name,
69	gid_t basegid, gid_t *groups, int *ngroups)
70{
71	struct group *grp;
72	int i, ng;
73	int ret, maxgroups;
74
75	ret = -1;
76	ng = 0;
77	maxgroups = *ngroups;
78	/*
79	 * When installing primary group, duplicate it;
80	 * the first element of groups is the effective gid
81	 * and will be overwritten when a setgid file is executed.
82	 */
83	if (ng >= maxgroups)
84		goto done;
85	groups[ng++] = basegid;
86	if (ng >= maxgroups)
87		goto done;
88	groups[ng++] = basegid;
89	/*
90	 * Scan the group file to find additional groups.
91	 */
92	(*this->rewind)(this);
93	while ((grp = (*this->next)(this)) != NULL) {
94		if ((gid_t)grp->gr_gid == basegid)
95			continue;
96		for (i = 0; grp->gr_mem[i]; i++) {
97			if (!strcmp(grp->gr_mem[i], name)) {
98				if (ng >= maxgroups)
99					goto done;
100				groups[ng++] = grp->gr_gid;
101				break;
102			}
103		}
104	}
105	ret = 0;
106 done:
107	*ngroups = ng;
108	return (ret);
109}
110
111/*! \file */
112