home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 28
/
amigaformatcd28.iso
/
-seriously_amiga-
/
archivers
/
amignutar
/
src
/
sas_amiga.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-04-23
|
3KB
|
160 lines
/*
* Amiga specific functions
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <time.h>
#include <dos/dos.h>
#include <proto/dos.h>
/* maxmium pathlength for AmigaDOS */
#define MAXPATHLEN (255) /* BSTR */
/* UNIX protection bits */
#define S_IRWXU 0000700 /* RWX mask for owner */
#define S_IRUSR 0000400 /* R for owner */
#define S_IWUSR 0000200 /* W for owner */
#define S_IXUSR 0000100 /* X for owner */
#define S_IRWXG 0000070 /* RWX mask for group */
#define S_IRGRP 0000040 /* R for group */
#define S_IWGRP 0000020 /* W for group */
#define S_IXGRP 0000010 /* X for group */
#define S_IRWXO 0000007 /* RWX mask for other */
#define S_IROTH 0000004 /* R for other */
#define S_IWOTH 0000002 /* W for other */
#define S_IXOTH 0000001 /* X for other */
int sas_chmod(const char *filename, int modes)
{
unsigned long mask = FIBF_READ | FIBF_WRITE | FIBF_EXECUTE | FIBF_DELETE; /* clear; low-active */
if(modes & S_IRUSR) mask &= ~FIBF_READ;
if(modes & S_IWUSR) mask &= ~FIBF_WRITE;
if(modes & S_IXUSR) mask &= ~FIBF_EXECUTE;
if(modes & S_IWUSR) mask &= ~FIBF_DELETE;
if(modes & S_IRGRP) mask |= FIBF_GRP_READ;
if(modes & S_IWGRP) mask |= FIBF_GRP_WRITE;
if(modes & S_IXGRP) mask |= FIBF_GRP_EXECUTE;
if(modes & S_IWGRP) mask |= FIBF_GRP_DELETE;
if(modes & S_IROTH) mask |= FIBF_OTR_READ;
if(modes & S_IWOTH) mask |= FIBF_OTR_WRITE;
if(modes & S_IXOTH) mask |= FIBF_OTR_EXECUTE;
if(modes & S_IWOTH) mask |= FIBF_OTR_DELETE;
SetProtection((APTR) filename, mask);
return 0; /* returning error would have to mess with errno, too */
}
int sas_stat(const char *filename, struct stat *st)
{
unsigned short mode;
int result;
result = lstat(filename,st);
mode = st->st_mode & 0xff00; /* mask out file mode bits */
/* convert them to closest UNIX equivalents */
if (st->st_mode & S_IREAD) mode |= S_IRUSR | S_IRGRP | S_IROTH;
if (st->st_mode & S_IWRITE) mode |= S_IWUSR | S_IWGRP | S_IWOTH;
if (st->st_mode & S_IEXECUTE) mode |= S_IXUSR | S_IXGRP | S_IXOTH;
st->st_mode = mode;
return result;
}
char *getwd(char *buf)
{
return(getcwd(buf, MAXPATHLEN));
}
int readlink(char *path, char *name, int max)
{
return(-1);
}
int symlink(void)
{
return(-1);
}
int utime(void)
{
return(0);
}
int umask(void)
{
return(0);
}
int fork(void)
{
return(-1);
}
int execlp(void)
{
return(-1);
}
int findgid(void)
{
return(0);
}
int finduid(void)
{
return(0);
}
int pipe(void)
{
return(-1);
}
int dup(void)
{
return(-1);
}
int setmode(void)
{
return(0);
}
extern int wildmat(char *s, char *p);
int fnmatch (char *pattern, char *string, int flags)
{
wildmat(string, pattern);
}
#include <sys/timeb.h>
void ftime(struct timeb *ftz)
{
extern time_t timezone;
(void)time((time_t *) ftz->time);
/* Set the timezone global. */
tzset();
ftz->timezone = (int) timezone / 60;
}