/* Called from the main thread to start watching FILE in PARENT_DIR, subject to FLAGS. If SUBDIRS is TRUE, watch the subdirectories of PARENT_DIR as well. Value is a pointer to 'struct notification' used by the thread that watches the changes. */ static struct notification * add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) { HANDLE hdir; struct notification *dirwatch = NULL; if (!file) return NULL; hdir = CreateFile (parent_dir, FILE_LIST_DIRECTORY, /* FILE_SHARE_DELETE doesn't preclude other processes from deleting files inside parent_dir. */ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); if (hdir == INVALID_HANDLE_VALUE) return NULL; if ((dirwatch = start_watching (file, hdir, subdirs, flags)) == NULL) CloseHandle (hdir); return dirwatch; }
/* Called from the main thread to start watching FILE in PARENT_DIR, subject to FLAGS. If SUBDIRS is TRUE, watch the subdirectories of PARENT_DIR as well. Value is a pointer to 'struct notification' used by the thread that watches the changes. */ static struct notification * add_watch (const char *parent_dir, const char *file, BOOL subdirs, DWORD flags) { HANDLE hdir; struct notification *dirwatch = NULL; if (!file) return NULL; if (w32_unicode_filenames) { wchar_t dir_w[MAX_PATH], file_w[MAX_PATH]; filename_to_utf16 (parent_dir, dir_w); if (*file) filename_to_utf16 (file, file_w); else file_w[0] = 0; hdir = CreateFileW (dir_w, FILE_LIST_DIRECTORY, /* FILE_SHARE_DELETE doesn't preclude other processes from deleting files inside parent_dir. */ FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); } else { char dir_a[MAX_PATH], file_a[MAX_PATH]; filename_to_ansi (parent_dir, dir_a); if (*file) filename_to_ansi (file, file_a); else file_a[0] = '\0'; hdir = CreateFileA (dir_a, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); } if (hdir == INVALID_HANDLE_VALUE) return NULL; if ((dirwatch = start_watching (file, hdir, subdirs, flags)) == NULL) { CloseHandle (hdir); dirwatch->dir = NULL; } return dirwatch; }
void TCP_RECEIVEOBJ::session_start(void) { if (watching) start_watching(); }