[or-cvs] Fix a fun windows bug: apparently windows stat wants paths ...
Nick Mathewson
nickm at seul.org
Wed Mar 16 00:05:01 UTC 2005
Update of /home/or/cvsroot/tor/src/common
In directory moria.mit.edu:/tmp/cvs-serv7089/src/common
Modified Files:
util.c
Log Message:
Fix a fun windows bug: apparently windows stat wants paths not to end with slash.
Index: util.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/common/util.c,v
retrieving revision 1.204
retrieving revision 1.205
diff -u -d -r1.204 -r1.205
--- util.c 25 Feb 2005 20:46:12 -0000 1.204
+++ util.c 16 Mar 2005 00:04:59 -0000 1.205
@@ -741,13 +741,37 @@
* Filesystem operations.
*/
+/** Clean up <b>name</b> so that we can use it in a call to "stat". On Unix,
+ * we do nothing. On Windows, we remove a trailing slash, unless the path is
+ * the root of a disk. */
+static void
+clean_name_for_stat(char *name)
+{
+#ifdef MS_WINDOWS
+ size_t len = strlen(name);
+ if (!len)
+ return;
+ if (name[len-1]=='\\' || name[len-1]=='/') {
+ if (len == 1 || (len==3 && name[1]==':'))
+ return;
+ name[len-1]='\0';
+ }
+#endif
+}
+
/** Return FN_ERROR if filename can't be read, FN_NOENT if it doesn't
* exist, FN_FILE if it is a regular file, or FN_DIR if it's a
* directory. */
file_status_t file_status(const char *fname)
{
struct stat st;
- if (stat(fname, &st)) {
+ char *f;
+ int r;
+ f = tor_strdup(fname);
+ clean_name_for_stat(f);
+ r = stat(f, &st);
+ tor_free(f);
+ if (r) {
if (errno == ENOENT) {
return FN_NOENT;
}
@@ -770,8 +794,13 @@
{
int r;
struct stat st;
+ char *f;
tor_assert(dirname);
- if (stat(dirname, &st)) {
+ f = tor_strdup(dirname);
+ clean_name_for_stat(f);
+ r = stat(f, &st);
+ tor_free(f);
+ if (r) {
if (errno != ENOENT) {
log(LOG_WARN, "Directory %s cannot be read: %s", dirname,
strerror(errno));
@@ -893,12 +922,16 @@
char *read_file_to_str(const char *filename, int bin) {
int fd; /* router file */
struct stat statbuf;
- char *string;
+ char *string, *f;
int r;
tor_assert(filename);
- if (stat(filename, &statbuf) < 0) {
+ f = tor_strdup(filename);
+ clean_name_for_stat(f);
+ r = stat(f, &statbuf);
+ tor_free(f);
+ if (r < 0) {
log_fn(LOG_INFO,"Could not stat %s.",filename);
return NULL;
}
More information about the tor-commits
mailing list