OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / sys / windows / exec_windows.go
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Fork, exec, wait, etc.
6
7 package windows
8
9 // EscapeArg rewrites command line argument s as prescribed
10 // in http://msdn.microsoft.com/en-us/library/ms880421.
11 // This function returns "" (2 double quotes) if s is empty.
12 // Alternatively, these transformations are done:
13 // - every back slash (\) is doubled, but only if immediately
14 //   followed by double quote (");
15 // - every double quote (") is escaped by back slash (\);
16 // - finally, s is wrapped with double quotes (arg -> "arg"),
17 //   but only if there is space or tab inside s.
18 func EscapeArg(s string) string {
19         if len(s) == 0 {
20                 return "\"\""
21         }
22         n := len(s)
23         hasSpace := false
24         for i := 0; i < len(s); i++ {
25                 switch s[i] {
26                 case '"', '\\':
27                         n++
28                 case ' ', '\t':
29                         hasSpace = true
30                 }
31         }
32         if hasSpace {
33                 n += 2
34         }
35         if n == len(s) {
36                 return s
37         }
38
39         qs := make([]byte, n)
40         j := 0
41         if hasSpace {
42                 qs[j] = '"'
43                 j++
44         }
45         slashes := 0
46         for i := 0; i < len(s); i++ {
47                 switch s[i] {
48                 default:
49                         slashes = 0
50                         qs[j] = s[i]
51                 case '\\':
52                         slashes++
53                         qs[j] = s[i]
54                 case '"':
55                         for ; slashes > 0; slashes-- {
56                                 qs[j] = '\\'
57                                 j++
58                         }
59                         qs[j] = '\\'
60                         j++
61                         qs[j] = s[i]
62                 }
63                 j++
64         }
65         if hasSpace {
66                 for ; slashes > 0; slashes-- {
67                         qs[j] = '\\'
68                         j++
69                 }
70                 qs[j] = '"'
71                 j++
72         }
73         return string(qs[:j])
74 }
75
76 func CloseOnExec(fd Handle) {
77         SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
78 }
79
80 // FullPath retrieves the full path of the specified file.
81 func FullPath(name string) (path string, err error) {
82         p, err := UTF16PtrFromString(name)
83         if err != nil {
84                 return "", err
85         }
86         n := uint32(100)
87         for {
88                 buf := make([]uint16, n)
89                 n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
90                 if err != nil {
91                         return "", err
92                 }
93                 if n <= uint32(len(buf)) {
94                         return UTF16ToString(buf[:n]), nil
95                 }
96         }
97 }