/*----------------------------------------------------------------*/ /* trappmc.c 10/31/2011 Keven Miller kevenm@3kranger.com */ #pragma list off /*---------------------------------------------------------------- This demo program shows how to determine if the running program has PM capability. The WHO intrinsic returns the caps of the user running a program; not the program itself. Set a system trap when calling GETPRIVMODE which requires PM, and set indicator flag. Build setvar ccopts "-Aa +e +w1" ccxllk trappmc.c, trappm.pub Example run :trappm.pub PM=0 :trappm.pub -v [trappm] code 1003 intr 200 err 2 parm 0 PM=0 : :linkedit "altprog trappm.pub;cap=pm" HP Link Editor/iX (HP30315A.06.17) Copyright Hewlett-Packard Co 1986 LinkEd> altprog trappm.pub;cap=pm :trappm.pub PM=1 :trappm.pub -v PM=1 ------------------------------------------------------------------*/ #include /* printf */ #pragma intrinsic GETPRIVMODE #pragma intrinsic XSYSTRAP typedef int s32; typedef unsigned int u32; #define proc /*----------------------------------------------------------------*/ int trap_nopm; int trap_view; proc void trappm (s32 code, s32 intr, s32 err, s32 parm) { if ( trap_view ) printf ( "[trappm] code %d intr %d err %d parm %d\n", code, intr, err, parm ); if ( code == 1003 && /* */ intr == 200 && /* GETPRIVMODE intrinsic (set 5 msg 200)*/ err == 2 ) /* ILLEGAL CAPABILITY (set 6 msg 2)*/ { trap_nopm = 1; } } /*----------------------------------------------------------------*/ proc int pm_required_func () { int old; /* check for PM cap */ /* set a system trap to check for failed GETPRIVMODE, and set flag */ /* No need to call GETUSERMODE since return from procedure does that */ XSYSTRAP ( (int) &trappm, &old ); /* Set PM trap */ trap_nopm = 0; /* clear trap flag */ GETPRIVMODE (); /* PM Test */ XSYSTAP ( old, &old ); /* reset trap */ if ( ! trap_nopm ) { /* Do PM stuff */ } return ( trap_nopm ? 0 : 1 ); } /*----------------------------------------------------------------*/ proc int main ( int ac, char *av [] ) { int x; char *cp; for ( x = 1; x < ac; ++x ) { cp = av [x]; if ( '-' == *cp ) { ++cp; while (*cp) { switch (*cp++) { case 'v': trap_view = 1; break; case '?': printf ( "Usage: %s [options]\n", av [0] ); printf ( " -v verbose\n" ); break; default: printf ( "Unknown option: %c\n", cp [-1] ); } } continue; } } printf ( "PM=%d\n", pm_required_func () ); return 0; } /*----------------------------------------------------------------*/