#include "rpcmisc.h"
#include "pseudoflavors.h"
-extern void cache_open(void);
-extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p);
-extern int cache_export(nfs_export *exp, char *path);
-
extern void my_svc_run(void);
static void usage(const char *, int exitcode);
{ NULL, 0, 0, 0 }
};
-static int nfs_version = -1;
+#define NFSVERSBIT(vers) (0x1 << (vers - 1))
+#define NFSVERSBIT_ALL (NFSVERSBIT(2) | NFSVERSBIT(3) | NFSVERSBIT(4))
+
+static int nfs_version = NFSVERSBIT_ALL;
+
+static int version2(void)
+{
+ return nfs_version & NFSVERSBIT(2);
+}
+
+static int version3(void)
+{
+ return nfs_version & NFSVERSBIT(3);
+}
+
+static int version23(void)
+{
+ return nfs_version & (NFSVERSBIT(2) | NFSVERSBIT(3));
+}
+
+static int version_any(void)
+{
+ return nfs_version & NFSVERSBIT_ALL;
+}
static void
unregister_services (void)
{
- if (nfs_version & (0x1 << 1)) {
- pmap_unset (MOUNTPROG, MOUNTVERS);
- pmap_unset (MOUNTPROG, MOUNTVERS_POSIX);
+ if (version2()) {
+ nfs_svc_unregister(MOUNTPROG, MOUNTVERS);
+ nfs_svc_unregister(MOUNTPROG, MOUNTVERS_POSIX);
}
- if (nfs_version & (0x1 << 2))
- pmap_unset (MOUNTPROG, MOUNTVERS_NFSV3);
+ if (version3())
+ nfs_svc_unregister(MOUNTPROG, MOUNTVERS_NFSV3);
}
static void
}
bool_t
-mount_null_1_svc(struct svc_req *UNUSED(rqstp), void *UNUSED(argp),
+mount_null_1_svc(struct svc_req *rqstp, void *UNUSED(argp),
void *UNUSED(resp))
{
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
+ char buf[INET6_ADDRSTRLEN];
+
+ xlog(D_CALL, "Received NULL request from %s",
+ host_ntop(sap, buf, sizeof(buf)));
+
return 1;
}
bool_t
mount_mnt_1_svc(struct svc_req *rqstp, dirpath *path, fhstatus *res)
{
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
+ char buf[INET6_ADDRSTRLEN];
struct nfs_fh_len *fh;
- xlog(D_CALL, "MNT1(%s) called", *path);
+ xlog(D_CALL, "Received MNT1(%s) request from %s", *path,
+ host_ntop(sap, buf, sizeof(buf)));
+
fh = get_rootfh(rqstp, path, NULL, &res->fhs_status, 0);
if (fh)
memcpy(&res->fhstatus_u.fhs_fhandle, fh->fh_handle, 32);
bool_t
mount_dump_1_svc(struct svc_req *rqstp, void *UNUSED(argp), mountlist *res)
{
- struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt);
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
+ char buf[INET6_ADDRSTRLEN];
+
+ xlog(D_CALL, "Received DUMP request from %s",
+ host_ntop(sap, buf, sizeof(buf)));
- xlog(D_CALL, "dump request from %s.", inet_ntoa(addr->sin_addr));
*res = mountlist_list();
return 1;
bool_t
mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *UNUSED(resp))
{
- struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt);
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
nfs_export *exp;
char *p = *argp;
char rpath[MAXPATHLEN+1];
+ char buf[INET6_ADDRSTRLEN];
if (*p == '\0')
p = "/";
p = rpath;
}
- exp = auth_authenticate("unmount", (struct sockaddr *)sin, p);
+ xlog(D_CALL, "Received UMNT(%s) request from %s", p,
+ host_ntop(sap, buf, sizeof(buf)));
+
+ exp = auth_authenticate("unmount", sap, p);
if (exp == NULL)
return 1;
- mountlist_del(inet_ntoa(sin->sin_addr), p);
+ mountlist_del(host_ntop(sap, buf, sizeof(buf)), p);
return 1;
}
mount_umntall_1_svc(struct svc_req *rqstp, void *UNUSED(argp),
void *UNUSED(resp))
{
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
+ char buf[INET6_ADDRSTRLEN];
+
+ xlog(D_CALL, "Received UMNTALL request from %s",
+ host_ntop(sap, buf, sizeof(buf)));
+
/* Reload /etc/xtab if necessary */
auth_reload();
- mountlist_del_all(nfs_getrpccaller_in(rqstp->rq_xprt));
+ mountlist_del_all(nfs_getrpccaller(rqstp->rq_xprt));
return 1;
}
bool_t
mount_export_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp)
{
- struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt);
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
+ char buf[INET6_ADDRSTRLEN];
+
+ xlog(D_CALL, "Received EXPORT request from %s.",
+ host_ntop(sap, buf, sizeof(buf)));
- xlog(D_CALL, "export request from %s.", inet_ntoa(addr->sin_addr));
*resp = get_exportlist();
return 1;
bool_t
mount_exportall_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp)
{
- struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt);
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
+ char buf[INET6_ADDRSTRLEN];
+
+ xlog(D_CALL, "Received EXPORTALL request from %s.",
+ host_ntop(sap, buf, sizeof(buf)));
- xlog(D_CALL, "exportall request from %s.", inet_ntoa(addr->sin_addr));
*resp = get_exportlist();
return 1;
bool_t
mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res)
{
- struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt);
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
struct stat stb;
nfs_export *exp;
char rpath[MAXPATHLEN+1];
char *p = *path;
+ char buf[INET6_ADDRSTRLEN];
memset(res, 0, sizeof(*res));
p = rpath;
}
+ xlog(D_CALL, "Received PATHCONF(%s) request from %s", p,
+ host_ntop(sap, buf, sizeof(buf)));
+
/* Now authenticate the intruder... */
- exp = auth_authenticate("pathconf", (struct sockaddr *)sin, p);
+ exp = auth_authenticate("pathconf", sap, p);
if (exp == NULL)
return 1;
else if (stat(p, &stb) < 0) {
bool_t
mount_mnt_3_svc(struct svc_req *rqstp, dirpath *path, mountres3 *res)
{
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
struct mountres3_ok *ok = &res->mountres3_u.mountinfo;
+ char buf[INET6_ADDRSTRLEN];
nfs_export *exp;
struct nfs_fh_len *fh;
- xlog(D_CALL, "MNT3(%s) called", *path);
+ xlog(D_CALL, "Received MNT3(%s) request from %s", *path,
+ host_ntop(sap, buf, sizeof(buf)));
+
fh = get_rootfh(rqstp, path, &exp, &res->fhs_status, 1);
if (!fh)
return 1;
get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret,
mountstat3 *error, int v3)
{
- struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt);
+ struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt);
struct stat stb, estb;
nfs_export *exp;
struct nfs_fh_len *fh;
char rpath[MAXPATHLEN+1];
char *p = *path;
+ char buf[INET6_ADDRSTRLEN];
if (*p == '\0')
p = "/";
}
/* Now authenticate the intruder... */
- exp = auth_authenticate("mount", (struct sockaddr *)sin, p);
+ exp = auth_authenticate("mount", sap, p);
if (exp == NULL) {
*error = NFSERR_ACCES;
return NULL;
xtab_append(exp);
if (v3)
- fh = getfh_size(sin, p, 64);
+ fh = getfh_size((struct sockaddr_in *)sap, p, 64);
if (!v3 || (fh == NULL && errno == EINVAL)) {
/* We first try the new nfs syscall. */
- fh = getfh(sin, p);
+ fh = getfh((struct sockaddr_in *)sap, p);
if (fh == NULL && errno == EINVAL)
/* Let's try the old one. */
- fh = getfh_old(sin, stb.st_dev, stb.st_ino);
+ fh = getfh_old((struct sockaddr_in *)sap,
+ stb.st_dev, stb.st_ino);
}
if (fh == NULL && !did_export) {
exp->m_exported = 0;
}
}
*error = NFS_OK;
- mountlist_add(inet_ntoa(sin->sin_addr), p);
+ mountlist_add(host_ntop(sap, buf, sizeof(buf)), p);
if (expret)
*expret = exp;
return fh;
{
char *export_file = _PATH_EXPORTS;
char *state_dir = NFS_STATEDIR;
+ unsigned int listeners = 0;
int foreground = 0;
int port = 0;
int descriptors = 0;
int c;
+ int vers;
struct sigaction sa;
struct rlimit rlim;
}
break;
case 'N':
- nfs_version &= ~(1 << (atoi (optarg) - 1));
+ vers = atoi(optarg);
+ if (vers < 2 || vers > 4) {
+ fprintf(stderr, "%s: bad version number: %s\n",
+ argv[0], optarg);
+ usage(argv[0], 1);
+ }
+ nfs_version &= ~NFSVERSBIT(vers);
break;
case 'n':
_rpcfdtype = SOCK_DGRAM;
num_threads = atoi (optarg);
break;
case 'V':
- nfs_version |= 1 << (atoi (optarg) - 1);
+ vers = atoi(optarg);
+ if (vers < 2 || vers > 4) {
+ fprintf(stderr, "%s: bad version number: %s\n",
+ argv[0], optarg);
+ usage(argv[0], 1);
+ }
+ nfs_version |= NFSVERSBIT(vers);
break;
case 'v':
printf("kmountd %s\n", VERSION);
/* No more arguments allowed.
* Require at least one valid version (2, 3, or 4)
*/
- if (optind != argc || !(nfs_version & 0xE))
+ if (optind != argc || !version_any())
usage(argv [0], 1);
if (chdir(state_dir)) {
if (new_cache)
cache_open();
- if (nfs_version & (0x1 << 1)) {
- rpc_init("mountd", MOUNTPROG, MOUNTVERS,
- mount_dispatch, port);
- rpc_init("mountd", MOUNTPROG, MOUNTVERS_POSIX,
- mount_dispatch, port);
+ if (version2()) {
+ listeners += nfs_svc_create("mountd", MOUNTPROG,
+ MOUNTVERS, mount_dispatch, port);
+ listeners += nfs_svc_create("mountd", MOUNTPROG,
+ MOUNTVERS_POSIX, mount_dispatch, port);
}
- if (nfs_version & (0x1 << 2))
- rpc_init("mountd", MOUNTPROG, MOUNTVERS_NFSV3,
- mount_dispatch, port);
+ if (version3())
+ listeners += nfs_svc_create("mountd", MOUNTPROG,
+ MOUNTVERS_NFSV3, mount_dispatch, port);
+ if (version23() && listeners == 0)
+ xlog(L_FATAL, "mountd: could not create listeners\n");
sa.sa_handler = killer;
sigaction(SIGINT, &sa, NULL);