From 8487c658e408b5fa6c94e7accea5948bc6b9f3fc Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 10 Apr 2012 17:00:21 +0200 Subject: [PATCH] Linux file watcher: do not dive into flat roots --- bin/linux/fsnotifier | Bin 22566 -> 22566 bytes bin/linux/fsnotifier64 | Bin 24816 -> 24816 bytes native/fsNotifier/linux/fsnotifier.h | 6 ++-- native/fsNotifier/linux/inotify.c | 52 ++++++++++++++++----------- native/fsNotifier/linux/main.c | 24 +++++-------- 5 files changed, 44 insertions(+), 38 deletions(-) diff --git a/bin/linux/fsnotifier b/bin/linux/fsnotifier index e248974f4a941feb95fe52f71338c24739812fb7..f7a73126a13e38a3b51fd93601b8594961195074 100755 GIT binary patch delta 4536 zcmai2dsI|)9=~_Ez*PrkcnBT_Pgz228uSpQZB2Thuu#WzrETkUY{`<^JE7Zn}jkgV$jA?vzlwmdSSVwNCO?33gQCW_BSuR3-(%iWQi;M%%d4&4;rezA6F zsOvTH6-n&tS{70viQQfMCME=htZtX&2mI{gup_k};HYL^4g{2*s)zx}-uXJeSrW~!g1%m(!zsa;qSJ#q*m~3T zhPYQ*yQ$nV3^gM%`CASFm<<81dYYNd%kmb*2tu0~?x;s52tq@TsUb2*5LyWXcN>BM zK%k`=3`vs&p@lpLm$HSuXiha;p2!ZF7mAzNgovct7HDlfaZHlkl3gvfApU;k-2P1+ zl58sKcNf~Z2af}U!cg*Hmq8F5$CY!YhAD_!PpKOWj^pZG7kIuJ!p101gQDKd@m-=x zIRh2Y6iu3pc-AUCZe?j85U5&Dp*CxV;J={G=Z1WTaQ1i$z~WH~@l+bTm3WyN_7c%~9-aY!C+hN29HU8TplmBOy&ao-;M z|KsjNOcb{>7g`akA2GQHlz=l`&%sL+>0Rfwj`=!rZd-H4{Kx8b;{fr8KJdE17U zcRK~){*3L3EL&5e3Av-Lf_(^jJp%dp3D7@RVBNUHd;xiNGqN-C2vSMSr*4R(000SQ zKpRPLz&($59mn|CJyEgCmteHi8uGi^E>Uh;No-W@fG#zi6dIx8D2>A$s8IKr^rj+j zilR_Co9AUPwtX!QCcGX9k4a6?T~l2*oZkvWabsP6&Gz4gxcg zJebQ~iq5KSA!0jVw^Qrd7-;a-0r83fGv?$PY^1ee9Mg2Nw(1q>8prj-aql>e0^+!7 zZF|9(mSWO+KY3#;M(k zou}SNEe6JIU{rcAehoX(i|$dk(XKwhcE(z!W}sbQklfr$KF7i!R;L3om|p|D3*Hg& z&+NJa~|BMeHlr^TB=f7oKct6Mj4mi!zh zrTyd=fd~?!f_jv&1HZ=Zr~ICChGT6^q(y5|KGic^j+lJgbU@G6P=}NztHC6L<^8fw zv=Qfn0CblXwm)uKTsg`G+qkF%HHAE^;Qe07F2*HX9~Y)YHHxlS=qWu#k)AaQLSBE( z<1`pLsugT#Exnx_tT=wIxQIO&pB~Xgfqn$Fo>D&v-^1RCPr6GY{$AbE6k^$?S?29{ zP|F5i6ccF)&$BO7Be>P-cj4+F3EVTLGX&anM-H=D2^s0bqk%wMAFd{)XG50yq28hLr{$9|)<>pAS)3o9offhNsSr(IKG)07y&DiaThoM2xi zSYn%bvZ_+XQ-pmiJkcIr4DmLbK8{ydL1Od_p_7~DQND(q)XK?dE-NB!vx8UZ=@hGG zkp5;?ml!9WVb3K#Sn=CC>Q0%_Y@Q-{i|o2kZQ9=JtrY1{ngt9pRgq?)`+#hX^bx4^mwysIYZKiBwe z`tm6vItO*!V!C0U(QxllBFW}tHZNtm_)qpgO7;T^s$hBxW#rYQDtNtQ)qP0ag5j(` zf7P@#2jRK<4Tx7SAL}(Dm{8KOq6&+&_}TK*nI?-$@mBSEN+fK8J6UsTni$Xar&_08pu7JV zxyaXLKNxAQ$)#*0fn6lGSFHv8sYu5801bsC8|>aQkMh4u$$AvBTl9IdG^ zdc6KGp=_z9taDtBBUyLa9LVBKEQNDO)Etf2|wzu$wcpts4Qt<=OBnC!nr?F?g8)3y#5H8QZxj zb8gh73@p)8NuG!84sUlHvZZchLz&NolmV~ivnQtBBIa}*np!R5l|Ma8!t3Gej|>=` zyjl5TT-SzKYmCg8pDFI>%FPc*;ukEp&>Fl0Kg@TqI}6i-dvNMubvS7s=j}K(qSTFD zgM}l89AZScLXd#pnfN1idI!;`2mVNi-a$eHy@bZD(~I&&LuMD7xgtEDLbl5Z^& zTiCi=cScaksgWZPxF1{g7)vg*8qB-c{Ib+AClF*W6NWn3x-!auw=6rtzgv>=4;N0` i1e${#Da(%O8RyXG5&JSQQ@>#A3$t&smq`kv? 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 RD@&-8O_9AFJL)#Z{0Gno4B-F( diff --git a/bin/linux/fsnotifier64 b/bin/linux/fsnotifier64 index efba253b08b3a52e22e1bc09f1d93e5bd1f6fca5..1fc4f32ff7effedcfc451430f228bdf99e76d15f 100755 GIT binary patch delta 5194 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 delta 5151 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 CLt9w@ diff --git a/native/fsNotifier/linux/fsnotifier.h b/native/fsNotifier/linux/fsnotifier.h index 0ee04cd12639..f3234e2fde9d 100644 --- a/native/fsNotifier/linux/fsnotifier.h +++ b/native/fsNotifier/linux/fsnotifier.h @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,8 @@ // logging void userlog(int priority, const char* format, ...); +#define CHECK_NULL(p, r) if (p == NULL) { userlog(LOG_ERR, "out of memory"); return r; } + // variable-length array typedef struct __array array; @@ -38,7 +40,7 @@ void array_delete(array* a); void array_delete_vs_data(array* a); -// key/value pairs table +// poor man's hash table typedef struct __table table; table* table_create(int capacity); diff --git a/native/fsNotifier/linux/inotify.c b/native/fsNotifier/linux/inotify.c index ab605424d66c..04d749e48d83 100644 --- a/native/fsNotifier/linux/inotify.c +++ b/native/fsNotifier/linux/inotify.c @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,8 +32,6 @@ #define DEFAULT_SUBDIR_COUNT 5 -#define CHECK_NULL(p) if (p == NULL) { userlog(LOG_ERR, "out of memory"); return ERR_ABORT; } - typedef struct __watch_node { char* name; int wd; @@ -153,9 +151,9 @@ static int add_watch(const char* path, watch_node* parent) { node = malloc(sizeof(watch_node)); - CHECK_NULL(node); + CHECK_NULL(node, ERR_ABORT); node->name = strdup(path); - CHECK_NULL(node->name); + CHECK_NULL(node->name, ERR_ABORT); node->wd = wd; node->parent = parent; node->kids = NULL; @@ -163,9 +161,9 @@ static int add_watch(const char* path, watch_node* parent) { if (parent != NULL) { if (parent->kids == NULL) { parent->kids = array_create(DEFAULT_SUBDIR_COUNT); - CHECK_NULL(parent->kids); + CHECK_NULL(parent->kids, ERR_ABORT); } - CHECK_NULL(array_push(parent->kids, node)); + CHECK_NULL(array_push(parent->kids, node), ERR_ABORT); } if (table_put(watches, wd, node) == NULL) { @@ -238,25 +236,31 @@ static bool is_ignored(const char* path, array* ignores) { return false; } -static int walk_tree(const char* path, watch_node* parent, array* ignores) { +static int walk_tree(const char* path, watch_node* parent, array* ignores, bool recursive) { if (is_ignored(path, ignores)) { return ERR_IGNORE; } - DIR* dir = opendir(path); - if (dir == NULL) { - if (errno == EACCES) { - return ERR_IGNORE; + DIR* dir; + if (recursive) { + dir = opendir(path); + if (dir == NULL) { + if (errno == EACCES) { + return ERR_IGNORE; + } + else if (errno == ENOTDIR) { // "future" root + return add_watch(path, parent); + } + userlog(LOG_ERR, "opendir(%s): %s", path, strerror(errno)); + return ERR_CONTINUE; } - else if (errno == ENOTDIR) { // flat root - return add_watch(path, parent); - } - userlog(LOG_ERR, "opendir(%s): %s", path, strerror(errno)); - return ERR_CONTINUE; } int id = add_watch(path, parent); - if (id < 0) { + if (!recursive) { + return id; + } + else if (id < 0) { closedir(dir); return id; } @@ -279,7 +283,7 @@ static int walk_tree(const char* path, watch_node* parent, array* ignores) { continue; } - int subdir_id = walk_tree(subdir, table_get(watches, id), ignores); + int subdir_id = walk_tree(subdir, table_get(watches, id), ignores, recursive); if (subdir_id < 0 && subdir_id != ERR_IGNORE) { rm_watch(id, true); id = subdir_id; @@ -293,9 +297,15 @@ static int walk_tree(const char* path, watch_node* parent, array* ignores) { int watch(const char* root, array* ignores) { + 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); + return walk_tree((normalized != NULL ? normalized : root), NULL, ignores, recursive); } @@ -323,7 +333,7 @@ static bool process_inotify_event(struct inotify_event* event) { } if ((event->mask & IN_CREATE || event->mask & IN_MOVED_TO) && event->mask & IN_ISDIR) { - int result = walk_tree(path, node, NULL); + int result = walk_tree(path, node, NULL, true); if (result < 0 && result != ERR_IGNORE) { return false; } diff --git a/native/fsNotifier/linux/main.c b/native/fsNotifier/linux/main.c index 3bef18521151..81dcdfead702 100644 --- a/native/fsNotifier/linux/main.c +++ b/native/fsNotifier/linux/main.c @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,7 @@ #define LOG_ENV_ERROR "error" #define LOG_ENV_OFF "off" -#define VERSION "1.0" +#define VERSION "1.1" #define VERSION_MSG "fsnotifier " VERSION "\n" #define USAGE_MSG \ @@ -58,11 +58,8 @@ typedef struct { static array* roots = NULL; static bool show_warning = true; - static bool self_test = false; -#define CHECK_NULL(p) if (p == NULL) { userlog(LOG_ERR, "out of memory"); return false; } - static void init_log(); static void run_self_test(); static void main_loop(); @@ -223,7 +220,7 @@ static bool read_input() { if (strcmp(line, "ROOTS") == 0) { array* new_roots = array_create(20); - CHECK_NULL(new_roots); + CHECK_NULL(new_roots, false); while (1) { line = read_line(stdin); @@ -235,12 +232,9 @@ static bool read_input() { break; } else { - if (line[0] == '|') line++; // flat roots will be differentiated later - int l = strlen(line); if (l > 1 && line[l-1] == '/') line[l-1] = '\0'; - - CHECK_NULL(array_push(new_roots, strdup(line))); + CHECK_NULL(array_push(new_roots, strdup(line)), false); } } @@ -266,7 +260,7 @@ static bool update_roots(array* new_roots) { } array* unwatchable = array_create(20); - CHECK_NULL(unwatchable); + CHECK_NULL(unwatchable, false); if (!unwatchable_mounts(unwatchable)) { return false; } @@ -312,10 +306,10 @@ static bool register_roots(array* new_roots, array* unwatchable) { } else if (id >= 0) { watch_root* root = malloc(sizeof(watch_root)); - CHECK_NULL(root); + CHECK_NULL(root, false); root->id = id; root->name = new_root; - CHECK_NULL(array_push(roots, root)); + CHECK_NULL(array_push(roots, root), false); } else { if (show_warning && watch_limit_reached()) { @@ -324,7 +318,7 @@ static bool register_roots(array* new_roots, array* unwatchable) { output("MESSAGE\n" INOTIFY_LIMIT_MSG, limit); show_warning = false; // warn only once } - CHECK_NULL(array_push(unwatchable, new_root)); + CHECK_NULL(array_push(unwatchable, new_root), false); } } @@ -362,7 +356,7 @@ static bool unwatchable_mounts(array* mounts) { } if (!is_watchable(dev, point, fs)) { - CHECK_NULL(array_push(mounts, strdup(point))); + CHECK_NULL(array_push(mounts, strdup(point)), false); } }