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