From 91e3a7968dd7168343ac182f3f8a3d42f68ccf44 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 17 Jul 2012 17:49:47 +0200 Subject: [PATCH] Linux file watcher: IDEA-87821; don't follow symlinks; cleanup --- bin/linux/fsnotifier | Bin 22510 -> 22484 bytes bin/linux/fsnotifier64 | Bin 24728 -> 24694 bytes native/fsNotifier/linux/fsnotifier.h | 2 +- native/fsNotifier/linux/inotify.c | 105 +++++++++++++-------------- native/fsNotifier/linux/main.c | 44 ++++++++--- 5 files changed, 82 insertions(+), 69 deletions(-) diff --git a/bin/linux/fsnotifier b/bin/linux/fsnotifier index 715b78f2d45fadecb37bb98741bfb23b28b2498e..6075b42a38a8cef81fd4ecf307a0b55701e3bc52 100755 GIT binary patch delta 7760 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 GasLnI*pc7> delta 7607 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 delta 7728 zcmZu$3tUvyx?dX{1YaYd&VVSRsHh+?M?_H3nFO2Z3_|9EQ(1T{(q59yDBje;1Cwla zoUmnOx0jvn`DNW67S=T%42pqPx3Es7nTf~O=1_{3p!wMM|E;};WB%^?{aD{x-)nu} zx4!kQHJh$RY11C5uC>qIQF%W=wD}SIeHw{6C|+@7joo`s6iD3pD!7 z!L|&{%CBl#`wP7obIHdVUL<;Hh~DrA%!-M=%Ao(9=(7af94H5}+0>F|V^Z*q4E|Hh za7%a^=>0+883`i;jow>5a(BZJJ|cFoWf!e>9NKo8blOm&Me%~zKZNbe;Ok;%nh!vI zhpFK(Kt`kb7XLbS;=Ead$u!d&6KsT2`!H73Xs-Gt3|Pgq0a#Z6^Anf{w_346L_fxA zOl2T|FYvhF%XMR_CSYy32}*wH%kLUA)9>6(k#v83$|JvH(=@GM@gia|10am-yx?(3;oXN-j`ZgK^V?AV>= zU@mk1*ZCPIgT2AhP!9wwSPZlLU@%ujLn%dm9|-EtziAp+$)U@n5cmUx{|0#HHVOE^ zao~f4(5aoVFkWsc2xz_~q(7YWf2r&51^w+G0pSU}eN?xw88fVWrmoXHzPt9()r_*ppPHs^nHvoq`90_fg}9{HR) z_p$~>P2hohUK>yiN6Ce&z?1!6gbQn_4`X@Q;ZfePSqPinvc=BoeU8;98Z zo+#Y`WjAez{VV%{e0!t%tFBG><8H~WH4ZrCLJ%cQ$;ZIqtNn3$|K1lS2V6c@`yn|)7 zla(D`l$sOs_!pLqo_Ls8W7;^*#->TW$DNg0gf|g=FK^6FI%^n)`(k%SVc5}cr;$=_q0f!+LF>riVfRJm&BHG1SO^?6zv2a2f^y7+NxMs7OzVU;e> z076Eip0;_Ud4!{@Im|mQn4@z+=ZiP66!O_|)~R>)&>p^lb{~mB6On4K zD2Dh?Rj2(*X?RS{B&g(0f}FaAe-oeTcga_PxHble&H>0liqA3i6o&d<9fQI=`GUL$ zX1t1uq27tSBbL2jL2?WVvUFkNGsr#Q+rL8=5dCkUS6-5Q`Iy+d)Wwtua!W%xxYaJ0 z0on1vfqq?hK7{r4M(T)3Sc^E1{QcaW>HnvmIDy^d`Tn?!nIFU?E`-Lp^-b>gu zgr#DwT6L_Ou$4W$VLEmq>~5$AR*e>JdPfrC6+$o_5lx8K331LZWPAy9h&aY55L9={ zVW24F=Wzh2KD3DNQ4#e%py%K`$m^Ne7tWE!dr0G7v4mURXV>(pUrd`r(=tp^jtT-N zy#opYUEU~uEupX9h}9yydxMW@Vvr71XYjoE0-x7nt+A?MFHysRA&jHBn8S1${Y9YceoK35pb2VBQ(^=y|f8 z>_NFxmtlq^`wV`X19S8`t6O|p{Th2tRk^G3$~CjUYCH@J94Q|iM0rDfgX@Mb-ZHs3 z(j#Z%h#XF`!T9Emq8ih;7*+{iebZp?N+?4)vSWC+&>N)GX(&ubwV_h;0E$*{3C*a$ zEyZp%o1TFRN!WT_^{?+Mf@cnVis1L8?w1Hi`wSdpw|p#Uhd6{MK$twuheV)pZK3^$ zxPfoj68Q{b(giY=b%%&)7X*K$+d#y51~hr(3&6Fa-cdv|&!}A}dpS+3_XZR7b(+CW z>s*H-3OOmHtY`pqekA2pck)e%iT-&Av20p4(gtHzC9BQn#LY7U@yj@(pFb0>4gKzM zW3~2k2#lV-LqHIBlAWsVf8$Z7AMU?FrT$v*C96JN;aT8xbqB$>gP2`Zko@XJ+z}nO zP?9M~3c9SUI^&5DBl$^8gHe3!T{}d1_ji)nQ81e%AEQMEUl{=>zFIp~57KB@2g&Ck zspPhSq)vtBcz6APalJ$fjSYtT;Z5j?@vvYmCDsj4*kW3MA>xZjR3CCx?u)!@VbhIo zC6}E00yvsNZzshxo~Fq2Dn?B)J@~tMjcNJs=JQO=H(w$cXax3<)BMqwK-s&H2P&O$*SdYA;x6Ys&U;~| zIBT>3>37a^&ZRZBfI+U!h8DN{olE{OEO)_v<*+$xU3S#`_L;>_;TbEE>B=#l^Fk=wBs{c(dk z8z`df-{H6_f$VdBO{;43^@FTSA$zorX=KPYC~?W4>kca~6UjGEO$A=b)^${B{moT% z&{L@m^2L${9GfRl+;IW6mjkb^g^-?0JCF=8L!_L#9=D9M0q0a}zugZ$L)58@=A+hB zrvdG%ec3_l%f~$OY4yZUVyLFTf{N8vE!{iBRlA!QR4Y)WEmbC(q(dyAi?tv`>Qxe} z)oE~u-1yyl+wW3#lb7lsJ@n!Q{XX{7Q@faa5|1`@C04){_BA0sg)3^Qj@S!nQb`8R z#7Z?YW2zdxk<)s4GpF_O{g-$kdgQaN+GkzxR^2S5d`~HX5==j4op`d3*q_TBjOou< z)W}bU+wfTEQa{9=V}nsHQPDp}IGFkY3YpwgdF8tK>02S6hnrL2={KGeZ!E);hhRva z+=+ywe7nnew{zi*NhxGHqKs3*8%A5BrejU)U3w%xHhSp1^>DC2?nJ(9$8G9VRzxbf z?+(MEd_kDMYC?fBCSQ3pQoZ~yQLB~%ttZu2uTkJv3Ga7t5? zJFv?ye-6A;U%B+n3dx&6%R`$ZaKKBeAmi*`>1pvCE}D!Zm6tU0Q}y8Jk;2P(;b%sfQ2M3eJ&fnB2ivi>owtomh$Mny ziXX~*jY~?rct-5`qu7ej{WKFH(C?@6PCjeg2>(0rHrykc*QD;mEw1F|V;;~}g)MAa z*uGSS-=PBCQy)cjWHyR_w_Coh~~<6-;Vw~UR^g!N8+L|RNTKikz z3nE@j9gmfa%RW}u>Zex^*bjoe!%yeLf`wgjIN5SEPhO1I*b@U?EiNDwEBsSlvTUGJ6!*83(E_9ntX!ApqOmsSxkJe}3mVFK+NrmwvaCg=9JR3r>W z)j~aLLp`D$rg|i<$U41=9GHKHd_{jaF65iX4T*W~G(|K5>(SNJt&Tax_m6v2I?X4K z-)sKm1bK5ze-N~v;*lwnZ0`Z*RAxoGv?kn!C#hPz1QcX(AunvN;|o)gq}6;~O5E5F zPKJWv>qnRRE#R{^cEsIQJLn>OB**bvtKUh!H)Xx~^?%;D*0a1g)i!1y2^^tV(5EQ% zl$gTOoSmJ{MJ!02%1-cCQVSy=k475Tj((V5Oih&(K61i?(ji_uAww$U4HJqbJGZ3S z&}XL|96YD6aPA#!na^umR%(0X{zsNAU&WGmQTk)`rVK@@ud$z(z`1(jNRhX@iS>?_*D9gHxeFfI;?5g7?&T_v=YE-I8hC_9hPnd+=K|U0=iCV zS|{KZz=7DuNF3^H+D}xVV!&d+GQcH()qv%In*pl=8{B+t1xE-(+a6h05n2iTPBuYgwpbfAZFdJ|SU=iRUz%syWykF`7 zHvw)XJm7x7O9>dXVK5diNQM;N0%!xw#>3df&u1lv6(8d9lgC61{6W+DnE0cU<9W&C zNa+$^Iyu?I5TEaO|0x#JHbk$Hzdt!~bP-~;fYQM^VBnKsGy6x}QVByD8->4L@mEK5 zesOY=w4cXiC&sBbhPbhN8a)Z;BDQV(_G}9_{r2owQx)c|d|kF>%zkj+NxUKLo=VeS zdp#Xa+IN8~5*4i`j5lPDj4wlwQ3QJ$v0Meqk`De`_LzvRxa?EI;Lz{_54K`Eb|9H} zLy8SKl6n~Q{h(ilbPs)YWyDirX`L|vU?cc8^QAdMhi${C4G(?%F6e2*@j38^_-i>s zXa9uJSloTK9y(*>dM^Yk1Nfwy@Cm@XfFE`Po-}3xUv!@LnGzo{7sHbCeEgL7C@+Sa z!Ck^1$+2Y72eLNI=(!VWwAS0eMnF9@9{F|=LaJEp{&di7$gf*+oe zWJ<+It(T@IhjZK1?YzR-i>FTaNagjbra#|1?9xykGb=5se1b!$E$8l8lVj?PS=|JI zWTn0NGqcj7L*LOu-`5lP!CC3i)+}Arnx!-6)kohN4C}ucA9biv2=e(+cS=-iu|Tl> z_0hMjl%#V0+8+mpn^_&8B`%~}XVLp`7R{{n2mjbDg%wZXpBAJ^4t}{HJ&wLsQ~OTz zj2#9HWBsAYIs4v4^lhHnkF@`2CP0aq8GVzdhR-9S^)>MH1(8~s=ozE$%EV6}C#i+9 z(gHlK;^0!DC2DiLPF=u96ebNOd{MHF5qSqWH+L3V;^qi#ag3f=dIJLOZvI%I#r=Rm zRSl|6V{9b`q_ZN)A-Ml+5Go9On@z{pATO!a@Pkr8wGVRE1F)SQ;q%rQSCnns)eaDeowssd<^WQf0a-(%wb`CPmx6$BKonS z&!s-@4loG*6rI0>gwRR^&sx!Q!MO#T(eS12CSP{(b+=oj7UHoVF|^r?$cu^qZS4lW z!sa05Oq3wNb3(I(LqeK2-K2RCkDgWy<6GC&h==<^wcUYw1)W>C_7DR`|GRIB3>=Zl;M88z@)q?*;@RPq~H?8}g;A!Hw z&$Yz08a$oGo~9T!92FYQ8`KJmZsBMnVwZ_(>Wj2`!7_^RNk7yW+G9~Jx;LpoD+ zepz3NnYewvMT(<7E(^b;Xx$=X-6Vs@!57W9*z*l)MYOKLATmz~Z%9#rq&A;)x*syA zTa6qF-AOBe|NrvxF9v^Ej6-PY1G}lMCvA&fGN?s{wmCYHy=mZWhIh*ie7%9MGxjoc z2kkcStp+}H2epW3d@uU5{QU(MDU2USZx#In(L1TP&qu&TtZvGr`we{OD2K2iHB2|< z2_d_I`jPJlp1!PXfX<_HFjjBKwvMlVt9XbsAZrqP+`Bw0OZ1cZ7k?TTwdlV4?p?Xa NyLd@`*PkjP{tt5!M!Nt2 diff --git a/native/fsNotifier/linux/fsnotifier.h b/native/fsNotifier/linux/fsnotifier.h index f3234e2fde9d..b8dd17b38831 100644 --- a/native/fsNotifier/linux/fsnotifier.h +++ b/native/fsNotifier/linux/fsnotifier.h @@ -61,7 +61,7 @@ void set_inotify_callback(void (* callback)(char*, int)); int get_inotify_fd(); int get_watch_count(); bool watch_limit_reached(); -int watch(const char* root, array* ignores); +int watch(const char* root); void unwatch(int id); bool process_inotify_input(); void close_inotify(); diff --git a/native/fsNotifier/linux/inotify.c b/native/fsNotifier/linux/inotify.c index 04d749e48d83..d71737fee507 100644 --- a/native/fsNotifier/linux/inotify.c +++ b/native/fsNotifier/linux/inotify.c @@ -117,8 +117,10 @@ inline bool watch_limit_reached() { } +#define EVENT_MASK IN_MODIFY | IN_ATTRIB | IN_CREATE | IN_DELETE | IN_MOVE | IN_DELETE_SELF + static int add_watch(const char* path, watch_node* parent) { - int wd = inotify_add_watch(inotify_fd, path, IN_MODIFY | IN_ATTRIB | IN_CREATE | IN_DELETE | IN_MOVE | IN_DELETE_SELF); + int wd = inotify_add_watch(inotify_fd, path, EVENT_MASK); if (wd < 0) { if (errno == ENOSPC) { limit_reached = true; @@ -132,7 +134,11 @@ static int add_watch(const char* path, watch_node* parent) { watch_node* node = table_get(watches, wd); if (node != NULL) { - if (node->wd != wd || strcmp(node->name, path) != 0) { + if (node->wd != wd) { + userlog(LOG_ERR, "table error: corruption at %d:%s / %d:%s)", wd, path, node->wd, node->name); + return ERR_ABORT; + } + else if (strcmp(node->name, path) != 0) { char buf1[PATH_MAX], buf2[PATH_MAX]; const char* normalized1 = realpath(node->name, buf1); const char* normalized2 = realpath(path, buf2); @@ -141,7 +147,7 @@ static int add_watch(const char* path, watch_node* parent) { return ERR_ABORT; } else { - userlog(LOG_WARNING, "intersection at %d: (new %s, existing %s, real %s)", wd, path, node->name, normalized1); + userlog(LOG_INFO, "intersection at %d: (new %s, existing %s, real %s)", wd, path, node->name, normalized1); return ERR_IGNORE; } } @@ -210,54 +216,24 @@ static void rm_watch(int wd, bool update_parent) { } -static bool is_directory(struct dirent* entry, const char* path) { - if (entry->d_type == DT_DIR) { - return true; - } - else if (entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK) { - struct stat st; - return (stat(path, &st) == 0 && S_ISDIR(st.st_mode)); - } - return false; -} - -static bool is_ignored(const char* path, array* ignores) { - if (ignores != NULL) { - int pl = strlen(path); - for (int i=0; i= il && strncmp(path, ignore, il) == 0) { - userlog(LOG_DEBUG, "path %s is under unwatchable %s - ignoring", path, ignore); - return true; - } - } - } - return false; -} - -static int walk_tree(const char* path, watch_node* parent, array* ignores, bool recursive) { - if (is_ignored(path, ignores)) { - return ERR_IGNORE; - } - +static int walk_tree(const char* path, watch_node* parent, bool recursive) { DIR* dir; if (recursive) { - dir = opendir(path); - if (dir == NULL) { - if (errno == EACCES) { + if ((dir = opendir(path)) == NULL) { + if (errno == EACCES || errno == ENOENT) { + userlog(LOG_DEBUG, "opendir(%s): %d", path, errno); return ERR_IGNORE; } - else if (errno == ENOTDIR) { // "future" root - return add_watch(path, parent); + else { + userlog(LOG_ERR, "opendir(%s): %s", path, strerror(errno)); + return ERR_CONTINUE; } - userlog(LOG_ERR, "opendir(%s): %s", path, strerror(errno)); - return ERR_CONTINUE; } } int id = add_watch(path, parent); - if (!recursive) { + + if (dir == NULL) { return id; } else if (id < 0) { @@ -265,7 +241,6 @@ static int walk_tree(const char* path, watch_node* parent, array* ignores, bool return id; } - struct dirent* entry; char subdir[PATH_MAX]; strcpy(subdir, path); if (subdir[strlen(subdir) - 1] != '/') { @@ -273,17 +248,16 @@ static int walk_tree(const char* path, watch_node* parent, array* ignores, bool } char* p = subdir + strlen(subdir); + struct dirent* entry; while ((entry = readdir(dir)) != NULL) { - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { + if (entry->d_type != DT_DIR || + strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } strcpy(p, entry->d_name); - if (!is_directory(entry, subdir)) { - continue; - } - int subdir_id = walk_tree(subdir, table_get(watches, id), ignores, recursive); + int subdir_id = walk_tree(subdir, table_get(watches, id), recursive); if (subdir_id < 0 && subdir_id != ERR_IGNORE) { rm_watch(id, true); id = subdir_id; @@ -296,16 +270,34 @@ static int walk_tree(const char* path, watch_node* parent, array* ignores, bool } -int watch(const char* root, array* ignores) { +int watch(const char* root) { bool recursive = true; if (root[0] == '|') { root++; recursive = false; } - char buf[PATH_MAX]; - const char* normalized = realpath(root, buf); - return walk_tree((normalized != NULL ? normalized : root), NULL, ignores, recursive); + struct stat st; + if (stat(root, &st) != 0) { + if (errno == EACCES) { + return ERR_IGNORE; + } + else if (errno == ENOENT) { + return ERR_CONTINUE; + } + userlog(LOG_ERR, "stat(%s): %s", root, strerror(errno)); + return ERR_ABORT; + } + + if (S_ISREG(st.st_mode)) { + recursive = false; + } + else if (!S_ISDIR(st.st_mode)) { + userlog(LOG_WARNING, "unexpected node type: %s, %d", root, st.st_mode); + return ERR_IGNORE; + } + + return walk_tree(root, NULL, recursive); } @@ -320,8 +312,9 @@ static bool process_inotify_event(struct inotify_event* event) { return true; } + bool is_dir = (event->mask & IN_ISDIR) == IN_ISDIR; userlog(LOG_DEBUG, "inotify: wd=%d mask=%d dir=%d name=%s", - event->wd, event->mask & (~IN_ISDIR), (event->mask & IN_ISDIR) != 0, node->name); + event->wd, event->mask & (~IN_ISDIR), is_dir, node->name); char path[PATH_MAX]; strcpy(path, node->name); @@ -332,14 +325,14 @@ static bool process_inotify_event(struct inotify_event* event) { strcat(path, event->name); } - if ((event->mask & IN_CREATE || event->mask & IN_MOVED_TO) && event->mask & IN_ISDIR) { - int result = walk_tree(path, node, NULL, true); + if (is_dir && ((event->mask & IN_CREATE) == IN_CREATE || (event->mask & IN_MOVED_TO) == IN_MOVED_TO)) { + int result = walk_tree(path, node, true); if (result < 0 && result != ERR_IGNORE) { return false; } } - if ((event->mask & IN_DELETE || event->mask & IN_MOVED_FROM) && event->mask & IN_ISDIR) { + if (is_dir && ((event->mask & IN_DELETE) == IN_DELETE || (event->mask & IN_MOVED_FROM) == IN_MOVED_FROM)) { for (int i=0; ikids); i++) { watch_node* kid = array_get(node->kids, i); if (kid != NULL && strcmp(kid->name, path) == 0) { diff --git a/native/fsNotifier/linux/main.c b/native/fsNotifier/linux/main.c index ce9d6c275ea7..180140b344f7 100644 --- a/native/fsNotifier/linux/main.c +++ b/native/fsNotifier/linux/main.c @@ -33,7 +33,7 @@ #define LOG_ENV_ERROR "error" #define LOG_ENV_OFF "off" -#define VERSION "1.1" +#define VERSION "1.2" #define VERSION_MSG "fsnotifier " VERSION "\n" #define USAGE_MSG \ @@ -215,6 +215,7 @@ static bool read_input() { userlog(LOG_DEBUG, "input: %s", (line ? line : "")); if (line == NULL || strcmp(line, "EXIT") == 0) { + userlog(LOG_INFO, "exiting: %s", line); return false; } @@ -241,6 +242,12 @@ static bool read_input() { return update_roots(new_roots); } + if (strcmp(line, "VERSION") == 0) { + output(VERSION "\n"); + return true; + } + + userlog(LOG_INFO, "unrecognised command: %s", line); return true; } @@ -302,15 +309,22 @@ static void unregister_roots() { static bool register_roots(array* new_roots, array* unwatchable, array* mounts) { for (int i=0; i= 0) { + if (id >= 0) { watch_root* root = malloc(sizeof(watch_root)); CHECK_NULL(root, false); root->id = id; root->name = new_root; CHECK_NULL(array_push(roots, root), false); } + else if (id == ERR_ABORT) { + return false; + } + else if (id == ERR_IGNORE) { + free(new_root); + } else { if (show_warning && watch_limit_reached()) { int limit = get_watch_count(); @@ -339,7 +356,10 @@ static bool register_roots(array* new_roots, array* unwatchable, array* mounts) output("MESSAGE\n" INOTIFY_LIMIT_MSG, limit); show_warning = false; // warn only once } - CHECK_NULL(array_push(unwatchable, new_root), false); + char* copy = strdup(unflattened); + CHECK_NULL(copy, false); + CHECK_NULL(array_push(unwatchable, copy), false); + free(new_root); } }