summaryrefslogtreecommitdiff
path: root/usr/src/cmd/smbsrv
diff options
context:
space:
mode:
authorGordon Ross <gwr@nexenta.com>2013-06-26 16:05:44 -0400
committerGordon Ross <gwr@nexenta.com>2015-11-06 12:22:30 -0500
commita90cf9f29973990687fa61de9f1f6ea22e924e40 (patch)
tree42f77e59c4470ef6d2ba3118ba6c75e43686c398 /usr/src/cmd/smbsrv
parentb24e356b384ccc80805e7150979de2373d44347c (diff)
downloadillumos-joyent-a90cf9f29973990687fa61de9f1f6ea22e924e40.tar.gz
6399 SMB2 support
Portions contributed by: Alek Pinchuk <alek@nexenta.com> Portions contributed by: Kevin Crowe <kevin.crowe@nexenta.com> Portions contributed by: Matt Barden <Matt.Barden@nexenta.com> Reviewed by: Alek Pinchuk <alek@nexenta.com> Reviewed by: Bayard Bell <bayard.bell@nexenta.com> Reviewed by: Dan Fields <dan.fields@nexenta.com> Reviewed by: Daniel Borek <daniel.borek@nexenta.com> Reviewed by: Gordon Ross <gordon.ross@nexenta.com> Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com> Reviewed by: Matt Barden <matt.barden@nexenta.com> Reviewed by: Yuri Pankov <Yuri.Pankov@nexenta.com> Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src/cmd/smbsrv')
-rw-r--r--usr/src/cmd/smbsrv/smbd/server.xml10
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd.h4
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c4
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_main.c7
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_vss.c27
-rw-r--r--usr/src/cmd/smbsrv/smbstat/smbstat.c201
6 files changed, 170 insertions, 83 deletions
diff --git a/usr/src/cmd/smbsrv/smbd/server.xml b/usr/src/cmd/smbsrv/smbd/server.xml
index d8dc32c114..3364a193f3 100644
--- a/usr/src/cmd/smbsrv/smbd/server.xml
+++ b/usr/src/cmd/smbsrv/smbd/server.xml
@@ -22,7 +22,7 @@ information: Portions Copyright [yyyy] [name of copyright owner]
CDDL HEADER END
Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
-Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+Copyright 2015 Nexenta Systems, Inc. All rights reserved.
NOTE: This service manifest is not editable; its contents will
be overwritten by package or patch operations, including
@@ -216,8 +216,16 @@ file.
value='5.0' override='true'/>
<propval name='dfs_stdroot_num' type='integer'
value='0' override='true'/>
+ <propval name='print_enable' type='boolean'
+ value='false' override='true'/>
<propval name='traverse_mounts' type='boolean'
value='true' override='true'/>
+ <propval name='max_protocol' type='astring'
+ value='' override='true'/>
+ <propval name='initial_credits' type='integer'
+ value='20' override='true'/>
+ <propval name='maximum_credits' type='integer'
+ value='1000' override='true'/>
</property_group>
<!-- SMB service-specific shares exec configuration defaults -->
diff --git a/usr/src/cmd/smbsrv/smbd/smbd.h b/usr/src/cmd/smbsrv/smbd/smbd.h
index 436120a745..c389813f9d 100644
--- a/usr/src/cmd/smbsrv/smbd/smbd.h
+++ b/usr/src/cmd/smbsrv/smbd/smbd.h
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _SMBD_H
@@ -67,7 +67,7 @@ void smbd_load_printers(void);
int smbd_vss_get_count(const char *, uint32_t *);
void smbd_vss_get_snapshots(const char *, uint32_t, uint32_t *,
uint32_t *, char **);
-int smbd_vss_map_gmttoken(const char *, char *, char *);
+int smbd_vss_map_gmttoken(const char *, char *, time_t, char *);
typedef struct smbd {
const char *s_version; /* smbd version string */
diff --git a/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c b/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c
index 6de84cadbe..ce606b7b97 100644
--- a/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c
+++ b/usr/src/cmd/smbsrv/smbd/smbd_doorsvc.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/list.h>
@@ -806,7 +806,7 @@ smbd_dop_vss_map_gmttoken(smbd_arg_t *arg)
}
if ((smbd_vss_map_gmttoken(request.gts_path, request.gts_gmttoken,
- snapname) != 0)) {
+ request.gts_toktime, snapname) != 0)) {
*snapname = '\0';
}
diff --git a/usr/src/cmd/smbsrv/smbd/smbd_main.c b/usr/src/cmd/smbsrv/smbd/smbd_main.c
index b1c9dbc770..21dc7a20d1 100644
--- a/usr/src/cmd/smbsrv/smbd/smbd_main.c
+++ b/usr/src/cmd/smbsrv/smbd/smbd_main.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -473,6 +473,11 @@ smbd_service_init(void)
return (-1);
}
+#ifndef FKSMBD
+ /* Upgrade SMF settings, if necessary. */
+ smb_config_upgrade();
+#endif
+
smb_codepage_init();
rc = smbd_cups_init();
diff --git a/usr/src/cmd/smbsrv/smbd/smbd_vss.c b/usr/src/cmd/smbsrv/smbd/smbd_vss.c
index 411037b8e6..be78fc1ccc 100644
--- a/usr/src/cmd/smbsrv/smbd/smbd_vss.c
+++ b/usr/src/cmd/smbsrv/smbd/smbd_vss.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
*/
#include <synch.h>
@@ -88,7 +89,7 @@ typedef struct smbd_vss_get_uint64_date {
} smbd_vss_get_uint64_date_t;
typedef struct smbd_vss_map_gmttoken {
- char *mg_gmttoken;
+ time_t mg_snaptime;
char *mg_snapname;
} smbd_vss_map_gmttoken_t;
@@ -214,10 +215,14 @@ smbd_vss_get_snapshots(const char *path, uint32_t count,
libzfs_fini(libhd);
}
+static const char
+smbd_vss_gmttoken_fmt[] = "@GMT-%Y.%m.%d-%H.%M.%S";
+
/*
* path - path of the dataset for the operation
* gmttoken - the @GMT token to be looked up
- * snapname - the snapshot name to be returned
+ * toktime - time_t used if gmttoken == NULL
+ * snapname - the snapshot name to be returned [MAXPATHLEN]
*
* Here we are going to get the snapshot name from the @GMT token
* The snapname returned by ZFS is : <dataset name>@<snapshot name>
@@ -225,7 +230,8 @@ smbd_vss_get_snapshots(const char *path, uint32_t count,
* the right place and then just return the snapshot name
*/
int
-smbd_vss_map_gmttoken(const char *path, char *gmttoken, char *snapname)
+smbd_vss_map_gmttoken(const char *path, char *gmttoken, time_t toktime,
+ char *snapname)
{
char dataset[MAXPATHLEN];
libzfs_handle_t *libhd;
@@ -233,8 +239,14 @@ smbd_vss_map_gmttoken(const char *path, char *gmttoken, char *snapname)
smbd_vss_map_gmttoken_t vss_map_gmttoken;
char *zsnap;
const char *lsnap;
+ struct tm tm;
+
+ if (gmttoken != NULL && *gmttoken == '@' &&
+ strptime(gmttoken, smbd_vss_gmttoken_fmt, &tm) != NULL) {
+ toktime = timegm(&tm);
+ }
- vss_map_gmttoken.mg_gmttoken = gmttoken;
+ vss_map_gmttoken.mg_snaptime = toktime;
vss_map_gmttoken.mg_snapname = snapname;
*snapname = '\0';
@@ -281,7 +293,7 @@ smbd_vss_time2gmttoken(time_t time, char *gmttoken)
(void) gmtime_r(&time, &t);
(void) strftime(gmttoken, SMB_VSS_GMT_SIZE,
- "@GMT-%Y.%m.%d-%H.%M.%S", &t);
+ smbd_vss_gmttoken_fmt, &t);
}
static int
@@ -349,12 +361,9 @@ smbd_vss_iterate_map_gmttoken(zfs_handle_t *zhp, void *data)
{
smbd_vss_map_gmttoken_t *vss_data = data;
time_t time;
- char gmttoken[SMB_VSS_GMT_SIZE];
time = (time_t)zfs_prop_get_int(zhp, ZFS_PROP_CREATION);
- smbd_vss_time2gmttoken(time, gmttoken);
-
- if (strncmp(gmttoken, vss_data->mg_gmttoken, SMB_VSS_GMT_SIZE) == 0) {
+ if (time == vss_data->mg_snaptime) {
(void) strlcpy(vss_data->mg_snapname, zfs_get_name(zhp),
MAXPATHLEN);
diff --git a/usr/src/cmd/smbsrv/smbstat/smbstat.c b/usr/src/cmd/smbsrv/smbstat/smbstat.c
index 1cc91b7232..c8ea26d7f9 100644
--- a/usr/src/cmd/smbsrv/smbstat/smbstat.c
+++ b/usr/src/cmd/smbsrv/smbstat/smbstat.c
@@ -20,8 +20,8 @@
*/
/*
- * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
/*
@@ -214,7 +214,8 @@ typedef struct smbstat_srv_info {
/*
* Latency & Throughput per request
*/
- smbstat_req_info_t si_reqs[SMB_COM_NUM];
+ smbstat_req_info_t si_reqs1[SMB_COM_NUM];
+ smbstat_req_info_t si_reqs2[SMB2__NCMDS];
} smbstat_srv_info_t;
static void smbstat_init(void);
@@ -252,6 +253,9 @@ static void smbstat_srv_process_utilization(smbstat_srv_snapshot_t *,
smbstat_srv_snapshot_t *);
static void smbstat_srv_process_requests(smbstat_srv_snapshot_t *,
smbstat_srv_snapshot_t *);
+static void smbstat_srv_process_one_req(smbstat_req_info_t *,
+ smb_kstat_req_t *, smb_kstat_req_t *, boolean_t);
+
static smbstat_srv_snapshot_t *smbstat_srv_current_snapshot(void);
static smbstat_srv_snapshot_t *smbstat_srv_previous_snapshot(void);
@@ -445,6 +449,7 @@ smbstat_kstat_print(void)
smbstat_print_throughput();
smbstat_print_utilization();
smbstat_print_requests();
+ (void) fflush(stdout);
}
/*
@@ -549,10 +554,9 @@ smbstat_print_requests(void)
if (!smbstat_opt_r)
return;
- prq = smbstat_srv_info.si_reqs;
-
(void) printf(SMBSRV_REQUESTS_BANNER, " ");
+ prq = smbstat_srv_info.si_reqs1;
for (i = 0; i < SMB_COM_NUM; i++) {
if (!smbstat_opt_a &&
strncmp(prq[i].ri_name, "Invalid", sizeof ("Invalid")) == 0)
@@ -570,6 +574,24 @@ smbstat_print_requests(void)
prq[i].ri_stddev);
}
}
+
+ prq = smbstat_srv_info.si_reqs2;
+ for (i = 0; i < SMB2__NCMDS; i++) {
+ if (!smbstat_opt_a && i == SMB2_INVALID_CMD)
+ continue;
+
+ if (!smbstat_opt_z || (prq[i].ri_pct != 0)) {
+ (void) printf(SMBSRV_REQUESTS_FORMAT,
+ prq[i].ri_name,
+ prq[i].ri_opcode,
+ smbstat_zero(prq[i].ri_pct),
+ smbstat_zero(prq[i].ri_rbs),
+ smbstat_zero(prq[i].ri_tbs),
+ smbstat_zero(prq[i].ri_rqs),
+ prq[i].ri_mean,
+ prq[i].ri_stddev);
+ }
+ }
}
/*
@@ -754,7 +776,7 @@ smbstat_wrk_process(void)
curr = smbstat_wrk_current_snapshot();
- if (curr->ws_maxthreads >= curr->ws_bnalloc)
+ if (curr->ws_bnalloc >= curr->ws_maxthreads)
smbstat_srv_info.si_sat = B_TRUE;
else
smbstat_srv_info.si_sat = B_FALSE;
@@ -881,34 +903,40 @@ smbstat_srv_process_throughput(
smbstat_srv_info.si_rqs /= smbstat_srv_info.si_etime;
smbstat_srv_info.si_rds = smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_READ].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_READ].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_READ].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_READ].kr_nreq);
+ smbstat_srv_info.si_rds += smbstat_sub_64(
+ curr->ss_data.ks_reqs1[SMB_COM_LOCK_AND_READ].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_LOCK_AND_READ].kr_nreq);
smbstat_srv_info.si_rds += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_LOCK_AND_READ].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_LOCK_AND_READ].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_READ_RAW].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_READ_RAW].kr_nreq);
smbstat_srv_info.si_rds += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_READ_RAW].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_READ_RAW].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_READ_ANDX].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_READ_ANDX].kr_nreq);
smbstat_srv_info.si_rds += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_READ_ANDX].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_READ_ANDX].kr_nreq);
+ curr->ss_data.ks_reqs2[SMB2_READ].kr_nreq,
+ prev->ss_data.ks_reqs2[SMB2_READ].kr_nreq);
smbstat_srv_info.si_rds /= smbstat_srv_info.si_etime;
smbstat_srv_info.si_wrs = smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_WRITE].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_WRITE].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_WRITE].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_WRITE].kr_nreq);
smbstat_srv_info.si_wrs += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_WRITE_AND_UNLOCK].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_WRITE_AND_UNLOCK].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_WRITE_AND_UNLOCK].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_WRITE_AND_UNLOCK].kr_nreq);
smbstat_srv_info.si_wrs += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_WRITE_RAW].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_WRITE_RAW].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_WRITE_RAW].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_WRITE_RAW].kr_nreq);
smbstat_srv_info.si_wrs += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_WRITE_AND_CLOSE].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_WRITE_AND_CLOSE].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_WRITE_AND_CLOSE].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_WRITE_AND_CLOSE].kr_nreq);
smbstat_srv_info.si_wrs += smbstat_sub_64(
- curr->ss_data.ks_reqs[SMB_COM_WRITE_ANDX].kr_nreq,
- prev->ss_data.ks_reqs[SMB_COM_WRITE_ANDX].kr_nreq);
+ curr->ss_data.ks_reqs1[SMB_COM_WRITE_ANDX].kr_nreq,
+ prev->ss_data.ks_reqs1[SMB_COM_WRITE_ANDX].kr_nreq);
+ smbstat_srv_info.si_wrs += smbstat_sub_64(
+ curr->ss_data.ks_reqs2[SMB2_WRITE].kr_nreq,
+ prev->ss_data.ks_reqs2[SMB2_WRITE].kr_nreq);
smbstat_srv_info.si_wrs /= smbstat_srv_info.si_etime;
}
@@ -999,55 +1027,79 @@ smbstat_srv_process_requests(
smbstat_srv_snapshot_t *prev)
{
smbstat_req_info_t *info;
- double nrqs;
+ smb_kstat_req_t *curr_req;
+ smb_kstat_req_t *prev_req;
int i, idx;
-
- info = smbstat_srv_info.si_reqs;
+ boolean_t firstcall = (prev->ss_snaptime == 0);
for (i = 0; i < SMB_COM_NUM; i++) {
- idx = info[i].ri_opcode;
-
- nrqs = smbstat_sub_64(curr->ss_data.ks_reqs[idx].kr_nreq,
- prev->ss_data.ks_reqs[idx].kr_nreq);
-
- info[i].ri_rqs = nrqs / smbstat_srv_info.si_etime;
-
- info[i].ri_rbs = smbstat_sub_64(
- curr->ss_data.ks_reqs[idx].kr_rxb,
- prev->ss_data.ks_reqs[idx].kr_rxb) /
- smbstat_srv_info.si_etime;
-
- info[i].ri_tbs = smbstat_sub_64(
- curr->ss_data.ks_reqs[idx].kr_txb,
- prev->ss_data.ks_reqs[idx].kr_txb) /
- smbstat_srv_info.si_etime;
-
- info[i].ri_pct = nrqs * 100;
- if (smbstat_srv_info.si_total_nreqs > 0)
- info[i].ri_pct /= smbstat_srv_info.si_total_nreqs;
-
- if (prev->ss_snaptime == 0) {
- /* First time. Take the aggregate */
- info[i].ri_stddev =
- curr->ss_data.ks_reqs[idx].kr_a_stddev;
- info[i].ri_mean = curr->ss_data.ks_reqs[idx].kr_a_mean;
- } else {
- /* Take the differential */
- info[i].ri_stddev =
- curr->ss_data.ks_reqs[idx].kr_d_stddev;
- info[i].ri_mean = curr->ss_data.ks_reqs[idx].kr_d_mean;
- }
- if (nrqs > 0) {
- info[i].ri_stddev /= nrqs;
- info[i].ri_stddev = sqrt(info[i].ri_stddev);
- } else {
- info[i].ri_stddev = 0;
- }
- info[i].ri_stddev /= NANOSEC;
- info[i].ri_mean /= NANOSEC;
+ info = &smbstat_srv_info.si_reqs1[i];
+ idx = info[i].ri_opcode & 0xFF;
+ curr_req = &curr->ss_data.ks_reqs1[idx];
+ prev_req = &prev->ss_data.ks_reqs1[idx];
+ smbstat_srv_process_one_req(
+ info, curr_req, prev_req, firstcall);
+ }
+
+ for (i = 0; i < SMB2__NCMDS; i++) {
+ info = &smbstat_srv_info.si_reqs2[i];
+ curr_req = &curr->ss_data.ks_reqs2[i];
+ prev_req = &prev->ss_data.ks_reqs2[i];
+ smbstat_srv_process_one_req(
+ info, curr_req, prev_req, firstcall);
+ }
+}
+
+static void
+smbstat_srv_process_one_req(
+ smbstat_req_info_t *info,
+ smb_kstat_req_t *curr_req,
+ smb_kstat_req_t *prev_req,
+ boolean_t firstcall)
+{
+ double nrqs;
+
+ nrqs = smbstat_sub_64(curr_req->kr_nreq,
+ prev_req->kr_nreq);
+
+ info->ri_rqs = nrqs / smbstat_srv_info.si_etime;
+
+ info->ri_rbs = smbstat_sub_64(
+ curr_req->kr_rxb,
+ prev_req->kr_rxb) /
+ smbstat_srv_info.si_etime;
+
+ info->ri_tbs = smbstat_sub_64(
+ curr_req->kr_txb,
+ prev_req->kr_txb) /
+ smbstat_srv_info.si_etime;
+
+ info->ri_pct = nrqs * 100;
+ if (smbstat_srv_info.si_total_nreqs > 0)
+ info->ri_pct /= smbstat_srv_info.si_total_nreqs;
+
+ if (firstcall) {
+ /* First time. Take the aggregate */
+ info->ri_stddev =
+ curr_req->kr_a_stddev;
+ info->ri_mean = curr_req->kr_a_mean;
+ } else {
+ /* Take the differential */
+ info->ri_stddev =
+ curr_req->kr_d_stddev;
+ info->ri_mean = curr_req->kr_d_mean;
+ }
+ if (nrqs > 0) {
+ info->ri_stddev /= nrqs;
+ info->ri_stddev = sqrt(info->ri_stddev);
+ } else {
+ info->ri_stddev = 0;
}
+ info->ri_stddev /= NANOSEC;
+ info->ri_mean /= NANOSEC;
}
+
/*
* smbstat_srv_current_snapshot
*
@@ -1216,14 +1268,16 @@ smbstat_req_cmp_name(const void *obj1, const void *obj2)
static void
smbstat_req_order(void)
{
+ smbstat_srv_snapshot_t *ss;
smbstat_req_info_t *info;
smb_kstat_req_t *reqs;
int i;
smbstat_srv_snapshot();
- reqs = smbstat_srv_current_snapshot()->ss_data.ks_reqs;
- info = smbstat_srv_info.si_reqs;
+ ss = smbstat_srv_current_snapshot();
+ reqs = ss->ss_data.ks_reqs1;
+ info = smbstat_srv_info.si_reqs1;
for (i = 0; i < SMB_COM_NUM; i++) {
(void) strlcpy(info[i].ri_name, reqs[i].kr_name,
sizeof (reqs[i].kr_name));
@@ -1232,6 +1286,17 @@ smbstat_req_order(void)
if (smbstat_opt_n)
qsort(info, SMB_COM_NUM, sizeof (smbstat_req_info_t),
smbstat_req_cmp_name);
+
+ reqs = ss->ss_data.ks_reqs2;
+ info = smbstat_srv_info.si_reqs2;
+ for (i = 0; i < SMB2__NCMDS; i++) {
+ (void) strlcpy(info[i].ri_name, reqs[i].kr_name,
+ sizeof (reqs[i].kr_name));
+ info[i].ri_opcode = i;
+ }
+ if (smbstat_opt_n)
+ qsort(info, SMB2__NCMDS, sizeof (smbstat_req_info_t),
+ smbstat_req_cmp_name);
}
/*