Go to the documentation of this file.00001
00002
00003 #include "ruby.h"
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006 #include <fcntl.h>
00007 #include <process.h>
00008 #include <limits.h>
00009 #include <errno.h>
00010
00011 #define INCL_DOS
00012 #include <os2.h>
00013
00014 int
00015 chown(char *path, int owner, int group)
00016 {
00017 return 0;
00018 }
00019
00020 #if 0
00021 int
00022 link(char *from, char *to)
00023 {
00024 return -1;
00025 }
00026 #endif
00027
00028 #if defined(EMX_REPLACE_GETCWD) && (EMX_REPLACE_GETCWD) \
00029 || defined(EMX_REPLACE_CHDIR) && (EMX_REPLACE_CHDIR)
00030 #include <unistd.h>
00031
00032 #if defined(EMX_REPLACE_GETCWD) && (EMX_REPLACE_GETCWD)
00033
00034 char *
00035 getcwd(char *path, size_t len)
00036 {
00037 return _getcwd2(path, (int)len);
00038 }
00039 #endif
00040
00041 #if defined(EMX_REPLACE_CHDIR) && (EMX_REPLACE_CHDIR)
00042
00043 int
00044 chdir(__const__ char *path)
00045 {
00046 return _chdir2(path);
00047 }
00048 #endif
00049 #endif
00050
00051 typedef char* CHARP;
00052
00053 int
00054 do_spawn(cmd)
00055 char *cmd;
00056 {
00057 register char **a;
00058 register char *s;
00059 char **argv;
00060 char *shell, *sw, *cmd2;
00061 int status;
00062
00063 if ((shell = getenv("RUBYSHELL")) != NULL && *shell != '\0') {
00064 s = shell;
00065 do
00066 *s = isupper(*s) ? tolower(*s) : *s;
00067 while (*++s);
00068 if (strstr(shell, "cmd") || strstr(shell, "4os2"))
00069 sw = "/c";
00070 else
00071 sw = "-c";
00072 } else if ((shell = getenv("SHELL")) != NULL && *shell != '\0') {
00073 s = shell;
00074 do
00075 *s = isupper(*s) ? tolower(*s) : *s;
00076 while (*++s);
00077 if (strstr(shell, "cmd") || strstr(shell, "4os2"))
00078 sw = "/c";
00079 else
00080 sw = "-c";
00081 } else if ((shell = getenv("COMSPEC")) != NULL && *shell != '\0') {
00082 s = shell;
00083 do
00084 *s = isupper(*s) ? tolower(*s) : *s;
00085 while (*++s);
00086 if (strstr(shell, "cmd") || strstr(shell, "4os2"))
00087 sw = "/c";
00088 else
00089 sw = "-c";
00090 }
00091
00092
00093
00094
00095
00096 for (s = cmd; *s; s++) {
00097 if (*sw == '-' && *s != ' ' &&
00098 !isalpha(*s) && index("$&*(){}[]'\";\\|?<>~`\n",*s)) {
00099 if (*s == '\n' && !s[1]) {
00100 *s = '\0';
00101 break;
00102 }
00103 goto doshell;
00104 } else if (*sw == '/' && *s != ' ' &&
00105 !isalpha(*s) && index("^()<>|&\n",*s)) {
00106 if (*s == '\n' && !s[1]) {
00107 *s = '\0';
00108 break;
00109 }
00110 doshell:
00111 status = spawnlp(P_WAIT,shell,shell,sw,cmd,(char*)NULL);
00112 return status;
00113 }
00114 }
00115 argv = ALLOC_N(CHARP,(strlen(cmd) / 2 + 2));
00116 cmd2 = ALLOC_N(char, (strlen(cmd) + 1));
00117 strcpy(cmd2, cmd);
00118 a = argv;
00119 for (s = cmd2; *s;) {
00120 while (*s && isspace(*s)) s++;
00121 if (*s)
00122 *(a++) = s;
00123 while (*s && !isspace(*s)) s++;
00124 if (*s)
00125 *s++ = '\0';
00126 }
00127 *a = NULL;
00128 if (argv[0]) {
00129 if ((status = spawnvp(P_WAIT, argv[0], argv)) == -1) {
00130 free(argv);
00131 free(cmd2);
00132 return -1;
00133 }
00134 }
00135 free(cmd2);
00136 free(argv);
00137 return status;
00138 }
00139