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