/* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright 2018 Nexenta Systems, Inc. All rights reserved. */ /* * Replace the smb_shr_load() function in libmlsvc, because * fksmbd doesn't want the real shares known by libshare, * instead preferring its own (fake) list of shares. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void new_share(char *name, char *path, char *comment, int flags) { smb_share_t si; bzero(&si, sizeof (si)); (void) strlcpy(si.shr_name, name, MAXNAMELEN); (void) strlcpy(si.shr_path, path, MAXPATHLEN); (void) strlcpy(si.shr_cmnt, comment, SMB_SHARE_CMNT_MAX); si.shr_flags = flags; if (smb_shr_add(&si) != 0) { syslog(LOG_ERR, "failed to add test share: %s", si.shr_name); } } /* * This function loads a list of shares from a text file, where * each line of the file contains: * name path comment * * This is only for fksmbd, for testing. */ void shr_load_file(char *shr_file) { char linebuf[1024]; FILE *fp; char *p; char *name, *path, *comment; fp = fopen(shr_file, "r"); if (fp == NULL) { perror(shr_file); return; } while ((p = fgets(linebuf, sizeof (linebuf), fp)) != NULL) { name = p; p = strpbrk(p, " \t\n"); if (p == NULL) continue; *p++ = '\0'; path = p; p = strpbrk(p, " \t\n"); if (p == NULL) comment = ""; else { *p++ = '\0'; comment = p; p = strchr(p, '\n'); if (p != NULL) *p++ = '\0'; } new_share(name, path, comment, 0); } (void) fclose(fp); } /*ARGSUSED*/ void * smb_shr_load(void *args) { char *shr_file; _NOTE(ARGUNUSED(args)) /* * Not loading the real shares in fksmbd because that * tries to enable the network/smb/server service. * Also, we won't generally have access to everything * in the real shares, because fksmbd runs (only) with * the credentials of the user who runs it. */ new_share("test", "/var/smb/test", "fksmbd test share", SMB_SHRF_GUEST_OK); new_share("testca", "/var/smb/test", "fksmbd test CA share", SMB_SHRF_CA); /* Allow creating lots of shares for testing. */ shr_file = getenv("FKSMBD_SHARE_FILE"); if (shr_file != NULL) shr_load_file(shr_file); return (NULL); } void smb_shr_load_execinfo() { } void smb_shr_unload() { }