marrakesh - add src fetch and client arch + version ident

This commit is contained in:
Carsten Haitzler 2014-09-26 12:53:49 +09:00
parent 3d791bd5ff
commit 861ed79794
4 changed files with 255 additions and 5 deletions

View File

@ -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__)

View File

@ -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"

103
mrk-srv.c
View File

@ -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;
}

129
mrk.c
View File

@ -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"))
{