rtemsbsd/nfs: Add support to mount NFSv2

- NFSv2 requires userland RPC calls to determine the version of
  NFS and the FH. This is passed to the kernel.

- Port more libc/rpc.

Update #4475
This commit is contained in:
Chris Johns
2021-08-31 18:46:37 +10:00
parent 882425fe54
commit 7e282d2506
13 changed files with 1006 additions and 109 deletions

View File

@@ -191,20 +191,27 @@ authunix_create_default(void)
gid_t gid;
gid_t *gids;
#ifndef __rtems__
ngids_max = sysconf(_SC_NGROUPS_MAX) + 1;
gids = malloc(sizeof(gid_t) * ngids_max);
if (gids == NULL)
return (NULL);
#endif /* __rtems__ */
if (gethostname(machname, sizeof machname) == -1)
abort();
machname[sizeof(machname) - 1] = 0;
uid = geteuid();
gid = getegid();
#ifndef __rtems__
if ((ngids = getgroups(ngids_max, gids)) < 0)
abort();
if (ngids > NGRPS)
ngids = NGRPS;
#else /* __rtems__ */
ngids = 0;
gids = NULL;
#endif /* __rtems__ */
/* XXX: interface problem; we should translate from uid_t and gid_t */
auth = authunix_create(machname, uid, gid, ngids, gids);
free(gids);

View File

@@ -67,6 +67,12 @@ __FBSDID("$FreeBSD$");
#include "mt_misc.h"
#ifdef __rtems__
#undef thr_sigsetmask
#define thr_sigsetmask(_a, _b, _c)
#define cond_signal(_a)
#define sigfillset(_a)
#endif /* __rtems__ */
#ifdef _FREEFALL_CONFIG
/*
* Disable RPC exponential back-off for FreeBSD.org systems.
@@ -204,10 +210,12 @@ clnt_dg_create(int fd, const struct netbuf *svcaddr, rpcprog_t program,
thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
goto err1;
} else {
#ifndef __rtems__
int i;
for (i = 0; i < dtbsize; i++)
cond_init(&dg_cv[i], 0, (void *) 0);
#endif /* __rtems__ */
}
}
@@ -345,8 +353,10 @@ clnt_dg_call(CLIENT *cl, rpcproc_t proc, xdrproc_t xargs, void *argsp,
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (dg_fd_locks[cu->cu_fd])
cond_wait(&dg_cv[cu->cu_fd], &clnt_fd_lock);
#endif /* __rtems__ */
if (__isthreaded)
rpc_lock_value = 1;
else
@@ -630,8 +640,10 @@ clnt_dg_freeres(CLIENT *cl, xdrproc_t xdr_res, void *res_ptr)
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (dg_fd_locks[cu->cu_fd])
cond_wait(&dg_cv[cu->cu_fd], &clnt_fd_lock);
#endif /* __rtems__ */
xdrs->x_op = XDR_FREE;
dummy = (*xdr_res)(xdrs, res_ptr);
mutex_unlock(&clnt_fd_lock);
@@ -658,8 +670,10 @@ clnt_dg_control(CLIENT *cl, u_int request, void *info)
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (dg_fd_locks[cu->cu_fd])
cond_wait(&dg_cv[cu->cu_fd], &clnt_fd_lock);
#endif * __rtems__ */
if (__isthreaded)
rpc_lock_value = 1;
else
@@ -800,8 +814,10 @@ clnt_dg_destroy(CLIENT *cl)
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (dg_fd_locks[cu_fd])
cond_wait(&dg_cv[cu_fd], &clnt_fd_lock);
#endif * __rtems__ */
if (cu->cu_closeit)
(void)_close(cu_fd);
if (cu->cu_kq >= 0)
@@ -852,4 +868,3 @@ time_not_ok(struct timeval *t)
return (t->tv_sec < -1 || t->tv_sec > 100000000 ||
t->tv_usec < -1 || t->tv_usec > 1000000);
}

View File

@@ -398,6 +398,11 @@ clnt_tli_create(int fd, const struct netconfig *nconf,
goto err1; /* borrow errors from clnt_dg/vc creates */
if (nconf) {
cl->cl_netid = strdup(nconf->nc_netid);
#ifdef __rtems__
if (nconf->nc_device == NULL)
cl->cl_tp = "";
else
#endif /* __rtems__ */
cl->cl_tp = strdup(nconf->nc_device);
} else {
cl->cl_netid = "";

View File

@@ -85,6 +85,14 @@ __FBSDID("$FreeBSD$");
#include "rpc_com.h"
#include "mt_misc.h"
#ifdef __rtems__
#undef thr_sigsetmask
#define thr_sigsetmask(_a, _b, _c)
#define cond_signal(_a)
#define sigfillset(_a)
#define _sendmsg sendmsg
#define _recvmsg recvmsg
#endif /* __rtems__ */
#define MCALL_MSG_SIZE 24
struct cmessage {
@@ -219,10 +227,12 @@ clnt_vc_create(int fd, const struct netbuf *raddr, const rpcprog_t prog,
thr_sigsetmask(SIG_SETMASK, &(mask), NULL);
goto err;
} else {
#ifndef __rtems__
int i;
for (i = 0; i < dtbsize; i++)
cond_init(&vc_cv[i], 0, (void *) 0);
#endif /* __rtems__ */
}
} else
assert(vc_cv != (cond_t *) NULL);
@@ -336,8 +346,10 @@ clnt_vc_call(CLIENT *cl, rpcproc_t proc, xdrproc_t xdr_args, void *args_ptr,
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (vc_fd_locks[ct->ct_fd])
cond_wait(&vc_cv[ct->ct_fd], &clnt_fd_lock);
#endif /* __rtems__ */
if (__isthreaded)
rpc_lock_value = 1;
else
@@ -489,8 +501,10 @@ clnt_vc_freeres(CLIENT *cl, xdrproc_t xdr_res, void *res_ptr)
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (vc_fd_locks[ct->ct_fd])
cond_wait(&vc_cv[ct->ct_fd], &clnt_fd_lock);
#endif /* __rtems__ */
xdrs->x_op = XDR_FREE;
dummy = (*xdr_res)(xdrs, res_ptr);
mutex_unlock(&clnt_fd_lock);
@@ -536,8 +550,10 @@ clnt_vc_control(CLIENT *cl, u_int request, void *info)
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (vc_fd_locks[ct->ct_fd])
cond_wait(&vc_cv[ct->ct_fd], &clnt_fd_lock);
#endif /* __rtems__ */
if (__isthreaded)
rpc_lock_value = 1;
else
@@ -653,8 +669,10 @@ clnt_vc_destroy(CLIENT *cl)
sigfillset(&newmask);
thr_sigsetmask(SIG_SETMASK, &newmask, &mask);
mutex_lock(&clnt_fd_lock);
#ifndef __rtems__
while (vc_fd_locks[ct_fd])
cond_wait(&vc_cv[ct_fd], &clnt_fd_lock);
#endif /* __rtems__ */
if (ct->ct_closeit && ct->ct_fd != -1) {
(void)_close(ct->ct_fd);
}

View File

@@ -63,7 +63,45 @@ __FBSDID("$FreeBSD$");
* used to specify the network transport to be used.
*/
#ifdef __rtems__
#undef fopen
#undef fgets
#undef fclose
static const char *internal_netconfig[] = {
"udp6 tpi_clts v inet6 udp - -\n",
"tcp6 tpi_cots_ord v inet6 tcp - -\n",
"udp tpi_clts v inet udp - -\n",
"tcp tpi_cots_ord v inet tcp - -\n",
"rawip tpi_raw - inet - - -\n",
"local tpi_cots_ord - loopback - - -\n",
NULL
};
static int netconfig_next;
static FILE*
nc_fopen(const char* name, const char* mode) {
netconfig_next = 0;
return (FILE*) &netconfig_next;
}
static int
nc_fclose(FILE *stream) {
return 0;
}
static char *
nc_fgets(char * str, int size, FILE *stream) {
int l;
const char *p = internal_netconfig[netconfig_next];;
if (p == NULL)
return NULL;
l = strlen(p);
size = l < size ? l : size;
memcpy(str, p, size);
++netconfig_next;
return str;
}
#define fopen nc_fopen
#define fgets nc_fgets
#define fclose nc_fclose
#endif /* __rtems__ */
/*
* netconfig errors
*/

View File

@@ -122,9 +122,11 @@ __rpc_dtbsize(void)
if (tbsize) {
return (tbsize);
}
#ifndef __rtems__
if (getrlimit(RLIMIT_NOFILE, &rl) == 0) {
return (tbsize = (int)rl.rlim_max);
}
#endif /* __rtems__ */
/*
* Something wrong. I'll try to save face by returning a
* pessimistic number.

View File

@@ -361,7 +361,11 @@ getclnthandle(const char *host, const struct netconfig *nconf, char **targaddr)
return (client);
}
} else {
#ifndef __rtems__
if (getaddrinfo(host, "sunrpc", &hints, &res) != 0) {
#else /* __rtems__ */
if (getaddrinfo(host, "111", &hints, &res) != 0) {
#endif /* __rtems__ */
rpc_createerr.cf_stat = RPC_UNKNOWNHOST;
return NULL;
}