From 0935e31ba3e3c9b32b0bf8afce8d41dbeaafde8b Mon Sep 17 00:00:00 2001 From: Timothe Litt Date: Sat, 5 Mar 2016 15:10:17 -0500 Subject: [PATCH] Clean up unix show devices. Add show volumes. Also, clean up virtual devices in mount error paths. Update MOUNT help. --- extracters/ods2/ODS2.exe | Bin 77312 -> 80384 bytes extracters/ods2/access.c | 207 ++++++++++++++++++++++++++++++++++-- extracters/ods2/access.h | 4 + extracters/ods2/makefile.nt | 2 +- extracters/ods2/ods2.c | 42 ++++++-- extracters/ods2/phynt.c | 8 +- extracters/ods2/phyunix.c | 118 ++++++++++---------- extracters/ods2/phyvirt.c | 6 +- extracters/ods2/phyvms.c | 8 +- 9 files changed, 309 insertions(+), 86 deletions(-) diff --git a/extracters/ods2/ODS2.exe b/extracters/ods2/ODS2.exe index 72c17c601b3e64673eed99b643174ee3ae0a827b..2ec3d87bc2006d9ca6107077ef2cfd7df146d2d4 100644 GIT binary patch delta 28651 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 delta 25786 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 ); - exit(1); + abort(); } curvbn += phylen; if (phylen != 0 && curvbn > wcb->loblk) { @@ -790,6 +794,8 @@ unsigned dismount(struct VCB * vcb) vcbdev++; } if (sts & STS$M_SUCCESS) { + struct VCB *lp; + cache_remove(&vcb->fcb->cache); #ifdef DEBUG printf( "--->dismount(): cache_remove()\n" ); @@ -800,6 +806,12 @@ unsigned dismount(struct VCB * vcb) printf( "--->dismount(): cache_delete()\n" ); #endif } + for( lp = (struct VCB *)&vcb_list; lp->next != NULL; lp = lp->next ) { + if( lp->next == vcb ) { + lp->next = vcb->next; + break; + } + } free(vcb); } } @@ -832,6 +844,7 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], if (flags & MOU_WRITE) vcb->status |= VCB_WRITE; vcb->fcb = NULL; vcb->dircache = NULL; + vcb->devices = 0; vcbdev = vcb->vcbdev; for( device = 0; device < devices; device++, vcbdev++ ) { char *dname; @@ -865,7 +878,8 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], vcbdev->dev->access = flags; /* Requested mount options */ /* (e.g., /Write) */ sts = phyio_init( vcbdev->dev ); - if ( !( sts & STS$M_SUCCESS ) ) break; + if ( !( sts & STS$M_SUCCESS ) ) break; + vcb->devices++; if (vcbdev->dev->vcb != NULL) { sts = SS$_DEVMOUNT; break; @@ -930,7 +944,6 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], } /* for(each device) */ } if (sts & STS$M_SUCCESS) { - vcb->devices = devices; vcbdev = vcb->vcbdev; for( device = 0; device < devices; device++, vcbdev++ ) { char *dname; @@ -1017,7 +1030,7 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], if( memcmp(vcbdev->home.hm2$t_volname, volsetSYS[device+1].vsr$t_label, 12 ) != 0 ) { printf( "%%ODS2-E-WRONGVOL, RVN %u of '%12.12s' is '%12.12s'. %s contains '%12.12s'\n", - device+1, vcb->vcbdev[0].home.hm2$t_strucname, + device+1, vcb->vcbdev[0].home.hm2$t_strucname, volsetSYS[device+1].vsr$t_label, dname, vcbdev->home.hm2$t_volname ); sts = SS$_NOSUCHVOL; break; @@ -1083,20 +1096,202 @@ unsigned mount(unsigned flags,unsigned devices,char *devnam[],char *label[], /* if (!(sts & 1)) ??; */ vcbdev->idxfcb->headvioc = NULL; cache_untouch(&vcbdev->idxfcb->cache,0); - vcbdev->dev->vcb = NULL; + vcbdev->dev->vcb = NULL; /* ?? vcbdev->dev = NULL *//* **DECREF **/ + sts = phyio_done( vcbdev->dev ); } cache_remove( &vcb->fcb->cache ); while( vcb->dircache ) cache_delete( (struct CACHE *) vcb->dircache ); } } else { /* *** DECREF *** */ + if( flags & MOU_VIRTUAL ) { + vcbdev = vcb->vcbdev; + for( device = 0; device < vcb->devices; device++, vcbdev++ ) { + phyio_done( vcbdev->dev ); + } + } free(vcb); vcb = NULL; } - if( (sts & 1) && (flags & 2) && VMSWORD(vcb->vcbdev[0].home.hm2$w_rvn) != 0 ) { + if( (sts & 1) && (flags & MOU_LOG) && VMSWORD(vcb->vcbdev[0].home.hm2$w_rvn) != 0 ) { printf ( "%%MOUNT-I-MOUNTEDVS, Volume set %12.12s mounted\n", vcb->vcbdev[0].home.hm2$t_strucname ); } + if( vcb != NULL ) { + vcb->next = vcb_list; + vcb_list = vcb; + } if( volsetSYS != NULL ) free( volsetSYS ); if (retvcb != NULL) *retvcb = vcb; return sts; } + +/***************************************************************** show_volumes */ +/* First, some private helper routines */ + +/********************************************************** print_volhdr */ +static void print_volhdr( int volset, size_t devwid ) { + size_t i; + + if( volset ) + printf( " RVN " ); + else + printf( " " ); + printf( +"%-*s Volume Lvl Clust Owner/CreateDate VolProt/Default FileProt\n", + (int)devwid, "Dev" ); + if( volset ) + printf( " --- " ); + else + printf( " " ); + + for( i= 0; i < devwid; i++ ) + putchar( '-' ); + printf( +" ------------ --- ----- ----------------- ---------------------------\n" ); + + return; +} + +/********************************************************** print_prot() */ +static void print_prot( vmsword code, int vol ) { + static const char grp[4] = { "SOGW" }; + static const char acc[2][4] = {{"RWED"}, {"RWCD"}}; + int g, b, w; + + w = 27; + + for( g = 0; g < 4; g++ ) { + w -= printf( "%c:", grp[g] ); + for( b = 0; b < 4; b++ ) { + if( !(code & (1<<(b + (4*g)))) ) { + putchar( acc[vol][b] ); + w--; + } + } + if( g < 3 ) { + putchar( ',' ); + w--; + } + } + while( w-- ) putchar( ' ' ); +} + +/********************************************************** print_volinf() */ +static void print_volinf( struct VCB *vcb, + size_t devwid, + unsigned device, + size_t wrap ) { + struct VCBDEV *vcbdev; + size_t n; + vmsword timbuf[7]; + + vcbdev = vcb->vcbdev+device; + + for( n = 0; n < strlen( vcbdev->dev->devnam ); n++ ) { + if( vcbdev->dev->devnam[n] == ':' ) + break; + putchar( vcbdev->dev->devnam[n] ); + } + printf( "%*s ", (int)(devwid-n), "" ); + + printf( "%12.12s", vcbdev->home.hm2$t_volname ); + + printf( " %u.%u %5u [%6o,%6o]", + VMSWORD( vcbdev->home.hm2$w_struclev ) >> 8, + VMSWORD( vcbdev->home.hm2$w_struclev ) & 0xFF, + VMSWORD( vcbdev->home.hm2$w_cluster ), + VMSWORD( vcbdev->home.hm2$w_volowner.uic$w_grp ), + VMSWORD( vcbdev->home.hm2$w_volowner.uic$w_mem ) + ); + printf( " " ); + print_prot( VMSWORD( vcbdev->home.hm2$w_protect ), 1 ); + if( !(vcb->status & VCB_WRITE) ) + printf( " write-locked" ); + + printf( "\n%*s ", (int)(wrap+devwid+23), "" ); + + if( sys$numtim( timbuf, vcbdev->home.hm2$q_credate ) & STS$M_SUCCESS ) { + static const char *months = + "-JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-"; + + printf( "%2u%.5s%4u %2u:%2u ", timbuf[2], + months+(4*(timbuf[1]-1)), timbuf[0], + timbuf[3], timbuf[4]); + } else + printf( "%*s", 41-23, "" ); + + print_prot( VMSWORD( vcbdev->home.hm2$w_fileprot ), 0 ); + putchar( '\n' ); +} + +/********************************************************** show_volumes() */ +void show_volumes( void ) { + struct VCB *vcb; + size_t maxd = sizeof( "Dev" ) -1; + int nvol = 0; + unsigned device; + + if( vcb_list == NULL ) { + printf( " No volumes mounted\n" ); + return; + } + + for( vcb = vcb_list; vcb != NULL; vcb = vcb->next ) { + struct VCBDEV *vcbdev; + + if( vcb->devices == 0 ) { + printf( "No devices for volume\n" ); + abort(); + } + nvol++; + vcbdev = vcb->vcbdev; + for( device = 0; device < vcb->devices; device++, vcbdev++ ) { + size_t n; + for( n = 0; n < strlen( vcbdev->dev->devnam ); n++ ) + if( vcbdev->dev->devnam[n] == ':' ) + break; + if( n > maxd ) + maxd = n; + } + } + for( vcb = vcb_list; vcb != NULL; vcb = vcb->next ) { + struct VCBDEV *vcbdev; + unsigned device; + + vcbdev = vcb->vcbdev; + if( VMSWORD(vcbdev->home.hm2$w_rvn) == 0 ) + continue; + + nvol--; + printf( " Volume set %12.12s\n", vcbdev->home.hm2$t_strucname ); + + print_volhdr( TRUE, maxd ); + + for( device = 0; device < vcb->devices; device++, vcbdev++ ) { + printf( " %3d ", VMSWORD(vcbdev->home.hm2$w_rvn) ); + print_volinf( vcb, maxd, device, 8 ); + } + } + if( nvol == 0 ) + return; + + printf( "\n" ); + + print_volhdr( FALSE, maxd ); + for( vcb = vcb_list; vcb != NULL; vcb = vcb->next ) { + struct VCBDEV *vcbdev; + unsigned device; + + vcbdev = vcb->vcbdev; + if( VMSWORD(vcbdev->home.hm2$w_rvn) != 0 ) + continue; + + vcbdev = vcb->vcbdev; + for( device = 0; device < vcb->devices; device++, vcbdev++ ) { + printf( " " ); + print_volinf( vcb, maxd, device, 2 ); + } + } + + return; +} diff --git a/extracters/ods2/access.h b/extracters/ods2/access.h index aaf7c04..5aab745 100644 --- a/extracters/ods2/access.h +++ b/extracters/ods2/access.h @@ -245,6 +245,7 @@ struct VCBDEV { struct HOME home; /* Volume home block */ }; struct VCB { + struct VCB *next; /* Next in mounted volume list (Must be first item) */ unsigned status; /* Volume status */ unsigned devices; /* Number of volumes in set */ struct FCB *fcb; /* File control block tree */ @@ -252,6 +253,9 @@ struct VCB { struct VCBDEV vcbdev[1]; /* List of volumes devices */ }; /* Volume control block */ +extern struct VCB *vcb_list; +void show_volumes( void ); + /* RVN_TO_DEV( vcb, rvn ) - returns device from relative volume number */ /* returns NULL if RVN illegal or device not mounted */ diff --git a/extracters/ods2/makefile.nt b/extracters/ods2/makefile.nt index 986638b..822c6e7 100644 --- a/extracters/ods2/makefile.nt +++ b/extracters/ods2/makefile.nt @@ -5,7 +5,7 @@ CCFLAGS = "-Oxs" # For the direct SCSI module -#DEFS = -DUSE_WNASPI32 +#DEFS = -DUSE_ASPI #LDFLAGS = wnaspi32.lib #PHYSIOH = wnaspi32.h scsidefs.h #LIBS = wnaspi32.lib diff --git a/extracters/ods2/ods2.c b/extracters/ods2/ods2.c index d2cf71b..3aefaff 100644 --- a/extracters/ods2/ods2.c +++ b/extracters/ods2/ods2.c @@ -1444,6 +1444,7 @@ static struct qual showkwds[] = { {"default", 0, 0, NV, "Default directo {"time", 4, 0, NV, "Time"}, {"verify", 5, 0, NV, "Command file echo" }, {"version", 6, 0, NV, "Version"}, + {"volumes", 7, 0, NV, "Mounted volume information" }, {NULL, 0, 0, NV, NULL } }; static struct param showpars[] = { {"item_name", REQ, KEYWD, PA(showkwds), NULL }, @@ -1509,6 +1510,9 @@ unsigned doshow(int argc,char *argv[],int qualc,char *qualv[]) { case 6: show_version(); return SS$_NORMAL; + case 7: + show_volumes(); + return SS$_NORMAL; } return SS$_NORMAL; } @@ -1681,9 +1685,9 @@ static struct qual mouquals[] = { {"image", MOU_VIRTUAL, 0, NV, "Moun {NULL, 0, 0, NV, NULL } }; static struct param moupars[] = { {"volumes", REQ, LIST, NOPA, - "devices or disk image(s) in volume set separated by comma" + "devices or disk image(s) of volume set in RVN order separated by comma" }, - {"labels", OPT, LIST, NOPA, "volume labels separated by comma" }, + {"labels", OPT, LIST, NOPA, "volume labels in RVN order separated by comma" }, { NULL, 0, 0, NOPA, NULL } }; @@ -2006,10 +2010,12 @@ static unsigned dohelp(int argc,char *argv[],int qualc,char *qualv[]) { if( argc <= 1 ) { show_version(); - printf( "\n The orginal version of ods2 was developed by Paul Nankervis \n" ); - printf( " This modified version was developed by Timothe Litt, and incorporated\n" ); - printf( " significant previous modifications by Larry Baker of the USGS and by Hunter Goatley\n" ); - printf("\n Please send problems/comments to litt@ieee.org\n"); + printf( " The orginal version of ods2 was developed by Paul Nankervis\n" ); + printf( " \n" ); + printf( " This modified version was developed by Timothe Litt, and\n" ); + printf( " incorporates significant previous modifications by Larry \n" ); + printf( " Baker of the USGS and by Hunter Goatley\n" ); + printf("\n Please send problems/comments to litt@ieee.org\n\n"); printf(" Commands are:\n"); cmdhelp( cmdset ); @@ -2032,8 +2038,27 @@ static unsigned dohelp(int argc,char *argv[],int qualc,char *qualv[]) { qualhelp( 0, cmd->validquals ); if( cmd->params != NULL ) parhelp( cmd, 0, NULL ); - if( strcmp(cmd->name, "mount") == 0 ) + if( strcmp(cmd->name, "mount") == 0 ) { + printf( "\n" ); + printf( "You can mount a volume(-set) from either physical devices\n" ); + printf( "such a CDROM or hard disk drive, or files containing an\n" ); + printf( "image of a volume, such as a .ISO file or simulator disk\n\n" ); + printf( "To mount a disk image, use the %cimage qualifier and\n", + (vms_qual? '/': '-') ); + printf( "specify the filename as the parameter.\n\n" ); + printf( "If the filename contains %c, specify it in double quotes\n\n", + (vms_qual? '/': '-') ); + printf( "Mount will assign a virtual device name to each volume.\n" ); + printf( "You can select a virtual device name using the format\n" ); + printf( " dka100=my_files.iso\n\n" ); + printf( "To mount a physical device, use the format:\n" ); phyio_help(stdout); + printf( "To mount a volume set, specify all the members in RVN order\n" ); + printf( "as a comma-separated list.\n\n" ); + printf( "If you specify a list of volume labels, they must be in\n" ); + printf( "the same order as the volumes, and each must match the label\n" ); + printf( "stored in the data\n" ); + } return 1; } } @@ -2319,7 +2344,8 @@ int main( int argc,char *argv[] ) { printf("$> %s\n", rl); } ptr = rl; - } else { + } + if( ptr == NULL ) { #ifdef VMS if( getcmd( str, sizeof(str), "$> " ) == NULL ) break; ptr = str; diff --git a/extracters/ods2/phynt.c b/extracters/ods2/phynt.c index 16151f3..bbdd9f7 100644 --- a/extracters/ods2/phynt.c +++ b/extracters/ods2/phynt.c @@ -803,17 +803,15 @@ void phyio_show( showtype_t type ) { /*************************************************************** phyio_help() */ void phyio_help(FILE *fp ) { - fprintf( fp, "Specify the device to be mounted as a drive letter.\n" ); - fprintf( fp, "E.g. mount D:\n" ); + fprintf( fp, " mount D:\n" ); + fprintf( fp, "Any drive letter mapped to a physical drive can be used\n" ); #ifdef USE_ASPI fprintf( fp, "If the drive letter is C: or higher, commands are\n" ); fprintf( fp, "sent directly to the drive, bypassing system drivers.\n" ); fprintf( fp, "The drive must be a SCSI device\n" ); #endif - fprintf( fp, "The drive letter must be between A: and Z:.\n" ); fprintf( fp, "The drive is accessed as a physical device, which may require privileges.\n" ); - fprintf( fp, "Use show DEVICES for a list of available devices.\n" ); - fprintf( fp, "Use ODS2-Image to work with disk images such as .ISO or simulator files.\n" ); + fprintf( fp, "For a list of devices, see SHOW DEVICES\n\n" ); return; } diff --git a/extracters/ods2/phyunix.c b/extracters/ods2/phyunix.c index 756d575..d7ed90c 100644 --- a/extracters/ods2/phyunix.c +++ b/extracters/ods2/phyunix.c @@ -81,26 +81,28 @@ static int devcmp( const void *d1, const void *d2 ) { static void showdevs( void ) { DIR *dirp; - struct dirent *dp; size_t i, cpl, n = 0, max = 0; struct devdat (*list)[1] = NULL; - if( (dirp = opendir( DEV_PREFIX )) == NULL ) - return; - - do { - struct stat stb; - errno = 0; - if( (dp = readdir(dirp)) != NULL ) { - char *fs; + errno = 0; + if( (dirp = opendir( DEV_PREFIX )) != NULL ) { + do { + int nml; size_t len; + unsigned unit; + char *fs; + struct dirent *dp; + struct devdat (*nl)[1]; + struct stat stb; + + errno = 0; + if( (dp = readdir(dirp)) == NULL ) + break; len = strlen( dp->d_name ); fs = malloc( sizeof( DEV_PREFIX ) + len ); - if( fs == NULL ) { - perror( "malloc" ); - exit( 1 ); - } + if( fs == NULL ) + break; memcpy( fs, DEV_PREFIX, sizeof( DEV_PREFIX ) -1 ); memcpy( fs + sizeof( DEV_PREFIX ) -1, dp->d_name, len +1 ); @@ -109,64 +111,61 @@ static void showdevs( void ) { free( fs ); continue; } - if( S_ISBLK( stb.st_mode ) ) { - struct devdat (*nl)[1]; - unsigned unit = ~0; - int nml; - struct devdat *devp; + if( !S_ISBLK( stb.st_mode ) ) + continue; - if( sscanf( fs, DEV_PREFIX "%*[^0123456789]%n%u", - &nml, &unit ) == 1 ) { - fs[nml] = '\0'; - } - for( i = 0; i < n; i++ ) { - devp = (*list)+i; - if( strcmp( devp->name, fs ) == 0 ) { - if( unit != ~0U ) { - if( unit > devp->high ) - devp->high = unit; - if( unit < devp->low ) - devp->low = unit; - } - break; + memmove( fs, fs + sizeof( DEV_PREFIX ) -1, len +1 ); + unit = ~0; + if( sscanf( fs, "%*[^0123456789]%n%u", &nml, &unit ) == 1 ) + fs[nml] = '\0'; + for( i = 0; i < n; i++ ) { + if( strcmp( (*list)[i].name, fs ) == 0 ) { + if( unit != ~0U ) { + if( unit > (*list)[i].high ) + (*list)[i].high = unit; + if( unit < (*list)[i].low ) + (*list)[i].low = unit; } - } - if( i >= n ) { - nl = (struct devdat (*)[1]) realloc( list, (n+1) * sizeof( struct devdat ) ); - if( nl == NULL ) { - for( i = 0; i < n; i++ ) - free( (*list)[i].name ); - free( list ); - perror( "malloc" ); - exit( 1 ); - } - list = nl; - (*list)[n].name = fs; - (*list)[n].low = unit; - (*list)[n++].high = unit; + break; } } - } - } while( dp != NULL ); + if( i >= n ) { + nl = (struct devdat (*)[1]) + realloc( list, (n+1) * sizeof( struct devdat ) ); + if( nl == NULL ) + break; + list = nl; + (*list)[n].name = fs; + (*list)[n].low = unit; + (*list)[n++].high = unit; + } + } while( TRUE ); + (void) closedir(dirp); + } if( errno != 0 ) { printf( "%%ODS2-W-DIRERR, Error reading %s\n", DEV_PREFIX ); perror( " - " ); + for( i = 0; i < n; i++ ) + free( (*list)[i].name ); + free( list ); + return; } - (void) closedir(dirp); + if( n == 0 ) { printf( "%%ODS2-I-NODEV, No devices found\n" ); return; } qsort( list, n, sizeof( struct devdat ), &devcmp ); + for( i = 0; i < n; i++ ) { char buf[128]; int p; - p = snprintf( buf, sizeof(buf), "%s", (*list)[i].name + sizeof( DEV_PREFIX)-1 ); + p = snprintf( buf, sizeof(buf), "%s", (*list)[i].name ); if( (*list)[i].low != ~0U ) { - p+= snprintf( buf+p, sizeof(buf)-p, "%u", (*list)[i].low ); + p += snprintf( buf+p, sizeof(buf)-p, "%u", (*list)[i].low ); if( (*list)[i].high != (*list)[i].low ) - p+= snprintf( buf+p, sizeof(buf)-p, "-%u", (*list)[i].high ); + p += snprintf( buf+p, sizeof(buf)-p, "-%u", (*list)[i].high ); } if( p > (int)max ) max = p; @@ -174,14 +173,16 @@ static void showdevs( void ) { cpl = 50 / (max + 1); if( cpl == 0 ) cpl = 1; + for( i = 0; i < n; i++ ) { int p; if( (i % cpl) == 0 ) { if( i ) putchar( '\n' ); putchar( ' ' ); } - p = printf( " %s", (*list)[i].name + sizeof( DEV_PREFIX)-1 ) -1; + p = printf( " %s", (*list)[i].name ) -1; free( (*list)[i].name ); + if( (*list)[i].low != ~0U ) { p += printf( "%u", (*list)[i].low ); if( (*list)[i].high != (*list)[i].low ) @@ -217,14 +218,11 @@ void phyio_show( showtype_t type ) { } void phyio_help(FILE *fp ) { - fprintf( fp, "Specify the device to be mounted as using the format:\n" ); - fprintf( fp, " mount %s%s\n\n", DEV_PREFIX, "device" ); - + fprintf( fp, " mount device\nThe device must be in %.*s.\n\n", + (int)(sizeof( DEV_PREFIX ) -2), DEV_PREFIX ); fprintf( fp, "For example, if you are using " DEV_PREFIX "%s\n", "cdrom0" ); - fprintf( fp, " ODS2$> mount cdrom0\n\n" ); - - fprintf( fp, "Use ODS2-Image to work with disk images such as .ISO or simulator files.\n" ); - fprintf( fp, "Alternatively, you can mount the image on a loop device.\n" ); + fprintf( fp, " ODS2$> mount cdrom0\n" ); + fprintf( fp, "For a list of devices, see SHOW DEVICES\n\n" ); return; } diff --git a/extracters/ods2/phyvirt.c b/extracters/ods2/phyvirt.c index 79526b1..0d0274c 100644 --- a/extracters/ods2/phyvirt.c +++ b/extracters/ods2/phyvirt.c @@ -37,7 +37,7 @@ static struct VDEV { char *path; } *virt_device_list = NULL; -static int virt_compare( unsigned keylen, const char *keynam, +static int virt_compare( unsigned keylen, const char *keynam, const char *devnam ); static struct VDEV *virt_insert( const char *devnam, unsigned devsiz, const char *path ); @@ -82,7 +82,7 @@ void virt_show( const char *devnam ) { for ( vp = virt_device_list; vp != NULL; vp = vp->next ) { n = strlen( vp->path ); printf( " %-*s %.*s\n", (int)maxd, vp->devnam, (int)maxp, - (n > 64)? vp->path+(n-64): vp->path ); + (n > maxp)? vp->path+(n-maxp): vp->path ); } } else { devlen = strlen( devnam ); @@ -164,7 +164,7 @@ unsigned virt_device( char *devnam, char **vname ) { if( (p = strchr( devnam, '=' )) != NULL ) { *p = '\0'; - path = p+1; + path = ++p; } else { path = devnam; devnam = autodev(); diff --git a/extracters/ods2/phyvms.c b/extracters/ods2/phyvms.c index 8e01bf7..88ac8aa 100644 --- a/extracters/ods2/phyvms.c +++ b/extracters/ods2/phyvms.c @@ -110,10 +110,12 @@ void phyio_show( showtype_t type ) { } void phyio_help(FILE *fp ) { - fprintf( fp, "Specify the device to be mounted as a VMS device or logical name\n" ); - fprintf( fp, "E.g. mount DUB0:\n" ); + fprintf( fp, "mount DUB0:\n" ); + fprintf( fp, "The device can be specified as a physical device or logical name\n" ); fprintf( fp, "You will need the LOGIO privilege\n" ); - fprintf( fp, "Use ODS2-Image to work with disk images such as .ISO or simulator files.\n" ); + fprintf( fp, "Use show DEVICES for a list of available devices.\n" ); + fprintf( fp, "For a list of devices, use the DCL SHOW DEVICE command.\n\n" ); + return; }