xref: /onnv-gate/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_init.c (revision 7588:fc605a2defdc)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
225772Sas200622  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
235331Samw  * Use is subject to license terms.
245331Samw  */
255331Samw 
26*7588Samw@Sun.COM #include <sys/errno.h>
27*7588Samw@Sun.COM #include <stdlib.h>
285331Samw #include <unistd.h>
29*7588Samw@Sun.COM #include <strings.h>
30*7588Samw@Sun.COM #include <string.h>
31*7588Samw@Sun.COM #include <rpc/xdr.h>
32*7588Samw@Sun.COM #include <synch.h>
335772Sas200622 #include <pthread.h>
34*7588Samw@Sun.COM #include <smbsrv/smb_door_svc.h>
35*7588Samw@Sun.COM #include <smbsrv/smb_common_door.h>
36*7588Samw@Sun.COM #include <smbsrv/libsmb.h>
375331Samw #include <smbsrv/libmlsvc.h>
385331Samw 
395331Samw void dssetup_initialize(void);
405331Samw void srvsvc_initialize(void);
415331Samw void wkssvc_initialize(void);
425331Samw void lsarpc_initialize(void);
435331Samw void logr_initialize(void);
445331Samw void netr_initialize(void);
455331Samw void samr_initialize(void);
465331Samw void svcctl_initialize(void);
475331Samw void winreg_initialize(void);
485772Sas200622 int srvsvc_gettime(unsigned long *);
495772Sas200622 
505772Sas200622 static void *mlsvc_keepalive(void *);
515772Sas200622 
525772Sas200622 static pthread_t mlsvc_keepalive_thr;
535772Sas200622 #define	MLSVC_KEEPALIVE_INTERVAL	(10 * 60)	/* 10 minutes */
545331Samw 
555331Samw /*
56*7588Samw@Sun.COM  * Door fd for downcalls to the smbsrv kernel door service.
57*7588Samw@Sun.COM  * smbsrv will make an upcall to smbd during initialization to
58*7588Samw@Sun.COM  * provide this file descriptor.
59*7588Samw@Sun.COM  */
60*7588Samw@Sun.COM static int mlsvc_door_fd = -1;
61*7588Samw@Sun.COM static mutex_t mlsvc_fd_mutex;
62*7588Samw@Sun.COM 
63*7588Samw@Sun.COM /*
645331Samw  * All mlrpc initialization is invoked from here.
655331Samw  * Returns 0 upon success.  Otherwise, returns -1.
665331Samw  */
675331Samw int
685331Samw mlsvc_init(void)
695331Samw {
705772Sas200622 	pthread_attr_t tattr;
715772Sas200622 	int rc;
725772Sas200622 
735331Samw 	srvsvc_initialize();
745331Samw 	wkssvc_initialize();
755331Samw 	lsarpc_initialize();
765331Samw 	netr_initialize();
775331Samw 	dssetup_initialize();
785331Samw 	samr_initialize();
795331Samw 	svcctl_initialize();
805331Samw 	winreg_initialize();
815331Samw 	logr_initialize();
825331Samw 
835772Sas200622 	(void) pthread_attr_init(&tattr);
845772Sas200622 	(void) pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
855772Sas200622 	rc = pthread_create(&mlsvc_keepalive_thr, &tattr,
865772Sas200622 	    mlsvc_keepalive, 0);
875772Sas200622 	(void) pthread_attr_destroy(&tattr);
885772Sas200622 	return (rc);
895331Samw }
905772Sas200622 
915772Sas200622 /*ARGSUSED*/
925772Sas200622 static void *
935772Sas200622 mlsvc_keepalive(void *arg)
945772Sas200622 {
955772Sas200622 	unsigned long t;
965772Sas200622 	nt_domain_t *domain;
975772Sas200622 
985772Sas200622 	for (;;) {
995772Sas200622 		(void) sleep(MLSVC_KEEPALIVE_INTERVAL);
1005772Sas200622 
1015772Sas200622 		if (smb_config_get_secmode() == SMB_SECMODE_DOMAIN) {
1025772Sas200622 			domain = nt_domain_lookupbytype(NT_DOMAIN_PRIMARY);
1035772Sas200622 			if (domain == NULL)
1045772Sas200622 				(void) lsa_query_primary_domain_info();
1057348SJose.Borrego@Sun.COM 			(void) srvsvc_gettime(&t);
1065772Sas200622 		}
1075772Sas200622 	}
1085772Sas200622 
1095772Sas200622 	/*NOTREACHED*/
1105772Sas200622 	return (NULL);
1115772Sas200622 }
112*7588Samw@Sun.COM 
113*7588Samw@Sun.COM void
114*7588Samw@Sun.COM mlsvc_set_door_fd(int fd)
115*7588Samw@Sun.COM {
116*7588Samw@Sun.COM 	(void) mutex_lock(&mlsvc_fd_mutex);
117*7588Samw@Sun.COM 	mlsvc_door_fd = fd;
118*7588Samw@Sun.COM 	(void) mutex_unlock(&mlsvc_fd_mutex);
119*7588Samw@Sun.COM }
120*7588Samw@Sun.COM 
121*7588Samw@Sun.COM int
122*7588Samw@Sun.COM mlsvc_get_door_fd(void)
123*7588Samw@Sun.COM {
124*7588Samw@Sun.COM 	int fd;
125*7588Samw@Sun.COM 
126*7588Samw@Sun.COM 	(void) mutex_lock(&mlsvc_fd_mutex);
127*7588Samw@Sun.COM 	fd = mlsvc_door_fd;
128*7588Samw@Sun.COM 	(void) mutex_unlock(&mlsvc_fd_mutex);
129*7588Samw@Sun.COM 
130*7588Samw@Sun.COM 	return (fd);
131*7588Samw@Sun.COM }
132*7588Samw@Sun.COM 
133*7588Samw@Sun.COM uint64_t
134*7588Samw@Sun.COM mlsvc_get_num_users(void)
135*7588Samw@Sun.COM {
136*7588Samw@Sun.COM 	door_arg_t arg;
137*7588Samw@Sun.COM 	char *buf;
138*7588Samw@Sun.COM 	size_t len;
139*7588Samw@Sun.COM 	int64_t n_users = 0;
140*7588Samw@Sun.COM 	int fd;
141*7588Samw@Sun.COM 
142*7588Samw@Sun.COM 	if ((fd = mlsvc_get_door_fd()) < 0)
143*7588Samw@Sun.COM 		return (0);
144*7588Samw@Sun.COM 
145*7588Samw@Sun.COM 	if ((buf = smb_dr_set_opcode(SMB_KDR_USER_NUM, &len)) == NULL)
146*7588Samw@Sun.COM 		return (0);
147*7588Samw@Sun.COM 
148*7588Samw@Sun.COM 	smb_dr_clnt_setup(&arg, buf, len);
149*7588Samw@Sun.COM 
150*7588Samw@Sun.COM 	if (smb_dr_clnt_call(fd, &arg) == 0) {
151*7588Samw@Sun.COM 		buf = arg.rbuf + SMB_DR_DATA_OFFSET;
152*7588Samw@Sun.COM 		len = arg.rsize - SMB_DR_DATA_OFFSET;
153*7588Samw@Sun.COM 
154*7588Samw@Sun.COM 		if (smb_dr_decode_common(buf, len, xdr_uint32_t, &n_users) != 0)
155*7588Samw@Sun.COM 			n_users = 0;
156*7588Samw@Sun.COM 	}
157*7588Samw@Sun.COM 
158*7588Samw@Sun.COM 	smb_dr_clnt_cleanup(&arg);
159*7588Samw@Sun.COM 	return (n_users);
160*7588Samw@Sun.COM }
161*7588Samw@Sun.COM 
162*7588Samw@Sun.COM /*
163*7588Samw@Sun.COM  * The calling function must free the output parameter 'users'.
164*7588Samw@Sun.COM  */
165*7588Samw@Sun.COM int
166*7588Samw@Sun.COM mlsvc_get_user_list(int offset, smb_dr_ulist_t *users)
167*7588Samw@Sun.COM {
168*7588Samw@Sun.COM 	door_arg_t arg;
169*7588Samw@Sun.COM 	char *buf;
170*7588Samw@Sun.COM 	size_t len;
171*7588Samw@Sun.COM 	uint_t opcode = SMB_KDR_USER_LIST;
172*7588Samw@Sun.COM 	int fd, rc = -1;
173*7588Samw@Sun.COM 
174*7588Samw@Sun.COM 	bzero(users, sizeof (smb_dr_ulist_t));
175*7588Samw@Sun.COM 
176*7588Samw@Sun.COM 	if ((fd = mlsvc_get_door_fd()) < 0)
177*7588Samw@Sun.COM 		return (-1);
178*7588Samw@Sun.COM 
179*7588Samw@Sun.COM 	buf = smb_dr_encode_common(opcode, &offset, xdr_uint32_t, &len);
180*7588Samw@Sun.COM 	if (buf == NULL)
181*7588Samw@Sun.COM 		return (-1);
182*7588Samw@Sun.COM 
183*7588Samw@Sun.COM 	smb_dr_clnt_setup(&arg, buf, len);
184*7588Samw@Sun.COM 
185*7588Samw@Sun.COM 	if (smb_dr_clnt_call(fd, &arg) == 0) {
186*7588Samw@Sun.COM 		buf = arg.rbuf + SMB_DR_DATA_OFFSET;
187*7588Samw@Sun.COM 		len = arg.rsize - SMB_DR_DATA_OFFSET;
188*7588Samw@Sun.COM 
189*7588Samw@Sun.COM 		rc = smb_dr_decode_common(buf, len, xdr_smb_dr_ulist_t, users);
190*7588Samw@Sun.COM 		if (rc == 0)
191*7588Samw@Sun.COM 			rc = users->dul_cnt;
192*7588Samw@Sun.COM 	}
193*7588Samw@Sun.COM 
194*7588Samw@Sun.COM 	smb_dr_clnt_cleanup(&arg);
195*7588Samw@Sun.COM 	return (rc);
196*7588Samw@Sun.COM }
197*7588Samw@Sun.COM 
198*7588Samw@Sun.COM /*
199*7588Samw@Sun.COM  * Downcall to the kernel that is executed upon share enable and disable.
200*7588Samw@Sun.COM  */
201*7588Samw@Sun.COM int
202*7588Samw@Sun.COM mlsvc_set_share(int shrop, char *path, char *sharename)
203*7588Samw@Sun.COM {
204*7588Samw@Sun.COM 	door_arg_t arg;
205*7588Samw@Sun.COM 	char *buf;
206*7588Samw@Sun.COM 	size_t len;
207*7588Samw@Sun.COM 	smb_dr_kshare_t kshare;
208*7588Samw@Sun.COM 	int fd, rc = 0;
209*7588Samw@Sun.COM 
210*7588Samw@Sun.COM 	if ((shrop != SMB_SHROP_ADD) && (shrop != SMB_SHROP_DELETE))
211*7588Samw@Sun.COM 		return (EINVAL);
212*7588Samw@Sun.COM 
213*7588Samw@Sun.COM 	if ((fd = mlsvc_get_door_fd()) < 0)
214*7588Samw@Sun.COM 		return (EBADF);
215*7588Samw@Sun.COM 
216*7588Samw@Sun.COM 	kshare.k_op = shrop;
217*7588Samw@Sun.COM 	kshare.k_path = strdup(path);
218*7588Samw@Sun.COM 	kshare.k_sharename = strdup(sharename);
219*7588Samw@Sun.COM 
220*7588Samw@Sun.COM 	buf = smb_dr_encode_kshare(&kshare, &len);
221*7588Samw@Sun.COM 	free(kshare.k_path);
222*7588Samw@Sun.COM 	free(kshare.k_sharename);
223*7588Samw@Sun.COM 
224*7588Samw@Sun.COM 	if (buf == NULL)
225*7588Samw@Sun.COM 		return (ENOMEM);
226*7588Samw@Sun.COM 
227*7588Samw@Sun.COM 	smb_dr_clnt_setup(&arg, buf, len);
228*7588Samw@Sun.COM 
229*7588Samw@Sun.COM 	if (smb_dr_clnt_call(fd, &arg) == 0) {
230*7588Samw@Sun.COM 		buf = arg.rbuf + SMB_DR_DATA_OFFSET;
231*7588Samw@Sun.COM 		len = arg.rsize - SMB_DR_DATA_OFFSET;
232*7588Samw@Sun.COM 
233*7588Samw@Sun.COM 		if (smb_dr_decode_common(buf, len, xdr_int32_t, &rc) != 0)
234*7588Samw@Sun.COM 			rc = ENOMEM;
235*7588Samw@Sun.COM 	}
236*7588Samw@Sun.COM 
237*7588Samw@Sun.COM 	smb_dr_clnt_cleanup(&arg);
238*7588Samw@Sun.COM 	return (rc);
239*7588Samw@Sun.COM }
240