
/*
 *  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 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(filename, mask);
 	
 	return 0; /* returning error would have to mess with errno, too */
}

#undef stat(a,b)
int sas_stat(const char *filename, struct stat *st)
{
	unsigned short mode;
	int result;
	
	result = stat(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 ftruncate(void)
{
    return(-1);
}

int setmode(void)
{
    return(0);
}
