smb_opipe.c revision cb174861876aea6950a7ab4ce944aff84b1914cd
3db3f65c6274eb042354801a308c8e9bc4994553amw * CDDL HEADER START
3db3f65c6274eb042354801a308c8e9bc4994553amw * The contents of this file are subject to the terms of the
3db3f65c6274eb042354801a308c8e9bc4994553amw * Common Development and Distribution License (the "License").
3db3f65c6274eb042354801a308c8e9bc4994553amw * You may not use this file except in compliance with the License.
3db3f65c6274eb042354801a308c8e9bc4994553amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3db3f65c6274eb042354801a308c8e9bc4994553amw * See the License for the specific language governing permissions
3db3f65c6274eb042354801a308c8e9bc4994553amw * and limitations under the License.
3db3f65c6274eb042354801a308c8e9bc4994553amw * When distributing Covered Code, include this CDDL HEADER in each
3db3f65c6274eb042354801a308c8e9bc4994553amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3db3f65c6274eb042354801a308c8e9bc4994553amw * If applicable, add the following below this CDDL HEADER, with the
3db3f65c6274eb042354801a308c8e9bc4994553amw * fields enclosed by brackets "[]" replaced with your own identifying
3db3f65c6274eb042354801a308c8e9bc4994553amw * information: Portions Copyright [yyyy] [name of copyright owner]
3db3f65c6274eb042354801a308c8e9bc4994553amw * CDDL HEADER END
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
3db3f65c6274eb042354801a308c8e9bc4994553amw * This module provides the interface to NDR RPC.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (((OPIPE)->p_hdr.dh_magic == SMB_OPIPE_HDR_MAGIC) && \
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ((OPIPE)->p_hdr.dh_fid))
3db3f65c6274eb042354801a308c8e9bc4994553amwstatic int smb_opipe_do_open(smb_request_t *, smb_opipe_t *);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic char *smb_opipe_lookup(const char *);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic int smb_opipe_sethdr(smb_opipe_t *, uint32_t, uint32_t);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic int smb_opipe_exec(smb_opipe_t *);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_opipe_t *
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_opipe_alloc(smb_server_t *sv)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_opipe_t *opipe;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe = kmem_cache_alloc(sv->si_cache_opipe, KM_SLEEP);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States bzero(opipe, sizeof (smb_opipe_t));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States mutex_init(&opipe->p_mutex, NULL, MUTEX_DEFAULT, NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States cv_init(&opipe->p_cv, NULL, CV_DEFAULT, NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_magic = SMB_OPIPE_MAGIC;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_server = sv;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_enter(&sv->sv_opipe_list, RW_WRITER);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_insert_tail(&sv->sv_opipe_list, opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_exit(&sv->sv_opipe_list);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_opipe_dealloc(smb_opipe_t *opipe)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_server_t *sv;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_OPIPE_VALID(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States sv = opipe->p_server;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_SERVER_VALID(sv);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_enter(&sv->sv_opipe_list, RW_WRITER);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_remove(&sv->sv_opipe_list, opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_llist_exit(&sv->sv_opipe_list);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_magic = (uint32_t)~SMB_OPIPE_MAGIC;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_event_destroy(opipe->p_event);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States cv_destroy(&opipe->p_cv);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States mutex_destroy(&opipe->p_mutex);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States kmem_cache_free(sv->si_cache_opipe, opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
3db3f65c6274eb042354801a308c8e9bc4994553amw * smb_opipe_open
3db3f65c6274eb042354801a308c8e9bc4994553amw * Open a well-known RPC named pipe. This routine should be called if
3db3f65c6274eb042354801a308c8e9bc4994553amw * a file open is requested on a share of type STYPE_IPC.
3db3f65c6274eb042354801a308c8e9bc4994553amw * If we recognize the pipe, we setup a new ofile.
3db3f65c6274eb042354801a308c8e9bc4994553amw * Returns 0 on success, Otherwise an NT status is returned to indicate
3db3f65c6274eb042354801a308c8e9bc4994553amw * an error.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_doorhdr_t hdr;
eb1d736b1c19f6abeee90c921a9320b67fedd016afshin salek ardakani - Sun Microsystems - Irvine United States if ((pipe_name = smb_opipe_lookup(op->fqi.fq_path.pn_path)) == NULL)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego of = smb_ofile_open(sr->tid_tree, NULL, sr->smb_pid, op,
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States if (!smb_tree_is_connected(sr->tid_tree)) {
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_close(of, 0);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States smb_ofile_release(of);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States return (NT_STATUS_OBJECT_NAME_NOT_FOUND);
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States }
8b2cc8ac894f2d58f38cf2fb7c3ac778f4c57c09afshin salek ardakani - Sun Microsystems - Irvine United States
3db3f65c6274eb042354801a308c8e9bc4994553amw op->action_taken = SMB_OACT_LOCK | SMB_OACT_OPENED; /* 0x8001 */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_server = of->f_server;
3db3f65c6274eb042354801a308c8e9bc4994553amw opipe->p_doorbuf = kmem_zalloc(SMB_OPIPE_DOOR_BUFSIZE, KM_SLEEP);
3db3f65c6274eb042354801a308c8e9bc4994553amw * p_data points to the offset within p_doorbuf at which
3db3f65c6274eb042354801a308c8e9bc4994553amw * data will be written or read.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_data = opipe->p_doorbuf + xdr_sizeof(smb_doorhdr_xdr, &hdr);
3db3f65c6274eb042354801a308c8e9bc4994553amw * On error, reset the header to clear the fid,
3db3f65c6274eb042354801a308c8e9bc4994553amw * which avoids confusion when smb_opipe_close() is
3db3f65c6274eb042354801a308c8e9bc4994553amw * called by smb_ofile_close().
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States bzero(&opipe->p_hdr, sizeof (smb_doorhdr_t));
3db3f65c6274eb042354801a308c8e9bc4994553amw * smb_opipe_lookup
3db3f65c6274eb042354801a308c8e9bc4994553amw * Lookup a path to see if it's a well-known RPC named pipe that we support.
3db3f65c6274eb042354801a308c8e9bc4994553amw * The full pipe path will be in the form \\PIPE\\SERVICE. The first part
3db3f65c6274eb042354801a308c8e9bc4994553amw * can be assumed, so all we need here are the service names.
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown * Returns a pointer to the pipe name (without any leading \'s) on success.
3db3f65c6274eb042354801a308c8e9bc4994553amw * Otherwise returns a null pointer.
3db3f65c6274eb042354801a308c8e9bc4994553amwstatic char *
3db3f65c6274eb042354801a308c8e9bc4994553amw static char *named_pipes[] = {
3db3f65c6274eb042354801a308c8e9bc4994553amw "NETLOGON",
3db3f65c6274eb042354801a308c8e9bc4994553amw "SPOOLSS",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "EVENTLOG",
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States "NETDFS"
3db3f65c6274eb042354801a308c8e9bc4994553amw const char *name;
3db3f65c6274eb042354801a308c8e9bc4994553amw for (i = 0; i < sizeof (named_pipes) / sizeof (named_pipes[0]); ++i) {
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown if (smb_strcasecmp(name, named_pipes[i], 0) == 0)
3db3f65c6274eb042354801a308c8e9bc4994553amw return (named_pipes[i]);
3db3f65c6274eb042354801a308c8e9bc4994553amw * Initialize the opipe header and context, and make the door call.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if ((opipe->p_event = smb_event_create(SMB_EVENT_TIMEOUT)) == NULL)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown len = xdr_sizeof(smb_netuserinfo_xdr, userinfo);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States bzero(&opipe->p_hdr, sizeof (smb_doorhdr_t));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_magic = SMB_OPIPE_HDR_MAGIC;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_flags = SMB_DF_SYSSPACE;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_fid = smb_event_txid(opipe->p_event);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_opipe_sethdr(opipe, SMB_OPIPE_OPEN, len) == -1)
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States len = xdr_sizeof(smb_doorhdr_xdr, &opipe->p_hdr);
1fcced4c370617db71610fecffd5451a5894ca5eJordan Brown if (smb_netuserinfo_encode(userinfo, buf, buflen, NULL) == -1)
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
3db3f65c6274eb042354801a308c8e9bc4994553amw * smb_opipe_close
3db3f65c6274eb042354801a308c8e9bc4994553amw * Called whenever an IPC file/pipe is closed.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_OPIPE_VALID(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_server_cancel_event(opipe->p_hdr.dh_fid);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) smb_opipe_sethdr(opipe, SMB_OPIPE_CLOSE, 0);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States bzero(&opipe->p_hdr, sizeof (smb_doorhdr_t));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_opipe_sethdr(smb_opipe_t *opipe, uint32_t cmd, uint32_t datalen)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_op = cmd;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_txid = opipe->p_hdr.dh_fid;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_datalen = datalen;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_resid = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_door_rc = EINVAL;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (smb_doorhdr_encode(&opipe->p_hdr, opipe->p_doorbuf,
3db3f65c6274eb042354801a308c8e9bc4994553amw * smb_opipe_transact
3db3f65c6274eb042354801a308c8e9bc4994553amw * This is the entry point for RPC bind and request transactions.
3db3f65c6274eb042354801a308c8e9bc4994553amw * The fid is an arbitrary id used to associate RPC requests with a
3db3f65c6274eb042354801a308c8e9bc4994553amw * particular binding handle.
3db3f65c6274eb042354801a308c8e9bc4994553amw * If the data to be returned is larger than the client expects, we
3db3f65c6274eb042354801a308c8e9bc4994553amw * return as much as the client can handle and report a buffer overflow
3db3f65c6274eb042354801a308c8e9bc4994553amw * warning, which informs the client that we have more data to return.
3db3f65c6274eb042354801a308c8e9bc4994553amw * The residual data remains in the pipe until the client claims it or
3db3f65c6274eb042354801a308c8e9bc4994553amw * closes the pipe.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe = sr->fid_ofile->f_pipe;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((rc = smb_opipe_exec(opipe)) != 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_INTERNAL_ERROR,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States ERRDOS, ERROR_INTERNAL_ERROR);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (SDRC_ERROR);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_opipe_sethdr(opipe, SMB_OPIPE_READ, mdrcnt) == -1) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States nbytes = opipe->p_hdr.dh_datalen;
3db3f65c6274eb042354801a308c8e9bc4994553amw if (rc != 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (opipe->p_hdr.dh_resid) {
3db3f65c6274eb042354801a308c8e9bc4994553amw * The pipe contains more data than mdrcnt, warn the
3db3f65c6274eb042354801a308c8e9bc4994553amw * client that there is more data in the pipe.
3db3f65c6274eb042354801a308c8e9bc4994553amw * Typically, the client will call SmbReadX, which
3db3f65c6274eb042354801a308c8e9bc4994553amw * will call smb_opipe_read, to get the data.
3db3f65c6274eb042354801a308c8e9bc4994553amw * smb_opipe_write
3db3f65c6274eb042354801a308c8e9bc4994553amw * Write RPC request data to the pipe. The client should call smb_opipe_read
3db3f65c6274eb042354801a308c8e9bc4994553amw * to complete the exchange and obtain the RPC response.
3db3f65c6274eb042354801a308c8e9bc4994553amw * Returns 0 on success or an errno on failure.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_OPIPE_VALID(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_opipe_sethdr(opipe, SMB_OPIPE_WRITE, uio->uio_resid);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States len = xdr_sizeof(smb_doorhdr_xdr, &opipe->p_hdr);
3db3f65c6274eb042354801a308c8e9bc4994553amw (void) uiomove((caddr_t)opipe->p_data, buflen, UIO_WRITE, uio);
3db3f65c6274eb042354801a308c8e9bc4994553amw * smb_opipe_read
3db3f65c6274eb042354801a308c8e9bc4994553amw * This interface may be called because smb_opipe_transact could not return
3db3f65c6274eb042354801a308c8e9bc4994553amw * all of the data in the original transaction or to form the second half
3db3f65c6274eb042354801a308c8e9bc4994553amw * of a transaction set up using smb_opipe_write. Either way, we just need
3db3f65c6274eb042354801a308c8e9bc4994553amw * to read data from the pipe and return it.
3db3f65c6274eb042354801a308c8e9bc4994553amw * The response data is encoded into raw_data as required by the smb_read
3db3f65c6274eb042354801a308c8e9bc4994553amw * functions. The uio_resid value indicates the number of bytes read.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States SMB_OPIPE_VALID(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((rc = smb_opipe_exec(opipe)) != 0)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (EIO);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_opipe_sethdr(opipe, SMB_OPIPE_READ, uio->uio_resid) == -1) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States nbytes = opipe->p_hdr.dh_datalen;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesstatic int
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessmb_opipe_exec(smb_opipe_t *opipe)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States uint32_t len;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int rc;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_opipe_enter(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_opipe_sethdr(opipe, SMB_OPIPE_EXEC, 0);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States len = xdr_sizeof(smb_doorhdr_xdr, &opipe->p_hdr);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc == -1 || len == 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_opipe_exit(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (ENOMEM);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((rc = smb_opipe_door_call(opipe)) == 0)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States rc = smb_event_wait(opipe->p_event);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_opipe_exit(opipe);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (rc);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
3db3f65c6274eb042354801a308c8e9bc4994553amw * Named pipe I/O is serialized per fid to ensure that each request
3db3f65c6274eb042354801a308c8e9bc4994553amw * has exclusive opipe access for the duration of the request.
3db3f65c6274eb042354801a308c8e9bc4994553amwstatic void
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States/*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Exit busy state. If we have exec'd an RPC, we may have
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * to wait for notification that processing has completed.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
3db3f65c6274eb042354801a308c8e9bc4994553amwstatic void
3db3f65c6274eb042354801a308c8e9bc4994553amw * opipe door client (to user space door server).
3db3f65c6274eb042354801a308c8e9bc4994553amw mutex_init(&smb_opipe_door_mutex, NULL, MUTEX_DEFAULT, NULL);
3db3f65c6274eb042354801a308c8e9bc4994553amw * Open the (user space) door. If the door is already open,
3db3f65c6274eb042354801a308c8e9bc4994553amw * close it first because the door-id has probably changed.
3db3f65c6274eb042354801a308c8e9bc4994553amw * Close the (user space) door.
3db3f65c6274eb042354801a308c8e9bc4994553amw * opipe door call interface.
3db3f65c6274eb042354801a308c8e9bc4994553amw * Door serialization and call reference accounting is handled here.
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((--smb_opipe_door_ncall) == 0)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States cv_signal(&smb_opipe_door_cv);
3db3f65c6274eb042354801a308c8e9bc4994553amw * Door upcall wrapper - handles data marshalling.
3db3f65c6274eb042354801a308c8e9bc4994553amw * This function should only be called by smb_opipe_door_call.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States smb_doorhdr_t hdr;
3db3f65c6274eb042354801a308c8e9bc4994553amw for (i = 0; i < 3; ++i) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_server_is_stopping())
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
3db3f65c6274eb042354801a308c8e9bc4994553amw if ((rc = door_ki_upcall_limited(smb_opipe_door_hd, &da,
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /* Check for door_return(NULL, 0, NULL, 0) */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0 || da.data_size == 0 || da.rsize == 0)
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (smb_doorhdr_decode(&hdr, (uint8_t *)da.data_ptr, da.rsize) == -1)
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((hdr.dh_magic != SMB_OPIPE_HDR_MAGIC) ||
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (hdr.dh_fid != opipe->p_hdr.dh_fid) ||
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (hdr.dh_op != opipe->p_hdr.dh_op) ||
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (hdr.dh_door_rc != 0) ||
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (hdr.dh_datalen > SMB_OPIPE_DOOR_BUFSIZE)) {
3db3f65c6274eb042354801a308c8e9bc4994553amw return (-1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_datalen = hdr.dh_datalen;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opipe->p_hdr.dh_resid = hdr.dh_resid;
3db3f65c6274eb042354801a308c8e9bc4994553amw return (0);