Commit 20943bae authored by Anthony Martin's avatar Anthony Martin Committed by Rob Pike

exec: add support for Plan 9

R=paulzhol, mirtchovski, fshahriar, alex.brainman, r
CC=golang-dev
https://golang.org/cl/4386041
parent c319fb07
...@@ -20,6 +20,9 @@ GOFILES_linux=\ ...@@ -20,6 +20,9 @@ GOFILES_linux=\
GOFILES_windows=\ GOFILES_windows=\
lp_windows.go\ lp_windows.go\
GOFILES_plan9=\
lp_plan9.go\
GOFILES+=$(GOFILES_$(GOOS)) GOFILES+=$(GOFILES_$(GOOS))
include ../../Make.pkg include ../../Make.pkg
// Copyright 2011 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 exec
import (
"os"
"strings"
)
// ErrNotFound is the error resulting if a path search failed to find an executable file.
var ErrNotFound = os.ErrorString("executable file not found in $path")
func findExecutable(file string) os.Error {
d, err := os.Stat(file)
if err != nil {
return err
}
if d.IsRegular() && d.Permission()&0111 != 0 {
return nil
}
return os.EPERM
}
// LookPath searches for an executable binary named file
// in the directories named by the path environment variable.
// If file begins with "/", "#", "./", or "../", it is tried
// directly and the path is not consulted.
func LookPath(file string) (string, os.Error) {
// skip the path lookup for these prefixes
skip := []string{"/", "#", "./", "../"}
for _, p := range skip {
if strings.HasPrefix(file, p) {
err := findExecutable(file)
if err == nil {
return file, nil
}
return "", &Error{file, err}
}
}
path := os.Getenv("path")
for _, dir := range strings.Split(path, "\000", -1) {
if err := findExecutable(dir + "/" + file); err == nil {
return dir + "/" + file, nil
}
}
return "", &Error{file, ErrNotFound}
}
...@@ -45,6 +45,7 @@ var ( ...@@ -45,6 +45,7 @@ var (
EEXIST = Eexist EEXIST = Eexist
EIO = Eio EIO = Eio
EACCES = Eperm EACCES = Eperm
EPERM = Eperm
EISDIR = syscall.EISDIR EISDIR = syscall.EISDIR
ENAMETOOLONG = NewError("file name too long") ENAMETOOLONG = NewError("file name too long")
......
...@@ -63,7 +63,9 @@ func Exec(name string, argv []string, envv []string) Error { ...@@ -63,7 +63,9 @@ func Exec(name string, argv []string, envv []string) Error {
} }
// Waitmsg stores the information about an exited process as reported by Wait. // Waitmsg stores the information about an exited process as reported by Wait.
type Waitmsg syscall.Waitmsg type Waitmsg struct {
syscall.Waitmsg
}
// Wait waits for the Process to exit or stop, and then returns a // Wait waits for the Process to exit or stop, and then returns a
// Waitmsg describing its status and an Error, if any. The options // Waitmsg describing its status and an Error, if any. The options
...@@ -87,7 +89,7 @@ func (p *Process) Wait(options int) (w *Waitmsg, err Error) { ...@@ -87,7 +89,7 @@ func (p *Process) Wait(options int) (w *Waitmsg, err Error) {
} }
} }
return (*Waitmsg)(&waitmsg), nil return &Waitmsg{waitmsg}, nil
} }
// Wait waits for process pid to exit or stop, and then returns a // Wait waits for process pid to exit or stop, and then returns a
......
...@@ -35,7 +35,7 @@ var ( ...@@ -35,7 +35,7 @@ var (
Stdout = 1 Stdout = 1
Stderr = 2 Stderr = 2
EISDIR Error = NewError("file is a directory") EISDIR = NewError("file is a directory")
) )
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err string) func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err string)
...@@ -200,6 +200,17 @@ type Waitmsg struct { ...@@ -200,6 +200,17 @@ type Waitmsg struct {
Msg string Msg string
} }
func (w Waitmsg) Exited() bool { return true }
func (w Waitmsg) Signaled() bool { return false }
func (w Waitmsg) ExitStatus() int {
if len(w.Msg) == 0 {
// a normal exit returns no message
return 0
}
return 1
}
//sys await(s []byte) (n int, err Error) //sys await(s []byte) (n int, err Error)
func Await(w *Waitmsg) (err Error) { func Await(w *Waitmsg) (err Error) {
var buf [512]byte var buf [512]byte
...@@ -230,7 +241,7 @@ func Await(w *Waitmsg) (err Error) { ...@@ -230,7 +241,7 @@ func Await(w *Waitmsg) (err Error) {
w.Time[0] = uint32(atoi(f[1])) w.Time[0] = uint32(atoi(f[1]))
w.Time[1] = uint32(atoi(f[2])) w.Time[1] = uint32(atoi(f[2]))
w.Time[2] = uint32(atoi(f[3])) w.Time[2] = uint32(atoi(f[3]))
w.Msg = string(f[4]) w.Msg = cstring(f[4])
return return
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment