// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package os

import (
	"syscall"
)

// Getwd returns a rooted path name corresponding to the
// current directory.  If the current directory can be
// reached via multiple paths (due to symbolic links),
// Getwd may return any one of them.
func Getwd() (string, Error) {
	// If the operating system provides a Getwd call, use it.
	if syscall.ImplementsGetwd {
		s, e := syscall.Getwd();
		return s, NewSyscallError("getwd", e);
	}

	// Otherwise, we're trying to find our way back to ".".
	dot, err := Stat(".");
	if err != nil {
		return "", err;
	}

	// Clumsy but widespread kludge:
	// if $PWD is set and matches ".", use it.
	pwd:= Getenv("PWD");
	if len(pwd) > 0 && pwd[0] == '/' {
		d, err := Stat(pwd);
		if err == nil && d.Dev == dot.Dev && d.Ino == dot.Ino {
			return pwd, nil
		}
	}

	// Root is a special case because it has no parent
	// and ends in a slash.
	root, err := Stat("/");
	if err != nil {
		// Can't stat root - no hope.
		return "", err;
	}
	if root.Dev == dot.Dev && root.Ino == dot.Ino {
		return "/", nil
	}

	// General algorithm: find name in parent
	// and then find name of parent.  Each iteration
	// adds /name to the beginning of pwd.
	pwd = "";
	for parent := "..";; parent = "../" + parent {
		if len(parent) >= 1024 {	// Sanity check
			return "", ENAMETOOLONG;
		}
		fd, err := Open(parent, O_RDONLY, 0);
		if err != nil {
			return "", err;
		}

		for {
			names, err := fd.Readdirnames(100);
			if err != nil {
				fd.Close();
				return "", err;
			}
			for _, name := range names {
				d, _ := Lstat(parent + "/" + name);
				if d.Dev == dot.Dev && d.Ino == dot.Ino {
					pwd = "/" + name + pwd;
					goto Found;
				}
			}
		}
		fd.Close();
		return "", ENOENT;

	Found:
		pd, err := fd.Stat();
		if err != nil {
			return "", err;
		}
		fd.Close();
		if pd.Dev == root.Dev && pd.Ino == root.Ino {
			break;
		}
		// Set up for next round.
		dot = pd;
	}
	return pwd, nil
}
