/contrib/other/kpm/Makefile |
---|
20,14 → 20,15 |
#DEFINES= -DDEBUG=1 |
DEFINES= -DNDEBUG |
LIBS:= -lsupc++ -lgcc_eh -lc.dll -lapp -lgcc |
LIBS:= -liberty -lsupc++ -lgcc_eh -lc.dll -lapp -lgcc |
LIBPATH:= -L$(LIB_DIR) -L/home/autobuild/tools/win32/mingw32/lib |
LDFLAGS = -static -nostdlib --stack 0x30000 -Map kpm.map -T$(SDK_DIR)/sources/newlib/app.lds --image-base 0 |
LDFLAGS = -static -nostdlib --stack 0x10000 -Map kpm.map -T$(SDK_DIR)/sources/newlib/app.lds --image-base 0 |
SOURCES = http.asm \ |
kpm.c \ |
utils.c \ |
collection.cpp \ |
tinyxml/tinyxml.cpp \ |
tinyxml/tinystr.cpp \ |
/contrib/other/kpm/getopt.h |
---|
0,0 → 1,144 |
/* Declarations for getopt. |
Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, |
2002 Free Software Foundation, Inc. |
NOTE: The canonical source of this file is maintained with the GNU C Library. |
Bugs can be reported to bug-glibc@gnu.org. |
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 2, 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
#ifndef _GETOPT_H |
#define _GETOPT_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* For communication from `getopt' to the caller. |
When `getopt' finds an option that takes an argument, |
the argument value is returned here. |
Also, when `ordering' is RETURN_IN_ORDER, |
each non-option ARGV-element is returned here. */ |
extern char *optarg; |
/* Index in ARGV of the next element to be scanned. |
This is used for communication to and from the caller |
and for communication between successive calls to `getopt'. |
On entry to `getopt', zero means this is the first call; initialize. |
When `getopt' returns -1, this is the index of the first of the |
non-option elements that the caller should itself scan. |
Otherwise, `optind' communicates from one call to the next |
how much of ARGV has been scanned so far. */ |
extern int optind; |
/* Callers store zero here to inhibit the error message `getopt' prints |
for unrecognized options. */ |
extern int opterr; |
/* Set to an option character which was unrecognized. */ |
extern int optopt; |
/* Describe the long-named options requested by the application. |
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector |
of `struct option' terminated by an element containing a name which is |
zero. |
The field `has_arg' is: |
no_argument (or 0) if the option does not take an argument, |
required_argument (or 1) if the option requires an argument, |
optional_argument (or 2) if the option takes an optional argument. |
If the field `flag' is not NULL, it points to a variable that is set |
to the value given in the field `val' when the option is found, but |
left unchanged if the option is not found. |
To have a long-named option do something other than set an `int' to |
a compiled-in constant, such as set a value from `optarg', set the |
option's `flag' field to zero and its `val' field to a nonzero |
value (the equivalent single-letter option character, if there is |
one). For long options that have a zero `flag' field, `getopt' |
returns the contents of the `val' field. */ |
struct option |
{ |
#if defined (__STDC__) && __STDC__ |
const char *name; |
#else |
char *name; |
#endif |
/* has_arg can't be an enum because some compilers complain about |
type mismatches in all the code that assumes it is an int. */ |
int has_arg; |
int *flag; |
int val; |
}; |
/* Names for the values of the `has_arg' field of `struct option'. */ |
#define no_argument 0 |
#define required_argument 1 |
#define optional_argument 2 |
#if defined (__STDC__) && __STDC__ |
/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is |
undefined, we haven't run the autoconf check so provide the |
declaration without arguments. If it is 0, we checked and failed |
to find the declaration so provide a fully prototyped one. If it |
is 1, we found it so don't provide any declaration at all. */ |
#if !HAVE_DECL_GETOPT |
#if defined (__GNU_LIBRARY__) || defined (HAVE_DECL_GETOPT) |
/* Many other libraries have conflicting prototypes for getopt, with |
differences in the consts, in unistd.h. To avoid compilation |
errors, only prototype getopt for the GNU C library. */ |
extern int getopt (int argc, char *const *argv, const char *shortopts); |
#else |
#ifndef __cplusplus |
extern int getopt (); |
#endif /* __cplusplus */ |
#endif |
#endif /* !HAVE_DECL_GETOPT */ |
extern int getopt_long (int argc, char *const *argv, const char *shortopts, |
const struct option *longopts, int *longind); |
extern int getopt_long_only (int argc, char *const *argv, |
const char *shortopts, |
const struct option *longopts, int *longind); |
/* Internal only. Users should not call this directly. */ |
extern int _getopt_internal (int argc, char *const *argv, |
const char *shortopts, |
const struct option *longopts, int *longind, |
int long_only); |
#else /* not __STDC__ */ |
extern int getopt (); |
extern int getopt_long (); |
extern int getopt_long_only (); |
extern int _getopt_internal (); |
#endif /* __STDC__ */ |
#ifdef __cplusplus |
} |
#endif |
#endif /* getopt.h */ |
/contrib/other/kpm/http.h |
---|
52,5 → 52,8 |
void __stdcall con_cls(void); |
void __stdcall con_write_asciiz(const char* string); |
char *make_url(const char *name); |
char *make_tmp_path(const char *path); |
char *make_cache_path(const char *path); |
#endif /* __HTTP_H__ */ |
/contrib/other/kpm/kpm.c |
---|
1,153 → 1,96 |
#include <stdlib.h> |
#include <stdio.h> |
#include <string.h> |
#include <sys/stat.h> |
#include <sys/unistd.h> |
#include <fcntl.h> |
#include <kos32sys.h> |
#include <sys/kos_io.h> |
#include "getopt.h" |
#include "package.h" |
#include "http.h" |
#define BUFFSIZE (64*1024) |
char conbuf[256]; |
extern char conbuf[256]; |
char *make_url(const char *name) |
{ |
static char url_buf[128] = "http://ftp.kolibrios.org/users/Serge/new/OS/"; |
strcpy(&url_buf[44], name); |
return url_buf; |
}; |
#define OPTION_STD_BASE 150 |
char *make_tmp_path(const char *path) |
enum option_values |
{ |
static char path_buf[64] = "/tmp0/1/"; |
strcpy(&path_buf[8], path); |
return path_buf; |
OPTION_HELP = OPTION_STD_BASE, |
OPTION_LIST_PACKAGES, |
OPTION_LIST_INSTALLED |
}; |
char *make_cache_path(const char *path) |
static const struct option longopts[] = |
{ |
static char path_buf[64] = "/kolibrios/kpm/cache/"; |
strcpy(&path_buf[21], path); |
return path_buf; |
{"list-packages", no_argument, NULL, OPTION_LIST_PACKAGES}, |
{"list-installed",no_argument, NULL, OPTION_LIST_INSTALLED}, |
{NULL,0,NULL,0} |
}; |
int http_load_file(const char *path, const char *url) |
int main(int argc, char *argv[]) |
{ |
http_t *http; |
int received = 0; |
int offset = 0; |
int tail; |
char *buf; |
int fd; |
int i; |
LIST_HEAD(server_list); |
LIST_HEAD(download_list); |
LIST_HEAD(cache_list); |
LIST_HEAD(local_list); |
LIST_HEAD(task_list); |
buf = user_alloc(BUFFSIZE); |
for(i = 0; i < 16; i++) |
buf[i*4096] = 0; |
int count; |
char *cache_path; |
char *tmp_path; |
fd = open(path, O_CREAT|O_WRONLY); |
if(fd == -1) |
{ |
user_free(buf); |
return 0; |
}; |
if(http_init()) |
goto err_init; |
http = http_get(url, NULL,FLAG_STREAM|FLAG_REUSE_BUFFER, NULL); |
if(http == NULL) |
goto err_get; |
set_cwd("/tmp0/1"); |
do |
{ |
if(http_receive_with_retry(http, 500) == 0) |
{ |
int count; |
con_init(80, 25, 80, 250, "Kolibri package manager"); |
// if(http->flags & 0xffff0000) |
// break; |
tmp_path = make_tmp_path("packages.xml"); |
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; |
+ count = http_load_file(tmp_path, make_url("packages.xml")); |
+ |
if(count) |
- { |
- memcpy(buf+offset, http->content_ptr, count); |
- offset = 0; |
- }; |
+ build_server_list(&server_list, tmp_path); |
- write(fd, buf, BUFFSIZE); |
- |
- if(tail) |
+ while(1) |
{ |
- memcpy(buf, http->content_ptr+count, tail); |
- offset = tail; |
- } |
+ int val; |
+ int index; |
- sprintf(conbuf, "%d bytes loaded\r", http->content_received); |
- con_write_asciiz(conbuf); |
+ val = getopt_long_only(argc, argv,"",longopts, &index); |
- } |
- received = http->content_received; |
- } |
- else break; |
+ if(val == -1) |
+ break; |
- }while( (http->flags & FLAG_GOT_ALL_DATA) == 0); |
- |
- if(offset) |
+ switch(val) |
{ |
- write(fd, buf, offset); |
- } |
+ case OPTION_LIST_PACKAGES: |
+ sprintf(conbuf,"available packages:\n\n"); |
+ con_write_asciiz(conbuf); |
+ print_pkg_list(&server_list); |
+ con_exit(0); |
+ return 0; |
-// ftruncate(fd, received); |
- close(fd); |
+ case OPTION_LIST_INSTALLED: |
+ sprintf(conbuf,"installed packages:\n\n"); |
+ con_write_asciiz(conbuf); |
+ print_pkg_list(&local_list); |
+ con_exit(0); |
+ return 0; |
- 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; |
+ default: |
+ break; |
} |
+ }; |
-int main(int argc, char *argv[]) |
+#if 0 |
{ |
- int count; |
- char *cache_path; |
- char *tmp_path; |
- |
- if(http_init()) |
- goto err_init; |
- |
- con_init(80, 25, 80, 250, "Kolibri package manager"); |
- |
- tmp_path = make_tmp_path("packages.xml"); |
- |
- count = http_load_file(tmp_path, make_url("packages.xml")); |
- |
- if(count) |
- { |
- collection_t *collection; |
package_t *pkg; |
LIST_HEAD(install_list); |
LIST_HEAD(download_list); |
- collection = load_collection_file(tmp_path); |
- |
if(collection && build_install_list(&install_list, collection)) |
{ |
if(build_download_list(&download_list, &install_list)) |
@@ -162,11 +105,10 @@ |
con_write_asciiz(conbuf); |
}; |
- set_cwd("/tmp0/1"); |
- |
do_install(&install_list); |
}; |
} |
+#endif |
con_exit(0); |
@@ -177,97 +119,6 @@ |
return -1; |
} |
-int build_install_list(list_t *list, collection_t *collection) |
-{ |
- pkg_group_t *gr; |
- int count = 0; |
- list_for_each_entry(gr, &collection->groups, list) |
- { |
- package_t *pkg, *tmp; |
- list_for_each_entry(tmp, &gr->packages, list) |
- { |
- pkg = (package_t*)malloc(sizeof(package_t)); |
- INIT_LIST_HEAD(&pkg->file_list); |
- pkg->id = tmp->id; |
- pkg->name = strdup(tmp->name); |
- pkg->version = strdup(tmp->version); |
- pkg->filename = strdup(tmp->filename); |
- pkg->description = strdup(tmp->description); |
- list_add_tail(&pkg->list, list); |
- count++; |
- } |
- }; |
- return count; |
-} |
- |
-int build_download_list(list_t *download, list_t *src) |
-{ |
- int count = 0; |
- char *cache_path; |
- package_t *pkg, *tmp; |
- fileinfo_t info; |
- list_for_each_entry(tmp, src, list) |
- { |
- cache_path = make_cache_path(tmp->filename); |
- |
- if( get_fileinfo(cache_path, &info) != 0) |
- { |
- pkg = (package_t*)malloc(sizeof(package_t)); |
- |
- INIT_LIST_HEAD(&pkg->file_list); |
- pkg->id = tmp->id; |
- pkg->name = strdup(tmp->name); |
- pkg->version = strdup(tmp->version); |
- pkg->filename = strdup(tmp->filename); |
- pkg->description = strdup(tmp->description); |
- list_add_tail(&pkg->list, download); |
- count++; |
- }; |
- } |
- return count; |
-}; |
- |
-void do_download(list_t *download_list) |
-{ |
- package_t *pkg, *tmp; |
- char *cache_path; |
- int count; |
- |
- list_for_each_entry_safe(pkg, tmp, download_list, list) |
- { |
- sprintf(conbuf,"package %s-%s\n", pkg->name, pkg->version); |
- con_write_asciiz(conbuf); |
- cache_path = make_cache_path(pkg->filename); |
- count = http_load_file(cache_path, make_url(pkg->filename)); |
- sprintf(conbuf,"%s %d bytes loaded\n",cache_path, count); |
- con_write_asciiz(conbuf); |
- if( !test_archive(cache_path)) |
- list_del_pkg(pkg); |
- else |
- unlink(cache_path); |
- }; |
-} |
- |
-void remove_missing_packages(list_t *install, list_t *missed) |
-{ |
- package_t *mpkg, *mtmp, *ipkg, *itmp; |
- |
- list_for_each_entry_safe(mpkg, mtmp, missed, list) |
- { |
- list_for_each_entry_safe(ipkg, itmp, install, list) |
- { |
- if(ipkg->id == mpkg->id) |
- { |
- sprintf(conbuf,"skip missing package %s-%s\n", ipkg->name, ipkg->version); |
- con_write_asciiz(conbuf); |
- list_del_pkg(ipkg); |
- }; |
- } |
- list_del_pkg(mpkg); |
- }; |
-}; |
- |
- |
/contrib/other/kpm/package.h |
---|
43,10 → 43,12 |
collection_t* load_collection_file(const char *name); |
collection_t* load_collection_buffer(const char *buffer); |
int build_server_list(list_t *slist, const char *path); |
int build_install_list(list_t *list, collection_t *collection); |
int build_download_list(list_t *download, list_t *src); |
void remove_missing_packages(list_t *install, list_t *missed); |
char *make_cache_path(const char *path); |
void print_pkg_list(list_t *list); |
void do_download(list_t *download); |
void do_install(list_t *install); |
/contrib/other/kpm/utils.c |
---|
0,0 → 1,266 |
#include <stdlib.h> |
#include <string.h> |
#include <stdio.h> |
#include <sys/stat.h> |
#include <sys/unistd.h> |
#include <fcntl.h> |
#include <kos32sys.h> |
#include <sys/kos_io.h> |
#include "package.h" |
#include "http.h" |
#define BUFFSIZE (64*1024) |
char conbuf[256]; |
char *make_url(const char *name) |
{ |
static char url_buf[128] = "http://ftp.kolibrios.org/users/Serge/new/OS/"; |
strcpy(&url_buf[44], name); |
return url_buf; |
}; |
char *make_tmp_path(const char *path) |
{ |
static char path_buf[64] = "/tmp0/1/"; |
strcpy(&path_buf[8], path); |
return path_buf; |
}; |
char *make_cache_path(const char *path) |
{ |
static char path_buf[64] = "/kolibrios/kpm/cache/"; |
strcpy(&path_buf[21], path); |
return path_buf; |
}; |
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; |
} |
sprintf(conbuf, "%d bytes loaded\r", http->content_received); |
con_write_asciiz(conbuf); |
} |
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 build_download_list(list_t *download, list_t *src) |
{ |
int count = 0; |
char *cache_path; |
package_t *pkg, *tmp; |
fileinfo_t info; |
list_for_each_entry(tmp, src, list) |
{ |
cache_path = make_cache_path(tmp->filename); |
if( get_fileinfo(cache_path, &info) != 0) |
{ |
pkg = (package_t*)malloc(sizeof(package_t)); |
INIT_LIST_HEAD(&pkg->file_list); |
pkg->id = tmp->id; |
pkg->name = strdup(tmp->name); |
pkg->version = strdup(tmp->version); |
pkg->filename = strdup(tmp->filename); |
pkg->description = strdup(tmp->description); |
list_add_tail(&pkg->list, download); |
count++; |
}; |
} |
return count; |
}; |
void do_download(list_t *download_list) |
{ |
package_t *pkg, *tmp; |
char *cache_path; |
int count; |
list_for_each_entry_safe(pkg, tmp, download_list, list) |
{ |
sprintf(conbuf,"package %s-%s\n", pkg->name, pkg->version); |
con_write_asciiz(conbuf); |
cache_path = make_cache_path(pkg->filename); |
count = http_load_file(cache_path, make_url(pkg->filename)); |
sprintf(conbuf,"%s %d bytes loaded\n",cache_path, count); |
con_write_asciiz(conbuf); |
if( !test_archive(cache_path)) |
list_del_pkg(pkg); |
else |
unlink(cache_path); |
}; |
} |
void remove_missing_packages(list_t *install, list_t *missed) |
{ |
package_t *mpkg, *mtmp, *ipkg, *itmp; |
list_for_each_entry_safe(mpkg, mtmp, missed, list) |
{ |
list_for_each_entry_safe(ipkg, itmp, install, list) |
{ |
if(ipkg->id == mpkg->id) |
{ |
sprintf(conbuf,"skip missing package %s-%s\n", ipkg->name, ipkg->version); |
con_write_asciiz(conbuf); |
list_del_pkg(ipkg); |
}; |
} |
list_del_pkg(mpkg); |
}; |
}; |
int build_install_list(list_t *list, collection_t *collection) |
{ |
pkg_group_t *gr; |
int count = 0; |
list_for_each_entry(gr, &collection->groups, list) |
{ |
package_t *pkg, *tmp; |
list_for_each_entry(tmp, &gr->packages, list) |
{ |
pkg = (package_t*)malloc(sizeof(package_t)); |
INIT_LIST_HEAD(&pkg->file_list); |
pkg->id = tmp->id; |
pkg->name = strdup(tmp->name); |
pkg->version = strdup(tmp->version); |
pkg->filename = strdup(tmp->filename); |
pkg->description = strdup(tmp->description); |
list_add_tail(&pkg->list, list); |
count++; |
} |
}; |
return count; |
} |
int build_server_list(list_t *slist, const char *path) |
{ |
collection_t *collection; |
package_t *pkg; |
LIST_HEAD(install_list); |
LIST_HEAD(download_list); |
int count = 0; |
collection = load_collection_file(path); |
if(collection) |
{ |
pkg_group_t *gr; |
list_for_each_entry(gr, &collection->groups, list) |
{ |
package_t *pkg, *tmp; |
list_for_each_entry(tmp, &gr->packages, list) |
{ |
pkg = (package_t*)malloc(sizeof(package_t)); |
INIT_LIST_HEAD(&pkg->file_list); |
pkg->id = tmp->id; |
pkg->name = strdup(tmp->name); |
pkg->version = strdup(tmp->version); |
pkg->filename = strdup(tmp->filename); |
pkg->description = strdup(tmp->description); |
list_add_tail(&pkg->list, slist); |
count++; |
} |
}; |
}; |
return count; |
} |
void print_pkg_list(list_t *list) |
{ |
package_t *pkg; |
list_for_each_entry(pkg, list, list) |
{ |
sprintf(conbuf,"%s-%s\n", pkg->name, pkg->version); |
con_write_asciiz(conbuf); |
} |
} |