/*
 *	amiga_dirutil.c - Amiga directory reading reoutines
 *
 *	Louis A. Mamakos, WA3YMH
 */

#include <stdio.h>
#include <dos.h>
#ifndef AZTEC_C
#include <ios1.h>
#include <proto/dos.h>
#endif
#include <libraries/dos.h>
#include "global.h"
#include "dirutil.h"
#include "proc.h"
#include "commands.h"
#include "amiga.h"

/* undo the fclose kludge */

#undef	fclose

static char *tmpfiles[10]; /*NUFBS*/

int
amiga_fclose(f)
FILE *f;
{
	int retval;

	int fd = fileno(f);

	if (f == NULLFILE) {
		fprintf(stderr,
			"NULL stdio handle passed to amiga_fclose (by %s)\n",
			Curproc->name);
		return -1;
	}
/*	if (!chkufb(fd)) {
		printf("Bogus file 0x%x (%d) passed to amiga_fclose (by %s)\n",
			f, fd, Curproc->name);
		exit(1);
	}*/
	retval = fclose(f);
	if (tmpfiles[fd]) {
		(void) unlink(tmpfiles[fd]);
		free(tmpfiles[fd]);
		tmpfiles[fd] = (char *)NULL;
	}
	return retval;
}

int rmdir(fi)
char *fi;
{
	return(unlink(fi));
}

strcmpi( s1, s2 )
    char *s1, *s2;
{
	return(stricmp(s1, s2));
}


/*
 *  Wildcard filename lookup
 */
int
filedir(name, times, ret_str)
	char *name, *ret_str;
	int times;
{
/*	static struct FILEINFO *fib = (struct FILEINFO *)NULL;

	if (fib == (struct FILEINFO *)NULL)
		if ((fib = malloc(sizeof *fib)) == (struct FILEINFO *)NULL) {
			*ret_str = '\0';
			return -1;
		}
	if (times) {
		if (!dnext(fib)) {
			strcpy(ret_str, fib->fib_FileName);
			return 0;
		}
	} else {
		if (!dfind(fib, name, 0)) {
			strcpy(ret_str, fib->fib_FileName);
			return 0;
		}
	}
	*ret_str = '\0';*/
	return -1;
}

FILE *
tmpfile() {
	static char template[] = "T:NET-tmp%d";
	static int tmpseq = 0;
	char fn[20];
	BPTR lock;
	FILE *fp;
	int tries = 0;
	
	(void) sprintf(fn, template, tmpseq++);
	for(;;) {
		lock = Lock(fn, ACCESS_READ);
		if (!lock)
			break;
		UnLock(lock);
		(void) sprintf(fn, template, tmpseq++);
#ifdef	DEBUG
		if (tries++ > 20) {
			printf("tmpfile() fails => too many tries\n");
			exit(1);
		}
#endif
	}

	if ((fp = fopen(fn, "w+")) == (FILE *)NULL) {
		printf("tmpfile() %s fails => file exists\n", fn);
		exit(1);
	}
	if (setvbuf(fp, (char *)NULL, _IOFBF, 0)) {
		fclose(fp);
		(void) unlink(fn);
		return (FILE *)NULL;
	}
#ifdef	DEBUG
/*	if (!chkufb(fileno(fp))) {
		printf("tmpfile() fails => fd %d chkufb pukes!\n", fileno(fp));
		(void) unlink(fn);
		exit(1);
	}*/
#endif
	if ((tmpfiles[fileno(fp)] = strdup(fn)) == (char *) NULL) {
		(void) fclose(fp);
		(void) unlink(fn);
		return (FILE *)NULL;
	}	
	return fp;
}

/*
 * Create a directory listing in a temp file and return the resulting file
 * descriptor. If full == 1, give a full listing; else return just a list
 * of names.
 */
FILE *
dir(path, full)
	char *path;
	int full;
{
	char command[120], *name;
	int fd;
	FILE *f;

	if ((f = tmpfile()) == NULL)
		return (FILE *)NULL;

	fd = fileno(f);

#ifdef	DEBUG
	if (!tmpfiles[fd]) {
		printf("dir() => no tmpfile name!\n");
		exit(1);
	}
#endif
	name = tmpfiles[fd];

	if (full)
		sprintf(command, "LIST >%s %s", name, path);
	else
		sprintf(command, "LIST >%s %s LFORMAT=%%s", name, path);

	fclose(f);
	tmpfiles[fd] = (char *)NULL;

	if (!Execute(command, 0, 0)) {
#ifdef	DEBUG
		printf("Execute(%s) fails\n", command);
#endif
		free(name);
		return (FILE *)NULL;
	}

	if ((f = fopen(name, "r")) == NULL) {
		free(name);
		return (FILE *)NULL;
	}

	tmpfiles[fileno(f)] = name;	/* put name in new file slot */
	return f;	
}

/* Change working directory */
int
docd(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	char dirname[FMSIZE];

	if(argc > 1){
		if(chdir(argv[1]) == -1){
			printf("Can't change directory\n");
			return 1;
		}
		return 0;
	}
	
/*	if (getcd(0, dirname)) {*/
		printf("Can't get current directory\n");
		return 1;
/*	} else
		printf("%s\n", dirname);

	return 0;*/
}
