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