43 #if defined(__CYGWIN__) 44 #include <sys/types.h> 46 #include <sys/cygwin.h> 47 #include <sys/unistd.h> 57 WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline,
int nShow)
59 int wait_for_child =
FALSE;
60 int compact_invocation =
FALSE;
64 char execname[FILENAME_MAX];
65 char execpath[MAX_PATH];
69 char exec[MAX_PATH + FILENAME_MAX + 100];
74 if (compact_invocation)
84 strcpy(execname,argv[0]);
88 j = sprintf(
buffer,
"\nexecname : %s\nexecpath : %s\n",execname,execpath);
89 for (i = 0; i < argc; i++)
90 j += sprintf(
buffer+j,
"argv[%d]\t: %s\n",i,argv[i]);
95 error(
"you must supply a program name to run");
97 #if defined(__CYGWIN__) 104 Trace((
"exec\t%s\nexecname\t%s\nexecpath\t%s\n",
105 exec,execname,execpath));
112 if (compact_invocation)
113 for (i = 1; i < argc; i++)
116 for (i = 0; i < argc; i++)
118 return (
int) ret_code;
123 SECURITY_ATTRIBUTES sec_attrs;
124 SECURITY_DESCRIPTOR sec_desc;
125 PROCESS_INFORMATION child;
128 memset (&start, 0,
sizeof (start));
129 start.cb =
sizeof (start);
130 start.dwFlags = STARTF_USESHOWWINDOW;
131 start.wShowWindow = SW_HIDE;
133 sec_attrs.nLength =
sizeof (sec_attrs);
134 sec_attrs.lpSecurityDescriptor =
NULL;
135 sec_attrs.bInheritHandle =
FALSE;
137 if (CreateProcess (
NULL, cmdline, &sec_attrs,
NULL,
TRUE, 0,
142 WaitForSingleObject (child.hProcess, INFINITE);
143 GetExitCodeProcess (child.hProcess, &retval);
145 CloseHandle (child.hThread);
146 CloseHandle (child.hProcess);
149 error(
"could not start %s",cmdline);
160 char exec2[MAX_PATH + FILENAME_MAX + 100];
161 char tmp[MAX_PATH + FILENAME_MAX + 100];
164 if ( ((p = strrchr(exec2,
'\\')) && stricmp(p,
"\\xemacs") == 0) ||
165 ((p = strrchr(exec2,
'/')) && stricmp(p,
"/xemacs") == 0) ||
166 ((p = strrchr(exec2,
'\\')) && stricmp(p,
"\\xemacs.exe") == 0) ||
167 ((p = strrchr(exec2,
'/')) && stricmp(p,
"/xemacs.exe") == 0) )
169 if ( ((p2 = strrchr(p,
'\\')) && stricmp(p2,
"\\bin") == 0) ||
170 ((p2 = strrchr(p,
'/')) && stricmp(p2,
"/bin") == 0) )
173 #if defined(__CYGWIN__) 174 CYGWIN_CONV_TO_POSIX_PATH((exec2,tmp));
177 for (p = exec2; *
p; p++)
178 if (*p ==
'\\') *p =
'/';
180 SetEnvironmentVariable (
"emacs_dir", exec2);
193 if ((argc >= 2) && (stricmp(argv[1],
"-wait") == 0))
199 char_cnt = strlen(exec);
200 for (i = first_arg; i < argc; i++)
201 char_cnt += strlen(argv[i]);
203 error(
"command line too long -\n%s",new_cmdline);
205 strcpy(new_cmdline,exec);
206 for (i = first_arg; i < argc; i++)
208 strcat(new_cmdline,
" ");
209 strcat(new_cmdline,argv[i]);
238 char exec_tmp[MAX_PATH + FILENAME_MAX + 100];
239 char exec_tmp2[MAX_PATH + FILENAME_MAX + 100];
240 char buf[MAX_PATH + FILENAME_MAX + 100];
248 if ((execname[0] ==
'\\') || (execname[0] ==
'/'))
250 #if defined(__CYGWIN__) 251 strcpy(exec_tmp,execname);
253 exec_tmp[0] = ((char) (_getdrive() + ((int)
'A') - 1));
256 strcat(exec_tmp,execname);
258 Trace((
"/ -\nexec_tmp\t%s\nexecname\t%s\nexecpath\t%s\n",
259 exec_tmp,execname,execpath));
264 j += sprintf(buf + j,
" [%d]: %s\n",i+1,
exts[i]);
265 error(
"Couldn't locate %s\nI tried appending the following " 266 "extensions: \n%s",exec_tmp,buf);
274 else if ((strlen(execname) > 3) &&
275 (execname[1] ==
':') &&
276 ((execname[2] ==
'\\') || (execname[2] ==
'/')))
278 strcpy(exec_tmp,execname);
279 Trace((
"x: -\nexec_tmp\t%s\nexecname\t%s\nexecpath\t%s\n",
280 exec_tmp,execname,execpath));
285 j += sprintf(buf + j,
" [%d]: %s\n",i+1,
exts[i]);
286 error(
"Couldn't locate %s\nI tried appending the following " 287 "extensions: \n%s",exec_tmp,buf);
294 else if ((execname[0] ==
'.') &&
295 ((execname[1] ==
'\\') || (execname[1] ==
'/')))
297 if (((
char*) getcwd(exec_tmp,MAX_PATH))==
NULL)
298 error(
"can't find current working directory");
306 j += sprintf(buf + j,
" [%d]: %s\n",i+1,
exts[i]);
307 error(
"Couldn't locate %s\n" 308 "I looked in the following directories:\n [1]: %s\n [2]: %s\n" 309 "I also tried appending the following " 310 "extensions: \n%s",execname,exec_tmp,execpath,buf);
321 orig_pathlist =
getenv(
"PATH");
322 if ((pathlist =
malloc (strlen(orig_pathlist)
324 + strlen(execpath)+ 3)) ==
NULL)
325 error(
"internal error - out of memory");
326 strcpy(pathlist,
".");
328 strcat(pathlist,execpath);
330 strcat(pathlist,orig_pathlist);
335 strcpy(exec_tmp,execname);
336 strcat(exec_tmp,
exts[i]);
337 pfopen(exec_tmp2,exec_tmp,pathlist);
342 Trace((
"exec_tmp\t%s\npathlist\t%s\n",exec_tmp2,pathlist));
345 if (exec_tmp2[0] ==
'\0')
349 j += sprintf(buf + j,
" [%d]: %s\n",i+1,
exts[i]);
350 error(
"Couldn't find %s anywhere.\n" 351 "I even looked in the PATH \n" 352 "I also tried appending the following " 353 "extensions: \n%s",execname,buf);
360 #if defined(__CYGWIN__) 363 char sym_link_name[MAX_PATH+1];
364 char real_name[MAX_PATH+1];
365 char dummy[MAX_PATH+1];
367 strcpy(exec_tmp,exec_tmp2);
369 CYGWIN_CONV_TO_POSIX_PATH((exec_tmp,sym_link_name));
370 Trace((sym_link_name));
372 if (lstat(sym_link_name, &stbuf) == 0)
374 if ((stbuf.st_mode & S_IFLNK) == S_IFLNK)
376 if (readlink(sym_link_name, real_name,
sizeof(real_name)) == -1)
377 error(
"problem reading symbolic link for %s",exec_tmp);
381 if (real_name[0] ==
'/')
382 strcpy(exec_tmp2,real_name);
385 CYGWIN_SPLIT_PATH((sym_link_name,exec_tmp2,dummy));
388 strcat(exec_tmp2,real_name);
393 strcpy(exec_tmp2, sym_link_name);
396 error(
"can't locate executable - %s",sym_link_name);
398 CYGWIN_CONV_TO_FULL_WIN32_PATH((exec_tmp2,exec));
400 strcpy (exec, exec_tmp2);
410 if (len1 - len2 >= 0)
411 if (stricmp(&(s1[len1-len2]),s2) == 0)
416 if ((strlen(s) > 4) &&
418 (stricmp(&(s[strlen(s)-4]),
".exe") == 0))
419 s[strlen(s)-4] =
'\0';
427 j = sprintf(buf,
"Error: ");
428 j += vsprintf(buf + j,fmt,args);
429 j += sprintf(buf + j,
"\n");
431 MessageBox(
NULL, buf,
"Run.exe", MB_ICONSTOP);
440 j = vsprintf(buf,fmt,args);
441 j += sprintf(buf + j,
"\n");
443 MessageBox(
NULL, buf,
"Run.exe Message", MB_ICONSTOP);
451 j = vsprintf(buf,fmt,args);
452 j += sprintf(buf + j,
"\n");
454 MessageBox(
NULL, buf,
"Run.exe DEBUG", MB_ICONSTOP);
467 char modname[MAX_PATH];
472 if (!GetModuleFileName (
NULL, modname, MAX_PATH))
473 error(
"internal error - can't find my own name");
474 if ((p = strrchr (modname,
'\\')) ==
NULL)
475 error(
"internal error - my own name has no path\n%s",modname);
476 tmp_execname = p + 1;
484 if ( ((tmp_execname[0] ==
'r') || (tmp_execname[0] ==
'R')) &&
485 ((tmp_execname[1] ==
'u') || (tmp_execname[1] ==
'U')) &&
486 ((tmp_execname[2] ==
'n') || (tmp_execname[2] ==
'N')) &&
487 ((tmp_execname[3] !=
'.') && (tmp_execname[3] !=
'\0')) )
495 if (tmp_execname ==
NULL)
498 strcpy(execname,tmp_execname);
499 #if defined(__CYGWIN__) 500 CYGWIN_CONV_TO_POSIX_PATH((modname,execpath));
502 strcpy(execpath,modname);
520 if ((s ==
NULL) && ((s = *lasts) ==
NULL))
525 for (spanp = (
char *)delim; (sc = *spanp++) != 0;) {
545 while ((c = *s++) !=
'\"')
552 #if defined(__CYGWIN__) 565 spanp = (
char *)delim;
567 if ((sc = *spanp++) == c) {
582 char seps[] =
" \t\n";
587 token =
my_strtok(cmdline, seps, &lasts);
588 while ((token !=
NULL) && (argc < MAX_ARGS))
590 if ((argv[argc] =
malloc(strlen(token)+1)) ==
NULL)
592 error(
"internal error - out of memory");
594 strcpy(argv[argc++],token);
597 if (argc >= MAX_ARGS)
598 error(
"too many arguments on commandline\n%s",cmdline);
623 char *
pfopen(
char *retval,
const char *
name,
const char *dirs)
627 char returnval[MAX_PATH + FILENAME_MAX + 100];
628 char *recursive_name;
633 if (dirs ==
NULL || dirs[0] ==
'\0')
651 strcpy(retval,returnval);
655 const char* name_noext,
const char*
exts[],
658 char tryName[MAX_PATH + FILENAME_MAX];
662 for (i = 0; i < extcnt; i++)
664 strcpy(tryName,name_noext);
665 strcat(tryName,exts[i]);
680 char work[FILENAME_MAX];
681 char work2[MAX_PATH + FILENAME_MAX + 100];
686 if (len && work[len-1] !=
'/' && work[len-1] !=
'\\')
693 #if defined(__CYGWIN__) 694 CYGWIN_CONV_TO_POSIX_PATH((work, work2));
700 Trace((
"looking for...\t%s\n",work2));
703 file = fopen(work2,
"rb");
706 if (fullname !=
NULL)
707 strcpy(fullname,work2);
void Trace_(char *fmt,...)
const CanonicalForm int s
const char * exts[NUM_EXTENSIONS]
int endsWith(const char *s1, const char *s2)
int WINAPI WinMain(HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
int start_child(char *cmdline, int wait_for_child)
int parse_cmdline_to_arg_array(char *argv[MAX_ARGS], char *cmdline)
int fileExistsMulti(char *fullname, const char *path, const char *name_noext, const char *exts[], const int extcnt)
void xemacs_special(char *exec)
#define PATH_SEP_CHAR_STR
int status int void * buf
int build_cmdline(char *new_cmdline, char *exec, int argc, char *argv[])
void * malloc(size_t size)
int get_exec_name_and_path(char *execname, char *execpath)
char name(const Variable &v)
void message(char *fmt,...)
char * my_strtok(char *s, const char *delim, char **lasts)
void error(char *fmt,...)
char * pfopen(char *retval, const char *name, const char *dirs)
void process_execname(char *exec, const char *execname, const char *execpath)
int fileExists(char *fullname, const char *path, const char *name)