executor/src/slash.c

207 lines
4.0 KiB
C

/* Copyright 1994, 1995 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_slash[] =
"$Id: slash.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/*
* The DOS file manipulation routines don't like to see "//", which is
* a pain for us because we like the format of a file to be the filesystem
* (volume) name, a slash, and then the rest of the path. That means that
* anything that is in the root directory gets a leading slash. Stubbing
* out these routines is much easier than rewriting the other routines.
*/
#include "rsys/common.h"
#include "rsys/lockunlock.h"
#if defined(MSDOS) || defined (CYGWIN32)
#if defined (CYGWIN32)
#include "winfs.h"
#include "win_stat.h"
#endif
#include "rsys/slash.h"
#define DOUBLE_SLASH_REMOVE(str) \
({ \
char *retval, *op; \
const char *ip; \
boolean_t last_was_slash_p; \
\
/* char *from; \
asm ("movl %%ebp, %0" : "=g" (from)); \
from = *(char **)(from+4); \
warning_unexpected ("name = \"%s\" from = %p", str, from); */ \
retval = alloca (strlen (str) + 1); \
last_was_slash_p = FALSE; \
for (ip = str, op = retval; *ip; ++ip) \
{ \
if (*ip != '/' || !last_was_slash_p) \
*op++ = *ip; \
last_was_slash_p = *ip == '/'; \
} \
*op = 0; \
retval; \
})
int Uaccess(const char *path, int mode)
{
path = DOUBLE_SLASH_REMOVE (path);
return access(path, mode);
}
int Uchdir(const char *path)
{
path = DOUBLE_SLASH_REMOVE (path);
return chdir(path);
}
int Uchmod(const char *path, int mode)
{
path = DOUBLE_SLASH_REMOVE (path);
return chmod(path, mode);
}
int Uchown(const char *path, uid_t owner, gid_t group)
{
int retval;
path = DOUBLE_SLASH_REMOVE (path);
#if !defined (CYGWIN32)
retval = chown(path, owner, group);
#else
retval = 0;
#endif
return retval;
}
int Ucreat(const char *path, int mode)
{
path = DOUBLE_SLASH_REMOVE (path);
return creat(path, mode);
}
FILE *Ufopen(const char *path, const char *type)
{
path = DOUBLE_SLASH_REMOVE (path);
return fopen(path, type);
}
int Ulink(const char *path, const char *newpath)
{
path = DOUBLE_SLASH_REMOVE (path);
newpath = DOUBLE_SLASH_REMOVE (newpath);
return link(path, newpath);
}
int Umkdir(const char *path, int mode)
{
path = DOUBLE_SLASH_REMOVE (path);
return mkdir(path
#if !defined (CYGWIN32)
,mode
#endif
);
}
DIR *Uopendir(const char *path)
{
path = DOUBLE_SLASH_REMOVE (path);
return opendir((char *) path);
}
int Urename(const char *path, const char *new)
{
path = DOUBLE_SLASH_REMOVE (path);
new = DOUBLE_SLASH_REMOVE (new);
return rename(path, new);
}
int Urmdir(const char *path)
{
path = DOUBLE_SLASH_REMOVE (path);
return rmdir(path);
}
int Ustat(const char *path, struct stat *buf)
{
int retval;
path = DOUBLE_SLASH_REMOVE (path);
retval = stat(path, buf);
if (strlen (path) == 2 && path[1] == ':')
{
#if defined (CYGWIN32)
buf->st_ino = 0;
buf->st_rdev = 1;
#else
buf->st_ino = 1;
#endif
}
#if defined (CYGWIN32)
else
{
uint32 ino;
ino = ino_from_name (path);
buf->st_ino = ino >> 16; /* See definition of ST_INO */
buf->st_rdev = ino;
}
#endif
return retval;
}
int Ustatfs(const char *path, struct statfs *buf)
{
path = DOUBLE_SLASH_REMOVE (path);
return statfs(path, buf);
}
int Uunlink(const char *path)
{
path = DOUBLE_SLASH_REMOVE (path);
return unlink(path);
}
int Uutimes(const char *path, struct timeval tvp[2])
{
#if 0
path = DOUBLE_SLASH_REMOVE (path);
return utimes(path, tvp);
#else
#warning "Blowing off utimes"
return -1;
#endif
}
#else
#define DOUBLE_SLASH_REMOVE(path) path
#endif
int Uopen(const char *path, int flags, int mode)
{
int retval;
path = DOUBLE_SLASH_REMOVE (path);
retval = open(path, flags, mode);
ROMlib_fd_clear_locks_after_open (retval, TRUE);
return retval;
}
int Uclose (int fd)
{
int retval;
ROMlib_fd_release_locks_for_close (fd);
retval = close (fd);
return retval;
}