/* worker function for changing to a relative filename */ static int do_change_relative(DATAFILE *dat, int *param, int param2) { AL_CONST char *orig = get_datafile_property(dat, DAT_ORIG); char relative[FILENAME_LENGTH]; if (!orig[0] || is_relative_filename(orig)) { (*param)++; return D_O_K; } make_relative_filename(relative, grabber_data_file, orig, FILENAME_LENGTH); datedit_set_property(dat, DAT_ORIG, relative); return D_REDRAW; }
bool IsSameOrSubDir(const String &parent, const String &path) { char can_parent[MAX_PATH]; char can_path[MAX_PATH]; char relative[MAX_PATH]; // canonicalize_filename treats "." as "./." (file in working dir) const char *use_parent = parent == "." ? "./" : parent; const char *use_path = path == "." ? "./" : path; canonicalize_filename(can_parent, use_parent, MAX_PATH); canonicalize_filename(can_path, use_path, MAX_PATH); const char *pstr = make_relative_filename(relative, can_parent, can_path, MAX_PATH); if (!pstr) return false; for (pstr = strstr(pstr, ".."); pstr && *pstr; pstr = strstr(pstr, "..")) { pstr += 2; if (*pstr == '/' || *pstr == '\\' || *pstr == 0) return false; } return true; }