pastebin - collaborative debugging tool
nrubsig.kpaste.net RSS


msnfs41client: prototype fix for libtirpc hang
Posted by Anonymous on Thu 26th Oct 2023 18:06
raw | new post

  1. diff --git a/build.vc19/libtirpc/libtirpc.vcxproj b/build.vc19/libtirpc/libtirpc.vcxproj
  2. index 36b6c4f..0694ed6 100644
  3. --- a/build.vc19/libtirpc/libtirpc.vcxproj
  4. +++ b/build.vc19/libtirpc/libtirpc.vcxproj
  5. @@ -87,7 +87,7 @@
  6.        </PrecompiledHeader>
  7.        <WarningLevel>Level3</WarningLevel>
  8.        <Optimization>Disabled</Optimization>
  9. -      <PreprocessorDefinitions>FD_SETSIZE=128;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  10. +      <PreprocessorDefinitions>FD_SETSIZE=1024;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  11.        <AdditionalIncludeDirectories>..\..\libtirpc\tirpc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  12.      </ClCompile>
  13.      <Link>
  14. @@ -103,7 +103,7 @@
  15.        </PrecompiledHeader>
  16.        <WarningLevel>Level3</WarningLevel>
  17.        <Optimization>Disabled</Optimization>
  18. -      <PreprocessorDefinitions>FD_SETSIZE=128;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  19. +      <PreprocessorDefinitions>FD_SETSIZE=1024;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  20.        <AdditionalIncludeDirectories>..\..\libtirpc\tirpc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  21.      </ClCompile>
  22.      <Link>
  23. @@ -121,7 +121,7 @@
  24.        <Optimization>MaxSpeed</Optimization>
  25.        <FunctionLevelLinking>true</FunctionLevelLinking>
  26.        <IntrinsicFunctions>true</IntrinsicFunctions>
  27. -      <PreprocessorDefinitions>FD_SETSIZE=128;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  28. +      <PreprocessorDefinitions>FD_SETSIZE=1024;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  29.        <AdditionalIncludeDirectories>..\..\libtirpc\tirpc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  30.      </ClCompile>
  31.      <Link>
  32. @@ -141,7 +141,7 @@
  33.        <Optimization>MaxSpeed</Optimization>
  34.        <FunctionLevelLinking>true</FunctionLevelLinking>
  35.        <IntrinsicFunctions>true</IntrinsicFunctions>
  36. -      <PreprocessorDefinitions>FD_SETSIZE=128;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  37. +      <PreprocessorDefinitions>FD_SETSIZE=1024;INET6;NO_CB_4_KRB5P;PORTMAP;_WINSOCK_DEPRECATED_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;LIBTIRPC_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  38.        <AdditionalIncludeDirectories>..\..\libtirpc\tirpc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  39.      </ClCompile>
  40.      <Link>
  41. diff --git a/daemon/acl.c b/daemon/acl.c
  42. index 1d1eac4..4297722 100644
  43. --- a/daemon/acl.c
  44. +++ b/daemon/acl.c
  45. @@ -223,6 +223,18 @@ static int map_name_2_sid(nfs41_daemon_globals *nfs41dg, int query, DWORD *sid_l
  46.              name = "roland_mainz";
  47.              dprintf(ACLLVL, "map_name_2_sid: remap 1616 --> roland_mainz\n");
  48.          }
  49. +        else if (!strcmp(name, "swulsch")) {
  50. +            name = "siegfried_wulsch";
  51. +            dprintf(ACLLVL, "map_name_2_sid: remap swulsch --> siegfried_wulsch\n");
  52. +        }
  53. +        else if (!strcmp(name, "197609")) {
  54. +            name = "siegfried_wulsch";
  55. +            dprintf(ACLLVL, "map_name_2_sid: remap 197609 --> siegfried_wulsch\n");
  56. +        }
  57. +        else if (!strcmp(name, "1818")) {
  58. +            name = "siegfried_wulsch";
  59. +            dprintf(ACLLVL, "map_name_2_sid: remap 1818 --> siegfried_wulsch\n");
  60. +        }
  61.      }
  62.  #endif /* NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID */
  63.  
  64. diff --git a/daemon/getattr.c b/daemon/getattr.c
  65. index 7c5f241..ee9f5e1 100644
  66. --- a/daemon/getattr.c
  67. +++ b/daemon/getattr.c
  68. @@ -80,6 +80,21 @@ static int handle_getattr(void *daemon_context, nfs41_upcall *upcall)
  69.      nfs41_open_state *state = upcall->state_ref;
  70.      nfs41_file_info info = { 0 };
  71.  
  72. +#if 1
  73. +    if (((char *)state->session) == ((char *)0xdddddddddddddddd)) {
  74. +        eprintf("handle_getattr: Invalid session pointer 0xdddddddddddddddd\n");
  75. +        status = ERROR_INVALID_PARAMETER;
  76. +        goto out;
  77. +    }
  78. +
  79. +    EASSERT(state->file.fh.superblock != NULL);
  80. +    if (state->file.fh.superblock == NULL) {
  81. +        /* gisburn: fixme: maybe this should be |ERROR_INTERNAL_ERROR| ? */
  82. +        status = ERROR_INVALID_PARAMETER;
  83. +        goto out;
  84. +    }
  85. +#endif
  86. +
  87.      status = nfs41_cached_getattr(state->session, &state->file, &info);
  88.      if (status) {
  89.          eprintf("nfs41_cached_getattr() failed with %d\n", status);
  90. diff --git a/daemon/idmap.c b/daemon/idmap.c
  91. index 00af1fe..6947b6c 100644
  92. --- a/daemon/idmap.c
  93. +++ b/daemon/idmap.c
  94. @@ -133,7 +133,7 @@ static const struct config_option g_options[] = {
  95.      OPT_ATTR("ldap_attr_gidNumber", "gidNumber", ATTR_GID),
  96.  
  97.      /* caching configuration */
  98. -    OPT_INT("cache_ttl", "60", cache_ttl),
  99. +    OPT_INT("cache_ttl", "6000", cache_ttl),
  100.  };
  101.  
  102.  
  103. diff --git a/daemon/name_cache.c b/daemon/name_cache.c
  104. index 3f944fd..5bb6aee 100644
  105. --- a/daemon/name_cache.c
  106. +++ b/daemon/name_cache.c
  107. @@ -351,12 +351,24 @@ static void copy_attrs(
  108.      dst->type = src->type;
  109.      dst->numlinks = src->numlinks;
  110.      dst->mode = src->mode;
  111. -    EASSERT(src->owner != NULL);
  112. +    EASSERT(src->owner[0] != '\0');
  113. +    if (src->owner[0] != '\0') {
  114.          dst->owner = dst->owner_buf;
  115.          (void)strcpy(dst->owner, src->owner);
  116. -    EASSERT(src->owner_group != NULL);
  117. +    }
  118. +    else {
  119. +        /* this should only happen for newly created files7dirs */
  120. +        dst->owner = NULL;
  121. +    }
  122. +    EASSERT(src->owner_group[0] != '\0');
  123. +    if (src->owner_group[0] != '\0') {
  124.          dst->owner_group = dst->owner_group_buf;
  125.          (void)strcpy(dst->owner_group, src->owner_group);
  126. +    }
  127. +    else {
  128. +        /* this should only happen for newly created files7dirs */
  129. +        dst->owner_group = NULL;
  130. +    }
  131.      dst->fileid = src->fileid;
  132.      dst->hidden = src->hidden;
  133.      dst->system = src->system;
  134. @@ -369,8 +381,11 @@ static void copy_attrs(
  135.      dst->attrmask.arr[1] = FATTR4_WORD1_MODE
  136.          | FATTR4_WORD1_NUMLINKS | FATTR4_WORD1_TIME_ACCESS
  137.          | FATTR4_WORD1_TIME_CREATE | FATTR4_WORD1_TIME_MODIFY
  138. -        | FATTR4_WORD1_SYSTEM
  139. -        | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
  140. +        | FATTR4_WORD1_SYSTEM;
  141. +    if (dst->owner)
  142. +        dst->attrmask.arr[1] |= FATTR4_WORD1_OWNER;
  143. +    if (dst->owner_group)
  144. +        dst->attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
  145.  }
  146.  
  147.  
  148. diff --git a/daemon/nfs41_xdr.c b/daemon/nfs41_xdr.c
  149. index 9bde0f0..6889a79 100644
  150. --- a/daemon/nfs41_xdr.c
  151. +++ b/daemon/nfs41_xdr.c
  152. @@ -1815,6 +1815,7 @@ static bool_t decode_file_attrs(
  153.              EASSERT(owner_len > 0);
  154.              EASSERT(owner_len < sizeof(info->owner_group_buf));
  155.              info->owner[owner_len] = '\0';
  156. +            EASSERT(info->owner[0] != '\0');
  157.          }
  158.          if (attrs->attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) {
  159.              if (info->owner_group == NULL)
  160. @@ -1830,6 +1831,7 @@ static bool_t decode_file_attrs(
  161.              EASSERT(owner_group_len > 0);
  162.              EASSERT(owner_group_len < sizeof(info->owner_group_buf));
  163.              info->owner_group[owner_group_len] = '\0';
  164. +            EASSERT(info->owner_group[0] != '\0');
  165.          }
  166.          if (attrs->attrmask.arr[1] & FATTR4_WORD1_SPACE_AVAIL) {
  167.              if (!xdr_u_hyper(xdr, &info->space_avail))
  168. diff --git a/daemon/open.c b/daemon/open.c
  169. index a9ffcb0..1f8bd54 100644
  170. --- a/daemon/open.c
  171. +++ b/daemon/open.c
  172. @@ -99,6 +99,24 @@ static void open_state_free(
  173.  void nfs41_open_state_ref(
  174.      IN nfs41_open_state *state)
  175.  {
  176. +#if 1
  177. +    /*
  178. +     * gisburn: fixme: sometimes this happens under high parallel
  179. +     * usage with multiple mounts - but why ?
  180. +     * 0:038> kp
  181. +     * Child-SP          RetAddr           Call Site
  182. +     * 0000006d`431fde10 00007ff7`32f7d905 nfsd!nfs41_open_state_ref(struct __nfs41_open_state * state = 0x00000000`00000000)+0x31
  183. +     * 0000006d`431fdf30 00007ff7`32f4d284 nfsd!upcall_parse(unsigned char * buffer = 0x0000006d`431fe180 "???", unsigned int length = 8, struct __nfs41_upcall * upcall = 0x0000006d`431ff1e0)+0x2e5
  184. +     * 0000006d`431fe0b0 00007ffc`1ca24c7c nfsd!thread_main(void * args = 0x00007ff7`32fb6080)+0x144
  185. +     * 0000006d`431ffe00 00007ffc`4d4b7344 ucrtbased!thread_start<unsigned int (void * parameter = 0x0000025d`a9c6def0)+0x9c
  186. +     * 0000006d`431ffe60 00007ffc`4efc26b1 KERNEL32!BaseThreadInitThunk+0x14
  187. +     * 0000006d`431ffe90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
  188. +     */
  189. +    EASSERT(state != NULL);
  190. +    if (state == NULL)
  191. +        return;
  192. +#endif
  193. +
  194.      const LONG count = InterlockedIncrement(&state->ref_count);
  195.  
  196.      dprintf(2, "nfs41_open_state_ref(%s) count %d\n", state->path.path, count);
  197. @@ -669,12 +687,47 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  198.          gid_t map_gid = -1;
  199.          char *at_ch; /* pointer to '@' */
  200.  
  201. +#if 1
  202. +        /* this should only happen for newly created files/dirs */
  203. +        if (((info.attrmask.arr[1] & FATTR4_WORD1_OWNER) == 0) ||
  204. +            ((info.attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) == 0)) {
  205. +            bitmap4 og_attr_request = { 0 };
  206. +            nfs41_file_info og_info = { 0 };
  207. +            nfsacl41 acl = { 0 };
  208. +
  209. +            og_attr_request.count = 2;
  210. +            og_attr_request.arr[1] =
  211. +                FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
  212. +            og_info.owner = og_info.owner_buf;
  213. +            og_info.owner_group = og_info.owner_group_buf;
  214. +            status = nfs41_getattr(state->session, &state->file,
  215. +                &og_attr_request, &og_info);
  216. +            if (status) {
  217. +                eprintf("get_stat_data: nfs41_getattr('%s') "
  218. +                    "failed with %d\n",
  219. +                    state->path.path,
  220. +                    status);
  221. +                goto out_free_state;
  222. +            }
  223. +
  224. +            info.owner = info.owner_buf;
  225. +            (void)strcpy(info.owner, og_info.owner);
  226. +            info.attrmask.arr[1] |= FATTR4_WORD1_OWNER;
  227. +            info.owner_group = info.owner_group_buf;
  228. +            (void)strcpy(info.owner_group, og_info.owner_group);
  229. +            info.attrmask.arr[1] |= FATTR4_WORD1_OWNER_GROUP;
  230. +        }
  231. +#endif
  232. +
  233.          EASSERT((info.attrmask.arr[1] & FATTR4_WORD1_OWNER) != 0);
  234.          EASSERT((info.attrmask.arr[1] & FATTR4_WORD1_OWNER_GROUP) != 0);
  235.          EASSERT(info.owner != NULL);
  236.          EASSERT(info.owner_group != NULL);
  237.          EASSERT(info.owner == info.owner_buf);
  238.          EASSERT(info.owner_group == info.owner_group_buf);
  239. +        EASSERT(strlen(info.owner) > 0);
  240. +        EASSERT(strlen(info.owner_group) > 0);
  241. +
  242.          /* Make copies as we will modify  them */
  243.          (void)strcpy(owner, info.owner);
  244.          (void)strcpy(owner_group, info.owner_group);
  245. @@ -698,8 +751,9 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  246.          }
  247.          else {
  248.              args->owner_local_uid = NFS_USER_NOBODY_UID;
  249. -            eprintf("get_stat_data: "
  250. +            eprintf("get_stat_data('%s'): "
  251.                  "no username mapping for '%s', fake uid=%d\n",
  252. +                state->path.path,
  253.                  owner, args->owner_local_uid);
  254.          }
  255.  
  256. @@ -721,12 +775,14 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  257.          }
  258.          else {
  259.              args->owner_group_local_gid = NFS_GROUP_NOGROUP_GID;
  260. -            eprintf("get_stat_data: "
  261. +            eprintf("get_stat_data('%s'): "
  262.                  "no group mapping for '%s', fake gid=%d\n",
  263. +                state->path.path,
  264.                  owner_group, args->owner_group_local_gid);
  265.          }
  266.  
  267. -        dprintf(1, "handle_open: stat: owner=%u/'%s', owner_group=%u/'%s'\n",
  268. +        dprintf(1, "handle_open('%s'): stat: owner=%u/'%s', owner_group=%u/'%s'\n",
  269. +            state->path.path,
  270.              (unsigned int)args->owner_local_uid, owner,
  271.              (unsigned int)args->owner_group_local_gid, owner_group);
  272.  #endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
  273. diff --git a/daemon/util.c b/daemon/util.c
  274. index 07aa2c6..c482624 100644
  275. --- a/daemon/util.c
  276. +++ b/daemon/util.c
  277. @@ -207,7 +207,9 @@ void nfs41_file_info_cpy(
  278.      IN const nfs41_file_info *src)
  279.  {
  280.      (void)memcpy(dest, src, sizeof(nfs41_file_info));
  281. +    if (src->owner != NULL)
  282.          dest->owner = dest->owner_buf;
  283. +    if (src->owner_group != NULL)
  284.          dest->owner_group = dest->owner_group_buf;
  285.  }
  286.  
  287. diff --git a/libtirpc/src/auth_time.c b/libtirpc/src/auth_time.c
  288. index ad8e521..596de50 100644
  289. --- a/libtirpc/src/auth_time.c
  290. +++ b/libtirpc/src/auth_time.c
  291. @@ -250,7 +250,7 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid)
  292.         nis_server              tsrv;
  293.         void                    (*oldsig)() = NULL; /* old alarm handler */
  294.         struct sockaddr_in      sin;
  295. -       SOCKET                  s = RPC_ANYSOCK;
  296. +       int                     s = RPC_ANYSOCK;
  297.         socklen_t len;
  298.         int                     type = 0;
  299.  
  300. @@ -377,8 +377,8 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid)
  301.                         goto error;
  302.                 }
  303.  
  304. -               s = socket(AF_INET, type, 0);
  305. -               if (s == INVALID_SOCKET) {
  306. +               s = wintirpc_socket(AF_INET, type, 0);
  307. +               if (s == -1) {
  308.                         msg("unable to open fd to network.");
  309.                         goto error;
  310.                 }
  311. @@ -393,21 +393,21 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid)
  312.                         fd_set readfds;
  313.                         int res;
  314.  
  315. -                       if (sendto(s, (const char *)&thetime, sizeof(thetime), 0,
  316. +                       if (sendto(_get_osfhandle(s), (const char *)&thetime, sizeof(thetime), 0,
  317.                                 (struct sockaddr *)&sin, sizeof(sin)) == -1) {
  318.                                 msg("udp : sendto failed.");
  319.                                 goto error;
  320.                         }
  321.                         do {
  322.                                 FD_ZERO(&readfds);
  323. -                               FD_SET(s, &readfds);
  324. +                               FD_SET(_get_osfhandle(s), &readfds);
  325.                                 res = select(_rpc_dtablesize(), &readfds,
  326.                                      (fd_set *)NULL, (fd_set *)NULL, &timeout);
  327.                         } while (res == SOCKET_ERROR && WSAGetLastError() == WSAEINTR);
  328.                         if (res == SOCKET_ERROR)
  329.                                 goto error;
  330.                         len = sizeof(from);
  331. -                       res = recvfrom(s, (char *)&thetime, sizeof(thetime), 0,
  332. +                       res = recvfrom(_get_osfhandle(s), (char *)&thetime, sizeof(thetime), 0,
  333.                                        (struct sockaddr *)&from, &len);
  334.                         if (res == SOCKET_ERROR) {
  335.                                 msg("recvfrom failed on udp transport.");
  336. @@ -424,7 +424,7 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid)
  337.                         saw_alarm = 0;
  338.                         /* XXX Need Windows signal/alarm stuff here XXX */
  339.  #endif
  340. -                       res = connect(s, (struct sockaddr *)&sin, sizeof(sin));
  341. +                       res = connect(_get_osfhandle(s), (struct sockaddr *)&sin, sizeof(sin));
  342.                         if (res == SOCKET_ERROR) {
  343.                                 msg("failed to connect to tcp endpoint.");
  344.                                 goto error;
  345. @@ -433,8 +433,8 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid)
  346.                                 msg("alarm caught it, must be unreachable.");
  347.                                 goto error;
  348.                         }
  349. -//                     res = read(s, (char *)&thetime, sizeof(thetime));
  350. -                       res = recv(s, (char *)&thetime, sizeof(thetime), 0);
  351. +//                     res = read(_get_osfhandle(s), (char *)&thetime, sizeof(thetime));
  352. +                       res = recv(_get_osfhandle(s), (char *)&thetime, sizeof(thetime), 0);
  353.                         if (res != sizeof(thetime)) {
  354.                                 if (saw_alarm)
  355.                                         msg("timed out TCP call.");
  356. @@ -446,7 +446,7 @@ __rpc_get_time_offset(td, srv, thost, uaddr, netid)
  357.                         time_valid = 1;
  358.                 }
  359.                 save = WSAGetLastError();
  360. -               (void)closesocket(s);
  361. +               (void)wintirpc_closesocket(s);
  362.                 errno = save;
  363.                 s = RPC_ANYSOCK;
  364.  
  365. @@ -465,7 +465,7 @@ error:
  366.          */
  367.  
  368.         if (s != RPC_ANYSOCK)
  369. -               (void)closesocket(s);
  370. +               (void)wintirpc_closesocket(s);
  371.  
  372.         if (clnt != NULL)
  373.                 clnt_destroy(clnt);
  374. diff --git a/libtirpc/src/bindresvport.c b/libtirpc/src/bindresvport.c
  375. index c1f0d9b..f64ff58 100644
  376. --- a/libtirpc/src/bindresvport.c
  377. +++ b/libtirpc/src/bindresvport.c
  378. @@ -51,7 +51,7 @@
  379.   */
  380.  int
  381.  bindresvport(sd, sin)
  382. -        SOCKET sd;
  383. +        int sd;
  384.          struct sockaddr_in *sin;
  385.  {
  386.          return bindresvport_sa(sd, (struct sockaddr *)sin);
  387. @@ -87,7 +87,7 @@ bindresvport_sa(sd, sa)
  388.                  salen = sizeof(myaddr);
  389.                  sa = (struct sockaddr *)&myaddr;
  390.  
  391. -                if (getsockname(sd, (struct sockaddr *)&myaddr, &salen) == -1)
  392. +                if (getsockname(_get_osfhandle(sd), (struct sockaddr *)&myaddr, &salen) == -1)
  393.                          return -1;      /* errno is correctly set */
  394.  
  395.                  af = myaddr.ss_family;
  396. @@ -125,7 +125,7 @@ bindresvport_sa(sd, sa)
  397.                  *portp = htons(port++);
  398.                   if (port > endport)
  399.                          port = startport;
  400. -                res = bind(sd, sa, salen);
  401. +                res = bind(_get_osfhandle(sd), sa, salen);
  402.                 if (res >= 0 || errno != EADDRINUSE)
  403.                         break;
  404.          }
  405. @@ -144,7 +144,7 @@ bindresvport_sa(sd, sa)
  406.  #if defined(_WIN32)
  407.  
  408.  int
  409. -bindresvport_sa(SOCKET sd, struct sockaddr *sa)
  410. +bindresvport_sa(int sd, struct sockaddr *sa)
  411.  {
  412.         fprintf(stderr, "Do-nothing bindresvport_sa!\n");
  413.         return 0;
  414. @@ -159,7 +159,7 @@ bindresvport_sa(SOCKET sd, struct sockaddr *sa)
  415.   */
  416.  int
  417.  bindresvport_sa(sd, sa)
  418. -       SOCKET sd;
  419. +       int sd;
  420.         struct sockaddr *sa;
  421.  {
  422.  #ifdef IPV6_PORTRANGE
  423. @@ -185,13 +185,13 @@ bindresvport_sa(sd, sa)
  424.  
  425.  #ifdef _WIN32
  426.                 memset(sa, 0, salen);
  427. -               if (error = getsockopt(sd, SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&proto_info, &proto_info_size) == SOCKET_ERROR) {
  428. +               if (error = getsockopt(_get_osfhandle(sd), SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&proto_info, &proto_info_size) == SOCKET_ERROR) {
  429.                         int sockerr = WSAGetLastError();
  430.                         return -1;
  431.                 }
  432.                 af = proto_info.iAddressFamily;
  433.  #else
  434. -               if (getsockname(sd, sa, &salen) == -1)
  435. +               if (getsockname(_get_osfhandle(sd), sa, &salen) == -1)
  436.                         return -1;      /* errno is correctly set */
  437.  
  438.                 af = sa->sa_family;
  439. @@ -231,18 +231,18 @@ bindresvport_sa(sd, sa)
  440.         if (*portp == 0) {
  441.                 socklen_t oldlen = sizeof(old);
  442.  
  443. -               error = getsockopt(sd, proto, portrange, &old, &oldlen);
  444. +               error = getsockopt(_get_osfhandle(sd), proto, portrange, &old, &oldlen);
  445.                 if (error < 0)
  446.                         return (error);
  447.  
  448. -               error = setsockopt(sd, proto, portrange, &portlow,
  449. +               error = setsockopt(_get_osfhandle(sd), proto, portrange, &portlow,
  450.                     sizeof(portlow));
  451.                 if (error < 0)
  452.                         return (error);
  453.         }
  454.  #endif
  455.  
  456. -       error = bind(sd, sa, salen);
  457. +       error = bind(_get_osfhandle(sd), sa, salen);
  458.         if (error) {
  459.                 int err = WSAGetLastError();
  460.         }
  461. @@ -252,7 +252,7 @@ bindresvport_sa(sd, sa)
  462.                 int saved_errno = errno;
  463.  
  464.                 if (error < 0) {
  465. -                       if (setsockopt(sd, proto, portrange, &old,
  466. +                       if (setsockopt(_get_osfhandle(sd), proto, portrange, &old,
  467.                             sizeof(old)) < 0)
  468.                                 errno = saved_errno;
  469.                         return (error);
  470. @@ -260,7 +260,7 @@ bindresvport_sa(sd, sa)
  471.  
  472.                 if (sa != (struct sockaddr *)&myaddr) {
  473.                         /* Hmm, what did the kernel assign? */
  474. -                       if (getsockname(sd, sa, &salen) < 0)
  475. +                       if (getsockname(_get_osfhandle(sd), sa, &salen) < 0)
  476.                                 errno = saved_errno;
  477.                         return (error);
  478.                 }
  479. diff --git a/libtirpc/src/clnt_bcast.c b/libtirpc/src/clnt_bcast.c
  480. index 8d32c5d..54ce1d2 100644
  481. --- a/libtirpc/src/clnt_bcast.c
  482. +++ b/libtirpc/src/clnt_bcast.c
  483. @@ -60,6 +60,7 @@
  484.  #endif                         /* PORTMAP */
  485.  #include <rpc/nettype.h>
  486.  //#include <arpa/inet.h>
  487. +#define RPC_DEBUG 1
  488.  #ifdef RPC_DEBUG
  489.  #include <stdio.h>
  490.  #endif
  491. @@ -248,12 +249,12 @@ __rpc_broadenable(int af, int s, struct broadif *bip)
  492.  #if 0
  493.         if (af == AF_INET6) {
  494.                 fprintf(stderr, "set v6 multicast if to %d\n", bip->index);
  495. -               if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_IF, &bip->index,
  496. +               if (setsockopt(_get_osfhandle(s), IPPROTO_IPV6, IPV6_MULTICAST_IF, &bip->index,
  497.                     sizeof bip->index) < 0)
  498.                         return -1;
  499.         } else
  500.  #endif
  501. -               if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &o, sizeof o) == SOCKET_ERROR)
  502. +               if (setsockopt(_get_osfhandle(s), SOL_SOCKET, SO_BROADCAST, &o, sizeof o) == SOCKET_ERROR)
  503.                         return -1;
  504.  
  505.         return 0;
  506. @@ -292,7 +293,8 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
  507.         int             pmap_reply_flag; /* reply recvd from PORTMAP */
  508.         /* An array of all the suitable broadcast transports */
  509.         struct {
  510. -               int fd;         /* File descriptor */
  511. +               SOCK fd_sock;           /* File descriptor */
  512. +                int fd;
  513.                 int af;
  514.                 int proto;
  515.                 struct netconfig *nconf; /* Netconfig structure */
  516. @@ -352,19 +354,20 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
  517.                     &fdlist[fdlistno].nal) == 0)
  518.                         continue;
  519.  
  520. -               fd = socket(si.si_af, si.si_socktype, si.si_proto);
  521. +               fd = wintirpc_socket(si.si_af, si.si_socktype, si.si_proto);
  522.                 if (fd == INVALID_SOCKET) {
  523.                         stat = RPC_CANTSEND;
  524.                         continue;
  525.                 }
  526.                 fdlist[fdlistno].af = si.si_af;
  527.                 fdlist[fdlistno].proto = si.si_proto;
  528. +               fdlist[fdlistno].fd_sock = _get_osfhandle(fd);
  529.                 fdlist[fdlistno].fd = fd;
  530.                 fdlist[fdlistno].nconf = nconf;
  531.                 fdlist[fdlistno].asize = __rpc_get_a_size(si.si_af);
  532.                 pfd[fdlistno].events = POLLIN | POLLPRI |
  533.                         POLLRDNORM | POLLRDBAND;
  534. -               pfd[fdlistno].fd = fdlist[fdlistno].fd = fd;
  535. +               pfd[fdlistno].fd = fdlist[fdlistno].fd_sock = _get_osfhandle(fd);
  536.                 fdlist[fdlistno].dsize = __rpc_get_t_size(si.si_af, si.si_proto,
  537.                                                           0);
  538.  
  539. @@ -375,7 +378,7 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
  540.                 if (si.si_af == AF_INET && si.si_proto == IPPROTO_UDP) {
  541.                         udpbufsz = fdlist[fdlistno].dsize;
  542.                         if ((outbuf_pmap = malloc(udpbufsz)) == NULL) {
  543. -                               closesocket(fd);
  544. +                               wintirpc_closesocket(fd);
  545.                                 stat = RPC_SYSTEMERROR;
  546.                                 goto done_broad;
  547.                         }
  548. @@ -486,7 +489,7 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
  549.                                  */
  550.  
  551.                                 if (!__rpc_lowvers)
  552. -                                       if (sendto(fdlist[i].fd, outbuf,
  553. +                                       if (sendto(fdlist[i].fd_sock, outbuf,
  554.                                             outlen, 0, (struct sockaddr*)addr,
  555.                                             (size_t)fdlist[i].asize) !=
  556.                                             outlen) {
  557. @@ -511,7 +514,7 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
  558.                                  */
  559.                                 if (pmap_flag &&
  560.                                     fdlist[i].proto == IPPROTO_UDP) {
  561. -                                       if (sendto(fdlist[i].fd, outbuf_pmap,
  562. +                                       if (sendto(fdlist[i].fd_sock, outbuf_pmap,
  563.                                             outlen_pmap, 0, addr,
  564.                                             (size_t)fdlist[i].asize) !=
  565.                                                 outlen_pmap) {
  566. @@ -573,7 +576,7 @@ rpc_broadcast_exp(prog, vers, proc, xargs, argsp, xresults, resultsp,
  567.                                 fdlist[i].nconf->nc_netid);
  568.  #endif
  569.                 try_again:
  570. -                       inlen = recvfrom(fdlist[i].fd, inbuf, fdlist[i].dsize,
  571. +                       inlen = recvfrom(fdlist[i].fd_sock, inbuf, fdlist[i].dsize,
  572.                             0, (struct sockaddr *)(void *)&fdlist[i].raddr,
  573.                             &fdlist[i].asize);
  574.                         if (inlen < 0) {
  575. @@ -673,7 +676,7 @@ done_broad:
  576.                 (void) free(outbuf_pmap);
  577.  #endif                         /* PORTMAP */
  578.         for (i = 0; i < fdlistno; i++) {
  579. -               (void)closesocket(fdlist[i].fd);
  580. +               (void)wintirpc_closesocket(fdlist[i].fd);
  581.                 __rpc_freebroadifs(&fdlist[i].nal);
  582.         }
  583.         AUTH_DESTROY(sys_auth);
  584. diff --git a/libtirpc/src/clnt_dg.c b/libtirpc/src/clnt_dg.c
  585. index 1ece8ad..0c2434f 100644
  586. --- a/libtirpc/src/clnt_dg.c
  587. +++ b/libtirpc/src/clnt_dg.c
  588. @@ -122,7 +122,7 @@ static const char mem_err_clnt_dg[] = "clnt_dg_create: out of memory";
  589.   * Private data kept per client handle
  590.   */
  591.  struct cu_data {
  592. -       SOCKET                          cu_fd;          /* connections fd */
  593. +       int                             cu_fd;          /* connections fd */
  594.         bool_t                          cu_closeit;     /* opened by library */
  595.         struct sockaddr_storage cu_raddr;       /* remote address */
  596.         int                                     cu_rlen;
  597. @@ -156,7 +156,7 @@ struct cu_data {
  598.   */
  599.  CLIENT *
  600.  clnt_dg_create(fd, svcaddr, program, version, sendsz, recvsz)
  601. -       SOCKET fd;                              /* open file descriptor */
  602. +       int fd;                         /* open file descriptor */
  603.         const struct netbuf *svcaddr;   /* servers address */
  604.         rpcprog_t program;              /* program number */
  605.         rpcvers_t version;              /* version number */
  606. @@ -281,10 +281,10 @@ clnt_dg_create(fd, svcaddr, program, version, sendsz, recvsz)
  607.  #ifdef IP_RECVERR
  608.         {
  609.         int on = 1;
  610. -       setsockopt(fd, SOL_IP, IP_RECVERR, &on, sizeof(on));
  611. +       setsockopt(_get_osfhandle(fd), SOL_IP, IP_RECVERR, &on, sizeof(on));
  612.         }
  613.  #endif
  614. -       ioctlsocket(fd, FIONBIO, &one);
  615. +       ioctlsocket(_get_osfhandle(fd), FIONBIO, &one);
  616.         /*
  617.          * By default, closeit is always FALSE. It is users responsibility
  618.          * to do a close on it, else the user may use clnt_control
  619. @@ -420,7 +420,7 @@ send_again:
  620.                 goto out;
  621.         }
  622.         nextsend_time = cu->cu_wait.tv_sec * 1000 + cu->cu_wait.tv_usec / 1000;
  623. -       if (sendto(cu->cu_fd, cu->cu_outbuf, (int)outlen, 0, sa, salen) != outlen) {
  624. +       if (sendto(_get_osfhandle(cu->cu_fd), cu->cu_outbuf, (int)outlen, 0, sa, salen) != outlen) {
  625.                 cu->cu_error.re_errno = errno;
  626.                 cu->cu_error.re_status = RPC_CANTSEND;
  627.                 goto out;
  628. @@ -437,7 +437,7 @@ get_reply:
  629.         reply_msg.acpted_rply.ar_results.where = resultsp;
  630.         reply_msg.acpted_rply.ar_results.proc = xresults;
  631.  
  632. -        fd.fd = cu->cu_fd;
  633. +        fd.fd = _get_osfhandle(cu->cu_fd);
  634.          fd.events = POLLIN;
  635.          fd.revents = 0;
  636.         while (total_time > 0) {
  637. @@ -477,7 +477,7 @@ get_reply:
  638.           msg.msg_flags = 0;
  639.           msg.msg_control = cbuf;
  640.           msg.msg_controllen = 256;
  641. -         ret = recvmsg (cu->cu_fd, &msg, MSG_ERRQUEUE);
  642. +         ret = recvmsg (_get_osfhandle(cu->cu_fd), &msg, MSG_ERRQUEUE);
  643.           if (ret >= 0
  644.               && memcmp (cbuf + 256, cu->cu_outbuf, ret) == 0
  645.               && (msg.msg_flags & MSG_ERRQUEUE)
  646. @@ -502,7 +502,7 @@ get_reply:
  647.  
  648.         /* We have some data now */
  649.         do {
  650. -               recvlen = recvfrom(cu->cu_fd, cu->cu_inbuf,
  651. +               recvlen = recvfrom(_get_osfhandle(cu->cu_fd), cu->cu_inbuf,
  652.                     cu->cu_recvsz, 0, NULL, NULL);
  653.                 errno = WSAGetLastError();
  654.         } while (recvlen == SOCKET_ERROR && errno == WSAEINTR);
  655. @@ -693,7 +693,7 @@ clnt_dg_control(cl, request, info)
  656.                 *(struct timeval *)info = cu->cu_wait;
  657.                 break;
  658.         case CLGET_FD:
  659. -               *(SOCKET *)info = cu->cu_fd;
  660. +               *(int *)info = cu->cu_fd;
  661.                 break;
  662.         case CLGET_SVC_ADDR:
  663.                 addr = (struct netbuf *)info;
  664. @@ -779,7 +779,7 @@ clnt_dg_destroy(cl)
  665.         CLIENT *cl;
  666.  {
  667.         struct cu_data *cu = (struct cu_data *)cl->cl_private;
  668. -       SOCKET cu_fd = cu->cu_fd;
  669. +       int cu_fd = cu->cu_fd;
  670.  #ifndef _WIN32
  671.         sigset_t mask;
  672.         sigset_t newmask;
  673. @@ -793,7 +793,7 @@ clnt_dg_destroy(cl)
  674.         while (dg_fd_locks[WINSOCK_HANDLE_HASH(cu_fd)])
  675.                 cond_wait(&dg_cv[WINSOCK_HANDLE_HASH(cu_fd)], &clnt_fd_lock);
  676.         if (cu->cu_closeit)
  677. -               (void)closesocket(cu_fd);
  678. +               (void)wintirpc_closesocket(cu_fd);
  679.         XDR_DESTROY(&(cu->cu_outxdrs));
  680.         mem_free(cu, (sizeof (*cu) + cu->cu_sendsz + cu->cu_recvsz));
  681.         if (cl->cl_netid && cl->cl_netid[0])
  682. diff --git a/libtirpc/src/clnt_generic.c b/libtirpc/src/clnt_generic.c
  683. index 58a6cc1..f90c4b8 100644
  684. --- a/libtirpc/src/clnt_generic.c
  685. +++ b/libtirpc/src/clnt_generic.c
  686. @@ -344,7 +344,7 @@ clnt_tp_create_timed(const char *hostname, const rpcprog_t prog, const rpcvers_t
  687.   * If sizes are 0; appropriate defaults will be chosen.
  688.   */
  689.  CLIENT *
  690. -clnt_tli_create(const SOCKET fd_in, const struct netconfig *nconf,
  691. +clnt_tli_create(const int fd_in, const struct netconfig *nconf,
  692.         struct netbuf *svcaddr, const rpcprog_t prog, const rpcvers_t vers,
  693.         const uint sendsz, const uint recvsz,
  694.      int (*callback_xdr)(void *, void *),
  695. @@ -357,7 +357,7 @@ clnt_tli_create(const SOCKET fd_in, const struct netconfig *nconf,
  696.         BOOL one = TRUE;
  697.         struct __rpc_sockinfo si;
  698.         extern int __rpc_minfd;
  699. -       SOCKET fd = fd_in;
  700. +       int fd = fd_in;
  701.  
  702.         if (fd == RPC_ANYFD) {
  703.                 if (nconf == NULL) {
  704. @@ -402,7 +402,7 @@ clnt_tli_create(const SOCKET fd_in, const struct netconfig *nconf,
  705.                 if (nconf &&
  706.                     ((strcmp(nconf->nc_protofmly, "inet") == 0) ||
  707.                      (strcmp(nconf->nc_protofmly, "inet6") == 0))) {
  708. -                       setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char *)&one,
  709. +                       setsockopt(_get_osfhandle(fd), IPPROTO_TCP, TCP_NODELAY, (const char *)&one,
  710.                             sizeof (one));
  711.                 }
  712.                 cl = clnt_vc_create(fd, svcaddr, prog, vers, sendsz, recvsz,
  713. @@ -435,7 +435,7 @@ err:
  714.         rpc_createerr.cf_stat = RPC_SYSTEMERROR;
  715.         rpc_createerr.cf_error.re_errno = errno;
  716.  err1:  if (madefd)
  717. -               (void)closesocket(fd);
  718. +               (void)wintirpc_closesocket(fd);
  719.         return (NULL);
  720.  }
  721.  
  722. @@ -460,11 +460,11 @@ __rpc_raise_fd(int fd)
  723.                 return (fd);
  724.  
  725.         if (fsync(nfd) == -1) {
  726. -               closesocket(nfd);
  727. +               wintirpc_closesocket(nfd);
  728.                 return (fd);
  729.         }
  730.  
  731. -       if (closesocket(fd) == -1) {
  732. +       if (wintirpc_closesocket(fd) == -1) {
  733.                 /* this is okay, we will syslog an error, then use the new fd */
  734.                 (void) syslog(LOG_ERR,
  735.                         "could not close() fd %d; mem & fd leak", fd);
  736. diff --git a/libtirpc/src/clnt_vc.c b/libtirpc/src/clnt_vc.c
  737. index ff67d5c..fa3e29f 100644
  738. --- a/libtirpc/src/clnt_vc.c
  739. +++ b/libtirpc/src/clnt_vc.c
  740. @@ -402,7 +402,7 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz, cb_xdr, cb_fn, cb_args)
  741.          * XXX - fvdl connecting while holding a mutex?
  742.          */
  743.         slen = sizeof ss;
  744. -       if (getpeername(fd, (struct sockaddr *)&ss, &slen) == SOCKET_ERROR) {
  745. +       if (getpeername(_get_osfhandle(fd), (struct sockaddr *)&ss, &slen) == SOCKET_ERROR) {
  746.                 errno = WSAGetLastError();
  747.                 if (errno != WSAENOTCONN) {
  748.                         rpc_createerr.cf_stat = RPC_SYSTEMERROR;
  749. @@ -411,7 +411,7 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz, cb_xdr, cb_fn, cb_args)
  750.  //                     thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
  751.                         goto err;
  752.                 }
  753. -               if (connect(fd, (struct sockaddr *)raddr->buf, raddr->len) == SOCKET_ERROR){
  754. +               if (connect(_get_osfhandle(fd), (struct sockaddr *)raddr->buf, raddr->len) == SOCKET_ERROR){
  755.                         rpc_createerr.cf_stat = RPC_SYSTEMERROR;
  756.                         rpc_createerr.cf_error.re_errno = WSAGetLastError();
  757.                         mutex_unlock(&clnt_fd_lock);
  758. @@ -457,7 +457,7 @@ clnt_vc_create(fd, raddr, prog, vers, sendsz, recvsz, cb_xdr, cb_fn, cb_args)
  759.             XDR_ENCODE);
  760.         if (! xdr_callhdr(&(ct->ct_xdrs), &call_msg)) {
  761.                 if (ct->ct_closeit) {
  762. -                       (void)closesocket(fd);
  763. +                       (void)wintirpc_closesocket(fd);
  764.                 }
  765.                 goto err;
  766.         }
  767. @@ -934,7 +934,7 @@ clnt_vc_destroy(cl)
  768.      }
  769.  
  770.         if (ct->ct_closeit && ct->ct_fd != -1) {
  771. -               (void)closesocket(ct->ct_fd);
  772. +               (void)wintirpc_closesocket(ct->ct_fd);
  773.         }
  774.         XDR_DESTROY(&(ct->ct_xdrs));
  775.         if (ct->ct_addr.buf)
  776. @@ -971,7 +971,7 @@ read_vc(ctp, buf, len)
  777.  
  778.         if (len == 0)
  779.                 return (0);
  780. -       fd.fd = ct->ct_fd;
  781. +       fd.fd = _get_osfhandle(ct->ct_fd);
  782.         fd.events = POLLIN;
  783.         for (;;) {
  784.                 switch (poll(&fd, 1, milliseconds)) {
  785. @@ -990,7 +990,7 @@ read_vc(ctp, buf, len)
  786.                 break;
  787.         }
  788.  
  789. -       len = recv(ct->ct_fd, buf, (size_t)len, 0);
  790. +       len = recv(_get_osfhandle(ct->ct_fd), buf, (size_t)len, 0);
  791.         errno = WSAGetLastError();
  792.  
  793.         switch (len) {
  794. @@ -1019,7 +1019,7 @@ write_vc(ctp, buf, len)
  795.         int i = 0, cnt;
  796.  
  797.         for (cnt = len; cnt > 0; cnt -= i, buf += i) {
  798. -           if ((i = send(ct->ct_fd, buf, (size_t)cnt, 0)) == SOCKET_ERROR) {
  799. +           if ((i = send(_get_osfhandle(ct->ct_fd), buf, (size_t)cnt, 0)) == SOCKET_ERROR) {
  800.                 ct->ct_error.re_errno = WSAGetLastError();
  801.                 ct->ct_error.re_status = RPC_CANTSEND;
  802.                 return (-1);
  803. diff --git a/libtirpc/src/getpeereid.c b/libtirpc/src/getpeereid.c
  804. index df8365f..17b1a5c 100644
  805. --- a/libtirpc/src/getpeereid.c
  806. +++ b/libtirpc/src/getpeereid.c
  807. @@ -36,7 +36,7 @@
  808.  
  809.  #ifdef _WIN32
  810.  int
  811. -getpeereid(SOCKET s, uid_t *euid, gid_t *egid)
  812. +getpeereid(int s, uid_t *euid, gid_t *egid)
  813.  {
  814.         // XXX Need to figure out what to do here for Windows!
  815.         return -1;
  816. @@ -50,7 +50,7 @@ getpeereid(int s, uid_t *euid, gid_t *egid)
  817.         int error;
  818.  
  819.         uclen = sizeof(uc);
  820. -       error = getsockopt(s, SOL_SOCKET, SO_PEERCRED, &uc, &uclen); /*  SCM_CREDENTIALS */
  821. +       error = getsockopt(_get_osfhandle(s), SOL_SOCKET, SO_PEERCRED, &uc, &uclen); /*  SCM_CREDENTIALS */
  822.         if (error != 0)
  823.                 return (error);
  824.         //      if (uc.cr_version != XUCRED_VERSION)
  825. diff --git a/libtirpc/src/pmap_getmaps.c b/libtirpc/src/pmap_getmaps.c
  826. index c6ad2bb..daf9e74 100644
  827. --- a/libtirpc/src/pmap_getmaps.c
  828. +++ b/libtirpc/src/pmap_getmaps.c
  829. @@ -66,7 +66,7 @@ pmap_getmaps(address)
  830.          struct sockaddr_in *address;
  831.  {
  832.         struct pmaplist *head = NULL;
  833. -       SOCKET sock = INVALID_SOCKET;
  834. +       int sock = INVALID_SOCKET;
  835.         struct timeval minutetimeout;
  836.         CLIENT *client;
  837.  
  838. diff --git a/libtirpc/src/rpc_com.h b/libtirpc/src/rpc_com.h
  839. index a69d7f0..ff9db44 100644
  840. --- a/libtirpc/src/rpc_com.h
  841. +++ b/libtirpc/src/rpc_com.h
  842. @@ -62,7 +62,7 @@
  843.  __BEGIN_DECLS
  844.  extern u_int __rpc_get_a_size(int);
  845.  extern int __rpc_dtbsize(void);
  846. -extern struct netconfig * __rpcgettp(SOCKET);
  847. +extern struct netconfig * __rpcgettp(int);
  848.  extern  int  __rpc_get_default_domain(char **);
  849.  struct netbuf *__rpc_set_netbuf(struct netbuf *, const void *, size_t);
  850.  
  851. @@ -73,7 +73,7 @@ int __rpc_sockinfo2netid(struct __rpc_sockinfo *, const char **);
  852.  int __rpc_seman2socktype(int);
  853.  int __rpc_socktype2seman(int);
  854.  void *rpc_nullproc(CLIENT *);
  855. -int __rpc_sockisbound(SOCKET);
  856. +int __rpc_sockisbound(int);
  857.  
  858.  struct netbuf *__rpcb_findaddr(rpcprog_t, rpcvers_t, const struct netconfig *,
  859.      const char *, CLIENT **);
  860. diff --git a/libtirpc/src/rpc_generic.c b/libtirpc/src/rpc_generic.c
  861. index 42dca45..442d309 100644
  862. --- a/libtirpc/src/rpc_generic.c
  863. +++ b/libtirpc/src/rpc_generic.c
  864. @@ -110,7 +110,8 @@ int
  865.  __rpc_dtbsize()
  866.  {
  867.  #ifdef _WIN32
  868. -       return (WINSOCK_HANDLE_HASH_SIZE);
  869. +        /* gisburn: fixme: static value |1024| */
  870. +       return (1024);
  871.  #else
  872.  
  873.         static int tbsize;
  874. @@ -462,7 +463,7 @@ rpc_nullproc(clnt)
  875.   */
  876.  struct netconfig *
  877.  __rpcgettp(fd)
  878. -       SOCKET fd;
  879. +       int fd;
  880.  {
  881.         const char *netid;
  882.         struct __rpc_sockinfo si;
  883. @@ -478,7 +479,7 @@ __rpcgettp(fd)
  884.  }
  885.  
  886.  int
  887. -__rpc_fd2sockinfo(SOCKET fd, struct __rpc_sockinfo *sip)
  888. +__rpc_fd2sockinfo(int fd, struct __rpc_sockinfo *sip)
  889.  {
  890.         socklen_t len;
  891.         int type, proto;
  892. @@ -487,7 +488,7 @@ __rpc_fd2sockinfo(SOCKET fd, struct __rpc_sockinfo *sip)
  893.  #ifdef _WIN32
  894.         WSAPROTOCOL_INFO proto_info;
  895.         int proto_info_size = sizeof(proto_info);
  896. -       if (getsockopt(fd, SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&proto_info, &proto_info_size) == SOCKET_ERROR) {
  897. +       if (getsockopt(_get_osfhandle(fd), SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&proto_info, &proto_info_size) == SOCKET_ERROR) {
  898.                 int err = WSAGetLastError();
  899.                 return 0;
  900.         }
  901. @@ -495,14 +496,14 @@ __rpc_fd2sockinfo(SOCKET fd, struct __rpc_sockinfo *sip)
  902.         ss.ss_family = (ADDRESS_FAMILY)proto_info.iAddressFamily;
  903.  #else
  904.         len = sizeof ss;
  905. -       if (getsockname(fd, (struct sockaddr *)&ss, &len) == SOCKET_ERROR) {
  906. +       if (getsockname(_get_osfhandle(fd), (struct sockaddr *)&ss, &len) == SOCKET_ERROR) {
  907.                 return 0;
  908.         }
  909.  #endif
  910.         sip->si_alen = len;
  911.  
  912.         len = sizeof type;
  913. -       if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&type, &len) == SOCKET_ERROR) {
  914. +       if (getsockopt(_get_osfhandle(fd), SOL_SOCKET, SO_TYPE, (char *)&type, &len) == SOCKET_ERROR) {
  915.                 int err = WSAGetLastError();
  916.                 return 0;
  917.         }
  918. @@ -554,20 +555,20 @@ __rpc_nconf2sockinfo(const struct netconfig *nconf, struct __rpc_sockinfo *sip)
  919.         return 0;
  920.  }
  921.  
  922. -SOCKET
  923. +int
  924.  __rpc_nconf2fd(const struct netconfig *nconf)
  925.  {
  926.         struct __rpc_sockinfo si;
  927. -       SOCKET fd;
  928. +       int fd;
  929.  
  930.         if (!__rpc_nconf2sockinfo(nconf, &si))
  931.                 return 0;
  932.  
  933. -       if ((fd = socket(si.si_af, si.si_socktype, si.si_proto)) != INVALID_SOCKET &&
  934. +       if ((fd = wintirpc_socket(si.si_af, si.si_socktype, si.si_proto)) != -1 &&
  935.             si.si_af == AF_INET6) {
  936.                 int val = 1;
  937.  
  938. -               setsockopt(fd, SOL_IPV6, IPV6_V6ONLY, (const char *)&val, sizeof(val));
  939. +               setsockopt(_get_osfhandle(fd), SOL_IPV6, IPV6_V6ONLY, (const char *)&val, sizeof(val));
  940.         }
  941.         return fd;
  942.  }
  943. @@ -876,7 +877,7 @@ __rpc_fixup_addr(struct netbuf *new, const struct netbuf *svc)
  944.  }
  945.  
  946.  int
  947. -__rpc_sockisbound(SOCKET fd)
  948. +__rpc_sockisbound(int fd)
  949.  {
  950.         struct sockaddr_storage ss;
  951.         union {
  952. @@ -889,7 +890,7 @@ __rpc_sockisbound(SOCKET fd)
  953.         socklen_t slen;
  954.  
  955.         slen = sizeof (struct sockaddr_storage);
  956. -       if (getsockname(fd, (struct sockaddr *)(void *)&ss, &slen) == SOCKET_ERROR)
  957. +       if (getsockname(_get_osfhandle(fd), (struct sockaddr *)(void *)&ss, &slen) == SOCKET_ERROR)
  958.                 return 0;
  959.  
  960.         switch (ss.ss_family) {
  961. diff --git a/libtirpc/src/rpc_soc.c b/libtirpc/src/rpc_soc.c
  962. index 4b69810..9d0de3a 100644
  963. --- a/libtirpc/src/rpc_soc.c
  964. +++ b/libtirpc/src/rpc_soc.c
  965. @@ -68,7 +68,7 @@ extern mutex_t        rpcsoc_lock;
  966.  
  967.  static CLIENT *clnt_com_create(struct sockaddr_in *, rpcprog_t, rpcvers_t,
  968.      int *, u_int, u_int, char *);
  969. -static SVCXPRT *svc_com_create(SOCKET, u_int, u_int, char *);
  970. +static SVCXPRT *svc_com_create(int, u_int, u_int, char *);
  971.  static bool_t rpc_wrap_bcast(char *, struct netbuf *, struct netconfig *);
  972.  
  973.  /* XXX */
  974. @@ -83,14 +83,14 @@ clnt_com_create(raddr, prog, vers, sockp, sendsz, recvsz, tp)
  975.         struct sockaddr_in *raddr;
  976.         rpcprog_t prog;
  977.         rpcvers_t vers;
  978. -       SOCKET *sockp;
  979. +       int *sockp;
  980.         u_int sendsz;
  981.         u_int recvsz;
  982.         char *tp;
  983.  {
  984.         CLIENT *cl;
  985.         int madefd = FALSE;
  986. -       SOCKET fd = *sockp;
  987. +       int fd = *sockp;
  988.         struct netconfig *nconf;
  989.         struct netbuf bindaddr;
  990.  
  991. @@ -148,7 +148,7 @@ syserror:
  992.         rpc_createerr.cf_error.re_errno = errno;
  993.  
  994.  err:   if (madefd == TRUE)
  995. -               (void)closesocket(fd);
  996. +               (void)wintirpc_closesocket(fd);
  997.         (void) freenetconfigent(nconf);
  998.         mutex_unlock(&rpcsoc_lock);
  999.         return (NULL);
  1000. @@ -263,7 +263,7 @@ clntraw_create(prog, vers)
  1001.   */
  1002.  static SVCXPRT *
  1003.  svc_com_create(fd, sendsize, recvsize, netid)
  1004. -       SOCKET fd;
  1005. +       int fd;
  1006.         u_int sendsize;
  1007.         u_int recvsize;
  1008.         char *netid;
  1009. @@ -292,12 +292,12 @@ svc_com_create(fd, sendsize, recvsize, netid)
  1010.         memset(&sin, 0, sizeof sin);
  1011.         sin.sin_family = AF_INET;
  1012.         bindresvport(fd, &sin);
  1013. -       listen(fd, SOMAXCONN);
  1014. +       listen(_get_osfhandle(fd), SOMAXCONN);
  1015.         svc = svc_tli_create(fd, nconf, NULL, sendsize, recvsize);
  1016.         (void) freenetconfigent(nconf);
  1017.         if (svc == NULL) {
  1018.                 if (madefd)
  1019. -                       (void)closesocket(fd);
  1020. +                       (void)wintirpc_closesocket(fd);
  1021.                 return (NULL);
  1022.         }
  1023.         port = (((struct sockaddr_in *)svc->xp_ltaddr.buf)->sin_port);
  1024. @@ -307,7 +307,7 @@ svc_com_create(fd, sendsize, recvsize, netid)
  1025.  
  1026.  SVCXPRT *
  1027.  svctcp_create(fd, sendsize, recvsize)
  1028. -       SOCKET fd;
  1029. +       int fd;
  1030.         u_int sendsize;
  1031.         u_int recvsize;
  1032.  {
  1033. @@ -319,7 +319,7 @@ svctcp_create(fd, sendsize, recvsize)
  1034.  
  1035.  SVCXPRT *
  1036.  svcudp_bufcreate(fd, sendsz, recvsz)
  1037. -       SOCKET fd;
  1038. +       int fd;
  1039.         u_int sendsz, recvsz;
  1040.  {
  1041.  
  1042. @@ -330,7 +330,7 @@ svcudp_bufcreate(fd, sendsz, recvsz)
  1043.  
  1044.  SVCXPRT *
  1045.  svcfd_create(fd, sendsize, recvsize)
  1046. -       SOCKET fd;
  1047. +       int fd;
  1048.         u_int sendsize;
  1049.         u_int recvsize;
  1050.  {
  1051. @@ -341,7 +341,7 @@ svcfd_create(fd, sendsize, recvsize)
  1052.  
  1053.  SVCXPRT *
  1054.  svcudp_create(fd)
  1055. -       SOCKET fd;
  1056. +       int fd;
  1057.  {
  1058.  
  1059.         return svc_com_create(fd, UDPMSGSIZE, UDPMSGSIZE, "udp");
  1060. @@ -522,7 +522,7 @@ clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
  1061.         struct sockaddr_un *raddr;
  1062.         u_long prog;
  1063.         u_long vers;
  1064. -       SOCKET *sockp;
  1065. +       int *sockp;
  1066.         u_int sendsz;
  1067.         u_int recvsz;
  1068.  {
  1069. @@ -543,14 +543,14 @@ clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz)
  1070.                 return(cl);
  1071.         }
  1072.         if (*sockp == SOCKET_ERROR) {
  1073. -               *sockp = socket(AF_UNIX, SOCK_STREAM, 0);
  1074. +               *sockp = wintirpc_socket(AF_UNIX, SOCK_STREAM, 0);
  1075.                 len = SUN_LEN(raddr);
  1076. -               if ((*sockp == INVALID_SOCKET) || (connect(*sockp,
  1077. +               if ((*sockp == -1) || (connect(_get_osfhandle(*sockp),
  1078.                     (struct sockaddr *)raddr, len) == SOCKET_ERROR)) {
  1079.                         rpc_createerr.cf_stat = RPC_SYSTEMERROR;
  1080.                         rpc_createerr.cf_error.re_errno = errno;
  1081. -                       if (*sockp != INVALID_SOCKET)
  1082. -                               (void)closesocket(*sockp);
  1083. +                       if (*sockp != -1)
  1084. +                               (void)wintirpc_closesocket(*sockp);
  1085.                         goto done;
  1086.                 }
  1087.          }
  1088. @@ -571,7 +571,7 @@ done:
  1089.   */
  1090.  SVCXPRT *
  1091.  svcunix_create(sock, sendsize, recvsize, path)
  1092. -       SOCKET sock;
  1093. +       int sock;
  1094.         u_int sendsize;
  1095.         u_int recvsize;
  1096.         char *path;
  1097. @@ -603,7 +603,7 @@ svcunix_create(sock, sendsize, recvsize, path)
  1098.         addrlen = sizeof(struct sockaddr_un);
  1099.         sa = (struct sockaddr *)&sun;
  1100.  
  1101. -       if (bind(sock, sa, addrlen) == SOCKET_ERROR)
  1102. +       if (bind(_get_osfhandle(sock), sa, addrlen) == SOCKET_ERROR)
  1103.                 goto done;
  1104.  
  1105.         taddr.addr.len = taddr.addr.maxlen = addrlen;
  1106. @@ -613,7 +613,7 @@ svcunix_create(sock, sendsize, recvsize, path)
  1107.         memcpy(taddr.addr.buf, sa, addrlen);
  1108.  
  1109.         if (nconf->nc_semantics != NC_TPI_CLTS) {
  1110. -               if (listen(sock, SOMAXCONN) == SOCKET_ERROR) {
  1111. +               if (listen(_get_osfhandle(sock), SOMAXCONN) == SOCKET_ERROR) {
  1112.                         free(taddr.addr.buf);
  1113.                         goto done;
  1114.                 }
  1115. @@ -632,7 +632,7 @@ done:
  1116.   */
  1117.  SVCXPRT *
  1118.  svcunixfd_create(fd, sendsize, recvsize)
  1119. -       SOCKET fd;
  1120. +       int fd;
  1121.         u_int sendsize;
  1122.         u_int recvsize;
  1123.  {
  1124. diff --git a/libtirpc/src/rpcb_clnt.c b/libtirpc/src/rpcb_clnt.c
  1125. index b8c30c1..aafab64 100644
  1126. --- a/libtirpc/src/rpcb_clnt.c
  1127. +++ b/libtirpc/src/rpcb_clnt.c
  1128. @@ -423,7 +423,7 @@ local_rpcb()
  1129.         static struct netconfig *loopnconf;
  1130.         static char *hostname;
  1131.         extern mutex_t loopnconf_lock;
  1132. -       SOCKET sock;
  1133. +       int sock;
  1134.         size_t tsize;
  1135.         struct netbuf nbuf;
  1136.         struct sockaddr_un sun;
  1137. @@ -434,9 +434,10 @@ local_rpcb()
  1138.          * the netconfig file.
  1139.          */
  1140.         memset(&sun, 0, sizeof sun);
  1141. -       sock = socket(AF_UNIX, SOCK_STREAM, 0);
  1142. -       if (sock == INVALID_SOCKET)
  1143. +       sock = wintirpc_socket(AF_UNIX, SOCK_STREAM, 0);
  1144. +       if (sock == -1)
  1145.                 goto try_nconf;
  1146. +
  1147.         sun.sun_family = AF_UNIX;
  1148.         strcpy(sun.sun_path, _PATH_RPCBINDSOCK);
  1149.         nbuf.len = SUN_LEN(&sun);
  1150. @@ -455,7 +456,7 @@ local_rpcb()
  1151.         }
  1152.  
  1153.         /* Nobody needs this socket anymore; free the descriptor. */
  1154. -       closesocket(sock);
  1155. +       wintirpc_closesocket(sock);
  1156.  
  1157.  try_nconf:
  1158.  
  1159. @@ -464,7 +465,7 @@ try_nconf:
  1160.         if (loopnconf == NULL) {
  1161.                 struct netconfig *nconf, *tmpnconf = NULL;
  1162.                 void *nc_handle;
  1163. -               SOCKET fd;
  1164. +               int fd;
  1165.  
  1166.                 nc_handle = setnetconfig();
  1167.                 if (nc_handle == NULL) {
  1168. @@ -490,7 +491,7 @@ try_nconf:
  1169.                                  */
  1170.                                 if (fd == SOCKET_ERROR)
  1171.                                         continue;
  1172. -                               closesocket(fd);
  1173. +                               wintirpc_closesocket(fd);
  1174.                                 tmpnconf = nconf;
  1175.                                 if (!strcmp(nconf->nc_protofmly, NC_INET))
  1176.                                         hostname = IN4_LOCALHOST_STRING;
  1177. @@ -657,7 +658,7 @@ __rpcbind_is_up()
  1178.         struct netconfig *nconf;
  1179.         struct sockaddr_un sun;
  1180.         void *localhandle;
  1181. -       SOCKET sock;
  1182. +       int sock;
  1183.  
  1184.         nconf = NULL;
  1185.         localhandle = setnetconfig();
  1186. @@ -672,18 +673,19 @@ __rpcbind_is_up()
  1187.         endnetconfig(localhandle);
  1188.  
  1189.         memset(&sun, 0, sizeof sun);
  1190. -       sock = socket(AF_UNIX, SOCK_STREAM, 0);
  1191. -       if (sock == INVALID_SOCKET)
  1192. +       sock = wintirpc_socket(AF_UNIX, SOCK_STREAM, 0);
  1193. +       if (sock == -1)
  1194.                 return (FALSE);
  1195. +
  1196.         sun.sun_family = AF_UNIX;
  1197.         strncpy(sun.sun_path, _PATH_RPCBINDSOCK, sizeof(sun.sun_path));
  1198.  
  1199. -       if (connect(sock, (struct sockaddr *)&sun, sizeof(sun)) == SOCKET_ERROR) {
  1200. -               closesocket(sock);
  1201. +       if (connect(_get_osfhandle(sock), (struct sockaddr *)&sun, sizeof(sun)) == SOCKET_ERROR) {
  1202. +               wintirpc_closesocket(sock);
  1203.                 return (FALSE);
  1204.         }
  1205.  
  1206. -       closesocket(sock);
  1207. +       wintirpc_closesocket(sock);
  1208.         return (TRUE);
  1209.  }
  1210.  
  1211. diff --git a/libtirpc/src/rtime.c b/libtirpc/src/rtime.c
  1212. index f933ff6..51a6c06 100644
  1213. --- a/libtirpc/src/rtime.c
  1214. +++ b/libtirpc/src/rtime.c
  1215. @@ -59,7 +59,7 @@ extern int _rpc_dtablesize( void );
  1216.  #define NYEARS (unsigned long)(1970 - 1900)
  1217.  #define TOFFSET (unsigned long)(60*60*24*(365*NYEARS + (NYEARS/4)))
  1218.  
  1219. -static void do_close( SOCKET );
  1220. +static void do_close( int );
  1221.  
  1222.  int
  1223.  rtime(addrp, timep, timeout)
  1224. @@ -67,7 +67,7 @@ rtime(addrp, timep, timeout)
  1225.         struct timeval *timep;
  1226.         struct timeval *timeout;
  1227.  {
  1228. -       SOCKET s;
  1229. +       int s;
  1230.         fd_set readfds;
  1231.         int res;
  1232.         unsigned long thetime;
  1233. @@ -81,10 +81,11 @@ rtime(addrp, timep, timeout)
  1234.         } else {
  1235.                 type = SOCK_DGRAM;
  1236.         }
  1237. -       s = socket(AF_INET, type, 0);
  1238. -       if (s == INVALID_SOCKET) {
  1239. +       s = wintirpc_socket(AF_INET, type, 0);
  1240. +       if (s == -1) {
  1241.                 return(-1);
  1242.         }
  1243. +
  1244.         addrp->sin_family = AF_INET;
  1245.  
  1246.         /* TCP and UDP port are the same in this case */
  1247. @@ -95,7 +96,7 @@ rtime(addrp, timep, timeout)
  1248.         addrp->sin_port = serv->s_port;
  1249.  
  1250.         if (type == SOCK_DGRAM) {
  1251. -               res = sendto(s, (char *)&thetime, sizeof(thetime), 0,
  1252. +               res = sendto(_get_osfhandle(s), (char *)&thetime, sizeof(thetime), 0,
  1253.                              (struct sockaddr *)addrp, sizeof(*addrp));
  1254.                 if (res == SOCKET_ERROR) {
  1255.                         do_close(s);
  1256. @@ -103,7 +104,7 @@ rtime(addrp, timep, timeout)
  1257.                 }
  1258.                 do {
  1259.                         FD_ZERO(&readfds);
  1260. -                       FD_SET(s, &readfds);
  1261. +                       FD_SET(_get_osfhandle(s), &readfds);
  1262.                         res = select(_rpc_dtablesize(), &readfds,
  1263.                                      (fd_set *)NULL, (fd_set *)NULL, timeout);
  1264.                 } while (res == SOCKET_ERROR && WSAGetLastError() == WSAEINTR);
  1265. @@ -115,18 +116,18 @@ rtime(addrp, timep, timeout)
  1266.                         return(-1);    
  1267.                 }
  1268.                 fromlen = sizeof(from);
  1269. -               res = recvfrom(s, (char *)&thetime, sizeof(thetime), 0,
  1270. +               res = recvfrom(_get_osfhandle(s), (char *)&thetime, sizeof(thetime), 0,
  1271.                                (struct sockaddr *)&from, &fromlen);
  1272.                 do_close(s);
  1273.                 if (res == SOCKET_ERROR) {
  1274.                         return(-1);    
  1275.                 }
  1276.         } else {
  1277. -               if (connect(s, (struct sockaddr *)addrp, sizeof(*addrp)) == SOCKET_ERROR) {
  1278. +               if (connect(_get_osfhandle(s), (struct sockaddr *)addrp, sizeof(*addrp)) == SOCKET_ERROR) {
  1279.                         do_close(s);
  1280.                         return(-1);
  1281.                 }
  1282. -               res = recv(s, (char *)&thetime, sizeof(thetime), 0);
  1283. +               res = recv(_get_osfhandle(s), (char *)&thetime, sizeof(thetime), 0);
  1284.                 do_close(s);
  1285.                 if (res == SOCKET_ERROR) {
  1286.                         return(-1);
  1287. @@ -149,6 +150,6 @@ do_close(s)
  1288.         int save;
  1289.  
  1290.         save = errno;
  1291. -       (void)closesocket(s);
  1292. +       (void)wintirpc_closesocket(s);
  1293.         errno = save;
  1294.  }
  1295. diff --git a/libtirpc/src/svc.c b/libtirpc/src/svc.c
  1296. index 1666364..5b5d3de 100644
  1297. --- a/libtirpc/src/svc.c
  1298. +++ b/libtirpc/src/svc.c
  1299. @@ -97,7 +97,7 @@ void
  1300.  xprt_register (xprt)
  1301.       SVCXPRT *xprt;
  1302.  {
  1303. -  SOCKET sock;
  1304. +  int sock;
  1305.  
  1306.    assert (xprt != NULL);
  1307.  
  1308. @@ -115,7 +115,7 @@ xprt_register (xprt)
  1309.  #ifndef _WIN32
  1310.    if (sock < FD_SETSIZE) {
  1311.      __svc_xports[sock] = xprt;
  1312. -    FD_SET (sock, &svc_fdset);
  1313. +    FD_SET(_get_osfhandle(sock), &svc_fdset);
  1314.      svc_maxfd = max (svc_maxfd, sock);
  1315.    }
  1316.  #else
  1317. @@ -144,7 +144,7 @@ __xprt_do_unregister (xprt, dolock)
  1318.  SVCXPRT *xprt;
  1319.  bool_t dolock;
  1320.  {
  1321. -  SOCKET sock;
  1322. +  int sock;
  1323.  
  1324.    assert (xprt != NULL);
  1325.  
  1326. @@ -155,7 +155,7 @@ bool_t dolock;
  1327.      rwlock_wrlock (&svc_fd_lock);
  1328.    if ((sock < FD_SETSIZE) && (__svc_xports[sock] == xprt)) {
  1329.      __svc_xports[sock] = NULL;
  1330. -    FD_CLR (sock, &svc_fdset);
  1331. +    FD_CLR (_get_osfhandle(sock), &svc_fdset);
  1332.      if (sock >= svc_maxfd) {
  1333.        for (svc_maxfd--; svc_maxfd >= 0; svc_maxfd--)
  1334.          if (__svc_xports[svc_maxfd])
  1335. @@ -638,7 +638,7 @@ svc_getreqset (readfds)
  1336.  }
  1337.  
  1338.  void
  1339. -svc_getreq_common (SOCKET fd)
  1340. +svc_getreq_common (int fd)
  1341.  {
  1342.    SVCXPRT *xprt;
  1343.    struct svc_req r;
  1344. @@ -771,11 +771,11 @@ svc_getreq_poll (pfdp, pollretval)
  1345.           if (p->revents & POLLNVAL)
  1346.             {
  1347.               rwlock_wrlock (&svc_fd_lock);
  1348. -             FD_CLR (p->fd, &svc_fdset);
  1349. +             FD_CLR (_get_osfhandle(p->fd), &svc_fdset);
  1350.               rwlock_unlock (&svc_fd_lock);
  1351.             }
  1352.           else
  1353. -           svc_getreq_common (p->fd);
  1354. +           svc_getreq_common (wintirpc_osfhandle2fd(p->fd));
  1355.         }
  1356.      }
  1357.  }
  1358. diff --git a/libtirpc/src/svc_dg.c b/libtirpc/src/svc_dg.c
  1359. index d8dcada..ca21443 100644
  1360. --- a/libtirpc/src/svc_dg.c
  1361. +++ b/libtirpc/src/svc_dg.c
  1362. @@ -138,7 +138,7 @@ svc_dg_create(fd, sendsize, recvsize)
  1363.         xprt->xp_rtaddr.maxlen = sizeof (struct sockaddr_storage);
  1364.  
  1365.         slen = sizeof ss;
  1366. -       if (getsockname(fd, (struct sockaddr *)(void *)&ss, &slen) == SOCKET_ERROR)
  1367. +       if (getsockname(_get_osfhandle(fd), (struct sockaddr *)(void *)&ss, &slen) == SOCKET_ERROR)
  1368.                 goto freedata;
  1369.         __rpc_set_netbuf(&xprt->xp_ltaddr, &ss, slen);
  1370.  
  1371. @@ -177,7 +177,7 @@ svc_dg_recv(xprt, msg)
  1372.  
  1373.  again:
  1374.         alen = sizeof (struct sockaddr_storage);
  1375. -       rlen = recvfrom(xprt->xp_fd, rpc_buffer(xprt), su->su_iosz, 0,
  1376. +       rlen = recvfrom(_get_osfhandle(xprt->xp_fd), rpc_buffer(xprt), su->su_iosz, 0,
  1377.             (struct sockaddr *)(void *)&ss, &alen);
  1378.         if (rlen == -1 && errno == EINTR)
  1379.                 goto again;
  1380. @@ -194,7 +194,7 @@ again:
  1381.         su->su_xid = msg->rm_xid;
  1382.         if (su->su_cache != NULL) {
  1383.                 if (cache_get(xprt, msg, &reply, &replylen)) {
  1384. -                       (void)sendto(xprt->xp_fd, reply, replylen, 0,
  1385. +                       (void)sendto(_get_osfhandle(xprt->xp_fd), reply, replylen, 0,
  1386.                             (struct sockaddr *)(void *)&ss, alen);
  1387.                         return (FALSE);
  1388.                 }
  1389. @@ -217,7 +217,7 @@ svc_dg_reply(xprt, msg)
  1390.         msg->rm_xid = su->su_xid;
  1391.         if (xdr_replymsg(xdrs, msg)) {
  1392.                 slen = XDR_GETPOS(xdrs);
  1393. -               if (sendto(xprt->xp_fd, rpc_buffer(xprt), slen, 0,
  1394. +               if (sendto(_get_osfhandle(xprt->xp_fd), rpc_buffer(xprt), slen, 0,
  1395.                     (struct sockaddr *)xprt->xp_rtaddr.buf,
  1396.                     (socklen_t)xprt->xp_rtaddr.len) == (ssize_t) slen) {
  1397.                         stat = TRUE;
  1398. @@ -257,7 +257,7 @@ svc_dg_destroy(xprt)
  1399.  
  1400.         xprt_unregister(xprt);
  1401.         if (xprt->xp_fd != -1)
  1402. -               (void)closesocket(xprt->xp_fd);
  1403. +               (void)wintirpc_closesocket(xprt->xp_fd);
  1404.         XDR_DESTROY(&(su->su_xdrs));
  1405.         (void) mem_free(rpc_buffer(xprt), su->su_iosz);
  1406.         (void) mem_free(su, sizeof (*su));
  1407. diff --git a/libtirpc/src/svc_generic.c b/libtirpc/src/svc_generic.c
  1408. index d84f237..168d516 100644
  1409. --- a/libtirpc/src/svc_generic.c
  1410. +++ b/libtirpc/src/svc_generic.c
  1411. @@ -180,7 +180,7 @@ svc_tp_create(dispatch, prognum, versnum, nconf)
  1412.   */
  1413.  SVCXPRT *
  1414.  svc_tli_create(fd, nconf, bindaddr, sendsz, recvsz)
  1415. -       SOCKET fd;                              /* Connection end point */
  1416. +       int fd;                         /* Connection end point */
  1417.         const struct netconfig *nconf;  /* Netconfig struct for nettoken */
  1418.         const struct t_bind *bindaddr;  /* Local bind address */
  1419.         u_int sendsz;                   /* Max sendsize */
  1420. @@ -225,23 +225,23 @@ svc_tli_create(fd, nconf, bindaddr, sendsz, recvsz)
  1421.                         if (bindresvport(fd, NULL) < 0) {
  1422.                                 memset(&ss, 0, sizeof ss);
  1423.                                 ss.ss_family = si.si_af;
  1424. -                               if (bind(fd, (struct sockaddr *)(void *)&ss,
  1425. +                               if (bind(_get_osfhandle(fd), (struct sockaddr *)(void *)&ss,
  1426.                                     (socklen_t)si.si_alen) == SOCKET_ERROR) {
  1427.                                         // XXX warnx(
  1428.  //                     "svc_tli_create: could not bind to anonymous port");
  1429.                                         goto freedata;
  1430.                                 }
  1431.                         }
  1432. -                       listen(fd, SOMAXCONN);
  1433. +                       listen(_get_osfhandle(fd), SOMAXCONN);
  1434.                 } else {
  1435. -                       if (bind(fd,
  1436. +                       if (bind(_get_osfhandle(fd),
  1437.                             (struct sockaddr *)bindaddr->addr.buf,
  1438.                             (socklen_t)si.si_alen) == SOCKET_ERROR) {
  1439.                                 // XXX warnx(
  1440.  //             "svc_tli_create: could not bind to requested address");
  1441.                                 goto freedata;
  1442.                         }
  1443. -                       listen(fd, (int)bindaddr->qlen);
  1444. +                       listen(_get_osfhandle(fd), (int)bindaddr->qlen);
  1445.                 }
  1446.                        
  1447.         }
  1448. @@ -292,7 +292,7 @@ svc_tli_create(fd, nconf, bindaddr, sendsz, recvsz)
  1449.  
  1450.  freedata:
  1451.         if (madefd)
  1452. -               (void)closesocket(fd);
  1453. +               (void)wintirpc_closesocket(fd);
  1454.         if (xprt) {
  1455.                 if (!madefd) /* so that svc_destroy doesnt close fd */
  1456.                         xprt->xp_fd = RPC_ANYFD;
  1457. diff --git a/libtirpc/src/svc_vc.c b/libtirpc/src/svc_vc.c
  1458. index 53f0df3..de90781 100644
  1459. --- a/libtirpc/src/svc_vc.c
  1460. +++ b/libtirpc/src/svc_vc.c
  1461. @@ -67,7 +67,7 @@
  1462.  
  1463.  extern rwlock_t svc_fd_lock;
  1464.  
  1465. -static SVCXPRT *makefd_xprt(SOCKET, u_int, u_int);
  1466. +static SVCXPRT *makefd_xprt(int, u_int, u_int);
  1467.  static bool_t rendezvous_request(SVCXPRT *, struct rpc_msg *);
  1468.  static enum xprt_stat rendezvous_stat(SVCXPRT *);
  1469.  static void svc_vc_destroy(SVCXPRT *);
  1470. @@ -179,7 +179,7 @@ svc_vc_create(fd, sendsize, recvsize)
  1471.         xprt->xp_fd = fd;
  1472.  
  1473.         slen = sizeof (struct sockaddr_storage);
  1474. -       if (getsockname(fd, (struct sockaddr *)(void *)&sslocal, &slen) == SOCKET_ERROR) {
  1475. +       if (getsockname(_get_osfhandle(fd), (struct sockaddr *)(void *)&sslocal, &slen) == SOCKET_ERROR) {
  1476.                 // XXX warnx("svc_vc_create: could not retrieve local addr");
  1477.                 goto cleanup_svc_vc_create;
  1478.         }
  1479. @@ -202,7 +202,7 @@ cleanup_svc_vc_create:
  1480.   */
  1481.  SVCXPRT *
  1482.  svc_fd_create(fd, sendsize, recvsize)
  1483. -       SOCKET fd;
  1484. +       int fd;
  1485.         u_int sendsize;
  1486.         u_int recvsize;
  1487.  {
  1488. @@ -217,7 +217,7 @@ svc_fd_create(fd, sendsize, recvsize)
  1489.                 return NULL;
  1490.  
  1491.         slen = sizeof (struct sockaddr_storage);
  1492. -       if (getsockname(fd, (struct sockaddr *)(void *)&ss, &slen) == SOCKET_ERROR) {
  1493. +       if (getsockname(_get_osfhandle(fd), (struct sockaddr *)(void *)&ss, &slen) == SOCKET_ERROR) {
  1494.                 // XXX warnx("svc_fd_create: could not retrieve local addr");
  1495.                 goto freedata;
  1496.         }
  1497. @@ -250,7 +250,7 @@ freedata:
  1498.  
  1499.  static SVCXPRT *
  1500.  makefd_xprt(fd, sendsize, recvsize)
  1501. -       SOCKET fd;
  1502. +       int fd;
  1503.         u_int sendsize;
  1504.         u_int recvsize;
  1505.  {
  1506. @@ -302,7 +302,7 @@ rendezvous_request(xprt, msg)
  1507.         SVCXPRT *xprt;
  1508.         struct rpc_msg *msg;
  1509.  {
  1510. -       SOCKET sock;
  1511. +       int sock;
  1512.  #ifndef _WIN32
  1513.         int flags;
  1514.  #endif
  1515. @@ -320,7 +320,7 @@ rendezvous_request(xprt, msg)
  1516.         r = (struct cf_rendezvous *)xprt->xp_p1;
  1517.  again:
  1518.         len = sizeof addr;
  1519. -       if ((sock = accept(xprt->xp_fd, (struct sockaddr *)(void *)&addr,
  1520. +       if ((sock = wintirpc_accept(xprt->xp_fd, (struct sockaddr *)(void *)&addr,
  1521.             &len)) == SOCKET_ERROR) {
  1522.                 if (errno == EINTR)
  1523.                         goto again;
  1524. @@ -355,7 +355,7 @@ again:
  1525.         if (__rpc_fd2sockinfo(sock, &si) && si.si_proto == IPPROTO_TCP) {
  1526.                 len = 1;
  1527.                 /* XXX fvdl - is this useful? */
  1528. -               setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&len, sizeof (len));
  1529. +               setsockopt(_get_osfhandle(sock), IPPROTO_TCP, TCP_NODELAY, (const char *)&len, sizeof (len));
  1530.         }
  1531.  
  1532.         cd = (struct cf_conn *)newxprt->xp_p1;
  1533. @@ -413,7 +413,7 @@ __svc_vc_dodestroy(xprt)
  1534.         cd = (struct cf_conn *)xprt->xp_p1;
  1535.  
  1536.         if (xprt->xp_fd != RPC_ANYFD)
  1537. -               (void)closesocket(xprt->xp_fd);
  1538. +               (void)wintirpc_closesocket(xprt->xp_fd);
  1539.         if (xprt->xp_port != 0) {
  1540.                 /* a rendezvouser socket */
  1541.                 r = (struct cf_rendezvous *)xprt->xp_p1;
  1542. @@ -483,7 +483,7 @@ read_vc(xprtp, buf, len)
  1543.         int len;
  1544.  {
  1545.         SVCXPRT *xprt;
  1546. -       SOCKET sock;
  1547. +       int sock;
  1548.         int milliseconds = 35 * 1000;
  1549.         struct pollfd pollfd;
  1550.         struct cf_conn *cfp;
  1551. @@ -497,7 +497,7 @@ read_vc(xprtp, buf, len)
  1552.  
  1553.         if (cfp->nonblock) {
  1554.  #ifdef _WIN32
  1555. -               len = recv(sock, buf, (size_t)len, 0);
  1556. +               len = recv(_get_osfhandle(sock), buf, (size_t)len, 0);
  1557.  #else
  1558.                 len = read(sock, buf, (size_t)len);
  1559.  #endif
  1560. @@ -513,7 +513,7 @@ read_vc(xprtp, buf, len)
  1561.         }
  1562.  
  1563.         do {
  1564. -               pollfd.fd = sock;
  1565. +               pollfd.fd = _get_osfhandle(sock);
  1566.                 pollfd.events = POLLIN;
  1567.                 pollfd.revents = 0;
  1568.                 switch (poll(&pollfd, 1, milliseconds)) {
  1569. @@ -530,7 +530,7 @@ read_vc(xprtp, buf, len)
  1570.         } while ((pollfd.revents & POLLIN) == 0);
  1571.  
  1572.  #ifdef _WIN32
  1573. -       if ((len = recv(sock, buf, (size_t)len, 0)) > 0) {
  1574. +       if ((len = recv(_get_osfhandle(sock), buf, (size_t)len, 0)) > 0) {
  1575.  #else
  1576.         if ((len = read(sock, buf, (size_t)len)) > 0) {
  1577.  #endif
  1578. @@ -568,7 +568,7 @@ write_vc(xprtp, buf, len)
  1579.        
  1580.         for (cnt = len; cnt > 0; cnt -= i, buf += i) {
  1581.  #ifdef _WIN32
  1582. -               i = send(xprt->xp_fd, buf, (size_t)cnt, 0);
  1583. +               i = send(_get_osfhandle(xprt->xp_fd), buf, (size_t)cnt, 0);
  1584.  #else
  1585.                 i = write(xprt->xp_fd, buf, (size_t)cnt);
  1586.  #endif
  1587. @@ -752,7 +752,7 @@ svc_vc_rendezvous_ops(xprt)
  1588.   */
  1589.  int
  1590.  __rpc_get_local_uid(SVCXPRT *transp, uid_t *uid) {
  1591. -       SOCKET sock;
  1592. +       int sock;
  1593.         int ret;
  1594.         gid_t egid;
  1595.         uid_t euid;
  1596. diff --git a/libtirpc/src/wintirpc.c b/libtirpc/src/wintirpc.c
  1597. index eb98489..14fab0c 100644
  1598. --- a/libtirpc/src/wintirpc.c
  1599. +++ b/libtirpc/src/wintirpc.c
  1600. @@ -23,6 +23,7 @@
  1601.  #include <rpc/rpc.h>
  1602.  #include <stdio.h>
  1603.  #include <winsock.h>
  1604. +#include <assert.h>
  1605.  
  1606.  WSADATA WSAData;
  1607.  
  1608. @@ -159,6 +160,126 @@ BOOL WINAPI DllMain/*tirpc_main*/(HINSTANCE hinstDLL,     // DLL module handle
  1609.         return TRUE;
  1610.  }
  1611.  
  1612. +struct map_osfhandle_fd
  1613. +{
  1614. +    SOCKET  m_s;
  1615. +    int     m_fd;
  1616. +};
  1617. +
  1618. +#define MAP_OSFHANDLE_SIZE (1024)
  1619. +
  1620. +static
  1621. +struct map_osfhandle_fd handle_fd_map[MAP_OSFHANDLE_SIZE];
  1622. +
  1623. +void wintirpc_register_osfhandle_fd(SOCKET handle, int fd)
  1624. +{
  1625. +    assert(handle != 0);
  1626. +    assert(handle != SOCKET_ERROR);
  1627. +    assert(fd < MAP_OSFHANDLE_SIZE);
  1628. +
  1629. +    handle_fd_map[fd].m_fd = fd;
  1630. +    handle_fd_map[fd].m_s = handle;
  1631. +}
  1632. +
  1633. +void wintirpc_unregister_osfhandle(SOCKET handle)
  1634. +{
  1635. +    int i;
  1636. +    
  1637. +    assert(handle != 0);
  1638. +    assert(handle != SOCKET_ERROR);
  1639. +    
  1640. +    for (i=0 ; i < MAP_OSFHANDLE_SIZE ; i++) {
  1641. +        if (handle_fd_map[i].m_s == handle) {
  1642. +            handle_fd_map[i].m_s = SOCKET_ERROR;
  1643. +            handle_fd_map[i].m_fd = -1;
  1644. +            return;
  1645. +        }
  1646. +    }
  1647. +    (void)fprintf(stderr, "wintirpc_unregister_osfhandle: failed\n");
  1648. +}
  1649. +
  1650. +int wintirpc_osfhandle2fd(SOCKET handle)
  1651. +{
  1652. +    int i;
  1653. +
  1654. +    assert(handle != 0);
  1655. +    assert(handle != SOCKET_ERROR);
  1656. +    
  1657. +    for (i=0 ; i < MAP_OSFHANDLE_SIZE ; i++) {
  1658. +        if ((handle_fd_map[i].m_s == handle) &&
  1659. +            (handle_fd_map[i].m_fd != -1)) {
  1660. +            return handle_fd_map[i].m_fd;
  1661. +        }
  1662. +    }
  1663. +    (void)fprintf(stderr, "wintirpc_osfhandle2fd: failed\n");
  1664. +    return -1;
  1665. +}
  1666. +
  1667. +int wintirpc_socket(int af, int type, int protocol)
  1668. +{
  1669. +    SOCKET s;
  1670. +
  1671. +    s = socket(af, type, protocol);
  1672. +    if (s == INVALID_SOCKET) {
  1673. +        (void)fprintf(stderr, "wintirpc_socket: INVALID_SOCKET\n");
  1674. +        return -1;
  1675. +    }
  1676. +
  1677. +    int fd = _open_osfhandle(s, _O_BINARY);
  1678. +    if (fd < 0) {
  1679. +        (void)closesocket(s);
  1680. +        /*
  1681. +         * |_open_osfhandle()| may not set |errno|, and
  1682. +         * |closesocket()| may override it
  1683. +         */
  1684. +        (void)fprintf(stderr, "wintirpc_socket: failed\n");
  1685. +        errno = ENOMEM;
  1686. +        return -1;
  1687. +    }
  1688. +    
  1689. +    wintirpc_register_osfhandle_fd(s, fd);
  1690. +
  1691. +    (void)fprintf(stderr, "wintirpc_socket: %s/%d: sock fd=%d\n", __FILE__, (int)__LINE__, fd);
  1692. +
  1693. +    return fd;
  1694. +}
  1695. +
  1696. +int wintirpc_closesocket(int in_fd)
  1697. +{
  1698. +    SOCKET s = _get_osfhandle(in_fd);
  1699. +    
  1700. +    wintirpc_unregister_osfhandle(s);
  1701. +
  1702. +    return closesocket(s);
  1703. +}
  1704. +
  1705. +int wintirpc_accept(int in_s_fd, struct sockaddr *addr, int *addrlen)
  1706. +{
  1707. +    SOCKET in_s;
  1708. +    SOCKET out_s;
  1709. +    int out_s_fd;
  1710. +
  1711. +    in_s = _get_osfhandle(in_s_fd);
  1712. +
  1713. +    out_s = accept(in_s, addr, addrlen);
  1714. +
  1715. +    out_s_fd = _open_osfhandle(out_s, _O_BINARY);
  1716. +    if (out_s_fd < 0) {
  1717. +        (void)closesocket(out_s);
  1718. +        /*
  1719. +         * |_open_osfhandle()| may not set |errno|, and
  1720. +         * |closesocket()| may override it
  1721. +         */
  1722. +        (void)fprintf(stderr, "wintirpc_accept: failed\n");
  1723. +        errno = ENOMEM;
  1724. +        return -1;
  1725. +    }
  1726. +
  1727. +    wintirpc_register_osfhandle_fd(out_s, out_s_fd);
  1728. +
  1729. +    return out_s_fd;
  1730. +}
  1731. +
  1732.  int tirpc_exit(void)
  1733.  {
  1734.         if (init == 0 || --init > 0)
  1735. @@ -167,6 +288,14 @@ int tirpc_exit(void)
  1736.         return WSACleanup();
  1737.  }
  1738.  
  1739. +void warnx(LPCSTR format, ...)
  1740. +{
  1741. +    va_list args;
  1742. +    va_start(args, format);
  1743. +    fprintf(stderr, "tirpc: %04x: ", GetCurrentThreadId());
  1744. +    vfprintf(stderr, format, args);
  1745. +    va_end(args);
  1746. +}
  1747.  
  1748.  void wintirpc_debug(char *fmt, ...)
  1749.  {
  1750. diff --git a/libtirpc/tirpc/getpeereid.h b/libtirpc/tirpc/getpeereid.h
  1751. index cdecd0e..025143f 100644
  1752. --- a/libtirpc/tirpc/getpeereid.h
  1753. +++ b/libtirpc/tirpc/getpeereid.h
  1754. @@ -1,2 +1,2 @@
  1755.  
  1756. -int getpeereid(SOCKET s, uid_t *euid, gid_t *egid);
  1757. +int getpeereid(int s, uid_t *euid, gid_t *egid);
  1758. diff --git a/libtirpc/tirpc/rpc/clnt.h b/libtirpc/tirpc/rpc/clnt.h
  1759. index 0ee9724..3639f82 100644
  1760. --- a/libtirpc/tirpc/rpc/clnt.h
  1761. +++ b/libtirpc/tirpc/rpc/clnt.h
  1762. @@ -393,7 +393,7 @@ extern CLIENT * clnt_tp_create_timed(const char *, const rpcprog_t,
  1763.   * Generic TLI create routine. Only provided for compatibility.
  1764.   */
  1765.  
  1766. -extern CLIENT *clnt_tli_create(const SOCKET, const struct netconfig *,
  1767. +extern CLIENT *clnt_tli_create(const int, const struct netconfig *,
  1768.                                struct netbuf *, const rpcprog_t,
  1769.                                const rpcvers_t, const u_int, const u_int,
  1770.                     int (*cb_xdr)(void *, void *),
  1771. @@ -411,7 +411,7 @@ extern CLIENT *clnt_tli_create(const SOCKET, const struct netconfig *,
  1772.  /*
  1773.   * Low level clnt create routine for connectionful transports, e.g. tcp.
  1774.   */
  1775. -extern CLIENT *clnt_vc_create(const SOCKET, const struct netbuf *,
  1776. +extern CLIENT *clnt_vc_create(const int, const struct netbuf *,
  1777.                               const rpcprog_t, const rpcvers_t,
  1778.                               u_int, u_int, int (*cb_xdr)(void *, void *),
  1779.                    int (*cb)(void *, void *, void **), void *args);
  1780. @@ -432,7 +432,7 @@ extern CLIENT *clntunix_create(struct sockaddr_un *,
  1781.  /*
  1782.   * Low level clnt create routine for connectionless transports, e.g. udp.
  1783.   */
  1784. -extern CLIENT *clnt_dg_create(const SOCKET, const struct netbuf *,
  1785. +extern CLIENT *clnt_dg_create(const int, const struct netbuf *,
  1786.                               const rpcprog_t, const rpcvers_t,
  1787.                               const u_int, const u_int);
  1788.  /*
  1789. diff --git a/libtirpc/tirpc/rpc/clnt_soc.h b/libtirpc/tirpc/rpc/clnt_soc.h
  1790. index 582f555..4cf4d78 100644
  1791. --- a/libtirpc/tirpc/rpc/clnt_soc.h
  1792. +++ b/libtirpc/tirpc/rpc/clnt_soc.h
  1793. @@ -62,7 +62,7 @@
  1794.   *     u_int recvsz;
  1795.   */
  1796.  __BEGIN_DECLS
  1797. -extern CLIENT *clnttcp_create(struct sockaddr_in *, u_long, u_long, SOCKET *,
  1798. +extern CLIENT *clnttcp_create(struct sockaddr_in *, u_long, u_long, int *,
  1799.                               u_int, u_int);
  1800.  __END_DECLS
  1801.  
  1802. diff --git a/libtirpc/tirpc/rpc/rpc.h b/libtirpc/tirpc/rpc/rpc.h
  1803. index 685fe42..e136149 100644
  1804. --- a/libtirpc/tirpc/rpc/rpc.h
  1805. +++ b/libtirpc/tirpc/rpc/rpc.h
  1806. @@ -82,7 +82,7 @@
  1807.  
  1808.  __BEGIN_DECLS
  1809.  extern int get_myaddress(struct sockaddr_in *);
  1810. -extern int bindresvport(SOCKET, struct sockaddr_in *) __THROW;
  1811. +extern int bindresvport(int, struct sockaddr_in *) __THROW;
  1812.  extern int registerrpc(int, int, int, char *(*)(char [UDPMSGSIZE]),
  1813.      xdrproc_t, xdrproc_t);
  1814.  extern int callrpc(const char *, int, int, int, xdrproc_t, void *,
  1815. @@ -96,7 +96,7 @@ void freeuaddr(char *); /* free memory allocated by taddr2uaddr */
  1816.  void freenetbuf(struct netbuf *); /* free memory allocated by uaddr2taddr */
  1817.  
  1818.  struct sockaddr;
  1819. -extern int bindresvport_sa(SOCKET, struct sockaddr *);
  1820. +extern int bindresvport_sa(int, struct sockaddr *);
  1821.  __END_DECLS
  1822.  
  1823.  /*
  1824. @@ -104,9 +104,9 @@ __END_DECLS
  1825.   * and rpcbind use only. Do not use, they may change without notice.
  1826.   */
  1827.  __BEGIN_DECLS
  1828. -SOCKET __rpc_nconf2fd(const struct netconfig *);
  1829. +int __rpc_nconf2fd(const struct netconfig *);
  1830.  int __rpc_nconf2sockinfo(const struct netconfig *, struct __rpc_sockinfo *);
  1831. -int __rpc_fd2sockinfo(SOCKET, struct __rpc_sockinfo *);
  1832. +int __rpc_fd2sockinfo(int, struct __rpc_sockinfo *);
  1833.  u_int __rpc_get_t_size(int, int, int);
  1834.  __END_DECLS
  1835.  
  1836. diff --git a/libtirpc/tirpc/rpc/rpc_com.h b/libtirpc/tirpc/rpc/rpc_com.h
  1837. index adde181..096cf23 100644
  1838. --- a/libtirpc/tirpc/rpc/rpc_com.h
  1839. +++ b/libtirpc/tirpc/rpc/rpc_com.h
  1840. @@ -74,7 +74,7 @@ int __rpc_sockinfo2netid(struct __rpc_sockinfo *, const char **);
  1841.  int __rpc_seman2socktype(int);
  1842.  int __rpc_socktype2seman(int);
  1843.  void *rpc_nullproc(CLIENT *);
  1844. -int __rpc_sockisbound(SOCKET);
  1845. +int __rpc_sockisbound(int);
  1846.  
  1847.  struct netbuf *__rpcb_findaddr(rpcprog_t, rpcvers_t, const struct netconfig *,
  1848.                                const char *, CLIENT **);
  1849. diff --git a/libtirpc/tirpc/rpc/svc.h b/libtirpc/tirpc/rpc/svc.h
  1850. index a919c50..c39c1dc 100644
  1851. --- a/libtirpc/tirpc/rpc/svc.h
  1852. +++ b/libtirpc/tirpc/rpc/svc.h
  1853. @@ -88,7 +88,7 @@ enum xprt_stat {
  1854.   * Server side transport handle
  1855.   */
  1856.  typedef struct __rpc_svcxprt {
  1857. -       SOCKET          xp_fd;
  1858. +       int             xp_fd;
  1859.         u_short         xp_port;         /* associated port number */
  1860.         const struct xp_ops {
  1861.             /* receive incoming requests */
  1862. @@ -313,7 +313,7 @@ __END_DECLS
  1863.  __BEGIN_DECLS
  1864.  extern void    svc_getreq(int);
  1865.  extern void    svc_getreqset(fd_set *);
  1866. -extern void    svc_getreq_common(SOCKET);
  1867. +extern void    svc_getreq_common(int);
  1868.  struct pollfd;
  1869.  extern void    svc_getreq_poll(struct pollfd *, int);
  1870.  
  1871. @@ -364,11 +364,11 @@ extern SVCXPRT *svc_tp_create(void (*)(struct svc_req *, SVCXPRT *),
  1872.  /*
  1873.   * Generic TLI create routine
  1874.   */
  1875. -extern SVCXPRT *svc_tli_create(const SOCKET, const struct netconfig *,
  1876. +extern SVCXPRT *svc_tli_create(const int, const struct netconfig *,
  1877.                                const struct t_bind *, const u_int,
  1878.                                const u_int);
  1879.  /*
  1880. - *      const SOCKET fd;                -- connection end point
  1881. + *      const int fd;                -- connection end point
  1882.   *      const struct netconfig *nconf;  -- netconfig structure for network
  1883.   *      const struct t_bind *bindaddr;  -- local bind address
  1884.   *      const u_int sendsz;             -- max sendsize
  1885. @@ -379,9 +379,9 @@ extern SVCXPRT *svc_tli_create(const SOCKET, const struct netconfig *,
  1886.   * Connectionless and connectionful create routines
  1887.   */
  1888.  
  1889. -extern SVCXPRT *svc_vc_create(const SOCKET, const u_int, const u_int);
  1890. +extern SVCXPRT *svc_vc_create(const int, const u_int, const u_int);
  1891.  /*
  1892. - *      const SOCKET fd;                        -- open connection end point
  1893. + *      const int fd;                        -- open connection end point
  1894.   *      const u_int sendsize;                   -- max send size
  1895.   *      const u_int recvsize;                   -- max recv size
  1896.   */
  1897. @@ -391,9 +391,9 @@ extern SVCXPRT *svc_vc_create(const SOCKET, const u_int, const u_int);
  1898.   */
  1899.  extern SVCXPRT *svcunix_create(int, u_int, u_int, char *);
  1900.  
  1901. -extern SVCXPRT *svc_dg_create(const SOCKET, const u_int, const u_int);
  1902. +extern SVCXPRT *svc_dg_create(const int, const u_int, const u_int);
  1903.          /*
  1904. -         * const SOCKET fd;                             -- open connection
  1905. +         * const int fd;                             -- open connection
  1906.           * const u_int sendsize;                        -- max send size
  1907.           * const u_int recvsize;                        -- max recv size
  1908.           */
  1909. @@ -403,9 +403,9 @@ extern SVCXPRT *svc_dg_create(const SOCKET, const u_int, const u_int);
  1910.   * the routine takes any *open* connection
  1911.   * descriptor as its first input and is used for open connections.
  1912.   */
  1913. -extern SVCXPRT *svc_fd_create(const SOCKET, const u_int, const u_int);
  1914. +extern SVCXPRT *svc_fd_create(const int, const u_int, const u_int);
  1915.  /*
  1916. - *      const SOCKET fd;                        -- open connection end point
  1917. + *      const int fd;                        -- open connection end point
  1918.   *      const u_int sendsize;                   -- max send size
  1919.   *      const u_int recvsize;                   -- max recv size
  1920.   */
  1921. diff --git a/libtirpc/tirpc/wintirpc.h b/libtirpc/tirpc/wintirpc.h
  1922. index a299835..4d4ae1f 100644
  1923. --- a/libtirpc/tirpc/wintirpc.h
  1924. +++ b/libtirpc/tirpc/wintirpc.h
  1925. @@ -44,6 +44,13 @@
  1926.  #include <windows.h>
  1927.  #include <process.h>
  1928.  #include <basetsd.h>
  1929. +#include <fcntl.h>
  1930. +#include <io.h>
  1931. +
  1932. +/* warn about int to pointer */
  1933. +#pragma warning (error : 4312)
  1934. +/* conversion from 'int' to '_HFILE' of greater size */
  1935. +#pragma warning (error : 4306)
  1936.  
  1937.  //#define snprintf _snprintf
  1938.  //#define vsnprintf _vsnprintf
  1939. @@ -66,8 +73,7 @@
  1940.  /*
  1941.   * Hash of Windows Socket Handle values
  1942.   */
  1943. -#define WINSOCK_HANDLE_HASH_SIZE       1024
  1944. -#define WINSOCK_HANDLE_HASH(x) (((x) >> 2) % WINSOCK_HANDLE_HASH_SIZE)
  1945. +#define WINSOCK_HANDLE_HASH(x) (x)
  1946.  
  1947.  /*
  1948.   * Functions imported from BSD
  1949. @@ -95,6 +101,15 @@ struct sockaddr_un {
  1950.  /* XXX Should this return size_t or unsigned int ?? */
  1951.  #define SUN_LEN(ptr) ((unsigned int)(sizeof(int) + strlen ((ptr)->sun_path)))
  1952.  
  1953. +/* Prototypes */
  1954. +int wintirpc_socket(int af,int type, int protocol);
  1955. +int wintirpc_closesocket(int in_fd);
  1956. +int wintirpc_accept(int s_fd, struct sockaddr *addr, int *addrlen);
  1957. +void wintirpc_register_osfhandle_fd(SOCKET handle, int fd);
  1958. +void wintirpc_unregister_osfhandle(SOCKET handle);
  1959. +int wintirpc_osfhandle2fd(SOCKET handle);
  1960. +void warnx(LPCSTR format, ...);
  1961. +
  1962.  /* Debugging function */
  1963.  void wintirpc_debug(char *fmt, ...);
  1964.  
  1965. diff --git a/sys/nfs41_build_features.h b/sys/nfs41_build_features.h
  1966. index 93ee7a9..d43334a 100644
  1967. --- a/sys/nfs41_build_features.h
  1968. +++ b/sys/nfs41_build_features.h
  1969. @@ -32,19 +32,19 @@
  1970.  /*
  1971.   * NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES - return local uid/gid values
  1972.   */
  1973. -// #define NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES 1
  1974. +#define NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES 1
  1975.  
  1976.  /*
  1977.   * NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID - give NFS
  1978.   * files which do not map to a local account a SID in the
  1979.   * Unix_User+x/Unix_Group+x range
  1980.   */
  1981. -// #define NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID 1
  1982. +#define NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID 1
  1983.  
  1984.  /*
  1985.   * NFS41_DRIVER_FEATURE_NAMESERVICE_CYGWIN - use Cygwin /usr/bin/getent
  1986.   * as "name service"
  1987.   */
  1988. -// #define NFS41_DRIVER_FEATURE_NAMESERVICE_CYGWIN 1
  1989. +#define NFS41_DRIVER_FEATURE_NAMESERVICE_CYGWIN 1
  1990.  
  1991.  #endif /* !_NFS41_DRIVER_BUILDFEATURES_ */

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at