63 #include <sys/ioctl.h>
66 #include <sys/types.h>
85 #define CMDBUFSIZE 1024
87 #define CMDDEFNAME "/bin/ksh"
90 #elif defined(OPSYS_SUN)
91 #define CMDDEFNAME "/bin/sh"
95 #define CMDDEFNAME "/bin/bash"
96 #define COMSPEC "bash"
102 #define FULLSEG 65536L
104 #define FILESPEC_PATH 'P'
105 #define FILESPEC_NAME 'N'
106 #define FILESPEC_LOCATION 'L'
107 #define FILESPEC_EXTENSION 'E'
108 #define FILESPEC_DRIVE 'D'
110 #define KIOCSOUND 0x4B2F
147 const char *home_dir = NULL;
148 char *dir_buf = NULL;
155 if (*(st) ==
'~' && (*(st+1) ==
'\0' || *(st+1) ==
'/'|| *(st+1) ==
' ' ))
161 home_dir = getenv(
"HOME");
165 dir_buf = (
char *)malloc(strlen(home_dir)+strlen(st)+2);
169 sprintf(dir_buf,
"%s/%s", home_dir, st);
175 home_dir = getenv(
"HOME");
177 dir_buf = (
char *)malloc(strlen(home_dir)+2);
180 sprintf(dir_buf,
"%s/", home_dir);
184 else if (*(st) ==
'~')
187 slash = strchr(st,
'/');
197 dir_buf = (
char *)malloc(strlen(ppwd->pw_dir)+2);
201 sprintf(dir_buf,
"%s/", ppwd->pw_dir);
209 memcpy(username, st, slash-st);
210 username[slash-st] =
'\0';
211 ppwd = getpwnam(username);
214 dir_buf = (
char *)malloc(strlen(ppwd->pw_dir)+strlen(slash)+2);
218 sprintf(dir_buf,
"%s/%s", ppwd->pw_dir, slash);
251 return context->NullString();
256 char temp[PATH_MAX + 3];
258 return context->NewStringFromAsciiz(temp);
268 const char *endPtr = name + strlen(name);
269 const char *pathEnd = strrchr(name,
'/');
271 const char *pathStart = name;
275 pathEnd = pathEnd == NULL ? pathStart : pathEnd + 1;
277 const char *nameStart = pathEnd == name ? name : pathEnd;
279 switch (toupper(*option))
283 return context->String(pathStart, pathEnd - pathStart);
288 return context->String(nameStart, endPtr - nameStart);
293 return context->NullString();
298 return context->String(name, pathEnd - name);
304 const char *lastDot = strrchr(name,
'.');
306 if (lastDot >= nameStart)
310 return context->String(lastDot, endPtr - lastDot);
314 return context->NullString();
321 optionChar[0] = *option;
322 optionChar[1] =
'\0';
325 context->String(
"ELNP"), context->String(optionChar));
351 size_t named_argcount,
365 if (activation->
callExternalRexx(target, arguments, argcount, named_argcount, calltype, result))
446 for (;*Environment != NULL;Environment++)
448 size += strlen(*Environment);
455 if (!(curr_dir=(
char *)malloc(PATH_MAX + 3)))
462 size += strlen(curr_dir);
464 size +=
sizeof(size_t);
471 New +=
sizeof(size_t);
473 memcpy(New,curr_dir,strlen(curr_dir));
474 New += strlen(curr_dir);
482 for (;*Environment != NULL;Environment++)
485 memcpy(New,*Environment,strlen(*Environment));
486 New += strlen(*Environment);
516 char *Env_Var_String;
517 char namebufsave[256],namebufcurr[256];
523 begin = current = (
char *)CurrentEnv;
525 current +=
sizeof(size_t);
526 if (chdir(current) == -1)
529 sprintf(msg,
"Error restoring current directory: %s", current);
532 current += strlen(current);
539 for (;*Environment != NULL;Environment++)
541 length = strlen(*Environment)+1;
543 Env_Var_String = (
char *)malloc(length);
544 memcpy(Env_Var_String,*Environment,length);
545 putenv(Env_Var_String);
551 for (;(size_t)(current-begin)<size;current+=(strlen(current)+1))
558 for (i=0;(*np!=
'=')&&(i<255);np++,i++)
560 memcpy(&(namebufsave[i]),np,1);
562 memcpy(&(namebufsave[i]),
"\0",1);
564 for (;*Environment != NULL;Environment++)
569 for (i=0;(*np!=
'=')&&(i<255);np++,i++)
571 memcpy(&(namebufcurr[i]),np,1);
573 memcpy(&(namebufcurr[i]),
"\0",1);
575 if (!strcmp(namebufsave,namebufcurr))
581 if (putenv(current) == -1)
void reportException(wholenumber_t error)
RexxBuffer * new_buffer(sizeB_t s)
#define Error_System_service
#define Error_System_service_service
static bool callNativeRoutine(RexxActivity *activity, RexxString *name, RexxObject **arguments, size_t argcount, size_t named_argcount, ProtectedObject &result)
bool callExternalRexx(RexxString *, RexxObject **, size_t, size_t, RexxString *, ProtectedObject &)
void pushEnvironment(RexxObject *)
bool callMacroSpaceFunction(RexxString *, RexxObject **, size_t, size_t, RexxString *, int, ProtectedObject &)
RexxObject * popEnvironment()
static RexxObject * buildEnvlist()
static bool invokeExternalFunction(RexxActivation *, RexxActivity *, RexxString *, RexxObject **, size_t, size_t, RexxString *, ProtectedObject &)
static RexxObject * popEnvironment(RexxActivation *context)
static RexxObject * pushEnvironment(RexxActivation *context)
static void restoreEnvironment(void *CurrentEnv)
static void getCurrentWorkingDirectory(char *)
#define Rexx_Error_Incorrect_call_list
struct _RexxStringObject * RexxStringObject
struct _RexxArrayObject * RexxArrayObject
RexxRoutine1(RexxStringObject, sysDirectory, OPTIONAL_CSTRING, dir)
RexxRoutine2(CSTRING, sysBeep, OPTIONAL_wholenumber_t, Frequency, OPTIONAL_wholenumber_t, Duration)
char * resolve_tilde(const char *path)
#define FILESPEC_LOCATION
struct _ENVENTRY ENVENTRY
#define FILESPEC_EXTENSION