diff options
Diffstat (limited to 'rtclient.c')
-rw-r--r-- | rtclient.c | 304 |
1 files changed, 0 insertions, 304 deletions
diff --git a/rtclient.c b/rtclient.c deleted file mode 100644 index d90ac42..0000000 --- a/rtclient.c +++ /dev/null @@ -1,304 +0,0 @@ -#ifdef DEBUG -#ifdef ANDROID -#include <android/log.h> -#else -#include <stdio.h> -#endif // ANDROID -#endif // DEBUG -#include <stdlib.h> -#include <string.h> -#include <curl/curl.h> -#include "rtclient/rtclient.h" - -typedef struct rt_user rt_user; -typedef struct rt_ticketlist rt_ticketlist; -static CURL *curl = NULL; -static char *server_url = NULL; - -bool rtclient_init(const char *url) -{ - curl_global_init(CURL_GLOBAL_SSL); - curl = curl_easy_init(); - if (curl) { - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); - curl_easy_setopt(curl, CURLOPT_REFERER, url); -#ifdef DEBUG - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); -#endif // DEBUG - server_url = malloc(strlen(url) + 1); - strcpy(server_url, url); - } - - return (bool)curl; -} - -static size_t -user_callback(void *contents, size_t size, size_t nmemb, void *writedata) -{ - size_t realsize = size * nmemb; - char response[realsize + 1]; - memcpy(response, contents, realsize); - response[realsize] = '\0'; - - rt_user **userptr = (rt_user **)writedata; - rt_user *user = *userptr; - - char *linesaveptr = NULL; - char *line = strtok_r(response, "\n", &linesaveptr); - if (strstr(line, "200 Ok")) { - line = strtok_r(NULL, "\n", &linesaveptr); - char *tokensaveptr = NULL, *token = NULL; - do { - token = strtok_r(line, ":", &tokensaveptr); - if (!strcmp(token, "id")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->id = malloc(strlen(token)); - strcpy(user->id, ++token); - } else if (!strcmp(token, "Password")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->password = malloc(strlen(token)); - strcpy(user->password, ++token); - } else if (!strcmp(token, "Name")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->name = malloc(strlen(token)); - strcpy(user->name, ++token); - } else if (!strcmp(token, "EmailAddress")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->emailaddress = malloc(strlen(token)); - strcpy(user->emailaddress, ++token); - } else if (!strcmp(token, "RealName")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->realname = malloc(strlen(token)); - strcpy(user->realname, ++token); - } else if (!strcmp(token, "NickName")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->nickname = malloc(strlen(token)); - strcpy(user->nickname, ++token); - } else if (!strcmp(token, "Gecos")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->gecos = malloc(strlen(token)); - strcpy(user->gecos, ++token); - } else if (!strcmp(token, "Organization")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->organization = malloc(strlen(token)); - strcpy(user->organization, ++token); - } else if (!strcmp(token, "Address1")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->address1 = malloc(strlen(token)); - strcpy(user->address1, ++token); - } else if (!strcmp(token, "Address2")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->address2 = malloc(strlen(token)); - strcpy(user->address2, ++token); - } else if (!strcmp(token, "City")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->city = malloc(strlen(token)); - strcpy(user->city, ++token); - } else if (!strcmp(token, "State")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->state = malloc(strlen(token)); - strcpy(user->state, ++token); - } else if (!strcmp(token, "Zip")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->zip = malloc(strlen(token)); - strcpy(user->zip, ++token); - } else if (!strcmp(token, "Country")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->country = malloc(strlen(token)); - strcpy(user->country, ++token); - } else if (!strcmp(token, "HomePhone")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->homephone = malloc(strlen(token)); - strcpy(user->homephone, ++token); - } else if (!strcmp(token, "WorkPhone")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->workphone = malloc(strlen(token)); - strcpy(user->workphone, ++token); - } else if (!strcmp(token, "MobilePhone")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->mobilephone = malloc(strlen(token)); - strcpy(user->mobilephone, ++token); - } else if (!strcmp(token, "PagerPhone")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->pagerphone = malloc(strlen(token)); - strcpy(user->pagerphone, ++token); - } else if (!strcmp(token, "ContactInfo")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->contactinfo = malloc(strlen(token)); - strcpy(user->contactinfo, ++token); - } else if (!strcmp(token, "Comments")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->comments = malloc(strlen(token)); - strcpy(user->comments, ++token); - } else if (!strcmp(token, "Signature")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->signature = malloc(strlen(token)); - strcpy(user->signature, ++token); - } else if (!strcmp(token, "Lang")) { - token = strtok_r(NULL, ":", &tokensaveptr); - strncpy(user->lang, ++token, 2); - } else if (!strcmp(token, "Privileged")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->privileged = (bool)atoi(++token); - } else if (!strcmp(token, "Disabled")) { - token = strtok_r(NULL, ":", &tokensaveptr); - user->disabled = (bool)atoi(++token); - } - } while ((line = strtok_r(NULL, "\n", &linesaveptr))); - } else { - free(*userptr); - *userptr = NULL; - } - - return realsize; -} - -static size_t -search_callback(void *contents, size_t size, size_t nmemb, void *writedata) -{ - size_t realsize = size * nmemb; - char response[realsize + 1]; - memcpy(response, contents, realsize); - response[realsize] = '\0'; - char lines[strlen(response) + 1]; - strcpy(lines, response); - rt_ticketlist **listptr = (rt_ticketlist **)writedata; - - char *line = strtok(response, "\n"); - if (strstr(line, "200 Ok")) { - (*listptr)->length = 0; - line = strtok(NULL, "\n"); - do { - (*listptr)->length++; - } while ((line = strtok(NULL, "\n"))); - rt_ticketlist *ptr = realloc(*listptr, sizeof(*listptr) - + (*listptr)->length * sizeof(char *)); - *listptr = ptr; - rt_ticketlist *list = *listptr; - char *linesaveptr = NULL; - line = strtok_r(lines, "\n", &linesaveptr); - line = strtok_r(NULL, "\n", &linesaveptr); - char *tokensaveptr = NULL, *token = NULL; - for (unsigned int i = 0; i < list->length; i++) { - token = strtok_r(line, ":", &tokensaveptr); - token = strtok_r(NULL, ":", &tokensaveptr); - list->tickets[i] = malloc(strlen(token)); - strcpy(list->tickets[i], ++token); - line = strtok_r(NULL, "\n", &linesaveptr); - } - } else { - free(*listptr); - *listptr = NULL; - } - - return realsize; -} - -inline static void request(const char *path, const char *suffix - , size_t (*writefunction)(void *, size_t, size_t, void *) - , void *writedata, struct curl_httppost *post) -{ - char url[strlen(server_url) + strlen(path) + strlen(suffix) + 1]; - sprintf(url, "%s%s%s", server_url, path, suffix); - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunction); - if (writedata) - curl_easy_setopt(curl, CURLOPT_WRITEDATA, writedata); - else - curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout); - if (post) - curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); - else - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); - -#ifdef DEBUG - CURLcode res = -#endif // DEBUG - curl_easy_perform(curl); -#ifdef DEBUG - if (res != CURLE_OK) { - const char *error = curl_easy_strerror(res); -#ifdef ANDROID - __android_log_print(ANDROID_LOG_ERROR, "librtclient", "%s: %s" - , __func__, error); -#else - fprintf(stderr, "%s: %s\n", __func__, error); -#endif // ANDROID - } -#endif // DEBUG -} - -void rtclient_login(const char *name, const char *password) -{ - struct curl_httppost *post, *last = NULL; - curl_formadd(&post, &last - , CURLFORM_COPYNAME, "user" - , CURLFORM_PTRCONTENTS, name - , CURLFORM_END); - curl_formadd(&post, &last - , CURLFORM_COPYNAME, "pass" - , CURLFORM_PTRCONTENTS, password - , CURLFORM_END); - last = NULL; - request("", "", NULL, NULL, post); - curl_formfree(post); - post = NULL; -} - -void rtclient_user_show(rt_user **userptr, const char *name) -{ - *userptr = malloc(sizeof(rt_user)); - request("/REST/1.0/user/", name, user_callback, (void *)userptr, NULL); -} - -void rtclient_ticket_search(rt_ticketlist **listptr, const char *query) -{ - *listptr = malloc(sizeof(rt_ticketlist)); - request("/REST/1.0/search/ticket?query=", query, search_callback - , (void *)listptr, NULL); -} - -void rtclient_user_free(rt_user *user) -{ - free(user->id); - free(user->password); - free(user->name); - free(user->emailaddress); - free(user->realname); - free(user->nickname); - free(user->gecos); - free(user->organization); - free(user->address1); - free(user->address2); - free(user->city); - free(user->state); - free(user->zip); - free(user->country); - free(user->homephone); - free(user->workphone); - free(user->mobilephone); - free(user->pagerphone); - free(user->contactinfo); - free(user->comments); - free(user->signature); - free(user); - user = NULL; -} - -void rtclient_ticket_freelist(rt_ticketlist *list) -{ - for (unsigned short i = 0; i < list->length; i++) - free(list->tickets[i]); - free(list); - list = NULL; -} - -void rtclient_cleanup() -{ - if (curl) { - free(server_url); - curl_easy_cleanup(curl); - } - curl_global_cleanup(); -} |