From 4103655d0809e61859e1487df36fd47911cde92b Mon Sep 17 00:00:00 2001 From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> Date: Fri, 6 Feb 2009 12:14:47 -0500 Subject: [PATCH] Add REST code to build the request to server --- sflphone-gtk/src/reqaccount.c | 130 ++++++++++++++++++++++++++++++++++ sflphone-gtk/src/reqaccount.h | 27 +++++++ 2 files changed, 157 insertions(+) create mode 100644 sflphone-gtk/src/reqaccount.c create mode 100644 sflphone-gtk/src/reqaccount.h diff --git a/sflphone-gtk/src/reqaccount.c b/sflphone-gtk/src/reqaccount.c new file mode 100644 index 0000000000..6c5afafce8 --- /dev/null +++ b/sflphone-gtk/src/reqaccount.c @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2009 Jean Schurger <jean@schurger.org> + * and Savoir-Faire Linux inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * To test: + * + * cc -o reqhttp reqhttp.c -DBUILD_EXAMPLE + * + */ + +#include <stdio.h> +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <strings.h> /* bzero */ +#include <netdb.h> +#include <netinet/in.h> +#include <sys/socket.h> +#include "reqaccount.h" + +int req(char *host, int port, char *req, char *ret) { + int s; + struct sockaddr_in servSockAddr; + struct hostent *servHostEnt; + long hostAddr; + long status; + int length, i; + FILE *f; + char buf[1024]; + + bzero(&servSockAddr, sizeof(servSockAddr)); + hostAddr = inet_addr(host); + + if ((long)hostAddr != (long)-1) + bcopy(&hostAddr, &servSockAddr.sin_addr, sizeof(hostAddr)); + else { + servHostEnt = gethostbyname(host); + if (servHostEnt == NULL) { + strcpy(ret, "gethostbyname"); + return -1; + } + bcopy(servHostEnt->h_addr, &servSockAddr.sin_addr, servHostEnt->h_length); + } + servSockAddr.sin_port = htons(port); + servSockAddr.sin_family = AF_INET; + + if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0) { + strcpy(ret, "socket"); + return -1; + } + + if(connect(s, (const struct sockaddr *) &servSockAddr, + (socklen_t) sizeof(servSockAddr)) < 0 ) { + strcpy(ret, "connect"); + return -1; + } + + f = fdopen(s, "r+"); + + fprintf(f, "%s HTTP/1.1\r\n", req); + fprintf(f, "Host: %s\r\n", host); + fputs("User-Agent: SFLphone\r\n", f); + fputs("\r\n", f); + + while (strncmp(fgets(buf, sizeof(buf), f), "\r\n", 2)) { + const char *len_h = "content-length"; + const char *status_h = "HTTP/1.1"; + if (strncasecmp(buf, len_h, strlen(len_h)) == 0) + length = atoi(buf + strlen(len_h) + 1); + if (strncasecmp(buf, status_h, strlen(status_h)) == 0) + status = atoi(buf + strlen(status_h) + 1); + } + for (i = 0; i < length; i++) + ret[i] = fgetc(f); + + if (status != 200) { + sprintf(ret, "http error: %ld", status); + return -1; + } + + fclose(f); + shutdown(s, 2); + close(s); + return 0; +} + +rest_account get_rest_account(char *host) { + char ret[4096]; + rest_account ra; + bzero(ret, sizeof(ret)); + if (req(host, 80, "GET /rest/accountcreator", ret) != -1) { + strcpy(ra.user, strtok(ret, "\n")); + strcpy(ra.passwd, strtok(NULL, "\n"));\ + ra.success = 1; + } else { + ra.success = 0; + strcpy(ra.reason, ret); + } + return ra; +} + + +#ifdef BUILD_EXAMPLE + +int main (void) { + rest_account acc = get_rest_account("sip.sflphone.org"); + if (acc.success) { + puts(acc.user); + puts(acc.passwd); + } else { + printf("FAILED: %s\n", acc.reason); + } +} +#endif diff --git a/sflphone-gtk/src/reqaccount.h b/sflphone-gtk/src/reqaccount.h new file mode 100644 index 0000000000..5c2b7bc1cb --- /dev/null +++ b/sflphone-gtk/src/reqaccount.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2009 Jean Schurger <jean@schurger.org> + * and Savoir-Faire Linux inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +typedef struct { + char success; + char reason[200]; + char user[200]; + char passwd[200]; +} rest_account; + +rest_account get_rest_account(char *host); -- GitLab