⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpcserv.c

📁 PNX系列设备驱动 PNX系列设备驱动
💻 C
📖 第 1 页 / 共 5 页
字号:

      /* -------------------------------------------- */

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