Clean up FollowSymlink

This commit is contained in:
Andrew Schwartzmeyer committed 2016-07-13 15:55:15 -07:00
1 parent d44d485938
commit 85d9370c2f
1 file changed
+47 -103
+47 -103
View File
@@ -37,124 +37,68 @@
char* FollowSymLink(const char* fileName)
{
errno = 0;
errno = 0;
// if filename is null, return null value
if (!fileName)
{
errno = ERROR_INVALID_PARAMETER;
return NULL;
}
//if lstat in IsSymLink returns -1, path does not exist
if (IsSymLink(fileName) == -1)
// return null for non symlinks
if (!IsSymLink(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))
// attempt to resolve with the absolute file path
char buffer[PATH_MAX];
char* realPath = realpath(fileName, buffer);
if (realPath)
{
//Attempt to resolve with the absolute filepath
char actualpath[PATH_MAX+1];
char* realPath = realpath(fileName, actualpath);
//if realPath is null, go onto the readlink implementation
if (realPath == NULL)
{
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; /*If the path is a symlink, the function return the absolute filepath if valid. if not valid, return null*/
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 strndup(realPath, strlen(realPath) + 1);
}
return NULL;
}
buffer[sz] = '\0';
return strndup(buffer, sz + 1);
}
else
// if the path wasn't resolved, use readlink
ssize_t sz = readlink(fileName, buffer, PATH_MAX);
if (sz == -1)
{
switch(errno)
{
return strndup(realPath, strlen(realPath) + 1 );
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;
}
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; /*If the path is a symlink, the function return the absolute filepath if valid. if not valid, return null*/
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);
}
buffer[sz] = '\0';
return strndup(buffer, sz + 1);
}