55 #include <sys/types.h>
86 nameLength = strlen(name);
97 if (strstr(name,
"/") != NULL || name[0] ==
'~' || name[0] ==
'.')
100 if (done ==
false ||
fileExists(tempPath) ==
false)
105 strcpy(fullName, tempPath);
114 strcat(tempPath,
"/");
115 strcat(tempPath, name);
118 strcpy(fullName, name);
123 currentpath = getenv(
"PATH");
124 if (currentpath == NULL)
129 sep = strchr(currentpath,
':');
133 int i = sep - currentpath;
134 strncpy(tempPath, currentpath, i);
136 strcat(tempPath,
"/");
137 strcat(tempPath, name);
140 strcpy(fullName, tempPath);
143 currentpath = sep + 1;
144 sep = strchr(currentpath,
':');
147 if (*currentpath !=
'\0')
149 strcpy(tempPath, currentpath);
150 strcat(tempPath,
"/");
151 strcat(tempPath, name);
154 strcpy(fullName, tempPath);
188 if (*fullName !=
'\0')
194 size_t len = strlen(name);
201 strcpy(tempPath, name);
205 strcpy(fullName, tempPath);
223 struct stat64 filestat;
226 rc = stat64(fname, &filestat);
229 if (S_ISREG(filestat.st_mode))
250 const char *endPtr = pathName + file->
getBLength() - 1;
254 while (pathName < endPtr)
282 const char *endPtr = pathName + file->
getBLength() - 1;
286 while (pathName < endPtr)
294 else if (*endPtr ==
'.')
318 const char *endPtr = pathName + file->
getBLength() - 1;
322 while (pathName < endPtr)
347 const char *endPtr = name + strlen(name) - 1;
351 while (name < endPtr)
359 else if (*endPtr ==
'.')
383 return name[0] ==
'~' || name[0] ==
'/' || name[0] ==
'.';
421 char tempName[PATH_MAX + 3];
424 strncpy(tempName, name,
sizeof(tempName));
425 if (extension != NULL)
427 strncat(tempName, extension,
sizeof(tempName) - strlen(tempName) - 1);
434 for (
int i = 0; i < 2; i++)
449 for (
int i = 0; i < 2; i++)
476 size_t nameLength = strlen(name);
478 if (nameLength < 1 || nameLength > PATH_MAX + 1)
484 strcpy(resolvedName, name);
495 if (stat64(resolvedName, &dummy) == 0)
498 if (S_ISREG(dummy.st_mode))
523 const char *pathEnd = path + strlen(path);
525 const char *p = path;
526 const char *q = strchr(p,
':');
528 for (; p < pathEnd; p = q + 1, q = strchr(p,
':'))
536 size_t sublength = q - p;
538 memcpy(resolvedName, p, sublength);
539 resolvedName[sublength] =
'/';
540 resolvedName[sublength + 1] =
'\0';
541 strncat(resolvedName, name, PATH_MAX - strlen(resolvedName));
548 if (stat64(resolvedName, &dummy) == 0)
551 if (S_ISREG(dummy.st_mode))
579 if (name[1] ==
'\0' || name[1] ==
'/')
582 char tempName[PATH_MAX + 3];
584 strncpy(tempName, name, PATH_MAX + 1);
585 strcpy(name, getenv(
"HOME"));
587 strncat(name, tempName + 1, PATH_MAX - strlen(name));
593 char tempName[PATH_MAX + 3];
594 char userName[PATH_MAX + 3];
597 strncpy(tempName, name, PATH_MAX - strlen(tempName));
599 char *slash = strchr(tempName,
'/');
604 size_t nameLength = slash - tempName - 1;
605 memcpy(userName, tempName + 1, nameLength);
606 userName[nameLength] =
'\0';
611 strcpy(userName, tempName + 1);
615 struct passwd *ppwd = getpwnam(userName);
623 strncpy(name, ppwd->pw_dir, PATH_MAX - strlen(name));
627 strncat(name, slash, PATH_MAX - strlen(name));
636 else if (name[0] !=
'/')
638 char tempName[PATH_MAX + 2];
640 strncpy(tempName, name, PATH_MAX + 1);
641 if (getcwd(name, PATH_MAX + 1) == NULL)
645 strncat(name,
"/", PATH_MAX - strlen(name));
646 strncat(name, tempName, PATH_MAX - strlen(name));
654 char tempName[PATH_MAX + 2];
657 strcpy(name, tempName);
684 char *dest = resolved;
689 for (
const char *p = name; *p; p++ )
694 if ( *(p + 1) !=
'.' )
705 else if ( *p ==
'.' )
709 char next = *(p + 1);
710 if ( next ==
'\0' || next ==
'/' )
717 else if ( next ==
'.' )
723 if ( next ==
'\0' || next ==
'/' )
730 while ( prevSl > resolved )
732 if ( *--prevSl ==
'/' )
754 (*dest ==
'/' && dest != resolved) ? *dest =
'\0' : *++dest =
'\0';
769 return unlink(name) == 0;
781 return remove(name) == 0;
797 int rc = stat64(name, &finfo);
798 return rc == 0 && S_ISDIR(finfo.st_mode);
811 return access(name, W_OK) != 0;
825 return access(name, R_OK) != 0;
842 int rc = stat64(name, &finfo);
843 return rc == 0 && (S_ISREG(finfo.st_mode) || S_ISBLK(finfo.st_mode));
858 int rc = stat64(name, &finfo);
876 if (stat64(name, &st))
894 if (stat64(name, &st) != 0)
911 return mkdir(name, S_IRWXU | S_IRWXG | S_IRWXO) != -1;
925 return rename(oldName, newName) == 0;
944 size_t length = strlen(name);
945 for (
size_t index = length - 1; index > 0; index--)
947 if (name[index] ==
'.' && (index > 0 && name[index - 1] ==
'/'))
967 struct stat64 statbuf;
968 struct utimbuf timebuf;
969 if (stat64(name, &statbuf) != 0)
974 timebuf.actime = statbuf.st_atime;
975 timebuf.modtime = (time_t)time;
976 return utime(name, &timebuf) == 0;
990 struct stat64 buffer;
991 if (stat64(name, &buffer) != 0)
995 mode_t mode = buffer.st_mode;
998 return chmod(name, mode) == 0;
1124 strcpy(buffer,
entry->d_name);
RexxString * new_string(const char *s, stringsizeB_t bl, sizeC_t cl=-1)
const char * getStringData()
SysFileIterator(const char *pattern)
static bool fileExists(const char *name)
static bool checkCurrentFile(const char *name, char *resolvedName)
static bool moveFile(const char *oldName, const char *newName)
static bool setLastModifiedDate(const char *name, int64_t time)
static bool canonicalizeName(char *name)
static const char * getSeparator()
static bool deleteFile(const char *name)
static bool normalizePathName(const char *name, char *resolved)
static bool deleteDirectory(const char *name)
static RexxString * extractFile(RexxString *file)
static bool setFileReadOnly(const char *name)
static const char * EOL_Marker
static bool hasDirectory(const char *name)
static const char * getTempFileName()
static int64_t getLastModifiedDate(const char *name)
static const char * getPathSeparator()
static int getRoots(char *roots)
static bool primitiveSearchName(const char *name, const char *path, const char *extension, char *resolvedName)
static bool searchName(const char *name, const char *path, const char *extension, char *resolvedName)
static bool makeDirectory(const char *name)
static RexxString * extractDirectory(RexxString *file)
static RexxString * extractExtension(RexxString *file)
static const char PathDelimiter
static bool isDirectory(const char *name)
static bool searchPath(const char *name, const char *path, char *resolvedName)
static bool isCaseSensitive()
static uint64_t getFileLength(const char *name)
static bool isWriteOnly(const char *name)
static void qualifyStreamName(const char *unqualifiedName, char *qualifiedName, size_t bufferSize)
static bool hasExtension(const char *name)
static const char EOF_Marker
static bool searchFileName(const char *name, char *fullName)
static bool isHidden(const char *name)
static bool isReadOnly(const char *name)
static bool exists(const char *name)
static bool isFile(const char *name)
static void strlower(char *str)
unsigned __int64 uint64_t