OBS User unknown 2007-03-10 23:09:22 +00:00 committed by Git OBS Bridge
parent 152a566ca4
commit 66fb3373f2
4 changed files with 359 additions and 12 deletions

View File

@ -0,0 +1,110 @@
Index: sed-4.1.5/lib/utils.c
===================================================================
--- sed-4.1.5.orig/lib/utils.c
+++ sed-4.1.5/lib/utils.c
@@ -97,7 +97,6 @@ panic(const char *str, ...)
{
if (open_files->temp)
{
- int fd = fileno (open_files->fp);
fclose (open_files->fp);
errno = 0;
unlink (open_files->name);
@@ -250,7 +249,7 @@ ck_getline(text, buflen, stream)
size_t *buflen;
FILE *stream;
{
- int result;
+ int result = -1;
if (!ferror (stream))
result = getline (text, buflen, stream);
@@ -312,7 +311,6 @@ void
do_ck_fclose(fp)
FILE *fp;
{
- int fd;
ck_fflush(fp);
clearerr(fp);
Index: sed-4.1.5/sed/compile.c
===================================================================
--- sed-4.1.5.orig/sed/compile.c
+++ sed-4.1.5/sed/compile.c
@@ -384,7 +384,6 @@ get_openfile(file_ptrs, mode, fail)
struct buffer *b;
char *file_name;
struct output *p;
- int is_stderr;
b = read_filename();
file_name = get_buffer(b);
@@ -457,7 +456,7 @@ snarf_char_class(b, cur_stat)
{
int ch;
int state = 0;
- int delim;
+ int delim = 0;
bool pending_mb = 0;
ch = inchar();
@@ -1581,7 +1580,6 @@ compile_file(cur_program, cmdfile)
struct vector *cur_program;
const char *cmdfile;
{
- size_t len;
struct vector *ret;
prog.file = stdin;
Index: sed-4.1.5/sed/execute.c
===================================================================
--- sed-4.1.5.orig/sed/execute.c
+++ sed-4.1.5/sed/execute.c
@@ -1062,7 +1062,7 @@ append_replacement (buf, p, regs, repl_m
curr_type &= ~REPL_MODIFIERS;
}
- if (0 <= i)
+ if (0 <= i) {
if (regs->end[i] == regs->start[i] && p->repl_type & REPL_MODIFIERS)
/* Save this modifier, we shall apply it later.
e.g. in s/()([a-z])/\u\1\2/
@@ -1073,6 +1073,7 @@ append_replacement (buf, p, regs, repl_m
str_append_modified(buf, line.active + regs->start[i],
CAST(size_t)(regs->end[i] - regs->start[i]),
curr_type);
+ }
}
return repl_mod;
@@ -1100,7 +1101,7 @@ do_subst(sub)
&regs, sub->max_id + 1))
return;
- if (!sub->replacement && sub->numb <= 1)
+ if (!sub->replacement && sub->numb <= 1) {
if (regs.start[0] == 0 && !sub->global)
{
/* We found a match, set the `replaced' flag. */
@@ -1119,6 +1120,7 @@ do_subst(sub)
line.length = regs.start[0];
goto post_subst;
}
+ }
do
{
@@ -1377,11 +1379,12 @@ execute_program(vec, input)
{
char buf[4096];
int n = fread (buf, sizeof(char), 4096, pipe);
- if (n > 0)
+ if (n > 0) {
if (!cmd_length)
str_append(&s_accum, buf, n);
else
ck_fwrite(buf, 1, n, output_file.fp);
+ }
}
pclose (pipe);

224
sed-follow_symlinks.patch Normal file
View File

@ -0,0 +1,224 @@
Index: sed-4.1.5/sed/sed.c
===================================================================
--- sed-4.1.5.orig/sed/sed.c
+++ sed-4.1.5/sed/sed.c
@@ -70,6 +70,11 @@ bool no_default_output = false;
/* If set, reset line counts on every new file. */
bool separate_files = false;
+#ifdef ENABLE_FOLLOW_SYMLINKS
+/* If set, follow symlinks when processing in place */
+bool follow_symlinks = false;
+#endif
+
/* How do we edit files in-place? (we don't if NULL) */
char *in_place_extension = NULL;
@@ -105,6 +110,10 @@ Usage: %s [OPTION]... {script-only-if-no
add the script to the commands to be executed\n"));
fprintf(out, _(" -f script-file, --file=script-file\n\
add the contents of script-file to the commands to be executed\n"));
+#ifdef ENABLE_FOLLOW_SYMLINKS
+ fprintf(out, _(" --follow-symlinks\n\
+ follow symlinks when processing in place\n"));
+#endif
fprintf(out, _(" -i[SUFFIX], --in-place[=SUFFIX]\n\
edit files in place (makes backup if extension supplied)\n"));
fprintf(out, _(" -l N, --line-length=N\n\
@@ -163,6 +172,9 @@ main(argc, argv)
{"unbuffered", 0, NULL, 'u'},
{"version", 0, NULL, 'v'},
{"help", 0, NULL, 'h'},
+#ifdef ENABLE_FOLLOW_SYMLINKS
+ {"follow-symlinks", 0, NULL, 'F'},
+#endif
{NULL, 0, NULL, 0}
};
@@ -215,6 +227,12 @@ main(argc, argv)
the_program = compile_file(the_program, optarg);
break;
+#ifdef ENABLE_FOLLOW_SYMLINKS
+ case 'F':
+ follow_symlinks = true;
+ break;
+#endif
+
case 'i':
separate_files = true;
if (optarg == NULL)
Index: sed-4.1.5/lib/utils.c
===================================================================
--- sed-4.1.5.orig/lib/utils.c
+++ sed-4.1.5/lib/utils.c
@@ -35,6 +35,13 @@
# include <stdlib.h>
#endif /* HAVE_STDLIB_H */
+#ifdef ENABLE_FOLLOW_SYMLINKS
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <unistd.h>
+# include <libgen.h>
+#endif /* ENABLE_FOLLOW_SYMLINKS */
+
#include "utils.h"
const char *myname;
@@ -315,6 +322,65 @@ do_ck_fclose(fp)
}
+#ifdef ENABLE_FOLLOW_SYMLINKS
+static char buf[2048], buf2[2048];
+static size_t bufsize = sizeof (buf);
+
+/* Follow symlink and panic if something fails. Returned value is
+ ultimate symlink target, stored in temporary buffer. You need to
+ strdup the return value, if you intend to use it later.*/
+const char *
+ck_follow_symlink(const char * fname)
+{
+ static struct stat statbuf;
+ int err;
+ char * dir;
+
+ if (strlen (fname) >= bufsize)
+ panic("ck_follow_symlink: file name too long");
+ strcpy (buf, fname);
+
+ while (1)
+ {
+ err = lstat (buf, &statbuf);
+
+ if (err != 0)
+ panic("ck_follow_symlink: couldn't lstat %s: %s", buf, strerror(errno));
+
+ if ((statbuf.st_mode & S_IFLNK) == S_IFLNK)
+ {
+ err = readlink (buf, buf2, bufsize);
+
+ if (err < 0)
+ panic("ck_follow_symlink: readlink failed on %s: %s", buf, strerror(errno));
+ else if (err == bufsize)
+ panic("ck_follow_symlink: pointee name too long");
+ else
+ buf2 [err] = '\0';
+
+ /* need to handle relative paths with care */
+ if (buf2[0] != '/')
+ {
+ dir = dirname (buf); // dir part of orig path
+ int len = strlen (dir); // orig path len
+ buf[len] = '/';
+ strncpy (buf+len+1, buf2, bufsize - len - 1);
+ if (buf[bufsize-1] != 0)
+ panic("ck_follow_symlink: pointee name too long");
+ }
+ else
+ {
+ strcpy (buf, buf2);
+ }
+ }
+ else
+ break;
+ }
+
+ return buf;
+}
+#endif /* ENABLE_FOLLOW_SYMLINKS */
+
/* Panic on failing rename */
void
ck_rename (from, to, unlink_if_fail)
Index: sed-4.1.5/lib/utils.h
===================================================================
--- sed-4.1.5.orig/lib/utils.h
+++ sed-4.1.5/lib/utils.h
@@ -27,6 +27,9 @@ void ck_fwrite P_((const VOID *ptr, size
size_t ck_fread P_((VOID *ptr, size_t size, size_t nmemb, FILE *stream));
void ck_fflush P_((FILE *stream));
void ck_fclose P_((FILE *stream));
+#ifdef ENABLE_FOLLOW_SYMLINKS
+const char *ck_follow_symlink P_((const char *path));
+#endif
size_t ck_getline P_((char **text, size_t *buflen, FILE *stream));
FILE * ck_mkstemp P_((char **p_filename, char *tmpdir, char *base));
void ck_rename P_((const char *from, const char *to, const char *unlink_if_fail));
Index: sed-4.1.5/sed/execute.c
===================================================================
--- sed-4.1.5.orig/sed/execute.c
+++ sed-4.1.5/sed/execute.c
@@ -711,16 +711,34 @@ closedown(input)
if (in_place_extension && output_file.fp != NULL)
{
+#ifdef ENABLE_FOLLOW_SYMLINKS
+ char *target_name;
+
+ if (follow_symlinks)
+ target_name = ck_strdup(ck_follow_symlink(input->in_file_name));
+ else
+ target_name = ck_strdup(input->in_file_name);
+#else
+ const char *target_name;
+
+ target_name = input->in_file_name;
+#endif
+
ck_fclose (output_file.fp);
if (strcmp(in_place_extension, "*") != 0)
{
- char *backup_file_name = get_backup_file_name(input->in_file_name);
- ck_rename (input->in_file_name, backup_file_name, input->out_file_name);
+ char *backup_file_name = get_backup_file_name(target_name);
+ ck_rename (target_name, backup_file_name, input->out_file_name);
+
free (backup_file_name);
}
- ck_rename (input->out_file_name, input->in_file_name, input->out_file_name);
+ ck_rename (input->out_file_name, target_name, input->out_file_name);
+
free (input->out_file_name);
+#ifdef ENABLE_FOLLOW_SYMLINKS
+ free (target_name);
+#endif
}
input->fp = NULL;
Index: sed-4.1.5/sed/sed.h
===================================================================
--- sed-4.1.5.orig/sed/sed.h
+++ sed-4.1.5/sed/sed.h
@@ -219,6 +219,11 @@ extern bool no_default_output;
/* If set, reset line counts on every new file. */
extern bool separate_files;
+#ifdef ENABLE_FOLLOW_SYMLINKS
+/* If set, follow symlinks when invoked with -i option */
+extern bool follow_symlinks;
+#endif
+
/* Do we need to be pedantically POSIX compliant? */
extern enum posixicity_types posixicity;
Index: sed-4.1.5/configure.ac
===================================================================
--- sed-4.1.5.orig/configure.ac
+++ sed-4.1.5/configure.ac
@@ -117,6 +117,13 @@ enable_html=no)
AM_CONDITIONAL(BUILD_HTML, test "x$enable_html" != xno)
+# follow symlinks
+AC_CHECK_FUNC(lstat, have_lstat=yes)
+AC_CHECK_FUNC(readlink, have_readlink=yes)
+if test "x$have_lstat" = xyes -a "x$have_readlink" = xyes; then
+ AC_DEFINE(ENABLE_FOLLOW_SYMLINKS, ,[Follow symlinks when processing in place])
+fi
+
: ${TEXI2HTML=texi2html -monolithic}
AC_SUBST(TEXI2HTML)

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Fri Mar 9 17:31:50 CET 2007 - mkoenig@suse.de
- add --follow-symlinks option [#200082]
- fix 'used uninitialized' warnings [#248721]
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Aug 7 13:55:37 CEST 2006 - jsmeix@suse.de Mon Aug 7 13:55:37 CEST 2006 - jsmeix@suse.de

View File

@ -1,7 +1,7 @@
# #
# spec file for package sed (Version 4.1.5) # spec file for package sed (Version 4.1.5)
# #
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany. # Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine # This file and all modifications and additions to the pristine
# package are under the same license as the package itself. # package are under the same license as the package itself.
# #
@ -13,21 +13,23 @@
Name: sed Name: sed
URL: http://www.gnu.org/directory/sed.html URL: http://www.gnu.org/directory/sed.html
Version: 4.1.5 Version: 4.1.5
Release: 2 Release: 29
License: GPL License: GNU General Public License (GPL)
Group: System/Base Group: System/Base
Summary: A Stream-Oriented Noninteractive Text Editor Summary: A Stream-Oriented Noninteractive Text Editor
Provides: base:/bin/sed Provides: base:/bin/sed
PreReq: %install_info_prereq PreReq: %install_info_prereq
Autoreqprov: on Autoreqprov: on
Source: %name-%version.tar.bz2 Source: %name-%version.tar.bz2
Patch0: sed-follow_symlinks.patch
Patch1: sed-4.1.5-fix_warnings.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description %description
Sed takes text input, performs some operation (or set of operations) on Sed takes text input, performs some operation (or set of operations) on
it and outputs the modified text. Sed is typically used for extracting it, and outputs the modified text. Sed is typically used for extracting
part of a file using pattern matching or substituting multiple part of a file using pattern matching or substituting multiple
occurences of a string within a file. occurrences of a string within a file.
@ -35,7 +37,7 @@ Authors:
-------- --------
Francois Pinard <pinard@iro.umontreal.ca> Francois Pinard <pinard@iro.umontreal.ca>
Tom Lord <lord@cygnus.com> Tom Lord <lord@cygnus.com>
David J. MacKenzie <djm@gnu.ai.mit.edu> David J. MacKenzie <djm@gnu.org>
Akiko Matsushita <matusita@sra.co.jp> Akiko Matsushita <matusita@sra.co.jp>
Alan Magnuson <awm@osc.edu> Alan Magnuson <awm@osc.edu>
Alexander Lehmann <alex@hal.rhein-main.de> Alexander Lehmann <alex@hal.rhein-main.de>
@ -76,15 +78,15 @@ Authors:
Mike Lijewski <lijewski@theory.tc.cornell.edu> Mike Lijewski <lijewski@theory.tc.cornell.edu>
Nick S. Kanakakor <skanan@otl.scu.edu> Nick S. Kanakakor <skanan@otl.scu.edu>
Nicolas Pioch <pioch@inf.enst.fr> Nicolas Pioch <pioch@inf.enst.fr>
Noah Friedman <friedman@gnu.ai.mit.edu> Noah Friedman <friedman@gnu.org>
Pete Chown <pete.chown@dale.dircon.co.uk> Pete Chown <pete.chown@dale.dircon.co.uk>
Pierre Gaumond <gaumondp@ere.umontreal.ca> Pierre Gaumond <gaumondp@ere.umontreal.ca>
Pierre Mathieu <mathieu@geod.emr.ca> Pierre Mathieu <mathieu@geod.emr.ca>
Robert Bernstein <rocky@panix.com> Robert Bernstein <rocky@panix.com>
Rene' Seindal <seindal@kb.dk> Rene' Seindal <seindal@kb.dk>
Richard Stallman <rms@gnu.ai.mit.edu> Richard Stallman <rms@gnu.org>
Roland H. Pesch <roland@wrs.com> Roland H. Pesch <roland@wrs.com>
Roland McGrath <roland@gnu.ai.mit.edu> Roland McGrath <roland@gnu.org>
Scott Bartram Scott Bartram
Simon Leinen <simon@lia.di.epfl.ch> Simon Leinen <simon@lia.di.epfl.ch>
Skip Montanaro <skip@automatrix.com> Skip Montanaro <skip@automatrix.com>
@ -94,7 +96,7 @@ Authors:
Tom McConnell <tmcconne@sedona.intel.com> Tom McConnell <tmcconne@sedona.intel.com>
Tom Quinn <trq@dionysos.thphys.ox.ac.uk> Tom Quinn <trq@dionysos.thphys.ox.ac.uk>
Tom Tromey <tromey@cns.caltech.edu> Tom Tromey <tromey@cns.caltech.edu>
Ulrich Drepper <drepper@gnu.ai.mit.edu> Ulrich Drepper <drepper@gnu.org>
Vern Paxson <vern@ee.lbl.gov> Vern Paxson <vern@ee.lbl.gov>
Vivek P. Singhal <singhal@cs.utexas.edu> Vivek P. Singhal <singhal@cs.utexas.edu>
Walter Wong <wcw+@cmu.edu> Walter Wong <wcw+@cmu.edu>
@ -103,6 +105,8 @@ Authors:
%prep %prep
%setup -q %setup -q
%patch0 -p1
%patch1 -p1
%build %build
%define warn_flags -Wall -Wstrict-prototypes -Wpointer-arith -Wformat-security %define warn_flags -Wall -Wstrict-prototypes -Wpointer-arith -Wformat-security
@ -154,7 +158,10 @@ rm -f $RPM_BUILD_ROOT/usr/share/doc/sed.html $RPM_BUILD_ROOT/usr/share/doc/sed-4
%postun %postun
%install_info_delete --info-dir=%_infodir %_infodir/%name.info.gz %install_info_delete --info-dir=%_infodir %_infodir/%name.info.gz
%changelog -n sed %changelog
* Fri Mar 09 2007 - mkoenig@suse.de
- add --follow-symlinks option [#200082]
- fix 'used uninitialized' warnings [#248721]
* Mon Aug 07 2006 - jsmeix@suse.de * Mon Aug 07 2006 - jsmeix@suse.de
- Updated to version 4.1.5: - Updated to version 4.1.5:
Fix parsing of a negative character class not including a closed Fix parsing of a negative character class not including a closed