1#ifndef CHDIR_NOTIFY_H 2#define CHDIR_NOTIFY_H 3 4/* 5 * An API to let code "subscribe" to changes to the current working directory. 6 * The general idea is that some code asks to be notified when the working 7 * directory changes, and other code that calls chdir uses a special wrapper 8 * that notifies everyone. 9 */ 10 11/* 12 * Callers who need to know about changes can do: 13 * 14 * void foo(const char *old_path, const char *new_path, void *data) 15 * { 16 * warning("switched from %s to %s!", old_path, new_path); 17 * } 18 * ... 19 * chdir_notify_register("description", foo, data); 20 * 21 * In practice most callers will want to move a relative path to the new root; 22 * they can use the reparent_relative_path() helper for that. If that's all 23 * you're doing, you can also use the convenience function: 24 * 25 * chdir_notify_reparent("description", &my_path); 26 * 27 * Whenever a chdir event occurs, that will update my_path (if it's relative) 28 * to adjust for the new cwd by freeing any existing string and allocating a 29 * new one. 30 * 31 * Registered functions are called in the order in which they were added. Note 32 * that there's currently no way to remove a function, so make sure that the 33 * data parameter remains valid for the rest of the program. 34 * 35 * The "name" argument is used only for printing trace output from 36 * $GIT_TRACE_SETUP. It may be NULL, but if non-NULL should point to 37 * storage which lasts as long as the registration is active. 38 */ 39typedefvoid(*chdir_notify_callback)(const char*name, 40const char*old_cwd, 41const char*new_cwd, 42void*data); 43voidchdir_notify_register(const char*name, chdir_notify_callback cb,void*data); 44voidchdir_notify_reparent(const char*name,char**path); 45 46/* 47 * 48 * Callers that want to chdir: 49 * 50 * chdir_notify(new_path); 51 * 52 * to switch to the new path and notify any callbacks. 53 * 54 * Note that you don't need to chdir_notify() if you're just temporarily moving 55 * to a directory and back, as long as you don't call any subscribed code in 56 * between (but it should be safe to do so if you're unsure). 57 */ 58intchdir_notify(const char*new_cwd); 59 60/* 61 * Reparent a relative path from old_root to new_root. For example: 62 * 63 * reparent_relative_path("/a", "/a/b", "b/rel"); 64 * 65 * would return the (newly allocated) string "rel". Note that we may return an 66 * absolute path in some cases (e.g., if the resulting path is not inside 67 * new_cwd). 68 */ 69char*reparent_relative_path(const char*old_cwd, 70const char*new_cwd, 71const char*path); 72 73#endif/* CHDIR_NOTIFY_H */