forked from mirrors/tftp-hpa-google
Modernize: use sigaction() whenever possible. Remove uses of common.
bsd_signal() may not be defined, and there is really no reason to even try to use it if sigaction() is avaiable; using sigaction() guarantees the semantics we really want. Replace uses of common variables with explicit instantiation and extern declarations in a header file. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
9c0908a778
commit
1f4b33a1f7
9 changed files with 64 additions and 42 deletions
|
@ -4,7 +4,7 @@ VERSION = $(shell cat ../version)
|
||||||
-include ../MCONFIG
|
-include ../MCONFIG
|
||||||
include ../MRULES
|
include ../MRULES
|
||||||
|
|
||||||
OBJS = tftpsubs.$(O)
|
OBJS = tftpsubs.$(O) signal.$(O)
|
||||||
LIB = libcommon.a
|
LIB = libcommon.a
|
||||||
|
|
||||||
all: $(LIB)
|
all: $(LIB)
|
||||||
|
|
42
common/signal.c
Normal file
42
common/signal.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* signal.c
|
||||||
|
*
|
||||||
|
* Use sigaction() to simulate BSD signal()
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SIGACTION
|
||||||
|
|
||||||
|
sighandler_t tftp_signal(int signum, sighandler_t handler)
|
||||||
|
{
|
||||||
|
struct sigaction action, oldaction;
|
||||||
|
|
||||||
|
memset(&action, 0, sizeof action);
|
||||||
|
action.sa_handler = handler;
|
||||||
|
sigemptyset(&action.sa_mask);
|
||||||
|
sigaddset(&action.sa_mask, signum);
|
||||||
|
action.sa_flags = SA_RESTART;
|
||||||
|
|
||||||
|
if (sigaction(signum, &action, &oldaction))
|
||||||
|
return SIG_ERR;
|
||||||
|
|
||||||
|
return oldaction.sa_handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(HAVE_BSD_SIGNAL)
|
||||||
|
|
||||||
|
sighandler_t tftp_signal(int signum, sighandler_t handler)
|
||||||
|
{
|
||||||
|
return bsd_signal(signum, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* This is dangerous at best. Let's hope it works. */
|
||||||
|
sighandler_t tftp_signal(int signum, sighandler_t handler)
|
||||||
|
{
|
||||||
|
return signal(signum, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
11
config.h
11
config.h
|
@ -1,6 +1,6 @@
|
||||||
/* -*- c -*- ------------------------------------------------------------- *
|
/* -*- c -*- ------------------------------------------------------------- *
|
||||||
*
|
*
|
||||||
* Copyright 2001-2006 H. Peter Anvin - All Rights Reserved
|
* Copyright 2001-2024 H. Peter Anvin - All Rights Reserved
|
||||||
*
|
*
|
||||||
* This program is free software available under the same license
|
* This program is free software available under the same license
|
||||||
* as the "OpenBSD" operating system, distributed at
|
* as the "OpenBSD" operating system, distributed at
|
||||||
|
@ -279,9 +279,14 @@ typedef int socklen_t;
|
||||||
void *xmalloc(size_t);
|
void *xmalloc(size_t);
|
||||||
char *xstrdup(const char *);
|
char *xstrdup(const char *);
|
||||||
|
|
||||||
#ifndef HAVE_BSD_SIGNAL
|
#ifndef HAVE_SIGHANDLER_T
|
||||||
void (*bsd_signal(int, void (*)(int))) (int);
|
typedef void (*sighandler_t)(int);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef SIG_ERR
|
||||||
|
#define SIG_ERR NULL
|
||||||
|
#endif
|
||||||
|
sighandler_t tftp_signal(int, sighandler_t);
|
||||||
|
|
||||||
#ifndef HAVE_DUP2
|
#ifndef HAVE_DUP2
|
||||||
int dup2(int, int);
|
int dup2(int, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -89,6 +89,9 @@ AC_CHECK_FUNCS(setreuid)
|
||||||
AC_CHECK_FUNCS(setregid)
|
AC_CHECK_FUNCS(setregid)
|
||||||
AC_CHECK_FUNCS(initgroups)
|
AC_CHECK_FUNCS(initgroups)
|
||||||
AC_CHECK_FUNCS(setgroups)
|
AC_CHECK_FUNCS(setgroups)
|
||||||
|
AC_CHECK_FUNCS(sigaction)
|
||||||
|
AC_CHECK_FUNCS(bsd_signal)
|
||||||
|
AC_CHECK_TYPES(sighandler_t)
|
||||||
|
|
||||||
dnl Solaris 8 has [u]intmax_t but not strtoumax(). How utterly braindamaged.
|
dnl Solaris 8 has [u]intmax_t but not strtoumax(). How utterly braindamaged.
|
||||||
AC_CHECK_FUNCS(strtoumax)
|
AC_CHECK_FUNCS(strtoumax)
|
||||||
|
@ -120,7 +123,6 @@ OBJROOT=`pwd`
|
||||||
XTRA=false
|
XTRA=false
|
||||||
PA_SEARCH_LIBS_AND_ADD(xmalloc, iberty)
|
PA_SEARCH_LIBS_AND_ADD(xmalloc, iberty)
|
||||||
PA_SEARCH_LIBS_AND_ADD(xstrdup, iberty)
|
PA_SEARCH_LIBS_AND_ADD(xstrdup, iberty)
|
||||||
PA_SEARCH_LIBS_AND_ADD(bsd_signal, bsd, bsdsignal)
|
|
||||||
PA_SEARCH_LIBS_AND_ADD(getopt_long, getopt, getopt_long)
|
PA_SEARCH_LIBS_AND_ADD(getopt_long, getopt, getopt_long)
|
||||||
PA_SEARCH_LIBS_AND_ADD(getaddrinfo, [nsl resolv])
|
PA_SEARCH_LIBS_AND_ADD(getaddrinfo, [nsl resolv])
|
||||||
if $pa_add_getaddrinfo
|
if $pa_add_getaddrinfo
|
||||||
|
|
|
@ -25,5 +25,3 @@ libxtra.a: $(LIBOBJS)
|
||||||
-rm -f libxtra.a
|
-rm -f libxtra.a
|
||||||
$(AR) libxtra.a $(LIBOBJS)
|
$(AR) libxtra.a $(LIBOBJS)
|
||||||
$(RANLIB) libxtra.a
|
$(RANLIB) libxtra.a
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
/*
|
|
||||||
* bsdsignal.c
|
|
||||||
*
|
|
||||||
* Use sigaction() to simulate BSD signal()
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
void (*bsd_signal(int signum, void (*handler) (int))) (int) {
|
|
||||||
struct sigaction action, oldaction;
|
|
||||||
|
|
||||||
memset(&action, 0, sizeof action);
|
|
||||||
action.sa_handler = handler;
|
|
||||||
sigemptyset(&action.sa_mask);
|
|
||||||
sigaddset(&action.sa_mask, signum);
|
|
||||||
action.sa_flags = SA_RESTART;
|
|
||||||
|
|
||||||
if (sigaction(signum, &action, &oldaction) == -1) {
|
|
||||||
#ifdef SIG_ERR
|
|
||||||
return SIG_ERR;
|
|
||||||
#else
|
|
||||||
return NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return oldaction.sa_handler;
|
|
||||||
}
|
|
|
@ -31,10 +31,13 @@
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RECVFILE_H
|
#ifndef EXTERN_H
|
||||||
#define RECVFILE_H
|
#define EXTERN_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
void tftp_recvfile(int, const char *, const char *);
|
void tftp_recvfile(int, const char *, const char *);
|
||||||
void tftp_sendfile(int, const char *, const char *);
|
void tftp_sendfile(int, const char *, const char *);
|
||||||
|
extern sigjmp_buf toplevel;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -305,7 +305,7 @@ int main(int argc, char *argv[])
|
||||||
sp->s_proto = (char *)"udp";
|
sp->s_proto = (char *)"udp";
|
||||||
}
|
}
|
||||||
|
|
||||||
bsd_signal(SIGINT, intr);
|
tftp_signal(SIGINT, intr);
|
||||||
|
|
||||||
if (peerargc) {
|
if (peerargc) {
|
||||||
/* Set peer */
|
/* Set peer */
|
||||||
|
@ -768,7 +768,7 @@ void intr(int sig)
|
||||||
{
|
{
|
||||||
(void)sig; /* Quiet unused warning */
|
(void)sig; /* Quiet unused warning */
|
||||||
|
|
||||||
bsd_signal(SIGALRM, SIG_IGN);
|
tftp_signal(SIGALRM, SIG_IGN);
|
||||||
alarm(0);
|
alarm(0);
|
||||||
siglongjmp(toplevel, -1);
|
siglongjmp(toplevel, -1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,8 +48,7 @@ extern int maxtimeout;
|
||||||
#define PKTSIZE SEGSIZE+4
|
#define PKTSIZE SEGSIZE+4
|
||||||
char ackbuf[PKTSIZE];
|
char ackbuf[PKTSIZE];
|
||||||
int timeout;
|
int timeout;
|
||||||
sigjmp_buf toplevel;
|
static sigjmp_buf timeoutbuf;
|
||||||
sigjmp_buf timeoutbuf;
|
|
||||||
|
|
||||||
static void nak(int, const char *);
|
static void nak(int, const char *);
|
||||||
static int makerequest(int, const char *, struct tftphdr *, const char *);
|
static int makerequest(int, const char *, struct tftphdr *, const char *);
|
||||||
|
@ -85,7 +84,7 @@ void tftp_sendfile(int fd, const char *name, const char *mode)
|
||||||
is_request = 1; /* First packet is the actual WRQ */
|
is_request = 1; /* First packet is the actual WRQ */
|
||||||
amount = 0;
|
amount = 0;
|
||||||
|
|
||||||
bsd_signal(SIGALRM, timer);
|
tftp_signal(SIGALRM, timer);
|
||||||
do {
|
do {
|
||||||
if (is_request) {
|
if (is_request) {
|
||||||
size = makerequest(WRQ, name, dp, mode) - 4;
|
size = makerequest(WRQ, name, dp, mode) - 4;
|
||||||
|
@ -191,7 +190,7 @@ void tftp_recvfile(int fd, const char *name, const char *mode)
|
||||||
firsttrip = 1;
|
firsttrip = 1;
|
||||||
amount = 0;
|
amount = 0;
|
||||||
|
|
||||||
bsd_signal(SIGALRM, timer);
|
tftp_signal(SIGALRM, timer);
|
||||||
do {
|
do {
|
||||||
if (firsttrip) {
|
if (firsttrip) {
|
||||||
size = makerequest(RRQ, name, ap, mode);
|
size = makerequest(RRQ, name, ap, mode);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue