mirror of
https://github.com/aphrody-labs/PowerShell.git
synced 2026-10-17 12:45:47 +00:00
changes to logic in followsymlink
This commit is contained in:
1 parent
2a6b32ce5b
commit
0dc248b6f9
1 file changed
+50
-53
@@ -49,64 +49,13 @@ char* FollowSymLink(const char* fileName)
|
||||
//if lstat in IsSymLink returns -1, path does not exist
|
||||
if (IsSymLink(fileName) == -1)
|
||||
{
|
||||
printf("-1 %s", fileName);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*If the path is a symlink, the function return the absolute filepath if valid. if not valid, return null*/
|
||||
if (IsSymLink(fileName) == 1)
|
||||
if (IsSymLink(fileName) == 0)
|
||||
{
|
||||
printf("readlink %s", fileName);
|
||||
char buffer[PATH_MAX];
|
||||
ssize_t sz = readlink(fileName, buffer, PATH_MAX);
|
||||
|
||||
if (sz == -1)
|
||||
{
|
||||
switch(errno)
|
||||
{
|
||||
case EACCES:
|
||||
errno = ERROR_ACCESS_DENIED;
|
||||
break;
|
||||
case EFAULT:
|
||||
errno = ERROR_INVALID_ADDRESS;
|
||||
break;
|
||||
case EINVAL:
|
||||
errno = ERROR_INVALID_NAME;
|
||||
break;
|
||||
case EIO:
|
||||
errno = ERROR_GEN_FAILURE;
|
||||
break;
|
||||
case ELOOP:
|
||||
errno = ERROR_STOPPED_ON_SYMLINK;
|
||||
break;
|
||||
case ENAMETOOLONG:
|
||||
errno = ERROR_BAD_PATH_NAME;
|
||||
break;
|
||||
case ENOENT:
|
||||
errno = ERROR_FILE_NOT_FOUND;
|
||||
break;
|
||||
case ENOMEM:
|
||||
errno = ERROR_OUTOFMEMORY;
|
||||
break;
|
||||
case ENOTDIR:
|
||||
errno = ERROR_BAD_PATH_NAME;
|
||||
break;
|
||||
default:
|
||||
errno = ERROR_INVALID_FUNCTION;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer[sz] = '\0';
|
||||
return strndup(buffer, sz + 1);
|
||||
|
||||
}
|
||||
|
||||
/*else the path is not a symlink - but attempt to resolve*/
|
||||
else
|
||||
{
|
||||
printf("realpath %s", fileName);
|
||||
//Attempt to resolve with the absolute filepath
|
||||
char actualpath[PATH_MAX+1];
|
||||
char* realPath = realpath(fileName, actualpath);
|
||||
@@ -150,5 +99,53 @@ char* FollowSymLink(const char* fileName)
|
||||
}
|
||||
|
||||
return strndup(realPath, strlen(realPath) + 1 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*else the path is not a symlink - but attempt to resolve*/
|
||||
else
|
||||
{
|
||||
char buffer[PATH_MAX];
|
||||
ssize_t sz = readlink(fileName, buffer, PATH_MAX);
|
||||
|
||||
if (sz == -1)
|
||||
{
|
||||
switch(errno)
|
||||
{
|
||||
case EACCES:
|
||||
errno = ERROR_ACCESS_DENIED;
|
||||
break;
|
||||
case EFAULT:
|
||||
errno = ERROR_INVALID_ADDRESS;
|
||||
break;
|
||||
case EINVAL:
|
||||
errno = ERROR_INVALID_NAME;
|
||||
case EIO:
|
||||
errno = ERROR_GEN_FAILURE;
|
||||
break;
|
||||
case ELOOP:
|
||||
errno = ERROR_STOPPED_ON_SYMLINK;
|
||||
break;
|
||||
case ENAMETOOLONG:
|
||||
errno = ERROR_BAD_PATH_NAME;
|
||||
break;
|
||||
case ENOENT:
|
||||
errno = ERROR_FILE_NOT_FOUND;
|
||||
break;
|
||||
case ENOMEM:
|
||||
errno = ERROR_OUTOFMEMORY;
|
||||
break;
|
||||
case ENOTDIR:
|
||||
errno = ERROR_BAD_PATH_NAME;
|
||||
break;
|
||||
default:
|
||||
errno = ERROR_INVALID_FUNCTION;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer[sz] = '\0';
|
||||
return strndup(buffer, sz + 1);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user