summaryrefslogtreecommitdiff
path: root/server/bdump.c
diff options
context:
space:
mode:
authorGravatar Richard Basch <probe@mit.edu>1994-08-01 04:42:17 +0000
committerGravatar Richard Basch <probe@mit.edu>1994-08-01 04:42:17 +0000
commit0398e01a5032434abef05a26e2f9eeb058fecb31 (patch)
tree33357d7224ffe50ca69fae66053d80df4a150510 /server/bdump.c
parent6c547bc312ef528815040e42ca5e80233ff98265 (diff)
Don't do signal blocking; simply set a semaphore flag indicating it is
in critical code, and let the main loop deal with the flag being set. This saves on context switches into the kernel for this rare condition.
Diffstat (limited to 'server/bdump.c')
-rw-r--r--server/bdump.c91
1 files changed, 27 insertions, 64 deletions
diff --git a/server/bdump.c b/server/bdump.c
index 0fdb277..e304933 100644
--- a/server/bdump.c
+++ b/server/bdump.c
@@ -87,12 +87,7 @@ static int net_read P((FILE *f, register char *buf, register int len));
static int net_write P((FILE *f, register char *buf, int len));
static int setup_file_pointers P((void));
static void shutdown_file_pointers P((void));
-
-#ifdef POSIX
-static void cleanup P((ZServerDesc_t *server, sigset_t *omask));
-#else
-static void cleanup P((ZServerDesc_t *server, int *omask));
-#endif
+static void cleanup P((ZServerDesc_t *server));
#ifdef KERBEROS
static int get_tgt P((void));
@@ -240,10 +235,7 @@ bdump_send()
int fromlen = sizeof(from);
int on = 1;
#ifdef POSIX
- sigset_t mask, omask;
struct sigaction action;
-#else
- int omask;
#endif
#ifdef KERBEROS
@@ -272,16 +264,13 @@ bdump_send()
#endif
#ifdef POSIX
- (void) sigemptyset(&mask);
- (void) sigaddset(&mask, SIGFPE);
- (void) sigprocmask(SIG_BLOCK, &mask, &omask);
-
- action.sa_flags = 0;
(void) sigemptyset(&action.sa_mask);
+ action.sa_flags = 0;
action.sa_handler = SIG_IGN;
(void) sigaction(SIGPIPE, &action, NULL);
+
+ START_CRITICAL_CODE;
#else
- omask = sigblock(sigmask(SIGFPE)); /* don't let ascii dumps start */
(void) signal(SIGPIPE, SIG_IGN); /* so we can detect failures */
#endif
@@ -349,11 +338,11 @@ bdump_send()
{
syslog(LOG_ERR, "bdump_send: getkdata: %s",
krb_err_txt[retval]);
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if (get_tgt()) {
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if (strcmp(kdata.pname,SERVER_SERVICE) ||
@@ -362,7 +351,7 @@ bdump_send()
{
syslog(LOG_ERR, "bdump_send: peer not zephyr: %s.%s@%s",
kdata.pname, kdata.pinst, kdata.prealm);
- cleanup(server, &omask);
+ cleanup(server);
return;
}
/* authenticate back */
@@ -371,7 +360,7 @@ bdump_send()
{
syslog(LOG_ERR,"bdump_send: SendKerberosData: %s",
error_message (retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#else /* !KERBEROS */
@@ -379,7 +368,7 @@ bdump_send()
(fromport < (IPPORT_RESERVED / 2))) {
syslog(LOG_ERR, "bdump_send: bad port from peer: %d",
fromport);
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#endif /* KERBEROS */
@@ -387,19 +376,19 @@ bdump_send()
if ((retval = setup_file_pointers()) != 0) {
syslog (LOG_WARNING, "bdump_send: can't set up file pointers: %s",
error_message (retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if ((retval = sbd_loop(&from)) != ZERR_NONE) {
syslog(LOG_WARNING, "bdump_send: sbd_loop failed: %s",
error_message(retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if ((retval = gbd_loop(server)) != ZERR_NONE) {
syslog(LOG_WARNING, "bdump_send: gbd_loop failed: %s",
error_message(retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#if 1
@@ -429,11 +418,7 @@ bdump_send()
/* Now that we are finished dumping, send all the queued packets */
server_send_queue(server);
#endif
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
return;
}
@@ -450,9 +435,6 @@ bdump_get_v1_guts (notice, auth, who, server)
int on = 1;
#ifdef POSIX
struct sigaction action;
- sigset_t mask, omask;
-#else
- int omask;
#endif
#ifdef KERBEROS
KTEXT_ST ticket;
@@ -498,19 +480,13 @@ bdump_get_v1_guts (notice, auth, who, server)
server->zs_dumping = 0;
return;
}
-#ifdef POSIX
- sigemptyset(&mask);
- sigaddset(&mask, SIGFPE);
- sigprocmask(SIG_BLOCK, &mask, &omask);
-#else
- omask = sigblock(sigmask(SIGFPE)); /* don't let ascii dumps start */
-#endif
+ START_CRITICAL_CODE;
#ifndef KERBEROS
if (ntohs(from.sin_port) > IPPORT_RESERVED ||
ntohs(from.sin_port) < IPPORT_RESERVED / 2) {
syslog(LOG_ERR, "bdump_get: port not reserved: %d",
ntohs(from.sin_port));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
live_socket = rresvport(&reserved_port);
@@ -519,12 +495,12 @@ bdump_get_v1_guts (notice, auth, who, server)
#endif /* KERBEROS */
if (live_socket < 0) {
syslog(LOG_ERR, "bdump_get: socket: %m");
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if (connect(live_socket, (struct sockaddr *) &from, sizeof(from))) {
syslog(LOG_ERR, "bdump_get: connect: %m");
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if (setsockopt(live_socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&on,
@@ -540,7 +516,7 @@ bdump_get_v1_guts (notice, auth, who, server)
#ifdef KERBEROS
/* send an authenticator */
if (get_tgt()) {
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if ((retval = SendKerberosData(live_socket, &ticket,
@@ -548,7 +524,7 @@ bdump_get_v1_guts (notice, auth, who, server)
{
syslog(LOG_ERR,"bdump_get: %s",
error_message (retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#if 1
@@ -561,7 +537,7 @@ bdump_get_v1_guts (notice, auth, who, server)
!= KSUCCESS)
{
syslog(LOG_ERR, "bdump_get getkdata: %s",krb_err_txt[retval]);
- cleanup(server, &omask);
+ cleanup(server);
return;
}
/* my_realm is filled in inside get_tgt() */
@@ -572,20 +548,20 @@ bdump_get_v1_guts (notice, auth, who, server)
syslog(LOG_ERR,
"bdump_get: peer not zephyr in lrealm: %s.%s@%s",
kdata.pname, kdata.pinst,kdata.prealm);
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#endif /* KERBEROS */
if ((retval = setup_file_pointers()) != 0) {
syslog (LOG_WARNING, "bdump_get: can't set up file pointers: %s",
error_message (retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
if ((retval = gbd_loop(server)) != ZERR_NONE) {
syslog(LOG_WARNING, "bdump_get: gbd_loop failed: %s",
error_message(retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#if 1
@@ -594,7 +570,7 @@ bdump_get_v1_guts (notice, auth, who, server)
if ((retval = sbd_loop(&from)) != ZERR_NONE) {
syslog(LOG_WARNING, "sbd_loop failed: %s",
error_message(retval));
- cleanup(server, &omask);
+ cleanup(server);
return;
}
#if 1
@@ -623,11 +599,7 @@ bdump_get_v1_guts (notice, auth, who, server)
server_send_queue(server);
#endif
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
return;
}
@@ -801,13 +773,8 @@ shutdown_file_pointers () {
}
static void
-cleanup(server, omask)
+cleanup(server)
ZServerDesc_t *server;
-#ifdef POSIX
- sigset_t *omask;
-#else
- int *omask;
-#endif
{
#ifdef POSIX
struct sigaction action;
@@ -836,11 +803,7 @@ cleanup(server, omask)
#ifdef CONCURRENT
/* XXX need to flush the server and the updates to it */
#endif
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, omask, (sigset_t *)0);
-#else
- (void) sigsetmask(*omask);
-#endif
+ END_CRITICAL_CODE;
return;
}