diff --git a/mrk-proto.h b/mrk-proto.h index ce9399d..424f88b 100644 --- a/mrk-proto.h +++ b/mrk-proto.h @@ -11,11 +11,20 @@ #define M_QRY_LIST 21 #define M_QRY_SEARCH 22 #define M_QRY_GET 23 +#define M_QRY_GETSRC 24 #define M_ANS_START 31 #define M_ANS_DATA 32 #define M_ANS_END 33 +#define M_SRC_START 41 +#define M_SRC_DATA 42 +#define M_SRC_END 43 + +#define M_ID_UUID 51 +#define M_ID_VERSION 52 +#define M_ID_ARCH 53 + #if defined(__x86_64__) # define ARCH "x86_64" #elif defined(__i386__) diff --git a/mrk-srv-build.sh b/mrk-srv-build.sh index ce061b5..15399e5 100755 --- a/mrk-srv-build.sh +++ b/mrk-srv-build.sh @@ -9,15 +9,26 @@ rm -rf Marrakesh || true export CC=gcc export CFLAGS="-O3 -ffast-math" export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig" +export NAME=`grep "^PROJ:" Marrakesh.mrk | tail -1 | sed -e 's/PROJ://g' | sed -e 's/ *$//' -e 's/^ *//'` +## this is a sample - you need to do this N times, once per arch +export MRKARCH="x86_64" +export MRKOS="linux" mrk extract *.mks mrk build mrk bin -cp *.mkb "$2"/ +export D="$2"/"$MRKOS-$MRKARCH" +mkdir -p "$D" || true +cp *.mkb "$D" +rm -f "$D"/"$NAME" || true +ln -sf *.mkb "$D"/"$NAME" -export NAME=`grep "^PROJ:" Marrakesh.mrk | tail -1 | sed -e 's/PROJ://g' | sed -e 's/ *$//' -e 's/^ *//'` -rm -f "$2"/"$NAME" || true -ln -sf *.mkb "$2"/"$NAME" +## # copy src to right place +export D="$2"/"src" +mkdir -p "$D" || true +cp *.mks "$D" +rm -f "$D"/"$NAME" || true +ln -sf *.mkb "$D"/"$NAME" cd /tmp rm -rf "$1" diff --git a/mrk-srv.c b/mrk-srv.c index 94971a1..106d9b1 100644 --- a/mrk-srv.c +++ b/mrk-srv.c @@ -55,6 +55,8 @@ typedef struct char *dir; FILE *f; Ecore_Exe *exe; + char *arch; + char *version; } Client; static Ecore_Ipc_Server *ipc = NULL; @@ -178,7 +180,8 @@ client_send(Client *c, const char *name) char tmp[4096]; char *lnk; - snprintf(tmp, sizeof(tmp), "%s/%s", repodir, name); + if (!c->arch) return; + snprintf(tmp, sizeof(tmp), "%s/%s/%s", repodir, c->arch, name); lnk = ecore_file_readlink(tmp); if (!lnk) ecore_ipc_client_send(c->client, 10, M_DOWN_START, 0, 0, 0, NULL, 0); @@ -207,6 +210,54 @@ client_send(Client *c, const char *name) } } +static void +client_src_send(Client *c, const char *name) +{ + char tmp[4096]; + char *lnk; + + snprintf(tmp, sizeof(tmp), "%s/src/%s", repodir, name); + lnk = ecore_file_readlink(tmp); + if (!lnk) + ecore_ipc_client_send(c->client, 10, M_SRC_START, 0, 0, 0, NULL, 0); + else + { + FILE *f; + + f = fopen(tmp, "rb"); + if (!f) + ecore_ipc_client_send(c->client, 10, M_SRC_START, 0, 0, 0, NULL, 0); + else + { + ecore_ipc_client_send(c->client, 10, M_SRC_START, 0, 0, 0, lnk, strlen(lnk)); + for (;;) + { + size_t size; + char buf[10000]; + + size = fread(buf, 1, 10000, f); + if (size <= 0) break; + ecore_ipc_client_send(c->client, 10, M_SRC_DATA, 0, 0, 0, buf, size); + } + ecore_ipc_client_send(c->client, 10, M_SRC_END, 0, 0, 0, NULL, 0); + fclose(f); + } + } +} + +static int +arch_ok(const char *arch) +{ + if (!strcmp(arch, "x86_64-linux")) return 1; + return 0; +} + +static int +version_ok(const char *arch) +{ + return 1; +} + static Eina_Bool _ipc_cb_add(void *data, int type, void *event) { @@ -283,6 +334,56 @@ _ipc_cb_dat(void *data, int type, void *event) } // e->data == appname (Terminology, Rage etc.) break; + case M_QRY_GETSRC: + if ((e->size > 0) && (e->size < 1000)) + { + char *name = malloc(e->size + 1); + if (name) + { + memcpy(name, e->data, e->size); + name[e->size] = 0; + client_src_send(c, name); + free(name); + } + } + // e->data == appname (Terminology, Rage etc.) + break; + case M_ID_UUID: + break; + case M_ID_VERSION: + if ((e->size > 0) && (e->size < 1000)) + { + char *version = malloc(e->size + 1); + if (version) + { + memcpy(version, e->data, e->size); + version[e->size] = 0; + if (version_ok(version)) + { + if (c->version) free(c->version); + c->version = version; + } + else free(version); + } + } + break; + case M_ID_ARCH: + if ((e->size > 0) && (e->size < 1000)) + { + char *arch = malloc(e->size + 1); + if (arch) + { + memcpy(arch, e->data, e->size); + arch[e->size] = 0; + if (arch_ok(arch)) + { + if (c->arch) free(c->arch); + c->arch = arch; + } + else free(arch); + } + } + break; default: break; } diff --git a/mrk.c b/mrk.c index 1cbedc9..7e51007 100644 --- a/mrk.c +++ b/mrk.c @@ -1054,6 +1054,15 @@ _ipc_cb_add(void *data, int type, void *event) Ecore_Ipc_Event_Server_Add *e = event; FILE *f; + char tmp[4096]; + + snprintf(tmp, sizeof(tmp), "%s-%s", os, arch); + ecore_ipc_server_send(ipc, 10, M_ID_ARCH, 0, 0, 0, + tmp, strlen(tmp)); + snprintf(tmp, sizeof(tmp), "%i.%i.%i", + eina_version->major, eina_version->minor, eina_version->micro); + ecore_ipc_server_send(ipc, 10, M_ID_VERSION, 0, 0, 0, + tmp, strlen(tmp)); f = fopen(up_path, "rb"); if (f) { @@ -1128,6 +1137,15 @@ static Eina_Bool _ipc2_cb_add(void *data, int type, void *event) { Ecore_Ipc_Event_Server_Add *e = event; + char tmp[4096]; + + snprintf(tmp, sizeof(tmp), "%s-%s", os, arch); + ecore_ipc_server_send(ipc, 10, M_ID_ARCH, 0, 0, 0, + tmp, strlen(tmp)); + snprintf(tmp, sizeof(tmp), "%i.%i.%i", + eina_version->major, eina_version->minor, eina_version->micro); + ecore_ipc_server_send(ipc, 10, M_ID_VERSION, 0, 0, 0, + tmp, strlen(tmp)); ecore_ipc_server_send(ipc, 10, M_QRY_GET, 0, 0, 0, down_name, strlen(down_name)); return EINA_TRUE; @@ -1220,6 +1238,115 @@ package_down(const char *name) return 1; } +static char *downsrc_name = NULL; +static char *downsrc_file = NULL; +static FILE *downsrc_f = NULL; + +static Eina_Bool +_ipc3_cb_add(void *data, int type, void *event) +{ + Ecore_Ipc_Event_Server_Add *e = event; + char tmp[4096]; + + snprintf(tmp, sizeof(tmp), "%s-%s", os, arch); + ecore_ipc_server_send(ipc, 10, M_ID_ARCH, 0, 0, 0, + tmp, strlen(tmp)); + snprintf(tmp, sizeof(tmp), "%i.%i.%i", + eina_version->major, eina_version->minor, eina_version->micro); + ecore_ipc_server_send(ipc, 10, M_ID_VERSION, 0, 0, 0, + tmp, strlen(tmp)); + ecore_ipc_server_send(ipc, 10, M_QRY_GET, 0, 0, 0, + downsrc_name, strlen(downsrc_name)); + return EINA_TRUE; +} + +static Eina_Bool +_ipc3_cb_del(void *data, int type, void *event) +{ + Ecore_Ipc_Event_Server_Del *e = event; + err("disconnect..."); + ecore_main_loop_quit(); + return EINA_TRUE; +} + +static Eina_Bool +_ipc3_cb_dat(void *data, int type, void *event) +{ + Ecore_Ipc_Event_Server_Data *e = event; + if (e->major == 10) + { + switch (e->minor) + { + case M_SRC_START: + if ((e->size > 0) && (e->size <= 1000) && (e->data)) + { + char *file = malloc(e->size + 1); + if (file) + { + memcpy(file, e->data, e->size); + file[e->size] = 0; + if ((sane_forbidden_path(file, sane_name_veto) && + sane_allowed_path(file, sane_name_ok))) + { + if (!downsrc_f) + { + char tmp[4096]; + + downsrc_file = file; + snprintf(tmp, sizeof(tmp), + "%s/Applications/.tmp", + getenv("HOME")); + ecore_file_mkpath(tmp); + snprintf(tmp, sizeof(tmp), + "%s/Applications/.tmp/%s", + getenv("HOME"), downsrc_file); + if (ecore_file_exists(tmp)) + err("file already exists"); + downsrc_f = fopen(file, "wb"); + printf("%s\n", file); + } + else err("already have download"); + } + else err("mangled filename"); + } + else err("download file not sane"); + } + else err("no such package"); + break; + case M_SRC_DATA: + if ((downsrc_f) && (e->data) && (e->size > 0) && (e->size <= 10000)) + { + fwrite(e->data, e->size, 1, downsrc_f); + } + break; + case M_SRC_END: + if (downsrc_f) + { + fclose(downsrc_f); + downsrc_f = NULL; + ecore_main_loop_quit(); + } + break; + default: + break; + } + } + return EINA_TRUE; +} + +static int +package_downsrc(const char *name) +{ + ipc = ecore_ipc_server_connect(ECORE_IPC_REMOTE_SYSTEM, server, server_port, NULL); + if (!ipc) return 0; + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, _ipc3_cb_add, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, _ipc3_cb_del, NULL); + ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, _ipc3_cb_dat, NULL); + downsrc_name = strdup(name); + ecore_main_loop_begin(); + return 1; +} + int main(int argc, char **argv) { @@ -1338,6 +1465,8 @@ main(int argc, char **argv) } else if (!strcmp(argv[1], "getsrc")) { + if (argc < 3) err("need package to download"); + if (!package_downsrc(argv[2])) return 1; } else if (!strcmp(argv[1], "check")) {