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

180 lines
6.3 KiB
C

/* 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.
*/
#if !defined( DEBUG ) && defined( DEBUG_DELETECMD )
#define DEBUG DEBUG_DELETECMD
#else
#ifndef DEBUG
#define DEBUG 0
#endif
#endif
#include "cmddef.h"
#ifdef _WIN32
#undef DELETE
#endif
/***************************************************************** dodelete() */
#define delete_log OPT_GENERIC_1
#define delete_confirm OPT_GENERIC_2
qual_t delquals[] = { {"log", delete_log, 0, NV,
"-commands delete qual_log"},
{"nolog", 0, delete_log, NV, NULL },
{"confirm", delete_confirm, 0, NV,
"-commands delete qual_confirm"},
{"noconfirm", 0, delete_confirm, NV, NULL},
{ NULL, 0, 0, NV, NULL }
};
param_t delpars[] = { {"filespec", REQ | NOLIM, FSPEC, NOPA,
"commands delete filespec"},
{ NULL, 0, 0, NOPA, NULL }
};
DECL_CMD(delete) {
vmscond_t sts = 0;
char esa[NAM$C_MAXRSS + 1], rsa[NAM$C_MAXRSS + 1];
struct NAM nam = cc$rms_nam;
struct FAB fab = cc$rms_fab;
options_t options, filecount = 0;
vmscond_t confirm = ODS2_CONFIRM_ALL;
if( $FAILS(sts = checkquals( &options, delete_log, delquals, qualc, qualv )) ) {
return sts;
}
if( options & delete_confirm )
confirm = DELETE_CONFIRM;
--argc;
++argv;
while( ($SUCCESSFUL(sts) ||
$VMS_STATUS_SEVERITY(sts) <= STS$K_WARNING ) && argc-- ) {
nam.nam$l_esa = esa;
nam.nam$b_ess = sizeof(esa) -1;
fab.fab$l_nam = &nam;
fab.fab$l_fna = argv++[0];
fab.fab$b_fns = (uint8_t)strlen(fab.fab$l_fna);
if( $FAILS(sts = sys_parse( &fab )) ) {
printmsg( DELETE_NOTDELETED, 0, fab.fab$l_fna );
sts = printmsg( sts,MSG_CONTINUE, DELETE_NOTDELETED );
break;
}
esa[nam.nam$b_esl] = '\0';
if( !(nam.nam$l_fnb & NAM$M_EXP_VER) ) {
sts = printmsg( $SETFAC(SHR$_DELVER,DELETE), 0 );
break;
}
nam.nam$l_rsa = rsa;
nam.nam$b_rss = sizeof(rsa) -1;
fab.fab$l_fop = 0;
while( TRUE ) {
uint32_t directory;
uint16_t retlen;
struct FAB ffab = cc$rms_fab;
struct RAB rab = cc$rms_rab;
struct XABITM itm = cc$rms_xabitm;
struct item_list xitems[] = {
{ XAB$_UCHAR_DIRECTORY, sizeof(directory), NULL, 0 },
{ 0, 0, NULL, 0 }
};
if( $FAILS(sts = sys_search( &fab )) ) {
if( $MATCHCOND(sts, RMS$_NMF) )
break;
printmsg( DELETE_NOTDELETED, 0,
(nam.nam$b_esl? esa: fab.fab$l_fna) );
sts = printmsg( sts, MSG_CONTINUE, DELETE_NOTDELETED );
break;
}
rsa[nam.nam$b_rsl] = '\0';
if( $MATCHCOND( confirm, DELETE_CONFIRM) )
confirm = confirm_cmd( confirm, rsa );
if( !$MATCHCOND( confirm, ODS2_CONFIRM_ALL ) ) {
if( $MATCHCOND( confirm, ODS2_CONFIRM_YES ) ) {
confirm = DELETE_CONFIRM;
} else if( $MATCHCOND( confirm, ODS2_CONFIRM_NO ) ) {
confirm = DELETE_CONFIRM;
continue;
} else { /* ODS2_CONFIRM_QUIT */
sts = confirm;
break;
}
}
xitems[0].buffer = &directory; xitems[0].retlen = &retlen;
itm.xab$b_mode = XAB$K_SENSEMODE;
itm.xab$l_itemlist = xitems;
ffab.fab$l_xab = &itm;
ffab.fab$l_fna = rsa;
ffab.fab$b_fns = nam.nam$b_rsl;
ffab.fab$b_fac = FAB$M_GET;
if( $FAILS(sys_open( &ffab )) ) {
sts = printmsg( DELETE_OPENIN, 0, rsa );
continue;
}
if( directory ) {
rab.rab$l_fab = &ffab;
if( $FAILS(sts = sys_connect( &rab )) ) {
printmsg( DELETE_OPENIN, 0, rsa );
sts = printmsg( sts, MSG_CONTINUE, DELETE_OPENIN );
} else {
sts = sys_get( &rab );
if( $MATCHCOND( sts, RMS$_EOF ) ) {
sts = SS$_NORMAL;
} else { /* RMS$_RTB if a record exists */
printmsg( DELETE_NOTDELETED, 0, rsa );
sts = printmsg( DELETE_DIRNOTEMPTY, MSG_CONTINUE, DELETE_NOTDELETED );
}
sys_disconnect( &rab );
}
}
sys_close( &ffab );
if( $FAILED(sts) ) {
continue;
}
if( $FAILS(sts = sys_erase(&ffab)) ) {
printmsg( DELETE_NOTDELETED, 0, rsa );
sts = printmsg( sts, MSG_CONTINUE, DELETE_NOTDELETED );
continue;
}
filecount++;
if( options & delete_log )
sts = printmsg( DELETE_DELETED, 0, rsa);
} /* search */
if( $MATCHCOND( sts, ODS2_CONFIRM_QUIT ) )
break;
if( $MATCHCOND(sts, RMS$_NMF) )
sts = SS$_NORMAL;
} /* arg */
if( $SUCCESSFUL(sts) || $MATCHCOND( sts, ODS2_CONFIRM_QUIT ) ) {
if( filecount < 1 )
sts = printmsg( DELETE_NOFILES, 0 );
else if( filecount != 1 )
sts = printmsg( DELETE_NFILES, 0, filecount );
}
fab.fab$b_fns =
fab.fab$b_dns = 0;
nam.nam$b_nop = NAM$M_SYNCHK;
(void) sys_parse( &fab ); /* Discard context */
return sts;
}