static void get_shell(void);
static long tokenize(char *str, char **dest, char ***destv);
int do_spawn2(char *cmd, int exectype);
-static BOOL has_redirection(char *ptr);
+static BOOL has_shell_metachars(char *ptr);
static long filetime_to_clock(PFILETIME ft);
static BOOL filetime_from_time(PFILETIME ft, time_t t);
static char * get_emd_part(char *leading, char *trailing, ...);
if (retval == ERROR_SUCCESS){
retval = RegQueryValueEx(handle, lpszValueName, 0, &type, NULL, lpDataLen);
if (retval == ERROR_SUCCESS && type == REG_SZ) {
- if (*ptr != NULL) {
+ if (*ptr) {
Renew(*ptr, *lpDataLen, char);
}
else {
retval = RegQueryValueEx(handle, lpszValueName, 0, NULL, (PBYTE)*ptr, lpDataLen);
if (retval != ERROR_SUCCESS) {
Safefree(*ptr);
- *ptr = NULL;
+ *ptr = Nullch;
}
}
RegCloseKey(handle);
GetRegStr(const char *lpszValueName, char** ptr, DWORD* lpDataLen)
{
*ptr = GetRegStrFromKey(HKEY_CURRENT_USER, lpszValueName, ptr, lpDataLen);
- if (*ptr == NULL)
+ if (*ptr == Nullch)
{
*ptr = GetRegStrFromKey(HKEY_LOCAL_MACHINE, lpszValueName, ptr, lpDataLen);
}
/* $stdlib = $HKCU{"lib-$]"} || $HKLM{"lib-$]"} || $HKCU{"lib"} || $HKLM{"lib"} || ""; */
sprintf(buffer, "%s-%s", stdlib, pl);
path = GetRegStr(buffer, &path, &datalen);
- if (path == NULL)
+ if (!path)
path = GetRegStr(stdlib, &path, &datalen);
/* $stdlib .= ";$EMD/../../lib" */
static BOOL
-has_redirection(char *ptr)
+has_shell_metachars(char *ptr)
{
int inquote = 0;
char quote = '\0';
/*
* Scan string looking for redirection (< or >) or pipe
- * characters (|) that are not in a quoted string
+ * characters (|) that are not in a quoted string.
+ * Shell variable interpolation (%VAR%) can also happen inside strings.
*/
while (*ptr) {
switch(*ptr) {
+ case '%':
+ return TRUE;
case '\'':
case '\"':
if (inquote) {
/* Save an extra exec if possible. See if there are shell
* metacharacters in it */
- if (!has_redirection(cmd)) {
+ if (!has_shell_metachars(cmd)) {
New(1301,argv, strlen(cmd) / 2 + 2, char*);
New(1302,cmd2, strlen(cmd) + 1, char);
strcpy(cmd2, cmd);
return NULL;
/* check to see if filename is a directory */
- if (win32_stat(filename, &sbuf) < 0 || (sbuf.st_mode & S_IFDIR) == 0) {
- /* CRT is buggy on sharenames, so make sure it really isn't */
- DWORD r = GetFileAttributes(filename);
- if (r == 0xffffffff || !(r & FILE_ATTRIBUTE_DIRECTORY))
- return NULL;
- }
+ if (win32_stat(filename, &sbuf) < 0 || !S_ISDIR(sbuf.st_mode))
+ return NULL;
/* Get us a DIR structure */
Newz(1303, p, 1, DIR);
DllExport int
win32_stat(const char *path, struct stat *buffer)
{
- char t[MAX_PATH+1];
+ char t[MAX_PATH+1];
const char *p = path;
int l = strlen(path);
int res;
}
}
res = stat(p,buffer);
+ if (res < 0) {
+ /* CRT is buggy on sharenames, so make sure it really isn't.
+ * XXX using GetFileAttributesEx() will enable us to set
+ * buffer->st_*time (but note that's not available on the
+ * Windows of 1995) */
+ DWORD r = GetFileAttributes(p);
+ if (r != 0xffffffff && (r & FILE_ATTRIBUTE_DIRECTORY)) {
+ buffer->st_mode |= S_IFDIR | S_IREAD;
+ errno = 0;
+ if (!(r & FILE_ATTRIBUTE_READONLY))
+ buffer->st_mode |= S_IWRITE | S_IEXEC;
+ return 0;
+ }
+ }
#ifdef __BORLANDC__
- if (res == 0) {
+ else {
if (S_ISDIR(buffer->st_mode))
buffer->st_mode |= S_IWRITE | S_IEXEC;
else if (S_ISREG(buffer->st_mode)) {
DllExport char *
win32_getenv(const char *name)
{
- static char *curitem = Nullch;
- static DWORD curlen = 512;
+ static char *curitem = Nullch; /* XXX threadead */
+ static DWORD curlen = 0; /* XXX threadead */
DWORD needlen;
- if (!curitem)
+ if (!curitem) {
+ curlen = 512;
New(1305,curitem,curlen,char);
+ }
needlen = GetEnvironmentVariable(name,curitem,curlen);
if (needlen != 0) {
needlen = GetEnvironmentVariable(name,curitem,curlen);
}
}
- else
- {
+ else {
/* allow any environment variables that begin with 'PERL'
- to be stored in the registry
- */
- if(curitem != NULL)
+ to be stored in the registry */
+ if (curitem)
*curitem = '\0';
if (strncmp(name, "PERL", 4) == 0) {
- if (curitem != NULL) {
+ if (curitem) {
Safefree(curitem);
- curitem = NULL;
+ curitem = Nullch;
+ curlen = 0;
}
curitem = GetRegStr(name, &curitem, &curlen);
}
}
- if(curitem != NULL && *curitem == '\0')
+ if (curitem && *curitem == '\0')
return Nullch;
return curitem;