I want to control USB keys on my system. I know that they are always mounted in / media, so I use inotify to monitor / multimedia. Some USB keys create a folder (for example, sda) when connected, which remains until they are disconnected, some create a folder (for example, sda), delete it immediately and create a new one (for example, sda1). This is due to sections on the key.
However, inotify sometimes only captures events to create and delete the first folder, but skips creating the second. When I manually check / media, a second folder exists, but it was not notified inotify.
This happens very rarely, and when this happens, it always happens when you first connect the device after a reboot.
#include <sys/inotify.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> /* size of the event structure, not counting name */ #define EVENT_SIZE (sizeof (struct inotify_event)) /* reasonable guess as to size of 32 events */ #define BUF_LEN (32 * (EVENT_SIZE + 16)) int main(int argc, char **argv) { int fd,wd,len,i; char buf[BUF_LEN]; struct inotify_event *event; fd_set watch_set; fd = inotify_init(); if (fd < 0) { perror("init failed"); exit(EXIT_FAILURE); } wd = inotify_add_watch(fd,"/media",IN_ALL_EVENTS); if (wd < 0) { perror("add watch failed"); exit(EXIT_FAILURE); } /* put the file descriptor to the watch list for select() */ FD_ZERO(&watch_set); FD_SET(fd,&watch_set); while(1) { select(fd+1,&watch_set,NULL,NULL,NULL); len = read(fd,buf,BUF_LEN); i=0; while(i < len) { event = (struct inotify_event *) &buf[i]; if ((event->mask & IN_CREATE) != 0) { printf ("%s created\n",event->name); } else if ((event->mask & IN_DELETE) != 0) { printf ("%s deleted\n",event->name); } else { printf ("wd=%d mask=0x%X cookie=%u len=%u name=%s\n", event->wd, event->mask, event->cookie, event->len, event->name); } i += EVENT_SIZE + event->len; } } }
Any ideas what is going wrong?