diff options
Diffstat (limited to 'usr/src/uts/common/smbsrv')
-rw-r--r-- | usr/src/uts/common/smbsrv/cifs.h | 19 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/lmshare.h | 3 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/lmshare_door.h | 29 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/lsalib.h | 37 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/mlrpc.h | 54 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/mlsvc.h | 17 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/mlsvc_util.h | 101 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl | 48 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/ndl/winreg.ndl | 202 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/samlib.h | 4 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_door_svc.h | 18 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_fsops.h | 14 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_kproto.h | 49 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_privilege.h | 5 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smb_vops.h | 110 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smbinfo.h | 24 | ||||
-rw-r--r-- | usr/src/uts/common/smbsrv/smbvar.h | 12 |
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; /* |