summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorgpalmer <gpalmer@FreeBSD.org>1995-04-19 12:24:08 +0000
committergpalmer <gpalmer@FreeBSD.org>1995-04-19 12:24:08 +0000
commit0ff5903c59102c69837dc4317ea80fe6d8a12450 (patch)
tree5e46bed068739ad2e43122e7cd641e2de384eba3 /sbin
parentc2e217461cd110c5fd5468a5165daf3d99eb9e69 (diff)
downloadFreeBSD-src-0ff5903c59102c69837dc4317ea80fe6d8a12450.zip
FreeBSD-src-0ff5903c59102c69837dc4317ea80fe6d8a12450.tar.gz
Bugfixes :
- in mount_portal.c: included catching of SIGHUP to get portald to re-read the config file. - in mount_portal.c: in SIGCHLD handler the return values checked from waitpid were wrong. Note. this routine was written correclty according to the manual page for 4.4BSD, but waitpid does not exhibit this behaviour. It is not returning 0 when WNOHANG is specified. I havent checked this properly. - in mount_portal.c: initialized the fdset for the select properly. - in mount_portal.c: corrected poor casting in the select. - in mount_portal.c: changed a break; to exit (0); so that the children die after doing the hard work, this stops the select: bad file descriptor messages. - in pt_file.c: the kernel passes kernel style open flags to the portal code which aren't compatible with "normal" O_ flags. I have adjusted these in pt_file.c. In general I think the portal fs code and portal_cred structure need changing to pass to the portald the right style of flags _and_ the permissions. - in pt_tcp.c: a few mistakes in typing of the socket structures, getservbyname returns the port number as an int but sockaddr wants the port number as an u_short. - in pt_tcp.c: someone wrote this on a VAX/Sun whatever and forget about byte ordering!! I've included a few htons about the place. - in all the above I have sprinkled a few more debugging printf's. Submitted by: "Duncan McL Barclay" <dmlb@ohm.york.ac.uk
Diffstat (limited to 'sbin')
-rw-r--r--sbin/mount_portal/mount_portal.c20
-rw-r--r--sbin/mount_portal/pt_file.c6
-rw-r--r--sbin/mount_portal/pt_tcp.c16
-rw-r--r--sbin/mount_portalfs/mount_portalfs.c20
-rw-r--r--sbin/mount_portalfs/pt_file.c6
-rw-r--r--sbin/mount_portalfs/pt_tcp.c16
6 files changed, 66 insertions, 18 deletions
diff --git a/sbin/mount_portal/mount_portal.c b/sbin/mount_portal/mount_portal.c
index 862027f..23098d2 100644
--- a/sbin/mount_portal/mount_portal.c
+++ b/sbin/mount_portal/mount_portal.c
@@ -46,6 +46,7 @@ static char sccsid[] = "@(#)mount_portal.c 8.4 (Berkeley) 3/27/94";
#include <sys/param.h>
#include <sys/wait.h>
+#include <sys/time.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/syslog.h>
@@ -72,6 +73,12 @@ static void usage __P((void));
static sig_atomic_t readcf; /* Set when SIGHUP received */
+static void sighup(sig)
+int sig;
+{
+ readcf ++;
+}
+
static void sigchld(sig)
int sig;
{
@@ -79,8 +86,11 @@ int sig;
while ((pid = waitpid((pid_t) -1, (int *) 0, WNOHANG)) > 0)
;
+ /* wrtp - waitpid _doesn't_ return 0 when no children! */
+#ifdef notdef
if (pid < 0)
syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
+#endif
}
int
@@ -149,6 +159,7 @@ main(argc, argv)
(void) unlink(un.sun_path);
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
err(1, NULL);
+
(void) unlink(un.sun_path);
(void) listen(so, 5);
@@ -185,6 +196,7 @@ main(argc, argv)
readcf = 1;
signal(SIGCHLD, sigchld);
+ signal(SIGHUP, sighup);
/*
* Just loop waiting for new connections and activating them
@@ -201,6 +213,9 @@ main(argc, argv)
* Check whether we need to re-read the configuration file
*/
if (readcf) {
+#ifdef DEBUG
+ printf ("re-reading configuration file\n");
+#endif
readcf = 0;
conf_read(&q, conf);
continue;
@@ -211,8 +226,9 @@ main(argc, argv)
* Will get EINTR if a signal has arrived, so just
* ignore that error code
*/
+ FD_ZERO(&fdset);
FD_SET(so, &fdset);
- rc = select(so+1, &fdset, (void *) 0, (void *) 0, (void *) 0);
+ rc = select(so+1, &fdset, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0);
if (rc < 0) {
if (errno == EINTR)
continue;
@@ -251,7 +267,7 @@ main(argc, argv)
case 0:
(void) close(so);
activate(&q, so2);
- break;
+ exit(0); /* stupid errors.... tidied up... wrtp*/
default:
(void) close(so2);
break;
diff --git a/sbin/mount_portal/pt_file.c b/sbin/mount_portal/pt_file.c
index 929f261..a9cd2ca3 100644
--- a/sbin/mount_portal/pt_file.c
+++ b/sbin/mount_portal/pt_file.c
@@ -36,7 +36,7 @@
*
* @(#)pt_file.c 8.2 (Berkeley) 3/27/94
*
- * $Id: pt_file.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
+ * $Id: pt_file.c,v 1.2 1994/09/19 13:52:38 ache Exp $
*/
#include <stdio.h>
@@ -69,6 +69,7 @@ int *fdp;
#ifdef DEBUG
printf("path = %s, uid = %d, gid = %d\n", pbuf, pcr->pcr_uid, pcr->pcr_groups[0]);
+ printf ("fflag = %x, oflag = %x\n", pcr->pcr_flag, (pcr->pcr_flag)-1);
#endif
for (i = 0; i < pcr->pcr_ngroups; i++)
@@ -80,7 +81,8 @@ int *fdp;
if (seteuid(pcr->pcr_uid) < 0)
return (errno);
- fd = open(pbuf, O_RDWR|O_CREAT, 0666);
+ /* dmb convert kernel flags to oflags, see <fcntl.h> */
+ fd = open(pbuf, (pcr->pcr_flag)-1, 0777);
if (fd < 0)
error = errno;
else
diff --git a/sbin/mount_portal/pt_tcp.c b/sbin/mount_portal/pt_tcp.c
index 18a53ce..11f1453 100644
--- a/sbin/mount_portal/pt_tcp.c
+++ b/sbin/mount_portal/pt_tcp.c
@@ -36,7 +36,7 @@
*
* @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94
*
- * $Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp $
+ * $Id: pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
*/
#include <stdio.h>
@@ -77,7 +77,7 @@ int *fdp;
struct in_addr **ipp;
struct in_addr *ip[2];
struct in_addr ina;
- int s_port;
+ u_short s_port;
int priv = 0;
struct sockaddr_in sain;
@@ -117,15 +117,21 @@ int *fdp;
ip[1] = 0;
ipp = ip;
}
+#ifdef DEBUG
+ printf ("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
+#endif
sp = getservbyname(port, "tcp");
- if (sp != 0)
- s_port = sp->s_port;
+ if (sp != NULL)
+ s_port = (u_short)sp->s_port;
else {
- s_port = atoi(port);
+ s_port = htons ((u_short)strtol (port, (char**)NULL, 10));
if (s_port == 0)
return (EINVAL);
}
+#ifdef DEBUG
+ printf ("port number for %s is %d\n", port, s_port);
+#endif
bzero(&sain, sizeof(sain));
sain.sin_len = sizeof(sain);
diff --git a/sbin/mount_portalfs/mount_portalfs.c b/sbin/mount_portalfs/mount_portalfs.c
index 862027f..23098d2 100644
--- a/sbin/mount_portalfs/mount_portalfs.c
+++ b/sbin/mount_portalfs/mount_portalfs.c
@@ -46,6 +46,7 @@ static char sccsid[] = "@(#)mount_portal.c 8.4 (Berkeley) 3/27/94";
#include <sys/param.h>
#include <sys/wait.h>
+#include <sys/time.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/syslog.h>
@@ -72,6 +73,12 @@ static void usage __P((void));
static sig_atomic_t readcf; /* Set when SIGHUP received */
+static void sighup(sig)
+int sig;
+{
+ readcf ++;
+}
+
static void sigchld(sig)
int sig;
{
@@ -79,8 +86,11 @@ int sig;
while ((pid = waitpid((pid_t) -1, (int *) 0, WNOHANG)) > 0)
;
+ /* wrtp - waitpid _doesn't_ return 0 when no children! */
+#ifdef notdef
if (pid < 0)
syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
+#endif
}
int
@@ -149,6 +159,7 @@ main(argc, argv)
(void) unlink(un.sun_path);
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
err(1, NULL);
+
(void) unlink(un.sun_path);
(void) listen(so, 5);
@@ -185,6 +196,7 @@ main(argc, argv)
readcf = 1;
signal(SIGCHLD, sigchld);
+ signal(SIGHUP, sighup);
/*
* Just loop waiting for new connections and activating them
@@ -201,6 +213,9 @@ main(argc, argv)
* Check whether we need to re-read the configuration file
*/
if (readcf) {
+#ifdef DEBUG
+ printf ("re-reading configuration file\n");
+#endif
readcf = 0;
conf_read(&q, conf);
continue;
@@ -211,8 +226,9 @@ main(argc, argv)
* Will get EINTR if a signal has arrived, so just
* ignore that error code
*/
+ FD_ZERO(&fdset);
FD_SET(so, &fdset);
- rc = select(so+1, &fdset, (void *) 0, (void *) 0, (void *) 0);
+ rc = select(so+1, &fdset, (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0);
if (rc < 0) {
if (errno == EINTR)
continue;
@@ -251,7 +267,7 @@ main(argc, argv)
case 0:
(void) close(so);
activate(&q, so2);
- break;
+ exit(0); /* stupid errors.... tidied up... wrtp*/
default:
(void) close(so2);
break;
diff --git a/sbin/mount_portalfs/pt_file.c b/sbin/mount_portalfs/pt_file.c
index 929f261..a9cd2ca3 100644
--- a/sbin/mount_portalfs/pt_file.c
+++ b/sbin/mount_portalfs/pt_file.c
@@ -36,7 +36,7 @@
*
* @(#)pt_file.c 8.2 (Berkeley) 3/27/94
*
- * $Id: pt_file.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
+ * $Id: pt_file.c,v 1.2 1994/09/19 13:52:38 ache Exp $
*/
#include <stdio.h>
@@ -69,6 +69,7 @@ int *fdp;
#ifdef DEBUG
printf("path = %s, uid = %d, gid = %d\n", pbuf, pcr->pcr_uid, pcr->pcr_groups[0]);
+ printf ("fflag = %x, oflag = %x\n", pcr->pcr_flag, (pcr->pcr_flag)-1);
#endif
for (i = 0; i < pcr->pcr_ngroups; i++)
@@ -80,7 +81,8 @@ int *fdp;
if (seteuid(pcr->pcr_uid) < 0)
return (errno);
- fd = open(pbuf, O_RDWR|O_CREAT, 0666);
+ /* dmb convert kernel flags to oflags, see <fcntl.h> */
+ fd = open(pbuf, (pcr->pcr_flag)-1, 0777);
if (fd < 0)
error = errno;
else
diff --git a/sbin/mount_portalfs/pt_tcp.c b/sbin/mount_portalfs/pt_tcp.c
index 18a53ce..11f1453 100644
--- a/sbin/mount_portalfs/pt_tcp.c
+++ b/sbin/mount_portalfs/pt_tcp.c
@@ -36,7 +36,7 @@
*
* @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94
*
- * $Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp $
+ * $Id: pt_tcp.c,v 1.1.1.1 1994/05/26 06:34:34 rgrimes Exp $
*/
#include <stdio.h>
@@ -77,7 +77,7 @@ int *fdp;
struct in_addr **ipp;
struct in_addr *ip[2];
struct in_addr ina;
- int s_port;
+ u_short s_port;
int priv = 0;
struct sockaddr_in sain;
@@ -117,15 +117,21 @@ int *fdp;
ip[1] = 0;
ipp = ip;
}
+#ifdef DEBUG
+ printf ("inet address for %s is %s\n", host, inet_ntoa(*ipp[0]));
+#endif
sp = getservbyname(port, "tcp");
- if (sp != 0)
- s_port = sp->s_port;
+ if (sp != NULL)
+ s_port = (u_short)sp->s_port;
else {
- s_port = atoi(port);
+ s_port = htons ((u_short)strtol (port, (char**)NULL, 10));
if (s_port == 0)
return (EINVAL);
}
+#ifdef DEBUG
+ printf ("port number for %s is %d\n", port, s_port);
+#endif
bzero(&sain, sizeof(sain));
sain.sin_len = sizeof(sain);
OpenPOWER on IntegriCloud