diff options
-rw-r--r-- | libbb/getopt_ulflags.c | 56 | ||||
-rw-r--r-- | procps/ps.c | 13 |
2 files changed, 50 insertions, 19 deletions
diff --git a/libbb/getopt_ulflags.c b/libbb/getopt_ulflags.c index 8c03214a9..410f4d57d 100644 --- a/libbb/getopt_ulflags.c +++ b/libbb/getopt_ulflags.c @@ -110,7 +110,7 @@ const char *bb_opt_complementally bb_getopt_ulflags's return value will be as if "-a -b -c" were found. - "ww" Option have int counter usaging. For example ps applet: + "ww" Double option have int counter usaging. For example ps applet: if w is given once, GNU ps sets the width to 132, if w is given more than once, it is "unlimited" @@ -175,6 +175,9 @@ Special characters: "!" If previous point set BB_GETOPT_ERROR, don`t return and call previous example internally + "-" A minus as one char in bb_opt_complementally group means that + convert the arguments as option, specail for "ps" applet. + "*" A star after a char in bb_opt_complementally means that the option can occur multiple times: @@ -227,6 +230,9 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) va_list p; const struct option *l_o; char flg_show_usage_if_error = 0; + char flg_argv_is_opts = 0; + unsigned long trigger; + char **pargv = NULL; va_start (p, applet_opts); @@ -294,6 +300,10 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) flg_show_usage_if_error = '!'; continue; } + if(*s == '-') { + flg_argv_is_opts = '-'; + continue; + } for (on_off = complementally; on_off->opt; on_off++) if (on_off->opt == *s) break; @@ -304,17 +314,17 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) } else if(*s == '*') { pair->list_flg++; } else { - unsigned long *pair_switch = &(pair->switch_on); - if(c) - pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously); - for (on_off = complementally; on_off->opt; on_off++) - if (on_off->opt == *s) { - if(pair_switch == &(on_off->switch_on)) - on_off->counter = va_arg (p, int *); - else - *pair_switch |= on_off->switch_on; - break; - } + unsigned long *pair_switch = &(pair->switch_on); + if(c) + pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously); + for (on_off = complementally; on_off->opt; on_off++) + if (on_off->opt == *s) { + if(pair_switch == &(on_off->switch_on)) + on_off->counter = va_arg (p, int *); + else + *pair_switch |= on_off->switch_on; + break; + } } } s--; @@ -322,8 +332,8 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) while ((c = getopt_long (argc, argv, applet_opts, bb_applet_long_options, NULL)) > 0) { - unsigned long trigger; +loop_arg_is_opt: for (on_off = complementally; on_off->opt != c; on_off++) { if(!on_off->opt) bb_show_usage (); @@ -341,10 +351,28 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) (*(on_off->counter))++; if(on_off->list_flg) { *(llist_t **)(on_off->optarg) = - llist_add_to(*(llist_t **)(on_off->optarg), optarg); + llist_add_to(*(llist_t **)(on_off->optarg), optarg); } else if (on_off->optarg) { *(char **)(on_off->optarg) = optarg; } + if(flg_argv_is_opts == 'p') + break; + } + if(flg_argv_is_opts) { + /* process argv is option, for example "ps" applet */ + if(flg_argv_is_opts == '-') { + flg_argv_is_opts = 'p'; + pargv = argv + optind; + } + while(*pargv) { + c = **pargv; + if(c == '\0') { + pargv++; + } else { + (*pargv)++; + goto loop_arg_is_opt; + } + } } return flags; diff --git a/procps/ps.c b/procps/ps.c index 6b5a4a908..b423b06ce 100644 --- a/procps/ps.c +++ b/procps/ps.c @@ -26,16 +26,19 @@ extern int ps_main(int argc, char **argv) { procps_status_t * p; int i, len; + #if ENABLE_SELINUX int use_selinux = 0; security_context_t sid=NULL; #endif + #if ENABLE_FEATURE_PS_WIDE int terminal_width; int w_count = 0; - bb_opt_complementally="ww"; + + bb_opt_complementally="-:ww"; #else -# define terminal_width 80 +# define terminal_width 79 #endif #if ENABLE_FEATURE_PS_WIDE || ENABLE_SELINUX @@ -43,7 +46,7 @@ extern int ps_main(int argc, char **argv) #if ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX i = bb_getopt_ulflags(argc, argv, "wc", &w_count); #elif ENABLE_FEATURE_PS_WIDE && !ENABLE_SELINUX - i = bb_getopt_ulflags(argc, argv, "w", &w_count); + bb_getopt_ulflags(argc, argv, "w", &w_count); #else /* !ENABLE_FEATURE_PS_WIDE && ENABLE_SELINUX */ i = bb_getopt_ulflags(argc, argv, "c"); #endif @@ -51,10 +54,10 @@ extern int ps_main(int argc, char **argv) /* if w is given once, GNU ps sets the width to 132, * if w is given more than once, it is "unlimited" */ - if((i & 1)) { + if(w_count) { terminal_width = (w_count==1) ? 132 : INT_MAX; } else { - get_terminal_width_height(0, &terminal_width, NULL); + get_terminal_width_height(1, &terminal_width, NULL); /* Go one less... */ terminal_width--; } |