xref: /onnv-gate/usr/src/lib/smbsrv/libmlsvc/common/wkssvc_svc.c (revision 12508:edb7861a1533)
111963SAfshin.Ardakani@Sun.COM /*
211963SAfshin.Ardakani@Sun.COM  * CDDL HEADER START
311963SAfshin.Ardakani@Sun.COM  *
411963SAfshin.Ardakani@Sun.COM  * The contents of this file are subject to the terms of the
511963SAfshin.Ardakani@Sun.COM  * Common Development and Distribution License (the "License").
611963SAfshin.Ardakani@Sun.COM  * You may not use this file except in compliance with the License.
711963SAfshin.Ardakani@Sun.COM  *
811963SAfshin.Ardakani@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
911963SAfshin.Ardakani@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1011963SAfshin.Ardakani@Sun.COM  * See the License for the specific language governing permissions
1111963SAfshin.Ardakani@Sun.COM  * and limitations under the License.
1211963SAfshin.Ardakani@Sun.COM  *
1311963SAfshin.Ardakani@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1411963SAfshin.Ardakani@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1511963SAfshin.Ardakani@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1611963SAfshin.Ardakani@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1711963SAfshin.Ardakani@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1811963SAfshin.Ardakani@Sun.COM  *
1911963SAfshin.Ardakani@Sun.COM  * CDDL HEADER END
2011963SAfshin.Ardakani@Sun.COM  */
21*12508Samw@Sun.COM 
2211963SAfshin.Ardakani@Sun.COM /*
23*12508Samw@Sun.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
2411963SAfshin.Ardakani@Sun.COM  */
2511963SAfshin.Ardakani@Sun.COM 
2611963SAfshin.Ardakani@Sun.COM #include <netdb.h>
2711963SAfshin.Ardakani@Sun.COM #include <sys/types.h>
2811963SAfshin.Ardakani@Sun.COM #include <string.h>
2911963SAfshin.Ardakani@Sun.COM #include <strings.h>
3011963SAfshin.Ardakani@Sun.COM #include <smbsrv/libsmb.h>
3111963SAfshin.Ardakani@Sun.COM #include <smbsrv/libmlsvc.h>
3211963SAfshin.Ardakani@Sun.COM #include <smbsrv/smbinfo.h>
3311963SAfshin.Ardakani@Sun.COM #include <smbsrv/nmpipes.h>
3411963SAfshin.Ardakani@Sun.COM #include <smbsrv/ndl/srvsvc.ndl>
3511963SAfshin.Ardakani@Sun.COM 
3611963SAfshin.Ardakani@Sun.COM static int wkssvc_s_NetWkstaGetInfo(void *, ndr_xa_t *);
3711963SAfshin.Ardakani@Sun.COM static int wkssvc_s_NetWkstaTransportEnum(void *, ndr_xa_t *);
3811963SAfshin.Ardakani@Sun.COM 
3911963SAfshin.Ardakani@Sun.COM static ndr_stub_table_t wkssvc_stub_table[] = {
4011963SAfshin.Ardakani@Sun.COM 	{ wkssvc_s_NetWkstaGetInfo,	WKSSVC_OPNUM_NetWkstaGetInfo },
4111963SAfshin.Ardakani@Sun.COM 	{ wkssvc_s_NetWkstaTransportEnum, WKSSVC_OPNUM_NetWkstaTransportEnum },
4211963SAfshin.Ardakani@Sun.COM 	{0}
4311963SAfshin.Ardakani@Sun.COM };
4411963SAfshin.Ardakani@Sun.COM 
4511963SAfshin.Ardakani@Sun.COM static ndr_service_t wkssvc_service = {
4611963SAfshin.Ardakani@Sun.COM 	"Workstation",			/* name (WKSSVC or WKSTA) */
4711963SAfshin.Ardakani@Sun.COM 	"Workstation services",		/* desc */
4811963SAfshin.Ardakani@Sun.COM 	"\\wkssvc",			/* endpoint */
4911963SAfshin.Ardakani@Sun.COM 	PIPE_NTSVCS,			/* sec_addr_port */
5011963SAfshin.Ardakani@Sun.COM 	"6bffd098-a112-3610-9833-46c3f87e345a", 1,	/* abstract */
5111963SAfshin.Ardakani@Sun.COM 	NDR_TRANSFER_SYNTAX_UUID,		2,	/* transfer */
5211963SAfshin.Ardakani@Sun.COM 	0,				/* no bind_instance_size */
5311963SAfshin.Ardakani@Sun.COM 	0,				/* no bind_req() */
5411963SAfshin.Ardakani@Sun.COM 	0,				/* no unbind_and_close() */
5511963SAfshin.Ardakani@Sun.COM 	0,				/* use generic_call_stub() */
5611963SAfshin.Ardakani@Sun.COM 	&TYPEINFO(wkssvc_interface),	/* interface ti */
5711963SAfshin.Ardakani@Sun.COM 	wkssvc_stub_table		/* stub_table */
5811963SAfshin.Ardakani@Sun.COM };
5911963SAfshin.Ardakani@Sun.COM 
6011963SAfshin.Ardakani@Sun.COM void
wkssvc_initialize(void)6111963SAfshin.Ardakani@Sun.COM wkssvc_initialize(void)
6211963SAfshin.Ardakani@Sun.COM {
6311963SAfshin.Ardakani@Sun.COM 	(void) ndr_svc_register(&wkssvc_service);
6411963SAfshin.Ardakani@Sun.COM }
6511963SAfshin.Ardakani@Sun.COM 
6611963SAfshin.Ardakani@Sun.COM /*
6711963SAfshin.Ardakani@Sun.COM  * WKSSVC NetWkstaGetInfo
6811963SAfshin.Ardakani@Sun.COM  */
6911963SAfshin.Ardakani@Sun.COM static int
wkssvc_s_NetWkstaGetInfo(void * arg,ndr_xa_t * mxa)7011963SAfshin.Ardakani@Sun.COM wkssvc_s_NetWkstaGetInfo(void *arg, ndr_xa_t *mxa)
7111963SAfshin.Ardakani@Sun.COM {
7211963SAfshin.Ardakani@Sun.COM 	struct mslm_NetWkstaGetInfo *param = arg;
7311963SAfshin.Ardakani@Sun.COM 	mslm_NetWkstaGetInfo_rb *rb;
7411963SAfshin.Ardakani@Sun.COM 	char hostname[MAXHOSTNAMELEN];
7511963SAfshin.Ardakani@Sun.COM 	char resource_domain[SMB_PI_MAX_DOMAIN];
7611963SAfshin.Ardakani@Sun.COM 	smb_version_t version;
7711963SAfshin.Ardakani@Sun.COM 	char *name;
7811963SAfshin.Ardakani@Sun.COM 	char *domain;
7911963SAfshin.Ardakani@Sun.COM 	DWORD status;
8011963SAfshin.Ardakani@Sun.COM 	int rc;
8111963SAfshin.Ardakani@Sun.COM 
8211963SAfshin.Ardakani@Sun.COM 	(void) smb_getdomainname(resource_domain, SMB_PI_MAX_DOMAIN);
8311963SAfshin.Ardakani@Sun.COM 
8411963SAfshin.Ardakani@Sun.COM 	rb = NDR_NEW(mxa, mslm_NetWkstaGetInfo_rb);
8511963SAfshin.Ardakani@Sun.COM 
8611963SAfshin.Ardakani@Sun.COM 	if ((rc = smb_getnetbiosname(hostname, MAXHOSTNAMELEN)) == 0) {
8711963SAfshin.Ardakani@Sun.COM 		name = NDR_STRDUP(mxa, hostname);
8811963SAfshin.Ardakani@Sun.COM 		domain = NDR_STRDUP(mxa, resource_domain);
8911963SAfshin.Ardakani@Sun.COM 	}
9011963SAfshin.Ardakani@Sun.COM 
9111963SAfshin.Ardakani@Sun.COM 	if ((rc != 0) || (rb == NULL) || (name == NULL) || (domain == NULL)) {
9211963SAfshin.Ardakani@Sun.COM 		bzero(param, sizeof (struct mslm_NetWkstaGetInfo));
9311963SAfshin.Ardakani@Sun.COM 		param->status = ERROR_NOT_ENOUGH_MEMORY;
9411963SAfshin.Ardakani@Sun.COM 		return (NDR_DRC_OK);
9511963SAfshin.Ardakani@Sun.COM 	}
9611963SAfshin.Ardakani@Sun.COM 
9711963SAfshin.Ardakani@Sun.COM 	smb_config_get_version(&version);
9811963SAfshin.Ardakani@Sun.COM 
9911963SAfshin.Ardakani@Sun.COM 	param->result.level = param->level;
10011963SAfshin.Ardakani@Sun.COM 	param->result.bufptr.nullptr = (void *)rb;
10111963SAfshin.Ardakani@Sun.COM 
10211963SAfshin.Ardakani@Sun.COM 	switch (param->level) {
10311963SAfshin.Ardakani@Sun.COM 	case 100:
10411963SAfshin.Ardakani@Sun.COM 		rb->buf100.wki100_platform_id = SV_PLATFORM_ID_NT;
10511963SAfshin.Ardakani@Sun.COM 		rb->buf100.wki100_ver_major = version.sv_major;
10611963SAfshin.Ardakani@Sun.COM 		rb->buf100.wki100_ver_minor = version.sv_minor;
10711963SAfshin.Ardakani@Sun.COM 		rb->buf100.wki100_computername = (unsigned char *)name;
10811963SAfshin.Ardakani@Sun.COM 		rb->buf100.wki100_langroup = (unsigned char *)domain;
10911963SAfshin.Ardakani@Sun.COM 		status = ERROR_SUCCESS;
11011963SAfshin.Ardakani@Sun.COM 		break;
11111963SAfshin.Ardakani@Sun.COM 
11211963SAfshin.Ardakani@Sun.COM 	case 101:
11311963SAfshin.Ardakani@Sun.COM 		rb->buf101.wki101_platform_id = SV_PLATFORM_ID_NT;
11411963SAfshin.Ardakani@Sun.COM 		rb->buf101.wki101_ver_major = version.sv_major;
11511963SAfshin.Ardakani@Sun.COM 		rb->buf101.wki101_ver_minor = version.sv_minor;
11611963SAfshin.Ardakani@Sun.COM 		rb->buf101.wki101_computername = (unsigned char *)name;
11711963SAfshin.Ardakani@Sun.COM 		rb->buf101.wki101_langroup = (unsigned char *)domain;
11811963SAfshin.Ardakani@Sun.COM 		rb->buf101.wki101_lanroot = (unsigned char *)"";
11911963SAfshin.Ardakani@Sun.COM 		status = ERROR_SUCCESS;
12011963SAfshin.Ardakani@Sun.COM 		break;
12111963SAfshin.Ardakani@Sun.COM 
12211963SAfshin.Ardakani@Sun.COM 	case 102:
12311963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_platform_id = SV_PLATFORM_ID_NT;
12411963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_ver_major = version.sv_major;
12511963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_ver_minor = version.sv_minor;
12611963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_computername = (unsigned char *)name;
12711963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_langroup = (unsigned char *)domain;
12811963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_lanroot = (unsigned char *)"";
12911963SAfshin.Ardakani@Sun.COM 		rb->buf102.wki102_logged_on_users = 1;
13011963SAfshin.Ardakani@Sun.COM 		status = ERROR_SUCCESS;
13111963SAfshin.Ardakani@Sun.COM 		break;
13211963SAfshin.Ardakani@Sun.COM 
13311963SAfshin.Ardakani@Sun.COM 	case 502:
13411963SAfshin.Ardakani@Sun.COM 		bzero(&rb->buf502, sizeof (struct mslm_WKSTA_INFO_502));
13511963SAfshin.Ardakani@Sun.COM 		rb->buf502.keep_connection = 600;
13611963SAfshin.Ardakani@Sun.COM 		rb->buf502.max_commands = 1024;
13711963SAfshin.Ardakani@Sun.COM 		rb->buf502.session_timeout = 5400;
13811963SAfshin.Ardakani@Sun.COM 		rb->buf502.size_char_buf = 1024;
13911963SAfshin.Ardakani@Sun.COM 		rb->buf502.max_threads = 1024;
14011963SAfshin.Ardakani@Sun.COM 		rb->buf502.use_opportunistic_locking = 1;
14111963SAfshin.Ardakani@Sun.COM 		rb->buf502.use_unlock_behind = 1;
14211963SAfshin.Ardakani@Sun.COM 		rb->buf502.use_close_behind = 1;
14311963SAfshin.Ardakani@Sun.COM 		rb->buf502.buf_named_pipes = 1;
14411963SAfshin.Ardakani@Sun.COM 		rb->buf502.use_lock_read_unlock = 1;
14511963SAfshin.Ardakani@Sun.COM 		rb->buf502.utilize_nt_caching = 1;
14611963SAfshin.Ardakani@Sun.COM 		rb->buf502.use_raw_read = 1;
14711963SAfshin.Ardakani@Sun.COM 		rb->buf502.use_raw_write = 1;
14811963SAfshin.Ardakani@Sun.COM 		status = ERROR_SUCCESS;
14911963SAfshin.Ardakani@Sun.COM 		break;
15011963SAfshin.Ardakani@Sun.COM 
15111963SAfshin.Ardakani@Sun.COM 	default:
15211963SAfshin.Ardakani@Sun.COM 		param->result.bufptr.nullptr = 0;
15311963SAfshin.Ardakani@Sun.COM 		status = ERROR_INVALID_LEVEL;
15411963SAfshin.Ardakani@Sun.COM 		break;
15511963SAfshin.Ardakani@Sun.COM 	}
15611963SAfshin.Ardakani@Sun.COM 
15711963SAfshin.Ardakani@Sun.COM 	if (status != ERROR_SUCCESS) {
15811963SAfshin.Ardakani@Sun.COM 		bzero(param, sizeof (struct mslm_NetWkstaGetInfo));
15911963SAfshin.Ardakani@Sun.COM 		param->status = status;
16011963SAfshin.Ardakani@Sun.COM 	}
16111963SAfshin.Ardakani@Sun.COM 
16211963SAfshin.Ardakani@Sun.COM 	return (NDR_DRC_OK);
16311963SAfshin.Ardakani@Sun.COM }
16411963SAfshin.Ardakani@Sun.COM 
16511963SAfshin.Ardakani@Sun.COM /*
16611963SAfshin.Ardakani@Sun.COM  * WKSSVC NetWkstaTransportEnum
16711963SAfshin.Ardakani@Sun.COM  */
16811963SAfshin.Ardakani@Sun.COM static int
wkssvc_s_NetWkstaTransportEnum(void * arg,ndr_xa_t * mxa)16911963SAfshin.Ardakani@Sun.COM wkssvc_s_NetWkstaTransportEnum(void *arg, ndr_xa_t *mxa)
17011963SAfshin.Ardakani@Sun.COM {
17111963SAfshin.Ardakani@Sun.COM 	struct mslm_NetWkstaTransportEnum *param = arg;
17211963SAfshin.Ardakani@Sun.COM 	struct mslm_NetWkstaTransportCtr0 *info0;
17311963SAfshin.Ardakani@Sun.COM 	struct mslm_NetWkstaTransportInfo0 *ti0;
17411963SAfshin.Ardakani@Sun.COM 
17511963SAfshin.Ardakani@Sun.COM 	switch (param->info.level) {
17611963SAfshin.Ardakani@Sun.COM 	case 0:
17711963SAfshin.Ardakani@Sun.COM 		info0 = NDR_NEW(mxa, struct mslm_NetWkstaTransportCtr0);
17811963SAfshin.Ardakani@Sun.COM 		ti0 = NDR_NEW(mxa, struct mslm_NetWkstaTransportInfo0);
17911963SAfshin.Ardakani@Sun.COM 
18011963SAfshin.Ardakani@Sun.COM 		if (info0 == NULL || ti0 == NULL) {
18111963SAfshin.Ardakani@Sun.COM 			bzero(param, sizeof (struct mslm_NetWkstaGetInfo));
18211963SAfshin.Ardakani@Sun.COM 			param->status = ERROR_NOT_ENOUGH_MEMORY;
18311963SAfshin.Ardakani@Sun.COM 			break;
18411963SAfshin.Ardakani@Sun.COM 		}
18511963SAfshin.Ardakani@Sun.COM 
18611963SAfshin.Ardakani@Sun.COM 		ti0->quality_of_service = 65535;
18711963SAfshin.Ardakani@Sun.COM 		ti0->num_vcs = 0;
18811963SAfshin.Ardakani@Sun.COM 		ti0->transport_name = (unsigned char *)"\\Device\\NetbiosSmb";
18911963SAfshin.Ardakani@Sun.COM 		ti0->transport_address = (unsigned char *)"000000000000";
19011963SAfshin.Ardakani@Sun.COM 		ti0->wan_ish = 1024;
19111963SAfshin.Ardakani@Sun.COM 
19211963SAfshin.Ardakani@Sun.COM 		info0->count = 1;
19311963SAfshin.Ardakani@Sun.COM 		info0->ti0 = ti0;
19411963SAfshin.Ardakani@Sun.COM 		param->info.ru.info0 = info0;
19511963SAfshin.Ardakani@Sun.COM 		param->total_entries = 1;
19611963SAfshin.Ardakani@Sun.COM 
19711963SAfshin.Ardakani@Sun.COM 		if (param->resume_handle)
19811963SAfshin.Ardakani@Sun.COM 			*param->resume_handle = 0;
19911963SAfshin.Ardakani@Sun.COM 
20011963SAfshin.Ardakani@Sun.COM 		param->status = ERROR_SUCCESS;
20111963SAfshin.Ardakani@Sun.COM 		break;
20211963SAfshin.Ardakani@Sun.COM 
20311963SAfshin.Ardakani@Sun.COM 	default:
20411963SAfshin.Ardakani@Sun.COM 		bzero(param, sizeof (struct mslm_NetWkstaGetInfo));
20511963SAfshin.Ardakani@Sun.COM 		param->status = ERROR_INVALID_LEVEL;
20611963SAfshin.Ardakani@Sun.COM 	}
20711963SAfshin.Ardakani@Sun.COM 
20811963SAfshin.Ardakani@Sun.COM 	return (NDR_DRC_OK);
20911963SAfshin.Ardakani@Sun.COM }
210