casaroli commented on code in PR #20568:
URL: https://github.com/apache/nuttx/pull/20568#discussion_r4248089857


##########
include/unistd.h:
##########
@@ -289,12 +289,19 @@
 #define getdtablesize(f)                 ((int)sysconf(_SC_OPEN_MAX))
 #define getpagesize(f)                   ((int)sysconf(_SC_PAGESIZE))
 
-/* Accessor functions associated with getopt(). */
+/* Accessor functions associated with getopt().  In the user space of a
+ * kernel build every process has its own copy of the C library data, so
+ * optarg, opterr, optind and optopt are the plain variables that POSIX
+ * specifies (see below).  Programs that bring their own getopt() depend
+ * on that.
+ */
 
-#define optarg                           (*(getoptargp()))
-#define opterr                           (*(getopterrp()))
-#define optind                           (*(getoptindp()))
-#define optopt                           (*(getoptoptp()))
+#if !defined(CONFIG_BUILD_KERNEL) || defined(__KERNEL__)

Review Comment:
   In flat and protected builds all tasks share one address space, so optarg, 
optind, opterr and optopt cannot be plain global variables: getopt() keeps them 
per task, and the names are macros. A program that defines its own `char 
*optarg` cannot build there without changes.
   
   In a kernel build each process has its own data, so plain variables work as 
POSIX requires, and such programs build unchanged.
   
   I think it is better to give the POSIX behaviour where the build allows it. 
Flat and protected builds do not change with this PR.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to