]>
git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - libhandle/jdm.c
1 // SPDX-License-Identifier: LGPL-2.1
3 * Copyright (c) 1995, 2001-2002, 2005 Silicon Graphics, Inc.
7 #include "platform_defs.h"
13 /* internal fshandle - typecast to a void for external use */
15 typedef struct fshandle
{
16 char fsh_space
[FSHANDLE_SZ
];
19 /* private file handle - for use by open_by_fshandle */
20 #define FILEHANDLE_SZ 24
21 #define FILEHANDLE_SZ_FOLLOWING 14
22 #define FILEHANDLE_SZ_PAD 2
23 typedef struct filehandle
{
24 fshandle_t fh_fshandle
; /* handle of fs containing this inode */
25 int16_t fh_sz_following
; /* bytes in handle after this member */
26 char fh_pad
[FILEHANDLE_SZ_PAD
]; /* padding, must be zeroed */
27 uint32_t fh_gen
; /* generation count */
28 xfs_ino_t fh_ino
; /* 64 bit ino */
33 jdm_fill_filehandle( filehandle_t
*handlep
,
34 fshandle_t
*fshandlep
,
37 handlep
->fh_fshandle
= *fshandlep
;
38 handlep
->fh_sz_following
= FILEHANDLE_SZ_FOLLOWING
;
39 memset(handlep
->fh_pad
, 0, FILEHANDLE_SZ_PAD
);
40 handlep
->fh_gen
= statp
->bs_gen
;
41 handlep
->fh_ino
= statp
->bs_ino
;
45 jdm_getfshandle( char *mntpnt
)
47 fshandle_t
*fshandlep
;
49 char resolved
[MAXPATHLEN
];
52 ASSERT( sizeof( fshandle_t
) == FSHANDLE_SZ
);
53 ASSERT( sizeof( filehandle_t
) == FILEHANDLE_SZ
);
54 ASSERT( sizeof( filehandle_t
)
56 offsetofmember( filehandle_t
, fh_pad
)
58 FILEHANDLE_SZ_FOLLOWING
);
59 ASSERT( sizeofmember( filehandle_t
, fh_pad
) == FILEHANDLE_SZ_PAD
);
60 ASSERT( FILEHANDLE_SZ_PAD
== sizeof( int16_t ));
62 fshandlep
= NULL
; /* for lint */
63 fshandlesz
= sizeof( *fshandlep
);
65 if (!realpath( mntpnt
, resolved
))
68 if (path_to_fshandle( resolved
, ( void ** )&fshandlep
, &fshandlesz
))
71 assert( fshandlesz
== sizeof( *fshandlep
));
73 return ( jdm_fshandle_t
* )fshandlep
;
77 /* externally visible functions */
80 jdm_new_filehandle( jdm_filehandle_t
**handlep
,
82 jdm_fshandle_t
*fshandlep
,
85 /* allocate and fill filehandle */
86 *hlen
= sizeof(filehandle_t
);
87 *handlep
= (filehandle_t
*) malloc(*hlen
);
90 jdm_fill_filehandle(*handlep
, (fshandle_t
*) fshandlep
, statp
);
95 jdm_delete_filehandle( jdm_filehandle_t
*handlep
, size_t hlen
)
101 jdm_open( jdm_fshandle_t
*fshp
, xfs_bstat_t
*statp
, intgen_t oflags
)
103 fshandle_t
*fshandlep
= ( fshandle_t
* )fshp
;
104 filehandle_t filehandle
;
107 jdm_fill_filehandle( &filehandle
, fshandlep
, statp
);
108 fd
= open_by_fshandle( ( void * )&filehandle
,
109 sizeof( filehandle
),
115 jdm_readlink( jdm_fshandle_t
*fshp
,
117 char *bufp
, size_t bufsz
)
119 fshandle_t
*fshandlep
= ( fshandle_t
* )fshp
;
120 filehandle_t filehandle
;
123 jdm_fill_filehandle( &filehandle
, fshandlep
, statp
);
124 rval
= readlink_by_handle( ( void * )&filehandle
,
125 sizeof( filehandle
),
132 jdm_attr_multi( jdm_fshandle_t
*fshp
,
134 char *bufp
, int rtrvcnt
, int flags
)
136 fshandle_t
*fshandlep
= ( fshandle_t
* )fshp
;
137 filehandle_t filehandle
;
140 jdm_fill_filehandle( &filehandle
, fshandlep
, statp
);
141 rval
= attr_multi_by_handle ( ( void * )&filehandle
,
142 sizeof( filehandle
),
149 jdm_attr_list( jdm_fshandle_t
*fshp
,
151 char *bufp
, size_t bufsz
, int flags
,
152 struct attrlist_cursor
*cursor
)
154 fshandle_t
*fshandlep
= ( fshandle_t
* )fshp
;
155 filehandle_t filehandle
;
158 /* prevent needless EINVAL from the kernel */
159 if (bufsz
> XFS_XATTR_LIST_MAX
)
160 bufsz
= XFS_XATTR_LIST_MAX
;
162 jdm_fill_filehandle( &filehandle
, fshandlep
, statp
);
163 rval
= attr_list_by_handle (( void * )&filehandle
,
164 sizeof( filehandle
),
165 bufp
, bufsz
, flags
, cursor
);
170 jdm_parents( jdm_fshandle_t
*fshp
,
172 parent_t
*bufp
, size_t bufsz
,
180 jdm_parentpaths( jdm_fshandle_t
*fshp
,
182 parent_t
*bufp
, size_t bufsz
,