usr/src/uts/common/fs/smbsrv/smb_kshare.c
changeset 7961 4b5e3051f38b
parent 7348 73b61202d5d6
child 8670 6da349c3f817
equal deleted inserted replaced
7960:dab1829da853 7961:4b5e3051f38b
    20  */
    20  */
    21 /*
    21 /*
    22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
    22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
    23  * Use is subject to license terms.
    23  * Use is subject to license terms.
    24  */
    24  */
    25 
       
    26 #pragma ident	"@(#)smb_kshare.c	1.7	08/08/07 SMI"
       
    27 
    25 
    28 /*
    26 /*
    29  * Kernel door client for LanMan share management.
    27  * Kernel door client for LanMan share management.
    30  */
    28  */
    31 
    29 
    64 	if (dhdl)
    62 	if (dhdl)
    65 		door_ki_rele(dhdl);
    63 		door_ki_rele(dhdl);
    66 }
    64 }
    67 
    65 
    68 uint32_t
    66 uint32_t
    69 smb_kshare_getinfo(door_handle_t dhdl, const char *share_name, smb_share_t *si)
    67 smb_kshare_getinfo(door_handle_t dhdl, char *share_name, smb_share_t *si,
       
    68     uint32_t ipaddr)
    70 {
    69 {
    71 	door_arg_t arg;
    70 	door_arg_t arg;
    72 	char *buf;
    71 	char *buf;
    73 	unsigned int used;
    72 	unsigned int used;
    74 	smb_dr_ctx_t *dec_ctx;
    73 	smb_dr_ctx_t *dec_ctx;
    75 	smb_dr_ctx_t *enc_ctx;
    74 	smb_dr_ctx_t *enc_ctx;
    76 	int status;
       
    77 	uint32_t rc;
    75 	uint32_t rc;
    78 	int opcode = SMB_SHROP_GETINFO;
    76 	int opcode = SMB_SHROP_GETINFO;
    79 
    77 
    80 	buf = kmem_alloc(SMB_SHARE_DSIZE, KM_SLEEP);
    78 	buf = kmem_alloc(SMB_SHARE_DSIZE, KM_SLEEP);
    81 
    79 
    82 	enc_ctx = smb_dr_encode_start(buf, SMB_SHARE_DSIZE);
    80 	enc_ctx = smb_dr_encode_start(buf, SMB_SHARE_DSIZE);
    83 	smb_dr_put_uint32(enc_ctx, opcode);
    81 	smb_dr_put_uint32(enc_ctx, opcode);
    84 	smb_dr_put_string(enc_ctx, share_name);
    82 	smb_dr_put_string(enc_ctx, share_name);
    85 
    83 	smb_dr_put_uint32(enc_ctx, ipaddr);
    86 	if ((status = smb_dr_encode_finish(enc_ctx, &used)) != 0) {
    84 
    87 		cmn_err(CE_WARN, "smb_kshare_getinfo: Encode error %d",
    85 	if (smb_dr_encode_finish(enc_ctx, &used) != 0) {
    88 		    status);
       
    89 		kmem_free(buf, SMB_SHARE_DSIZE);
    86 		kmem_free(buf, SMB_SHARE_DSIZE);
    90 		return (NERR_InternalError);
    87 		return (NERR_InternalError);
    91 	}
    88 	}
    92 
    89 
    93 	arg.data_ptr = buf;
    90 	arg.data_ptr = buf;
    96 	arg.desc_num = 0;
    93 	arg.desc_num = 0;
    97 	arg.rbuf = buf;
    94 	arg.rbuf = buf;
    98 	arg.rsize = SMB_SHARE_DSIZE;
    95 	arg.rsize = SMB_SHARE_DSIZE;
    99 
    96 
   100 	if (door_ki_upcall_limited(dhdl, &arg, NULL, SIZE_MAX, 0) != 0) {
    97 	if (door_ki_upcall_limited(dhdl, &arg, NULL, SIZE_MAX, 0) != 0) {
   101 		cmn_err(CE_WARN, "smb_kshare_getinfo: Door call failed");
       
   102 		kmem_free(buf, SMB_SHARE_DSIZE);
    98 		kmem_free(buf, SMB_SHARE_DSIZE);
   103 		return (NERR_InternalError);
    99 		return (NERR_InternalError);
   104 	}
   100 	}
   105 
   101 
   106 	dec_ctx = smb_dr_decode_start(arg.data_ptr, arg.data_size);
   102 	dec_ctx = smb_dr_decode_start(arg.data_ptr, arg.data_size);
   109 		return (NERR_InternalError);
   105 		return (NERR_InternalError);
   110 	}
   106 	}
   111 
   107 
   112 	rc = smb_dr_get_uint32(dec_ctx);
   108 	rc = smb_dr_get_uint32(dec_ctx);
   113 	smb_dr_get_share(dec_ctx, si);
   109 	smb_dr_get_share(dec_ctx, si);
   114 	if ((status = smb_dr_decode_finish(dec_ctx)) != 0) {
   110 	if (smb_dr_decode_finish(dec_ctx) != 0)
   115 		cmn_err(CE_WARN, "smb_kshare_getinfo: Decode error %d",
       
   116 		    status);
       
   117 		rc = NERR_InternalError;
   111 		rc = NERR_InternalError;
   118 	}
       
   119 
   112 
   120 	kmem_free(buf, SMB_SHARE_DSIZE);
   113 	kmem_free(buf, SMB_SHARE_DSIZE);
   121 	return (rc);
   114 	return (rc);
   122 }
   115 }
   123 
   116 
   128 	char *door_buf;
   121 	char *door_buf;
   129 	int door_bufsz;
   122 	int door_bufsz;
   130 	unsigned int used;
   123 	unsigned int used;
   131 	smb_dr_ctx_t *dec_ctx;
   124 	smb_dr_ctx_t *dec_ctx;
   132 	smb_dr_ctx_t *enc_ctx;
   125 	smb_dr_ctx_t *enc_ctx;
   133 	int status;
       
   134 	uint32_t rc;
   126 	uint32_t rc;
   135 	int opcode = SMB_SHROP_ENUM;
   127 	int opcode = SMB_SHROP_ENUM;
   136 
   128 
   137 	enuminfo->es_ntotal = enuminfo->es_nsent = 0;
   129 	enuminfo->es_ntotal = enuminfo->es_nsent = 0;
   138 
   130 
   143 	enc_ctx = smb_dr_encode_start(door_buf, door_bufsz);
   135 	enc_ctx = smb_dr_encode_start(door_buf, door_bufsz);
   144 	smb_dr_put_uint32(enc_ctx, opcode);
   136 	smb_dr_put_uint32(enc_ctx, opcode);
   145 	smb_dr_put_ushort(enc_ctx, enuminfo->es_bufsize);
   137 	smb_dr_put_ushort(enc_ctx, enuminfo->es_bufsize);
   146 	smb_dr_put_string(enc_ctx, enuminfo->es_username);
   138 	smb_dr_put_string(enc_ctx, enuminfo->es_username);
   147 
   139 
   148 	if ((status = smb_dr_encode_finish(enc_ctx, &used)) != 0) {
   140 	if (smb_dr_encode_finish(enc_ctx, &used) != 0) {
   149 		cmn_err(CE_WARN, "smb_kshare_enum: Encode error %d", status);
       
   150 		kmem_free(door_buf, door_bufsz);
   141 		kmem_free(door_buf, door_bufsz);
   151 		return (NERR_InternalError);
   142 		return (NERR_InternalError);
   152 	}
   143 	}
   153 
   144 
   154 	arg.data_ptr = door_buf;
   145 	arg.data_ptr = door_buf;
   157 	arg.desc_num = 0;
   148 	arg.desc_num = 0;
   158 	arg.rbuf = door_buf;
   149 	arg.rbuf = door_buf;
   159 	arg.rsize = door_bufsz;
   150 	arg.rsize = door_bufsz;
   160 
   151 
   161 	if (door_ki_upcall_limited(dhdl, &arg, NULL, SIZE_MAX, 0) != 0) {
   152 	if (door_ki_upcall_limited(dhdl, &arg, NULL, SIZE_MAX, 0) != 0) {
   162 		cmn_err(CE_WARN, "smb_kshare_enum: Door call failed");
       
   163 		kmem_free(door_buf, door_bufsz);
   153 		kmem_free(door_buf, door_bufsz);
   164 		return (NERR_InternalError);
   154 		return (NERR_InternalError);
   165 	}
   155 	}
   166 
   156 
   167 	dec_ctx = smb_dr_decode_start(arg.data_ptr, arg.data_size);
   157 	dec_ctx = smb_dr_decode_start(arg.data_ptr, arg.data_size);
   178 		(void) smb_dr_get_buf(dec_ctx,
   168 		(void) smb_dr_get_buf(dec_ctx,
   179 		    (unsigned char *)enuminfo->es_buf,
   169 		    (unsigned char *)enuminfo->es_buf,
   180 		    enuminfo->es_bufsize);
   170 		    enuminfo->es_bufsize);
   181 	}
   171 	}
   182 
   172 
   183 	if ((status = smb_dr_decode_finish(dec_ctx)) != 0) {
   173 	if (smb_dr_decode_finish(dec_ctx) != 0)
   184 		cmn_err(CE_WARN, "smb_kshare_enum: Decode error %d", status);
       
   185 		rc = NERR_InternalError;
   174 		rc = NERR_InternalError;
   186 	}
       
   187 
   175 
   188 	kmem_free(door_buf, door_bufsz);
   176 	kmem_free(door_buf, door_bufsz);
   189 	return (rc);
   177 	return (rc);
   190 }
   178 }
   191 
   179