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