summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/smbsrv
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/smbsrv')
-rw-r--r--usr/src/uts/common/smbsrv/cifs.h19
-rw-r--r--usr/src/uts/common/smbsrv/lmshare.h3
-rw-r--r--usr/src/uts/common/smbsrv/lmshare_door.h29
-rw-r--r--usr/src/uts/common/smbsrv/lsalib.h37
-rw-r--r--usr/src/uts/common/smbsrv/mlrpc.h54
-rw-r--r--usr/src/uts/common/smbsrv/mlsvc.h17
-rw-r--r--usr/src/uts/common/smbsrv/mlsvc_util.h101
-rw-r--r--usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl48
-rw-r--r--usr/src/uts/common/smbsrv/ndl/winreg.ndl202
-rw-r--r--usr/src/uts/common/smbsrv/samlib.h4
-rw-r--r--usr/src/uts/common/smbsrv/smb_door_svc.h18
-rw-r--r--usr/src/uts/common/smbsrv/smb_fsops.h14
-rw-r--r--usr/src/uts/common/smbsrv/smb_kproto.h49
-rw-r--r--usr/src/uts/common/smbsrv/smb_privilege.h5
-rw-r--r--usr/src/uts/common/smbsrv/smb_vops.h110
-rw-r--r--usr/src/uts/common/smbsrv/smbinfo.h24
-rw-r--r--usr/src/uts/common/smbsrv/smbvar.h12
17 files changed, 354 insertions, 392 deletions
diff --git a/usr/src/uts/common/smbsrv/cifs.h b/usr/src/uts/common/smbsrv/cifs.h
index 4533a21bb6..1f657a2d8c 100644
--- a/usr/src/uts/common/smbsrv/cifs.h
+++ b/usr/src/uts/common/smbsrv/cifs.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -421,6 +421,23 @@ extern "C" {
#define SMB_DA_WRITE_THROUGH 0x4000
/*
+ * Macros used for share reservation rule checking
+ */
+
+#define SMB_DENY_READ(share_access) ((share_access & FILE_SHARE_READ) == 0)
+
+#define SMB_DENY_WRITE(share_access) ((share_access & FILE_SHARE_WRITE) == 0)
+
+#define SMB_DENY_DELETE(share_access) ((share_access & FILE_SHARE_DELETE) == 0)
+
+#define SMB_DENY_RW(share_access) \
+ ((share_access & (FILE_SHARE_READ | FILE_SHARE_WRITE)) == 0)
+
+#define SMB_DENY_ALL(share_access) (share_access == 0)
+
+#define SMB_DENY_NONE(share_access) (share_access == FILE_SHARE_ALL)
+
+/*
* The SMB open function determines what action should be taken depending
* on the existence or lack thereof of files used in the operation. It
* has the following mapping:
diff --git a/usr/src/uts/common/smbsrv/lmshare.h b/usr/src/uts/common/smbsrv/lmshare.h
index db41a5bdee..218bb86df8 100644
--- a/usr/src/uts/common/smbsrv/lmshare.h
+++ b/usr/src/uts/common/smbsrv/lmshare.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -163,7 +163,6 @@ extern DWORD lmshrd_iterate(uint64_t iterator, lmshare_info_t *si);
extern DWORD lmshrd_list(int offset, lmshare_list_t *list);
extern DWORD lmshrd_list_transient(int offset, lmshare_list_t *list);
extern DWORD lmshrd_num_transient(void);
-extern int lmshrd_dump_hash(char *logfname);
#endif
extern int lmshrd_num_shares(void);
extern DWORD lmshrd_delete(char *share_name);
diff --git a/usr/src/uts/common/smbsrv/lmshare_door.h b/usr/src/uts/common/smbsrv/lmshare_door.h
index c1c6f2ba0c..4e4413bc9a 100644
--- a/usr/src/uts/common/smbsrv/lmshare_door.h
+++ b/usr/src/uts/common/smbsrv/lmshare_door.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -70,9 +70,9 @@ extern "C" {
#define SMB_GET_KCONFIG 17
-void smb_load_kconfig(smb_kmod_cfg_t *cfg);
-void smb_dr_get_kconfig(smb_dr_ctx_t *ctx, smb_kmod_cfg_t *cfg);
-void smb_dr_put_kconfig(smb_dr_ctx_t *ctx, smb_kmod_cfg_t *cfg);
+void smb_load_kconfig(smb_kmod_cfg_t *);
+void smb_dr_get_kconfig(smb_dr_ctx_t *, smb_kmod_cfg_t *);
+void smb_dr_put_kconfig(smb_dr_ctx_t *, smb_kmod_cfg_t *);
/*
* Door server status
@@ -97,17 +97,16 @@ void smb_dr_put_kconfig(smb_dr_ctx_t *ctx, smb_kmod_cfg_t *cfg);
* };
*/
-void smb_dr_get_lmshare(smb_dr_ctx_t *ctx, lmshare_info_t *si);
-void smb_dr_put_lmshare(smb_dr_ctx_t *ctx, lmshare_info_t *si);
-
-uint64_t smb_dr_get_lmshr_iterator(smb_dr_ctx_t *ctx);
-void smb_dr_put_lmshr_iterator(smb_dr_ctx_t *ctx,
- uint64_t lmshr_iter);
-void smb_dr_free_lmshr_iterator(smb_dr_ctx_t *ctx);
-void smb_dr_get_lmshr_list(smb_dr_ctx_t *ctx,
- lmshare_list_t *shrlist);
-void smb_dr_put_lmshr_list(smb_dr_ctx_t *ctx,
- lmshare_list_t *shrlist);
+void smb_dr_get_lmshare(smb_dr_ctx_t *, lmshare_info_t *);
+void smb_dr_put_lmshare(smb_dr_ctx_t *, lmshare_info_t *);
+
+uint64_t smb_dr_get_lmshr_iterator(smb_dr_ctx_t *);
+void smb_dr_put_lmshr_iterator(smb_dr_ctx_t *, uint64_t);
+void smb_dr_free_lmshr_iterator(smb_dr_ctx_t *);
+void smb_dr_get_lmshr_list(smb_dr_ctx_t *, lmshare_list_t *);
+void smb_dr_put_lmshr_list(smb_dr_ctx_t *, lmshare_list_t *);
+
+void lmshrd_door_close(void);
#ifdef __cplusplus
}
diff --git a/usr/src/uts/common/smbsrv/lsalib.h b/usr/src/uts/common/smbsrv/lsalib.h
index ae4076bf10..535fc9d62b 100644
--- a/usr/src/uts/common/smbsrv/lsalib.h
+++ b/usr/src/uts/common/smbsrv/lsalib.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -50,31 +50,8 @@ extern "C" {
/*
* lsalib.c
*/
-int lsa_lookup_builtin_name(char *account_name,
- smb_userinfo_t *user_info);
-
-int lsa_lookup_local_sam(char *domain,
- char *account_name,
- smb_userinfo_t *user_info);
-
-int lsa_lookup_local(char *name,
- smb_userinfo_t *user_info);
-
-int lsa_lookup_name(char *server,
- char *domain,
- char *account_name,
- smb_userinfo_t *user_info);
-
-DWORD lsa_lookup_name2(char *server,
- char *domain,
- char *account_name,
- smb_userinfo_t *user_info);
-
-int lsa_lookup_sid(nt_sid_t *sid,
- smb_userinfo_t *user_info);
-
-DWORD lsa_lookup_sid2(nt_sid_t *sid,
- smb_userinfo_t *user_info);
+uint32_t lsa_lookup_name(char *, char *, uint16_t, smb_userinfo_t *);
+uint32_t lsa_lookup_sid(nt_sid_t *, smb_userinfo_t *);
int lsa_lookup_privs(char *server,
char *account_name,
@@ -111,11 +88,11 @@ int lsar_query_security_desc(mlsvc_handle_t *lsa_handle);
DWORD lsar_query_info_policy(mlsvc_handle_t *lsa_handle, WORD infoClass);
-int lsar_lookup_names(mlsvc_handle_t *lsa_handle,
+uint32_t lsar_lookup_names(mlsvc_handle_t *lsa_handle,
char *name,
smb_userinfo_t *user_info);
-int lsar_lookup_sids(mlsvc_handle_t *lsa_handle,
+uint32_t lsar_lookup_sids(mlsvc_handle_t *lsa_handle,
struct mslsa_sid *sid,
smb_userinfo_t *user_info);
@@ -145,11 +122,11 @@ DWORD lsar_lookup_priv_display_name(mlsvc_handle_t *lsa_handle,
char *display_name,
int display_len);
-DWORD lsar_lookup_sids2(mlsvc_handle_t *lsa_handle,
+uint32_t lsar_lookup_sids2(mlsvc_handle_t *lsa_handle,
struct mslsa_sid *sid,
smb_userinfo_t *user_info);
-DWORD lsar_lookup_names2(mlsvc_handle_t *lsa_handle,
+uint32_t lsar_lookup_names2(mlsvc_handle_t *lsa_handle,
char *name,
smb_userinfo_t *user_info);
diff --git a/usr/src/uts/common/smbsrv/mlrpc.h b/usr/src/uts/common/smbsrv/mlrpc.h
index 59ea5536fd..ff4d52254c 100644
--- a/usr/src/uts/common/smbsrv/mlrpc.h
+++ b/usr/src/uts/common/smbsrv/mlrpc.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -213,6 +213,21 @@ typedef struct mlrpc_service {
} mlrpc_service_t;
/*
+ * 20-byte opaque id used by various RPC services.
+ */
+typedef struct ndr_hdid {
+ uint32_t data[5];
+} ndr_hdid_t;
+
+typedef struct ndr_handle {
+ struct ndr_handle *nh_next;
+ ndr_hdid_t nh_id;
+ int nh_fid;
+ const mlrpc_service_t *nh_svc;
+ void *nh_data;
+} ndr_handle_t;
+
+/*
* The list of bindings is anchored at a connection. Nothing in the
* RPC mechanism allocates them. Binding elements which have service==0
* indicate free elements. When a connection is instantiated, at least
@@ -342,7 +357,8 @@ int mlrpc_heap_avail(mlrpc_heap_t *);
#define MLRPC_HEAP_STRSAVE(MXA, STR) \
mlrpc_heap_strsave((MXA)->heap, (STR))
-struct mlrpc_xaction {
+typedef struct mlrpc_xaction {
+ int fid;
unsigned short ptype; /* just handy, hi bits spcl */
unsigned short opnum; /* for requests */
struct mlndr_stream recv_mlnds;
@@ -353,7 +369,7 @@ struct mlrpc_xaction {
struct mlrpc_binding *binding_list; /* from connection */
mlrpc_heap_t *heap;
struct mlsvc_rpc_context *context;
-};
+} ndr_xa_t;
struct mlrpc_client {
int (*xa_init)(struct mlrpc_client *, struct mlrpc_xaction *,
@@ -371,16 +387,16 @@ struct mlrpc_client {
unsigned next_p_cont_id;
};
-/* mlndo.c */
+/* ndr_ops.c */
int mlnds_initialize(struct mlndr_stream *, unsigned, int, mlrpc_heap_t *);
void mlnds_destruct(struct mlndr_stream *);
-/* mlrpc_client.c */
+/* ndr_client.c */
int mlrpc_c_bind(struct mlrpc_client *, char *, struct mlrpc_binding **);
int mlrpc_c_call(struct mlrpc_binding *, int, void *, mlrpc_heapref_t *);
void mlrpc_c_free_heap(struct mlrpc_binding *, mlrpc_heapref_t *);
-/* mlrpc_encdec.c */
+/* ndr_marshal.c */
int mlrpc_encode_decode_common(struct mlrpc_xaction *, int, unsigned,
struct ndr_typeinfo *, void *);
int mlrpc_decode_call(struct mlrpc_xaction *, void *);
@@ -392,24 +408,30 @@ int mlrpc_encode_pdu_hdr(struct mlrpc_xaction *);
void mlrpc_decode_frag_hdr(struct mlndr_stream *, mlrpcconn_common_header_t *);
unsigned mlrpc_bind_ack_hdr_size(struct mlrpcconn_bind_ack_hdr *);
-/* mlrpc_server.c */
+/* ndr_server.c */
int mlrpc_generic_call_stub(struct mlrpc_xaction *);
-/* mlrpc_svc.c */
-struct mlrpc_stub_table *mlrpc_find_stub_in_svc(struct mlrpc_service *, int);
-struct mlrpc_service *mlrpc_find_service_by_name(const char *);
-struct mlrpc_service *mlrpc_find_service_by_uuids(mlrpc_uuid_t *, int,
- mlrpc_uuid_t *, int);
-int mlrpc_register_service(struct mlrpc_service *);
-void mlrpc_unregister_service(struct mlrpc_service *);
-void mlrpc_uuid_to_str(mlrpc_uuid_t *, char *);
-int mlrpc_str_to_uuid(char *, mlrpc_uuid_t *);
+/* ndr_svc.c */
+struct mlrpc_stub_table *mlrpc_find_stub_in_svc(mlrpc_service_t *, int);
+mlrpc_service_t *mlrpc_find_service_by_name(const char *);
+mlrpc_service_t *mlrpc_find_service_by_uuids(ndr_uuid_t *, int,
+ ndr_uuid_t *, int);
+int mlrpc_register_service(mlrpc_service_t *);
+void mlrpc_unregister_service(mlrpc_service_t *);
+void mlrpc_uuid_to_str(ndr_uuid_t *, char *);
+int mlrpc_str_to_uuid(char *, ndr_uuid_t *);
void mlrpc_binding_pool_initialize(struct mlrpc_binding **,
struct mlrpc_binding pool[], unsigned);
struct mlrpc_binding *mlrpc_find_binding(struct mlrpc_xaction *,
mlrpc_p_context_id_t);
struct mlrpc_binding *mlrpc_new_binding(struct mlrpc_xaction *);
+ndr_hdid_t *ndr_hdalloc(const ndr_xa_t *, const void *);
+void ndr_hdfree(const ndr_xa_t *, const ndr_hdid_t *);
+ndr_handle_t *ndr_hdlookup(const ndr_xa_t *, const ndr_hdid_t *);
+void ndr_hdclose(int fid);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/smbsrv/mlsvc.h b/usr/src/uts/common/smbsrv/mlsvc.h
index 6177d9fbaf..a85066fc9f 100644
--- a/usr/src/uts/common/smbsrv/mlsvc.h
+++ b/usr/src/uts/common/smbsrv/mlsvc.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -152,17 +152,10 @@ char *mlsvc_ipc_name(int ipc_type, char *username);
* the encrypted passwords.
*/
-int mlsvc_logon(char *domain_controller, char *domain_name,
- char *username);
-int mlsvc_echo(char *server);
-int mlsvc_open_pipe(char *hostname, char *domain, char *username,
- char *pipename);
-int mlsvc_close_pipe(int fid);
void mlsvc_nt_password_hash(char *result, char *password);
int mlsvc_encrypt_nt_password(char *password, char *key, int keylen, char *out,
int outmax);
DWORD mlsvc_join(char *server, char *domain, char *username, char *password);
-int mlsvc_locate_domain_controller(char *domain);
/*
* RPC request processing interface (mlsvc_server.c).
@@ -198,16 +191,8 @@ typedef struct mlsvc_pipe {
struct mlsvc_rpc_context *mlrpc_process(int, smb_dr_user_ctx_t *);
struct mlsvc_rpc_context *mlrpc_lookup(int fid);
void mlrpc_release(int);
-int mlsvc_session_native_values(int fid, int *remote_os, int *remote_lm,
- int *pdc_type);
void mlsvc_rpc_report_status(int opnum, DWORD status);
-/*
- * This is a temporary location for this NETLOGON stuff.
- */
-typedef int (*mlsvc_locate_pdc_t)(char *domain);
-void mlsvc_install_pdc_cb(mlsvc_locate_pdc_t locate_pdc_cb);
-
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/smbsrv/mlsvc_util.h b/usr/src/uts/common/smbsrv/mlsvc_util.h
index e9ababec15..24e6bdd1a9 100644
--- a/usr/src/uts/common/smbsrv/mlsvc_util.h
+++ b/usr/src/uts/common/smbsrv/mlsvc_util.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -48,72 +48,12 @@
extern "C" {
#endif
-/*
- * Predefined global RIDs.
- */
-#define MLSVC_DOMAIN_GROUP_RID_ADMINS 0x00000200L
-#define MLSVC_DOMAIN_GROUP_RID_USERS 0x00000201L
-#define MLSVC_DOMAIN_GROUP_RID_GUESTS 0x00000202L
-#define MLSVC_DOMAIN_GROUP_RID_COMPUTERS 0x00000203L
-#define MLSVC_DOMAIN_GROUP_RID_CONTROLLERS 0x00000204L
-#define MLSVC_DOMAIN_GROUP_RID_CERT_ADMINS 0x00000205L
-#define MLSVC_DOMAIN_GROUP_RID_SCHEMA_ADMINS 0x00000206L
-
-/*
- * Predefined local alias RIDs.
- */
-#define MLSVC_LOCAL_GROUP_RID_ADMINS 0x00000220L
-#define MLSVC_LOCAL_GROUP_RID_USERS 0x00000221L
-#define MLSVC_LOCAL_GROUP_RID_GUESTS 0x00000222L
-#define MLSVC_LOCAL_GROUP_RID_POWER_USERS 0x00000223L
-#define MLSVC_LOCAL_GROUP_RID_ACCOUNT_OPS 0x00000224L
-#define MLSVC_LOCAL_GROUP_RID_SERVER_OPS 0x00000225L
-#define MLSVC_LOCAL_GROUP_RID_PRINT_OPS 0x00000226L
-#define MLSVC_LOCAL_GROUP_RID_BACKUP_OPS 0x00000227L
-#define MLSVC_LOCAL_GROUP_RID_REPLICATOR 0x00000228L
-
-/*
- * All predefined local group RIDs belong
- * to a special domain called BUILTIN.
- */
-#define MLSVC_BUILTIN_DOMAIN_NAME "BUILTIN"
-#define MLSVC_BUILTIN_DOMAIN_SIDSTRLEN 8
-
-/*
- * Universal and NT well-known SIDs
- */
-#define MLSVC_NULL_SIDSTR "S-1-0-0"
-#define MSLVC_WORLD_SIDSTR "S-1-1-0"
-#define MSLVC_LOCAL_SIDSTR "S-1-2-0"
-#define MSLVC_CREATOR_OWNER_ID_SIDSTR "S-1-3-0"
-#define MSLVC_CREATOR_GROUP_ID_SIDSTR "S-1-3-1"
-#define MSLVC_CREATOR_OWNER_SERVER_ID_SIDSTR "S-1-3-2"
-#define MSLVC_CREATOR_GROUP_SERVER_ID_SIDSTR "S-1-3-3"
-#define MSLVC_NON_UNIQUE_IDS_SIDSTR "S-1-4"
-#define MLSVC_NT_AUTHORITY_SIDSTR "S-1-5"
-#define MLSVC_DIALUP_SIDSTR "S-1-5-1"
-#define MLSVC_NETWORK_SIDSTR "S-1-5-2"
-#define MLSVC_BATCH_SIDSTR "S-1-5-3"
-#define MLSVC_INTERACTIVE_SIDSTR "S-1-5-4"
-#define MLSVC_SERVICE_SIDSTR "S-1-5-6"
-#define MLSVC_ANONYMOUS_LOGON_SIDSTR "S-1-5-7"
-#define MLSVC_PROXY_SIDSTR "S-1-5-8"
-#define MLSVC_SERVER_LOGON_SIDSTR "S-1-5-9"
-#define MLSVC_SELF_SIDSTR "S-1-5-10"
-#define MLSVC_AUTHENTICATED_USER_SIDSTR "S-1-5-11"
-#define MLSVC_RESTRICTED_CODE_SIDSTR "S-1-5-12"
-#define MLSVC_NT_LOCAL_SYSTEM_SIDSTR "S-1-5-18"
-#define MLSVC_NT_NON_UNIQUE_SIDSTR "S-1-5-21"
-#define MLSVC_BUILTIN_DOMAIN_SIDSTR "S-1-5-32"
-
-int mlsvc_lookup_name(char *domain, char *name, nt_sid_t **sid);
-int mlsvc_lookup_sid(nt_sid_t *sid, char *buf, int bufsize);
-
smb_userinfo_t *mlsvc_alloc_user_info(void);
void mlsvc_free_user_info(smb_userinfo_t *user_info);
void mlsvc_release_user_info(smb_userinfo_t *user_info);
void mlsvc_setadmin_user_info(smb_userinfo_t *user_info);
char *mlsvc_sid_name_use(unsigned int snu_id);
+extern int mlsvc_is_local_domain(const char *);
/*
* The definition of a local unique id (LUID). This is an opaque id
@@ -148,38 +88,6 @@ typedef struct ms_handle {
} ms_handle_t;
/*
- * List of interface specifications: can be used to identify the
- * sub-system to which a handle is assigned. The handle management
- * library doesn't check or care about the ifspec value.
- */
-typedef enum ms_ifspec {
- MLSVC_IFSPEC_NULL,
- MLSVC_IFSPEC_LSAR,
- MLSVC_IFSPEC_SAMR,
- MLSVC_IFSPEC_WINREG,
- MLSVC_IFSPEC_SVCCTL,
- MLSVC_IFSPEC_SPOOLSS,
- MLSVC_IFSPEC_LOGR,
- MLSVC_IFSPEC_LLSR,
- MLSVC_NUM_IFSPECS
-} ms_ifspec_t;
-
-#define MLSVC_HANDLE_KEY_MAX 32
-
-typedef struct ms_handle_desc {
- struct ms_handle_desc *next;
- ms_handle_t handle;
- ms_ifspec_t ifspec;
- char key[MLSVC_HANDLE_KEY_MAX];
- DWORD discrim;
-} ms_handle_desc_t;
-
-ms_handle_t *mlsvc_get_handle(ms_ifspec_t ifspec, char *key, DWORD discrim);
-int mlsvc_put_handle(ms_handle_t *handle);
-int mlsvc_validate_handle(ms_handle_t *handle, char *key);
-ms_handle_desc_t *mlsvc_lookup_handle(ms_handle_t *handle);
-
-/*
* The mlsvc_rpc_context structure provides the connection binding context
* for client RPC calls. This space must be provided by the client library
* for use by the underlying RPC library. Note that we need two binding
@@ -217,11 +125,6 @@ struct mlsvc_rpc_context {
* The context contains a pointer to the top level handle for the
* interface, which is assigned during the bind. It's used when closing
* to detect when to free the context.
- *
- * I know this is really tacky but the elements in the descriptor are
- * arranged so that a handle can be overlaid directly onto a descriptor.
- * I probably won't do this but now you know - just in case you see it
- * in the code.
*/
typedef struct mlsvc_rpc_desc {
ms_handle_t handle;
diff --git a/usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl b/usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl
index fd42fcac1c..596329a521 100644
--- a/usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl
+++ b/usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -46,7 +46,7 @@
* UUID (Universal Unique IDentifier)
*/
/* (X/Open CAE Spec Appendix A) */
-struct mlrpc_uuid_dce {
+struct ndr_dce_uuid {
DWORD time_low;
WORD time_mid;
WORD time_hi_and_version;
@@ -55,13 +55,13 @@ struct mlrpc_uuid_dce {
BYTE node[6];
};
-struct mlrpc_uuid {
+struct ndr_uuid {
DWORD data1;
WORD data2;
WORD data3;
BYTE data4[8];
};
-typedef struct mlrpc_uuid mlrpc_uuid_t;
+typedef struct ndr_uuid ndr_uuid_t;
/*
* Representation label -- needed for RPC header
@@ -171,7 +171,7 @@ typedef WORD mlrpc_p_context_id_t;
_NO_REORDER_
struct mlrpc_p_syntax_id {
- mlrpc_uuid_t if_uuid;
+ ndr_uuid_t if_uuid;
DWORD if_version;
};
typedef struct mlrpc_p_syntax_id mlrpc_p_syntax_id_t;
@@ -182,7 +182,7 @@ struct mlrpc_p_cont_elem {
BYTE n_transfer_syn;
BYTE _reserved;
mlrpc_p_syntax_id_t abstract_syntax;
- /*SIZE_IS(n_transfer_syn)*/
+ /*SIZE_IS(n_transfer_syn)*/
mlrpc_p_syntax_id_t transfer_syntaxes[1];
};
typedef struct mlrpc_p_cont_elem mlrpc_p_cont_elem_t;
@@ -193,7 +193,7 @@ struct mlrpc_p_cont_list {
BYTE n_context_elem;
BYTE _reserved;
WORD _reserved2;
- /*SIZE_IS(n_context_elem)*/
+ /*SIZE_IS(n_context_elem)*/
mlrpc_p_cont_elem_t p_cont_elem[1];
};
typedef struct mlrpc_p_cont_list mlrpc_p_cont_list_t;
@@ -226,7 +226,7 @@ struct mlrpc_p_result_list {
BYTE n_results;
BYTE reserved;
WORD reserved2;
- /*SIZE_IS(n_results)*/
+ /*SIZE_IS(n_results)*/
mlrpc_p_result_t p_results[1];
};
typedef struct mlrpc_p_result_list mlrpc_p_result_list_t;
@@ -236,10 +236,10 @@ EXTERNTYPEINFO(mlrpc_p_result_list)
_NO_REORDER_
struct mlrpc_port_any {
WORD length; /* always 18 */
- /*SIZE_IS(length)*/
+ /*SIZE_IS(length)*/
BYTE port_spec[MLRPC_PORT_ANY_MAX_PORT_SPEC];
- /* \PIPE\ntsvcs */
- /* We cheat by using 18, and pad on the right with zeroes */
+ /* \PIPE\ntsvcs */
+ /* We cheat by using 18, and pad on the right with zeroes */
};
typedef struct mlrpc_port_any mlrpc_port_any_t;
EXTERNTYPEINFO(mlrpc_port_any)
@@ -377,15 +377,15 @@ _NO_REORDER_
struct mlrpcconn_request_hdr {
mlrpcconn_common_header_t common_hdr; /* 00:16 (see above) */
- /* needed for request, response, or fault */
+ /* needed for request, response, or fault */
DWORD alloc_hint; /* 16:04 allocation hint */
mlrpc_p_context_id_t
p_cont_id; /* 20:02 pres context, i.e. data rep */
WORD opnum; /* 22:02 op number w/i interface */
- /* optional field if PFC_OBJECT_UUID, not present */
- /* mlrpc_uuid_t object; */
+ /* optional field if PFC_OBJECT_UUID, not present */
+ /* ndr_uuid_t object; */
/* stub-data, 8-octet aligned */ /* 24:nn */
/* nn = frag_len - sizeof(common_header) - auth_len */
@@ -399,19 +399,19 @@ _NO_REORDER_
struct mlrpcconn_request_hdr_with_object {
mlrpcconn_common_header_t common_hdr; /* 00:16 (see above) */
- /* needed for request, response, or fault */
+ /* needed for request, response, or fault */
DWORD alloc_hint; /* 16:04 allocation hint */
mlrpc_p_context_id_t
p_cont_id; /* 20:02 pres context, i.e. data rep */
WORD opnum; /* 22:02 op number w/i interface */
- /* optional field if PFC_OBJECT_UUID, is present */
- mlrpc_uuid_t object; /* 24:16 object UUID, unknown purpose*/
+ /* optional field if PFC_OBJECT_UUID, is present */
+ ndr_uuid_t object; /* 24:16 object UUID, unknown purpose*/
/* stub-data, 8-octet aligned */ /* 28:nn */
/* nn = frag_len - sizeof(common_header) - auth_len */
- /* nn -= sizeof(mlrpc_uuid_t); */
+ /* nn -= sizeof(ndr_uuid_t); */
/* optional authentication verifier iff auth_length != 0 */
/* auth_verifier_co_t auth_verifier; */
@@ -435,12 +435,12 @@ _NO_REORDER_
struct mlrpcconn_response_hdr {
mlrpcconn_common_header_t common_hdr; /* 00:16 (see above) */
- /* needed for request, response, or fault */
+ /* needed for request, response, or fault */
DWORD alloc_hint; /* 16:04 allocation hint */
mlrpc_p_context_id_t
p_cont_id; /* 20:02 pres context, i.e. data rep */
- /* needed for response or fault */
+ /* needed for response or fault */
BYTE cancel_count; /* 22:01 cancel count */
BYTE reserved; /* 23:01 mbz */
@@ -467,17 +467,17 @@ struct mlrpcconn_fault_hdr {
mlrpc_p_context_id_t
p_cont_id; /* 20:02 pres context, i.e. data rep */
- /* needed for response or fault */
+ /* needed for response or fault */
BYTE cancel_count; /* 22:01 cancel count */
BYTE reserved; /* 23:01 mbz */
- /* fault code */
+ /* fault code */
DWORD status; /* 24:04 run-time fault code or 0 */
- /* pad to 8-byte alignment */
+ /* pad to 8-byte alignment */
BYTE reserved2[4]; /* 28:04 must-be-zero */
- /* stub-data here if status==0. We do not use this mode. */
+ /* stub-data here if status==0. We do not use this mode. */
/* optional authentication verifier iff auth_length != 0 */
/* auth_verifier_co_t auth_verifier; */
diff --git a/usr/src/uts/common/smbsrv/ndl/winreg.ndl b/usr/src/uts/common/smbsrv/ndl/winreg.ndl
index 2d3d1de28d..b1a02a858b 100644
--- a/usr/src/uts/common/smbsrv/ndl/winreg.ndl
+++ b/usr/src/uts/common/smbsrv/ndl/winreg.ndl
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -34,7 +34,10 @@
#include "ndrtypes.ndl"
+#define WINREG_OPNUM_OpenHKCR 0x00
+#define WINREG_OPNUM_OpenHKCU 0x01
#define WINREG_OPNUM_OpenHKLM 0x02
+#define WINREG_OPNUM_OpenHKPD 0x03
#define WINREG_OPNUM_OpenHKUsers 0x04
#define WINREG_OPNUM_Close 0x05
#define WINREG_OPNUM_CreateKey 0x06
@@ -44,34 +47,40 @@
#define WINREG_OPNUM_EnumValue 0x0a
#define WINREG_OPNUM_FlushKey 0x0b
#define WINREG_OPNUM_GetKeySec 0x0c
+#define WINREG_OPNUM_LoadKey 0x0d
+#define WINREG_OPNUM_NotifyChange 0x0e
#define WINREG_OPNUM_OpenKey 0x0f
#define WINREG_OPNUM_QueryKey 0x10
#define WINREG_OPNUM_QueryValue 0x11
+#define WINREG_OPNUM_ReplaceKey 0x12
+#define WINREG_OPNUM_RestoreKey 0x13
+#define WINREG_OPNUM_SaveKey 0x14
#define WINREG_OPNUM_SetKeySec 0x15
#define WINREG_OPNUM_CreateValue 0x16
+#define WINREG_OPNUM_UnloadKey 0x17
#define WINREG_OPNUM_Shutdown 0x18
+#define WINREG_OPNUM_AbortShutdown 0x19
#define WINREG_OPNUM_GetVersion 0x1a
-
-struct msreg_handle {
+struct winreg_handle {
DWORD hand1;
DWORD hand2;
WORD hand3[2];
BYTE hand4[8];
};
-typedef struct msreg_handle msreg_handle_t;
+typedef struct winreg_handle winreg_handle_t;
-struct msreg_string_desc {
+struct winreg_string_desc {
WORD length;
WORD allosize;
LPTSTR str;
};
-typedef struct msreg_string_desc msreg_string_t;
+typedef struct winreg_string_desc winreg_string_t;
/*
* Fake Varying/Conformant with a funny conformant.
*/
-struct msreg_value {
+struct winreg_value {
DWORD vc_first_is; /* 0 */
DWORD vc_length_is;
SIZE_IS(vc_length_is)
@@ -84,37 +93,59 @@ struct file_time {
};
typedef struct file_time file_time_t;
+OPERATION(WINREG_OPNUM_OpenHKCR)
+struct winreg_OpenHKCR {
+ IN DWORD *server;
+ IN DWORD access_mask;
+ OUT winreg_handle_t handle;
+ OUT DWORD status;
+};
+
+OPERATION(WINREG_OPNUM_OpenHKCU)
+struct winreg_OpenHKCU {
+ IN DWORD *server;
+ IN DWORD access_mask;
+ OUT winreg_handle_t handle;
+ OUT DWORD status;
+};
OPERATION(WINREG_OPNUM_OpenHKLM)
-struct msreg_OpenHKLM {
- IN BYTE whatever[8];
+struct winreg_OpenHKLM {
+ IN DWORD *server;
IN DWORD access_mask;
- OUT msreg_handle_t handle;
+ OUT winreg_handle_t handle;
OUT DWORD status;
};
+OPERATION(WINREG_OPNUM_OpenHKPD)
+struct winreg_OpenHKPD {
+ IN DWORD *server;
+ IN DWORD access_mask;
+ OUT winreg_handle_t handle;
+ OUT DWORD status;
+};
OPERATION(WINREG_OPNUM_OpenHKUsers)
-struct msreg_OpenHKUsers {
- IN BYTE whatever[8];
+struct winreg_OpenHKUsers {
+ IN DWORD *server;
IN DWORD access_mask;
- OUT msreg_handle_t handle;
+ OUT winreg_handle_t handle;
OUT DWORD status;
};
OPERATION(WINREG_OPNUM_Close)
-struct msreg_Close {
- IN msreg_handle_t handle;
- OUT msreg_handle_t result_handle;
+struct winreg_Close {
+ IN winreg_handle_t handle;
+ OUT winreg_handle_t result_handle;
OUT DWORD status;
};
OPERATION(WINREG_OPNUM_CreateKey)
-struct msreg_CreateKey {
- IN msreg_handle_t handle;
- IN msreg_string_t subkey;
+struct winreg_CreateKey {
+ IN winreg_handle_t handle;
+ IN winreg_string_t subkey;
/* IN ignore the remaining input data */
OUT DWORD status;
@@ -122,9 +153,9 @@ struct msreg_CreateKey {
OPERATION(WINREG_OPNUM_DeleteKey)
-struct msreg_DeleteKey {
- IN msreg_handle_t handle;
- IN msreg_string_t subkey;
+struct winreg_DeleteKey {
+ IN winreg_handle_t handle;
+ IN winreg_string_t subkey;
/* IN ignore the remaining input data */
OUT DWORD status;
@@ -132,9 +163,9 @@ struct msreg_DeleteKey {
OPERATION(WINREG_OPNUM_DeleteValue)
-struct msreg_DeleteValue {
- IN msreg_handle_t handle;
- IN msreg_string_t name;
+struct winreg_DeleteValue {
+ IN winreg_handle_t handle;
+ IN winreg_string_t name;
/* IN ignore the remaining input data */
OUT DWORD status;
@@ -146,27 +177,48 @@ struct msreg_DeleteValue {
* as IN parameters but we can ignore them.
*/
OPERATION(WINREG_OPNUM_EnumValue)
-struct msreg_EnumValue {
- IN msreg_handle_t handle;
- IN DWORD index;
+struct winreg_EnumValue {
+ IN winreg_handle_t handle;
+ IN DWORD index;
/* IN ignore the remaining input data */
- OUT msreg_string_t name;
+ OUT winreg_string_t name;
OUT DWORD *type;
- OUT struct msreg_value *value;
+ OUT struct winreg_value *value;
OUT DWORD *value_size;
OUT DWORD *value_size_total;
OUT DWORD status;
};
+OPERATION(WINREG_OPNUM_FlushKey)
+struct winreg_FlushKey {
+ IN winreg_handle_t handle;
+ OUT DWORD status;
+};
+
+OPERATION(WINREG_OPNUM_GetKeySec)
+struct winreg_GetKeySec {
+ IN winreg_handle_t handle;
+ IN DWORD sec_info;
+ OUT DWORD *sd;
+ OUT DWORD status;
+};
+
+OPERATION(WINREG_OPNUM_NotifyChange)
+struct winreg_NotifyChange {
+ IN winreg_handle_t handle;
+ IN DWORD watch_subtree;
+ IN DWORD notify_filter;
+ OUT DWORD status;
+};
OPERATION(WINREG_OPNUM_OpenKey)
-struct msreg_OpenKey {
- IN msreg_handle_t handle;
- IN msreg_string_t name;
+struct winreg_OpenKey {
+ IN winreg_handle_t handle;
+ IN winreg_string_t name;
IN DWORD unknown;
IN DWORD access_mask;
- OUT msreg_handle_t result_handle;
+ OUT winreg_handle_t result_handle;
OUT DWORD status;
};
@@ -183,14 +235,14 @@ struct msreg_OpenKey {
*/
OPERATION(WINREG_OPNUM_QueryKey)
-struct msreg_QueryKey {
- IN msreg_handle_t handle;
+struct winreg_QueryKey {
+ IN winreg_handle_t handle;
/*
* Ignore the remaining input data
- * (2 * DWORD, possibly msreg_string_t).
+ * (2 * DWORD, possibly winreg_string_t).
*/
- OUT msreg_string_t name;
+ OUT winreg_string_t name;
OUT DWORD unknown;
OUT DWORD sub_keys;
OUT DWORD max_subkey_len;
@@ -209,23 +261,31 @@ struct msreg_QueryKey {
* as IN parameters but we can ignore them.
*/
OPERATION(WINREG_OPNUM_QueryValue)
-struct msreg_QueryValue {
- IN msreg_handle_t handle;
- IN msreg_string_t value_name;
+struct winreg_QueryValue {
+ IN winreg_handle_t handle;
+ IN winreg_string_t value_name;
/* IN ignore the remaining input data */
OUT DWORD *type;
- OUT struct msreg_value *value;
+ OUT struct winreg_value *value;
OUT DWORD *value_size;
OUT DWORD *value_size_total;
OUT DWORD status;
};
+OPERATION(WINREG_OPNUM_SetKeySec)
+struct winreg_SetKeySec {
+ IN winreg_handle_t handle;
+ IN DWORD access_mask;
+ IN DWORD sd;
+ OUT DWORD status;
+};
+
OPERATION(WINREG_OPNUM_CreateValue)
-struct msreg_CreateValue {
- IN msreg_handle_t handle;
- IN msreg_string_t name;
+struct winreg_CreateValue {
+ IN winreg_handle_t handle;
+ IN winreg_string_t name;
/* IN ignore the remaining input data */
OUT DWORD status;
@@ -238,17 +298,17 @@ struct msreg_CreateValue {
* without anything appearing in the log, and return access denied.
*/
OPERATION(WINREG_OPNUM_Shutdown)
-struct msreg_Shutdown {
- IN DWORD ignored;
- OUT DWORD status;
+struct winreg_Shutdown {
+ IN DWORD ignored;
+ OUT DWORD status;
};
OPERATION(WINREG_OPNUM_GetVersion)
-struct msreg_GetVersion {
- IN msreg_handle_t handle;
- OUT DWORD version;
- OUT DWORD status;
+struct winreg_GetVersion {
+ IN winreg_handle_t handle;
+ OUT DWORD version;
+ OUT DWORD status;
};
@@ -257,30 +317,44 @@ struct msreg_GetVersion {
*/
INTERFACE(0)
union winreg_interface {
+ CASE(WINREG_OPNUM_OpenHKCR)
+ struct winreg_OpenHKCR OpenHKCR;
+ CASE(WINREG_OPNUM_OpenHKCU)
+ struct winreg_OpenHKCU OpenHKCU;
CASE(WINREG_OPNUM_OpenHKLM)
- struct msreg_OpenHKLM OpenHKLM;
+ struct winreg_OpenHKLM OpenHKLM;
+ CASE(WINREG_OPNUM_OpenHKPD)
+ struct winreg_OpenHKPD OpenHKPD;
CASE(WINREG_OPNUM_OpenHKUsers)
- struct msreg_OpenHKUsers OpenHKUsers;
+ struct winreg_OpenHKUsers OpenHKUsers;
CASE(WINREG_OPNUM_Close)
- struct msreg_Close Close;
+ struct winreg_Close Close;
CASE(WINREG_OPNUM_CreateKey)
- struct msreg_CreateKey CreateKey;
+ struct winreg_CreateKey CreateKey;
CASE(WINREG_OPNUM_DeleteKey)
- struct msreg_DeleteKey DeleteKey;
+ struct winreg_DeleteKey DeleteKey;
CASE(WINREG_OPNUM_DeleteValue)
- struct msreg_DeleteValue DeleteValue;
+ struct winreg_DeleteValue DeleteValue;
+ CASE(WINREG_OPNUM_FlushKey)
+ struct winreg_FlushKey FlushKey;
+ CASE(WINREG_OPNUM_GetKeySec)
+ struct winreg_GetKeySec GetKeySec;
+ CASE(WINREG_OPNUM_NotifyChange)
+ struct winreg_NotifyChange NotifyChange;
CASE(WINREG_OPNUM_OpenKey)
- struct msreg_OpenKey OpenKey;
+ struct winreg_OpenKey OpenKey;
CASE(WINREG_OPNUM_QueryKey)
- struct msreg_QueryKey QueryKey;
+ struct winreg_QueryKey QueryKey;
CASE(WINREG_OPNUM_QueryValue)
- struct msreg_QueryValue QueryValue;
+ struct winreg_QueryValue QueryValue;
+ CASE(WINREG_OPNUM_SetKeySec)
+ struct winreg_SetKeySec SetKeySec;
CASE(WINREG_OPNUM_CreateValue)
- struct msreg_CreateValue CreateValue;
+ struct winreg_CreateValue CreateValue;
CASE(WINREG_OPNUM_Shutdown)
- struct msreg_Shutdown Shutdown;
+ struct winreg_Shutdown Shutdown;
CASE(WINREG_OPNUM_GetVersion)
- struct msreg_GetVersion GetVersion;
+ struct winreg_GetVersion GetVersion;
};
typedef union winreg_interface winreg_interface_t;
EXTERNTYPEINFO(winreg_interface)
diff --git a/usr/src/uts/common/smbsrv/samlib.h b/usr/src/uts/common/smbsrv/samlib.h
index efec26a922..c38986d1d5 100644
--- a/usr/src/uts/common/smbsrv/samlib.h
+++ b/usr/src/uts/common/smbsrv/samlib.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -55,7 +55,7 @@ DWORD sam_create_trust_account(char *server, char *domain,
smb_auth_info_t *auth);
DWORD sam_create_account(char *server, char *domain_name, char *account_name,
- smb_auth_info_t *auth, DWORD account_flags, smb_userinfo_t *user_info);
+ smb_auth_info_t *auth, DWORD account_flags);
DWORD sam_remove_trust_account(char *server, char *domain);
diff --git a/usr/src/uts/common/smbsrv/smb_door_svc.h b/usr/src/uts/common/smbsrv/smb_door_svc.h
index be8898f42a..6b9b943a6a 100644
--- a/usr/src/uts/common/smbsrv/smb_door_svc.h
+++ b/usr/src/uts/common/smbsrv/smb_door_svc.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -82,20 +82,8 @@ enum smb_dr_opcode_t {
SMB_DR_USER_NONAUTH_LOGON,
SMB_DR_USER_AUTH_LOGOFF,
SMB_DR_USER_LIST,
- SMB_DR_GROUP_ADD,
- SMB_DR_GROUP_DELETE,
- SMB_DR_GROUP_MEMBER_ADD,
- SMB_DR_GROUP_MEMBER_REMOVE,
- SMB_DR_GROUP_COUNT,
- SMB_DR_GROUP_CACHE_SIZE,
- SMB_DR_GROUP_MODIFY,
- SMB_DR_GROUP_PRIV_NUM,
- SMB_DR_GROUP_PRIV_LIST,
- SMB_DR_GROUP_PRIV_GET,
- SMB_DR_GROUP_PRIV_SET,
- SMB_DR_GROUP_LIST,
- SMB_DR_GROUP_MEMBER_LIST,
- SMB_DR_GROUP_MEMBER_COUNT
+ SMB_DR_LOOKUP_SID,
+ SMB_DR_LOOKUP_NAME
};
enum smb_kdr_opcode_t {
diff --git a/usr/src/uts/common/smbsrv/smb_fsops.h b/usr/src/uts/common/smbsrv/smb_fsops.h
index afed8b6637..07e825c24d 100644
--- a/usr/src/uts/common/smbsrv/smb_fsops.h
+++ b/usr/src/uts/common/smbsrv/smb_fsops.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -36,11 +36,15 @@
#include <smbsrv/smbinfo.h>
#include <smbsrv/smb_vops.h>
#include <smbsrv/smbvar.h>
+#include <sys/callb.h>
+#include <sys/flock.h>
#ifdef __cplusplus
extern "C" {
#endif
+extern caller_context_t smb_ct;
+
int smb_fsop_open(smb_ofile_t *of);
int smb_fsop_close(smb_ofile_t *of);
@@ -119,7 +123,13 @@ int smb_fsop_sdread(smb_request_t *, cred_t *, smb_node_t *, smb_fssd_t *);
int smb_fsop_sdwrite(smb_request_t *, cred_t *, smb_node_t *, smb_fssd_t *,
int);
-void smb_get_caller_context(smb_request_t *sr, caller_context_t *ct);
+uint32_t smb_fsop_shrlock(cred_t *cr, smb_node_t *node, uint32_t uniq_fid,
+ uint32_t desired_access, uint32_t share_access);
+
+void smb_fsop_unshrlock(cred_t *cr, smb_node_t *node, uint32_t uniq_fid);
+
+int smb_fsop_frlock(smb_request_t *sr, smb_node_t *node, smb_lock_t *lock,
+ boolean_t unlock);
/*
* Lookup-related flags
diff --git a/usr/src/uts/common/smbsrv/smb_kproto.h b/usr/src/uts/common/smbsrv/smb_kproto.h
index 0b9442bed1..a23b42572c 100644
--- a/usr/src/uts/common/smbsrv/smb_kproto.h
+++ b/usr/src/uts/common/smbsrv/smb_kproto.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -101,10 +101,12 @@ void smb_release_oplock(struct smb_ofile *file, int reason);
uint32_t smb_unlock_range(struct smb_request *, struct smb_node *,
uint64_t, uint64_t);
-void smb_unlock_range_raise_error(smb_request_t *sr, uint32_t ntstatus);
uint32_t smb_lock_range(struct smb_request *, struct smb_ofile *,
uint64_t, uint64_t, uint32_t, uint32_t);
-void smb_lock_range_raise_error(smb_request_t *sr, uint32_t ntstatus);
+void smb_lock_range_error(smb_request_t *, uint32_t);
+
+DWORD smb_range_check(smb_request_t *, cred_t *, smb_node_t *,
+ uint64_t, uint64_t, boolean_t);
int smb_mangle_name(ino64_t fileid, char *name, char *shortname,
char *name83, int force);
@@ -149,31 +151,17 @@ void smbsr_decode_error(struct smb_request *);
void smbsr_encode_error(struct smb_request *);
void smbsr_encode_empty_result(struct smb_request *sr);
-#pragma does_not_return(smbsr_decode_error)
-#pragma does_not_return(smbsr_encode_error)
-
int smbsr_decode_vwv(struct smb_request *sr, char *fmt, ...);
int smbsr_decode_data(struct smb_request *sr, char *fmt, ...);
void smbsr_encode_result(struct smb_request *, int, int, char *, ...);
smb_xa_t *smbsr_lookup_xa(smb_request_t *sr);
void smbsr_send_reply(struct smb_request *);
-void smbsr_raise_cifs_error(struct smb_request *sr, DWORD status,
- int error_class, int error_code);
-
-int smbsr_set_errno(struct smb_request *, int);
-void smbsr_raise_errno(struct smb_request *, int);
-void smbsr_raise_error(struct smb_request *, int, int);
-void smbsr_raise_nt_error(struct smb_request *sr, uint32_t);
-
-#pragma does_not_return(smbsr_raise_cifs_error)
-#pragma does_not_return(smbsr_raise_error)
-#pragma does_not_return(smbsr_raise_nt_error)
-#pragma does_not_return(smbsr_raise_errno)
-
-void smbsr_setup_nt_status(struct smb_request *sr,
- uint32_t severity,
- uint32_t nt_status);
+void smbsr_map_errno(int, smb_error_t *);
+void smbsr_set_error(smb_request_t *, smb_error_t *);
+void smbsr_errno(struct smb_request *, int);
+void smbsr_warn(struct smb_request *, DWORD, uint16_t, uint16_t);
+void smbsr_error(struct smb_request *, DWORD, uint16_t, uint16_t);
int smb_mbc_encode(struct mbuf_chain *mbc, char *fmt, va_list ap);
int smb_mbc_decode(struct mbuf_chain *mbc, char *fmt, va_list ap);
@@ -202,7 +190,7 @@ int smb_component_match(struct smb_request *sr, ino64_t fileid,
struct smb_odir *od, smb_odir_context_t *pc);
int smb_lock_range_access(struct smb_request *, struct smb_node *,
- uint64_t, uint64_t, uint32_t desired_access);
+ uint64_t, uint64_t, boolean_t);
uint32_t smb_decode_sd(struct smb_xa *, smb_sd_t *);
@@ -247,6 +235,17 @@ void smb_node_root_fini();
void smb_node_add_lock(smb_node_t *node, smb_lock_t *lock);
void smb_node_destroy_lock(smb_node_t *node, smb_lock_t *lock);
void smb_node_destroy_lock_by_ofile(smb_node_t *node, smb_ofile_t *file);
+void smb_node_start_crit(smb_node_t *node, krw_t mode);
+void smb_node_end_crit(smb_node_t *node);
+int smb_node_in_crit(smb_node_t *node);
+
+uint32_t smb_node_open_check(smb_node_t *, cred_t *,
+ uint32_t, uint32_t);
+uint32_t smb_node_share_check(smb_node_t *, cred_t *,
+ uint32_t, uint32_t, smb_ofile_t *);
+DWORD smb_node_rename_check(smb_node_t *);
+DWORD smb_node_delete_check(smb_node_t *);
+
uint64_t smb_node_get_size(smb_node_t *node, smb_attr_t *attr);
void smb_node_set_time(struct smb_node *node, timestruc_t *crtime,
timestruc_t *mtime, timestruc_t *atime,
@@ -359,7 +358,6 @@ int smb_stream_parse_name(char *name, char *u_stream_name,
uint32_t smb_get_gmtoff(void);
void smb_set_gmtoff(uint32_t);
-void smb_errmap_unix2smb(int en, smb_error_t *smberr);
DWORD smb_trans2_set_information(struct smb_request *sr,
smb_trans2_setinfo_t *info,
smb_error_t *smberr);
@@ -398,7 +396,8 @@ void smb_session_disconnect_volume(fs_desc_t *);
smb_ofile_t *smb_ofile_lookup_by_fid(smb_tree_t *tree, uint16_t fid);
smb_ofile_t *smb_ofile_open(smb_tree_t *tree, smb_node_t *node, uint16_t pid,
uint32_t access_granted, uint32_t create_options, uint32_t share_access,
- uint16_t ftype, char *pipe_name, uint32_t rpc_fid, smb_error_t *err);
+ uint16_t ftype, char *pipe_name, uint32_t rpc_fid, uint32_t uniqid,
+ smb_error_t *err);
int smb_ofile_close(smb_ofile_t *ofile, uint32_t last_wtime);
uint32_t smb_ofile_access(smb_ofile_t *ofile, cred_t *cr, uint32_t access);
int smb_ofile_seek(smb_ofile_t *of, ushort_t mode, int32_t off,
diff --git a/usr/src/uts/common/smbsrv/smb_privilege.h b/usr/src/uts/common/smbsrv/smb_privilege.h
index c03455d469..9fad667938 100644
--- a/usr/src/uts/common/smbsrv/smb_privilege.h
+++ b/usr/src/uts/common/smbsrv/smb_privilege.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -98,6 +98,7 @@ extern "C" {
#define SE_CHANGE_NOTIFY_NAME "SeChangeNotifyPrivilege"
#define SE_REMOTE_SHUTDOWN_NAME "SeRemoteShutdownPrivilege"
+#define SE_MIN_LUID 2
#define SE_CREATE_TOKEN_LUID 2
#define SE_ASSIGNPRIMARYTOKEN_LUID 3
#define SE_LOCK_MEMORY_LUID 4
@@ -121,6 +122,7 @@ extern "C" {
#define SE_SYSTEM_ENVIRONMENT_LUID 22
#define SE_CHANGE_NOTIFY_LUID 23
#define SE_REMOTE_SHUTDOWN_LUID 24
+#define SE_MAX_LUID 24
/*
* Privilege attributes
@@ -181,6 +183,7 @@ int smb_privset_size();
void smb_privset_init(smb_privset_t *privset);
void smb_privset_free(smb_privset_t *privset);
void smb_privset_copy(smb_privset_t *dst, smb_privset_t *src);
+void smb_privset_merge(smb_privset_t *dst, smb_privset_t *src);
void smb_privset_enable(smb_privset_t *privset, uint32_t id);
int smb_privset_query(smb_privset_t *privset, uint32_t id);
void smb_privset_log(smb_privset_t *privset);
diff --git a/usr/src/uts/common/smbsrv/smb_vops.h b/usr/src/uts/common/smbsrv/smb_vops.h
index 3b09c99b63..0f98b41be5 100644
--- a/usr/src/uts/common/smbsrv/smb_vops.h
+++ b/usr/src/uts/common/smbsrv/smb_vops.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -318,67 +318,53 @@ struct fs_stream_info {
int fhopen(const struct smb_node *, int);
-extern int smb_vop_open(vnode_t **vpp, int mode, cred_t *cred,
- caller_context_t *ct);
-extern int smb_vop_close(vnode_t *vp, int flag, cred_t *cred,
- caller_context_t *ct);
-extern int smb_vop_read(vnode_t *vp, uio_t *uiop, cred_t *cr,
- caller_context_t *ct);
-extern int smb_vop_write(vnode_t *vp, uio_t *uiop, unsigned int *flag,
- uint32_t *lcount, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_getattr(vnode_t *vp, vnode_t *unnamed_vp,
- smb_attr_t *ret_attr, int flags, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp,
- smb_attr_t *set_attr, int flags, cred_t *cr, boolean_t no_xvattr,
- caller_context_t *ct);
-extern int smb_vop_access(vnode_t *vp, int mode, int flags, vnode_t *dir_vp,
- cred_t *cr);
-extern void smb_vop_eaccess(vnode_t *vp, int *mode, int flags, vnode_t *dir_vp,
- cred_t *cr);
-extern int smb_vop_lookup(vnode_t *dvp, char *name, vnode_t **vpp,
- char *od_name, int flags, vnode_t *rootvp, cred_t *cr,
- caller_context_t *ct);
-extern int smb_vop_create(vnode_t *dvp, char *name, smb_attr_t *attr,
- vnode_t **vpp, int flags, cred_t *cr, caller_context_t *ct,
- vsecattr_t *vsap);
-extern int smb_vop_remove(vnode_t *dvp, char *name, int flags, cred_t *cr,
- caller_context_t *ct);
-extern int smb_vop_rename(vnode_t *from_dvp, char *from_name, vnode_t *to_dvp,
- char *to_name, int flags, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_mkdir(vnode_t *dvp, char *name, smb_attr_t *attr,
- vnode_t **vpp, int flags, cred_t *cr, caller_context_t *ct,
- vsecattr_t *vsap);
-extern int smb_vop_rmdir(vnode_t *dvp, char *name, int flags, cred_t *cr,
- caller_context_t *ct);
-extern int smb_vop_readdir(vnode_t *dvp, uint32_t *cookiep, char *name,
- int *namelen, ino64_t *inop, vnode_t **vpp, char *od_name, int flags,
- cred_t *cr, caller_context_t *ct);
-extern int smb_vop_commit(vnode_t *vp, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_getdents(struct smb_node *dir_snode, uint32_t *cookiep,
- uint64_t *verifierp, int32_t *dircountp, char *arg, char *pattern,
- uint32_t flags, struct smb_request *sr, cred_t *cr,
- caller_context_t *ct);
-extern int smb_vop_statfs(vnode_t *vp, struct statvfs64 *statp, cred_t *cr);
-extern int smb_vop_stream_lookup(vnode_t *fvp, char *stream_name,
- vnode_t **vpp, char *name, vnode_t **xattrdirvpp, int flags,
- vnode_t *rootvp, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_stream_create(vnode_t *fvp, char *stream_name,
- smb_attr_t *attr, vnode_t **vpp, vnode_t **xattrdirvpp, int flags,
- cred_t *cr, caller_context_t *ct);
-extern int smb_vop_stream_remove(vnode_t *vp, char *stream_name, int flags,
- cred_t *cr, caller_context_t *ct);
-extern int smb_vop_stream_readdir(vnode_t *fvp, uint32_t *cookiep,
- struct fs_stream_info *stream_info, vnode_t **vpp, vnode_t **xattrdirvp,
- int flags, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_lookup_xattrdir(vnode_t *fvp, vnode_t **xattrdirvpp,
- int flags, cred_t *cr, caller_context_t *ct);
-extern int smb_vop_traverse_check(vnode_t **vpp);
-
-int smb_vop_acl_read(vnode_t *vp, acl_t **aclp, int flags, acl_type_t acl_type,
- cred_t *cr, caller_context_t *ct);
-int smb_vop_acl_write(vnode_t *vp, acl_t *aclp, int flags, cred_t *cr,
- caller_context_t *ct);
-acl_type_t smb_vop_acl_type(vnode_t *vp);
+extern void smb_vop_start(void);
+extern int smb_vop_open(vnode_t **, int, cred_t *);
+extern int smb_vop_close(vnode_t *, int, cred_t *);
+extern int smb_vop_read(vnode_t *, uio_t *, cred_t *);
+extern int smb_vop_write(vnode_t *, uio_t *, unsigned int *,
+ uint32_t *, cred_t *);
+extern int smb_vop_getattr(vnode_t *, vnode_t *,
+ smb_attr_t *, int, cred_t *);
+extern int smb_vop_setattr(vnode_t *, vnode_t *,
+ smb_attr_t *, int, cred_t *, boolean_t);
+extern int smb_vop_access(vnode_t *, int, int, vnode_t *,
+ cred_t *);
+extern void smb_vop_eaccess(vnode_t *, int *, int, vnode_t *,
+ cred_t *);
+extern int smb_vop_lookup(vnode_t *, char *, vnode_t **,
+ char *, int, vnode_t *, cred_t *);
+extern int smb_vop_create(vnode_t *, char *, smb_attr_t *,
+ vnode_t **, int, cred_t *, vsecattr_t *);
+extern int smb_vop_remove(vnode_t *, char *, int, cred_t *);
+extern int smb_vop_rename(vnode_t *, char *, vnode_t *,
+ char *, int, cred_t *);
+extern int smb_vop_mkdir(vnode_t *, char *, smb_attr_t *,
+ vnode_t **, int, cred_t *, vsecattr_t *);
+extern int smb_vop_rmdir(vnode_t *, char *, int, cred_t *);
+extern int smb_vop_readdir(vnode_t *, uint32_t *, char *,
+ int *, ino64_t *, vnode_t **, char *, int, cred_t *);
+extern int smb_vop_commit(vnode_t *, cred_t *);
+extern int smb_vop_getdents(struct smb_node *, uint32_t *,
+ uint64_t *, int32_t *, char *, char *,
+ uint32_t, struct smb_request *, cred_t *);
+extern int smb_vop_statfs(vnode_t *, struct statvfs64 *, cred_t *);
+extern int smb_vop_stream_lookup(vnode_t *, char *,
+ vnode_t **, char *, vnode_t **, int, vnode_t *, cred_t *);
+extern int smb_vop_stream_create(vnode_t *, char *,
+ smb_attr_t *, vnode_t **, vnode_t **, int, cred_t *);
+extern int smb_vop_stream_remove(vnode_t *, char *, int, cred_t *);
+extern int smb_vop_stream_readdir(vnode_t *, uint32_t *,
+ struct fs_stream_info *, vnode_t **, vnode_t **, int, cred_t *);
+extern int smb_vop_lookup_xattrdir(vnode_t *, vnode_t **, int, cred_t *);
+extern int smb_vop_traverse_check(vnode_t **);
+
+int smb_vop_acl_read(vnode_t *, acl_t **, int, acl_type_t, cred_t *);
+int smb_vop_acl_write(vnode_t *, acl_t *, int, cred_t *);
+acl_type_t smb_vop_acl_type(vnode_t *);
+
+int smb_vop_shrlock(vnode_t *, uint32_t, uint32_t, uint32_t, cred_t *);
+int smb_vop_unshrlock(vnode_t *, uint32_t, cred_t *);
#ifdef __cplusplus
}
diff --git a/usr/src/uts/common/smbsrv/smbinfo.h b/usr/src/uts/common/smbsrv/smbinfo.h
index 2426b54b61..01404f3a55 100644
--- a/usr/src/uts/common/smbsrv/smbinfo.h
+++ b/usr/src/uts/common/smbsrv/smbinfo.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -127,18 +127,17 @@ typedef struct smb_kmod_cfg {
uint32_t skc_maxworkers;
uint32_t skc_maxconnections;
uint32_t skc_keepalive;
- uint32_t skc_restrict_anon;
- uint32_t skc_signing_enable;
- uint32_t skc_signing_required;
- uint32_t skc_signing_check;
- uint32_t skc_oplock_enable;
uint32_t skc_oplock_timeout;
- uint32_t skc_flush_required;
- uint32_t skc_sync_enable;
- uint32_t skc_dirsymlink_enable;
- uint32_t skc_announce_quota;
- uint32_t skc_secmode;
- uint32_t skc_lmlevel;
+ int32_t skc_restrict_anon;
+ int32_t skc_signing_enable;
+ int32_t skc_signing_required;
+ int32_t skc_signing_check;
+ int32_t skc_oplock_enable;
+ int32_t skc_flush_required;
+ int32_t skc_sync_enable;
+ int32_t skc_dirsymlink_enable;
+ int32_t skc_announce_quota;
+ int32_t skc_secmode;
char skc_resource_domain[SMB_PI_MAX_DOMAIN];
char skc_hostname[SMB_PI_MAX_HOST];
@@ -173,7 +172,6 @@ int smbnative_pdc_value(char *native_lm);
#define SMBD_DOOR_PARAM_GET 2
#define SMBD_DOOR_PARAM_SET 3
#define SMBD_DOOR_NETBIOS_RECONFIG 4
-#define SMBD_DOOR_ADS_DOMAIN_CHANGED 5
#ifdef __cplusplus
}
diff --git a/usr/src/uts/common/smbsrv/smbvar.h b/usr/src/uts/common/smbsrv/smbvar.h
index edcfbe7187..f4e11582a0 100644
--- a/usr/src/uts/common/smbsrv/smbvar.h
+++ b/usr/src/uts/common/smbsrv/smbvar.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -389,6 +389,7 @@ typedef enum {
typedef struct smb_node {
uint32_t n_magic;
smb_rwx_t n_lock;
+ krwlock_t n_share_lock;
list_node_t n_lnd;
smb_node_state_t n_state;
uint32_t n_refcnt;
@@ -835,6 +836,7 @@ typedef struct smb_ofile {
mlsvc_pipe_t *f_pipe_info;
+ uint32_t f_uniqid;
uint32_t f_refcnt;
uint64_t f_seek_pos;
uint32_t f_flags;
@@ -1198,11 +1200,8 @@ struct smb_request {
label_t exjb;
cred_t *user_cr;
- caller_context_t ct;
};
-caller_context_t local_ct;
-
#define SMB_READ_PROTOCOL(smb_nh_ptr) \
LE_IN32(((smb_nethdr_t *)(smb_nh_ptr))->sh_protocol)
@@ -1317,6 +1316,7 @@ typedef struct smb_info {
volatile uint64_t si_global_kid;
volatile uint32_t si_gmtoff;
+ volatile uint32_t si_uniq_fid;
smb_thread_t si_nbt_daemon;
smb_thread_t si_tcp_daemon;
@@ -1354,11 +1354,13 @@ typedef struct smb_info {
#define SMB_INFO_ENCRYPT_PASSWORDS 0x80000000
#define SMB_NEW_KID() atomic_inc_64_nv(&smb_info.si_global_kid)
+#define SMB_UNIQ_FID() atomic_inc_32_nv(&smb_info.si_uniq_fid)
typedef struct {
+ uint32_t severity;
+ uint32_t status;
uint16_t errcls;
uint16_t errcode;
- DWORD status;
} smb_error_t;
/*