Skip to content

Commit

Permalink
* util.c, include/ruby/util.h (ruby_add_suffix): remove the function.
Browse files Browse the repository at this point in the history
  [Bug ruby#5153] [ruby-core:38736]

* io.c (argf_next_argv): remove the call of above function.

* ext/-test-/add_suffix, test/-ext-/test_add_suffix.rb: remove the test
  extension module because this is only for testsing ruby_add_suffix().

* LEGAL: remove the mention about a part of util.c, because now we
  removed the part.

* io.c (argf_next_argv): now the new filename is not guranteed to
  use, so should check the return value of rename(2).

* test/ruby/test_argf.rb (TestArgf#test_inplace_rename_impossible):
  now we expect same result with other platforms on no_safe_rename
  platforms (=Windows).


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32826 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
unak committed Aug 3, 2011
1 parent f0fbf6c commit f9e9eee
Show file tree
Hide file tree
Showing 10 changed files with 29 additions and 277 deletions.
20 changes: 20 additions & 0 deletions ChangeLog
@@ -1,3 +1,23 @@
Wed Aug 3 16:01:35 2011 NAKAMURA Usaku <usa@ruby-lang.org>

* util.c, include/ruby/util.h (ruby_add_suffix): remove the function.
[Bug #5153] [ruby-core:38736]

* io.c (argf_next_argv): remove the call of above function.

* ext/-test-/add_suffix, test/-ext-/test_add_suffix.rb: remove the test
extension module because this is only for testsing ruby_add_suffix().

* LEGAL: remove the mention about a part of util.c, because now we
removed the part.

* io.c (argf_next_argv): now the new filename is not guranteed to
use, so should check the return value of rename(2).

* test/ruby/test_argf.rb (TestArgf#test_inplace_rename_impossible):
now we expect same result with other platforms on no_safe_rename
platforms (=Windows).

Wed Aug 3 09:18:08 2011 URABE Shyouhei <shyouhei@ruby-lang.org>

* test/xmlrpc/webrick_testing.rb (WEBrick_Testing#start_server):
Expand Down
1 change: 0 additions & 1 deletion LEGAL
Expand Up @@ -148,7 +148,6 @@ util.c (partly):
REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.

util.c (partly):
win32/win32.[ch]:

You can apply the Artistic License to these files. (or GPL,
Expand Down
22 changes: 0 additions & 22 deletions ext/-test-/add_suffix/bug.c

This file was deleted.

1 change: 0 additions & 1 deletion ext/-test-/add_suffix/depend

This file was deleted.

4 changes: 0 additions & 4 deletions ext/-test-/add_suffix/extconf.rb

This file was deleted.

4 changes: 0 additions & 4 deletions include/ruby/util.h
Expand Up @@ -54,10 +54,6 @@ unsigned long ruby_scan_oct(const char *, size_t, size_t *);
#define scan_hex(s,l,e) ((int)ruby_scan_hex((s),(l),(e)))
unsigned long ruby_scan_hex(const char *, size_t, size_t *);

#if defined(__CYGWIN32__) || defined(_WIN32)
void ruby_add_suffix(VALUE str, const char *suffix);
#endif

void ruby_qsort(void *, const size_t, const size_t,
int (*)(const void *, const void *, void *), void *);

Expand Down
14 changes: 5 additions & 9 deletions io.c
Expand Up @@ -35,10 +35,6 @@
# define NO_SAFE_RENAME
#endif

#if defined(__CYGWIN__) || defined(_WIN32)
# define NO_LONG_FNAME
#endif

#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(sun) || defined(_nec_ews)
# define USE_SETVBUF
#endif
Expand Down Expand Up @@ -6893,15 +6889,15 @@ argf_next_argv(VALUE argf)
fstat(fr, &st);
if (*ARGF.inplace) {
str = rb_str_new2(fn);
#ifdef NO_LONG_FNAME
ruby_add_suffix(str, ARGF.inplace);
#else
rb_str_cat2(str, ARGF.inplace);
#endif
#ifdef NO_SAFE_RENAME
(void)close(fr);
(void)unlink(RSTRING_PTR(str));
(void)rename(fn, RSTRING_PTR(str));
if (rename(fn, RSTRING_PTR(str)) < 0) {
rb_warn("Can't rename %s to %s: %s, skipping file",
fn, RSTRING_PTR(str), strerror(errno));
goto retry;
}
fr = rb_sysopen(str, O_RDONLY, 0);
#else
if (rename(fn, RSTRING_PTR(str)) < 0) {
Expand Down
47 changes: 0 additions & 47 deletions test/-ext-/test_add_suffix.rb

This file was deleted.

15 changes: 4 additions & 11 deletions test/ruby/test_argf.rb
Expand Up @@ -201,21 +201,14 @@ def test_inplace_rename_impossible
t = make_tempfile

assert_in_out_err(["-", t.path], <<-INPUT) do |r, e|
ARGF.inplace_mode = '/\\\\'
ARGF.inplace_mode = '/\\\\:'
while line = ARGF.gets
puts line.chomp + '.new'
end
INPUT
if no_safe_rename
assert_equal([], e)
assert_equal([], r)
assert_equal("foo.new\nbar.new\nbaz.new\n", File.read(t.path))
File.unlink(t.path + ".~~~") rescue nil
else
assert_match(/Can't rename .* to .*: .*. skipping file/, e.first) #'
assert_equal([], r)
assert_equal("foo\nbar\nbaz\n", File.read(t.path))
end
assert_match(/Can't rename .* to .*: .*. skipping file/, e.first) #'
assert_equal([], r)
assert_equal("foo\nbar\nbaz\n", File.read(t.path))
end
end

Expand Down
178 changes: 0 additions & 178 deletions util.c
Expand Up @@ -184,184 +184,6 @@ ruby_strtoul(const char *str, char **endptr, int base)
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif

#if defined(__CYGWIN32__) || defined(_WIN32)
/*
* Copyright (c) 1993, Intergraph Corporation
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the perl README file.
*
* Various Unix compatibility functions and NT specific functions.
*
* Some of this code was derived from the MSDOS port(s) and the OS/2 port.
*
*/


/*
* Suffix appending for in-place editing under MS-DOS and OS/2 (and now NT!).
*
* Here are the rules:
*
* Style 0: Append the suffix exactly as standard perl would do it.
* If the filesystem groks it, use it. (HPFS will always
* grok it. So will NTFS. FAT will rarely accept it.)
*
* Style 1: The suffix begins with a '.'. The extension is replaced.
* If the name matches the original name, use the fallback method.
*
* Style 2: The suffix is a single character, not a '.'. Try to add the
* suffix to the following places, using the first one that works.
* [1] Append to extension.
* [2] Append to filename,
* [3] Replace end of extension,
* [4] Replace end of filename.
* If the name matches the original name, use the fallback method.
*
* Style 3: Any other case: Ignore the suffix completely and use the
* fallback method.
*
* Fallback method: Change the extension to ".$$$". If that matches the
* original name, then change the extension to ".~~~".
*
* If filename is more than 1000 characters long, we die a horrible
* death. Sorry.
*
* The filename restriction is a cheat so that we can use buf[] to store
* assorted temporary goo.
*
* Examples, assuming style 0 failed.
*
* suffix = ".bak" (style 1)
* foo.bar => foo.bak
* foo.bak => foo.$$$ (fallback)
* makefile => makefile.bak
* suffix = ".$$$" (style 1)
* foo.$$$ => foo.~~~ (fallback)
*
* suffix = "~" (style 2)
* foo.c => foo.c~
* foo.c~ => foo.c~~
* foo.c~~ => foo~.c~~
* foo~.c~~ => foo~~.c~~
* foo~~~~~.c~~ => foo~~~~~.$$$ (fallback)
*
* foo.pas => foo~.pas
* makefile => makefile.~
* longname.fil => longname.fi~
* longname.fi~ => longnam~.fi~
* longnam~.fi~ => longnam~.$$$
*
*/


static int valid_filename(const char *s);

static const char suffix1[] = ".$$$";
static const char suffix2[] = ".~~~";

#define strEQ(s1,s2) (strcmp((s1),(s2)) == 0)

void
ruby_add_suffix(VALUE str, const char *suffix)
{
long baselen;
long extlen = strlen(suffix);
long slen;
char buf[1024];
const char *name;
const char *ext;
long len;

name = StringValueCStr(str);
slen = strlen(name);
if (slen > (long)(sizeof(buf) - 1))
rb_fatal("Cannot do inplace edit on long filename (%ld characters)",
slen);

/* Style 0 */
rb_str_cat(str, suffix, extlen);
if (valid_filename(RSTRING_PTR(str))) return;

/* Fooey, style 0 failed. Fix str before continuing. */
rb_str_resize(str, slen);
name = StringValueCStr(str);
ext = ruby_find_extname(name, &len);

if (*suffix == '.') { /* Style 1 */
if (ext) {
if (strEQ(ext, suffix)) {
extlen = sizeof(suffix1) - 1; /* suffix2 must be same length */
suffix = strEQ(suffix, suffix1) ? suffix2 : suffix1;
}
slen = ext - name;
}
rb_str_resize(str, slen);
rb_str_cat(str, suffix, extlen);
}
else {
char *p = buf, *q;
strncpy(buf, name, slen);
if (ext)
p += (ext - name);
else
p += slen;
p[len] = '\0';
if (suffix[1] == '\0') { /* Style 2 */
q = (char *)ruby_find_basename(buf, &baselen, 0);
if (len <= 3) {
if (len == 0 && baselen >= 8 && p + 3 <= buf + sizeof(buf)) p[len++] = '.'; /* DOSISH */
p[len] = *suffix;
p[++len] = '\0';
}
else if (q && baselen < 8) {
q += baselen;
*q++ = *suffix;
if (ext) {
strncpy(q, ext, ext - name);
q[ext - name + 1] = '\0';
}
else
*q = '\0';
}
else if (len == 4 && p[3] != *suffix)
p[3] = *suffix;
else if (baselen == 8 && q[7] != *suffix)
q[7] = *suffix;
else
goto fallback;
}
else { /* Style 3: Panic */
fallback:
(void)memcpy(p, !ext || strEQ(ext, suffix1) ? suffix2 : suffix1, 5);
}
rb_str_resize(str, strlen(buf));
memcpy(RSTRING_PTR(str), buf, RSTRING_LEN(str));
}
}

static int
valid_filename(const char *s)
{
int fd;

/*
// It doesn't exist, so see if we can open it.
*/

if ((fd = open(s, O_CREAT|O_EXCL, 0666)) >= 0) {
close(fd);
unlink(s); /* don't leave it laying around */
return 1;
}
else if (errno == EEXIST) {
/* if the file exists, then it's a valid filename! */
return 1;
}
return 0;
}
#endif


/* mm.c */

Expand Down

0 comments on commit f9e9eee

Please sign in to comment.