openwrt/openwrt/package/nfs-server/patches/debian-subset.patch

699 lines
19 KiB
Diff

--- nfs-user-server-2.2beta47.orig/BUILD
+++ nfs-user-server-2.2beta47/BUILD
@@ -48,7 +48,7 @@
shift
done
-function read_yesno {
+read_yesno() {
ans=""
echo >&2
default=$2
@@ -84,7 +84,7 @@
echo $ans
}
-function read_ugid {
+read_ugid() {
ans=""
prompt="$2 [default $3 $4] "
default=$3
@@ -145,7 +145,7 @@
if ! $batch; then
echo -n "Please press return to continue"
- read
+ read ans
fi
version=`cat .version`
--- nfs-user-server-2.2beta47.orig/Makefile.in
+++ nfs-user-server-2.2beta47/Makefile.in
@@ -95,20 +95,20 @@
LIBSRCS = fileblocks.c fsusage.c realpath.c strerror.c \
utimes.c mkdir.c rename.c getopt.c getopt_long.c \
alloca.c mountlist.c xmalloc.c \
- xstrdup.c strdup.c strstr.c nfsmounted.c faccess.c \
+ xstrdup.c strdup.c strstr.c nfsmounted.c \
haccess.c failsafe.c signals.c
XDRFILES = mount.x nfs_prot.x
GENFILES = mount.h mount_xdr.c mount_svc.c nfs_prot.h nfs_prot_xdr.c \
ugid.h ugid_xdr.c ugid_clnt.c
HDRS = system.h nfsd.h auth.h fh.h logging.h fakefsuid.h \
- rpcmisc.h faccess.h rquotad.h rquota.h haccess.h
+ rpcmisc.h rquotad.h rquota.h haccess.h
LIBHDRS = fsusage.h getopt.h mountlist.h failsafe.h signals.h
MANPAGES5 = exports
MANPAGES8p = mountd nfsd $(UGIDD_MAN)
MANPAGES8 = showmount
MANPAGES = $(MANPAGES5) $(MANPAGES8p) $(MANPAGES8)
LIBOBJS = version.o fsusage.o mountlist.o xmalloc.o xstrdup.o \
- nfsmounted.o faccess.o haccess.o failsafe.o \
+ nfsmounted.o haccess.o failsafe.o \
signals.o @LIBOBJS@ @ALLOCA@
OBJS = logging.o fh.o devtab.o auth_init.o auth_clnt.o auth.o
NFSD_OBJS = nfsd.o rpcmisc.o nfs_dispatch.o getattr.o setattr.o \
@@ -116,7 +116,7 @@
MOUNTD_OBJS = mountd.o rpcmisc.o mount_dispatch.o mount_xdr.o rmtab.o \
$(OBJS)
SHOWMOUNT_OBJS = showmount.o mount_xdr.o
-UGIDD_OBJS = ugidd.o ugid_xdr.o logging.o
+UGIDD_OBJS = ugidd.o ugid_xdr.o logging.o rpcmisc.o
DAEMONS = $(rpcprefix)mountd $(rpcprefix)nfsd $(UGIDD_PROG)
CLIENTS = showmount
--- nfs-user-server-2.2beta47.orig/auth.c
+++ nfs-user-server-2.2beta47/auth.c
@@ -143,6 +143,21 @@
return okay;
}
+static inline int
+auth_atob(const char *name, struct in_addr *ap)
+{
+ int m;
+
+ if (!isdigit(*name))
+ return 0;
+ for (m = 0; isdigit(*name); name++)
+ m = m * 10 + (unsigned char) *name - '0';
+ if (m > 32)
+ return 0;
+ ap->s_addr = m ? ~((1 << (32 - m)) - 1) : 0;
+ return 1;
+}
+
/*
* Get a client entry for a specific name or pattern.
* If necessary, this function performs a hostname lookup to
@@ -614,7 +629,9 @@
if (auth_aton(hname, &haddr, &ename)) {
if (*ename == '\0')
is_hostaddr = 1;
- else if (*ename == '/' && auth_aton(ename+1, &hmask, NULL))
+ else if (*ename == '/' &&
+ (auth_aton(ename+1, &hmask, NULL) ||
+ auth_atob(ename+1, &hmask)))
is_netmask = 1;
}
is_special = is_wildcard + is_netgroup + is_netmask;
--- nfs-user-server-2.2beta47.orig/auth_init.c
+++ nfs-user-server-2.2beta47/auth_init.c
@@ -23,6 +23,7 @@
#define EXPORTSFILE "/etc/exports"
#endif
+#if 0
/* Support for file access control on /etc/exports by Alex Yuriev. */
#include "faccess.h"
#ifndef EXPORTSOWNERUID
@@ -31,6 +32,7 @@
#ifndef EXPORTSOWNERGID
#define EXPORTSOWNERGID ((gid_t) 0)
#endif
+#endif
exportnode * export_list = NULL;
int allow_non_root = 0;
@@ -395,6 +397,7 @@
auth_file = fname; /* Save for re-initialization */
/* Check protection of exports file. */
+#if 0 /* A man's house is his castle. */
switch(iCheckAccess(auth_file, EXPORTSOWNERUID, EXPORTSOWNERGID)) {
case FACCESSWRITABLE:
Dprintf(L_ERROR,
@@ -409,6 +412,7 @@
Dprintf(L_ERROR, "exiting because of security violation.\n");
exit(1);
}
+#endif
if ((ef = fopen(fname, "r")) == NULL) {
Dprintf(L_ERROR, "Could not open exports file %s: %s\n",
@@ -468,7 +472,7 @@
/* Build the RPC mount export list data structure. */
resex = (exportnode *) xmalloc(sizeof *resex);
- resex->ex_dir = mount_point;
+ resex->ex_dir = xstrdup(path);
resex->ex_groups = NULL;
#ifndef NEW_STYLE_EXPORTS_FILE
--- nfs-user-server-2.2beta47.orig/configure.in
+++ nfs-user-server-2.2beta47/configure.in
@@ -53,7 +53,7 @@
AC_CHECK_LIB(crypt, main)
AC_CHECK_LIB(nys, main)
AC_REPLACE_FUNCS(strerror realpath mkdir rename utimes strdup strstr getopt getopt_long)
-AC_HAVE_FUNCS(getcwd seteuid setreuid getdtablesize setgroups lchown setsid setfsuid setfsgid innetgr quotactl authdes_getucred)
+AC_HAVE_FUNCS(getcwd seteuid setreuid getdtablesize setgroups lchown setsid setfsuid setfsgid innetgr quotactl authdes_getucred strsignal)
AC_AUTHDES_GETUCRED
AC_BROKEN_SETFSUID
AC_MOUNTLIST
--- nfs-user-server-2.2beta47.orig/exports.man
+++ nfs-user-server-2.2beta47/exports.man
@@ -8,7 +8,7 @@
The file
.I /etc/exports
serves as the access control list for file systems which may be
-exported to NFS clients. It it used by both the NFS mount daemon,
+exported to NFS clients. It is used by both the NFS mount daemon,
.IR mountd (8)
and the NFS file server daemon
.IR nfsd (8).
@@ -75,11 +75,12 @@
off, specify
.IR insecure .
.TP
+.IR ro
+Disallow the client to modify files and directories. The client is only
+allowed to issue read-only requests.
+.TP
.IR rw
-Allow the client to modify files and directories. The default is to
-restrict the client to read-only request, which can be made explicit
-by using the
-.IR ro " option.
+Allow the client to modify files and directories. This is the default.
.TP
.I noaccess
This makes everything below the directory inaccessible for the named
@@ -98,6 +99,14 @@
.TP
.IR link_absolute
Leave all symbolic link as they are. This is the default operation.
+.SS Anonymous Entries
+.PP
+Entries where hosts are not specified are known as anonymous entries. They
+have different default settings compared to normal entries. The differences
+include
+.IR all_squash ,
+.IR no_secure ", and"
+.IR ro .
.SS User ID Mapping
.PP
.I nfsd
--- nfs-user-server-2.2beta47.orig/failsafe.c
+++ nfs-user-server-2.2beta47/failsafe.c
@@ -10,8 +10,12 @@
#include "logging.h"
#include "signals.h"
#include <sys/wait.h>
+#ifdef HAVE_STRSIGNAL
+#include <string.h>
+#else
static const char * get_signame(int signo);
+#endif
void
failsafe(int level, int ncopies)
@@ -111,9 +115,17 @@
pid, running? "Continue" : "Exit");
} else {
Dprintf(L_WARNING, "failsafe: "
+#ifdef HAVE_STRSIGNAL
+ "child %d terminated by: %s. "
+#else
"child %d terminated by %s. "
+#endif
"Restarting.",
+#ifdef HAVE_STRSIGNAL
+ pid, strsignal(signo));
+#else
pid, get_signame(signo));
+#endif
child = -1; /* Restart */
}
} else if (WIFEXITED(status)) {
@@ -159,6 +171,7 @@
/* NOP */
}
+#ifndef HAVE_STRSIGNAL
static const char *
get_signame(int signo)
{
@@ -199,3 +212,4 @@
sprintf(namebuf, "signal #%d", signo);
return namebuf;
}
+#endif
--- nfs-user-server-2.2beta47.orig/mount_dispatch.c
+++ nfs-user-server-2.2beta47/mount_dispatch.c
@@ -131,7 +131,7 @@
dent = &dtbl[proc_index];
memset(&argument, 0, dent->arg_size);
- if (!svc_getargs(transp, (xdrproc_t) dent->xdr_argument, &argument)) {
+ if (!svc_getargs(transp, (xdrproc_t) dent->xdr_argument, (caddr_t) &argument)) {
svcerr_decode(transp);
goto done;
}
@@ -148,7 +148,7 @@
if (!svc_sendreply(transp, dent->xdr_result, (caddr_t) resp)) {
svcerr_systemerr(transp);
}
- if (!svc_freeargs(transp, (xdrproc_t) dent->xdr_argument, &argument)) {
+ if (!svc_freeargs(transp, (xdrproc_t) dent->xdr_argument, (caddr_t) &argument)) {
Dprintf(L_ERROR, "unable to free RPC arguments, exiting\n");
exit(1);
}
--- nfs-user-server-2.2beta47.orig/mount_xdr.c
+++ nfs-user-server-2.2beta47/mount_xdr.c
@@ -190,7 +190,7 @@
xdr_ppathcnf(XDR *xdrs, ppathcnf *objp)
{
- register long *buf=buf;
+ int32_t *buf=buf;
int i=i;
--- nfs-user-server-2.2beta47.orig/mountd.c
+++ nfs-user-server-2.2beta47/mountd.c
@@ -310,6 +310,7 @@
int c;
program_name = argv[0];
+ chdir("/");
/* Parse the command line options and arguments. */
opterr = 0;
--- nfs-user-server-2.2beta47.orig/nfs_dispatch.c
+++ nfs-user-server-2.2beta47/nfs_dispatch.c
@@ -147,7 +147,7 @@
nfsclient = NULL;
memset(&argument, 0, dent->arg_size);
- if (!svc_getargs(transp, (xdrproc_t) dent->xdr_argument, &argument)) {
+ if (!svc_getargs(transp, (xdrproc_t) dent->xdr_argument, (caddr_t) &argument)) {
svcerr_decode(transp);
goto done;
}
@@ -173,7 +173,7 @@
svc_sendreply(transp, dent->xdr_result, (caddr_t) &result);
#endif
- if (!svc_freeargs(transp, (xdrproc_t) dent->xdr_argument, &argument)) {
+ if (!svc_freeargs(transp, (xdrproc_t) dent->xdr_argument, (caddr_t) &argument)) {
Dprintf(L_ERROR, "unable to free RPC arguments, exiting\n");
exit(1);
}
--- nfs-user-server-2.2beta47.orig/nfs_prot_xdr.c
+++ nfs-user-server-2.2beta47/nfs_prot_xdr.c
@@ -98,7 +98,7 @@
xdr_fattr(XDR *xdrs, fattr *objp)
{
- register long *buf=buf;
+ int32_t *buf=buf;
if (xdrs->x_op == XDR_ENCODE) {
@@ -273,7 +273,7 @@
xdr_sattr(XDR *xdrs, sattr *objp)
{
- register long *buf=buf;
+ int32_t *buf=buf;
if (xdrs->x_op == XDR_ENCODE) {
@@ -553,7 +553,7 @@
xdr_writeargs(XDR *xdrs, writeargs *objp)
{
- register long *buf = buf;
+ int32_t *buf = buf;
if (xdrs->x_op == XDR_ENCODE) {
@@ -777,7 +777,7 @@
xdr_statfsokres(XDR *xdrs, statfsokres *objp)
{
- register long *buf=buf;
+ int32_t *buf=buf;
if (xdrs->x_op == XDR_ENCODE) {
--- nfs-user-server-2.2beta47.orig/nfsd.c
+++ nfs-user-server-2.2beta47/nfsd.c
@@ -36,6 +36,7 @@
#define CHK_READ 0
#define CHK_WRITE 1
#define CHK_NOACCESS 2
+#define CHK_ROOT 4
/* Make larger reads possible. Without crashing the machine :-) */
#undef NFS_MAXDATA
@@ -173,7 +174,8 @@
return NULL;
}
- auth_user(nfsmount, rqstp);
+ if (!(flags & CHK_ROOT) || strcmp(nfsmount->path, fhc->path))
+ auth_user(nfsmount, rqstp);
*statp = NFS_OK;
return fhc;
@@ -244,7 +246,7 @@
nfsstat status;
fhcache *fhc;
- fhc = auth_fh(rqstp, argp, &status, CHK_READ);
+ fhc = auth_fh(rqstp, argp, &status, CHK_READ | CHK_ROOT);
if (fhc == NULL)
return status;
@@ -575,7 +577,12 @@
#endif
/* MvS: Some clients use chardev 0xFFFF for a FIFO. */
+#if defined(major) && defined(minor)
+ if (S_ISCHR(argp->attributes.mode) &&
+ major(dev) == 0xff && minor(dev) == 0xff) {
+#else
if (S_ISCHR(argp->attributes.mode) && dev == 0xFFFF) {
+#endif
is_borc = 0;
dev = 0;
argp->attributes.mode &= ~S_IFMT;
@@ -882,7 +889,9 @@
/* This code is from Mark Shand's version */
errno = 0;
- if (efs_lstat(h->path, &sbuf) < 0 || !(S_ISDIR(sbuf.st_mode)))
+ if (efs_lstat(h->path, &sbuf) < 0)
+ return (NFSERR_ACCES);
+ if (!S_ISDIR(sbuf.st_mode))
return (NFSERR_NOTDIR);
if ((dirp = efs_opendir(h->path)) == NULL)
return ((errno ? nfs_errno() : NFSERR_NAMETOOLONG));
@@ -940,7 +949,7 @@
char *path;
struct fs_usage fs;
- fhc = auth_fh(rqstp, argp, &status, CHK_READ | CHK_NOACCESS);
+ fhc = auth_fh(rqstp, argp, &status, CHK_READ | CHK_NOACCESS | CHK_ROOT);
if (fhc == NULL)
return status;
path = fhc->path;
--- nfs-user-server-2.2beta47.orig/rpcmisc.c
+++ nfs-user-server-2.2beta47/rpcmisc.c
@@ -64,25 +64,25 @@
asize = sizeof(saddr);
sock = 0;
if (getsockname(0, (struct sockaddr *) &saddr, &asize) == 0) {
- int ssize = sizeof (int);
+ int ssize = sizeof (i);
if (saddr.sin_family != AF_INET)
goto not_inetd;
- if (getsockopt(0, SOL_SOCKET, SO_TYPE, &_rpcfdtype, &ssize) < 0)
+ if (getsockopt(0, SOL_SOCKET, SO_TYPE, &i, &ssize) < 0)
goto not_inetd;
+ _rpcfdtype = i;
background_logging(); /* no more logging to stderr */
closedown = time(NULL) + _RPCSVC_CLOSEDOWN;
_rpcpmstart = 1;
} else {
not_inetd:
- _rpcfdtype = 0;
for (i = 0; (vers = verstbl[i]) != 0; i++)
pmap_unset(prog, vers);
sock = RPC_ANYSOCK;
}
if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_DGRAM)) {
- if (_rpcfdtype == 0 && defport != 0)
+ if (_rpcpmstart == 0 && defport != 0)
sock = makesock(defport, IPPROTO_UDP, bufsiz);
transp = svcudp_create(sock);
if (transp == NULL)
@@ -97,7 +97,7 @@
}
if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_STREAM)) {
- if (_rpcfdtype == 0 && defport != 0)
+ if (_rpcpmstart == 0 && defport != 0)
sock = makesock(defport, IPPROTO_TCP, bufsiz);
transp = svctcp_create(sock, 0, 0);
if (transp == NULL)
@@ -220,11 +220,14 @@
}
#endif /* SO_SNDBUF */
- if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) == -1)
- Dprintf(L_FATAL, "Could not bind %s socket to %s:%d: %s\n",
+ if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
+ Dprintf(L_ERROR, "Could not bind %s socket to %s:%d: %s\n",
prot_name, inet_ntoa(sin.sin_addr),
ntohs(sin.sin_port),
strerror(errno));
+ close(s);
+ s = RPC_ANYSOCK;
+ }
return (s);
}
--- nfs-user-server-2.2beta47.orig/showmount.c
+++ nfs-user-server-2.2beta47/showmount.c
@@ -200,7 +200,7 @@
memset(&exportlist, '\0', sizeof(exportlist));
clnt_stat = clnt_call(mclient, MOUNTPROC_EXPORT,
(xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_exports, &exportlist,
+ (xdrproc_t) xdr_exports, (caddr_t) &exportlist,
total_timeout);
if (clnt_stat != RPC_SUCCESS) {
clnt_perror(mclient, "rpc mount export");
@@ -233,7 +233,7 @@
memset(&dumplist, '\0', sizeof(dumplist));
clnt_stat = clnt_call(mclient, MOUNTPROC_DUMP,
(xdrproc_t) xdr_void, NULL,
- (xdrproc_t) xdr_mountlist, &dumplist,
+ (xdrproc_t) xdr_mountlist, (caddr_t) &dumplist,
total_timeout);
if (clnt_stat != RPC_SUCCESS) {
clnt_perror(mclient, "rpc mount dump");
--- nfs-user-server-2.2beta47.orig/ugid_clnt.c
+++ nfs-user-server-2.2beta47/ugid_clnt.c
@@ -16,7 +16,7 @@
static int clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
- if (clnt_call(clnt, AUTHENTICATE, (xdrproc_t) xdr_int, argp, (xdrproc_t) xdr_int, &clnt_res, TIMEOUT) != RPC_SUCCESS) {
+ if (clnt_call(clnt, AUTHENTICATE, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
@@ -28,7 +28,7 @@
static int clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
- if (clnt_call(clnt, NAME_UID, (xdrproc_t) xdr_ugname, argp, (xdrproc_t) xdr_int, &clnt_res, TIMEOUT) != RPC_SUCCESS) {
+ if (clnt_call(clnt, NAME_UID, (xdrproc_t) xdr_ugname, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
@@ -40,7 +40,7 @@
static int clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
- if (clnt_call(clnt, GROUP_GID, (xdrproc_t) xdr_ugname, argp, (xdrproc_t) xdr_int, &clnt_res, TIMEOUT) != RPC_SUCCESS) {
+ if (clnt_call(clnt, GROUP_GID, (xdrproc_t) xdr_ugname, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
@@ -52,7 +52,7 @@
static ugname clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
- if (clnt_call(clnt, UID_NAME, (xdrproc_t) xdr_int, argp, (xdrproc_t) xdr_ugname, &clnt_res, TIMEOUT) != RPC_SUCCESS) {
+ if (clnt_call(clnt, UID_NAME, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_ugname, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
@@ -64,7 +64,7 @@
static ugname clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
- if (clnt_call(clnt, GID_GROUP, (xdrproc_t) xdr_int, argp, (xdrproc_t) xdr_ugname, &clnt_res, TIMEOUT) != RPC_SUCCESS) {
+ if (clnt_call(clnt, GID_GROUP, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_ugname, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
--- nfs-user-server-2.2beta47.orig/ugid_map.c
+++ nfs-user-server-2.2beta47/ugid_map.c
@@ -602,7 +602,7 @@
* the server's port after clntudp_create, so we fetch it
* explicitly.
*/
- clnt_control(clnt, CLGET_SERVER_ADDR, &addr);
+ clnt_control(clnt, CLGET_SERVER_ADDR, (caddr_t) &addr);
if (!SECURE_PORT(addr.sin_port)) {
Dprintf(L_ERROR, "%s on %s runs on unprivileged port.\n",
name, inet_ntoa(addr.sin_addr));
--- nfs-user-server-2.2beta47.orig/ugidd.c
+++ nfs-user-server-2.2beta47/ugidd.c
@@ -20,6 +20,8 @@
#include "ugid.h"
#include "logging.h"
#include "haccess.h"
+#include "rpcmisc.h"
+#include "signals.h"
#ifdef HAVE_LIBWRAP_BUG
#include <syslog.h>
#endif
@@ -27,6 +29,8 @@
static void ugidprog_1(struct svc_req *rqstp, SVCXPRT *transp);
static void usage(void);
+static void terminate(void);
+static RETSIGTYPE sigterm(int sig);
#ifndef HAVE_RPCGEN_C
#define authenticate_1_svc authenticate_1
@@ -39,17 +43,23 @@
static struct option longopts[] = {
{ "debug", 0, 0, 'd' },
+ { "port", required_argument, 0, 'P' },
{ NULL, 0, 0, 0 }
};
+static int ugidd_versions[] = {
+ UGIDVERS,
+ 0
+};
+
int
main(argc, argv)
int argc;
char **argv;
{
- SVCXPRT *transp;
int c, longind;
int foreground = 0;
+ int port = 0;
#ifndef HOSTS_ACCESS
fprintf(stderr,
@@ -59,40 +69,34 @@
sleep(1);
#endif
- while ((c = getopt_long(argc, argv, "d", longopts, &longind)) != EOF) {
+ chdir("/");
+
+ while ((c = getopt_long(argc, argv, "dP:", longopts, &longind)) != EOF) {
switch (c) {
case 'd':
foreground = 1;
enable_logging("ugid");
break;
+ case 'P':
+ port = atoi(optarg);
+ if (port <= 0 || port > 65535) {
+ fprintf(stderr, "ugidd: bad port number: %s\n",
+ optarg);
+ usage();
+ }
+ break;
default:
usage();
}
}
- (void)pmap_unset(UGIDPROG, UGIDVERS);
+ log_open("ugidd", foreground);
- transp = svcudp_create(RPC_ANYSOCK);
- if (transp == NULL) {
- (void)fprintf(stderr, "cannot create udp service.\n");
- exit(1);
- }
- if (!svc_register(transp, UGIDPROG, UGIDVERS, ugidprog_1, IPPROTO_UDP)) {
- fprintf(stderr, "unable to register (UGIDPROG, UGIDVERS, UDP)\n");
- exit(1);
- }
-
- transp = svctcp_create(RPC_ANYSOCK, 0, 0);
- if (transp == NULL) {
- fprintf(stderr, "cannot create tcp service.\n");
- exit(1);
- }
- if (!svc_register(transp, UGIDPROG, UGIDVERS, ugidprog_1, IPPROTO_TCP)) {
- fprintf(stderr, "unable to register (UGIDPROG, UGIDVERS, TCP)\n");
- exit(1);
- }
+ /* Create services and register with portmapper */
+ _rpcfdtype = SOCK_DGRAM;
+ rpc_init("ugidd", UGIDPROG, ugidd_versions, ugidprog_1, port, 0);
- if (!foreground) {
+ if (!foreground && !_rpcpmstart) {
if ((c = fork()) > 0)
exit(0);
if (c < 0) {
@@ -117,7 +121,8 @@
#endif
}
- log_open("ugidd", foreground);
+ install_signal_handler(SIGTERM, sigterm);
+ atexit(terminate);
svc_run();
Dprintf(L_ERROR, "svc_run returned\n");
@@ -127,7 +132,7 @@
static void
usage()
{
- fprintf(stderr, "rpc.ugidd: [-d]\n");
+ fprintf(stderr, "rpc.ugidd: [-d] [-P port]\n");
exit (2);
}
@@ -188,7 +193,7 @@
return;
}
bzero((char *)&argument, sizeof(argument));
- if (!svc_getargs(transp, xdr_argument, &argument)) {
+ if (!svc_getargs(transp, xdr_argument, (caddr_t) &argument)) {
svcerr_decode(transp);
return;
}
@@ -196,7 +201,7 @@
if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
svcerr_systemerr(transp);
}
- if (!svc_freeargs(transp, xdr_argument, &argument)) {
+ if (!svc_freeargs(transp, xdr_argument, (caddr_t) &argument)) {
(void)fprintf(stderr, "unable to free arguments\n");
exit(1);
}
@@ -321,6 +326,19 @@
}
+static RETSIGTYPE
+sigterm(int sig)
+{
+ exit(0);
+}
+
+static void
+terminate(void)
+{
+ rpc_exit(UGIDPROG, ugidd_versions);
+}
+
+
#else /* ENABLE_UGID_DAEMON */