This tidy patch makes cwd work on HP-UX. As it stands at the moment it
gives an 'invalid argument' exception (although it gave a more
meaningful message earlier this morning).

The manual page for getcwd says:

      If buf is a NULL pointer, getcwd() obtains size bytes of space using
      malloc() (see malloc(3C)).  In this case, the pointer returned by
      getcwd() can be used as the argument in a subsequent call to free()
      (see malloc(3C)).  Invoking getcwd() with buf as a null pointer is not
      recommended because this functionality may be removed from the HP-UX
      operating system in a future release.

It therefore looks like 'getcwd (NULL, 0)' might work from this, but
in fact returns [EINTVAL] The size of the argument is zero.

I've therefore changed it to use an automatic variable (which assumes
that PATH_MAX is constant to conform to c89) and removed the free.
Failing that, the code can be preserved as it is, but replace size
with PATH_MAX+1 (although as the manual page says, this may not
continue to work).

With this and r10855, os.t will pass on HP-UX.

Regards,

Nick
Index: src/classes/os.pmc
===================================================================
--- src/classes/os.pmc  (revision 10861)
+++ src/classes/os.pmc  (working copy)
@@ -61,11 +61,12 @@
 
     METHOD STRING* cwd() {
 #ifndef _MSC_VER
-        STRING *scwd;
-        char * cwd = getcwd(NULL, 0);
+        char buf[PATH_MAX+1];
+
+        char * cwd = getcwd(buf, PATH_MAX+1);
+
         if (cwd) {
-            scwd = string_from_cstring(interpreter, cwd, strlen(cwd));
-            mem_sys_free(cwd);
+            STRING *scwd = string_from_cstring(interpreter, cwd, strlen(cwd));
             return scwd;
         } else {
             char *errmsg = strerror(errno);


Reply via email to