Date: Tue, 7 May 2002 21:46:11 +0000 From: "J. Mallett" <jmallett@FreeBSD.ORG> To: "J. Mallett" <jmallett@FreeBSD.org> Cc: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/usr.bin/sed main.c sed.1 Message-ID: <20020507214610.GA30780@FreeBSD.ORG> In-Reply-To: <200205071832.g47IWJO26790@freefall.freebsd.org> References: <200205071832.g47IWJO26790@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, May 07, 2002 at 11:32:18AM -0700, J. Mallett wrote:
> jmallett 2002/05/07 11:32:18 PDT
>
> Modified files:
> usr.bin/sed main.c sed.1
> Log:
> Add a -i option to sed(1) to do inplace editing, to give us an alternative to
> Perl for such things. The key difference to Perl is that a backup extension
> *MUST* be specified, because on one hand it isn't recommended to have options
> which optionally take a parameter, and on the other hand, it'd be slightly
> unpleasent to implement proper handling for that.
>
> The difference between this and the version posted to developers@ is that it
> does handle multiple files in argv after the getopt(3) handling "correctly",
> in that the inplace editing-specific code has been moved out to a function,
> and that function is used beyond the first file in our linked list.
>
> This option has been documented as FreeBSD-specific in the manpage.
>
> Reviewed by: developers@ (got feedback from: des, fanf, sobomax, roberto,
> obrien)
> MFC after: 1 week
Patch to remove the "droppings" as jhb put it, if a nil extension is specified.
I'll implement a -I option which takes no arguments on top of this, if it looks
kosher.
freefall% cvs diff -u
cvs diff: Diffing .
Index: main.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/sed/main.c,v
retrieving revision 1.16
diff -u -r1.16 main.c
--- main.c 7 May 2002 18:32:18 -0000 1.16
+++ main.c 7 May 2002 21:36:18 -0000
@@ -320,6 +320,8 @@
fname = files->fname;
if ((f = fopen(fname, "r")) == NULL)
err(1, "%s", fname);
+ if (inplace != NULL && *inplace == '\0')
+ unlink(fname);
}
if ((c = getc(f)) != EOF) {
(void)ungetc(c, f);
@@ -366,6 +368,8 @@
fname = files->fname;
if ((f = fopen(fname, "r")) == NULL)
err(1, "%s", fname);
+ if (inplace != NULL && *inplace == '\0')
+ unlink(fname);
}
}
(void)ungetc(c, f);
@@ -427,8 +431,16 @@
return -1;
}
- strlcpy(backup, *fname, MAXPATHLEN);
- strlcat(backup, inplace, MAXPATHLEN);
+ if (*inplace == '\0') {
+ char template[] = "/tmp/sed.XXXXXXXXXX";
+
+ if (mktemp(template) == NULL)
+ err(1, "mktemp");
+ strlcpy(backup, template, MAXPATHLEN);
+ } else {
+ strlcpy(backup, *fname, MAXPATHLEN);
+ strlcat(backup, inplace, MAXPATHLEN);
+ }
input = open(*fname, O_RDONLY);
if (input == -1)
cvs diff: Diffing TEST
cvs diff: Diffing USD.doc
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020507214610.GA30780>
