/* juisck */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#define BUF 4096
char *extract(const char *const string, const char *const left, const char *const right) {
char *head;
char *tail;
size_t length;
char *result;
if ((string == NULL) || (left == NULL) || (right == NULL))
return NULL;
length = strlen(left);
head = strstr(string, left);
if (head == NULL)
return NULL;
head += length;
tail = strstr(head, right);
if (tail == NULL)
return tail;
length = tail - head;
result = malloc(1 + length);
if (result == NULL)
return NULL;
result[length] = '\0';
memcpy(result, head, length);
return result;
}
int main (int argc, char **argv) {
int tsocket;
char *HTTPbuffer = malloc (BUF);
char *XMLbuffer = malloc (BUF);
char *MASTERbuffer = malloc (BUF);
struct sockaddr_in address;
struct hostent *he;
int size;
char *url = "/Jason/UpdateInfoService";
char *server = "jws.avm.de";
char *fb_name = "FRITZ!Box 7590";
char *fb_hw = "226";
unsigned int fb_major = 154;
unsigned int fb_minor = 1;
unsigned int fb_patch = 1;
unsigned int fb_build = 10000;
char *fb_type = "1";
char *fb_serial = "0000000000";
char *fb_oem = "avm";
char *fb_lang ="de";
char *fb_country = "049";
char *fb_annex = "B";
char *fb_flags; // ToDo
unsigned int fb_updateconfig = 3;
char *fb_provider = "vodafone2_vdsl";
char *fb_provider_name = "Vodafone";
snprintf(MASTERbuffer, BUF,
"<e:BoxInfoMeshMaster xmlns:e=\"http://juis.avm.de/updateinfo\" xmlns:q=\"http://juis.avm.de/request\">"
"<q:Name>FRITZ!Box 7590</q:Name>"
"<q:HW>226</q:HW>"
"<q:Major>154</q:Major>"
"<q:Minor>7</q:Minor>"
"<q:Patch>19</q:Patch>"
"<q:Buildnumber>77204</q:Buildnumber>"
"<q:Buildtype>1001</q:Buildtype>"
"<q:Serial>989BCB312396</q:Serial>"
"<q:OEM>avm</q:OEM>"
"<q:Lang>de</q:Lang>"
"<q:Country>049</q:Country>"
"<q:Annex>B</q:Annex>"
"<q:Flag>crashreport</q:Flag>"
"<q:Flag>avm_acs</q:Flag>"
"<q:Flag>myfritz_letsencrypt</q:Flag>"
"<q:Flag>medium_dsl</q:Flag>"
"<q:Flag>mesh_master</q:Flag>"
"<q:UpdateConfig>3</q:UpdateConfig>"
"<q:Provider>vodafone2_vdsl</q:Provider>"
"<q:ProviderName>Vodafone</q:ProviderName>"
"</e:BoxInfoMeshMaster>");
snprintf(XMLbuffer, BUF,
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:soap-enc= \"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:e=\"http://juis.avm.de/updateinfo\" xmlns:q=\"http://juis.avm.de/request\">\n"
"<soap:Header/>\n"
"<soap:Body>\n"
"<e:BoxFirmwareUpdateCheck>\n"
"<e:RequestHeader>\n"
"<q:Nonce>ixwoteLGzmKa4AefeGbO8w==</q:Nonce>\n"
"<q:UserAgent>Box</q:UserAgent>\n"
"<q:ManualRequest>true</q:ManualRequest>\n"
"</e:RequestHeader>\n"
"<e:BoxInfo>\n"
"<q:Name>%s</q:Name>\n"
"<q:HW>%s</q:HW>\n"
"<q:Major>%d</q:Major>\n"
"<q:Minor>%d</q:Minor>\n"
"<q:Patch>%d</q:Patch>\n"
"<q:Buildnumber>%d</q:Buildnumber>\n"
"<q:Buildtype>%s</q:Buildtype>\n"
"<q:Serial>%s</q:Serial>\n"
"<q:OEM>%s</q:OEM>\n"
"<q:Lang>%s</q:Lang>\n"
"<q:Country>%s</q:Country>\n"
"<q:Annex>%s</q:Annex>\n"
"<q:Flag>crashreport</q:Flag>\n"
"<q:Flag>avm_acs</q:Flag>\n"
"<q:Flag>myfritz_letsencrypt</q:Flag>\n"
"<q:Flag>medium_dsl</q:Flag>\n"
"<q:Flag>mesh_master</q:Flag>\n"
"<q:UpdateConfig>%d</q:UpdateConfig>\n"
"<q:Provider>%s</q:Provider>\n"
"<q:ProviderName>%s</q:ProviderName>\n"
"</e:BoxInfo>\n"
"</e:BoxFirmwareUpdateCheck>\n"
"</soap:Body>\n"
"</soap:Envelope>",fb_name,fb_hw,fb_major,fb_minor,fb_patch,fb_build,fb_type,fb_serial,fb_oem,fb_lang,fb_country,fb_annex,fb_updateconfig,fb_provider,fb_provider_name);
snprintf(HTTPbuffer, BUF,
"POST %s HTTP/1.1\r\n"
"Host: %s:80\r\n"
"Content-Length: %d\r\n"
"Content-Type: text/xml; charset=\"utf-8\"\r\n\r\n%s",url,server,strlen(XMLbuffer),XMLbuffer);
he = gethostbyname(server);
if (he == NULL){
exit(1);
}
if ((tsocket=socket(AF_INET, SOCK_STREAM, 0)) > 0) {
// printf ("Socket wurde angelegt\n");
}
address.sin_family = AF_INET;
address.sin_port = htons (80);
address.sin_addr = *((struct in_addr *)he->h_addr);
if (connect(tsocket, (struct sockaddr *) &address, sizeof(address)) == 0) {
// printf ("Verbindung mit dem Server (%s) hergestellt\n", inet_ntoa(address.sin_addr));
}
send(tsocket, HTTPbuffer, strlen(HTTPbuffer), 0);
size = recv(tsocket, HTTPbuffer, BUF-1, 0);
if( size > 0) HTTPbuffer[size] = '\0';
// printf ("Nachricht erhalten:\n%s\n\n", HTTPbuffer);
char *value;
value = extract(HTTPbuffer, "<ns3:Found>", "</ns3:Found>");
if (value != NULL) {
// printf("%s\n", value);
}
int ret = strcmp (value, "true");
if(ret != 0) {
printf("Keine Firmware gefunden!\n");
exit(1);
}
free(value);
value = extract(HTTPbuffer, "<ns3:Name>", "</ns3:Name>");
if (value != NULL)
printf("%s\n", value);
free(value);
value = extract(HTTPbuffer, "<ns3:Version>", "</ns3:Version>");
if (value != NULL)
printf("%s\n", value);
free(value);
value = extract(HTTPbuffer, "<ns3:DownloadURL>", "</ns3:DownloadURL>");
if (value != NULL)
printf("%s\n", value);
free(value);
value = extract(HTTPbuffer, "<ns3:InfoURL>", "</ns3:InfoURL>");
if (value != NULL)
printf("%s\n", value);
free(value);
close (tsocket);
return EXIT_SUCCESS;
}