Files
apfstests/src/attr-list-by-handle-cursor-test.c
T
Dave Chinner c432589da3 src/: spdx license conversion
Mostly scripted like all the others, manually added tags to
Makefile, nsexec.c and t_mmap_writev.c. Manually touched up
open_by_handle.c and t_encrypted_d_revalidate.c post script.

Notes for future reference:
- src/log-writes/ code has no explicit copyright or license tags,
  nor does the upstream repository, hence license is unknown.
  Need Josef to clarify the license and send a patch adding SPDX
  tags to those files.

- src/perf code has no explicit copyright or license tags, but it
  was code submitted explictly for fstests so it is assumed to be
  GPLv2.0 and tagged as such. If this is incorrect, Josef will need
  to clarify copyright and the license and send patches to correct
  it.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
2018-06-22 10:38:07 +08:00

105 lines
2.1 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2016 Oracle. All Rights Reserved.
* Author: Darrick J. Wong <darrick.wong@oracle.com>
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <attr/attributes.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <asm/types.h>
#include <xfs/xfs.h>
#include <xfs/handle.h>
#define ATTRBUFSZ 1024
#define BSTATBUF_NR 32
/* Read all the extended attributes of a file handle. */
void
read_handle_xattrs(
struct xfs_handle *handle)
{
struct attrlist_cursor cur;
char attrbuf[ATTRBUFSZ];
char *firstname = NULL;
struct attrlist *attrlist = (struct attrlist *)attrbuf;
struct attrlist_ent *ent;
int i;
int flags = 0;
int error;
memset(&cur, 0, sizeof(cur));
while ((error = attr_list_by_handle(handle, sizeof(*handle),
attrbuf, ATTRBUFSZ, flags,
&cur)) == 0) {
for (i = 0; i < attrlist->al_count; i++) {
ent = ATTR_ENTRY(attrlist, i);
if (i != 0)
continue;
if (firstname == NULL) {
firstname = malloc(ent->a_valuelen);
memcpy(firstname, ent->a_name, ent->a_valuelen);
} else {
if (memcmp(firstname, ent->a_name,
ent->a_valuelen) == 0)
fprintf(stderr,
"Saw duplicate xattr \"%s\", buggy XFS?\n",
ent->a_name);
else
fprintf(stderr,
"Test passes.\n");
goto out;
}
}
if (!attrlist->al_more)
break;
}
out:
if (firstname)
free(firstname);
if (error)
perror("attr_list_by_handle");
return;
}
int main(
int argc,
char *argv[])
{
struct xfs_handle *fshandle;
size_t fshandle_len;
struct xfs_handle *handle;
size_t handle_len;
int error;
if (argc != 2) {
fprintf(stderr, "Usage: %s filename\n", argv[0]);
return 1;
}
error = path_to_fshandle(argv[1], (void **)&fshandle, &fshandle_len);
if (error) {
perror("getting fshandle");
return 2;
}
error = path_to_handle(argv[1], (void **)&handle, &handle_len);
if (error) {
perror("getting handle");
return 3;
}
read_handle_xattrs(handle);
free_handle(handle, handle_len);
free_handle(fshandle, fshandle_len);
return 0;
}