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 |
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 |