summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshare/nfs
diff options
context:
space:
mode:
authorPavan Mettu - Oracle Corporation - Menlo Park United States <Pavan.Mettu@Oracle.COM>2010-08-11 17:11:30 -0500
committerPavan Mettu - Oracle Corporation - Menlo Park United States <Pavan.Mettu@Oracle.COM>2010-08-11 17:11:30 -0500
commitdd51520e127b452179a2ce4ea3bd8dee949f9afe (patch)
tree83549f0e38176f8d8204a6e9b2a21601d339ba91 /usr/src/lib/libshare/nfs
parent8276d7915abc7c44934b5701e6ae35ec26eba740 (diff)
downloadillumos-joyent-dd51520e127b452179a2ce4ea3bd8dee949f9afe.tar.gz
6975309 PSARC2007_393 Move /etc/default/{nfs/autofs} parameters to SMF
PSARC 2007/393 converting /etc/default/{nfs,autofs} to SMF properties
Diffstat (limited to 'usr/src/lib/libshare/nfs')
-rw-r--r--usr/src/lib/libshare/nfs/Makefile.com8
-rw-r--r--usr/src/lib/libshare/nfs/libshare_nfs.c445
-rw-r--r--usr/src/lib/libshare/nfs/libshare_nfs.h11
3 files changed, 154 insertions, 310 deletions
diff --git a/usr/src/lib/libshare/nfs/Makefile.com b/usr/src/lib/libshare/nfs/Makefile.com
index 57686c34de..7c70784c03 100644
--- a/usr/src/lib/libshare/nfs/Makefile.com
+++ b/usr/src/lib/libshare/nfs/Makefile.com
@@ -19,10 +19,8 @@
# CDDL HEADER END
#
#
-# ident "%Z%%M% %I% %E% SMI"
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
#
LIBRARY = libshare_nfs.a
@@ -30,7 +28,7 @@ VERS = .1
NFSLIB_DIR = $(SRC)/cmd/fs.d/nfs/lib
LIBOBJS = libshare_nfs.o
-OTHOBJS = nfs_sec.o nfslog_config.o nfslogtab.o
+OTHOBJS = nfs_sec.o nfslog_config.o nfslogtab.o smfcfg.o
OBJECTS = $(LIBOBJS) $(OTHOBJS)
include ../../../Makefile.lib
@@ -59,7 +57,7 @@ install: all
lint: lintcheck
-pics/%.o: $(NFSLIB_DIR)/%.c
+pics/%.o: $(NFSLIB_DIR)/%.c
$(COMPILE.c) -o $@ $<
$(POST_PROCESS_O)
diff --git a/usr/src/lib/libshare/nfs/libshare_nfs.c b/usr/src/lib/libshare/nfs/libshare_nfs.c
index 3173e47d7f..8d18ecee95 100644
--- a/usr/src/lib/libshare/nfs/libshare_nfs.c
+++ b/usr/src/lib/libshare/nfs/libshare_nfs.c
@@ -35,18 +35,21 @@
#include <errno.h>
#include <locale.h>
#include <signal.h>
+#include <strings.h>
#include "libshare.h"
#include "libshare_impl.h"
#include <nfs/export.h>
#include <pwd.h>
#include <limits.h>
#include <libscf.h>
+#include <syslog.h>
+#include <rpcsvc/daemon_utils.h>
#include "nfslog_config.h"
#include "nfslogtab.h"
#include "libshare_nfs.h"
-#include <rpcsvc/daemon_utils.h>
#include <nfs/nfs.h>
#include <nfs/nfssys.h>
+#include "smfcfg.h"
/* should really be in some global place */
#define DEF_WIN 30000
@@ -55,6 +58,7 @@
int debug = 0;
#define NFS_SERVER_SVC "svc:/network/nfs/server:default"
+#define NFS_CLIENT_SVC (char *)"svc:/network/nfs/client:default"
/* internal functions */
static int nfs_init();
@@ -1523,7 +1527,7 @@ err:
sa_free_attr_string(sectype);
if (options != NULL)
sa_free_derived_optionset(options);
- return (NULL);
+ return (buff);
}
/*
@@ -2322,7 +2326,6 @@ struct proto_option_defs {
uint32_t svcs;
int32_t minval;
int32_t maxval;
- char *file;
char *other;
int compare;
#define OPT_CMP_GE 0
@@ -2332,65 +2335,67 @@ struct proto_option_defs {
#define PROTO_OPT_NFSD_SERVERS 0
{"nfsd_servers",
"servers", PROTO_OPT_NFSD_SERVERS, OPT_TYPE_NUMBER, 16, SVC_NFSD,
- 1, INT32_MAX, NFSADMIN},
+ 1, INT32_MAX},
#define PROTO_OPT_LOCKD_LISTEN_BACKLOG 1
{"lockd_listen_backlog",
"lockd_listen_backlog", PROTO_OPT_LOCKD_LISTEN_BACKLOG,
- OPT_TYPE_NUMBER, 32, SVC_LOCKD, 32, INT32_MAX, NFSADMIN},
+ OPT_TYPE_NUMBER, 32, SVC_LOCKD, 32, INT32_MAX},
#define PROTO_OPT_LOCKD_SERVERS 2
{"lockd_servers",
"lockd_servers", PROTO_OPT_LOCKD_SERVERS, OPT_TYPE_NUMBER, 20,
- SVC_LOCKD, 1, INT32_MAX, NFSADMIN},
+ SVC_LOCKD, 1, INT32_MAX},
#define PROTO_OPT_LOCKD_RETRANSMIT_TIMEOUT 3
{"lockd_retransmit_timeout",
"lockd_retransmit_timeout", PROTO_OPT_LOCKD_RETRANSMIT_TIMEOUT,
- OPT_TYPE_NUMBER, 5, SVC_LOCKD, 0, INT32_MAX, NFSADMIN},
+ OPT_TYPE_NUMBER, 5, SVC_LOCKD, 0, INT32_MAX},
#define PROTO_OPT_GRACE_PERIOD 4
{"grace_period",
"grace_period", PROTO_OPT_GRACE_PERIOD, OPT_TYPE_NUMBER, 90,
- SVC_LOCKD, 0, INT32_MAX, NFSADMIN},
+ SVC_LOCKD, 0, INT32_MAX},
#define PROTO_OPT_NFS_SERVER_VERSMIN 5
{"nfs_server_versmin",
"server_versmin", PROTO_OPT_NFS_SERVER_VERSMIN, OPT_TYPE_NUMBER,
(int)NFS_VERSMIN_DEFAULT, SVC_NFSD|SVC_MOUNTD, NFS_VERSMIN,
- NFS_VERSMAX, NFSADMIN, "server_versmax", OPT_CMP_LE},
+ NFS_VERSMAX, "server_versmax", OPT_CMP_LE},
#define PROTO_OPT_NFS_SERVER_VERSMAX 6
{"nfs_server_versmax",
"server_versmax", PROTO_OPT_NFS_SERVER_VERSMAX, OPT_TYPE_NUMBER,
(int)NFS_VERSMAX_DEFAULT, SVC_NFSD|SVC_MOUNTD, NFS_VERSMIN,
- NFS_VERSMAX, NFSADMIN, "server_versmin", OPT_CMP_GE},
+ NFS_VERSMAX, "server_versmin", OPT_CMP_GE},
#define PROTO_OPT_NFS_CLIENT_VERSMIN 7
{"nfs_client_versmin",
"client_versmin", PROTO_OPT_NFS_CLIENT_VERSMIN, OPT_TYPE_NUMBER,
- (int)NFS_VERSMIN_DEFAULT, NULL, NFS_VERSMIN, NFS_VERSMAX,
- NFSADMIN, "client_versmax", OPT_CMP_LE},
+ (int)NFS_VERSMIN_DEFAULT, SVC_CLIENT, NFS_VERSMIN, NFS_VERSMAX,
+ "client_versmax", OPT_CMP_LE},
#define PROTO_OPT_NFS_CLIENT_VERSMAX 8
{"nfs_client_versmax",
"client_versmax", PROTO_OPT_NFS_CLIENT_VERSMAX, OPT_TYPE_NUMBER,
- (int)NFS_VERSMAX_DEFAULT, NULL, NFS_VERSMIN, NFS_VERSMAX,
- NFSADMIN, "client_versmin", OPT_CMP_GE},
+ (int)NFS_VERSMAX_DEFAULT, SVC_CLIENT, NFS_VERSMIN, NFS_VERSMAX,
+ "client_versmin", OPT_CMP_GE},
#define PROTO_OPT_NFS_SERVER_DELEGATION 9
{"nfs_server_delegation",
"server_delegation", PROTO_OPT_NFS_SERVER_DELEGATION,
- OPT_TYPE_ONOFF, NFS_SERVER_DELEGATION_DEFAULT, SVC_NFSD, 0, 0,
- NFSADMIN},
+ OPT_TYPE_ONOFF, NFS_SERVER_DELEGATION_DEFAULT, SVC_NFSD, 0, 0},
#define PROTO_OPT_NFSMAPID_DOMAIN 10
{"nfsmapid_domain",
"nfsmapid_domain", PROTO_OPT_NFSMAPID_DOMAIN, OPT_TYPE_DOMAIN,
- NULL, SVC_NFSMAPID, 0, 0, NFSADMIN},
+ NULL, SVC_NFSMAPID, 0, 0},
#define PROTO_OPT_NFSD_MAX_CONNECTIONS 11
{"nfsd_max_connections",
"max_connections", PROTO_OPT_NFSD_MAX_CONNECTIONS,
- OPT_TYPE_NUMBER, -1, SVC_NFSD, -1, INT32_MAX, NFSADMIN},
+ OPT_TYPE_NUMBER, -1, SVC_NFSD, -1, INT32_MAX},
#define PROTO_OPT_NFSD_PROTOCOL 12
{"nfsd_protocol",
"protocol", PROTO_OPT_NFSD_PROTOCOL, OPT_TYPE_PROTOCOL, 0,
- SVC_NFSD, 0, 0, NFSADMIN},
+ SVC_NFSD, 0, 0},
#define PROTO_OPT_NFSD_LISTEN_BACKLOG 13
{"nfsd_listen_backlog",
"listen_backlog", PROTO_OPT_NFSD_LISTEN_BACKLOG,
- OPT_TYPE_NUMBER, 0,
- SVC_LOCKD, 0, INT32_MAX, NFSADMIN},
+ OPT_TYPE_NUMBER, 0, SVC_NFSD, 0, INT32_MAX},
+#define PROTO_OPT_NFSD_DEVICE 14
+ {"nfsd_device",
+ "device", PROTO_OPT_NFSD_DEVICE,
+ OPT_TYPE_STRING, NULL, SVC_NFSD, 0, 0},
{NULL}
};
@@ -2432,21 +2437,6 @@ fixcaselower(char *str)
}
/*
- * fixcaseupper(str)
- *
- * convert a string to upper case (inplace).
- */
-
-static void
-fixcaseupper(char *str)
-{
- while (*str) {
- *str = toupper(*str);
- str++;
- }
-}
-
-/*
* skipwhitespace(str)
*
* Skip leading white space. It is assumed that it is called with a
@@ -2480,7 +2470,7 @@ extractprop(char *name, char *value)
*/
name = skipwhitespace(name);
- index = findprotoopt(name, 0);
+ index = findprotoopt(name, 1);
if (index >= 0) {
fixcaselower(name);
prop = sa_create_property(proto_options[index].name, value);
@@ -2492,74 +2482,110 @@ extractprop(char *name, char *value)
return (ret);
}
+scf_type_t
+getscftype(int type)
+{
+ scf_type_t ret;
+
+ switch (type) {
+ case OPT_TYPE_NUMBER:
+ ret = SCF_TYPE_INTEGER;
+ break;
+ case OPT_TYPE_BOOLEAN:
+ ret = SCF_TYPE_BOOLEAN;
+ break;
+ default:
+ ret = SCF_TYPE_ASTRING;
+ }
+ return (ret);
+}
+
+char *
+getsvcname(uint32_t svcs)
+{
+ char *service;
+ switch (svcs) {
+ case SVC_LOCKD:
+ service = LOCKD;
+ break;
+ case SVC_STATD:
+ service = STATD;
+ break;
+ case SVC_NFSD:
+ service = NFSD;
+ break;
+ case SVC_CLIENT:
+ service = NFS_CLIENT_SVC;
+ break;
+ case SVC_NFS4CBD:
+ service = NFS4CBD;
+ break;
+ case SVC_NFSMAPID:
+ service = NFSMAPID;
+ break;
+ case SVC_RQUOTAD:
+ service = RQUOTAD;
+ break;
+ case SVC_NFSLOGD:
+ service = NFSLOGD;
+ break;
+ case SVC_REPARSED:
+ service = REPARSED;
+ break;
+ default:
+ service = NFSD;
+ }
+ return (service);
+}
+
/*
- * initprotofromdefault()
+ * initprotofromsmf()
*
- * Read the default file(s) and add the defined values to the
+ * Read NFS SMF properties and add the defined values to the
* protoset. Note that default values are known from the built in
- * table in case the file doesn't have a definition. Not having the
- * /etc/default/nfs file is OK since we have builtin default
- * values. The default file will get constructed as needed if values
- * are changed from the defaults.
+ * table in case SMF doesn't have a definition. Not having
+ * SMF properties is OK since we have builtin default
+ * values.
*/
-
static int
-initprotofromdefault()
+initprotofromsmf()
{
- FILE *nfs;
- char buff[BUFSIZ];
- char *name;
- char *value;
- int ret = SA_OK;
+ char name[PATH_MAX];
+ char value[PATH_MAX];
+ int ret = SA_OK, bufsz = 0, i;
protoset = sa_create_protocol_properties("nfs");
-
if (protoset != NULL) {
- nfs = fopen(NFSADMIN, "r");
- if (nfs != NULL) {
- while (ret == SA_OK &&
- fgets(buff, sizeof (buff), nfs) != NULL) {
- switch (buff[0]) {
- case '\n':
- case '#':
- /* skip */
- break;
- default:
- name = buff;
- buff[strlen(buff) - 1] = '\0';
- value = strchr(name, '=');
- if (value != NULL) {
- *value++ = '\0';
- ret = extractprop(name, value);
- }
- }
- }
- (void) fclose(nfs);
- } else {
- switch (errno) {
- case EPERM:
- case EACCES:
- ret = SA_NO_PERMISSION;
- break;
- case ENOENT:
- break;
- default:
- ret = SA_SYSTEM_ERR;
- break;
+ for (i = 0; proto_options[i].tag != NULL; i++) {
+ scf_type_t ptype;
+ char *svc_name;
+
+ bzero(value, PATH_MAX);
+ (void) strncpy(name, proto_options[i].name, PATH_MAX);
+ /* Replace NULL with the correct instance */
+ ptype = getscftype(proto_options[i].type);
+ svc_name = getsvcname(proto_options[i].svcs);
+ bufsz = PATH_MAX;
+ ret = nfs_smf_get_prop(name, value,
+ (char *)DEFAULT_INSTANCE, ptype,
+ svc_name, &bufsz);
+ if (ret == SA_OK) {
+ ret = extractprop(name, value);
}
}
} else {
ret = SA_NO_MEMORY;
}
+
return (ret);
}
/*
* add_defaults()
*
- * Add the default values for any property not defined in the parsing
- * of the default files. Values are set according to their defined
- * types.
+ * Add the default values for any property not defined
+ * in NFS SMF repository.
+ * Values are set according to their defined types.
*/
static void
@@ -2632,10 +2658,10 @@ nfs_init()
return (SA_CONFIG_ERR);
}
- ret = initprotofromdefault();
+ ret = initprotofromsmf();
if (ret != SA_OK) {
(void) printf(dgettext(TEXT_DOMAIN,
- "NFS plugin problem with default file: %s\n"),
+ "NFS plugin problem with SMF repository: %s\n"),
sa_errorstr(ret));
ret = SA_OK;
}
@@ -2669,216 +2695,6 @@ nfs_get_proto_set()
return (protoset);
}
-struct deffile {
- struct deffile *next;
- char *line;
-};
-
-/*
- * read_default_file(fname)
- *
- * Read the specified default file. We return a list of entries. This
- * get used for adding or removing values.
- */
-
-static struct deffile *
-read_default_file(char *fname)
-{
- FILE *file;
- struct deffile *defs = NULL;
- struct deffile *newdef;
- struct deffile *prevdef = NULL;
- char buff[BUFSIZ * 2];
-
- file = fopen(fname, "r");
- if (file != NULL) {
- while (fgets(buff, sizeof (buff), file) != NULL) {
- newdef = (struct deffile *)calloc(1,
- sizeof (struct deffile));
- if (newdef != NULL) {
- /* Make sure we skip any leading whitespace. */
- newdef->line = strdup(skipwhitespace(buff));
- if (defs == NULL) {
- prevdef = defs = newdef;
- } else {
- prevdef->next = newdef;
- prevdef = newdef;
- }
- }
- }
- (void) fclose(file);
- } else {
- int ret = SA_OK;
- switch (errno) {
- case EPERM:
- case EACCES:
- ret = SA_NO_PERMISSION;
- break;
- case ENOENT:
- break;
- default:
- ret = SA_SYSTEM_ERR;
- break;
- }
- if (ret == SA_OK) {
- /* Want at least one comment line */
- defs = (struct deffile *)
- calloc(1, sizeof (struct deffile));
- defs->line = strdup("# NFS default file\n");
- }
- }
- return (defs);
-}
-
-static void
-free_default_file(struct deffile *defs)
-{
- struct deffile *curdefs = NULL;
-
- while (defs != NULL) {
- curdefs = defs;
- defs = defs->next;
- if (curdefs->line != NULL)
- free(curdefs->line);
- free(curdefs);
- }
-}
-
-/*
- * write_default_file(fname, defs)
- *
- * Write the default file back.
- */
-
-static int
-write_default_file(char *fname, struct deffile *defs)
-{
- FILE *file;
- int ret = SA_OK;
- sigset_t old, new;
-
- file = fopen(fname, "w+");
- if (file != NULL) {
- (void) sigprocmask(SIG_BLOCK, NULL, &new);
- (void) sigaddset(&new, SIGHUP);
- (void) sigaddset(&new, SIGINT);
- (void) sigaddset(&new, SIGQUIT);
- (void) sigaddset(&new, SIGTSTP);
- (void) sigprocmask(SIG_SETMASK, &new, &old);
- while (defs != NULL) {
- (void) fputs(defs->line, file);
- defs = defs->next;
- }
- (void) fsync(fileno(file));
- (void) sigprocmask(SIG_SETMASK, &old, NULL);
- (void) fclose(file);
- } else {
- switch (errno) {
- case EPERM:
- case EACCES:
- ret = SA_NO_PERMISSION;
- break;
- default:
- ret = SA_SYSTEM_ERR;
- }
- }
- return (ret);
-}
-
-
-/*
- * set_default_file_value(tag, value)
- *
- * Set the default file value for tag to value. Then rewrite the file.
- * tag and value are always set. The caller must ensure this.
- */
-
-#define MAX_STRING_LENGTH 256
-static int
-set_default_file_value(char *tag, char *value)
-{
- int ret = SA_OK;
- struct deffile *root;
- struct deffile *defs;
- struct deffile *prev;
- char string[MAX_STRING_LENGTH];
- int len;
- boolean_t update = B_FALSE;
-
- (void) snprintf(string, MAX_STRING_LENGTH, "%s=", tag);
- len = strlen(string);
-
- root = defs = read_default_file(NFSADMIN);
- if (root == NULL) {
- switch (errno) {
- case EPERM:
- case EACCES:
- ret = SA_NO_PERMISSION;
- break;
- default:
- ret = SA_NO_MEMORY;
- break;
- }
- return (ret);
- }
-
- while (defs != NULL) {
- if (defs->line != NULL &&
- strncasecmp(defs->line, string, len) == 0) {
- /* replace with the new value */
- free(defs->line);
- fixcaseupper(tag);
- (void) snprintf(string, sizeof (string),
- "%s=%s\n", tag, value);
- string[MAX_STRING_LENGTH - 1] = '\0';
- defs->line = strdup(string);
- update = B_TRUE;
- break;
- }
- defs = defs->next;
- }
- if (!update) {
- defs = root;
- /* didn't find, so see if it is a comment */
- (void) snprintf(string, MAX_STRING_LENGTH, "#%s=", tag);
- len = strlen(string);
- while (defs != NULL) {
- if (strncasecmp(defs->line, string, len) == 0) {
- /* replace with the new value */
- free(defs->line);
- fixcaseupper(tag);
- (void) snprintf(string, sizeof (string),
- "%s=%s\n", tag, value);
- string[MAX_STRING_LENGTH - 1] = '\0';
- defs->line = strdup(string);
- update = B_TRUE;
- break;
- }
- defs = defs->next;
- }
- }
- if (!update) {
- fixcaseupper(tag);
- (void) snprintf(string, sizeof (string), "%s=%s\n",
- tag, value);
- prev = root;
- while (prev->next != NULL)
- prev = prev->next;
- defs = malloc(sizeof (struct deffile));
- prev->next = defs;
- if (defs != NULL) {
- defs->next = NULL;
- defs->line = strdup(string);
- update = B_TRUE;
- }
- }
- if (update) {
- ret = write_default_file(NFSADMIN, root);
- }
- free_default_file(root);
- return (ret);
-}
-
/*
* service_in_state(service, chkstate)
*
@@ -2946,6 +2762,9 @@ restart_service(uint32_t svcs)
case SVC_REPARSED:
service = REPARSED;
break;
+ case SVC_CLIENT:
+ service = NFS_CLIENT_SVC;
+ break;
default:
continue;
}
@@ -3056,7 +2875,6 @@ nfs_validate_proto_prop(int index, char *name, char *value)
#ifdef lint
name = name;
#endif
-
switch (proto_options[index].type) {
case OPT_TYPE_NUMBER:
if (!is_a_number(value))
@@ -3143,15 +2961,32 @@ nfs_set_proto_prop(sa_property_t prop)
name = sa_get_property_attr(prop, "type");
value = sa_get_property_attr(prop, "value");
if (name != NULL && value != NULL) {
+ scf_type_t sctype;
+ char *svc_name;
+ char *instance = NULL;
int index = findprotoopt(name, 1);
- if (index >= 0) {
- /* should test for valid value */
- ret = nfs_validate_proto_prop(index, name, value);
- if (ret == SA_OK)
- ret = set_default_file_value(
- proto_options[index].tag, value);
- if (ret == SA_OK)
+
+ ret = nfs_validate_proto_prop(index, name, value);
+ if (ret == SA_OK) {
+ sctype = getscftype(proto_options[index].type);
+ svc_name = getsvcname(proto_options[index].svcs);
+ if (sctype == SCF_TYPE_BOOLEAN) {
+ if (value != NULL)
+ sa_free_attr_string(value);
+ if (string_to_boolean(value) == 0)
+ value = strdup("0");
+ else
+ value = strdup("1");
+ }
+ ret = nfs_smf_set_prop(name, value, instance, sctype,
+ svc_name);
+ if (ret == SA_OK) {
restart_service(proto_options[index].svcs);
+ } else {
+ (void) printf(dgettext(TEXT_DOMAIN,
+ "Cannot restart NFS services : %s\n"),
+ sa_errorstr(ret));
+ }
}
}
if (name != NULL)
diff --git a/usr/src/lib/libshare/nfs/libshare_nfs.h b/usr/src/lib/libshare/nfs/libshare_nfs.h
index f032791767..5a079db653 100644
--- a/usr/src/lib/libshare/nfs/libshare_nfs.h
+++ b/usr/src/lib/libshare/nfs/libshare_nfs.h
@@ -98,6 +98,17 @@ struct option_defs {
#define SVC_RQUOTAD 0x0040
#define SVC_NFSLOGD 0x0080
#define SVC_REPARSED 0x0100
+#define SVC_CLIENT 0x0200
+
+/*
+ * NFS Restart/Refresh options
+ */
+#define NFSD_REFRESH 0x0001
+#define NFSD_RESTART 0x0002
+#define NLOCKMGR_REFESH 0x0003
+#define NLOCKMGR_RESTART 0x0004
+#define MAPID_REFRESH 0x0005
+#define MAPID_RESTART 0x0006
/*
* place holder for future service -- will move to daemon_utils.h when