/*----------------------------------------------------------------*/ /* cputenv.c Keven Miller 01 May 2011 */ /* CCOPTS "-Aa -C +w1 +O2" */ /*----------------------------------------------------------------*/ #pragma list off #include "cstd" #define _MPEXL_SOURCE #include #include #pragma intrinsic HPCIDELETEVAR #pragma intrinsic HPCIPUTVAR /*----------------------------------------------------------------*/ proc int putenv ( char *env ) { register int err; s32 len; s16 stat [2]; char *cp; if ( ! env ) { err = EINVAL; stat [0] = stat [1] = 0; } else { cp = strchr ( env, '=' ); if ( ! cp ) { HPCIDELETEVAR ( env, stat ); switch (stat [0]) { case 0: err = 0; break; case -8106: err = ENOENT; break; case -8110: case -8117: case -8125: case -8156: err = EINVAL; break; default: err = ESYSERR; } } /* 8106 Variable not found in variable table. (CIERR 8106) */ /* 8110 Invalid variable name. (CIERR 8110) */ /* 8115 Assignment to variable not allowed: readonly. (CIERR 8115) */ /* 8117 Permanent variable: no deletion done. (CIERR 8117) */ /* 8125 A variable name cannot be a valid JCW value. (CIERR 8125) */ /* 8126 JCW variable reclassified as a standard variable. (CIWARN 8126) */ /* 8135 Expected an integer in the range 0..65535. (CIERR 8135) */ /* 8156 The variable name exceeds 255 characters. (CIERR 8156) */ else { ++cp; len = strlen (cp); HPCIPUTVAR ( env, stat, 2, cp, 11, &len ); switch (stat [0]) { case 0: case -8126: err = 0; break; case -8135: err = ERANGE; break; case -8110: case -8115: case -8125: case -8156: err = EINVAL; break; default: err = ESYSERR; } } } if (err) { errno = err; _mpe_errno = stat [0]; _mpe_status.decode.error_num = stat [0]; _mpe_status.decode.subsys_num = stat [1]; } return err; } /*----------------------------------------------------------------*/ #ifdef TEST #undef TEST #include #pragma intrinsic GETINFO extern char* getenv (); proc int main ( int ac, char *av[] ) { int x; s16 ilen; char *cp, putstr [500]; ilen = sizeof (putstr) -1; GETINFO ( putstr, &ilen ); putstr [ilen] = 0; cp = getenv (putstr); printf ( "%p %s\n", cp, ( cp ? cp : "" )); errno = 0; _mpe_status.decode.error_num = 0; x = putenv (putstr); printf ( "put %d errno %d %s mpe %d intr %d stat %d %d\n", x, errno, strerror(errno), _mpe_errno, _mpe_intrinsic, _mpe_status.decode.error_num, _mpe_status.decode.subsys_num ); cp = getenv (putstr); printf ( "%p %s\n", cp, ( cp ? cp : "" )); } #endif /*----------------------------------------------------------------*/