@@ -57,7 +57,7 @@ extern "C" char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
5757 *outArgLen = *_NSGetArgc ();
5858 return *_NSGetArgv ();
5959}
60- #elif defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__)
60+ #elif defined(__linux__) || defined(__CYGWIN__)
6161SWIFT_RUNTIME_STDLIB_INTERFACE
6262extern " C" char ** _swift_stdlib_getUnsafeArgvArgc (int *outArgLen) {
6363 assert (outArgLen != nullptr );
@@ -104,6 +104,57 @@ extern "C" char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
104104 *outArgLen = __argc;
105105 return __argv;
106106}
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 = NULL ; // or use ARG_MAX? 8192 is used in LLDB though..
124+ int mib[4 ] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, getpid () };
125+ size_t argPtrSize = 0 ;
126+ for (int i = 0 ; i < 3 && !argPtr; i++) { // give up after 3 tries
127+ if (sysctl (mib, 4 , NULL , &argPtrSize, NULL , 0 ) != -1 ) {
128+ argPtr = (char *)malloc (argPtrSize);
129+ if (sysctl (mib, 4 , argPtr, &argPtrSize, NULL , 0 ) == -1 ) {
130+ free (argPtr);
131+ argPtr = NULL ;
132+ if (errno != ENOMEM)
133+ break ;
134+ }
135+ } else {
136+ break ;
137+ }
138+ }
139+ if (!argPtr)
140+ swift::fatalError (0 , " fatal error: could not retrieve commandline "
141+ " arguments: sysctl: %s.\n " , strerror (errno));
142+
143+ char *curPtr = argPtr;
144+ char *endPtr = argPtr + argPtrSize;
145+
146+ std::vector<char *> argvec;
147+ for (; curPtr < endPtr; curPtr += strlen (curPtr) + 1 )
148+ argvec.push_back (strdup (curPtr));
149+ *outArgLen = argvec.size ();
150+ char **outBuf = (char **)calloc (argvec.size () + 1 , sizeof (char *));
151+ std::copy (argvec.begin (), argvec.end (), outBuf);
152+ outBuf[argvec.size ()] = nullptr ;
153+
154+ free (argPtr);
155+
156+ return outBuf;
157+ }
107158#else // __ANDROID__; Add your favorite arch's command line arg grabber here.
108159SWIFT_RUNTIME_STDLIB_INTERFACE
109160extern " C" char ** _swift_stdlib_getUnsafeArgvArgc (int *outArgLen) {
0 commit comments