xref: /illumos-gate/usr/src/cmd/nscd/getserv.c (revision cb5caa98)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 /*
29  * Routines to handle getserv* calls in nscd
30  */
31 
32 #include <strings.h>
33 #include "cache.h"
34 
35 
36 #define	name_db	ctx->nsc_db[0]
37 #define	port_db	ctx->nsc_db[1]
38 
39 #define	NSC_NAME_SERVICES_BYNAME	"getservbyname"
40 #define	NSC_NAME_SERVICES_BYPORT	"getservbyport"
41 
42 static void servname_getlogstr(char *, char *, size_t, nss_XbyY_args_t *);
43 static int servname_compar(const void *, const void *);
44 static uint_t servname_gethash(nss_XbyY_key_t *, int);
45 
46 static void servport_getlogstr(char *, char *, size_t, nss_XbyY_args_t *);
47 static int servport_compar(const void *, const void *);
48 static uint_t servport_gethash(nss_XbyY_key_t *, int);
49 
50 void
51 serv_init_ctx(nsc_ctx_t *ctx) {
52 	ctx->dbname = NSS_DBNAM_SERVICES;
53 	ctx->file_name = "/etc/services";
54 	ctx->db_count = 2;
55 	name_db = make_cache(nsc_key_other,
56 			NSS_DBOP_SERVICES_BYNAME,
57 			NSC_NAME_SERVICES_BYNAME,
58 			servname_compar,
59 			servname_getlogstr,
60 			servname_gethash, nsc_ht_default, -1);
61 
62 	port_db = make_cache(nsc_key_other,
63 			NSS_DBOP_SERVICES_BYPORT,
64 			NSC_NAME_SERVICES_BYPORT,
65 			servport_compar,
66 			servport_getlogstr,
67 			servport_gethash, nsc_ht_default, -1);
68 }
69 
70 static int
71 servname_compar(const void *n1, const void *n2) {
72 	nsc_entry_t	*e1, *e2;
73 	int		res, l1, l2;
74 
75 	e1 = (nsc_entry_t *)n1;
76 	e2 = (nsc_entry_t *)n2;
77 
78 	/* compare protocol */
79 	if (e1->key.serv.proto == NULL && e2->key.serv.proto)
80 		return (-1);
81 	if (e1->key.serv.proto && e2->key.serv.proto == NULL)
82 		return (1);
83 	if (e1->key.serv.proto) {
84 		l1 = strlen(e1->key.serv.proto);
85 		l2 = strlen(e2->key.serv.proto);
86 		res = strncmp(e1->key.serv.proto, e2->key.serv.proto,
87 			(l1 > l2)?l1:l2);
88 		if (res > 0)
89 			return (1);
90 		if (res < 0)
91 			return (-1);
92 	}
93 
94 	/* compare service name */
95 	l1 = strlen(e1->key.serv.serv.name);
96 	l2 = strlen(e2->key.serv.serv.name);
97 	res = strncmp(e1->key.serv.serv.name, e2->key.serv.serv.name,
98 			(l1 > l2)?l1:l2);
99 	return (_NSC_INT_KEY_CMP(res, 0));
100 }
101 
102 static uint_t
103 servname_gethash(nss_XbyY_key_t *key, int htsize) {
104 	return (ces_gethash(key->serv.serv.name, htsize));
105 }
106 
107 static void
108 servname_getlogstr(char *name, char *whoami, size_t len,
109 			nss_XbyY_args_t *argp) {
110 	(void) snprintf(whoami, len, "%s [key=%s, %s]",
111 			name,
112 			argp->key.serv.serv.name,
113 			check_null(argp->key.serv.proto));
114 }
115 
116 static int
117 servport_compar(const void *n1, const void *n2) {
118 	nsc_entry_t	*e1, *e2;
119 	int		res, l1, l2;
120 
121 	e1 = (nsc_entry_t *)n1;
122 	e2 = (nsc_entry_t *)n2;
123 
124 	/* compare protocol */
125 	if (e1->key.serv.proto == NULL && e2->key.serv.proto)
126 		return (-1);
127 	if (e1->key.serv.proto && e2->key.serv.proto == NULL)
128 		return (1);
129 	if (e1->key.serv.proto) {
130 		l1 = strlen(e1->key.serv.proto);
131 		l2 = strlen(e2->key.serv.proto);
132 		res = strncmp(e1->key.serv.proto, e2->key.serv.proto,
133 				(l1 > l2)?l1:l2);
134 		if (res > 0)
135 			return (1);
136 		if (res < 0)
137 			return (-1);
138 	}
139 
140 	/* compare port */
141 	return (_NSC_INT_KEY_CMP(e1->key.serv.serv.port,
142 			e2->key.serv.serv.port));
143 }
144 
145 static uint_t
146 servport_gethash(nss_XbyY_key_t *key, int htsize) {
147 	return (db_gethash(&key->serv.serv.port,
148 			sizeof (key->serv.serv.port), htsize));
149 }
150 
151 static void
152 servport_getlogstr(char *name, char *whoami, size_t len,
153 			nss_XbyY_args_t *argp) {
154 	(void) snprintf(whoami, len, "%s [key=%d, %s]",
155 			name,
156 			argp->key.serv.serv.port,
157 			check_null(argp->key.serv.proto));
158 }
159