annotate liboctave/system/file-stat.cc @ 29214:45abff4199d8 stable

stat: Improve regular expression for UNC roots on Windows (bug #59706). * liboctave/system/file-stat.cc (file_stat::update_internal): Improve regular expression for UNC roots on Windows. Add simple checks to avoid using the regular expression for non-UNC paths.
author Markus Mützel <markus.muetzel@gmx.de>
date Mon, 21 Dec 2020 19:24:58 +0100
parents e8819aa30715
children 6e031c8ed59c 0180eaf55fd0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
3 // Copyright (C) 1996-2020 The Octave Project Developers
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
25
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21301
diff changeset
26 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21202
diff changeset
27 # include "config.h"
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
28 #endif
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
29
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21942
diff changeset
30 #include <ctime>
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
31 #include <cerrno>
10463
bbe99b2a5ba7 undo recent gnulib-related changes
John W. Eaton <jwe@octave.org>
parents: 10447
diff changeset
32 #include <cstring>
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
33
5871
b9fd54407c8d [project @ 2006-06-30 16:48:39 by jwe]
jwe
parents: 5775
diff changeset
34 #include "file-ops.h"
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
35 #include "file-stat.h"
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
36 #include "stat-wrappers.h"
21901
7338be52b892 hide gnulib filemode header
John W. Eaton <jwe@octave.org>
parents: 21852
diff changeset
37 #include "strmode-wrapper.h"
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
38
28054
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
39 #if defined (OCTAVE_USE_WINDOWS_API)
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
40 # include "lo-regexp.h"
29210
e8819aa30715 stat: Use "make_absolute" instead of "canonicalize_file_name" on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28867
diff changeset
41 # include "oct-env.h"
28054
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
42 #endif
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
43
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
44 namespace octave
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11569
diff changeset
45 {
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
46 namespace sys
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
47 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
48 // FIXME: the is_* and mode_as_string functions are only valid
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
49 // for initialized objects. If called for an object that is not
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
50 // initialized, they should throw an exception.
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
51
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
52 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
53 base_file_stat::is_blk (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
54 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
55 return exists () && is_blk (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
56 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
57
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
58 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
59 base_file_stat::is_chr (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
60 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
61 return exists () && is_chr (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
62 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
63
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
64 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
65 base_file_stat::is_dir (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
66 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
67 return exists () && is_dir (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
68 }
5476
941f0fc6b596 [project @ 2005-09-29 22:46:07 by jwe]
jwe
parents: 5307
diff changeset
69
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
70 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
71 base_file_stat::is_fifo (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
72 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
73 return exists () && is_fifo (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
74 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
75
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
76 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
77 base_file_stat::is_lnk (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
78 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
79 return exists () && is_lnk (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
80 }
5476
941f0fc6b596 [project @ 2005-09-29 22:46:07 by jwe]
jwe
parents: 5307
diff changeset
81
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
82 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
83 base_file_stat::is_reg (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
84 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
85 return exists () && is_reg (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
86 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
87
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
88 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
89 base_file_stat::is_sock (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
90 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
91 return exists () && is_sock (m_mode);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
92 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
93
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
94 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
95 base_file_stat::is_blk (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
96 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
97 return octave_is_blk_wrapper (mode);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
98 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
99
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
100 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
101 base_file_stat::is_chr (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
102 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
103 return octave_is_chr_wrapper (mode);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
104 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
105
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
106 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
107 base_file_stat::is_dir (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
108 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
109 return octave_is_dir_wrapper (mode);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
110 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
111
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
112 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
113 base_file_stat::is_fifo (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
114 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
115 return octave_is_fifo_wrapper (mode);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
116 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
117
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
118 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
119 base_file_stat::is_lnk (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
120 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
121 return octave_is_lnk_wrapper (mode);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
122 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
123
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
124 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
125 base_file_stat::is_reg (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
126 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
127 return octave_is_reg_wrapper (mode);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
128 }
5476
941f0fc6b596 [project @ 2005-09-29 22:46:07 by jwe]
jwe
parents: 5307
diff changeset
129
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
130 bool
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
131 base_file_stat::is_sock (mode_t mode)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
132 {
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
133 return octave_is_sock_wrapper (mode);
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
134 }
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
135
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
136 bool
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
137 base_file_stat::have_struct_stat_st_rdev (void)
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
138 {
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
139 return ::octave_have_struct_stat_st_rdev ();
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
140 }
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
141
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
142 bool
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
143 base_file_stat::have_struct_stat_st_blksize (void)
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
144 {
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
145 return octave_have_struct_stat_st_blksize ();
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
146 }
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
147
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
148 bool
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
149 base_file_stat::have_struct_stat_st_blocks (void)
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
150 {
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
151 return octave_have_struct_stat_st_blocks ();
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
152 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
153
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
154 std::string
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
155 base_file_stat::mode_as_string (void) const
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
156 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
157 char buf[12];
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
158
21901
7338be52b892 hide gnulib filemode header
John W. Eaton <jwe@octave.org>
parents: 21852
diff changeset
159 octave_strmode_wrapper (m_mode, buf);
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
160
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
161 return std::string (buf);
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
162 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
163
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
164 // Has FILE been modified since TIME? Returns 1 for yes, 0 for no,
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
165 // and -1 for any error.
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
166
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
167 int
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
168 base_file_stat::is_newer (const std::string& file,
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
169 const sys::time& time)
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
170 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
171 file_stat fs (file);
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
172
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
173 return fs ? fs.is_newer (time) : -1;
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
174 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
175
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
176 // Private stuff:
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
177
23206
525c36d5f985 Workaround segfault in file_stat (bug #50234).
Rik <rik@octave.org>
parents: 23083
diff changeset
178 file_stat::file_stat (const std::string& n, bool fl)
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
179 : base_file_stat (), file_name (n), follow_links (fl)
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
180 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
181 if (! file_name.empty ())
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
182 update_internal ();
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
183 }
23206
525c36d5f985 Workaround segfault in file_stat (bug #50234).
Rik <rik@octave.org>
parents: 23083
diff changeset
184
23228
a6e4157694ef Remove inline keyword on file_stat destructor which breaks MacOS compilation (bug #50234).
Rik <rik@octave.org>
parents: 23219
diff changeset
185 file_stat::~file_stat () { }
23206
525c36d5f985 Workaround segfault in file_stat (bug #50234).
Rik <rik@octave.org>
parents: 23083
diff changeset
186
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
187 void
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
188 file_stat::update_internal (bool force)
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
189 {
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
190 if (! initialized || force)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
191 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
192 initialized = false;
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
193 fail = false;
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11569
diff changeset
194
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
195 std::string full_file_name = sys::file_ops::tilde_expand (file_name);
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
196
28054
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
197 #if defined (OCTAVE_USE_WINDOWS_API)
29210
e8819aa30715 stat: Use "make_absolute" instead of "canonicalize_file_name" on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 28867
diff changeset
198 full_file_name = sys::env::make_absolute (full_file_name);
28054
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
199
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
200 // Remove trailing slashes
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
201 while (full_file_name.length () > 1
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
202 && sys::file_ops::is_dir_sep (full_file_name.back ()))
23812
057a894914df Use C++11 string fcns back() and pop_back() to simplify code.
Rik <rik@octave.org>
parents: 23696
diff changeset
203 full_file_name.pop_back ();
28054
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
204
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
205 // If path is a root (like "C:" or "\\SERVER\share"), add a
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
206 // trailing backslash.
29214
45abff4199d8 stat: Improve regular expression for UNC roots on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 29210
diff changeset
207 // FIXME: This pattern does not match all possible UNC roots:
45abff4199d8 stat: Improve regular expression for UNC roots on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 29210
diff changeset
208 // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/62e862f4-2a51-452e-8eeb-dc4ff5ee33cc
45abff4199d8 stat: Improve regular expression for UNC roots on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 29210
diff changeset
209 regexp pat (R"(^\\\\[\w.-]+\\[\w\$-]+$)");
28054
372f42f122bd Support stat on UNC root paths (bug #57776).
Markus Mützel <markus.muetzel@gmx.de>
parents: 27923
diff changeset
210 if ((full_file_name.length () == 2 && full_file_name[1] == ':')
29214
45abff4199d8 stat: Improve regular expression for UNC roots on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 29210
diff changeset
211 || (full_file_name.length () > 4 && full_file_name[0] == '\\'
45abff4199d8 stat: Improve regular expression for UNC roots on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 29210
diff changeset
212 && full_file_name[1] == '\\' && pat.is_match (full_file_name)))
45abff4199d8 stat: Improve regular expression for UNC roots on Windows (bug #59706).
Markus Mützel <markus.muetzel@gmx.de>
parents: 29210
diff changeset
213 full_file_name.push_back ('\\');
6810
56a7de3f6451 [project @ 2007-08-10 18:53:49 by jwe]
jwe
parents: 5871
diff changeset
214 #endif
56a7de3f6451 [project @ 2007-08-10 18:53:49 by jwe]
jwe
parents: 5871
diff changeset
215
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
216 const char *cname = full_file_name.c_str ();
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
217
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
218 time_t sys_atime, sys_mtime, sys_ctime;
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
219
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
220 int status
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
221 = (follow_links
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
222 ? octave_stat_wrapper (cname, &m_mode, &m_ino, &m_dev,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
223 &m_nlink, &m_uid, &m_gid, &m_size,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
224 &sys_atime, &sys_mtime, &sys_ctime,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
225 &m_rdev, &m_blksize, &m_blocks)
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
226 : octave_lstat_wrapper (cname, &m_mode, &m_ino, &m_dev,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
227 &m_nlink, &m_uid, &m_gid, &m_size,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
228 &sys_atime, &sys_mtime, &sys_ctime,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
229 &m_rdev, &m_blksize, &m_blocks));
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
230
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
231 if (status < 0)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
232 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
233 fail = true;
21942
aab79a1885cc limit gnulib headers to liboctave/wrappers directory
John W. Eaton <jwe@octave.org>
parents: 21935
diff changeset
234 errmsg = std::strerror (errno);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
235 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
236 else
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
237 {
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
238 m_atime = sys::time (sys_atime);
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
239 m_mtime = sys::time (sys_mtime);
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
240 m_ctime = sys::time (sys_ctime);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
241 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
242
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
243 initialized = true;
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
244 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
245 }
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
246
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
247 void
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
248 file_fstat::update_internal (bool force)
8549
424ba638d8f1 [mq]: fstat
file-io.cc (Ffstat): new function
parents: 7705
diff changeset
249 {
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
250 if (! initialized || force)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
251 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
252 initialized = false;
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
253 fail = false;
8549
424ba638d8f1 [mq]: fstat
file-io.cc (Ffstat): new function
parents: 7705
diff changeset
254
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
255 time_t sys_atime, sys_mtime, sys_ctime;
8549
424ba638d8f1 [mq]: fstat
file-io.cc (Ffstat): new function
parents: 7705
diff changeset
256
21935
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
257 int status
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
258 = octave_fstat_wrapper (fid, &m_mode, &m_ino, &m_dev,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
259 &m_nlink, &m_uid, &m_gid, &m_size,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
260 &sys_atime, &sys_mtime, &sys_ctime,
2f33052c68ff hide sys/stat.h header
John W. Eaton <jwe@octave.org>
parents: 21901
diff changeset
261 &m_rdev, &m_blksize, &m_blocks);
8549
424ba638d8f1 [mq]: fstat
file-io.cc (Ffstat): new function
parents: 7705
diff changeset
262
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
263 if (status < 0)
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
264 {
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
265 fail = true;
21942
aab79a1885cc limit gnulib headers to liboctave/wrappers directory
John W. Eaton <jwe@octave.org>
parents: 21935
diff changeset
266 errmsg = std::strerror (errno);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
267 }
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
268 else
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
269 {
23696
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
270 m_atime = sys::time (sys_atime);
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
271 m_mtime = sys::time (sys_mtime);
08036a7f3660 remove octave:: namespace tag from symbols used inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23229
diff changeset
272 m_ctime = sys::time (sys_ctime);
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
273 }
8549
424ba638d8f1 [mq]: fstat
file-io.cc (Ffstat): new function
parents: 7705
diff changeset
274
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
275 initialized = true;
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
276 }
8549
424ba638d8f1 [mq]: fstat
file-io.cc (Ffstat): new function
parents: 7705
diff changeset
277 }
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
278 }
2926
66ef74ee5d9f [project @ 1997-05-05 03:20:52 by jwe]
jwe
parents:
diff changeset
279 }