mirror of
https://github.com/ctm/executor.git
synced 2024-09-28 11:54:53 +00:00
207 lines
4.0 KiB
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;
|
||
|
}
|
||
|
|