File: | os_shell.c |
Location: | line 518, column 3 |
Description: | Value stored to 'name_len' is never read |
1 | /* File: "os_shell.c", Time-stamp: <2009-03-14 09:15:57 feeley> */ |
2 | |
3 | /* Copyright (c) 1994-2009 by Marc Feeley, All Rights Reserved. */ |
4 | |
5 | /* |
6 | * This module implements the operating system specific routines |
7 | * related to the shell. |
8 | */ |
9 | |
10 | #define ___INCLUDED_FROM_OS_SHELL |
11 | #define ___VERSION407000 407000 |
12 | #include "gambit.h" |
13 | |
14 | #include "os_base.h" |
15 | #include "os_shell.h" |
16 | #include "os_files.h" |
17 | |
18 | |
19 | /*---------------------------------------------------------------------------*/ |
20 | |
21 | |
22 | ___shell_module ___shell_mod = |
23 | { |
24 | 0 |
25 | |
26 | #ifdef ___SHELL_MODULE_INIT, 0, 0 |
27 | ___SHELL_MODULE_INIT, 0, 0 |
28 | #endif |
29 | }; |
30 | |
31 | |
32 | /*---------------------------------------------------------------------------*/ |
33 | |
34 | /* Access to shell environment variables. */ |
35 | |
36 | |
37 | /****************** obsolete.... use ___getenv_UCS_2 */ |
38 | char *___getenv |
39 | ___P((char *name),(char *name) |
40 | (name)(char *name) |
41 | char *name;)(char *name) |
42 | { |
43 | return getenv (name); |
44 | } |
45 | |
46 | |
47 | #define GETENV_NAME_STATIC_SIZE128 128 |
48 | #define GETENV_VALUE_STATIC_SIZE128 128 |
49 | #define SETENV_NAME_STATIC_SIZE128 128 |
50 | #define SETENV_VALUE_STATIC_SIZE128 128 |
51 | #define UNSETENV_NAME_STATIC_SIZE128 128 |
52 | |
53 | |
54 | ___SCMOBJlong ___getenv_UCS_2 |
55 | ___P((___UCS_2STRING name,(unsigned short* name, unsigned short* *value) |
56 | ___UCS_2STRING *value),(unsigned short* name, unsigned short* *value) |
57 | (name,(unsigned short* name, unsigned short* *value) |
58 | value)(unsigned short* name, unsigned short* *value) |
59 | ___UCS_2STRING name;(unsigned short* name, unsigned short* *value) |
60 | ___UCS_2STRING *value;)(unsigned short* name, unsigned short* *value) |
61 | { |
62 | ___SCMOBJlong e; |
63 | ___UCS_2STRINGunsigned short* v; |
64 | ___UCS_2STRINGunsigned short* p1; |
65 | int name_len; |
66 | |
67 | /* reject strings that contain "=" except as the first character */ |
68 | |
69 | p1 = name; |
70 | |
71 | if (*p1 == '=') |
72 | p1++; |
73 | |
74 | while (*p1 != '\0') |
75 | { |
76 | #if ENV_CHAR_BYTES1 == 1 |
77 | if (*p1 > 255) |
78 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
79 | #endif |
80 | if (*p1++ == '=') |
81 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
82 | } |
83 | |
84 | name_len = p1 - name; |
85 | |
86 | /* find in the environment a string of the form name=value */ |
87 | |
88 | e = ___FIX(___NO_ERR)(((long)(0))<<2); |
89 | *value = 0; |
90 | |
91 | #ifdef USE_environ |
92 | |
93 | { |
94 | char **probe; |
95 | char *p2; |
96 | |
97 | probe = environ; |
98 | |
99 | while ((p2 = *probe++) != 0) |
100 | { |
101 | p1 = name; |
102 | |
103 | while (*p1 != '\0' && |
104 | *p1 == ___CAST(___UCS_2,___CAST(unsigned char,*p2))((unsigned short)(((unsigned char)(*p2))))) |
105 | { |
106 | p1++; |
107 | p2++; |
108 | } |
109 | |
110 | if (*p1 == '\0' && *p2 == '=') |
111 | { |
112 | int len = 0; |
113 | |
114 | p2++; |
115 | |
116 | while (p2[len] != '\0') |
117 | len++; |
118 | |
119 | v = ___CAST(___UCS_2STRING,((unsigned short*)(___alloc_mem (sizeof (unsigned short) * (len +1)))) |
120 | ___alloc_mem (sizeof (___UCS_2) * (len+1)))((unsigned short*)(___alloc_mem (sizeof (unsigned short) * (len +1)))); |
121 | |
122 | if (v == 0) |
123 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
124 | |
125 | do |
126 | { |
127 | v[len] = ___CAST(___UCS_2,___CAST(unsigned char,p2[len]))((unsigned short)(((unsigned char)(p2[len])))); |
128 | } while (len-- > 0); |
129 | |
130 | *value = v; |
131 | } |
132 | } |
133 | } |
134 | |
135 | #else |
136 | |
137 | { |
138 | #if ENV_CHAR_BYTES1 == 1 |
139 | |
140 | char *cvalue_ptr = 0; |
141 | char cname[GETENV_NAME_STATIC_SIZE128]; |
142 | char *cname_ptr = cname; |
143 | |
144 | if (name_len >= GETENV_NAME_STATIC_SIZE128) |
145 | { |
146 | cname_ptr = ___CAST(char*,((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))) |
147 | ___alloc_mem (sizeof (*cname_ptr)((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))) |
148 | * (name_len+1)))((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))); |
149 | |
150 | if (cname_ptr == 0) |
151 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
152 | } |
153 | |
154 | do |
155 | { |
156 | cname_ptr[name_len] = name[name_len]; |
157 | } while (name_len-- > 0); |
158 | |
159 | #else |
160 | |
161 | ___UCS_2unsigned short *cvalue_ptr = 0; |
162 | ___UCS_2unsigned short *cname_ptr = name; |
163 | |
164 | #endif |
165 | |
166 | #ifndef USE_getenv |
167 | #ifndef USE_GetEnvironmentVariable |
168 | |
169 | if (cvalue_ptr != 0) |
170 | |
171 | #endif |
172 | #endif |
173 | |
174 | #ifdef USE_getenv |
175 | |
176 | cvalue_ptr = getenv (cname_ptr); |
177 | |
178 | if (cvalue_ptr != 0) |
179 | |
180 | #endif |
181 | |
182 | #ifdef USE_GetEnvironmentVariable |
183 | |
184 | { |
185 | ___CHAR_TYPE(___GETENV_CE_SELECT)___GETENV_CE_SELECT(unsigned char,char,unsigned short,unsigned int,wchar_t,char) cvalue[GETENV_VALUE_STATIC_SIZE128]; |
186 | int n; |
187 | |
188 | cvalue_ptr = cvalue; |
189 | |
190 | n = GetEnvironmentVariable |
191 | (cname_ptr, |
192 | cvalue_ptr, |
193 | GETENV_VALUE_STATIC_SIZE128); |
194 | |
195 | if (n >= GETENV_VALUE_STATIC_SIZE128) |
196 | { |
197 | cvalue_ptr = ___CAST(___CHAR_TYPE(___GETENV_CE_SELECT)*,((___GETENV_CE_SELECT(unsigned char,char,unsigned short,unsigned int,wchar_t,char)*)(___alloc_mem (sizeof (*cvalue_ptr) * n)) ) |
198 | ___alloc_mem (sizeof (*cvalue_ptr) * n))((___GETENV_CE_SELECT(unsigned char,char,unsigned short,unsigned int,wchar_t,char)*)(___alloc_mem (sizeof (*cvalue_ptr) * n)) ); |
199 | |
200 | if (cvalue_ptr != 0) |
201 | n = GetEnvironmentVariable |
202 | (cname_ptr, |
203 | cvalue_ptr, |
204 | n); |
205 | } |
206 | |
207 | if (cvalue_ptr == 0) |
208 | e = ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
209 | else if (n > 0) |
210 | |
211 | #endif |
212 | |
213 | { |
214 | ___UCS_2STRINGunsigned short* v; |
215 | int len = 0; |
216 | |
217 | while (cvalue_ptr[len] != '\0') |
218 | len++; |
219 | |
220 | v = ___CAST(___UCS_2STRING,((unsigned short*)(___alloc_mem (sizeof (unsigned short) * (len +1)))) |
221 | ___alloc_mem (sizeof (___UCS_2) * (len+1)))((unsigned short*)(___alloc_mem (sizeof (unsigned short) * (len +1)))); |
222 | |
223 | if (v == 0) |
224 | e = ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
225 | else |
226 | { |
227 | do |
228 | { |
229 | v[len] = ___CAST(___UCS_2,cvalue_ptr[len])((unsigned short)(cvalue_ptr[len])); |
230 | } while (len-- > 0); |
231 | |
232 | *value = v; |
233 | } |
234 | } |
235 | |
236 | #ifdef USE_GetEnvironmentVariable |
237 | |
238 | if (cvalue_ptr != cvalue) |
239 | ___free_mem (cvalue_ptr); |
240 | } |
241 | |
242 | #endif |
243 | |
244 | #if ENV_CHAR_BYTES1 == 1 |
245 | |
246 | if (cname_ptr != cname) |
247 | ___free_mem (cname_ptr); |
248 | |
249 | #endif |
250 | } |
251 | |
252 | #endif |
253 | |
254 | return e; |
255 | } |
256 | |
257 | |
258 | ___SCMOBJlong ___setenv_UCS_2 |
259 | ___P((___UCS_2STRING name,(unsigned short* name, unsigned short* value) |
260 | ___UCS_2STRING value),(unsigned short* name, unsigned short* value) |
261 | (name,(unsigned short* name, unsigned short* value) |
262 | value)(unsigned short* name, unsigned short* value) |
263 | ___UCS_2STRING name;(unsigned short* name, unsigned short* value) |
264 | ___UCS_2STRING value;)(unsigned short* name, unsigned short* value) |
265 | { |
266 | ___SCMOBJlong e; |
267 | ___UCS_2STRINGunsigned short* p1; |
268 | int name_len; |
269 | int value_len; |
270 | |
271 | /* reject strings that contain "=" except as the first character */ |
272 | |
273 | p1 = name; |
274 | |
275 | if (*p1 == '=') |
276 | p1++; |
277 | |
278 | while (*p1 != '\0') |
279 | { |
280 | #if ENV_CHAR_BYTES1 == 1 |
281 | if (*p1 > 255) |
282 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
283 | #endif |
284 | if (*p1++ == '=') |
285 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
286 | } |
287 | |
288 | name_len = p1 - name; |
289 | |
290 | p1 = value; |
291 | |
292 | while (*p1 != '\0') |
293 | { |
294 | #if ENV_CHAR_BYTES1 == 1 |
295 | if (*p1 > 255) |
296 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
297 | #endif |
298 | p1++; |
299 | } |
300 | |
301 | value_len = p1 - value; |
302 | |
303 | /* find in the environment a string of the form name=value */ |
304 | |
305 | e = ___FIX(___NO_ERR)(((long)(0))<<2); |
306 | |
307 | #ifdef USE_environ |
308 | |
309 | { |
310 | char **old_environ = environ; |
311 | char **probe; |
312 | char *p2; |
313 | |
314 | char *name_value = ___CAST(char*,((char*)(___alloc_mem (name_len + value_len + 2))) |
315 | ___alloc_mem (name_len + value_len + 2))((char*)(___alloc_mem (name_len + value_len + 2))); |
316 | |
317 | if (name_value == 0) |
318 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
319 | |
320 | p2 = name_value; |
321 | |
322 | p1 = name; |
323 | |
324 | while (name_len > 0) |
325 | { |
326 | *p2++ = ___CAST(char,*p1++)((char)(*p1++)); |
327 | name_len--; |
328 | } |
329 | |
330 | *p2++ = '='; |
331 | |
332 | p1 = value; |
333 | |
334 | while (value_len > 0) |
335 | { |
336 | *p2++ = ___CAST(char,*p1++)((char)(*p1++)); |
337 | value_len--; |
338 | } |
339 | |
340 | *p2++ = '\0'; |
341 | |
342 | probe = old_environ; |
343 | |
344 | while ((p2 = *probe++) != 0) |
345 | { |
346 | p1 = name; |
347 | |
348 | while (*p1 != '\0' && |
349 | *p1 == ___CAST(___UCS_2,___CAST(unsigned char,*p2))((unsigned short)(((unsigned char)(*p2))))) |
350 | { |
351 | p1++; |
352 | p2++; |
353 | } |
354 | |
355 | if (*p1 == '\0' && *p2 == '=') |
356 | { |
357 | probe[-1] = name_value; |
358 | return ___FIX(___NO_ERR)(((long)(0))<<2); |
359 | } |
360 | } |
361 | |
362 | if (___shell_mod.environ_unused_at_end > 0) |
363 | { |
364 | probe[-1] = name_value; |
365 | probe[0] = 0; |
366 | ___shell_mod.environ_unused_at_end--; |
367 | return ___FIX(___NO_ERR)(((long)(0))<<2); |
368 | } |
369 | else |
370 | { |
371 | char **new_environ; |
372 | int n = probe - old_environ; /* length including null pointer at end */ |
373 | |
374 | ___shell_mod.environ_unused_at_end = n/2 + 1; |
375 | |
376 | new_environ = |
377 | ___CAST(char**,((char**)(___alloc_mem ((n + ___shell_mod.environ_unused_at_end ) * sizeof (char*)))) |
378 | ___alloc_mem ((n + ___shell_mod.environ_unused_at_end)((char**)(___alloc_mem ((n + ___shell_mod.environ_unused_at_end ) * sizeof (char*)))) |
379 | * sizeof (char*)))((char**)(___alloc_mem ((n + ___shell_mod.environ_unused_at_end ) * sizeof (char*)))); |
380 | |
381 | if (new_environ == 0) |
382 | { |
383 | ___free_mem (name_value); |
384 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
385 | } |
386 | |
387 | environ = new_environ; |
388 | probe = old_environ; |
389 | |
390 | while (--n > 0) |
391 | *new_environ++ = *probe++; |
392 | |
393 | *new_environ++ = name_value; |
394 | *new_environ++ = 0; |
395 | |
396 | ___shell_mod.environ_unused_at_end--; |
397 | |
398 | if (___shell_mod.environ_was_extended) |
399 | ___free_mem (old_environ); |
400 | |
401 | ___shell_mod.environ_was_extended = 1; |
402 | } |
403 | } |
404 | |
405 | #else |
406 | |
407 | { |
408 | #if ENV_CHAR_BYTES1 == 1 |
409 | |
410 | char *cname_ptr; |
411 | char *cvalue_ptr; |
412 | char cname[SETENV_NAME_STATIC_SIZE128]; |
413 | char cvalue[SETENV_VALUE_STATIC_SIZE128]; |
414 | |
415 | if (name_len < SETENV_NAME_STATIC_SIZE128) |
416 | cname_ptr = cname; |
417 | else |
418 | { |
419 | cname_ptr = ___CAST(char*,((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))) |
420 | ___alloc_mem (sizeof (*cname_ptr)((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))) |
421 | * (name_len+1)))((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))); |
422 | |
423 | if (cname_ptr == 0) |
424 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
425 | } |
426 | |
427 | do |
428 | { |
429 | cname_ptr[name_len] = name[name_len]; |
430 | } while (name_len-- > 0); |
431 | |
432 | if (value_len < SETENV_VALUE_STATIC_SIZE128) |
433 | cvalue_ptr = cvalue; |
434 | else |
435 | { |
436 | cvalue_ptr = ___CAST(char*,((char*)(___alloc_mem (sizeof (*cvalue_ptr) * (value_len+1))) ) |
437 | ___alloc_mem (sizeof (*cvalue_ptr)((char*)(___alloc_mem (sizeof (*cvalue_ptr) * (value_len+1))) ) |
438 | * (value_len+1)))((char*)(___alloc_mem (sizeof (*cvalue_ptr) * (value_len+1))) ); |
439 | |
440 | if (cvalue_ptr == 0) |
441 | { |
442 | if (cname_ptr != cname) |
443 | ___free_mem (cname_ptr); |
444 | |
445 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
446 | } |
447 | } |
448 | |
449 | do |
450 | { |
451 | cvalue_ptr[value_len] = value[value_len]; |
452 | } while (value_len-- > 0); |
453 | |
454 | #else |
455 | |
456 | ___UCS_2unsigned short *cname_ptr = name; |
457 | ___UCS_2unsigned short *cvalue_ptr = value; |
458 | |
459 | #endif |
460 | |
461 | #ifdef USE_setenv |
462 | |
463 | if (setenv (cname_ptr, cvalue_ptr, 1) < 0) |
464 | e = err_code_from_errno ()___err_code_from_errno(); |
465 | |
466 | #endif |
467 | |
468 | #ifdef USE_SetEnvironmentVariable |
469 | |
470 | if (!SetEnvironmentVariable (cname_ptr, cvalue_ptr)) |
471 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
472 | |
473 | #endif |
474 | |
475 | #if ENV_CHAR_BYTES1 == 1 |
476 | |
477 | if (cvalue_ptr != cvalue) |
478 | ___free_mem (cvalue_ptr); |
479 | |
480 | if (cname_ptr != cname) |
481 | ___free_mem (cname_ptr); |
482 | |
483 | #endif |
484 | } |
485 | |
486 | #endif |
487 | |
488 | return e; |
489 | } |
490 | |
491 | |
492 | ___SCMOBJlong ___unsetenv_UCS_2 |
493 | ___P((___UCS_2STRING name),(unsigned short* name) |
494 | (name)(unsigned short* name) |
495 | ___UCS_2STRING name;)(unsigned short* name) |
496 | { |
497 | ___SCMOBJlong e; |
498 | ___UCS_2STRINGunsigned short* p1; |
499 | int name_len; |
500 | |
501 | /* reject strings that contain "=" except as the first character */ |
502 | |
503 | p1 = name; |
504 | |
505 | if (*p1 == '=') |
506 | p1++; |
507 | |
508 | while (*p1 != '\0') |
509 | { |
510 | #if ENV_CHAR_BYTES1 == 1 |
511 | if (*p1 > 255) |
512 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
513 | #endif |
514 | if (*p1++ == '=') |
515 | return ___FIX(___IMPL_LIMIT_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+2)))<<2); |
516 | } |
517 | |
518 | name_len = p1 - name; |
Value stored to 'name_len' is never read | |
519 | |
520 | /* find in the environment a string of the form name=value */ |
521 | |
522 | e = ___FIX(___NO_ERR)(((long)(0))<<2); |
523 | |
524 | #ifdef USE_environ |
525 | |
526 | { |
527 | char **probe; |
528 | char *p2; |
529 | |
530 | probe = environ; |
531 | |
532 | while ((p2 = *probe++) != 0) |
533 | { |
534 | p1 = name; |
535 | |
536 | while (*p1 != '\0' && |
537 | *p1 == ___CAST(___UCS_2,___CAST(unsigned char,*p2))((unsigned short)(((unsigned char)(*p2))))) |
538 | { |
539 | p1++; |
540 | p2++; |
541 | } |
542 | |
543 | if (*p1 == '\0' && *p2 == '=') |
544 | { |
545 | ___shell_mod.environ_unused_at_end++; |
546 | |
547 | while ((probe[-1] = probe[0]) != 0) |
548 | probe++; |
549 | |
550 | return ___FIX(___NO_ERR)(((long)(0))<<2); |
551 | } |
552 | } |
553 | } |
554 | |
555 | #else |
556 | |
557 | { |
558 | #if ENV_CHAR_BYTES1 == 1 |
559 | |
560 | char *cname_ptr; |
561 | char cname[UNSETENV_NAME_STATIC_SIZE128]; |
562 | |
563 | if (name_len < UNSETENV_NAME_STATIC_SIZE128) |
564 | cname_ptr = cname; |
565 | else |
566 | { |
567 | cname_ptr = ___CAST(char*,((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))) |
568 | ___alloc_mem (sizeof (*cname_ptr)((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))) |
569 | * (name_len+1)))((char*)(___alloc_mem (sizeof (*cname_ptr) * (name_len+1)))); |
570 | |
571 | if (cname_ptr == 0) |
572 | return ___FIX(___HEAP_OVERFLOW_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+5)))<<2); |
573 | } |
574 | |
575 | do |
576 | { |
577 | cname_ptr[name_len] = name[name_len]; |
578 | } while (name_len-- > 0); |
579 | |
580 | #else |
581 | |
582 | ___UCS_2unsigned short *cname_ptr = name; |
583 | |
584 | #endif |
585 | |
586 | #ifdef USE_unsetenv |
587 | |
588 | if (unsetenv (cname_ptr) < 0) |
589 | e = err_code_from_errno ()___err_code_from_errno(); |
590 | |
591 | #endif |
592 | |
593 | #ifdef USE_SetEnvironmentVariable |
594 | |
595 | if (!SetEnvironmentVariable (cname_ptr, 0)) |
596 | { |
597 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
598 | |
599 | /* |
600 | * Apparently an error is signaled if the environment |
601 | * variable being removed does not exist (the Microsoft |
602 | * documentation does not mention this). |
603 | */ |
604 | |
605 | if (e == ___FIX(___WIN32_ERR(ERROR_ENVVAR_NOT_FOUND))(((long)((((HRESULT_FROM_WIN32(ERROR_ENVVAR_NOT_FOUND))&~ (~((int)(0))<<25)) | (((HRESULT_FROM_WIN32(ERROR_ENVVAR_NOT_FOUND ))&~((int)(0))<<27)>>2))))<<2)) |
606 | e = ___FIX(___NO_ERR)(((long)(0))<<2); |
607 | } |
608 | |
609 | #endif |
610 | |
611 | #if ENV_CHAR_BYTES1 == 1 |
612 | |
613 | if (cname_ptr != cname) |
614 | ___free_mem (cname_ptr); |
615 | |
616 | #endif |
617 | } |
618 | |
619 | #endif |
620 | |
621 | return e; |
622 | } |
623 | |
624 | |
625 | ___SCMOBJlong ___os_getenv |
626 | ___P((___SCMOBJ name),(long name) |
627 | (name)(long name) |
628 | ___SCMOBJ name;)(long name) |
629 | { |
630 | ___SCMOBJlong e; |
631 | ___SCMOBJlong result; |
632 | ___UCS_2STRINGunsigned short* cname; |
633 | ___UCS_2STRINGunsigned short* cvalue; |
634 | |
635 | if ((e = ___SCMOBJ_to_NONNULLUCS_2STRING |
636 | (name, |
637 | &cname, |
638 | 1)) |
639 | != ___FIX(___NO_ERR)(((long)(0))<<2)) |
640 | result = e; |
641 | else |
642 | { |
643 | if ((e = ___getenv_UCS_2 (cname, &cvalue)) != ___FIX(___NO_ERR)(((long)(0))<<2)) |
644 | result = e; |
645 | else |
646 | { |
647 | if ((e = ___UCS_2STRING_to_SCMOBJ |
648 | (cvalue, |
649 | &result, |
650 | ___RETURN_POS127)) |
651 | != ___FIX(___NO_ERR)(((long)(0))<<2)) |
652 | result = e; |
653 | else |
654 | ___release_scmobj (result); |
655 | |
656 | if (cvalue != 0) |
657 | ___free_mem (cvalue); |
658 | } |
659 | |
660 | ___release_string (cname); |
661 | } |
662 | |
663 | return result; |
664 | } |
665 | |
666 | |
667 | ___SCMOBJlong ___os_setenv |
668 | ___P((___SCMOBJ name,(long name, long value) |
669 | ___SCMOBJ value),(long name, long value) |
670 | (name,(long name, long value) |
671 | value)(long name, long value) |
672 | ___SCMOBJ name;(long name, long value) |
673 | ___SCMOBJ value;)(long name, long value) |
674 | { |
675 | ___SCMOBJlong e; |
676 | ___UCS_2STRINGunsigned short* cname; |
677 | ___UCS_2STRINGunsigned short* cvalue; |
678 | |
679 | if ((e = ___SCMOBJ_to_NONNULLUCS_2STRING |
680 | (name, |
681 | &cname, |
682 | 1)) |
683 | == ___FIX(___NO_ERR)(((long)(0))<<2)) |
684 | { |
685 | if (value == ___ABSENT((((long)(-6))<<2)+2)) |
686 | e = ___unsetenv_UCS_2 (cname); |
687 | else if ((e = ___SCMOBJ_to_NONNULLUCS_2STRING |
688 | (value, |
689 | &cvalue, |
690 | 2)) |
691 | == ___FIX(___NO_ERR)(((long)(0))<<2)) |
692 | { |
693 | e = ___setenv_UCS_2 (cname, cvalue); |
694 | ___release_string (cvalue); |
695 | } |
696 | |
697 | ___release_string (cname); |
698 | } |
699 | |
700 | return e; |
701 | } |
702 | |
703 | |
704 | ___SCMOBJlong ___os_environ ___PVOID(void) |
705 | { |
706 | ___SCMOBJlong e; |
707 | ___SCMOBJlong result; |
708 | |
709 | #ifndef USE_environ |
710 | #ifndef USE_GetEnvironmentStrings |
711 | |
712 | result = ___NUL((((long)(-3))<<2)+2); |
713 | |
714 | #endif |
715 | #endif |
716 | |
717 | #ifdef USE_environ |
718 | |
719 | if ((e = ___NONNULLCHARSTRINGLIST_to_SCMOBJ |
720 | (environ, |
721 | &result, |
722 | ___RETURN_POS127)) |
723 | != ___FIX(___NO_ERR)(((long)(0))<<2)) |
724 | result = e; |
725 | else |
726 | ___release_scmobj (result); |
727 | |
728 | #endif |
729 | |
730 | #ifdef USE_GetEnvironmentStrings |
731 | |
732 | ___STRING_TYPE(___ENVIRON_CE_SELECT)___ENVIRON_CE_SELECT(unsigned char*,char*,unsigned short*,unsigned int*,wchar_t*,char*) env; |
733 | ___STRING_TYPE(___ENVIRON_CE_SELECT)___ENVIRON_CE_SELECT(unsigned char*,char*,unsigned short*,unsigned int*,wchar_t*,char*) ptr; |
734 | ___SCMOBJlong pair; |
735 | ___SCMOBJlong str; |
736 | |
737 | e = ___FIX(___NO_ERR)(((long)(0))<<2); |
738 | result = ___NUL((((long)(-3))<<2)+2); |
739 | |
740 | env = GetEnvironmentStrings (); |
741 | |
742 | if (env != 0 && *env != 0) |
743 | { |
744 | ptr = env; |
745 | |
746 | /* find end of environment strings. */ |
747 | |
748 | do |
749 | { |
750 | do { ptr++; } while (*ptr != 0); |
751 | ptr++; /* skip null char at end of string */ |
752 | } while (*ptr != 0); |
753 | |
754 | while (ptr > env) |
755 | { |
756 | ptr--; /* move ptr to terminating null char of previous string */ |
757 | |
758 | while (ptr > env && ptr[-1] != 0) |
759 | ptr--; |
760 | |
761 | if ((e = ___NONNULLSTRING_to_SCMOBJ |
762 | (ptr, |
763 | &str, |
764 | ___RETURN_POS127, |
765 | ___CE(___ENVIRON_CE_SELECT)___ENVIRON_CE_SELECT((2<<0), (3<<0), (13<<0 ), (16<<0), (19<<0), (20<<0)))) |
766 | != ___FIX(___NO_ERR)(((long)(0))<<2)) |
767 | break; |
768 | |
769 | pair = ___make_pair (str, result, ___STILL5); |
770 | |
771 | ___release_scmobj (str); |
772 | ___release_scmobj (result); |
773 | |
774 | if (___FIXNUMP(pair)(((pair)&((1<<2)-1))==(0))) |
775 | { |
776 | e = ___FIX(___CTOS_HEAP_OVERFLOW_ERR+___RETURN_POS)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+(125<<7))+127))<<2); |
777 | break; |
778 | } |
779 | |
780 | result = pair; |
781 | } |
782 | |
783 | ___release_scmobj (result); |
784 | } |
785 | |
786 | if (env != 0) |
787 | if (!FreeEnvironmentStrings (env)) |
788 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
789 | |
790 | if (e != ___FIX(___NO_ERR)(((long)(0))<<2)) |
791 | result = e; |
792 | |
793 | #endif |
794 | |
795 | return result; |
796 | } |
797 | |
798 | |
799 | /*---------------------------------------------------------------------------*/ |
800 | |
801 | /* Shell command. */ |
802 | |
803 | |
804 | ___SCMOBJlong ___os_shell_command |
805 | ___P((___SCMOBJ cmd,(long cmd, long dir) |
806 | ___SCMOBJ dir),(long cmd, long dir) |
807 | (cmd,(long cmd, long dir) |
808 | dir)(long cmd, long dir) |
809 | ___SCMOBJ cmd;(long cmd, long dir) |
810 | ___SCMOBJ dir;)(long cmd, long dir) |
811 | { |
812 | ___SCMOBJlong e; |
813 | |
814 | #ifndef USE_POSIX |
815 | #ifndef USE_WIN32 |
816 | |
817 | e = ___FIX(___UNIMPL_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+4)))<<2); |
818 | |
819 | #endif |
820 | #endif |
821 | |
822 | #ifdef USE_POSIX |
823 | |
824 | char *ccmd; |
825 | |
826 | if ((e = ___SCMOBJ_to_NONNULLCHARSTRING |
827 | (cmd, |
828 | &ccmd, |
829 | 1)) |
830 | == ___FIX(___NO_ERR)(((long)(0))<<2)) |
831 | { |
832 | void *cdir; |
833 | |
834 | if ((e = ___SCMOBJ_to_NONNULLSTRING |
835 | (dir, |
836 | &cdir, |
837 | 2, |
838 | ___CE(___PATH_CE_SELECT)(20<<0), |
839 | 0)) |
840 | == ___FIX(___NO_ERR)(((long)(0))<<2)) |
841 | { |
842 | int code; |
843 | |
844 | ___CHAR_TYPE(___PATH_CE_SELECT)char old_dir[___PATH_MAX_LENGTH1024+1]; |
845 | |
846 | if (getcwd (old_dir, ___PATH_MAX_LENGTH1024) == 0) |
847 | e = err_code_from_errno ()___err_code_from_errno(); |
848 | else |
849 | { |
850 | if (chdir (___CAST(___STRING_TYPE(___PATH_CE_SELECT),cdir)((char*)(cdir))) < 0) |
851 | e = err_code_from_errno ()___err_code_from_errno(); |
852 | else |
853 | { |
854 | ___disable_os_interrupts (); |
855 | |
856 | code = system (ccmd); |
857 | |
858 | if (code == -1) |
859 | e = err_code_from_errno ()___err_code_from_errno(); |
860 | else |
861 | e = ___FIX(code & ___MAX_FIX)(((long)(code & ((((long)(1))<<((64 -2)-1))-1)))<< 2); |
862 | |
863 | ___enable_os_interrupts (); |
864 | |
865 | chdir (old_dir); /* ignore error */ |
866 | } |
867 | } |
868 | |
869 | ___release_string (cdir); |
870 | } |
871 | |
872 | ___release_string (ccmd); |
873 | } |
874 | |
875 | #endif |
876 | |
877 | #ifdef USE_WIN32 |
878 | |
879 | #ifdef _UNICODE |
880 | #define ___SHELL_COMMAND_CE_SELECT(latin1,utf8,ucs2,ucs4,wchar,native) ucs2 |
881 | #else |
882 | #define ___SHELL_COMMAND_CE_SELECT(latin1,utf8,ucs2,ucs4,wchar,native) native |
883 | #endif |
884 | |
885 | void *ccmd; |
886 | |
887 | if ((e = ___SCMOBJ_to_NONNULLSTRING |
888 | (cmd, |
889 | &ccmd, |
890 | 1, |
891 | ___CE(___SHELL_COMMAND_CE_SELECT)___SHELL_COMMAND_CE_SELECT((2<<0), (3<<0), (13<< 0), (16<<0), (19<<0), (20<<0)), |
892 | 0)) |
893 | == ___FIX(___NO_ERR)(((long)(0))<<2)) |
894 | { |
895 | void *cdir; |
896 | |
897 | if ((e = ___SCMOBJ_to_STRING |
898 | (dir, |
899 | &cdir, |
900 | 2, |
901 | ___CE(___PATH_CE_SELECT)(20<<0), |
902 | 0)) |
903 | == ___FIX(___NO_ERR)(((long)(0))<<2)) |
904 | { |
905 | DWORD n; |
906 | |
907 | ___CHAR_TYPE(___PATH_CE_SELECT)char old_dir[___PATH_MAX_LENGTH1024+1]; |
908 | |
909 | n = GetCurrentDirectory (___PATH_MAX_LENGTH1024+1, |
910 | old_dir); |
911 | |
912 | if (n < 1 || n > ___PATH_MAX_LENGTH1024) |
913 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
914 | else |
915 | { |
916 | if (!SetCurrentDirectory (___CAST(___STRING_TYPE(___PATH_CE_SELECT),cdir)((char*)(cdir)))) |
917 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
918 | else |
919 | { |
920 | |
921 | #ifdef ___DO_NOT_USE_system |
922 | |
923 | /* |
924 | * This code does not really cause the shell to run |
925 | * the command. This means that the shell builtin |
926 | * commands (such as "DIR" cannot be executed. It |
927 | * is better to use "system" and "_wsystem". |
928 | */ |
929 | |
930 | DWORD code; |
931 | STARTUPINFO si; |
932 | PROCESS_INFORMATION pi; |
933 | |
934 | ZeroMemory (&si, sizeof (si)); |
935 | si.cb = sizeof (si); |
936 | ZeroMemory (&pi, sizeof (pi)); |
937 | |
938 | if (!CreateProcess |
939 | (NULL((void*)0), /* module name */ |
940 | ___CAST(___STRING_TYPE(___SHELL_COMMAND_CE_SELECT),ccmd)((___SHELL_COMMAND_CE_SELECT(unsigned char*,char*,unsigned short *,unsigned int*,wchar_t*,char*))(ccmd)), |
941 | NULL((void*)0), /* process handle not inheritable */ |
942 | NULL((void*)0), /* thread handle not inheritable */ |
943 | FALSE, /* set handle inheritance to FALSE */ |
944 | 0, /* no creation flags */ |
945 | NULL((void*)0), /* use parent's environment block */ |
946 | NULL((void*)0), /* use parent's starting directory */ |
947 | &si, /* pointer to STARTUPINFO structure */ |
948 | &pi)) /* pointer to PROCESS_INFORMATION structure */ |
949 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
950 | else |
951 | { |
952 | if (WaitForSingleObject (pi.hProcess, INFINITE) == WAIT_FAILED || |
953 | !GetExitCodeProcess (pi.hProcess, &code)) |
954 | e = err_code_from_GetLastError ()___err_code_from_GetLastError(); |
955 | else |
956 | e = ___FIX(code & ___MAX_FIX)(((long)(code & ((((long)(1))<<((64 -2)-1))-1)))<< 2); |
957 | |
958 | CloseHandle (pi.hProcess); /* ignore error */ |
959 | CloseHandle (pi.hThread); /* ignore error */ |
960 | } |
961 | |
962 | #else |
963 | |
964 | int code; |
965 | |
966 | #ifdef _UNICODE |
967 | code = _wsystem (___CAST(___STRING_TYPE(___SHELL_COMMAND_CE_SELECT),ccmd)((___SHELL_COMMAND_CE_SELECT(unsigned char*,char*,unsigned short *,unsigned int*,wchar_t*,char*))(ccmd))); |
968 | #else |
969 | code = system (___CAST(___STRING_TYPE(___SHELL_COMMAND_CE_SELECT),ccmd)((___SHELL_COMMAND_CE_SELECT(unsigned char*,char*,unsigned short *,unsigned int*,wchar_t*,char*))(ccmd))); |
970 | #endif |
971 | |
972 | if (code == -1) |
973 | e = err_code_from_errno ()___err_code_from_errno(); |
974 | else |
975 | e = ___FIX(code & ___MAX_FIX)(((long)(code & ((((long)(1))<<((64 -2)-1))-1)))<< 2); |
976 | |
977 | #endif |
978 | |
979 | SetCurrentDirectory (old_dir); /* ignore error */ |
980 | } |
981 | } |
982 | |
983 | ___release_string (cdir); |
984 | } |
985 | |
986 | ___release_string (ccmd); |
987 | } |
988 | |
989 | #endif |
990 | |
991 | return e; |
992 | } |
993 | |
994 | |
995 | /*---------------------------------------------------------------------------*/ |
996 | |
997 | /* Shell module initialization/finalization. */ |
998 | |
999 | |
1000 | ___SCMOBJlong ___setup_shell_module ___PVOID(void) |
1001 | { |
1002 | if (!___shell_mod.setup) |
1003 | { |
1004 | #ifdef USE_environ |
1005 | |
1006 | ___shell_mod.environ_unused_at_end = 0; |
1007 | ___shell_mod.environ_was_extended = 0; |
1008 | |
1009 | #endif |
1010 | |
1011 | ___shell_mod.setup = 1; |
1012 | return ___FIX(___NO_ERR)(((long)(0))<<2); |
1013 | } |
1014 | |
1015 | return ___FIX(___UNKNOWN_ERR)(((long)((((((int)(-1))<<29)+(((int)(448))<<16)+( 0))+3)))<<2); |
1016 | } |
1017 | |
1018 | |
1019 | void ___cleanup_shell_module ___PVOID(void) |
1020 | { |
1021 | if (___shell_mod.setup) |
1022 | { |
1023 | #ifdef USE_environ |
1024 | |
1025 | if (___shell_mod.environ_was_extended) |
1026 | ___free_mem (environ); |
1027 | |
1028 | #endif |
1029 | |
1030 | ___shell_mod.setup = 0; |
1031 | } |
1032 | } |
1033 | |
1034 | |
1035 | /*---------------------------------------------------------------------------*/ |