Ok, here's try two. Platform specific stuff has been moved into
config/gen/platform, and non-win32 platforms use strerror_r directly.
On Fri Nov 23 01:29:35 2007, kjs wrote:
> On Nov 22, 2007 9:03 PM, Joe Sadusk via RT
> <[EMAIL PROTECTED]> wrote:
> > Reposting this because this is my first patch, and it didn't occur to me
> > that if I don't CC perl6-internals, no one would notice it.
> >
> > It turns out that strerror_r is POSIX only, and windows has the slightly
> > different strerror_s (exactly the same except the arguments are in a
> > different order). I defined a macro that abstracts this, but I don't
> > know if there's a standard header file cross platform macros like this
> > are put in, so I put it inline in the pmc. If anyone has a suggestion of
> > where this belongs, I'll gladly move it.
>
> I'm no expert on this, but in config/gen/platform, there are
> subdirectories that contain files that do platform dependent stuff.
> (I only know this because I once added
> config/gen/platform/win32/string.h, which defines a macro for strdup
> for MSVC users.)
>
> I suspect that your macro should go in a similar file, but this should
> be confirmed by someone with more knowledge on this.
>
> kjs
>
diff --git a/config/gen/platform/generic/string.h b/config/gen/platform/generic/string.h
new file mode 100644
index 0000000..8de1ca1
--- /dev/null
+++ b/config/gen/platform/generic/string.h
@@ -0,0 +1,22 @@
+/*
+ * $Id$
+ * Copyright (C) 2004-2007, The Perl Foundation.
+ */
+
+#ifndef PARROT_PLATFORM_GENERIC_STRING_H_GUARD
+#define PARROT_PLATFORM_GENERIC_STRING_H_GUARD
+
+#if defined __GLIBC__
+# define _XOPEN_SOURCE 600
+#endif
+
+#include <string.h>
+
+#endif /* PARROT_PLATFORM_GENERIC_STRING_H_GUARD */
+
+/*
+ * Local variables:
+ * c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */
diff --git a/config/gen/platform/win32/string.h b/config/gen/platform/win32/string.h
index 607745a..bd47db3 100644
--- a/config/gen/platform/win32/string.h
+++ b/config/gen/platform/win32/string.h
@@ -14,6 +14,8 @@
# endif
#endif
+#define strerror_r(errnum, buf, buflen) strerror_s(buf, buflen, errnum)
+
#endif /* PARROT_PLATFORM_WIN32_STRING_H_GUARD */
/*
diff --git a/src/pmc/file.pmc b/src/pmc/file.pmc
index 3c8d801..56be62d 100644
--- a/src/pmc/file.pmc
+++ b/src/pmc/file.pmc
@@ -27,6 +27,13 @@ C<File> is a singleton class which provides access to File functions.
/* RT#46679 Check if we need to deallocate strerror strings */
/* RT#46681 apparently, strerror_r is thread-safe and should be used instead.*/
+/* strerror_r should truncate the message if its too long for the supplied buffer
+ * its probably best to just specify a sane default buffer size than to worry
+ * about retrying calls
+ */
+#define ERRBUF_SIZE 128
+
+
static PMC *File_PMC;
pmclass File singleton {
@@ -98,7 +105,8 @@ Returns a true value (1) if the supplied path is a directory.
string_cstring_free(cpath);
if (error) {
- char *errmsg = strerror(errno);
+ char errmsg[ERRBUF_SIZE];
+ strerror_r(errno, errmsg, ERRBUF_SIZE);
real_exception(interp, NULL, E_SystemError, errmsg);
}
@@ -129,7 +137,8 @@ Returns a true value (1) if the supplied path is a plain file.
string_cstring_free(cpath);
if (error) {
- char *errmsg = strerror(errno);
+ char errmsg[ERRBUF_SIZE];
+ strerror_r(errno, errmsg, ERRBUF_SIZE);
real_exception(interp, NULL, E_SystemError, errmsg);
}
@@ -162,7 +171,8 @@ Returns a true value (1) if the supplied path is a link.
string_cstring_free(cpath);
if (error) {
- char *errmsg = strerror(errno);
+ char errmsg[ERRBUF_SIZE];
+ strerror_r(errno, errmsg, ERRBUF_SIZE);
real_exception(interp, NULL, E_SystemError, errmsg);
}
@@ -197,6 +207,8 @@ free to change or give me hints on how to change it. -- ambs
FILE *source = fopen(cfrom, "rb");
+ char errmsg[ERRBUF_SIZE];
+
if (source) {
FILE *target = fopen(cto, "w+b");
@@ -218,13 +230,13 @@ free to change or give me hints on how to change it. -- ambs
fclose(target);
}
else {
- char *errmsg = strerror(errno);
+ strerror_r(errno, errmsg, ERRBUF_SIZE);
real_exception(interp, NULL, E_SystemError, errmsg);
}
fclose(source);
}
else {
- char *errmsg = strerror(errno);
+ strerror_r(errno, errmsg, ERRBUF_SIZE);
real_exception(interp, NULL, E_SystemError, errmsg);
}
string_cstring_free(cfrom);
@@ -251,7 +263,8 @@ Rename a file C<from> to the path C<to>.
string_cstring_free(cto);
if (error) {
- char *errmsg = strerror(errno);
+ char errmsg[ERRBUF_SIZE];
+ strerror_r(errno, errmsg, ERRBUF_SIZE);
real_exception(interp, NULL, E_SystemError, errmsg);
}
}