|
|
|
@ -466,11 +466,59 @@ int ifs_readdir(IsoFileSource *src, IsoFileSource **child)
|
|
|
|
|
return ISO_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Read the destination of a symlink. You don't need to open the file
|
|
|
|
|
* to call this.
|
|
|
|
|
*
|
|
|
|
|
* @param buf
|
|
|
|
|
* allocated buffer of at least bufsiz bytes.
|
|
|
|
|
* The dest. will be copied there, and it will be NULL-terminated
|
|
|
|
|
* @param bufsiz
|
|
|
|
|
* characters to be copied. Destination link will be truncated if
|
|
|
|
|
* it is larger than given size. This include the \0 character.
|
|
|
|
|
* @return
|
|
|
|
|
* 1 on success, < 0 on error
|
|
|
|
|
* Error codes:
|
|
|
|
|
* ISO_FILE_ERROR
|
|
|
|
|
* ISO_NULL_POINTER
|
|
|
|
|
* ISO_WRONG_ARG_VALUE -> if bufsiz <= 0
|
|
|
|
|
* ISO_FILE_IS_NOT_SYMLINK
|
|
|
|
|
* ISO_MEM_ERROR
|
|
|
|
|
* ISO_FILE_BAD_PATH
|
|
|
|
|
* ISO_FILE_DOESNT_EXIST
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
static
|
|
|
|
|
int ifs_readlink(IsoFileSource *src, char *buf, size_t bufsiz)
|
|
|
|
|
{
|
|
|
|
|
//TODO implement
|
|
|
|
|
return -1;
|
|
|
|
|
char *dest;
|
|
|
|
|
size_t len;
|
|
|
|
|
ImageFileSourceData *data;
|
|
|
|
|
|
|
|
|
|
if (src == NULL || buf == NULL || src->data == NULL) {
|
|
|
|
|
return ISO_NULL_POINTER;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bufsiz <= 0) {
|
|
|
|
|
return ISO_WRONG_ARG_VALUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
data = (ImageFileSourceData*)src->data;
|
|
|
|
|
|
|
|
|
|
if (!S_ISLNK(data->info.st_mode)) {
|
|
|
|
|
return ISO_FILE_IS_NOT_SYMLINK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dest = (char*)data->data.content;
|
|
|
|
|
len = strlen(dest);
|
|
|
|
|
if (bufsiz <= len) {
|
|
|
|
|
len = bufsiz - 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strncpy(buf, dest, len);
|
|
|
|
|
buf[len] = '\0';
|
|
|
|
|
|
|
|
|
|
return ISO_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static
|
|
|
|
|