aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2019-12-31 22:30:29 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2019-12-31 22:30:29 -0500
commit263bd26d281a530b78b56d298c29ffa368b0b981 (patch)
tree0c739765dc9f917ce8725aa9aeb84799967562e7 /src
parent5126cdc3c7385f01fe0839d63e2621914812dd26 (diff)
downloadspmc-263bd26d281a530b78b56d298c29ffa368b0b981.tar.gz
Update README.md
* Add environment.c
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/environment.c77
-rw-r--r--src/spm.c2
3 files changed, 79 insertions, 2 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8981122..0d53e9b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,7 +3,7 @@ include_directories(
${CMAKE_BINARY_DIR}/include
)
-add_executable(spm spm.c config.c compat.c deps.c fs.c rpath.c find.c shell.c archive.c strings.c relocation.c install.c config_global.c manifest.c checksum.c extern/url.c version_spec.c spm_build.c mime.c internal_cmd.c)
+add_executable(spm spm.c config.c compat.c deps.c fs.c rpath.c find.c shell.c archive.c strings.c relocation.c install.c config_global.c manifest.c checksum.c extern/url.c version_spec.c spm_build.c mime.c internal_cmd.c environment.c)
target_link_libraries(spm rt crypto ssl curl)
if(MSVC)
diff --git a/src/environment.c b/src/environment.c
new file mode 100644
index 0000000..d338e4a
--- /dev/null
+++ b/src/environment.c
@@ -0,0 +1,77 @@
+/**
+ * @file environment.c
+ */
+#include "spm.h"
+
+/**
+ *
+ * @param env
+ */
+void runtime_export(char **env) {
+ char *borne[] = {
+ "bash",
+ "dash",
+ "zsh",
+ NULL,
+ };
+ char *unborne[] = {
+ "csh"
+ "tcsh",
+ NULL,
+ };
+
+ char output[BUFSIZ];
+ char export_command[7]; // export=6 and setenv=6... convenient
+ char *_sh = getenv("SHELL");
+ char *sh = basename(_sh);
+ if (sh == NULL) {
+ fprintf(stderr, "echo SHELL environment variable is not defined");
+ exit(1);
+ }
+
+ for (size_t i = 0; borne[i] != NULL; i++) {
+ if (strcmp(sh, borne[i]) == 0) {
+ strcpy(export_command, "export");
+ break;
+ }
+ }
+ for (size_t i = 0; unborne[i] != NULL; i++) {
+ if (strcmp(sh, unborne[i]) == 0) {
+ strcpy(export_command, "setenv");
+ break;
+ }
+ }
+
+ for (size_t i = 0; env[i] != NULL; i++) {
+ char **pair = split(env[i], "=");
+ sprintf(output, "%s %s=\"%s\"", export_command, pair[0], pair[1] ? pair[1] : "");
+ puts(output);
+ split_free(pair);
+ }
+}
+
+/**
+ *
+ * @param env
+ * @return
+ */
+char **runtime_copy(char **env) {
+ char **envp = NULL;
+ size_t env_count;
+ for (env_count = 0; env[env_count] != NULL; env_count++);
+
+ envp = (char **)calloc(env_count + 1, sizeof(char *));
+ for (size_t i = 0; i < env_count; i++) {
+ size_t len = strlen(env[i]);
+ envp[i] = (char *)calloc(len + 1, sizeof(char));
+ memcpy(envp[i], env[i], len);
+ }
+ return envp;
+}
+
+void runtime_free(char **env) {
+ for (size_t i = 0; env[i] != NULL; i++) {
+ free(env[i]);
+ }
+ free(env);
+} \ No newline at end of file
diff --git a/src/spm.c b/src/spm.c
index 5759688..09538eb 100644
--- a/src/spm.c
+++ b/src/spm.c
@@ -24,7 +24,7 @@ void usage(const char *program_name) {
, program_name);
}
-int main(int argc, char *argv[]) {
+int main(int argc, char *argv[], char *arge[]) {
char program_name[strlen(argv[0]) + 1];
memset(program_name, '\0', sizeof(program_name) + 1);
strcpy(program_name, basename(argv[0]));