1*8329232eSGordon Ross /*
2*8329232eSGordon Ross  * This file and its contents are supplied under the terms of the
3*8329232eSGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
4*8329232eSGordon Ross  * You may only use this file in accordance with the terms of version
5*8329232eSGordon Ross  * 1.0 of the CDDL.
6*8329232eSGordon Ross  *
7*8329232eSGordon Ross  * A full copy of the text of the CDDL should have accompanied this
8*8329232eSGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
9*8329232eSGordon Ross  * http://www.illumos.org/license/CDDL.
10*8329232eSGordon Ross  */
11*8329232eSGordon Ross 
12*8329232eSGordon Ross /*
13*8329232eSGordon Ross  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
14*8329232eSGordon Ross  */
15*8329232eSGordon Ross 
16*8329232eSGordon Ross /*
17*8329232eSGordon Ross  * This file implements device open/close/ioctl wrappers that
18*8329232eSGordon Ross  * redirect access from the real "nsmb" device to the in-process
19*8329232eSGordon Ross  * device simulation in libfknsmb.
20*8329232eSGordon Ross  */
21*8329232eSGordon Ross 
22*8329232eSGordon Ross #include <sys/param.h>
23*8329232eSGordon Ross #include <sys/ioctl.h>
24*8329232eSGordon Ross #include <sys/time.h>
25*8329232eSGordon Ross #include <sys/mount.h>
26*8329232eSGordon Ross #include <sys/types.h>
27*8329232eSGordon Ross #include <sys/byteorder.h>
28*8329232eSGordon Ross 
29*8329232eSGordon Ross #include <fcntl.h>
30*8329232eSGordon Ross #include <ctype.h>
31*8329232eSGordon Ross #include <errno.h>
32*8329232eSGordon Ross #include <stdio.h>
33*8329232eSGordon Ross #include <string.h>
34*8329232eSGordon Ross #include <strings.h>
35*8329232eSGordon Ross #include <stdlib.h>
36*8329232eSGordon Ross #include <pwd.h>
37*8329232eSGordon Ross #include <grp.h>
38*8329232eSGordon Ross #include <unistd.h>
39*8329232eSGordon Ross #include <libintl.h>
40*8329232eSGordon Ross #include <assert.h>
41*8329232eSGordon Ross #include <nss_dbdefs.h>
42*8329232eSGordon Ross 
43*8329232eSGordon Ross #include <cflib.h>
44*8329232eSGordon Ross #include <netsmb/smb_lib.h>
45*8329232eSGordon Ross #include <netsmb/netbios.h>
46*8329232eSGordon Ross #include <netsmb/nb_lib.h>
47*8329232eSGordon Ross #include <netsmb/smb_dev.h>
48*8329232eSGordon Ross 
49*8329232eSGordon Ross #include <libfknsmb/common/libfknsmb.h>
50*8329232eSGordon Ross 
51*8329232eSGordon Ross #include "smb/charsets.h"
52*8329232eSGordon Ross #include "smb/private.h"
53*8329232eSGordon Ross 
54*8329232eSGordon Ross int
smb_open_driver(void)55*8329232eSGordon Ross smb_open_driver(void)
56*8329232eSGordon Ross {
57*8329232eSGordon Ross 	dev32_t dev;
58*8329232eSGordon Ross 	int fd;
59*8329232eSGordon Ross 	int rc;
60*8329232eSGordon Ross 
61*8329232eSGordon Ross 	rc = nsmb_drv_open(&dev, 0, 0);
62*8329232eSGordon Ross 	if (rc != 0) {
63*8329232eSGordon Ross 		errno = rc;
64*8329232eSGordon Ross 		return (-1);
65*8329232eSGordon Ross 	}
66*8329232eSGordon Ross 
67*8329232eSGordon Ross 	assert((dev & 0xFFFF0000) != 0);
68*8329232eSGordon Ross 	fd = (int)dev;
69*8329232eSGordon Ross 
70*8329232eSGordon Ross 	return (fd);
71*8329232eSGordon Ross }
72*8329232eSGordon Ross 
73*8329232eSGordon Ross int
nsmb_ioctl(int fd,int cmd,void * arg)74*8329232eSGordon Ross nsmb_ioctl(int fd, int cmd, void *arg)
75*8329232eSGordon Ross {
76*8329232eSGordon Ross 	dev32_t dev;
77*8329232eSGordon Ross 	int err;
78*8329232eSGordon Ross 
79*8329232eSGordon Ross 	dev = (dev32_t)fd;
80*8329232eSGordon Ross 	assert((dev & 0xFFFF0000) != 0);
81*8329232eSGordon Ross 	err = nsmb_drv_ioctl(dev, cmd, (intptr_t)arg, 0);
82*8329232eSGordon Ross 	if (err != 0) {
83*8329232eSGordon Ross 		errno = err;
84*8329232eSGordon Ross 		return (-1);
85*8329232eSGordon Ross 	}
86*8329232eSGordon Ross 	return (0);
87*8329232eSGordon Ross }
88*8329232eSGordon Ross 
89*8329232eSGordon Ross int
nsmb_close(int fd)90*8329232eSGordon Ross nsmb_close(int fd)
91*8329232eSGordon Ross {
92*8329232eSGordon Ross 	dev32_t dev;
93*8329232eSGordon Ross 
94*8329232eSGordon Ross 	dev = (dev32_t)fd;
95*8329232eSGordon Ross 	assert((dev & 0xFFFF0000) != 0);
96*8329232eSGordon Ross 	(void) nsmb_drv_close(dev, 0, 0);
97*8329232eSGordon Ross 	return (0);
98*8329232eSGordon Ross }
99