Category : OS/2 Files
Archive   : ZOO21E.ZIP
Filename : OS2.C

 
Output of file : OS2.C contained in archive : ZOO21E.ZIP
/* os2.c */

/* Highly system-dependent routines go here */

#include "options.h"
#include "zoo.h"
#include "zooio.h" /* to satisfy declarations in zoofns.h */
#include "zoofns.h"
#include "errors.i"
#include /* to get fileno() */
#include

#define INCL_NOPM
#define INCL_DOS
#define INCL_DOSERRORS
#include

#include "assert.h" /* macro definition: assert() macro */

/* settime() */

/* Accepts a date/time in DOS format and sets the file time. Returns 1
if OK, 0 if error */

int settime (file,date,time)
ZOOFILE file;
unsigned date, time;
{
FILESTATUS info;
HFILE handle = fileno(file);

fflush(file);
DosQFileInfo(handle, 1, &info, sizeof(info));
*((unsigned *)&info.fdateLastWrite) = date;
*((unsigned *)&info.ftimeLastWrite) = time;
return DosSetFileInfo(handle, 1, (PBYTE) &info, sizeof(info)) == 0;
} /* settime */

/* gets date and time of file */

gettime (file,date,time)
ZOOFILE file;
unsigned *date, *time;
{
FILESTATUS info;
HFILE handle = fileno(file);
int ret;

ret = DosQFileInfo(handle, 1, &info, sizeof(info));
*date = *((unsigned *) &info.fdateLastWrite);
*time = *((unsigned *) &info.ftimeLastWrite);
return ret == 0;
} /* settime */


/* space() */

/* Returns free space in bytes on disk n (0 = default, 1 = A, etc.). Returns
0 if drive number is invalid. Before getting disk space, the function
requests DOS to flush its internal buffers */

unsigned long space (drive, alloc_size)
int drive;
int *alloc_size;
{
unsigned long free_space;
FSALLOCATE info;
int ret;

DosBufReset(-1);
ret = DosQFSInfo(drive, 1, (BYTE FAR *)&info, sizeof(info));
*alloc_size = info.cbSector * (int) info.cSectorUnit;
return ret ? 0L : (unsigned long) (info.cUnitAvail * *alloc_size);
}

int IsFileNameValid(char *name)
{
HFILE hf;
USHORT usAction;

switch( DosOpen(name, &hf, &usAction, 0L, 0, FILE_OPEN,
OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0L) )
{
case ERROR_INVALID_NAME:
case ERROR_FILENAME_EXCED_RANGE:
return FALSE;
case NO_ERROR:
DosClose(hf);
default:
return TRUE;
}
}


int IsFileSystemDumb(char *dir)
{
char drive[5], path[256], name[256];

_splitpath(dir, drive, path, NULL, NULL);
_makepath(name, drive, path, ".DUMB.TEST.NAME", NULL);

return !IsFileNameValid(name);
}


#define FMAX 3 /* Number of different filename patterns */

void fcbpath (FILEFINDBUF *, char *, char *);

char *nextfile (what, filespec, fileset)
int what; /* whether to initialize or match */
register char *filespec; /* filespec to match if initializing */
register int fileset; /* which set of files */
{
static FILEFINDBUF file_info [FMAX+1]; /* our own private dta */
static HDIR handles [FMAX+1];
static int first_time [FMAX+1];
static char pathholder [FMAX+1][PATHSIZE]; /* holds a pathname to return */
static char saved_fspec [FMAX+1][PATHSIZE];/* our own copy of filespec */
static int lower;
USHORT count;
int ret;

assert(fileset >= 0 && fileset <= FMAX);
if (what == 0) {
assert(filespec != NULL);
strcpy (saved_fspec[fileset], filespec); /* save the filespec */
first_time[fileset] = 1;
return (NULL);
}

assert(what == 1);
assert(filespec == NULL);
assert(first_time[fileset] == 0 || first_time[fileset] == 1);

if (first_time[fileset]) { /* first time -- initialize etc. */
/* find first matching file */
count = 1;
lower = IsFileSystemDumb(saved_fspec[fileset]);
handles[fileset] = 0xffff; /* Get new handle */
ret = DosFindFirst(saved_fspec[fileset], &handles[fileset], 0,
&file_info[fileset], sizeof(FILEFINDBUF), &count, 0L);
} else {
/* find next matching file */
count = 1;
ret = DosFindNext(handles[fileset], &file_info[fileset], sizeof(FILEFINDBUF),
&count);
}

if (ret != 0 || count != 1) { /* if error status */
if (first_time[fileset]) { /* if file never matched then */
first_time[fileset] = 0;
return (saved_fspec[fileset]);/* return original filespec */
} else { /* else */
first_time[fileset] = 0; /* */
return (NULL); /* return (NULL) for no more */
}
} else { /* a file matched */
first_time[fileset] = 0;
/* add path info */
if ( lower )
strlwr(file_info[fileset].achName);
fcbpath (&file_info[fileset], saved_fspec[fileset], pathholder[fileset]);
return (pathholder[fileset]); /* matching path */
}
} /* nextfile */

/*
fcbpath() accepts a pointer to the FILEFINDBUF, a
character pointer to a pathname that may contain wildcards, and a character
pointer to a buffer. Copies into buffer the path prefix from the pathname
and the filename prefix from the DTA so that it forms a complete path
*/

void fcbpath (info, old_path, new_path)
FILEFINDBUF *info;
char *old_path;
register char *new_path;
{
register int i;
int length, start_pos;

strcpy(new_path, old_path); /* copy the whole thing first */
length = strlen(new_path);
i = length - 1; /* i points to end of path */
while (i >= 0 && new_path[i] != '/' && new_path[i] != '\\' && new_path[i] != ':')
i--;
/* either we found a "/", "\", or ":", or we reached the beginning of
the name. In any case, i points to the last character of the
path part. */
start_pos = i + 1;
for (i = 0; info->achName[i]; i++)
new_path[start_pos+i] = info->achName[i];
new_path[start_pos+i] = '\0';
}


int outchar(int c)
{
putchar(c);
}


  3 Responses to “Category : OS/2 Files
Archive   : ZOO21E.ZIP
Filename : OS2.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/