Files
CS361-Computer-Systems-II/p1-sh/utils/env.c
T

66 lines
1.3 KiB
C
Raw Normal View History

2026-05-31 14:34:00 -04:00
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static void usage (void);
bool
is_util (char *str)
{
char *utils[] = { "./bin/cat", "./bin/chmod", "./bin/cut", "./bin/env",
"./bin/head", "./bin/ls", "./bin/repeat" };
for (size_t i = 0; i < 7; i++)
{
if (strcmp (str, utils[i]) == 0)
{
return true;
}
}
return false;
}
int
main (int argc, char *argv[], char *envp[])
{
size_t envp_count = 0;
while (envp[envp_count] != NULL) envp_count++;
size_t env_args = 0;
char* util = NULL;
for (size_t i = 1; i < argc; i++)
{
if (is_util (argv[i])) {
util = argv[i];
break;
}
env_args++;
}
if (util == NULL) {
usage();
exit(EXIT_FAILURE);
}
char **combined_envp = calloc (envp_count + env_args + 1, sizeof (char *));
memcpy (combined_envp, envp, envp_count * sizeof (char *));
memcpy (combined_envp + envp_count, &argv[1], env_args * sizeof (char *));
combined_envp[envp_count + env_args] = NULL;
execve(util, &argv[env_args + 1], combined_envp);
return EXIT_SUCCESS;
}
static void
usage (void)
{
printf ("env, set environment variables and execute program\n");
printf ("usage: env [name=value ...] PROG ARGS\n");
}