From ee7d8d9aa6fd3af307558e87d9312c3e113f7f39 Mon Sep 17 00:00:00 2001 From: hornet Date: Wed, 2 Oct 2024 19:22:39 +0000 Subject: [PATCH] uploaded source code --- main.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 main.c diff --git a/main.c b/main.c new file mode 100644 index 0000000..b21cd14 --- /dev/null +++ b/main.c @@ -0,0 +1,146 @@ +/* +defcon-chan: a simple C program that fetches current/last known DEFCON level into your terminal! + +requirements: libcurl + +compiling w/ GCC: gcc main.c -o defcon -lcurl + +running: ./defcon + +author: hornetmaidan +*/ + +#include +#include +#include +#include +#include + +#define URL "https://defconwarningsystem.com/code.dat" +#define FILENAME ".defcon.txt" // saves the last known DEFCON level into a local file(hidden for aesthetic purposes) + +// ANSI colors +#define COLOR_RESET "\033[0m" +#define COLOR_RED "\033[31m" +#define COLOR_GREEN "\033[32m" +#define COLOR_YELLOW "\033[33m" +#define COLOR_BLUE "\033[34m" +#define COLOR_MAGENTA "\033[35m" +#define COLOR_CYAN "\033[36m" +#define COLOR_WHITE "\033[37m" +#define COLOR_BLINK "\033[5m" + +// write callback function for curl handler + +size_t write_data(void *ptr1, size_t size, size_t nmemb, FILE *stream) { + size_t written = fwrite(ptr1, size, nmemb, stream); + return written; +} + +int main(void) { + + CURL *curl; + CURLcode result; + FILE *fp; + + char last_known[256] = "N/A"; + char failsafe[256] = "N/A"; + + curl = curl_easy_init(); + + // load cached DEFCON level into the buffer, also check for file access + if (access(FILENAME, F_OK) != -1) { + fp = fopen(FILENAME, "rb"); + if (fp != NULL) { + if (fgets(last_known, sizeof(last_known), fp) != NULL) { + // remove newline char + size_t len = strlen(last_known); + if (len > 0 && last_known[len - 1] == '\n') { + last_known[len - 1] = '\0'; + } + strncpy(failsafe, last_known, sizeof(failsafe)); + failsafe[sizeof(failsafe) - 1] = '\0'; // ensure null termination + } else { + fprintf(stderr, "%serror reading from file :(%s\n", COLOR_MAGENTA, COLOR_RESET); + } + + fclose(fp); + } else { + fprintf(stderr, "%sfailed to open file :9%s\n", COLOR_MAGENTA, COLOR_RESET); + } + } else { + fprintf(stderr, "%sno cache file found, creating...%s\n", COLOR_MAGENTA, COLOR_RESET); + } + + + fp = fopen(FILENAME, "w"); + // a lil bit of error handling here and there + + if (curl == NULL) { + fprintf(stderr, "%sHTTP request failed :(%s\n", COLOR_MAGENTA, COLOR_RESET); + curl_easy_cleanup(curl); + } + // fun begins + fprintf(stdout, "%s----------------------------------------------------------------------\n", COLOR_GREEN); + fprintf(stdout, "defcon-chan is at your service! getting the current DEFCON level desu~\n"); + // setting options for curl + curl_easy_setopt(curl, CURLOPT_URL, URL); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + result = curl_easy_perform(curl); // actual request performing + curl_easy_cleanup(curl); + + if (result != CURLE_OK) { + fprintf(stderr, "%serror: %s%s\n", COLOR_MAGENTA, curl_easy_strerror(result), COLOR_RESET); + fprintf(stdout, "%sservice is currently unreachable, the last DEFCON level is: %s%s\n", COLOR_CYAN, failsafe, COLOR_RESET); + fp = fopen(FILENAME, "w"); + fprintf(fp, "%s", failsafe); + fclose(fp); + return -1; + + } else { + fflush(fp); + fclose(fp); + fp = fopen(FILENAME, "r"); // i don't know if there's a better way to do this but since there are only 5 conditions - why not? + if (fgets(last_known, sizeof(last_known), fp) != NULL) { + if (strcmp(last_known, "5") == 0) + { + fprintf(stdout, "the current DEFCON level is: %s%s%s - FADE OUT%s%s\n", COLOR_BLUE, COLOR_BLINK, last_known, COLOR_RESET, COLOR_RESET); + } + else if (strcmp(last_known, "4") == 0) + { + fprintf(stdout, "the current DEFCON level is: %s%s%s - DOUBLE TAKE%s%s\n", COLOR_GREEN, COLOR_BLINK, last_known, COLOR_RESET, COLOR_RESET); + } + else if (strcmp(last_known, "3") == 0) + { + fprintf(stdout, "the current DEFCON level is: %s%s%s - ROUND HOUSE%s%s\n", COLOR_YELLOW, COLOR_BLINK, last_known, COLOR_RESET, COLOR_RESET); + } + else if (strcmp(last_known, "2") == 0) + { + fprintf(stdout, "the current DEFCON level is: %s%s%s - FAST PACE%s%s\n", COLOR_RED, COLOR_BLINK, last_known, COLOR_RESET, COLOR_RESET); + } + else if (strcmp(last_known, "1") == 0) + { + fprintf(stdout, "the current DEFCON level is: %s%s%s - COCKED PISTOL%s%s\n", COLOR_WHITE, COLOR_BLINK, last_known, COLOR_RESET, COLOR_RESET); + fprintf(stdout, "%%ssWHAT ARE YOU DOING? RUN FOR YOUR LIFE!%s%s\n", COLOR_MAGENTA, COLOR_BLINK, COLOR_RESET, COLOR_RESET); + } + else + { + fprintf(stderr, "%serror reading the DEFCON level from the file%s\n", COLOR_RED, COLOR_RESET); + } + } + fclose(fp); + fp = fopen(FILENAME, "w"); + if (strcmp(last_known, "N/A") == 0) { + fprintf(fp, "%s", failsafe); // writing the last safe DEFCON value ever known + fprintf(stdout, "failsafe engaged with level of %s", failsafe); + } + else { + fprintf(fp, "%s", last_known); + } + } + fclose(fp); + fprintf(stdout, "%s----------------------------------------------------------------------%s\n", COLOR_GREEN, COLOR_RESET); + + return 0; +} \ No newline at end of file