blob: 3606c3a8b3690599c77bb0460f40dd9327786c05 [file] [log] [blame]
khenaidooab1f7bd2019-11-14 14:00:27 -05001// 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
7package 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.
18func 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
76func CloseOnExec(fd Handle) {
77 SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
78}
79
80// FullPath retrieves the full path of the specified file.
81func 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}