Code:
#ifdef PAW_WIN32
struct paw_path* paw_get_sym_path_by_handle( void *ud, HANDLE file )
{
FILE_NAME_INFORMATION fi;
IO_STATUS_BLOCK iob;
struct paw_path *path;
size_t want;
NtQueryInformationFile
(
file
, &iob
, &fi
, sizeof(fi)
, FileAlternateNameInformation
);
want = fi.FileNameLength + sizeof(struct paw_path) + 1;
path = paw.alloc( ud, NULL, 0, want );
if ( path )
{
memset( path, 0, want );
path->_size = want;
path->used = fi.FileNameLength;
path->size = path->used + 1;
path->path = (char*)(path + 1);
memcpy( path->path, fi.FileName, path->used );
paw_split_path( path, path->path );
return paw;
}
return NULL;
}
struct paw_path* paw_get_abs_path_by_handle( void *ud, HANDLE file )
{
FILE_NAME_INFORMATION fi;
IO_STATUS_BLOCK iob;
struct paw_path *path;
size_t want;
NtQueryInformationFile
(
file
, &iob
, &fi
, sizeof(fi)
, FileNameInformation
);
want = fi.FileNameLength + sizeof(struct paw_path) + 1;
path = paw.alloc( ud, NULL, 0, want );
if ( path )
{
memset( path, 0, want );
path->_size = want;
path->used = fi.FileNameLength;
path->size = path->used + 1;
path->path = (char*)(path + 1);
memcpy( path->path, fi.FileName, path->used );
paw_split_path( path, path->path );
return paw;
}
return NULL;
}
#else
struct paw_path* paw_get_sym_path_by_fd( void *ud, int file )
{
struct paw_path* path = NULL;
size_t want = BUFSIZ, size = 0;
ssize_t ret;
char _path[bitsof(int)];
int err;
sprintf( _path, "/proc/self/fd/%d", fd );
while (1)
{
void *temp = paw.alloc( ud, path, size, want );
if ( !temp )
{
memset( path, size );
paw.alloc( ud, path, size, 0 );
return NULL;
}
path = temp;
size = want;
memset( path, 0, size );
path->_size = size;
path->size = size - sizeof(struct paw_path);
path->path = (char*)(path + 1);
ret = readlink( _path, path->path, path->size );
err = errno;
if ( ret == -1 )
{
if ( err == ENAMETOOLONG )
continue;
paw.alloc( ud, path, size, 0 );
return NULL;
}
break;
}
paw_split_path( path, path->path );
return path;
}
struct paw_path* paw_get_abs_path_by_fd( void *ud, int file )
{
return paw_get_sym_path_by_fd( ud, file );
}
#endif