sb-weather.c (1450B)
1 #include <curl/curl.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 #define WEATHER_FORMAT "?format=%f+%C" 7 #define MAX_SIZE 1024 8 9 size_t write_callback(void *ptr, size_t size, size_t nmemb, char *data) { 10 strncat(data, ptr, size * nmemb); 11 return size * nmemb; 12 } 13 14 int main(int argc, char *argv[]) { 15 if (argc < 2) { 16 fprintf(stderr, "Usage: %s <location>\n", argv[0]); 17 return 1; 18 } 19 20 char url[MAX_SIZE], weather_data[MAX_SIZE] = {0}, cache_path[MAX_SIZE]; 21 const char *cache_dir = 22 getenv("XDG_CACHE_HOME") ? getenv("XDG_CACHE_HOME") : "/tmp"; 23 24 snprintf(url, sizeof(url), "https://wttr.in/%s%s", argv[1], WEATHER_FORMAT); 25 snprintf(cache_path, sizeof(cache_path), "%s/weatherreport", cache_dir); 26 27 curl_global_init(CURL_GLOBAL_DEFAULT); 28 CURL *curl = curl_easy_init(); 29 if (!curl) 30 return 1; 31 32 curl_easy_setopt(curl, CURLOPT_URL, url); 33 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); 34 curl_easy_setopt(curl, CURLOPT_WRITEDATA, weather_data); 35 36 if (curl_easy_perform(curl) != CURLE_OK) { 37 curl_easy_cleanup(curl); 38 curl_global_cleanup(); 39 return 1; 40 } 41 42 curl_easy_cleanup(curl); 43 curl_global_cleanup(); 44 45 // Remove '+' character 46 for (char *p = weather_data; *p; p++) { 47 if (*p == '+') 48 memmove(p, p + 1, strlen(p)); 49 } 50 51 FILE *fp = fopen(cache_path, "w"); 52 if (fp) { 53 fputs(weather_data, fp); 54 fclose(fp); 55 } 56 57 printf("%s\n", weather_data); 58 return 0; 59 }