@@ -57,12 +57,7 @@ extern "C" char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
57
57
*outArgLen = *_NSGetArgc ();
58
58
return *_NSGetArgv ();
59
59
}
60
- #elif defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__)
61
- #if defined(__FreeBSD__)
62
- # define PROCFS_CMDLINE_PATH " /proc/curproc/cmdline"
63
- #else
64
- # define PROCFS_CMDLINE_PATH " /proc/self/cmdline"
65
- #endif
60
+ #elif defined(__linux__) || defined(__CYGWIN__)
66
61
SWIFT_RUNTIME_STDLIB_INTERFACE
67
62
extern " C" char ** _swift_stdlib_getUnsafeArgvArgc (int *outArgLen) {
68
63
assert (outArgLen != nullptr );
@@ -72,12 +67,10 @@ extern "C" char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
72
67
return _swift_stdlib_ProcessOverrideUnsafeArgv;
73
68
}
74
69
75
- FILE *cmdline = fopen (PROCFS_CMDLINE_PATH , " rb" );
70
+ FILE *cmdline = fopen (" /proc/self/cmdline " , " rb" );
76
71
if (!cmdline) {
77
72
swift::fatalError (0 ,
78
- " fatal error: Unable to open interface to '"
79
- PROCFS_CMDLINE_PATH
80
- " '.\n " );
73
+ " fatal error: Unable to open interface to '/proc/self/cmdline'.\n " );
81
74
}
82
75
char *arg = nullptr ;
83
76
size_t size = 0 ;
@@ -111,6 +104,42 @@ extern "C" char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
111
104
*outArgLen = __argc;
112
105
return __argv;
113
106
}
107
+ #elif defined(__FreeBSD__)
108
+ #include < errno.h>
109
+ #include < unistd.h>
110
+ #include < sys/types.h>
111
+ #include < sys/param.h>
112
+ #include < sys/sysctl.h>
113
+
114
+ SWIFT_RUNTIME_STDLIB_INTERFACE
115
+ extern " C" char ** _swift_stdlib_getUnsafeArgvArgc (int *outArgLen) {
116
+ assert (outArgLen != nullptr );
117
+
118
+ if (_swift_stdlib_ProcessOverrideUnsafeArgv) {
119
+ *outArgLen = _swift_stdlib_ProcessOverrideUnsafeArgc;
120
+ return _swift_stdlib_ProcessOverrideUnsafeArgv;
121
+ }
122
+
123
+ char argPtr[8192 ]; // or use ARG_MAX? 8192 is used in LLDB though..
124
+ size_t argPtrSize = sizeof (argPtr);
125
+ int mib[4 ] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, getpid () };
126
+ if (sysctl (mib, 4 , argPtr, &argPtrSize, NULL , 0 ) != 0 )
127
+ swift::fatalError (0 , " fatal error: could not retrieve commandline "
128
+ " arguments: sysctl: %s.\n " , strerror (errno));
129
+
130
+ char *curPtr = argPtr;
131
+ char *endPtr = argPtr + argPtrSize;
132
+
133
+ std::vector<char *> argvec;
134
+ for (; curPtr < endPtr; curPtr += strlen (curPtr) + 1 )
135
+ argvec.push_back (strdup (curPtr));
136
+ *outArgLen = argvec.size ();
137
+ char **outBuf = (char **)calloc (argvec.size () + 1 , sizeof (char *));
138
+ std::copy (argvec.begin (), argvec.end (), outBuf);
139
+ outBuf[argvec.size ()] = nullptr ;
140
+
141
+ return outBuf;
142
+ }
114
143
#else // __ANDROID__; Add your favorite arch's command line arg grabber here.
115
144
SWIFT_RUNTIME_STDLIB_INTERFACE
116
145
extern " C" char ** _swift_stdlib_getUnsafeArgvArgc (int *outArgLen) {
0 commit comments