Portál AbcLinuxu, 8. května 2025 02:20

Dotaz: inotify nezachycuje IN_MOVED_TO event pri prejmenovani

tomes.io avatar 4.1.2014 15:25 tomes.io | skóre: 12 | blog: tomesh
inotify nezachycuje IN_MOVED_TO event pri prejmenovani
Přečteno: 228×
Odpovědět | Admin
Ahoj,

potrebuji pomoci inotify ziskat jmeno souboru/adresare, ktery byl prejmenovan. Dle manualu se v takove situaci vygeneruji dva eventy, IN_MOVED_FROM a IN_MOVED_TO se stejnym cookie. Muj program nize ale zachyti jen IN_MOVED_FROM. MOVED_TO se vubec nevygeneruje a me by zajimalo, jestli mam nekde chybu, nebo uz tohle inotify nedela?

Pri rename treba souboru, se po sobe vygeneruje jenom IN_MOVED_FROM a OPEN. Nevim proc ne MOVED_TO...


#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main(int argc, char **argv)
{
	int length, i = 0;
	int fd;
	int wd;
	char buffer[BUF_LEN];

	fd = inotify_init();

	if (fd < 0) {
		perror("inotify_init");
	}

	wd = inotify_add_watch(fd, "/home/tomesh/Dropbox/C/sync", IN_ALL_EVENTS);


	if (length < 0) {
		perror("read");
	}

	while (1) {
		length = read(fd, buffer, BUF_LEN);
		struct inotify_event *event = (struct inotify_event *) &buffer[ i ];
		if (event->len) {

			if (event->mask & IN_CREATE) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s was created.\n", event->name);
				} else {
					printf("The file %s was created.\n", event->name);
				}
			}

			if (event->mask & IN_DELETE) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s was deleted.\n", event->name);
				} else {
					printf("The file %s was deleted.\n", event->name);
				}
			}
			if (event->mask & IN_MODIFY) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s was modified.\n", event->name);
				} else {
					printf("The file %s was modified.\n", event->name);
				}
			}

			if (event->mask & IN_MOVED_FROM) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was moved from.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was moved from.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_MOVED_TO) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was moved to.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was moved to.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_MOVE_SELF) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %ds was itself moved.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was itself moved.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_DELETE_SELF) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was itself deleted.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was itself deleted.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_OPEN) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was opened.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was opened.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_ATTRIB) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d attr was changed.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d attr was changed.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_ACCESS) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was accessed.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was accessed.\n", event->name, event->cookie);
				}
			}


		}
	}
	(void) inotify_rm_watch(fd, wd[0]);
	(void) close(fd);

	exit(0);
}


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.1.2014 16:35 chrono
Rozbalit Rozbalit vše Re: inotify nezachycuje IN_MOVED_TO event pri prejmenovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
Skontroloval by som, či funkcia read nevrátila viac udalostí v jednom volaní.

PS: Ten kód vyzerá tak, že takú kontrolu tam kedysi pravdepodobne mal (tipujem to podľa tej nevyužitej premennej i).
4.1.2014 17:25 Bill Gates
Rozbalit Rozbalit vše Re: inotify nezachycuje IN_MOVED_TO event pri prejmenovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
i += EVENT_SIZE + event->len;
tomes.io avatar 4.1.2014 17:55 tomes.io | skóre: 12 | blog: tomesh
Rozbalit Rozbalit vše Re: inotify nezachycuje IN_MOVED_TO event pri prejmenovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
Diky vsem, uz to funguje jak ma:

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main(int argc, char **argv)
{
	int length, i;
	int fd;
	int wd;
	char buffer[BUF_LEN];
	struct inotify_event *event;

	fd = inotify_init();

	if (fd < 0)
		perror("inotify_init");

	wd = inotify_add_watch(fd, "/home/tomesh/Dropbox/C/sync", IN_ALL_EVENTS);

	while (1) {
		i = 0;
		length = read(fd, buffer, BUF_LEN);

		if (length < 0)
			perror("read");

		if (length == 0)
			sleep(1);
		
		while (i < length) {
			
			event = (struct inotify_event *) &buffer[i];
			
			if (event->mask & IN_CREATE) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s was created.\n", event->name);
				} else {
					printf("The file %s was created.\n", event->name);
				}
			}

			if (event->mask & IN_DELETE) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s was deleted.\n", event->name);
				} else {
					printf("The file %s was deleted.\n", event->name);
				}
			}

			if (event->mask & IN_MODIFY) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s was modified.\n", event->name);
				} else {
					printf("The file %s was modified.\n", event->name);
				}
			}

			if (event->mask & IN_MOVED_FROM) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was moved from.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was moved from.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_MOVED_TO) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was moved to.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was moved to.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_MOVE_SELF) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %ds was itself moved.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was itself moved.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_DELETE_SELF) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was itself deleted.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was itself deleted.\n", event->name, event->cookie);
				}
			}
			
			if (event->mask & IN_ATTRIB) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d attr was changed.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d attr was changed.\n", event->name, event->cookie);
				}
			}

			if (event->mask & IN_ACCESS) {
				if (event->mask & IN_ISDIR) {
					printf("The directory %s with cookie %d was accessed.\n", event->name, event->cookie);
				} else {
					printf("The file %s with cookie %d was accessed.\n", event->name, event->cookie);
				}
			}

			i += sizeof(struct inotify_event) +event->len;
		}
	}
	(void) inotify_rm_watch(fd, wd);
	(void) close(fd);

	exit(0);
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.