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 20fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc., 21fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 2273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 2373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Started by Andrew Vagin <avagin@sw.ru> 2473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 2573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * DESCRIPTION 2673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Check that inotify work for a directory 2773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * 2873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * ALGORITHM 2973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak * Execute sequence file's operation and check return events 3026aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubis */ 31c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 3286faed4f828f8d46dff2d18b8be0570553716374subrata_modak#include "config.h" 3386faed4f828f8d46dff2d18b8be0570553716374subrata_modak 3473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <stdio.h> 3573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/stat.h> 3673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/types.h> 3773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <sys/fcntl.h> 3873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <errno.h> 3973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include <string.h> 40c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#include <sys/syscall.h> 4173e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#include "test.h" 4253740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper#include "linux_syscall_numbers.h" 433bf3cb1cd688d60a3f4da0313d563fb10f6ed0edGarrett Cooper#include "inotify.h" 4473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 4553740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper#if defined(HAVE_SYS_INOTIFY_H) 463e9f0947adf0937e8ef3d68fefeb2da698c460casubrata_modak#include <sys/inotify.h> 47c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 483d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#ifndef IN_MOVE_SELF 493d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#define IN_MOVE_SELF 0x00000800 503d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak#endif 513d72679126ade72e37b82c130faa38a0b5431cd5subrata_modak 5273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_MAX 1024 5373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* size of the event structure, not counting name */ 5473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_SIZE (sizeof (struct inotify_event)) 5573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak/* reasonable guess as to size of 1024 events */ 5673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define EVENT_BUF_LEN (EVENT_MAX * (EVENT_SIZE + 16)) 5773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 5826aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic void setup(void); 5926aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic void cleanup(void); 6073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 61fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "inotify02"; 62fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 9; 6373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 6473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define BUF_SIZE 256 6526aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic char fname1[BUF_SIZE], fname2[BUF_SIZE], fname3[BUF_SIZE]; 6604f2177b65a3c10df5964180d1caf807ec531b72Cyril Hrubisstatic int fd, fd_notify, reap_wd; 6726aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic int wd; 6873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 6973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modakstruct event_t { 7056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char name[BUF_SIZE]; 716550b7a0c1fc03f6d0764ccaf0bca5813815580eAndrey Vagin unsigned int mask; 7273e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak}; 7373e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define FILE_NAME1 "test_file1" 7473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak#define FILE_NAME2 "test_file2" 7573e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 7626aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic struct event_t event_set[EVENT_MAX]; 7773e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 7826aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic char event_buf[EVENT_BUF_LEN]; 7903b05a0307a3020c5b86297bc863765b253fa1a0vapier 8056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 8156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{ 8289af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 831ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara unsigned int stored_cookie = UINT_MAX; 8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 85d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak setup(); 8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 8956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (lc = 0; TEST_LOOPING(lc); lc++) { 9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 91d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 9256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 9356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 9456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * generate sequence of events 9556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 9656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (chmod(".", 0755) < 0) { 97354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 98766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "chmod(\".\", 0755) failed"); 9956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 100d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_ISDIR | IN_ATTRIB; 101d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, ""); 102d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 10456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((fd = creat(FILE_NAME1, 0755)) == -1) { 105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "creat(\"%s\", 755) failed", FILE_NAME1); 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 109d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_CREATE; 110d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, FILE_NAME1); 111d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 112d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_OPEN; 113d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, FILE_NAME1); 114d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 11556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (close(fd) == -1) { 117354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 118766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "close(%s) failed", FILE_NAME1); 11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 120d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_CLOSE_WRITE; 121d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, FILE_NAME1); 122d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 12356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 12456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(FILE_NAME1, FILE_NAME2) == -1) { 125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 126766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "rename(%s, %s) failed", 127766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper FILE_NAME1, FILE_NAME2); 12856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 129d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_MOVED_FROM; 130d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, FILE_NAME1); 131d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 132d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_MOVED_TO; 133d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, FILE_NAME2); 134d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (getcwd(fname1, BUF_SIZE) == NULL) { 137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 138354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "getcwd(%p, %d) failed", fname1, BUF_SIZE); 13956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 14056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 14156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak snprintf(fname2, BUF_SIZE, "%s.rename1", fname1); 14256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(fname1, fname2) == -1) { 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 144766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "rename(%s, %s) failed", fname1, fname2); 14556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 146d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_MOVE_SELF; 147d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, ""); 148d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 15056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (unlink(FILE_NAME2) == -1) { 151354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 152766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "unlink(%s) failed", FILE_NAME2); 15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 154d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_DELETE; 155d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, FILE_NAME2); 156d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 15756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 15956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * test that duplicate events will be coalesced into 16056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * a single event. This test case should be last, that 16156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * we can correct determine kernel bug which exist before 16256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * 2.6.25. See comment below. 16356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak */ 16456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak snprintf(fname3, BUF_SIZE, "%s.rename2", fname1); 16556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(fname2, fname3) == -1) { 166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 167766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "rename(%s, %s) failed", fname2, fname3); 16856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (rename(fname3, fname1) == -1) { 171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 172766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "rename(%s, %s) failed", fname3, fname1); 17356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 174d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang event_set[tst_count].mask = IN_MOVE_SELF; 175d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang strcpy(event_set[tst_count].name, ""); 176d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count++; 17756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 178d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang if (tst_count != TST_TOTAL) { 17956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, 180d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang "tst_count and TST_TOTAL are not equal"); 18156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 18256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 183d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 18456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 18556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int len, i = 0, test_num = 0; 18653740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper if ((len = read(fd_notify, event_buf, EVENT_BUF_LEN)) == -1) { 187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 188f4539c6840b09c0428fd9b30c02ac0e747a4f9efMarkos Chandras "read(%d, buf, %zu) failed", 189766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper fd_notify, EVENT_BUF_LEN); 19056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 19156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 19256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 19356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak while (i < len) { 19456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak struct inotify_event *event; 19556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event = (struct inotify_event *)&event_buf[i]; 19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (test_num >= TST_TOTAL) { 19756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (tst_kvercmp(2, 6, 25) < 0 19856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak && event_set[TST_TOTAL - 1].mask == 19956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->mask) 20056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, 20156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "This may be kernel bug. " 20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "Before kernel 2.6.25, a kernel bug " 20356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "meant that the kernel code that was " 20456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "intended to coalesce successive identical " 20556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "events (i.e., the two most recent " 20656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "events could potentially be coalesced " 20756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "if the older had not yet been read) " 20856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "instead checked if the most recent event " 20956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "could be coalesced with the oldest " 21056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "unread event. This has been fixed by commit" 21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "1c17d18e3775485bf1e0ce79575eb637a94494a2."); 21256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, 21356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "get unnecessary event: " 21456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "wd=%d mask=%x cookie=%u len=%u" 215d1e94ff98dfd1381fa4c66d58e87866f99b6b72dAndrey Vagin "name=\"%.*s\"", event->wd, event->mask, 216d1e94ff98dfd1381fa4c66d58e87866f99b6b72dAndrey Vagin event->cookie, event->len, event->len, 21756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->name); 21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 21956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } else if ((event_set[test_num].mask == event->mask) 22056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak && 22156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (!strncmp 22256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (event_set[test_num].name, event->name, 22356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->len))) { 2241ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara int fail = 0; 2251ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara 2261ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara if (event->mask == IN_MOVED_FROM) { 2271ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara if (event->cookie == 0) 2281ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara fail = 1; 2291ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara else 2301ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara stored_cookie = event->cookie; 2311ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara } else if (event->mask == IN_MOVED_TO) { 2321ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara if (event->cookie != stored_cookie) 2331ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara fail = 1; 2341ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara else 2351ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara stored_cookie = UINT_MAX; 2361ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara } else { 2371ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara if (event->cookie != 0) 2381ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara fail = 1; 2391ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara } 2401ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara if (!fail) { 2411ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara tst_resm(TPASS, 2421ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara "get event: wd=%d mask=%x " 243d1e94ff98dfd1381fa4c66d58e87866f99b6b72dAndrey Vagin "cookie=%u len=%u name=\"%.*s\"", 2441ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara event->wd, event->mask, 2451ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara event->cookie, event->len, 246d1e94ff98dfd1381fa4c66d58e87866f99b6b72dAndrey Vagin event->len, event->name); 2471ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara } else { 2481ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara tst_resm(TFAIL, 2491ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara "get event: wd=%d mask=%x " 2501ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara "cookie=%u (wrong) len=%u " 2511ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara "name=\"%s\"", 2521ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara event->wd, event->mask, 2531ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara event->cookie, event->len, 2541ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara event->name); 2551ea2821124f38305fcf40b109839748b7ea8e9f9Jan Kara } 25656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } else { 25756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, "get event: wd=%d mask=%x " 25856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "(expected %x) cookie=%u len=%u " 25956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "name=\"%s\" (expected \"%s\") %d", 26056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->wd, event->mask, 26156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[test_num].mask, 26256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->cookie, event->len, event->name, 26356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event_set[test_num].name, 26456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak strcmp(event_set[test_num].name, 26556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak event->name)); 26656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 26756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak test_num++; 26856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak i += EVENT_SIZE + event->len; 26956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 27056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 27156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak for (; test_num < TST_TOTAL; test_num++) { 272766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper tst_resm(TFAIL, "didn't get event: mask=%x ", 273766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper event_set[test_num].mask); 27456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 2752c28215423293e443469a07ae7011135d058b671Garrett Cooper } 27656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 27756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak cleanup(); 278766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper tst_exit(); 2792c28215423293e443469a07ae7011135d058b671Garrett Cooper} 28073e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 28126aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic void setup(void) 28256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{ 2832c28215423293e443469a07ae7011135d058b671Garrett Cooper 28456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_sig(NOFORK, DEF_HANDLER, cleanup); 28556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_PAUSE; 28756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 28856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_tmpdir(); 28956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 29056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((fd_notify = myinotify_init()) < 0) { 29156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (errno == ENOSYS) { 292766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper tst_brkm(TCONF, cleanup, 29356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "inotify is not configured in this kernel."); 29456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } else { 295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 296766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "inotify_init () failed"); 29756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 29856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 29956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 30056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((wd = myinotify_add_watch(fd_notify, ".", IN_ALL_EVENTS)) < 0) { 301354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, cleanup, 302766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "inotify_add_watch (%d, \".\", IN_ALL_EVENTS) failed", 303766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper fd_notify); 30404f2177b65a3c10df5964180d1caf807ec531b72Cyril Hrubis reap_wd = 1; 30556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak }; 30656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 3072c28215423293e443469a07ae7011135d058b671Garrett Cooper} 30873e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 30926aa0a85a2baf17f667c56cfce123ceff73f5c2cCyril Hrubisstatic void cleanup(void) 31056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{ 31104f2177b65a3c10df5964180d1caf807ec531b72Cyril Hrubis if (reap_wd && myinotify_rm_watch(fd_notify, wd) < 0) { 31256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TWARN, 313766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper "inotify_rm_watch (%d, %d) failed,", fd_notify, wd); 31473e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 31556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 31673e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 31704f2177b65a3c10df5964180d1caf807ec531b72Cyril Hrubis if (fd_notify > 0 && close(fd_notify)) 318766f33c3efdafb3efb575c99b0678d49ae0b6892Garrett Cooper tst_resm(TWARN, "close(%d) failed", fd_notify); 31973e6ce7a0bad2cc9d3ac3feebcb375a8c95a62casubrata_modak 32056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_rmdir(); 3212c28215423293e443469a07ae7011135d058b671Garrett Cooper} 322c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 323c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak#else 324c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 325fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "inotify02"; 326fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 0; 327c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 328ddc4c0d66d3947d5e5382e17d68598a85f8cb77cGarrett Cooperint main(void) 329c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak{ 33053740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TCONF, NULL, "system doesn't have required inotify support"); 331c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak} 332c59422e1ea1719602dc0fcf7d73922a4d3e24832subrata_modak 333f4539c6840b09c0428fd9b30c02ac0e747a4f9efMarkos Chandras#endif 334