📄 rpcserv.c
字号:
/* -------------------------------------------- */
case HostCall_SEND:
command->parameters.send_args.retval=
convert_host_long (
send (
convert_tcs_long (command->parameters.send_args.s),
IN_BUFFER (command->parameters.send_args.buf),
convert_tcs_long (command->parameters.send_args.len),
convert_tcs_msg (command->parameters.recv_args.flags)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
/* -------------------------------------------- */
case HostCall_LISTEN:
command->parameters.listen_args.retval=
convert_host_long (
listen (
convert_tcs_long (command->parameters.listen_args.s),
convert_tcs_long (command->parameters.listen_args.backlog)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
/* -------------------------------------------- */
case HostCall_INETADDR:
command->parameters.listen_args.retval=
convert_host_long (
inet_addr (
IN_BUFFER (command->parameters.inetaddr_args.cp)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
/* -------------------------------------------- */
case HostCall_CLOSESOCKET:
command->parameters.closesocket_args.retval=
convert_host_long (
closesocket (
convert_tcs_long (command->parameters.closesocket_args.s)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
/* -------------------------------------------- */
case HostCall_ACCEPT:
{
int addrlen;
addrlen = convert_tcs_long (command->parameters.accept_args.addrlen);
command->parameters.accept_args.retval=
convert_host_long (
accept (
convert_tcs_long (command->parameters.accept_args.s),
(struct sockaddr *) RESULT_BUFFER (command->parameters.accept_args.addr),
&addrlen));
command->parameters.accept_args.addrlen = convert_host_long (addrlen);
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
}
break;
/* -------------------------------------------- */
case HostCall_CONNECT:
command->parameters.connect_args.retval=
convert_host_long (
connect (
convert_tcs_long (command->parameters.connect_args.s),
(struct sockaddr *) RESULT_BUFFER (command->parameters.connect_args.addr),
convert_tcs_long (command->parameters.connect_args.addrlen)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
/* -------------------------------------------- */
case HostCall_BIND:
command->parameters.bind_args.retval=
convert_host_long (
bind (
convert_tcs_long (command->parameters.bind_args.s),
(struct sockaddr const *) RESULT_BUFFER (command->parameters.bind_args.addr),
convert_tcs_long (command->parameters.bind_args.addrlen)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
/* -------------------------------------------- */
case HostCall_SELECT:
{
int i;
fd_set read, write, except;
struct timeval timeout;
select_results *retbuf;
retbuf = (select_results *) RESULT_BUFFER (command->parameters.select_args.retbuf);
/*Create input arguments in correct data representation.*/
if (command->parameters.select_args.read != NULL)
convert_tcs_fd_set
(
(tcs_fd_set *) RESULT_BUFFER (command->parameters.select_args.read),
&read
);
if (command->parameters.select_args.write != NULL)
convert_tcs_fd_set
(
(tcs_fd_set *) RESULT_BUFFER (command->parameters.select_args.write),
&write
);
if (command->parameters.select_args.except != NULL)
convert_tcs_fd_set
(
(tcs_fd_set *) RESULT_BUFFER (command->parameters.select_args.except),
&except
);
if (command->parameters.select_args.timeout != NULL)
convert_tcs_timeval
(
(TCS_TimeVal *) RESULT_BUFFER (command->parameters.select_args.timeout),
&timeout
);
retbuf->retval =
convert_host_long (
select (
convert_tcs_long (command->parameters.select_args.n),
command->parameters.select_args.read != NULL? &read: NULL,
command->parameters.select_args.write != NULL? &write: NULL,
command->parameters.select_args.except != NULL? &except: NULL,
command->parameters.select_args.timeout != NULL? &timeout: NULL));
/*Create output arguments in correct data representation.*/
if (command->parameters.select_args.read != NULL)
convert_host_fd_set
(
&read,
&retbuf->read
);
if (command->parameters.select_args.write != NULL)
convert_host_fd_set
(
&write,
&retbuf->write
);
if (command->parameters.select_args.except != NULL)
convert_host_fd_set
(
&except,
&retbuf->except
);
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
}
break;
case HostCall_GETHOSTBYADDR_R:
{
gethostbyaddr_r_results *retbuf;
struct hostent *r;
int e;
retbuf = (gethostbyaddr_r_results *) RESULT_BUFFER
(command->parameters.gethostbyaddr_r_args.retbuf);
if ((r = gethostbyaddr
(
RESULT_BUFFER (command->parameters.gethostbyaddr_r_args.addr),
convert_tcs_long (command->parameters.gethostbyaddr_r_args.length),
convert_tcs_long (command->parameters.gethostbyaddr_r_args.type))) == NULL)
{
e = last_net_errno ();
retbuf->retval = NULL;
}
else if (!convert_host_hostent (r, &retbuf->result, retbuf->buffer,
convert_tcs_long (command->parameters.gethostbyaddr_r_args.buflen)))
{
e = ERANGE;
retbuf->retval = NULL;
}
else
{
e = 0;
retbuf->retval = (TCS_HostEnt *) TM1IF_host2tm (ninfo,(Pointer)&retbuf->result);
}
retbuf->h_errnop =
command->returned_errno = convert_host_errno (e);
command->notification_status = convert_host_long (HostCall_DONE);
}
break;
case HostCall_GETHOSTBYNAME_R:
{
gethostbyname_r_results *retbuf;
struct hostent *r;
int e;
retbuf = (gethostbyname_r_results *)
RESULT_BUFFER (command->parameters.gethostbyname_r_args.retbuf);
if ((r = gethostbyname (RESULT_BUFFER
(command->parameters.gethostbyname_r_args.name))) == NULL)
{
e = last_net_errno ();
retbuf->retval = NULL;
}
else if (!convert_host_hostent (r, &retbuf->result, retbuf->buffer,
convert_tcs_long (command->parameters.gethostbyname_r_args.buflen)))
{
e = ERANGE;
retbuf->retval = NULL;
}
else
{
e = 0;
retbuf->retval = (TCS_HostEnt *) TM1IF_host2tm (ninfo,(Pointer)&retbuf->result);
}
retbuf->h_errnop =
command->returned_errno = convert_host_errno (e);
command->notification_status = convert_host_long (HostCall_DONE);
}
break;
case HostCall_GETHOSTNAME:
command->parameters.gethostname_args.retval =
convert_host_long (
gethostname (
RESULT_BUFFER (command->parameters.gethostname_args.name),
convert_tcs_long (command->parameters.gethostname_args.namelen)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
case HostCall_GETPROTOBYNAME:
{
struct protoent *r= getprotobyname(
RESULT_BUFFER (command->parameters.getprotobyname_args.name)
);
if (r == Null) {
command->parameters.getprotobyname_args.retval->p_proto = Null;
} else {
convert_host_protoent(
r,
(TCS_ProtoEnt *) RESULT_BUFFER ((UInt32) command->parameters.getprotobyname_args.retval)
);
}
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
}
break;
case HostCall_GETSOCKNAME:
command->parameters.getsockname_args.retval =
convert_host_long (
getsockname (
convert_tcs_long (command->parameters.getsockname_args.s),
(struct sockaddr *) RESULT_BUFFER (command->parameters.getsockname_args.name),
(Pointer) RESULT_BUFFER (command->parameters.getsockname_args.namelen)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
case HostCall_SETSOCKOPT:
{
int sol;
sol = convert_tcs_sol (command->parameters.setsockopt_args.level);
/*N B. The optval argument should be byteswapped (in principal
depending on optval), but since the only options we are interested
in are boolean, we don't care.*/
command->parameters.setsockopt_args.retval =
convert_host_long (
setsockopt (
convert_tcs_long (command->parameters.setsockopt_args.s),
sol,
convert_tcs_opt (sol, command->parameters.setsockopt_args.optname),
RESULT_BUFFER (command->parameters.setsockopt_args.optval),
convert_tcs_long (command->parameters.setsockopt_args.optlen)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
}
break;
case HostCall_IOCTLSOCKET:
command->parameters.ioctlsocket_args.retval =
convert_host_long (
ioctlsocket (
convert_tcs_long (command->parameters.ioctlsocket_args.s),
convert_tcs_long (command->parameters.ioctlsocket_args.cmd),
(unsigned long *) RESULT_BUFFER (command->parameters.ioctlsocket_args.arg)));
command->returned_errno = convert_host_errno (last_net_errno ());
command->notification_status = convert_host_long (HostCall_DONE);
break;
#endif
/* -------------------------------------------- */
/*
* Unimplemented functions:
*/
default:
command->returned_errno = convert_host_errno (ENOSYS);
command->notification_status = convert_host_long (HostCall_ERROR);
break;
}
PCI_STABILISE (&command->code, &saved);
return True;
}
/*------------------------------- Module Control Funcs -----------------------*/
static void free_argv(Int argc, String *argv)
{
Int i;
for (i=0; i<argc; i++) { free( (Pointer)argv[i] ); }
free( (Pointer)argv );
}
/* -------------------------------------------- */
static Pointer copy_argv(Int argc, String *argv)
{
Int i;
Int resultsize = argc * sizeof(String);
String *result = (Pointer)malloc( resultsize );
if (result == Null) { return Null;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -