Date: Sat, 30 Mar 2002 03:00:14 -0800 (PST) From: "Tim J. Robbins" <tim@robbins.dropbear.id.au> To: freebsd-standards@FreeBSD.org Subject: Re: standards/36191: P1003.1-2001 csplit utility Message-ID: <200203301100.g2UB0EW11994@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR standards/36191; it has been noted by GNATS.
From: "Tim J. Robbins" <tim@robbins.dropbear.id.au>
To: Stefan Farfeleder <e0026813@stud3.tuwien.ac.at>
Cc: freebsd-gnats-submit@FreeBSD.ORG
Subject: Re: standards/36191: P1003.1-2001 csplit utility
Date: Sat, 30 Mar 2002 21:49:24 +1100
On Wed, Mar 27, 2002 at 06:10:03AM -0800, Stefan Farfeleder wrote:
> * Posix says: ``An error shall be reported if an operand does not
> reference a line between the current position and the end of the
> file.''
> csplit now reports "out of range" if EOF is found before the line it
> is looking for.
>
> * The computation of 10 ** sufflen does not used signed overflow.
>
> * There's a single call to ftell, all others are ftello. I think this
> was a typo.
Thanks for pointing these out.
> Issues to be resolved:
>
> * Posix requires removal of output files on SIGHUP, SIGINT and SIGTERM.
> A simple handler calling cleanup() would do this. [Is there any danger
> in calling snprintf() from a signal handler?]
>
> * I think a matching re on the very first line must create an empty file
> xx00.
I have now fixed both of these. The manual page for sigaction doesn't say its
safe to call snprintf() from a signal handler, but it still looks safe to
do it. The alternatives are messy, less efficient, and would take longer to
die after receiving the signal.
--- csplit.c 2002/03/30 09:48:18 1.22
+++ csplit.c 2002/03/30 10:47:22 1.27
@@ -1,4 +1,4 @@
-/*-
+*-
* Copyright (c) 2002 Tim J. Robbins.
* All rights reserved.
*
@@ -44,7 +44,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-__RCSID("$Id: csplit.c,v 1.22 2002/03/30 09:48:18 tim Exp $");
+__RCSID("$Id: csplit.c,v 1.27 2002/03/30 10:47:22 tim Exp $");
#include <sys/types.h>
@@ -53,6 +53,7 @@
#include <errno.h>
#include <limits.h>
#include <regex.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -62,6 +63,7 @@
void do_lineno(const char *expr);
void do_rexp(const char *expr);
char *getline(void);
+void handlesig(int sig);
FILE *newfile(void);
void toomuch(FILE *ofp, long n);
void usage(void);
@@ -87,6 +89,17 @@
FILE *overfile; /* Overflow file for toomuch() */
off_t truncofs; /* Offset this file should be truncated at */
int doclean; /* Should cleanup() remove output? */
+int doneregexp; /* Matched a regular expression pat. yet? */
+
+void
+handlesig(int sig)
+{
+ const char msg[] = "Caught fatal signal, cleaning up\n";
+
+ write(STDERR_FILENO, msg, sizeof(msg) - 1);
+ cleanup();
+ _exit(2);
+}
/* Create a new output file */
FILE *
@@ -245,13 +258,14 @@
while ((p = getline()) != NULL) {
if (fputs(p, ofp) != 0)
break;
- if (!first && regexec(&cre, p, 0, NULL, 0) == 0)
+ if ((doneregexp || !first) && regexec(&cre, p, 0, NULL, 0) == 0)
break;
first = 0;
}
+ doneregexp = 1;
if (p == NULL)
- errx(1, "%s: out of range", expr);
+ errx(1, "%s: no match", re);
if (ofs <= 0) {
/*
@@ -369,12 +383,16 @@
if (!kflag) {
doclean = 1;
atexit(cleanup);
+ signal(SIGHUP, handlesig);
+ signal(SIGINT, handlesig);
+ signal(SIGTERM, handlesig);
}
lineno = 0;
nfiles = 0;
truncofs = 0;
overfile = NULL;
+ doneregexp = 0;
for (maxfiles = 1, i = 0; i < sufflen; i++) {
if (maxfiles > LONG_MAX / 10)
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203301100.g2UB0EW11994>
