inotify02.c revision 45e285d46ab47b0ff76c88acb5ba97b0bd5f753d
173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* 273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Copyright (c) 2007 SWSoft. All Rights Reserved. 373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * This program is free software; you can redistribute it and/or modify it 573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * under the terms of version 2 of the GNU General Public License as 673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * published by the Free Software Foundation. 773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * This program is distributed in the hope that it would be useful, but 973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * WITHOUT ANY WARRANTY; without even the implied warranty of 1073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 1173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 1273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Further, this software is distributed without any warranty that it is 1373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * free of the rightful claim of any third person regarding infringement 1473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * or the like. Any license provided herein, whether implied or 1573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * otherwise, applies only to this software file. Patent licenses, if 1673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * any, provided herein do not apply to combinations of this program with 1773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * other software, or any other product whatsoever. 1873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 1973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * You should have received a copy of the GNU General Public License along 2073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * with this program; if not, write the Free Software Foundation, Inc., 59 2173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Temple Place - Suite 330, Boston MA 02111-1307, USA. 2273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 2373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Started by Andrew Vagin <avagin@sw.ru> 2473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 2573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak */ 2673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/**************************************************************************** 2773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * NAME 2873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * inotify02 2973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 3073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * DESCRIPTION 3173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Check that inotify work for a directory 3273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 3373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * ALGORITHM 3473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Execute sequence file's operation and check return events 3573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 36c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak * HISTORY 374bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 01/06/2007 - Fix to compile inotify test case with kernel that does 38c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak * not support it. Ricardo Salveti de Araujo <rsalveti@linux.vnet.ibm.com> 39c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak * 409a4c40943ff3e55687845cd4bab3a865f7163352subrata_modak * 03/27/2008 - Fix the test failure due to event coalescence. Also add 419a4c40943ff3e55687845cd4bab3a865f7163352subrata_modak * test for this event coalescence. Li Zefan <lizf@cn.fujitsu.com> 429a4c40943ff3e55687845cd4bab3a865f7163352subrata_modak * 4373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * ***************************************************************************/ 44c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 4586faed4f828f8d46dff2d18b8be0570553716374subrata_modak#include "config.h" 4686faed4f828f8d46dff2d18b8be0570553716374subrata_modak 4773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <stdio.h> 4873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/stat.h> 4973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/types.h> 5073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/fcntl.h> 5173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <errno.h> 5273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <string.h> 53c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#include <sys/syscall.h> 5473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include "test.h" 5573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include "usctest.h" 5673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 57ba7d3f7b72a583bdd35bcf88187829b23aaa944asubrata_modak#if defined(__NR_inotify_init) && defined(HAVE_SYS_INOTIFY_H) 583e9f0947adf0937e8ef3d68fefeb2da698c460casubrata_modak#include <sys/inotify.h> 59c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 603d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#ifndef IN_MOVE_SELF 613d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#define IN_MOVE_SELF 0x00000800 623d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#endif 633d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak 6473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_MAX 1024 6573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* size of the event structure, not counting name */ 6673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_SIZE (sizeof (struct inotify_event)) 6773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* reasonable guess as to size of 1024 events */ 6873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_BUF_LEN (EVENT_MAX * (EVENT_SIZE + 16)) 6973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 7073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakvoid setup(); 7173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakvoid cleanup(); 7273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 7356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "inotify02"; /* Test program identifier. */ 7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint TST_TOTAL = 9; /* Total number of test cases.*/ 7556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakextern int Tst_count; /* Test Case counter for tst_* routines */ 7673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 7773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define BUF_SIZE 256 789a4c40943ff3e55687845cd4bab3a865f7163352subrata_modakchar fname1[BUF_SIZE], fname2[BUF_SIZE], fname3[BUF_SIZE]; 7973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakchar buf[BUF_SIZE]; 8073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakint fd, fd_notify; 81c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modakint wd; 8273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 8373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakstruct event_t { 8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char name[BUF_SIZE]; 8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int mask; 8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int len; 8773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak}; 8873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define FILE_NAME1 "test_file1" 8973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define FILE_NAME2 "test_file2" 9073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 9156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct event_t event_set[EVENT_MAX]; 9273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 9303b05a0307a3020c5b86297bc863765b253fa1a0vapierchar event_buf[EVENT_BUF_LEN]; 9403b05a0307a3020c5b86297bc863765b253fa1a0vapier 95c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modakstatic long myinotify_init() 96c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak{ 9756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return syscall(__NR_inotify_init); 98c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak} 99c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 100c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modakstatic long myinotify_add_watch(int fd, const char *pathname, int mask) 101c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak{ 10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return syscall(__NR_inotify_add_watch, fd, pathname, mask); 103c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak} 104c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 105c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modakstatic long myinotify_rm_watch(int fd, int wd) 106c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak{ 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return syscall(__NR_inotify_rm_watch, fd, wd); 108c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak} 109c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 11056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 11156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{ 11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int lc; /* loop counter */ 11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char *msg; /* message returned from parse_opts */ 11456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 11556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * parse standard options 11756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 11845e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) 11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); 12056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 12156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * perform global setup for test 12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 12456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak setup(); 12556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 12656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 12756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * check looping state if -c option given 12856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 12956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (lc = 0; TEST_LOOPING(lc); lc++) { 13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* reset Tst_count in case we are looping. */ 13256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count = 0; 13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 13456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * generate sequence of events 13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 13756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (chmod(".", 0755) < 0) { 13856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 13956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "chmod(\".\", 0755) Failed, errno=%d : %s", 14056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak errno, strerror(errno)); 14156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 14256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_ISDIR | IN_ATTRIB; 14356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, ""); 14456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 14556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 14656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((fd = creat(FILE_NAME1, 0755)) == -1) { 14756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "creat(\"%s\", 755) Failed, errno=%d : %s", 14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak FILE_NAME1, errno, strerror(errno)); 15056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 15156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 15256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_CREATE; 15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, FILE_NAME1); 15456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 15556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_OPEN; 15656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, FILE_NAME1); 15756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 15956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (close(fd) == -1) { 16056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 16156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "close(%s) Failed, errno=%d : %s", FILE_NAME1, 16256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak errno, strerror(errno)); 16356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 16456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_CLOSE_WRITE; 16556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, FILE_NAME1); 16656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 16856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(FILE_NAME1, FILE_NAME2) == -1) { 16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "rename(%s, %s) Failed, errno=%d : %s", 17156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak FILE_NAME1, FILE_NAME2, errno, 17256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strerror(errno)); 17356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 17456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_MOVED_FROM; 17556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, FILE_NAME1); 17656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 17756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_MOVED_TO; 17856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, FILE_NAME2); 17956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 18056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 18156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (getcwd(fname1, BUF_SIZE) == NULL) { 182923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak tst_brkm(TBROK | TERRNO, cleanup, 183923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "getcwd(%p, %d) Failed", fname1, 184923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak BUF_SIZE); 18556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 18756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak snprintf(fname2, BUF_SIZE, "%s.rename1", fname1); 18856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(fname1, fname2) == -1) { 18956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 19056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "rename(%s, %s) Failed, errno=%d : %s", fname1, 19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fname2, errno, strerror(errno)); 19256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 19356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_MOVE_SELF; 19456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, ""); 19556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 19756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (unlink(FILE_NAME2) == -1) { 19856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 19956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "unlink(%s) Failed, errno=%d : %s", FILE_NAME2, 20056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak errno, strerror(errno)); 20156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_DELETE; 20356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, FILE_NAME2); 20456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 20656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 20756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * test that duplicate events will be coalesced into 20856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * a single event. This test case should be last, that 20956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * we can correct determine kernel bug which exist before 21056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * 2.6.25. See comment below. 21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak snprintf(fname3, BUF_SIZE, "%s.rename2", fname1); 21356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(fname2, fname3) == -1) { 21456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 21556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "rename(%s, %s) Failed, errno=%d : %s", fname2, 21656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fname3, errno, strerror(errno)); 21756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 21956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(fname3, fname1) == -1) { 22056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "rename(%s, %s) Failed, errno=%d : %s", fname3, 22256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fname1, errno, strerror(errno)); 22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 22456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[Tst_count].mask = IN_MOVE_SELF; 22556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcpy(event_set[Tst_count].name, ""); 22656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count++; 22756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 22856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (Tst_count != TST_TOTAL) { 22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 23056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "Tst_count and TST_TOTAL are not equal"); 23156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 23356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak Tst_count = 0; 23456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 23556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int len, i = 0, test_num = 0; 23656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((len = read(fd_notify, event_buf, EVENT_BUF_LEN)) < 0) { 23756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 23856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "read(%d, buf, %d) Failed, errno=%d : %s", 23956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fd_notify, EVENT_BUF_LEN, errno, 24056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strerror(errno)); 24156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 24256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 24356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 24456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak while (i < len) { 24556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak struct inotify_event *event; 24656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event = (struct inotify_event *)&event_buf[i]; 24756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (test_num >= TST_TOTAL) { 24856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (tst_kvercmp(2, 6, 25) < 0 24956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak && event_set[TST_TOTAL - 1].mask == 25056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->mask) 25156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, 25256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "This may be kernel bug. " 25356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "Before kernel 2.6.25, a kernel bug " 25456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "meant that the kernel code that was " 25556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "intended to coalesce successive identical " 25656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "events (i.e., the two most recent " 25756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "events could potentially be coalesced " 25856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "if the older had not yet been read) " 25956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "instead checked if the most recent event " 26056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "could be coalesced with the oldest " 26156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "unread event. This has been fixed by commit" 26256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "1c17d18e3775485bf1e0ce79575eb637a94494a2."); 26356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, 26456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "get unnecessary event: " 26556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "wd=%d mask=%x cookie=%u len=%u" 26656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "name=\"%s\"", event->wd, event->mask, 26756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->cookie, event->len, 26856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->name); 26956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 27056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } else if ((event_set[test_num].mask == event->mask) 27156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak && 27256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (!strncmp 27356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (event_set[test_num].name, event->name, 27456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->len))) { 27556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TPASS, 27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "get event: wd=%d mask=%x" 27756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak " cookie=%u len=%u name=\"%s\"", 27856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->wd, event->mask, event->cookie, 27956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->len, event->name); 28056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 28156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } else { 28256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "get event: wd=%d mask=%x " 28356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "(expected %x) cookie=%u len=%u " 28456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "name=\"%s\" (expected \"%s\") %d", 28556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->wd, event->mask, 28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[test_num].mask, 28756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->cookie, event->len, event->name, 28856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[test_num].name, 28956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcmp(event_set[test_num].name, 29056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->name)); 29156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 29256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak test_num++; 29356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak i += EVENT_SIZE + event->len; 29456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 29556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 29656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (; test_num < TST_TOTAL; test_num++) { 29756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "don't get event: mask=%x ", 29856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[test_num]); 29956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 30056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } /* End for TEST_LOOPING */ 30156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 30256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* cleanup and exit */ 30356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak cleanup(); 30456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 30556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return 0; 30656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak} /* End main */ 30773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 30873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* 30973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * setup() - performs all ONE TIME setup for this test. 31073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak */ 31156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 31256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{ 31356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* capture signals */ 31456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_sig(NOFORK, DEF_HANDLER, cleanup); 31556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 31656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* Pause if that option was specified */ 31756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_PAUSE; 31856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 31956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* make a temp directory and cd to it */ 32056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_tmpdir(); 32156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 32256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((fd_notify = myinotify_init()) < 0) { 32356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (errno == ENOSYS) { 32456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TCONF, 32556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "inotify is not configured in this kernel."); 32656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TCONF, "Test will not run."); 32756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_exit(); 32856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } else { 32956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 33056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "inotify_init () Failed, errno=%d : %s", errno, 33156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strerror(errno)); 33256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 33356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 33456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 33556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((wd = myinotify_add_watch(fd_notify, ".", IN_ALL_EVENTS)) < 0) { 33656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 33756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "inotify_add_watch (%d, \".\", IN_ALL_EVENTS)" 33856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "Failed, errno=%d : %s", fd_notify, errno, 33956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strerror(errno)); 34056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak }; 34156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 34256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak} /* End setup() */ 34373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 34473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* 34573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * cleanup() - performs all ONE TIME cleanup for this test at 34673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * completion or premature exit. 34773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak */ 34856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 34956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{ 35056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (myinotify_rm_watch(fd_notify, wd) < 0) { 35156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, 35256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "inotify_rm_watch (%d, %d) Failed," "errno=%d : %s", 35356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak fd_notify, wd, errno, strerror(errno)); 35473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 35556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 35673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 35756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (close(fd_notify) == -1) { 35856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, "close(%d) Failed, errno=%d : %s", fd_notify, 35956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak errno, strerror(errno)); 36056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 36173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 36256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 36356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * print timing stats if that option was specified. 36456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * print errno log if that option was specified. 36556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 36656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_CLEANUP; 36773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 36856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* Remove tmp dir and all files in it */ 36956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_rmdir(); 37073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 37156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* exit with return code appropriate for results */ 37256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_exit(); 37356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak} /* End cleanup() */ 374c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 375c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#else 376c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 37756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakchar *TCID = "inotify02"; /* Test program identifier. */ 37856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint TST_TOTAL = 0; /* Total number of test cases. */ 379c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 38056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main() 381c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak{ 3822a172e42fc008f9c675333f329096927fca4be5bsubrata_modak#ifndef __NR_inotify_init 38356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TCONF, "This test needs a kernel that has inotify syscall."); 38456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TCONF, 38556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "Inotify syscall can be found at kernel 2.6.13 or higher."); 38656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return 0; 3872a172e42fc008f9c675333f329096927fca4be5bsubrata_modak#endif 388ba7d3f7b72a583bdd35bcf88187829b23aaa944asubrata_modak#ifndef HAVE_SYS_INOTIFY_H 38956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TBROK, "can't find header sys/inotify.h"); 39056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return 1; 3912a172e42fc008f9c675333f329096927fca4be5bsubrata_modak#endif 39256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak return 0; 393c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak} 394c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 395c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#endif 396