diff options
| author | Tom Schwindl <schwindl@posteo.de> | 2022-07-10 19:30:22 +0000 |
|---|---|---|
| committer | Felix Van der Jeugt <felix.vanderjeugt@posteo.net> | 2022-07-12 22:58:14 +0200 |
| commit | cbeda11801c95687498e2deb6a0144b562581d16 (patch) | |
| tree | 4f2b161fc325fb3adb8a055472249770300fd92e | |
| parent | eb96e0ce8143804f5a7a37eb76a4b86d8871dd76 (diff) | |
| download | vis-cbeda11801c95687498e2deb6a0144b562581d16.tar.gz vis-cbeda11801c95687498e2deb6a0144b562581d16.tar.xz | |
vis: Compare inodes instead of filenames
| -rw-r--r-- | vis.c | 11 | ||||
| -rw-r--r-- | vis.h | 2 |
2 files changed, 8 insertions, 5 deletions
@@ -179,14 +179,19 @@ err: static File *file_new(Vis *vis, const char *name) { char *name_absolute = NULL; + struct stat new; + if (name) { if (!(name_absolute = absolute_path(name))) return NULL; + if (stat(name_absolute, &new) && errno != ENOENT) + return NULL; + File *existing = NULL; - /* try to detect whether the same file is already open in another window - * TODO: do this based on inodes */ + /* try to detect whether the same file is already open in another window */ for (File *file = vis->files; file; file = file->next) { - if (file->name && strcmp(file->name, name_absolute) == 0) { + if (file->name && file->stat.st_dev == new.st_dev && + file->stat.st_ino == new.st_ino) { existing = file; break; } @@ -189,8 +189,6 @@ void vis_update(Vis*); * @rst * .. note:: If the given file name is already opened in another window, * the underlying File object is shared. - * .. warning:: This duplication detection is currently based on normalized, - * absolute file names. TODO: compare inodes instead. * @endrst */ bool vis_window_new(Vis*, const char *filename); |
