bshspawn.c

来自「UNIX下SH的实现源码」· C语言 代码 · 共 132 行

C
132
字号
#ifdef __MSDOS__#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <sys/exceptn.h>#include <process.h>#include <limits.h>#include <fcntl.h>#include "shell.h"#include "dosutil.h"int bash_spawnve(char *path, char **args, char **envp){  int status;  int fd;  static char oldcwd[PATH_MAX];  int maybe_shell_script;  int cmd_sample_len;  static char cmd_sample[2];  int errno_save;  int sample_file = 1;  int path_len;  int *selectors;  int old_enable, old_ctrl_c;    path_len = strlen(path);  if (path_len >= 4 && path[path_len - 4] == '.'      && stricmp (path + path_len - 3, "bat") == 0)    sample_file = 0;  /* If we have a plain text file, just punt and let Bash handle it.  */  if (sample_file)    {      fd = open (path, O_RDONLY);      if (fd >= 0)        {          cmd_sample_len = read (fd, cmd_sample, sizeof cmd_sample);          close (fd);          if (cmd_sample_len < 0)            return -1;          if (cmd_sample_len < sizeof cmd_sample)            return 0;          if (!check_binary_file (cmd_sample, cmd_sample_len)              && !(*cmd_sample == '#' && cmd_sample[1] == '!'))            {              errno = ENOEXEC;              return -1;            }        }    }  /* keep cwd on exec */  getcwd (oldcwd, sizeof oldcwd);  /* Expand 'path'.  */  if (dosutil_is_encoded_drivename (path))    path = dosutil_decode_drivename (path);  /* disable interrupt */  old_enable = __dpmi_get_and_disable_virtual_interrupt_state ();  old_ctrl_c = __djgpp_set_ctrl_c (0);  /* check empty dpmi selectors */  selectors = dosutil_check_dpmi_selectors ();  __djgpp_exception_toggle();  errno = 0;  /* Run child process. If the filename doesn't have a period, add one     to prevent __dos_find_on_path from finding a different file than     intended.  */  status = spawnve (P_WAIT, path, args, envp);  /* make response file if E2BIG */  if (errno == E2BIG && args != NULL && args[1] != NULL && args[1][0] != '@')    {      char *tname;      tname = dosutil_make_response_file (args);      if (tname != NULL)	  {	    char *xargs[3];	    xargs[0] = args[0];	    xargs[1] = xmalloc (1 + strlen (tname) + 1);	    xargs[1][0] = '@';	    strcpy (&xargs[1][1], tname);	    xargs[2] = NULL;	    errno = 0;	    /* try again */            status = spawnve (P_WAIT, path, xargs, envp);	    /* cleanup */	    free (xargs[1]);	    remove (tname);	    free (tname);	  }    }  /* disable interrupt */  __dpmi_get_and_disable_virtual_interrupt_state ();  __djgpp_exception_toggle();  /* free discarded dpmi selectors */  dosutil_free_dpmi_selectors (selectors);  /* Reset standard input */  dosutil_reset_console();  /* enable interrupt */  __djgpp_set_ctrl_c (old_ctrl_c);  __dpmi_get_and_enable_virtual_interrupt_state ();  errno_save = errno;  if (status >= 0)    chdir (oldcwd);  errno = errno_save;  return status;}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?