usr/src/lib/libc/port/gen/getxby_door.c
author eschrock
Fri, 19 Aug 2005 11:56:37 -0700
changeset 380 4ae8f505c115
parent 0 68f95e015346
child 1016 a2290e972fca
permissions -rw-r--r--
6307489 getmntany() should not stat meaningless special devices
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <pwd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <getxby_door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/door.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include "libc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include "base_conversion.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 * Routine that actually performs the door call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * Note that we cache a file descriptor.  We do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 * the following to prevent disasters:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * 1) Never use 0,1 or 2; if we get this from the open
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 *    we dup it upwards.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * 2) Set the close on exec flags so descriptor remains available
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 *    to child processes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * 3) Verify that the door is still the same one we had before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *    by using door_info on the client side.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 *	Note that we never close the file descriptor if it isn't one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *	we allocated; we check this with door info.  The rather tricky
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 *	logic is designed to be fast in the normal case (fd is already
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *	allocated and is ok) while handling the case where the application
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 *	closed it underneath us or where the nscd dies or re-execs itself
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *	and we're a multi-threaded application.  Note that we cannot protect
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 *	the application if it closes the fd and it is multi-threaded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *  int _nsc_trydoorcall(void *dptr, int *bufsize, int *actualsize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *      *dptr           IN: points to arg buffer OUT: points to results buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *      *bufsize        IN: overall size of buffer OUT: overall size of buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *      *actualsize     IN: size of call data OUT: size of return data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *  Note that *dptr may change if provided space as defined by *bufsize is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 *  inadequate.  In this case the door call mmaps more space and places
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 *  the answer there and sets dptr to contain a pointer to the space, which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 *  should be freed with munmap.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 *  Returns 0 if the door call reached the server, -1 if contact was not made.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static mutex_t	_door_lock = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
_nsc_trydoorcall(nsc_data_t **dptr, int *ndata, int *adata)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	static	int 		doorfd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	static	door_info_t 	real_door;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	door_info_t 		my_door;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	door_arg_t		param;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	 * the first time in we try and open and validate the door.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	 * the validations are that the door must have been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	 * created with the name service door cookie and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	 * that the file attached to the door is owned by root
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	 * and readonly by user, group and other.  If any of these
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	 * validations fail we refuse to use the door.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	lmutex_lock(&_door_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
try_again:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (doorfd == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		int		tbc[3];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		if ((doorfd = open64(NAME_SERVICE_DOOR, O_RDONLY, 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
		    == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
			lmutex_unlock(&_door_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
			return (NOSERVER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		 * dup up the file descriptor if we have 0 - 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		 * to avoid problems with shells stdin/out/err
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		while (doorfd < 3) { /* we have a reserved fd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
			tbc[i++] = doorfd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
			if ((doorfd = dup(doorfd)) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
				while (i--)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
				    (void) close(tbc[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
				doorfd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
				lmutex_unlock(&_door_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
				return (NOSERVER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
		while (i--)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		    (void) close(tbc[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		 * mark this door descriptor as close on exec
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		(void) fcntl(doorfd, F_SETFD, FD_CLOEXEC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		if (__door_info(doorfd, &real_door) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
			 * we should close doorfd because we just opened it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			(void) close(doorfd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			doorfd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
			lmutex_unlock(&_door_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
			return (NOSERVER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		if ((real_door.di_attributes & DOOR_REVOKED) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		    (real_door.di_data !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		    (door_ptr_t)NAME_SERVICE_DOOR_COOKIE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
			(void) close(doorfd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
			doorfd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			lmutex_unlock(&_door_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			return (NOSERVER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		if ((__door_info(doorfd, &my_door) == -1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		    (my_door.di_data != (door_ptr_t)NAME_SERVICE_DOOR_COOKIE) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
			(my_door.di_uniquifier != real_door.di_uniquifier)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
				 * don't close it -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
				 * someone else has clobbered fd
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
				doorfd = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
				goto try_again;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		if (my_door.di_attributes & DOOR_REVOKED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
			(void) close(doorfd);	/* nscd exited .... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
			doorfd = -1;	/* try and restart connection */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
			goto try_again;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	lmutex_unlock(&_door_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	param.rbuf = (char *)*dptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	param.rsize = *ndata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	param.data_ptr = (char *)*dptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	param.data_size = *adata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	param.desc_ptr = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	param.desc_num = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	if (__door_call(doorfd, &param) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		return (NOSERVER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	*adata = (int)param.data_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	*ndata = (int)param.rsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	*dptr = (nsc_data_t *)(uintptr_t)param.data_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	if (*adata == 0 || *dptr == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		return (NOSERVER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	return ((*dptr)->nsc_ret.nsc_return_code);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
}