Timothe Litt 66e00b9900 Backlog of work since 2016
Too much to list all, but includes (in no particular order):
 - Cleanup for 64-bit builds, MSVC warnings.
 - Structured help
 - Help file compiler.
 - Supports volsets, writes/create work.
 - Support for I18n in messages, help.
 - Makefiles.
 - Initialize volume/volset
 - Command line editing/history

Builds and works on Linux and Windows (VS).
Not recently built or tested on other platforms, but
not intentinonally broken.
2022-10-10 11:00:20 -04:00

147 lines
4.0 KiB
C

/* Device.c Module to remember and find devices...*/
/*
* This is part of ODS2 written by Paul Nankervis,
* email address: Paulnank@au1.ibm.com
*
* ODS2 is distributed freely for all members of the
* VMS community to use. However all derived works
* must maintain comments in their source to acknowledge
* the contributions of the original author and
* subsequent contributors. This is free software; no
* warranty is offered, and while we believe it to be useful,
* you use it at your own risk.
*/
/* Should have mechanism to return actual device name... */
/* This module is simple enough - it just keeps track of
* device names and initialization...
*/
#include <ctype.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ods2.h"
#include "access.h"
#include "cache.h"
#include "device.h"
#include "ssdef.h"
#if !defined( DEBUG ) && defined( DEBUG_DEVICE )
#define DEBUG DEBUG_DEVICE
#else
#ifndef DEBUG
#define DEBUG 0
#endif
#endif
static void *device_create( uint32_t devsiz, void *keyval, vmscond_t *retsts );
static int device_compare( uint32_t keylen, void *keyval, void *node );
static struct DEV *dev_root = NULL;
/************************************************************ device_create() */
/* device_create() creates a device object...
*/
static void *device_create( uint32_t devsiz, void *keyval, vmscond_t *retsts ) {
register struct DEV *dev;
dev = (struct DEV *) calloc( 1, offsetof( struct DEV, devnam ) + devsiz + 2 );
if ( dev == NULL ) {
*retsts = SS$_INSFMEM;
return NULL;
}
dev->cache.objtype = OBJTYPE_DEV;
memcpy( dev->devnam, keyval, devsiz );
memcpy( dev->devnam + devsiz, ":", 2 );
*retsts = SS$_NORMAL;
return dev;
}
/************************************************************ device_done() */
/* device_done() releases a device reference and
* eventually the device structure.
*/
void device_done( struct DEV *dev ) {
if( dev->cache.refcount < 1 ) {
#if DEBUG
printf( "Device done with no reference\n" );
#endif
abort();
}
cache_untouch( &dev->cache, TRUE );
if( dev->cache.refcount == 0 ) /* Safe because on LRU list */
cache_delete( &dev->cache );
return;
}
/*********************************************************** device_compare() */
/* device_compare() compares a device name to that of a device object... */
static int device_compare( uint32_t keylen, void *keyval, void *node ) {
register int cmp;
register const char *keynam;
register const char *devnam;
keynam = (const char *) keyval;
devnam = ((const struct DEV *) node)->devnam;
cmp = 0;
while ( keylen-- > 0 ) {
cmp = toupper( *keynam++ ) - toupper( *devnam++ );
if ( cmp != 0 ) {
break;
}
}
if ( cmp == 0 && *devnam != '\0' && *devnam != ':' ) {
cmp = -1;
}
return cmp;
}
/************************************************************ device_lookup() */
/* device_lookup() is to to find devices... */
vmscond_t device_lookup( size_t devlen, char *devnam, int create,
struct DEV **retdev ) {
vmscond_t sts;
size_t devsiz;
register struct DEV *dev;
for ( devsiz = 0; devsiz < devlen; devsiz++ ) {
if ( devnam[devsiz] == ':' ) {
break;
}
}
dev = (struct DEV *) cache_find( (void *) &dev_root, (uint32_t)devsiz, devnam, &sts,
device_compare,
create ? device_create : NULL );
if ( dev == NULL ) {
if ( $MATCHCOND(sts, SS$_ITEMNOTFOUND) ) {
sts = SS$_NOSUCHDEV;
}
} else {
if( retdev == NULL )
device_done( dev );
else
*retdev = dev;
sts = SS$_NORMAL;
}
return sts;
}