From owner-freebsd-bugs Mon Jun 22 11:32:49 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id LAA22494 for freebsd-bugs-outgoing; Mon, 22 Jun 1998 11:32:49 -0700 (PDT) (envelope-from owner-freebsd-bugs@FreeBSD.ORG) Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id LAA22334 for ; Mon, 22 Jun 1998 11:31:48 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.8.8/8.8.5) id LAA28273; Mon, 22 Jun 1998 11:30:02 -0700 (PDT) Date: Mon, 22 Jun 1998 11:30:02 -0700 (PDT) Message-Id: <199806221830.LAA28273@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.ORG From: Stefan Eggers Subject: Re: bin/7020: pkg_*'s error handling is broken Reply-To: Stefan Eggers Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR bin/7020; it has been noted by GNATS. From: Stefan Eggers To: FreeBSD-gnats-submit@FreeBSD.ORG Cc: seggers@semyam.dinoco.de Subject: Re: bin/7020: pkg_*'s error handling is broken Date: Mon, 22 Jun 1998 20:24:40 +0200 Hi! Now I have a diff ready to fix the problem. If a context diff is preferable I'll make those the next time I send something in. Stefan. diff -ru pkg_install/add/perform.c pkg_install.NEW/add/perform.c --- pkg_install/add/perform.c Mon Feb 16 18:41:31 1998 +++ pkg_install.NEW/add/perform.c Mon Jun 22 20:06:06 1998 @@ -39,8 +39,8 @@ { int i, err_cnt = 0; - signal(SIGINT, cleanup); - signal(SIGHUP, cleanup); + signal(SIGINT, signalcleanup); + signal(SIGHUP, signalcleanup); if (AddMode == SLAVE) err_cnt = pkg_do(NULL); @@ -480,5 +480,11 @@ vsystem("%s -rf %s", REMOVE_CMD, LogDir); leave_playpen(); } +} + +void +signalcleanup(int signo) +{ + cleanup(signo); exit(1); } diff -ru pkg_install/create/perform.c pkg_install.NEW/create/perform.c --- pkg_install/create/perform.c Mon Feb 16 18:41:38 1998 +++ pkg_install.NEW/create/perform.c Mon Jun 22 20:11:09 1998 @@ -118,8 +118,8 @@ /* Make a directory to stomp around in */ home = make_playpen(PlayPen, 0); - signal(SIGINT, cleanup); - signal(SIGHUP, cleanup); + signal(SIGINT, signalcleanup); + signal(SIGHUP, signalcleanup); /* Make first "real contents" pass over it */ check_list(home, &plist); @@ -288,13 +288,21 @@ /* Clean up those things that would otherwise hang around */ void -cleanup(int sig) +cleanup(int signo) { - int in_cleanup = 0; + static int in_cleanup = 0; if (!in_cleanup) { in_cleanup = 1; + if (signo) + printf("Signal %d received, cleaning up..\n", signo); leave_playpen(); } +} + +void +signalcleanup(int signo) +{ + cleanup(signo); exit(1); } diff -ru pkg_install/delete/perform.c pkg_install.NEW/delete/perform.c --- pkg_install/delete/perform.c Mon Oct 13 17:06:12 1997 +++ pkg_install.NEW/delete/perform.c Mon Jun 22 20:10:09 1998 @@ -162,7 +162,6 @@ cleanup(int sig) { /* Nothing to do */ - exit(1); } static void diff -ru pkg_install/info/perform.c pkg_install.NEW/info/perform.c --- pkg_install/info/perform.c Mon Feb 16 18:41:44 1998 +++ pkg_install.NEW/info/perform.c Mon Jun 22 20:16:35 1998 @@ -36,7 +36,8 @@ int i, err_cnt = 0; char *tmp; - signal(SIGINT, cleanup); + signal(SIGINT, signalcleanup); + signal(SIGHUP, signalcleanup); tmp = getenv(PKG_DBDIR); if (!tmp) @@ -207,5 +208,11 @@ in_cleanup = 1; leave_playpen(); } +} + +void +signalcleanup(int sig) +{ + cleanup(sig); exit(1); } diff -ru pkg_install/lib/lib.h pkg_install.NEW/lib/lib.h --- pkg_install/lib/lib.h Mon Feb 16 18:41:51 1998 +++ pkg_install.NEW/lib/lib.h Mon Jun 22 16:19:30 1998 @@ -106,6 +106,7 @@ /* Misc */ int vsystem(const char *, ...); void cleanup(int); +void signalcleanup(int); char *make_playpen(char *, size_t); char *where_playpen(void); void leave_playpen(void); diff -ru pkg_install/lib/msg.c pkg_install.NEW/lib/msg.c --- pkg_install/lib/msg.c Mon Mar 9 13:31:15 1998 +++ pkg_install.NEW/lib/msg.c Mon Jun 22 16:27:42 1998 @@ -33,6 +33,7 @@ { warn("fatal error during execution: %s", err); cleanup(0); + exit(1); } /* @@ -55,6 +56,7 @@ if (!tty) { warnx("can't open /dev/tty!"); cleanup(0); + exit(1); } while (ch != 'Y' && ch != 'N') { vfprintf(stderr, msg, args); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message