]> Cypherpunks repositories - gostls13.git/commitdiff
lib9: use $PWD in getwd
authorRuss Cox <rsc@golang.org>
Sat, 23 Jul 2011 01:21:17 +0000 (21:21 -0400)
committerRuss Cox <rsc@golang.org>
Sat, 23 Jul 2011 01:21:17 +0000 (21:21 -0400)
This makes the full file paths recorded by 6g
prefer $PWD over the actual directory name
(relevant when $PWD gets to the current directory
via symlinks).  It's what everyone else does, and
what people expect.

R=iant, r, mattn.jp
CC=golang-dev
https://golang.org/cl/4824041

src/lib9/getwd.c

index c3dd2b560ee2a82b1fca329a1c4c445384e914f1..3c8cafb3a0061d09b055e7a05ae44d89b0a8240a 100644 (file)
@@ -3,6 +3,7 @@ Plan 9 from User Space src/lib9/getwd.c
 http://code.swtch.com/plan9port/src/tip/src/lib9/getwd.c
 
 Copyright 2001-2007 Russ Cox.  All Rights Reserved.
+Portions Copyright 2011 The Go Authors.  All Rights Reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -23,6 +24,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 #include <u.h>
+#include <errno.h>
+#include <sys/stat.h>
 #include <libc.h>
 
 #undef getwd
@@ -30,5 +33,23 @@ THE SOFTWARE.
 char*
 p9getwd(char *s, int ns)
 {
+       char *pwd;
+       struct stat st1, st2;
+
+       // Clumsy but widespread kludge:
+       // if $PWD is set and matches ".", use it.
+       // Matches glibc's get_current_dir_name and Go's os.Getwd.
+       pwd = getenv("PWD");  // note: getenv, not p9getenv, so no free
+       if(pwd != nil && pwd[0] &&
+                       stat(pwd, &st1) >= 0 && stat(".", &st2) >= 0 &&
+                       st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) {
+               if(strlen(pwd) >= ns) {
+                       errno = ERANGE;
+                       return nil;
+               }
+               strcpy(s, pwd);
+               return s;
+       }
+
        return getcwd(s, ns);
 }