/* * call-seq: * File.readlink(link_name) -> file_name * * Returns the name of the file referenced by the given link. * Not available on all platforms. * * File.symlink("testfile", "link2test") #=> 0 * File.readlink("link2test") #=> "testfile" */ static VALUE rb_file_s_readlink(klass, path) VALUE klass, path; { #ifdef HAVE_READLINK char *buf; int size = 100; int rv; VALUE v; SafeStringValue(path); buf = xmalloc(size); while ((rv = readlink(RSTRING(path)->ptr, buf, size)) == size #ifdef _AIX || (rv < 0 && errno == ERANGE) /* quirky behavior of GPFS */ #endif ) { size *= 2; buf = xrealloc(buf, size); } if (rv < 0) { free(buf); rb_sys_fail(RSTRING(path)->ptr); } v = rb_tainted_str_new(buf, rv); free(buf); return v; #else rb_notimplement(); return Qnil; /* not reached */ #endif }