xref: /titanic_52/usr/src/cmd/smbsrv/fksmbd/fksmbd_shr.c (revision b819cea2f73f98c5662230cc9affc8cc84f77fcf)
1*b819cea2SGordon Ross /*
2*b819cea2SGordon Ross  * This file and its contents are supplied under the terms of the
3*b819cea2SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
4*b819cea2SGordon Ross  * You may only use this file in accordance with the terms of version
5*b819cea2SGordon Ross  * 1.0 of the CDDL.
6*b819cea2SGordon Ross  *
7*b819cea2SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
8*b819cea2SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
9*b819cea2SGordon Ross  * http://www.illumos.org/license/CDDL.
10*b819cea2SGordon Ross  */
11*b819cea2SGordon Ross 
12*b819cea2SGordon Ross /*
13*b819cea2SGordon Ross  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
14*b819cea2SGordon Ross  */
15*b819cea2SGordon Ross 
16*b819cea2SGordon Ross /*
17*b819cea2SGordon Ross  * Replace the smb_shr_load() function in libmlsvc, because
18*b819cea2SGordon Ross  * fksmbd doesn't want the real shares known by libshare,
19*b819cea2SGordon Ross  * instead preferring its own (fake) list of shares.
20*b819cea2SGordon Ross  */
21*b819cea2SGordon Ross 
22*b819cea2SGordon Ross #include <sys/types.h>
23*b819cea2SGordon Ross 
24*b819cea2SGordon Ross 
25*b819cea2SGordon Ross #include <errno.h>
26*b819cea2SGordon Ross #include <stdio.h>
27*b819cea2SGordon Ross #include <stdlib.h>
28*b819cea2SGordon Ross #include <strings.h>
29*b819cea2SGordon Ross #include <syslog.h>
30*b819cea2SGordon Ross #include <libshare.h>
31*b819cea2SGordon Ross #include <unistd.h>
32*b819cea2SGordon Ross #include <note.h>
33*b819cea2SGordon Ross 
34*b819cea2SGordon Ross #include <smbsrv/libsmb.h>
35*b819cea2SGordon Ross #include <smbsrv/libsmbns.h>
36*b819cea2SGordon Ross #include <smbsrv/libmlsvc.h>
37*b819cea2SGordon Ross #include <smbsrv/smb_share.h>
38*b819cea2SGordon Ross #include <smbsrv/smb.h>
39*b819cea2SGordon Ross 
40*b819cea2SGordon Ross static void
41*b819cea2SGordon Ross new_share(char *name, char *path, char *comment, int flags)
42*b819cea2SGordon Ross {
43*b819cea2SGordon Ross 	smb_share_t si;
44*b819cea2SGordon Ross 
45*b819cea2SGordon Ross 	bzero(&si, sizeof (si));
46*b819cea2SGordon Ross 	(void) strlcpy(si.shr_name, name, MAXNAMELEN);
47*b819cea2SGordon Ross 	(void) strlcpy(si.shr_path, path, MAXPATHLEN);
48*b819cea2SGordon Ross 	(void) strlcpy(si.shr_cmnt, comment, SMB_SHARE_CMNT_MAX);
49*b819cea2SGordon Ross 	si.shr_flags = flags;
50*b819cea2SGordon Ross 	if (smb_shr_add(&si) != 0) {
51*b819cea2SGordon Ross 		syslog(LOG_ERR, "failed to add test share: %s",
52*b819cea2SGordon Ross 		    si.shr_name);
53*b819cea2SGordon Ross 	}
54*b819cea2SGordon Ross }
55*b819cea2SGordon Ross 
56*b819cea2SGordon Ross /*
57*b819cea2SGordon Ross  * This function loads a list of shares from a text file, where
58*b819cea2SGordon Ross  * each line of the file contains:
59*b819cea2SGordon Ross  * name path comment
60*b819cea2SGordon Ross  *
61*b819cea2SGordon Ross  * This is only for fksmbd, for testing.
62*b819cea2SGordon Ross  */
63*b819cea2SGordon Ross void
64*b819cea2SGordon Ross shr_load_file(char *shr_file)
65*b819cea2SGordon Ross {
66*b819cea2SGordon Ross 	char linebuf[1024];
67*b819cea2SGordon Ross 	FILE *fp;
68*b819cea2SGordon Ross 	char *p;
69*b819cea2SGordon Ross 	char *name, *path, *comment;
70*b819cea2SGordon Ross 
71*b819cea2SGordon Ross 	fp = fopen(shr_file, "r");
72*b819cea2SGordon Ross 	if (fp == NULL) {
73*b819cea2SGordon Ross 		perror(shr_file);
74*b819cea2SGordon Ross 		return;
75*b819cea2SGordon Ross 	}
76*b819cea2SGordon Ross 
77*b819cea2SGordon Ross 	while ((p = fgets(linebuf, sizeof (linebuf), fp)) != NULL) {
78*b819cea2SGordon Ross 
79*b819cea2SGordon Ross 		name = p;
80*b819cea2SGordon Ross 		p = strpbrk(p, " \t\n");
81*b819cea2SGordon Ross 		if (p == NULL)
82*b819cea2SGordon Ross 			continue;
83*b819cea2SGordon Ross 		*p++ = '\0';
84*b819cea2SGordon Ross 
85*b819cea2SGordon Ross 		path = p;
86*b819cea2SGordon Ross 		p = strpbrk(p, " \t\n");
87*b819cea2SGordon Ross 		if (p == NULL)
88*b819cea2SGordon Ross 			comment = "";
89*b819cea2SGordon Ross 		else {
90*b819cea2SGordon Ross 			*p++ = '\0';
91*b819cea2SGordon Ross 
92*b819cea2SGordon Ross 			comment = p;
93*b819cea2SGordon Ross 			p = strchr(p, '\n');
94*b819cea2SGordon Ross 			if (p != NULL)
95*b819cea2SGordon Ross 				*p++ = '\0';
96*b819cea2SGordon Ross 		}
97*b819cea2SGordon Ross 		new_share(name, path, comment, 0);
98*b819cea2SGordon Ross 	}
99*b819cea2SGordon Ross 	(void) fclose(fp);
100*b819cea2SGordon Ross }
101*b819cea2SGordon Ross 
102*b819cea2SGordon Ross /*ARGSUSED*/
103*b819cea2SGordon Ross void *
104*b819cea2SGordon Ross smb_shr_load(void *args)
105*b819cea2SGordon Ross {
106*b819cea2SGordon Ross 	char *shr_file;
107*b819cea2SGordon Ross 	_NOTE(ARGUNUSED(args))
108*b819cea2SGordon Ross 
109*b819cea2SGordon Ross 	/*
110*b819cea2SGordon Ross 	 * Not loading the real shares in fksmbd because that
111*b819cea2SGordon Ross 	 * tries to enable the network/smb/server service.
112*b819cea2SGordon Ross 	 * Also, we won't generally have access to everything
113*b819cea2SGordon Ross 	 * in the real shares, because fksmbd runs (only) with
114*b819cea2SGordon Ross 	 * the credentials of the user who runs it.
115*b819cea2SGordon Ross 	 */
116*b819cea2SGordon Ross 	new_share("test", "/var/smb/test", "fksmbd test share",
117*b819cea2SGordon Ross 	    SMB_SHRF_GUEST_OK);
118*b819cea2SGordon Ross 
119*b819cea2SGordon Ross 	/* Allow creating lots of shares for testing. */
120*b819cea2SGordon Ross 	shr_file = getenv("FKSMBD_SHARE_FILE");
121*b819cea2SGordon Ross 	if (shr_file != NULL)
122*b819cea2SGordon Ross 		shr_load_file(shr_file);
123*b819cea2SGordon Ross 
124*b819cea2SGordon Ross 	return (NULL);
125*b819cea2SGordon Ross }
126