mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-29 13:29:20 +00:00
432 lines
8.5 KiB
C
432 lines
8.5 KiB
C
|
/*
|
||
|
* Tests implemented by Devin Reade
|
||
|
*
|
||
|
* $Id: environ.c,v 1.1 1997/02/28 05:12:57 gdr Exp $
|
||
|
*
|
||
|
* This file has been formatted with tab stops every 8 columns.
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <assert.h>
|
||
|
#include <types.h>
|
||
|
#include <shell.h>
|
||
|
#include <errno.h>
|
||
|
|
||
|
#define NONE_SET 0x00
|
||
|
#define UNIX_SET 0x01
|
||
|
#define ORCA_SET 0x02
|
||
|
#define BOTH_SET 0x03
|
||
|
|
||
|
extern char **environ;
|
||
|
|
||
|
static char *string1="testname";
|
||
|
static char *string2="testvalue";
|
||
|
static char *string3="testname=testvalue";
|
||
|
int use_environ;
|
||
|
|
||
|
/*
|
||
|
* void print_Unix_environ (void);
|
||
|
*
|
||
|
* Pre: none.
|
||
|
*
|
||
|
* Post: the environment residing in the environ structure is printed
|
||
|
* to stdout.
|
||
|
*/
|
||
|
|
||
|
void
|
||
|
print_Unix_environ (void) {
|
||
|
char **e, *s;
|
||
|
const char *fname = "print_Unix_environ";
|
||
|
|
||
|
if (!environ) {
|
||
|
printf("%s: environ is NULL\n", fname);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
e = environ;
|
||
|
if (*e==NULL) {
|
||
|
printf("%s: environment is empty\n", fname);
|
||
|
}
|
||
|
while (*e != NULL) {
|
||
|
s = *e;
|
||
|
if (*s == (char)NULL) {
|
||
|
printf("%s: entry of zero length\n", fname);
|
||
|
} else {
|
||
|
printf("%s\n",s);
|
||
|
}
|
||
|
e++;
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* void print_Orca_environ (void);
|
||
|
*
|
||
|
* Pre: none.
|
||
|
*
|
||
|
* Post: the environment residing internal to the shell is printed to stderr.
|
||
|
* It's not terribly efficient, but then it doesn't have to be ;)
|
||
|
*/
|
||
|
|
||
|
void
|
||
|
print_Orca_environ (void) {
|
||
|
|
||
|
static ReadIndexedGSPB parmBuffer;
|
||
|
static ResultBuf255 nameBuffer, valueBuffer;
|
||
|
static char *fname = "print_Orca_environ";
|
||
|
char *entry;
|
||
|
unsigned int nameLength, valueLength;
|
||
|
|
||
|
/*
|
||
|
* initialize the parameter block
|
||
|
*/
|
||
|
|
||
|
parmBuffer.pCount = 4;
|
||
|
parmBuffer.index = 1;
|
||
|
nameBuffer.bufSize = sizeof (GSString255);
|
||
|
valueBuffer.bufSize = sizeof (GSString255);
|
||
|
parmBuffer.name = &nameBuffer;
|
||
|
parmBuffer.value = &valueBuffer;
|
||
|
|
||
|
/* loop until we've got them all */
|
||
|
ReadIndexedGS (&parmBuffer);
|
||
|
nameLength = nameBuffer.bufString.length;
|
||
|
while (nameLength != 0) {
|
||
|
valueLength = valueBuffer.bufString.length;
|
||
|
|
||
|
/* allocate the new environ entry */
|
||
|
entry = malloc (nameLength + valueLength + 2);
|
||
|
if (entry == NULL) {
|
||
|
printf("malloc failed in %s: %s\n", fname,
|
||
|
strerror(errno));
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
/* copy the name and value */
|
||
|
strncpy (entry, nameBuffer.bufString.text, nameLength);
|
||
|
entry[nameLength] = (char) NULL;
|
||
|
strcat (entry, "=");
|
||
|
strncat (entry, valueBuffer.bufString.text, valueLength);
|
||
|
entry[nameLength + valueLength + 1] = (char) NULL;
|
||
|
|
||
|
printf("%s\n",entry);
|
||
|
free(entry);
|
||
|
|
||
|
/* get the next shell variable and continue ... */
|
||
|
parmBuffer.index++;
|
||
|
ReadIndexedGS (&parmBuffer);
|
||
|
nameLength = nameBuffer.bufString.length;
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
unsigned int
|
||
|
test_environ (void) {
|
||
|
|
||
|
unsigned int unix_set = 0;
|
||
|
unsigned int orca_set = 0;
|
||
|
char *s;
|
||
|
char **e;
|
||
|
|
||
|
/* test unix version */
|
||
|
if (use_environ) {
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
printf("\n\nUnix environment:\n\n");
|
||
|
print_Unix_environ ();
|
||
|
printf("\n\n");
|
||
|
#endif
|
||
|
|
||
|
e = environ;
|
||
|
while (e && *e) {
|
||
|
if (strncmp(*e,string3,strlen(string3)) == 0) {
|
||
|
unix_set = UNIX_SET;
|
||
|
}
|
||
|
e++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* test Orca version */
|
||
|
if (getenv(string1) != NULL) {
|
||
|
orca_set = ORCA_SET;
|
||
|
}
|
||
|
|
||
|
return (unix_set | orca_set);
|
||
|
}
|
||
|
|
||
|
|
||
|
int
|
||
|
main (int argc, char **argv) {
|
||
|
|
||
|
int i=1; /* the number of the test */
|
||
|
unsigned int result;
|
||
|
|
||
|
if (argc > 1) {
|
||
|
use_environ = 1;
|
||
|
} else {
|
||
|
use_environ = 0;
|
||
|
printf("NOT ");
|
||
|
}
|
||
|
printf("using environ global variable\n");
|
||
|
|
||
|
/*
|
||
|
* initial Test 1:1
|
||
|
*/
|
||
|
|
||
|
result = test_environ();
|
||
|
if (result != NONE_SET) {
|
||
|
printf("Please unset the variable \"%s\" for this test.\n",
|
||
|
string1);
|
||
|
return -1;
|
||
|
}
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
|
||
|
#define FAIL(fmt) { printf(fmt, i, string1); exit(1); }
|
||
|
|
||
|
/*
|
||
|
* environInit(); Test :2
|
||
|
*/
|
||
|
|
||
|
if (use_environ) {
|
||
|
environInit();
|
||
|
result = test_environ();
|
||
|
switch (result) {
|
||
|
case BOTH_SET: FAIL("Test %d failed. %s prematurely set\n");
|
||
|
case ORCA_SET: FAIL("Test %d failed. %s set internally\n");
|
||
|
case UNIX_SET: FAIL("Test %d failed. %s set in environ\n");
|
||
|
case NONE_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
default:
|
||
|
printf("Test internal error: test %d returned %ud\n",
|
||
|
i, result);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* setenv(); Test 2:3
|
||
|
*/
|
||
|
|
||
|
if (setenv(string1,string2,1) != 0) {
|
||
|
printf("Test %d: setenv() failed\n",i);
|
||
|
return -1;
|
||
|
}
|
||
|
result = test_environ();
|
||
|
if (use_environ) {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case ORCA_SET:
|
||
|
FAIL("Test %d failed. %s not set in environ\n");
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
printf("Test internal error: test %d returned %ud\n",
|
||
|
i, result);
|
||
|
return -1;
|
||
|
}
|
||
|
} else {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
FAIL("Test %d failed. %s set in environ\n");
|
||
|
case ORCA_SET:
|
||
|
printf("Test %d passed.\n", i);
|
||
|
i++;
|
||
|
break;
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s set in environ, not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
printf("Test internal error: test %d returned %ud\n",
|
||
|
i, result);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* unsetenv() Test 3:4
|
||
|
*/
|
||
|
|
||
|
unsetenv(string1);
|
||
|
result = test_environ();
|
||
|
if (use_environ) {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
FAIL("Test %d failed. %s set\n");
|
||
|
case ORCA_SET:
|
||
|
FAIL("Test %d failed. %s set internally\n");
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s set in in environ\n");
|
||
|
case NONE_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
default:
|
||
|
printf("Test internal error: test %d returned %ud\n",
|
||
|
i, result);
|
||
|
return -1;
|
||
|
}
|
||
|
} else {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
FAIL("Test %d failed. %s set\n");
|
||
|
case ORCA_SET:
|
||
|
FAIL("Test %d failed. %s set internally\n");
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s set in environ\n");
|
||
|
case NONE_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
default:
|
||
|
printf("Test internal error: test %d returned %ud\n",
|
||
|
i, result);
|
||
|
return -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* environPush() Test 4:5 bork
|
||
|
*/
|
||
|
|
||
|
if (setenv(string1,string2,1) != 0) {
|
||
|
printf("Test %d: setenv() failed\n",i);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (environPush() != 0) {
|
||
|
printf("Test %d: environPush() failed\n",i);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
result = test_environ();
|
||
|
if (use_environ) {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case ORCA_SET:
|
||
|
FAIL("Test %d failed. %s not set in environ\n");
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
} else {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
FAIL("Test %d failed. %s set in environ\n");
|
||
|
case ORCA_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s set in environ, not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* environPop() Test 5:6
|
||
|
*/
|
||
|
|
||
|
unsetenv(string1);
|
||
|
environPop();
|
||
|
result = test_environ();
|
||
|
if (use_environ) {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case ORCA_SET:
|
||
|
FAIL("Test %d failed. %s not set in environ\n");
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
} else {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
FAIL("Test %d failed. %s set in environ\n");
|
||
|
case ORCA_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s set in environ, not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* putenv() Test 6:7
|
||
|
*/
|
||
|
|
||
|
unsetenv(string1);
|
||
|
if (putenv(string3) != 0) {
|
||
|
printf("Test %d: putenv() failed\n",i);
|
||
|
return -1;
|
||
|
}
|
||
|
result = test_environ();
|
||
|
if (use_environ) {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case ORCA_SET:
|
||
|
FAIL("Test %d failed. %s not set in environ\n");
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
} else {
|
||
|
switch (result) {
|
||
|
case BOTH_SET:
|
||
|
FAIL("Test %d failed. %s set in environ\n");
|
||
|
case ORCA_SET:
|
||
|
printf("Test %d passed.\n",i);
|
||
|
i++;
|
||
|
break;
|
||
|
case UNIX_SET:
|
||
|
FAIL("Test %d failed. %s set in environ, not set internally\n");
|
||
|
case NONE_SET:
|
||
|
FAIL("Test %d failed. %s not set\n");
|
||
|
default:
|
||
|
assert(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unsetenv(string1);
|
||
|
printf("Tests done.\n");
|
||
|
return 0;
|
||
|
}
|