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