On Sun, Oct 09 2022, Eric DeCosta via GitGitGadget wrote: > From: Eric DeCosta <edecosta@xxxxxxxxxxxxx> > [...] > +int fsmonitor__get_fs_info(const char *path, struct fs_info *fs_info) > +{ > + struct statfs fs; > + if (statfs(path, &fs) == -1) { > + int saved_errno = errno; > + trace_printf_key(&trace_fsmonitor, "statfs('%s') failed: %s", > + path, strerror(saved_errno)); > + errno = saved_errno; > + return -1; > + } > + > + trace_printf_key(&trace_fsmonitor, > + "statfs('%s') [type 0x%08x][flags 0x%08x] '%s'", > + path, fs.f_type, fs.f_flags, fs.f_fstypename); > + > + if (!(fs.f_flags & MNT_LOCAL)) > + fs_info->is_remote = 1; > + else > + fs_info->is_remote = 0; Odd to go through the trouble of inverting the flag check like this just to assign to it manually. I'd think: if (flags & LOCAL) is_remote = 0; else is_remote = 1; Would make more sense, or actually if you do invert it: fs_info->is_remote = !(fs.f_flags & MNT_LOCAL); No? > + fs_info->typename = xstrdup(fs.f_fstypename); Instead of xstrdup()-ing this... > + > + trace_printf_key(&trace_fsmonitor, > + "'%s' is_remote: %d", > + path, fs_info->is_remote); > + return 0; > +} > + > +int fsmonitor__is_fs_remote(const char *path) > +{ > + struct fs_info fs; > + if (fsmonitor__get_fs_info(path, &fs)) > + return -1; > + > + free(fs.typename); ...just to have some callers free() it again, maybe it makes sense to say that return a const char *, and if you need it past the call to fsmonitor__get_fs_info() you should do the xstrdup() yourself. Skimming the end-state the OSX one gives you a copy of your own, as it's stuck into the struct you provided. For Linux we don't get a copy, but it's filled per getmntent() call. Anyway, small potatoes... > + if (h == INVALID_HANDLE_VALUE) { > + error(_("[GLE %ld] unable to open for read '%ls'"), > + GetLastError(), wpath); > + return -1; > + } Do away with the braces and just "return error(..." > + > + if (!GetFileInformationByHandleEx(h, FileRemoteProtocolInfo, > + &proto_info, sizeof(proto_info))) { > + error(_("[GLE %ld] unable to get protocol information for '%ls'"), > + GetLastError(), wpath); > + CloseHandle(h); > + return -1; > + } > + > + CloseHandle(h); And this duplication you can avoid with an earlier: int ret = 0; Then ret = error(...) goto cleanup; and then at the end: cleanup: CloseHandle(h) return ret; > + /* > + * Do everything in wide chars because the drive letter might be > + * a multi-byte sequence. See win32_has_dos_drive_prefix(). > + */ > + if (xutftowcs_path(wpath, path) < 0) { > + return -1; > + } Don't need the braces. > + > + /* > + * GetDriveTypeW() requires a final slash. We assume that the > + * worktree pathname points to an actual directory. > + */ > + wlen = wcslen(wpath); > + if (wpath[wlen - 1] != L'\\' && wpath[wlen - 1] != L'/') { > + wpath[wlen++] = L'\\'; > + wpath[wlen] = 0; > + } > + > + /* > + * Normalize the path. If nothing else, this converts forward > + * slashes to backslashes. This is essential to get GetDriveTypeW() > + * correctly handle some UNC "\\server\share\..." paths. > + */ > + if (!GetFullPathNameW(wpath, MAX_PATH, wfullpath, NULL)) { > + return -1; > + } > + > + driveType = GetDriveTypeW(wfullpath); Can't you just do away with this driveType variable and assign directly to fs_info->is_remote if it's == DRIVE_REMOTE?... > + trace_printf_key(&trace_fsmonitor, > + "DriveType '%s' L'%ls' (%u)", > + path, wfullpath, driveType); ...well, not due to this, but do we really need to log the raw value & is that meaningful? A user of the trace2 logs would need to reverse map that, doesn't the API provide some "what is it then?" function? > + > + if (driveType == DRIVE_REMOTE) { > + fs_info->is_remote = 1; Here we do that assignment... > + if (check_remote_protocol(wfullpath) < 0) > + return -1; > + } else { > + fs_info->is_remote = 0; > + } > + > + trace_printf_key(&trace_fsmonitor, > + "'%s' is_remote: %d", > + path, fs_info->is_remote); ditto just "is remote?"