summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>1998-03-09 02:38:35 +0000
committerGurusamy Sarathy <gsar@cpan.org>1998-03-09 02:38:35 +0000
commit9404a519907ec8d9bce4b0bf7a09103f1f9f6fcb (patch)
tree729d83ef3a542ec0b255355189a7f5a19f074fe9 /win32/win32.c
parent1d16519d77cbada019f865cb923236cd48a23c72 (diff)
downloadperl-9404a519907ec8d9bce4b0bf7a09103f1f9f6fcb.tar.gz
[win32] minor win32 support fixes
- add a better implementation of Win32::DomainName() (as suggested by Jutta M. Klebe <jmk@exc.bybyte.de>) - fix opendir() emulation was unsafe what given long paths p4raw-id: //depot/win32/perl@801
Diffstat (limited to 'win32/win32.c')
-rw-r--r--win32/win32.c134
1 files changed, 64 insertions, 70 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 1ee0587e86..aaf5139fe2 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -16,6 +16,15 @@
#endif
#include <windows.h>
+#include <lmcons.h>
+#include <lmerr.h>
+/* ugliness to work around a buggy struct definition in lmwksta.h */
+#undef LPTSTR
+#define LPTSTR LPWSTR
+#include <lmwksta.h>
+#undef LPTSTR
+#define LPTSTR LPSTR
+
/* #include "config.h" */
#define PERLIO_NOT_STDIO 0
@@ -152,12 +161,12 @@ has_redirection(char *ptr)
* Scan string looking for redirection (< or >) or pipe
* characters (|) that are not in a quoted string
*/
- while(*ptr) {
+ while (*ptr) {
switch(*ptr) {
case '\'':
case '\"':
- if(inquote) {
- if(quote == *ptr) {
+ if (inquote) {
+ if (quote == *ptr) {
inquote = 0;
quote = '\0';
}
@@ -170,7 +179,7 @@ has_redirection(char *ptr)
case '>':
case '<':
case '|':
- if(!inquote)
+ if (!inquote)
return TRUE;
default:
break;
@@ -321,7 +330,7 @@ do_aspawn(void *vreally, void **vmark, void **vsp)
flag = SvIVx(*mark);
}
- while(++mark <= sp) {
+ while (++mark <= sp) {
if (*mark && (str = SvPV(*mark, na)))
argv[index++] = str;
else
@@ -373,7 +382,7 @@ do_spawn2(char *cmd, int exectype)
/* Save an extra exec if possible. See if there are shell
* metacharacters in it */
- if(!has_redirection(cmd)) {
+ if (!has_redirection(cmd)) {
New(1301,argv, strlen(cmd) / 2 + 2, char*);
New(1302,cmd2, strlen(cmd) + 1, char);
strcpy(cmd2, cmd);
@@ -383,9 +392,9 @@ do_spawn2(char *cmd, int exectype)
s++;
if (*s)
*(a++) = s;
- while(*s && !isspace(*s))
+ while (*s && !isspace(*s))
s++;
- if(*s)
+ if (*s)
*s++ = '\0';
}
*a = Nullch;
@@ -468,9 +477,6 @@ do_exec(char *cmd)
return FALSE;
}
-
-#define PATHLEN 1024
-
/* The idea here is to read all the directory names into a string table
* (separated by nulls) and when one of the other dir functions is called
* return the pointer to the current file name.
@@ -478,19 +484,17 @@ do_exec(char *cmd)
DIR *
opendir(char *filename)
{
- DIR *p;
- long len;
- long idx;
- char scannamespc[PATHLEN];
- char *scanname = scannamespc;
- struct stat sbuf;
- WIN32_FIND_DATA FindData;
- HANDLE fh;
-/* char root[_MAX_PATH];*/
-/* char volname[_MAX_PATH];*/
-/* DWORD serial, maxname, flags;*/
-/* BOOL downcase;*/
-/* char *dummy;*/
+ DIR *p;
+ long len;
+ long idx;
+ char scanname[MAX_PATH+3];
+ struct stat sbuf;
+ WIN32_FIND_DATA FindData;
+ HANDLE fh;
+
+ len = strlen(filename);
+ if (len > MAX_PATH)
+ return NULL;
/* check to see if filename is a directory */
if (win32_stat(filename, &sbuf) < 0 || (sbuf.st_mode & S_IFDIR) == 0) {
@@ -500,35 +504,21 @@ opendir(char *filename)
return NULL;
}
- /* get the file system characteristics */
-/* if(GetFullPathName(filename, MAX_PATH, root, &dummy)) {
- * if(dummy = strchr(root, '\\'))
- * *++dummy = '\0';
- * if(GetVolumeInformation(root, volname, MAX_PATH, &serial,
- * &maxname, &flags, 0, 0)) {
- * downcase = !(flags & FS_CASE_IS_PRESERVED);
- * }
- * }
- * else {
- * downcase = TRUE;
- * }
- */
/* Get us a DIR structure */
Newz(1303, p, 1, DIR);
- if(p == NULL)
+ if (p == NULL)
return NULL;
/* Create the search pattern */
strcpy(scanname, filename);
-
- if(index("/\\", *(scanname + strlen(scanname) - 1)) == NULL)
- strcat(scanname, "/*");
- else
- strcat(scanname, "*");
+ if (scanname[len-1] != '/' && scanname[len-1] != '\\')
+ scanname[len++] = '/';
+ scanname[len++] = '*';
+ scanname[len] = '\0';
/* do the FindFirstFile call */
fh = FindFirstFile(scanname, &FindData);
- if(fh == INVALID_HANDLE_VALUE) {
+ if (fh == INVALID_HANDLE_VALUE) {
return NULL;
}
@@ -537,13 +527,9 @@ opendir(char *filename)
*/
idx = strlen(FindData.cFileName)+1;
New(1304, p->start, idx, char);
- if(p->start == NULL) {
+ if (p->start == NULL)
croak("opendir: malloc failed!\n");
- }
strcpy(p->start, FindData.cFileName);
-/* if(downcase)
- * strlwr(p->start);
- */
p->nfiles++;
/* loop finding all the files that match the wildcard
@@ -557,20 +543,16 @@ opendir(char *filename)
* new name and it's null terminator
*/
Renew(p->start, idx+len+1, char);
- if(p->start == NULL) {
+ if (p->start == NULL)
croak("opendir: malloc failed!\n");
- }
strcpy(&p->start[idx], FindData.cFileName);
-/* if (downcase)
- * strlwr(&p->start[idx]);
- */
- p->nfiles++;
- idx += len+1;
- }
- FindClose(fh);
- p->size = idx;
- p->curr = p->start;
- return p;
+ p->nfiles++;
+ idx += len+1;
+ }
+ FindClose(fh);
+ p->size = idx;
+ p->curr = p->start;
+ return p;
}
@@ -1058,14 +1040,14 @@ my_open_osfhandle(long osfhandle, int flags)
/* copy relevant flags from second parameter */
fileflags = FDEV;
- if(flags & O_APPEND)
+ if (flags & O_APPEND)
fileflags |= FAPPEND;
- if(flags & O_TEXT)
+ if (flags & O_TEXT)
fileflags |= FTEXT;
/* attempt to allocate a C Runtime file handle */
- if((fh = _alloc_osfhnd()) == -1) {
+ if ((fh = _alloc_osfhnd()) == -1) {
errno = EMFILE; /* too many open files */
_doserrno = 0L; /* not an OS error */
return -1; /* return error to caller */
@@ -1200,12 +1182,12 @@ win32_strerror(int e)
#endif
DWORD source = 0;
- if(e < 0 || e > sys_nerr) {
+ if (e < 0 || e > sys_nerr) {
dTHR;
- if(e < 0)
+ if (e < 0)
e = GetLastError();
- if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, &source, e, 0,
+ if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, &source, e, 0,
strerror_buffer, sizeof(strerror_buffer), NULL) == 0)
strcpy(strerror_buffer, "Unknown Error");
@@ -1928,6 +1910,8 @@ static
XS(w32_DomainName)
{
dXSARGS;
+#if 0
+ /* doesn't do the right thing if current user is a local account */
char name[256];
DWORD size = sizeof(name);
if (GetUserName(name,&size)) {
@@ -1941,6 +1925,16 @@ XS(w32_DomainName)
XSRETURN_PV(dname); /* all that for this */
}
}
+#else
+ char dname[256];
+ DWORD dnamelen = sizeof(dname);
+ WKSTA_INFO_100 wi;
+ if (NERR_Success == NetWkstaGetInfo(NULL, 100, (LPBYTE*)&wi)) {
+ WideCharToMultiByte(CP_ACP, NULL, wi.wki100_langroup, -1,
+ (LPSTR)dname, dnamelen, NULL, NULL);
+ XSRETURN_PV(dname);
+ }
+#endif
XSRETURN_UNDEF;
}
@@ -2024,7 +2018,7 @@ XS(w32_Spawn)
STARTUPINFO stStartInfo;
BOOL bSuccess = FALSE;
- if(items != 3)
+ if (items != 3)
croak("usage: Win32::Spawn($cmdName, $args, $PID)");
cmd = SvPV(ST(0),na);
@@ -2035,7 +2029,7 @@ XS(w32_Spawn)
stStartInfo.dwFlags = STARTF_USESHOWWINDOW; /* Enable wShowWindow control */
stStartInfo.wShowWindow = SW_SHOWMINNOACTIVE; /* Start min (normal) */
- if(CreateProcess(
+ if (CreateProcess(
cmd, /* Image path */
args, /* Arguments for command line */
NULL, /* Default process security */
@@ -2068,7 +2062,7 @@ XS(w32_GetShortPathName)
SV *shortpath;
DWORD len;
- if(items != 1)
+ if (items != 1)
croak("usage: Win32::GetShortPathName($longPathName)");
shortpath = sv_mortalcopy(ST(0));