Home | History | Annotate | Download | only in fcntl
      1 /*
      2  *   Copyright (C) Bull S.A. 2001
      3  *   Copyright (c) International Business Machines  Corp., 2001
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /*
     21  * Test Name: fcntl22
     22  *
     23  * Test Description:
     24  *  Verify that, fcntl() fails with -1 and sets errno to EAGAIN when
     25  *				  Operation  is  prohibited  by locks held by other processes.
     26  *
     27  * Expected Result:
     28  *  fcntl() should fail with return value -1 and sets expected errno.
     29  *
     30  * HISTORY
     31  *		 06/2002 Ported by Jacky Malcles
     32  */
     33 
     34 #include <fcntl.h>
     35 #include <errno.h>
     36 #include <signal.h>
     37 #include <stdlib.h>
     38 #include <sys/types.h>
     39 #include <sys/wait.h>
     40 #include "test.h"
     41 
     42 int child_pid;
     43 int file;
     44 struct flock fl;
     45 
     46 char *TCID = "fcntl22";
     47 int TST_TOTAL = 1;
     48 
     49 void setup(void);
     50 void cleanup(void);
     51 
     52 int main(int ac, char **av)
     53 {
     54 	int lc;
     55 
     56 	tst_parse_opts(ac, av, NULL, NULL);
     57 
     58 	setup();
     59 
     60 	for (lc = 0; TEST_LOOPING(lc); lc++) {
     61 		tst_count = 0;
     62 
     63 		child_pid = FORK_OR_VFORK();
     64 		switch (child_pid) {
     65 		case 0:
     66 			TEST(fcntl(file, F_SETLK, &fl));
     67 
     68 			if (TEST_RETURN != -1) {
     69 				tst_resm(TFAIL, "fcntl() returned %ld,"
     70 					 "expected -1, errno=%d", TEST_RETURN,
     71 					 EAGAIN);
     72 			} else {
     73 				if (TEST_ERRNO == EAGAIN) {
     74 					tst_resm(TPASS,
     75 						 "fcntl() fails with expected "
     76 						 "error EAGAIN errno:%d",
     77 						 TEST_ERRNO);
     78 				} else {
     79 					tst_resm(TFAIL, "fcntl() fails, EAGAIN, "
     80 						 "errno=%d, expected errno=%d",
     81 						 TEST_ERRNO, EAGAIN);
     82 				}
     83 			}
     84 			tst_exit();
     85 		break;
     86 		case -1:
     87 			tst_brkm(TBROK|TERRNO, cleanup, "Fork failed");
     88 		break;
     89 		default:
     90 			tst_record_childstatus(cleanup, child_pid);
     91 		}
     92 
     93 	}
     94 
     95 	cleanup();
     96 	tst_exit();
     97 }
     98 
     99 void setup(void)
    100 {
    101 	tst_sig(FORK, DEF_HANDLER, cleanup);
    102 
    103 	TEST_PAUSE;
    104 
    105 	tst_tmpdir();
    106 
    107 	if ((file = creat("regfile", 0777)) == -1) {
    108 		tst_brkm(TBROK, cleanup,
    109 			 "creat(regfile, 0777) failed, errno:%d %s", errno,
    110 			 strerror(errno));
    111 	}
    112 
    113 	fl.l_type = F_WRLCK;
    114 	fl.l_whence = 0;
    115 	fl.l_start = 0;
    116 	fl.l_len = 0;
    117 
    118 	if (fcntl(file, F_SETLK, &fl) < 0)
    119 		tst_brkm(TBROK | TERRNO, cleanup, "fcntl() failed");
    120 }
    121 
    122 void cleanup(void)
    123 {
    124 	close(file);
    125 
    126 	tst_rmdir();
    127 }
    128