1 /*
2 * xattr_tests.c
3 * xnu_quick_test
4 *
5 * Created by Jerry Cottingham on 6/2/2005.
6 * Copyright 2005 Apple Computer Inc. All rights reserved.
7 *
8 */
9
10 #include "tests.h"
11 #include <sys/xattr.h>
12
13 extern char g_target_path[ PATH_MAX ];
14
15 #define XATTR_TEST_NAME "com.apple.xattr_test"
16
17 /* **************************************************************************************************************
18 * Test xattr system calls.
19 * **************************************************************************************************************
20 */
21 int xattr_tests( void * the_argp )
22 {
23 int my_err;
24 int my_fd = -1;
25 char * my_pathp = NULL;
26 ssize_t my_result;
27 char my_buffer[ 64 ];
28 char my_xattr_data[ ] = "xattr_foo";
29
30 my_pathp = (char *) malloc( PATH_MAX );
31 if ( my_pathp == NULL ) {
32 printf( "malloc failed with error %d - \"%s\" \n", errno, strerror( errno) );
33 goto test_failed_exit;
34 }
35 *my_pathp = 0x00;
36 strcat( my_pathp, &g_target_path[0] );
37 strcat( my_pathp, "/" );
38
39 /* create a test file */
40 my_err = create_random_name( my_pathp, 1 );
41 if ( my_err != 0 ) {
42 goto test_failed_exit;
43 }
44
45 /* use setxattr to add an attribute to our test file */
46 my_err = setxattr( my_pathp, XATTR_TEST_NAME, &my_xattr_data[0], sizeof(my_xattr_data), 0, 0 );
47 if ( my_err == -1 ) {
48 printf( "setxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
49 goto test_failed_exit;
50 }
51
52 /* make sure it is there using listxattr and getxattr */
53 my_result = listxattr( my_pathp, NULL, 0, 0 );
54 if ( my_err == -1 ) {
55 printf( "listxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
56 goto test_failed_exit;
57 }
58 if ( my_result != (strlen( XATTR_TEST_NAME ) + 1) ) {
59 printf( "listxattr did not get the attribute name length \n" );
60 goto test_failed_exit;
61 }
62
63 memset( &my_buffer[0], 0x00, sizeof( my_buffer ) );
64 my_result = getxattr( my_pathp, XATTR_TEST_NAME, &my_buffer[0], sizeof(my_buffer), 0, 0 );
65 if ( my_err == -1 ) {
66 printf( "getxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
67 goto test_failed_exit;
68 }
69 if ( my_result != (strlen( &my_xattr_data[0] ) + 1) ||
70 strcmp( &my_buffer[0], &my_xattr_data[0] ) != 0 ) {
71 printf( "getxattr did not get the correct attribute data \n" );
72 goto test_failed_exit;
73 }
74
75 /* use removexattr to remove an attribute to our test file */
76 my_err = removexattr( my_pathp, XATTR_TEST_NAME, 0 );
77 if ( my_err == -1 ) {
78 printf( "removexattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
79 goto test_failed_exit;
80 }
81
82 /* make sure it is gone */
83 my_result = listxattr( my_pathp, NULL, 0, 0 );
84 if ( my_err == -1 ) {
85 printf( "listxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
86 goto test_failed_exit;
87 }
88 if ( my_result != 0 ) {
89 printf( "removexattr did not remove our test attribute \n" );
90 goto test_failed_exit;
91 }
92
93 /* repeat tests using file descriptor versions of the xattr system calls */
94 my_fd = open( my_pathp, O_RDONLY, 0 );
95 if ( my_fd == -1 ) {
96 printf( "open call failed with error %d - \"%s\" \n", errno, strerror( errno) );
97 printf( "\t file we attempted to open -> \"%s\" \n", my_pathp );
98 goto test_failed_exit;
99 }
100
101 /* use fsetxattr to add an attribute to our test file */
102 my_err = fsetxattr( my_fd, XATTR_TEST_NAME, &my_xattr_data[0], sizeof(my_xattr_data), 0, 0 );
103 if ( my_err == -1 ) {
104 printf( "fsetxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
105 goto test_failed_exit;
106 }
107
108 /* make sure it is there using flistxattr and fgetxattr */
109 my_result = flistxattr( my_fd, NULL, 0, 0 );
110 if ( my_err == -1 ) {
111 printf( "flistxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
112 goto test_failed_exit;
113 }
114 if ( my_result != (strlen( XATTR_TEST_NAME ) + 1) ) {
115 printf( "flistxattr did not get the attribute name length \n" );
116 goto test_failed_exit;
117 }
118
119 memset( &my_buffer[0], 0x00, sizeof( my_buffer ) );
120 my_result = fgetxattr( my_fd, XATTR_TEST_NAME, &my_buffer[0], sizeof(my_buffer), 0, 0 );
121 if ( my_err == -1 ) {
122 printf( "fgetxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
123 goto test_failed_exit;
124 }
125 if ( my_result != (strlen( &my_xattr_data[0] ) + 1) ||
126 strcmp( &my_buffer[0], &my_xattr_data[0] ) != 0 ) {
127 printf( "fgetxattr did not get the correct attribute data \n" );
128 goto test_failed_exit;
129 }
130
131 /* use fremovexattr to remove an attribute to our test file */
132 my_err = fremovexattr( my_fd, XATTR_TEST_NAME, 0 );
133 if ( my_err == -1 ) {
134 printf( "fremovexattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
135 goto test_failed_exit;
136 }
137
138 /* make sure it is gone */
139 my_result = flistxattr( my_fd, NULL, 0, 0 );
140 if ( my_err == -1 ) {
141 printf( "flistxattr failed with error %d - \"%s\" \n", errno, strerror( errno) );
142 goto test_failed_exit;
143 }
144 if ( my_result != 0 ) {
145 printf( "fremovexattr did not remove our test attribute \n" );
146 goto test_failed_exit;
147 }
148
149 my_err = 0;
150 goto test_passed_exit;
151
152 test_failed_exit:
153 my_err = -1;
154
155 test_passed_exit:
156 if ( my_fd != -1 )
157 close( my_fd );
158 if ( my_pathp != NULL ) {
159 remove( my_pathp );
160 free( my_pathp );
161 }
162 return( my_err );
163 }
164
Cache object: a0823f42a1267e2bcba629cc36eee680
|