]> git.saurik.com Git - apple/xnu.git/blame - tools/tests/darwintests/xnu_quick_test_helpers.c
xnu-4570.71.2.tar.gz
[apple/xnu.git] / tools / tests / darwintests / xnu_quick_test_helpers.c
CommitLineData
5ba3f43e
A
1#include <darwintest.h>
2
3#include "xnu_quick_test_helpers.h"
4
5#include <fcntl.h>
6#include <unistd.h>
7
8void create_target_directory( const char * the_targetp )
9{
10 int err;
11 const char * my_targetp;
12
13 my_targetp = getenv("TMPDIR");
14 if ( my_targetp == NULL )
15 my_targetp = "/tmp";
16
17 T_ASSERT_LT( strlen( the_targetp ), (unsigned long)( PATH_MAX - 1 ),
18 "check target path too long - \"%s\"", the_targetp );
19
20 for ( ;; ) {
21 int my_rand;
22 char my_name[64];
23
24 my_rand = rand( );
25 sprintf( &my_name[0], "xnu_quick_test-%d", my_rand );
26 T_ASSERT_LT( strlen( &my_name[0] ) + strlen( the_targetp ) + 2, (unsigned long)PATH_MAX,
27 "check target path plus our test directory name is too long: "
28 "target path - \"%s\" test directory name - \"%s\"",
29 the_targetp, &my_name[0] );
30
31 /* append generated directory name onto our path */
32 g_target_path[0] = 0x00;
33 strcat( &g_target_path[0], the_targetp );
34 if ( g_target_path[ (strlen(the_targetp) - 1) ] != '/' ) {
35 strcat( &g_target_path[0], "/" );
36 }
37 strcat( &g_target_path[0], &my_name[0] );
38
39 /* try to create the test directory */
40 err = mkdir( &g_target_path[0], (S_IRWXU | S_IRWXG | S_IROTH) );
41 if ( err == 0 ) {
42 break;
43 }
44 err = errno;
45 if ( EEXIST != err ) {
46 T_ASSERT_FAIL( "test directory creation failed - \"%s\" \n"
47 "mkdir call failed with error %d - \"%s\"",
48 &g_target_path[0], errno, strerror( err) );
49 }
50 }
51
52} /* create_target_directory */
53
54/*
55 * create_random_name - creates a file with a random / unique name in the given directory.
56 * when do_open is true we create a file else we generaate a name that does not exist in the
57 * given directory (we do not create anything when do_open is 0).
58 * WARNING - caller provides enough space in path buffer for longest possible name.
59 * WARNING - assumes caller has appended a trailing '/' on the path passed to us.
60 * RAND_MAX is currently 2147483647 (ten characters plus one for a slash)
61 */
62int create_random_name( char *the_pathp, int do_open ) {
63 int i, my_err;
64 int my_fd = -1;
65
66 for ( i = 0; i < 1; i++ ) {
67 int my_rand;
68 char *myp;
69 char my_name[32];
70
71 my_rand = rand( );
72 sprintf( &my_name[0], "%d", my_rand );
73 T_ASSERT_LT_ULONG((strlen( &my_name[0] ) + strlen( the_pathp ) + 2), (unsigned long)PATH_MAX,
74 "check if path to test file is less than PATH_MAX");
75
76 // append generated file name onto our path
77 myp = strrchr( the_pathp, '/' );
78 *(myp + 1) = 0x00;
79 strcat( the_pathp, &my_name[0] );
80 if ( do_open ) {
81 /* create a file with this name */
82 my_fd = open( the_pathp, (O_RDWR | O_CREAT | O_EXCL),
83 (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) );
84 T_EXPECT_TRUE((my_fd != -1 || errno == EEXIST), "open file with name %s", the_pathp);
85
86 if( errno == EEXIST )
87 continue;
88 }
89 else {
90 /* make sure the name is unique */
91 struct stat my_sb;
92 my_err = stat( the_pathp, &my_sb );
93 T_EXPECT_TRUE((my_err == 0 || errno == ENOENT), "make sure the name is unique");
94
95 if(errno == ENOENT) break;
96 /* name already exists, try another */
97 i--;
98 continue;
99 }
100 }
101
102 if ( my_fd != -1 )
103 close( my_fd );
104
105 if(do_open && my_fd == -1)
106 return 1;
107
108 return 0;
109} /* create_random_name */
110
111void remove_target_directory() {
112 rmdir(&g_target_path[0]);
113}
114