Ruby 2.0.0p353(2013-11-22revision43784)

- Main Page
- Modules
- Data Structures
- Files

- File List
- Globals

os2.c
Go to the documentation of this file.
1 /* os/2 compatibility functions -- follows Ruby's license */
2
3 #include "ruby.h"
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <fcntl.h>
7 #include <process.h>
8 #include <limits.h>
9 #include <errno.h>
10
11 #define INCL_DOS
12 #include <os2.h>
13
14 int
15 chown(char *path, int owner, int group)
16 {
17 return 0;
18 }
19
20 #if 0
21 int
22 link(char *from, char *to)
23 {
24 return -1;
25 }
26 #endif
27
28 #if defined(EMX_REPLACE_GETCWD) && (EMX_REPLACE_GETCWD) \
29 || defined(EMX_REPLACE_CHDIR) && (EMX_REPLACE_CHDIR)
30 #include <unistd.h>
31
32 #if defined(EMX_REPLACE_GETCWD) && (EMX_REPLACE_GETCWD)
33 /* to handle the drive letter and DBCS characters within a given path */
34 char *
35 getcwd(char *path, size_t len)
36 {
37 return _getcwd2(path, (int)len);
38 }
39 #endif
40
41 #if defined(EMX_REPLACE_CHDIR) && (EMX_REPLACE_CHDIR)
42 /* to handle the drive letter and DBCS characters within a given path */
43 int
44 chdir(__const__ char *path)
45 {
46 return _chdir2(path);
47 }
48 #endif
49 #endif
50
51 typedef char* CHARP;
52
53 int
54 do_spawn(cmd)
55 char *cmd;
56 {
57 register char **a;
58 register char *s;
59 char **argv;
60 char *shell, *sw, *cmd2;
61 int status;
62
63 if ((shell = getenv("RUBYSHELL")) != NULL && *shell != '\0') {
64 s = shell;
65 do
66 *s = isupper(*s) ? tolower(*s) : *s;
67 while (*++s);
68 if (strstr(shell, "cmd") || strstr(shell, "4os2"))
69 sw = "/c";
70 else
71 sw = "-c";
72 } else if ((shell = getenv("SHELL")) != NULL && *shell != '\0') {
73 s = shell;
74 do
75 *s = isupper(*s) ? tolower(*s) : *s;
76 while (*++s);
77 if (strstr(shell, "cmd") || strstr(shell, "4os2"))
78 sw = "/c";
79 else
80 sw = "-c";
81 } else if ((shell = getenv("COMSPEC")) != NULL && *shell != '\0') {
82 s = shell;
83 do
84 *s = isupper(*s) ? tolower(*s) : *s;
85 while (*++s);
86 if (strstr(shell, "cmd") || strstr(shell, "4os2"))
87 sw = "/c";
88 else
89 sw = "-c";
90 }
91 /* see if there are shell metacharacters in it */
92 /*SUPPRESS 530*/
93 /* for (s = cmd; *s && isalpha(*s); s++) ;
94 if (*s == '=')
95 goto doshell; */
96 for (s = cmd; *s; s++) {
97 if (*sw == '-' && *s != ' ' &&
98 !isalpha(*s) && index("$&*(){}[]'\";\\|?<>~`\n",*s)) {
99 if (*s == '\n' && !s[1]) {
100 *s = '\0';
101 break;
102 }
103 goto doshell;
104 } else if (*sw == '/' && *s != ' ' &&
105 !isalpha(*s) && index("^()<>|&\n",*s)) {
106 if (*s == '\n' && !s[1]) {
107 *s = '\0';
108 break;
109 }
110 doshell:
111 status = spawnlp(P_WAIT,shell,shell,sw,cmd,(char*)NULL);
112 return status;
113 }
114 }
115 argv = ALLOC_N(CHARP,(strlen(cmd) / 2 + 2));
116 cmd2 = ALLOC_N(char, (strlen(cmd) + 1));
117 strcpy(cmd2, cmd);
118 a = argv;
119 for (s = cmd2; *s;) {
120 while (*s && isspace(*s)) s++;
121 if (*s)
122 *(a++) = s;
123 while (*s && !isspace(*s)) s++;
124 if (*s)
125 *s++ = '\0';
126 }
127 *a = NULL;
128 if (argv[0]) {
129 if ((status = spawnvp(P_WAIT, argv[0], argv)) == -1) {
130 free(argv);
131 free(cmd2);
132 return -1;
133 }
134 }
135 free(cmd2);
136 free(argv);
137 return status;
138 }
strlen
size_t strlen(const char *)
sw
char * sw
Definition: os2.c:60
ruby.h
status
int status
Definition: tcltklib.c:2197
a
Real * a
Definition: bigdecimal.c:1182
path
gz path
Definition: zlib.c:2279
index
int index
Definition: tcltklib.c:4478
strcpy
strcpy(cmd2, cmd)
chown
int chown(const char *, int, int)
Definition: win32.c:4065
unistd.h
link
int link(const char *, const char *)
Definition: win32.c:4235
argv
VALUE * argv
Definition: tcltklib.c:1971
s
register char * s
Definition: os2.c:56
CHARP
char * CHARP
Definition: os2.c:51
getenv
char * getenv()
cmd
const char * cmd
Definition: tcltklib.c:278
cmd2
char * cmd2
Definition: os2.c:60
free
#define free(x)
Definition: dln.c:50
shell
char * shell
Definition: os2.c:60
ALLOC_N
#define ALLOC_N(type, n)
strstr
RUBY_EXTERN char * strstr(const char *, const char *)
Definition: strstr.c:8
NULL
#define NULL
Definition: _sdbm.c:103
len
size_t len
Definition: tcltklib.c:3568