home *** CD-ROM | disk | FTP | other *** search
- /* envvar.c -- a collection of routines to modify the parent environment */
- /* Originally coded by "Jim Anderson" <bilbo.jta@SEAS.UCLA.EDU> */
- /* Modified by "David J. Camp" <david%wubios@wucs1.wustl.edu> */
-
- /*
- Routines to maniplate command.com's copy of the environment.
- Must be compiled for a large data model (compact, large or huge).
- Must use -Zp option.
- */
-
- #include <dos.h>
- #include <stddef.h>
- #include <stdio.h>
-
- static
- char far *
- envptr(size)
- int *size;
- {
- struct INT_VEC {
- unsigned short off, seg;
- } far *intvecs;
-
- struct MCB {
- char id;
- unsigned int owner;
- unsigned int size;
- } far *mcb;
-
- struct PSP {
- char pad[0x2c];
- unsigned short envseg;
- } far *psp;
-
- char far *env;
- unsigned int cmdpid;
-
-
- intvecs = (struct INT_VEC far *) 0L;
- cmdpid = intvecs[0x2e].seg;
-
- mcb = (struct MCB far *) ((long)(cmdpid - 1) << 16);
-
- do {
- mcb = (struct MCB far *) (((long)(FP_SEG(mcb) + mcb->size + 1)) << 16);
- } while (mcb->owner != cmdpid && mcb->id == 'M');
-
- if (mcb->owner == cmdpid) {
- env = (char far *) ((long)(FP_SEG(mcb) + 1) << 16);
- *size = mcb->size * 16;
- }
- else {
- fprintf(stderr, "Cannot find command environment\n");
- exit(1);
- }
-
- return env;
- }
-
- int
- msetenv(var,value)
- char *var, *value;
-
- {
- char *env1, *env2;
- char *cp;
- int size;
- int l;
-
- env1 = env2 = envptr(&size);
- l = strlen(var);
- strupr(var);
-
- while (*env2)
- {
- if ((strncmp(var,env2,l) == 0) && (env2[l] == '='))
- {
- cp = env2 + strlen(env2) + 1;
- memcpy (env2, cp, size - (cp - env1));
- }
- else
- {
- env2 += strlen (env2) + 1;
- }
- }
-
- if (strlen(value) == 0)
- return(0);
-
- if (size - (env2 - env1) >= l + strlen(value) + 3)
- {
- strcpy(env2,var);
- strcat(env2,"=");
- strcat(env2,value);
- env2[strlen(env2)+1] = 0;
- return(0);
- }
- return(-1);
- }
-
- char far *
- mgetenv(var)
- char *var;
- {
- int l;
- char *env;
-
- env = envptr(&l);
- l = strlen(var);
- strupr(var);
-
- while (*env) {
- if ((strncmp(env,var,l) == 0) && (env[l] == '='))
- return(env + l + 1);
- env += strlen(env) + 1;
- }
- return(NULL);
- }
-