source: rtems/testsuites/psxtests/psxstat/test.c @ 0fdaca2

4.104.114.84.9
Last change on this file since 0fdaca2 was 0fdaca2, checked in by Ralf Corsepius <ralf.corsepius@…>, on Apr 1, 2004 at 10:14:37 AM

2004-04-01 Ralf Corsepius <ralf_corsepius@…>

  • psxcancel/init.c: Include <rtems/console.h> instead of <console.h>.
  • psxmount/test.c: Include <rtems/imfs.h> instead of <imfs.h>.
  • psxreaddir/test.c: Include <rtems/imfs.h> instead of <imfs.h>.
  • psxstat/test.c: Include <rtems/imfs.h> instead of <imfs.h>.
  • Property mode set to 100644
File size: 19.2 KB
Line 
1/*
2 *  This test exercises stat() via fstat() and generates as many of the
3 *  path evaluation cases as possible.
4 *
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  $Id$
13 */
14
15#include <tmacros.h>
16#include <assert.h>
17#include <sys/stat.h>
18#include <fcntl.h>
19#include <limits.h>
20#include <stdio.h>
21#include <unistd.h>
22#include <errno.h>
23#include <string.h>
24#include <rtems.h>
25#include <rtems/libio.h>
26#include <rtems/imfs.h>
27#include <pmacros.h>
28
29#define MAXSYMLINK 5   /* There needs to be a better way of getting this. */
30#define TIMEOUT_VALUE  ( 5 * TICKS_PER_SECOND )
31
32
33/*
34 *  List of files which should exist.
35 */
36
37char *Files[] = {
38  "/////my_mount_point/dir1/\\//file1\\\\//",
39  "/my_mount_point/dir1/file2",
40  "/my_mount_point/dir1/file3",
41  "/my_mount_point/dir1/file4",
42  "/my_mount_point/dir1/dir1/file1",
43  "../../..//my_mount_point/dir1/./././dir1/ file1",
44  "main.c",
45  0
46};
47
48/*
49 *  List of directories which should exist.
50 */
51
52char *Directories[] = {
53  "/my_mount_point/dir1",
54  "/my_mount_point/dir2",
55  "/my_mount_point/dir3",
56  "/my_mount_point/dir4",
57  "/my_mount_point/dir1/dir1",
58  "/./././my_mount_point/dir1/ dir1",
59  "/./././my_mount_point/links", 
60  "///my_mount_point/dir1/dir1/../../dir1/../symlinks/////",
61  0
62};
63
64char *Links_to_Dirs[]= {
65  "dir1/dir1/../../links/dir1",
66  "links/dir2",
67  "links/dir3",
68  "links/dir4",
69  "links/dir1_dir1",
70  "links/dir1_ dir1",
71  "links/../links/../links/links",
72  0
73};
74
75char *Links_to_Files[]= {
76  "links/dir1_file1",
77  "links/dir1_file2",
78  "links/dir1_file3",
79  "links/dir1_file4",
80  "links/dir1_dir1_f1",
81  "links/dir1_dir1 f1",
82  0
83};
84
85char *Links_to_dirlinks[]= {
86  "links/links/links/links_dir1",
87  "links//links_dir2",
88  "links//links_dir3",
89  "links//links_dir4",
90  "links//links_dir1_d1",
91  "links//links_dir1 d1",
92  "links//links_links",
93  0
94};
95
96char *Links_to_filelinks[]= {
97  "links///links_d1_file1",
98  "links///links_d1_file2",
99  "links///links_d1_file3",
100  "links///links_d1_file4",
101  "links///links_d1_d1_f1",
102  "links///links_r1_d1 f1",
103  0
104};
105
106char *SymLinks[]= {
107  "/my_mount_point/symlinks/a_file_symlink",
108  "/my_mount_point/symlinks/a_dir_symlink",
109  "/my_mount_point/symlinks/a_link_symlink",
110  "../symlinks/no_file",
111  "/my_mount_point/symlinks/a_dir_symlink/a_file_symlink",
112  0
113};
114
115/*
116 *  List of absolute paths to stat.
117 */
118
119char *Good_absolute_paths[] = {
120  "/my_mount_point/dev",
121  "////my_mount_point/dir1/\\//file1\\\\//",
122  "/my_mount_point/dir1/\\\\/file2",
123  "/my_mount_point/dir1/file3/////\\\\\\",
124  "/my_mount_point/dir1/file4",
125  "/my_mount_point/dir1/dir1/file1",
126  "/my_mount_point/dir1/dir1/ file1",
127  "/my_mount_point/dir1",
128  "/my_mount_point/dir2//////\\",
129  "/my_mount_point/dir3",
130  "/my_mount_point/dir4",
131  "/my_mount_point/dir1/dir1",
132  "/my_mount_point/dir1/ dir1///\\\\",
133  "/my_mount_point/\\/\\/\\/\\/\\/\\/links\\/\\/\\/\\/\\/\\",
134  0
135};
136
137
138char *Bad_paths[] = {
139  "/my_mount_point/links/ENAMETOOLONG__________________________",
140  "/my_mount_point/dir1/file4/NOTADIR",
141  "/my_mount_point/dir1/dir1/EACCES__",
142  0
143};
144
145/*
146 *  List of relative paths to stat.
147 */
148
149char *Good_relative_paths[] = {
150  "dev",
151  "dir1/\\//file1\\\\//",
152  "dir1/\\\\/file2",
153  "dir1/file3/////\\\\\\",
154  "dir1/file4",
155  "dir1/dir1/file1",
156  "dir1/dir1/ file1",
157  "dir1",
158  "dir2//////\\",
159  "dir3",
160  "dir4",
161  "dir1/dir1",
162  "dir1/ dir1///\\\\",
163  "main.c",
164  0
165};
166
167/*
168 *  Do a stat on a single file and report the status.
169 */
170
171void stat_a_file(
172  const char *file
173)
174{
175  int         status;
176  struct stat statbuf;
177  int         major1;
178  int         minor1;
179  int         major2;
180  int         minor2;
181
182
183  assert( file );
184
185  printf( "stat( %s ) returned ", file );
186  fflush( stdout );
187
188  status = stat( file, &statbuf );
189
190  if ( status == -1 ) {
191    printf( ": %s\n", strerror( errno ) );
192  } else {
193
194    rtems_filesystem_split_dev_t( statbuf.st_dev, major1, minor1 );
195    rtems_filesystem_split_dev_t( statbuf.st_rdev, major2, minor2 );
196
197
198    printf("\n...st_dev     (0x%x:0x%x)\n", major1, minor1 );
199    printf(  "...st_ino     %x\n", (int) statbuf.st_ino );
200    printf(  "...st_mode    %o\n", (unsigned int) statbuf.st_mode );
201    printf(  "...st_nlink   %x\n", statbuf.st_nlink );
202    printf(  "...st_uid     %d\n", statbuf.st_uid );
203    printf(  "...st_gid     %d\n", statbuf.st_gid );
204    printf(  "...st_rdev    (0x%x:0x%x)\n", major2, minor2 );
205    printf(  "...st_size    %d\n",(unsigned int) statbuf.st_size );
206    printf(  "...st_atime   %s", ctime( &statbuf.st_atime ) );
207    printf(  "...st_mtime   %s", ctime( &statbuf.st_mtime ) );
208    printf(  "...st_ctime   %s", ctime( &statbuf.st_ctime ) );
209#if defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)
210    printf(  "...st_blksize %x\n", statbuf.st_blksize );
211    printf(  "...st_blocks  %x\n", statbuf.st_blocks );
212#endif
213
214  }
215}
216
217/*
218 *  stat() multiple files at a time
219 */
220
221void stat_multiple_files(
222  char **files
223)
224{
225  int    i;
226
227  i = 0;
228  while ( files[i] ) {
229    stat_a_file( files[i] );
230    i++;
231  }
232}
233
234/*
235 *  chown() multiple files at a time
236 */
237void chown_multiple_files(
238  char **files
239)
240{
241  int    i;
242  uid_t  st_uid;
243  gid_t  st_gid;
244
245  st_uid = geteuid();
246  st_gid = getegid();
247
248  i = 0;
249  while ( files[i] ) {
250    printf("Change group of %s\n", files[i]);
251    chown( files[i], st_uid, (st_gid+1) );
252    stat_a_file( files[i] );
253
254    printf("Change owner of %s\n", files[i]);
255    chown( files[i], (st_uid+1), st_gid );
256    stat_a_file( files[i] );
257    i++;
258  }
259
260}
261
262
263
264/*
265 *  mknod() multiple files at a time
266 */
267
268void make_multiple_files(
269  char **files
270)
271{
272  int    i;
273  int    status;
274
275  i = 0;
276  while ( files[i] ) {
277    printf( "Making file %s\n", files[i] );
278    status = mknod( files[i], ( S_IFREG | S_IROTH|S_IWOTH ), 0LL );
279    assert( !status );
280    i++;
281  }
282  puts( "" );
283}
284
285void make_multiple_bad_files(
286  char **files
287)
288{
289  int    i;
290  int    status;
291
292  i = 0;
293  while ( files[i] ) {
294    printf( "Making file %s ", files[i] );
295    status = mknod( files[i], ( S_IFREG | S_IROTH|S_IWOTH ), 0LL );
296    assert( status );
297    printf( ": %s\n", strerror( errno ) );
298    i++;
299  }
300  puts( "" );
301}
302
303void make_multiple_links(
304  char **existing,
305  char **new
306)
307{
308  int    i;
309  int    status;
310
311  i = 0;
312  while ( new[i] && existing[i] ) {
313    printf( "Making file %s\n", new[i] );
314    status = link( existing[i], new[i] );
315    assert( !status );
316    i++;
317  }
318  puts( "" );
319
320  status = link( "fred", "bob" );
321  assert( status == -1 );
322
323  status = link( existing[1], "doug/bob" );
324  assert( status == -1 );
325}
326
327
328void make_too_many_links()
329{
330  int    i;
331  int    status;
332  char   name [20];
333
334  status = mkdir("/dummy", S_IRWXU );
335  assert( status == 0 );
336
337  for (i=1; i<= LINK_MAX; i++) {
338
339    sprintf(name,"/LinkName%d",i);
340    printf( "Making file %s\n", name );
341    status = link("/dummy" , name );
342    if( i < LINK_MAX )
343       assert( !status );
344    else
345       assert( status == -1 );
346
347  }
348}
349
350
351void make_a_symlink(
352  char *existing,
353  char *new
354)
355{
356  int    status;
357  char   buf[100];
358  int    len;
359
360  memset( buf, 0, 100 );
361
362  printf( "Making file %s\n", new );
363  status = symlink( existing, new );
364  assert( !status );
365
366  printf( "Verify with readlink\n");
367  status = readlink( new, buf, 100 );
368  len = strlen( existing );
369  assert ( status == len );
370
371  status = readlink( new, buf, 3 );
372  len = strlen( existing );
373  if (len < 3 )
374    assert( status == len );
375  else
376    assert( status == 3 );
377
378  status = strcmp( existing, buf );
379  assert( !status );
380}
381
382void make_multiple_symlinks()
383{
384 int  status;
385
386 make_a_symlink( Files[0],             SymLinks[0] );
387 make_a_symlink( Directories[0],       SymLinks[1] );
388 make_a_symlink( Links_to_dirlinks[0], SymLinks[2] );
389 make_a_symlink( "No_File",            SymLinks[3] );
390 make_a_symlink( SymLinks[1],          SymLinks[4] );
391 make_a_symlink( "//my_mount_point/links","/my_mount_point/symlinks/links" );
392
393 stat_a_file( SymLinks[0] );
394 stat_a_file( SymLinks[1] );
395 stat_a_file( SymLinks[2] );
396 stat_a_file( SymLinks[3] );
397 stat_a_file( SymLinks[4] );
398
399 status = symlink(  "//links", "bob/frank" );
400 assert (status == -1);
401
402}
403/*
404void make_too_many_symlinks()
405{
406  int  i, status;
407  char name1[8];
408
409  for (i=1; i <= MAXSYMLINK; i++) {
410    sprintf( name1, "SymLink%d", i );
411    status = symlink( "/dummy", name1 );
412    if( i < MAXSYMLINK )
413       assert( !status );
414    else
415       assert( status == -1 );
416  }
417}
418*/
419void make_many_symlinks(
420  char  *real_file,
421  int    link_count
422)
423{
424  int  i;
425  char name1[5];
426  char name2[5];
427  char *link_file;
428
429  link_file = real_file;
430  for (i=1; i < link_count; i++) {
431    sprintf( name1, "%d", i );
432    make_a_symlink( link_file, name1 );
433    strcpy( name2, name1 );
434    link_file = name2;
435  }
436
437  for (i=1; i < link_count; i++) {
438    sprintf( name1, "%d", i );
439    stat_a_file( name1 );
440  }
441
442}
443
444/*
445 *  mkdir() multiple directories at a time
446 */
447 
448void make_multiple_directories(
449  char **files
450) 
451{
452  int    i;
453  int    status;
454
455  i = 0; 
456  while ( files[i] ) {
457    printf( "Making directory %s\n", files[i] );
458    status = mkdir( files[i], S_IRWXU );
459    assert( !status );
460    i++;
461  }
462  puts( "" );
463} 
464
465/*
466 * Cause faults.
467 */
468
469
470void Cause_faults()
471{
472  int                                   fd;
473  int                                   status;
474  char                                  longer_name[100];
475  rtems_filesystem_mount_table_entry_t *mt_entry;
476
477  /*
478   * Verify chmod with an invalid type.
479   */
480
481  printf("\n\nPass an invalid mode to chmod should fail with EPERM \n" );
482  status = chmod( Files[0], S_IFREG );
483  assert( status == -1 ); 
484  assert( errno == EPERM );
485
486  /*
487   * Change file to executable then try to chdir to it.
488   */
489
490  status = chmod( Files[0], S_IXUSR );
491  assert( status != -1 );
492
493  printf("chdir to a file should fail with ENOTDIR\n");
494  status = chdir( Files[0] );
495  assert( status == -1 );
496  assert( errno == ENOTDIR );
497
498  /*
499   * Change mode to read/write on a directory.
500   * Verify directory works properly.
501   */
502
503  printf("Verify RWX permission on %s via access\n", Directories[0]);
504  status = access( Directories[0], ( R_OK | W_OK | X_OK )  );
505  assert( status == 0 );
506
507  printf( "chmod of %s to Read/Write\n", Directories[0] );
508  status = chmod( Directories[0], (S_IXGRP | S_IXOTH) );
509  assert( status == 0 );
510
511  printf( "chmod fred should fail with ENOENT\n" );
512  status = chmod( "fred", (S_IXGRP | S_IXOTH) );
513  assert( status == -1 );
514  assert( errno == ENOENT );
515
516  strcpy(longer_name, Directories[0] );
517  strcat(longer_name, "/BADNAME" );
518  printf( "Create under %s should fail with EACCES\n", Directories[0] );
519  status = mkdir( longer_name , S_IRWXU );
520  assert( status == -1 );
521  assert( errno == EACCES );
522
523  printf("chdir to %s should fail with EACCES\n", Directories[4] );
524  status = chdir( Directories[4] );
525  assert( status == -1 );
526  assert( errno == EACCES );
527
528  /*
529   * Check stat with a NULL buffer.
530   */
531
532  printf("Stat with a NULL buffer should fail with EFAULT\n");
533  status = stat( Directories[0], NULL );
534  assert( status == -1 );
535  assert( errno == EFAULT );
536
537  /*
538   * Set current to a directory with no owner permissions.
539   * Verify it works properly.
540   */
541
542  printf( "\n\nchmod of %s to Read/Write\n", Directories[0] );
543  status = chmod( Directories[0], (S_IXGRP | S_IXOTH) );
544  assert( status == 0 );
545
546  printf("mkdir %s should fail with EACCESS\n", longer_name );
547  status = mkdir( longer_name , S_IRWXU );
548  assert( status == -1 );
549  assert( errno == EACCES );
550
551  printf("\n%s Should exist ( access )\n",Directories[0] );
552  status = access( Directories[0], F_OK );
553  assert( status == 0 );
554  printf("\n%s Should have read  permission( access )\n",Directories[0] );
555  status = access( Directories[0], R_OK );
556  assert( status != 0 );
557  printf("\n%s Should have write permission( access )\n",Directories[0] );
558  status = access( Directories[0], W_OK );
559  assert( status != 0 );
560  printf("\n%s Should not have execute permission( access )\n",Directories[0] );
561  status = access( Directories[0], X_OK );
562  assert( status != 0 );
563 
564  printf("\nRestore %s to RWX\n",Directories[0] );
565  status = chmod( Directories[0], S_IRWXU );
566  assert( status == 0 );
567
568  printf("chdir to /my_mount_point \n");
569  status = chdir( "/my_mount_point" );
570  assert( status == 0 );
571
572  /*
573   * Remove one of the directories.
574   * Verify links to the removed directory still work.
575   */
576
577  printf( "Remove %s\n", Directories[5] );
578  status = rmdir( Directories[5] );
579  assert( status == 0 );
580
581  stat_a_file( Directories[5] );
582  status = access( Directories[5], F_OK );
583  assert( status != 0 );
584
585  stat_a_file( Links_to_Dirs[5] );
586  status = readlink( Links_to_Dirs[5], longer_name, 3 );
587  assert( status == -1 );
588  assert( errno == EINVAL );
589
590  stat_a_file( Links_to_dirlinks[5] );
591  printf("Chdir to %s\n", Links_to_Dirs[5] );
592  status = chdir( Links_to_Dirs[5] );
593  assert( status == 0 );
594
595  /*
596   * Verify we cannot move up from a node with no parent node.
597   */
598
599  printf("Chdir to .. should fail with ENOENT\n" );
600  status = chdir( ".." );
601  assert( status == -1 );
602  assert( errno == ENOENT );
603
604  /*
605   * Create a subdirectory under the dangling node.
606   */
607
608  printf("mkdir ../t should fail with ENOENT\n" );
609  status = mkdir( "../t" , S_IRWXU );
610  assert( status == -1 );
611  assert( errno == ENOENT );
612
613  printf("mkdir t\n");
614  status = mkdir( "t" , S_IRWXU );
615  assert( status == 0 );
616
617  printf("chdir to /my_mount_point\n");
618  status = chdir( "/my_mount_point" );
619  assert( status == 0 );
620
621  /*
622   * Check rmdir, rmnod, and unlink
623   */
624
625  printf("rmdir %s should fail with ENOTDIR\n", Links_to_Dirs[5] );
626  status = rmdir( Links_to_Dirs[5] );
627  assert( status == -1 );
628  assert( errno == ENOTDIR );
629
630  printf("unlink %s\n", Links_to_Dirs[5] );
631  status = unlink( Links_to_Dirs[5] );
632  assert( status == 0 );
633
634  printf("unlink %s should fail with ENOTEMPTY\n", Links_to_dirlinks[5] );
635  status = unlink(  Links_to_dirlinks[5] );
636  assert( status == -1 );
637  assert( errno == ENOTEMPTY );
638
639  strcpy( longer_name,  Links_to_dirlinks[5] );
640  strcat( longer_name, "/t");
641  printf("rmdir %s\n", longer_name );
642  status = rmdir( longer_name );
643  assert( status == 0 );
644
645  printf("unlink %s\n", Links_to_Dirs[5]);
646  status = unlink( Links_to_dirlinks[5] );
647  assert( status == 0 );
648
649  status = chdir( Directories[0] );
650  status = mkdir ( "my_mount_point", S_IRWXU );
651  assert( status == 0 );
652
653  printf("Attempting to mount IMFS file system at /dir1/my_mount_point \n");
654  status = mount(
655     &mt_entry,
656     &IMFS_ops,
657     RTEMS_FILESYSTEM_READ_WRITE,
658     NULL,
659     "/my_mount_point/dir1/my_mount_point" );
660  assert( status == 0 );
661
662  printf("rmdir /dir1/my_mount_point should fail with EBUSY\n");
663  status = rmdir ("/my_mount_point/dir1/my_mount_point" );
664  assert( status == -1 );
665  assert( errno == EBUSY );
666
667  printf( "Unmount /my_mount_point/dir1/my_mount_point\n");
668  status = unmount( "/my_mount_point/dir1/my_mount_point" );
669  assert( status == 0 );
670
671  /*
672   * Verify write permission is checked.
673   */
674
675  printf("chmod of %s to group and other execute\n", Files[0] );
676  status = chmod (Files[0], (S_IXGRP | S_IXOTH) );
677  assert( status == 0 );
678
679  printf("Open %s for write should fail with EACCES\n", Files[0] );
680  fd = open (Files[0], O_WRONLY); 
681  assert( fd == -1 );
682  assert( errno == EACCES );
683
684  printf("chmod of %s to User Execute and Read\n", Directories[3] );
685  status = chmod (Directories[3], (S_IXUSR | S_IRUSR) );
686  assert( status == 0 );
687  strcpy(longer_name, Directories[3] );
688  strcat(longer_name, "/NewFile" );
689  printf("Mkdir of %s should fail with EACCES\n",longer_name );
690  status = mkdir( longer_name, S_IRWXU );
691  assert( status != 0 );
692  assert( errno == EACCES );
693
694  printf("Making too many hard links.\n" );
695  make_too_many_links( );
696
697  printf( "pass fstat a null pointer should fail with EFAULT\n");
698  status = fstat( fd, NULL );
699  assert( status == -1 ); 
700  assert( errno == EFAULT);
701
702  /*
703   * The current directory MUST be restored at the end of this test.
704   */
705
706  printf("chdir to /my_mount_point \n");
707  status = chdir( "/my_mount_point" );
708  assert( status == 0 );
709
710}
711
712void Show_Time()
713{
714  rtems_time_of_day time;
715  rtems_status_code status;
716
717  status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
718  printf(">>>>Current Time: ");
719  print_time( " - rtems_clock_get - ", &time, "\n" );
720}
721
722/*
723 *  main entry point to the test
724 */
725
726#if defined(__rtems__)
727int test_main(void)
728#else
729int main(
730  int    argc,
731  char **argv
732)
733#endif
734{
735  rtems_status_code                    status;
736  rtems_time_of_day                    time;
737  rtems_filesystem_mount_table_entry_t *mt_entry;
738
739  puts( "\n\n*** STAT TEST 01 ***" );
740
741  build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
742  status = rtems_clock_set( &time );
743  Show_Time();
744
745  /*
746   * Create and mount another version of the filesyste.
747   * This allows expected node id's to be consistant across
748   * platforms and bsp's.
749   */
750
751  status = mkdir("/my_mount_point",  S_IRWXU );
752  assert( status == 0 );
753  status = mount(
754     &mt_entry,
755     &IMFS_ops,
756     RTEMS_FILESYSTEM_READ_WRITE,
757     NULL,
758     "my_mount_point" );
759  assert( status == 0 );
760  status = chdir( "/my_mount_point" );
761  assert( status == 0 );
762  status = mkdir("dev",  S_IRWXU );
763  assert( status == 0 );
764
765
766  /*
767   *  Create the files and directories for the test.
768   */
769
770  make_multiple_directories( Directories );
771  make_multiple_files( Files );
772  make_multiple_links( Directories,    Links_to_Dirs );
773  make_multiple_links( Files,          Links_to_Files );
774
775  status = rtems_task_wake_after( TIMEOUT_VALUE );
776  make_multiple_links( Links_to_Dirs,  Links_to_dirlinks );
777  status = rtems_task_wake_after( TIMEOUT_VALUE );
778  make_multiple_links( Links_to_Files, Links_to_filelinks );
779
780  status = rtems_task_wake_after( TIMEOUT_VALUE );
781
782  /*
783   *  Now go through all the absolute path.
784   */
785
786  puts( "Doing the stat() on all the good absolute paths" );
787  stat_multiple_files( Good_absolute_paths );
788
789  /*
790   *  run through the relative paths.
791   */
792
793  puts( "\nDoing the stat() on all the good relative paths" );
794  stat_multiple_files( Good_relative_paths );
795
796  /*
797   * Change directory and releative paths are now bad.
798   */
799
800  puts("\nchdir to dev");
801  chdir("dev");
802  puts("\nstat relative paths that are now bad");
803  stat_multiple_files( Good_relative_paths );
804
805  /*
806   * Change directory to the link directory and follow links.
807   */
808
809  puts("\nchdir to ../links");
810  chdir("../links");
811  puts("Doing the stat() on good links\n");
812  stat_multiple_files( Links_to_Dirs );
813  stat_multiple_files( Links_to_Files );
814  stat_multiple_files( Links_to_dirlinks  );
815  stat_multiple_files( Links_to_filelinks );
816 
817  /*
818   * Chmod on dir1/dir1.  This allows the error path to be hit.
819   */
820
821  printf( "chmod of %s to Read/Write\n", Directories[4] );
822  chmod( Directories[4], (S_IROTH|S_IWOTH) );
823  puts( "\nDoing the stat() on all the bad paths" );
824
825  stat_multiple_files( Bad_paths );
826  make_multiple_bad_files( Bad_paths );
827
828  printf( "Return %s to RWX\n", Directories[4] );
829  chmod( Directories[4], S_IRWXU );
830
831
832  /*
833   * Check out symbolic links.
834   */
835
836  make_multiple_symlinks();
837  make_many_symlinks( "/symlinks", 10 );
838
839  status = rtems_task_wake_after( TIMEOUT_VALUE );
840  Cause_faults();
841
842  status = rtems_task_wake_after( TIMEOUT_VALUE );
843  chown_multiple_files( Files );
844
845  status = rtems_task_wake_after( TIMEOUT_VALUE );
846  chown_multiple_files( Links_to_Dirs );
847 
848  puts( "\n\n*** END OF STAT TEST 01 ***" );
849  rtems_test_exit(0);
850}
851
852
853
854
855
856
857
Note: See TracBrowser for help on using the repository browser.