marrakesh - add src fetch and client arch + version ident
This commit is contained in:
parent
3d791bd5ff
commit
861ed79794
|
@ -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__)
|
||||
|
|
|
@ -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
103
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;
|
||||
}
|
||||
|
|
129
mrk.c
129
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"))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue