diff --git a/.gitignore b/.gitignore index 8693bb1..e56305c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ # Build artifacts -backup +update diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..462e736 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +update: + gcc -ansi -o update update.c diff --git a/update.c b/update.c new file mode 100644 index 0000000..377b026 --- /dev/null +++ b/update.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include + +int command_builder(char *command, char **args) { + char *tmp_command = malloc(strlen(command)); + memcpy(tmp_command, command, strlen(command)); + char *tmp_token; + size_t index = 0; + + if (tmp_command == NULL) { return 1; } + + tmp_token = strtok(tmp_command, " "); + while(tmp_token != NULL) { + args[index] = malloc(strlen(tmp_token)); + memcpy(args[index], tmp_token, strlen(tmp_token)); + tmp_token = strtok(NULL, " "); + index++; + } + free(tmp_command); + args[index++] = NULL; + return 0; +} + +int run_cmd_and_wait(char *command) { + char **args = malloc(strlen(command)); + int ret = command_builder(command, args); + if (ret != 0) { + return 1; + } + + signed int pid = fork(); + int status; + + if (pid == -1) { + fprintf(stderr, "Couldn't fork. Error = %s\n", strerror(errno)); + return 1; + } else if (pid > 0) { + waitpid(pid, &status, 0); + } else { + execvp(args[0], args); + } + free(args); + + return status; +} + +int main() { + FILE *os_release = fopen("/etc/os-release", "r"); + if (!os_release) { + fprintf(stderr, "Couldn't open os-release. Error = %s\n", strerror(errno)); + } + char buffer[1024]; + while (fgets(buffer, sizeof buffer, os_release)) { + if (strncmp(buffer, "NAME=", 5) == 0) { + memmove(buffer, buffer + 6, (sizeof buffer) - 6); + buffer[strcspn(buffer, "\"")] = '\0'; + break; + } + } + int ret; + char *args[100]; + if (strcmp(buffer, "EndeavourOS") == 0) { + ret = run_cmd_and_wait("yay"); + } else if (strcmp(buffer, "Debian") == 0) { + ret = run_cmd_and_wait("apt update"); + if (ret != 0) { + return ret; + } + ret = run_cmd_and_wait("apt upgrade"); + } else if (strcmp(buffer, "FreeBSD") == 0) { + ret = run_cmd_and_wait("pkg update"); + if (ret != 0) { + return ret; + } + ret = run_cmd_and_wait("pkg upgrade"); + } else { + fprintf(stderr, "OS %s not suported\n", buffer); + return 1; + } + return ret; +}