Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 5724 → Rev 5725

/contrib/other/kpm/kpm.c
0,0 → 1,181
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/unistd.h>
#include <fcntl.h>
#include <kos32sys.h>
#include "collection.h"
#include "http.h"
 
#define BUFFSIZE (64*1024)
 
int http_load_mem(char *buf, const char *url)
{
http_t *http;
int offset = 0;
int count;
 
// asm volatile("int3");
http = http_get(url, NULL,FLAG_STREAM|FLAG_REUSE_BUFFER, NULL);
if(http == NULL)
goto err_get;
 
do
{
// delay(100);
if(http_receive_with_retry(http, 500)==0)
{
if(http->flags & 0xffff0000)
goto err_http;
 
count = http->content_received - offset;
if(count == 0)
continue;
memcpy(buf+offset, http->content_ptr, count);
offset = http->content_received;
}
else goto err_http;
 
}while( (http->flags & FLAG_GOT_ALL_DATA) == 0);
 
if(http->content_ptr)
user_free(http->content_ptr);
http_free(http);
 
return offset;
 
err_http:
if(http->content_ptr)
user_free(http->content_ptr);
http_free(http);
 
printf("HTTP receive failed\n");
return offset;
 
err_get:
printf("HTTP GET failed\n");
return offset;
 
}
 
int http_load_file(const char *path, const char *url)
{
http_t *http;
int received = 0;
int offset = 0;
int tail;
char *buf;
int fd;
int i;
 
buf = user_alloc(BUFFSIZE);
for(i = 0; i < 16; i++)
buf[i*4096] = 0;
 
fd = open(path, O_CREAT|O_WRONLY);
if(fd == -1)
{
user_free(buf);
return 0;
};
 
http = http_get(url, NULL,FLAG_STREAM|FLAG_REUSE_BUFFER, NULL);
if(http == NULL)
goto err_get;
 
do
{
if(http_receive_with_retry(http, 500) == 0)
{
int count;
 
if(http->flags & 0xffff0000)
break;
 
count = http->content_received - received;
if(count+offset <= BUFFSIZE)
{
memcpy(buf+offset, http->content_ptr, count);
offset+= count;
+
+ else
+ {
+ tail = count+offset-BUFFSIZE;
+ count = BUFFSIZE - offset;
+ if(count)
+ {
+ memcpy(buf+offset, http->content_ptr, count);
+ offset = 0;
+ };
+
+ write(fd, buf, BUFFSIZE);
+
+ if(tail)
+ {
+ memcpy(buf, http->content_ptr+count, tail);
+ offset = tail;
+ }
+ }
+ received = http->content_received;
+ }
+ else break;
+
+ }while( (http->flags & FLAG_GOT_ALL_DATA) == 0);
+
+ if(offset)
+ {
+ write(fd, buf, offset);
+ }
+
+// ftruncate(fd, received);
+ close(fd);
+
+ if(http->content_ptr)
+ user_free(http->content_ptr);
+ http_free(http);
+
+ user_free(buf);
+
+ return received;
+
+err_get:
+ printf("HTTP GET failed\n");
+ return received;
+}
+
+
+int main(int argc, char *argv[])
+{
+ int count;
+
+ if(http_init())
+ goto err_init;
+
+ count = http_load_file("/tmp0/1/packages.xml", "http://ftp.kolibrios.org/users/Serge/new/OS/packages.xml");
+
+ if(count)
+ {
+ collection_t *collection;
+ pkg_group_t *gr;
+
+ collection = load_collection_file("/tmp0/1/packages.xml");
+
+ list_for_each_entry(gr, &collection->groups, list)
+ {
+ package_t *pkg;
+
+ list_for_each_entry(pkg, &gr->packages, list)
+ {
+ printf("package %s-%s\n", pkg->name, pkg->version);
+ }
+ };
+ }
+
+ return 0;
+
+err_init:
+ printf("HTTP library initialization failed\n");
+ return -1;
+}