@@ -81,17 +81,14 @@ mrb_execarg_new(mrb_state *mrb)
8181static void
8282mrb_execarg_fill (mrb_state * mrb , mrb_value env , mrb_value * argv , mrb_int argc , mrb_value opts , struct mrb_execarg * eargp )
8383{
84- int ai , use_cmd ;
84+ int ai , use_cmd , do_exit ;
8585 char * * result ;
8686 char * shell ;
87- char * dln_cmd ;
88- const char * tCmd ;
89- char fbuf [/*MAXPATHLEN*/ 80 ]; // TODO
87+ const char * tCmd , * fCmd ;
88+ char buf [80 ];
9089 mrb_value argv0 = mrb_nil_value ();
9190
92- ai = mrb_gc_arena_save (mrb );
93- tCmd = mrb_string_value_ptr (mrb , argv [0 ]);
94- dln_cmd = dln_find_exe_r (tCmd , 0 , fbuf , sizeof (fbuf ));
91+ ai = mrb_gc_arena_save (mrb );
9592
9693 if (mrb_hash_p (opts )) {
9794 eargp -> fd .in = mrb_hash_get (mrb , opts , mrb_check_intern (mrb , "in" , 2 ));
@@ -101,11 +98,11 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
10198 eargp -> fd .in = eargp -> fd .out = eargp -> fd .err = mrb_nil_value ();
10299 }
103100
104- #if defined( __APPLE__ ) || defined( __linux__ )
105- use_cmd = (( argc > 1 || ! strrchr ( tCmd , ' ' )) && dln_cmd ) ? 1 : 0 ;
106- #else
107- use_cmd = (( argc > 1 || strstr ( tCmd , ".exe" ) || ! strrchr ( tCmd , ' ' )) && dln_cmd ) ? 1 : 0 ; //TODO bei z.B. readelf.exe -v wäre ohne dln_cmd use_cmd=1, aber dln_find_exe_r kann "readelf -v" nicht auflösen!
108- #endif
101+ tCmd = mrb_string_value_ptr ( mrb , argv [ 0 ]);
102+ fCmd = dln_find_exe_r ( tCmd , 0 , buf , sizeof ( buf )) ;
103+
104+ do_exit = ! fCmd && strncmp ( "exit" , tCmd , 4 ) == 0 ;
105+ use_cmd = (! strrchr ( tCmd , ' ' ) && ( fCmd || (! do_exit && argc > 1 ))) ? 1 : 0 ;
109106
110107 if (use_cmd ) {
111108 result = (char * * )mrb_malloc (mrb , sizeof (char * ) * (argc + 1 ));
@@ -114,17 +111,13 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
114111 argc = 3 ;
115112 result = (char * * )mrb_malloc (mrb , sizeof (char * ) * (argc + 1 ));
116113
117-
118-
119-
120-
121114 #if defined(__APPLE__ ) || defined(__linux__ )
122115 shell = getenv ("SHELL" );
123- if (!shell ) shell = strdup (dln_find_exe_r ( " sh", 0 , fbuf , sizeof ( fbuf )) );
116+ if (!shell ) shell = strdup ("bin/ sh" );
124117 result [1 ] = strdup ("-c" );
125118 #else
126119 shell = getenv ("ComSpec" );
127- if (!shell ) shell = strdup (dln_find_exe_r ( " cmd.exe", 0 , fbuf , sizeof ( fbuf )) );
120+ if (!shell ) shell = strdup ("C:\\WINDOWS\\system32\\ cmd.exe" );
128121 result [1 ] = strdup ("/c" );
129122 #endif
130123 result [0 ] = shell ;
@@ -134,21 +127,16 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
134127 result [argc ] = NULL ;
135128
136129#if defined(__APPLE__ ) || defined(__linux__ )
137- if (result [0 ][0 ] != '/' ) {
138- argv0 = mrb_str_new (mrb , dln_find_exe_r ( tCmd , 0 , fbuf , sizeof ( fbuf )), 5 ); //TODO redundand?
130+ if (fCmd && result [0 ][0 ] != '/' ) {
131+ argv0 = mrb_str_new_cstr (mrb , fCmd );
139132 }
140133#else
141- if (result [0 ][1 ] != ':' ) {
142- char * dln_result = dln_find_exe_r (tCmd , 0 , fbuf , sizeof (fbuf ));
143- argv0 = mrb_str_new (mrb , dln_result , strlen (dln_result ) ); // TODO: !!!
134+ if (fCmd && result [0 ][1 ] != ':' ) {
135+ argv0 = mrb_str_new_cstr (mrb , fCmd );
144136 }
145137#endif
146138
147-
148-
149-
150139 if (mrb_bool (argv0 )) {
151- // mrb_str_cat_cstr(mrb, argv0, result[0]);
152140 result [0 ] = mrb_str_to_cstr (mrb , argv0 );
153141 }
154142
0 commit comments