OK, spanking noted, examine and its referenced to ewl moved out and into apps/examine

SVN revision: 8277
This commit is contained in:
handyande 2004-01-05 22:29:30 +00:00 committed by handyande
parent df231df3b6
commit 023fa75ea5
6 changed files with 0 additions and 1337 deletions

View File

@ -498,11 +498,6 @@ have_ecore_config="no";
ecore_config_cflags="";
ecore_config_libs="";
ewl_cflags=`ewl-config --cflags`
ewl_libs=`ewl-config --libs`
AC_SUBST(ewl_cflags)
AC_SUBST(ewl_libs)
AC_ARG_ENABLE(ecore-config,
[ --disable-ecore-config disable the ecore_config module], [
if [ test "$enableval" = "yes" ]; then

View File

@ -60,24 +60,11 @@ INCLUDES = \
-I$(top_srcdir)/src/lib/ecore_config \
@evas_cflags@ \
@x_cflags@ \
@ewl_cflags@ \
@edb_cflags@
if BUILD_ECORE_CONFIG
bin_PROGRAMS = \
ecore_test \
exsh \
ecore_evas_test
# You FOOOOOOOOLS! examine requires ewl. ewl requires ecore. see the circular
# dependancy? NO NO NO!
#examine \
else
bin_PROGRAMS = \
ecore_test \
ecore_evas_test
endif
ecore_test_SOURCES = \
ecore_test.c
@ -143,43 +130,3 @@ $(ECORE_CON_LIB) \
$(ECORE_IPC_LIB) \
$(ECORE_TXT_LIB)
exsh_SOURCES = \
exsh.c \
ecore_config_client.c \
ecore_config_client.h
exsh_LDADD = \
$(top_builddir)/src/lib/ecore/libecore.la \
$(ECORE_IPC_LIB) \
$(ECORE_CONFIG_LIB) \
@edb_libs@ -ldl
exsh_LDFLAGS =
exsh_CFLAGS = \
$(CFLAGS) \
$(INCLUDES) \
-I$(top_builddir)/src/lib/ecore_config/ \
@edb_cflags@
exsh_DEPENDENCIES = \
$(top_builddir)/src/lib/ecore/libecore.la \
$(ECORE_CONFIG_LIB)
examine_SOURCES = \
examine.c \
ecore_config_client.c \
ecore_config_client.h
examine_LDADD = \
@ewl_libs@ -ldl
examine_LDFLAGS =
examine_CFLAGS = \
$(CFLAGS) \
$(INCLUDES) \
@ewl_cflags@
examine_DEPENDENCIES =

View File

@ -1,258 +0,0 @@
/* by Azundris */
//#include "config.h"
#include <Ecore.h>
#include <Ecore_Ipc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <dirent.h>
#include <limits.h>
#include "ipc.h"
#include "ecore_config_client.h"
/*****************************************************************************/
const char *ecore_config_error(int no) {
static const char *ecore_config_errstr[]={
"Success",
"General failure",
"No data",
"Action was not necessary",
"Out of memory",
"Not found",
"Resource unavailable",
"Parameters were of the wrong type",
"Maximum length for path exceeded",
"Partial success",
"Parameter is not an executable file",
"The type of monitor you are trying to set does not match the type of the object you are trying to set the monitor on",
"File handed to meta-data provider has invalid contents",
"File-I/O error in meta-data provider",
"Could not activate meta-data provider",
"Action requires a file",
"Action not supported" };
if(no<0)
no=-no;
if(no<=-ECORE_CONFIG_ERR_NOTSUPP)
return ecore_config_errstr[no];
return "No such error"; }
static int print_data(char *d,size_t l) {
char *e=d+l,*f;
while(d<e) {
l=(d[1]<<8)|d[2];
if(*d=='s') {
f=d+3;
printf(" STR-%ld: \"%s\"\n",l,f); }
else
printf(" skipping chunk type '%c' {%ld bytes}...\n",*d,l);
d+=3+l; }
return ECORE_CONFIG_ERR_SUCC; }
/*****************************************************************************/
int is_dir(const char *dir) {
struct stat st;
if (stat(dir, &st))
return 0;
return (S_ISDIR(st.st_mode));
}
int ex_ipc_init(ex_ipc_server_list **srv_list,char *pipe_name,connstate *cs) {
int global, port, connected;
struct stat st;
char *p;
char str[PATH_MAX], buf[PATH_MAX];
DIR *dir;
struct dirent *socket;
Ecore_Ipc_Server *tmp_sock;
ex_ipc_server_list *tmp;
global=FALSE;
port=0;
if(ecore_ipc_init()<1)
return ECORE_CONFIG_ERR_FAIL;
if(!srv_list)
return ECORE_CONFIG_ERR_FAIL;
if(*srv_list)
return ECORE_CONFIG_ERR_IGNORED;
if((p=getenv("HOME"))) { /* debug-only ### FIXME */
sprintf(str,"%s/.ecore/%s/.global",p,pipe_name);
if (stat(str, &st))
global=FALSE;
else
global=TRUE;
sprintf(str,"%s/.ecore/%s/",p,pipe_name);
snprintf(buf,PATH_MAX,str);
if((dir=opendir(buf))) {
connected=0;
while ((socket=readdir(dir))) {
if (!strcmp(socket->d_name, ".") || !strcmp(socket->d_name, "..") ||
!strcmp(socket->d_name, ".global"))
continue;
if (!is_dir(socket->d_name)) {
port=atoi(socket->d_name);
E(2,"Trying %s on port %d ", pipe_name, port);
//if (!connected) {
if((tmp_sock=ecore_ipc_server_connect(ECORE_IPC_LOCAL_USER,pipe_name,port,NULL))) {
E(2, "- connected!\n");
if (!(tmp=malloc(sizeof(ex_ipc_server_list))))
return ECORE_CONFIG_ERR_OOM;
memset(tmp,0,sizeof(ex_ipc_server_list));
tmp->srv=tmp_sock;
if (!*srv_list)
*srv_list=tmp;
else {
tmp->next=*srv_list;
*srv_list=tmp;}
connected=1;
if (!global)
break;
} else {
/* not connected */
E(2, "- failed :(\n"); }
//} else {
// E(3, "Should also try connecting to %d!!!\n", port);
//}
} /* is not dir */
} /* while dir */
if (connected) {
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, ex_ipc_server_con,cs);
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, ex_ipc_server_dis,cs);
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,ex_ipc_server_sent,NULL);
return ECORE_CONFIG_ERR_SUCC;
}
} /* openfir */
} else { /* if we cannot access the home variable */
if((tmp_sock=ecore_ipc_server_connect(ECORE_IPC_LOCAL_USER,pipe_name,0,NULL))) {
E(2, "Connected to %s on default port (0)!\n", pipe_name);
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, ex_ipc_server_con,cs);
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, ex_ipc_server_dis,cs);
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA,ex_ipc_server_sent,NULL);
if (!(tmp=malloc(sizeof(ex_ipc_server_list))))
return ECORE_CONFIG_ERR_OOM;
memset(tmp,0,sizeof(ex_ipc_server_list));
tmp->srv=tmp_sock;
if (!*srv_list)
*srv_list=tmp;
return ECORE_CONFIG_ERR_SUCC; }
}
*srv_list=NULL;
return ECORE_CONFIG_ERR_NOTFOUND; }
int ex_ipc_exit(ex_ipc_server_list **srv_list) {
ex_ipc_server_list *tmp = *srv_list;
if(!srv_list)
return ECORE_CONFIG_ERR_FAIL;
if(*srv_list)
while (tmp) {
ecore_ipc_server_del(tmp->srv);
tmp = tmp->next;
}
*srv_list=NULL;
ecore_ipc_shutdown();
return ECORE_CONFIG_ERR_SUCC; }
int ex_ipc_sigexit(void *data, int type, void *event) {
return 0; }
/*****************************************************************************/
int ex_ipc_send(ex_ipc_server_list **srv_list,int major,int minor,void *data,int size) {
ex_ipc_server_list *tmp = *srv_list;
static int ref=0;
int ret;
if(!srv_list)
return ECORE_CONFIG_ERR_FAIL;
if(!*srv_list)
return ECORE_CONFIG_ERR_NODATA;
ret = ECORE_CONFIG_ERR_NODATA;
if(size<0)
size=data?strlen(data)+1:0;
while (tmp) {
ret=ecore_ipc_server_send(tmp->srv,major,minor,++ref,0,0,data,size);
tmp = tmp->next;
}
E(2,"exsh: we sent: %2d.%02d #%03d \"%s\".%d => %d\n",
major,minor,ref,(char *)data,size,ret);
if((debug>=2)&&(size>0))
print_data(data,size);
ecore_main_loop_begin();
return ECORE_CONFIG_ERR_SUCC; }
/*****************************************************************************/
int send_append(char **mp,int *lp,char *dp) {
size_t l=strlen(dp)+1+1+2+*lp,l2;
char *m;
if(!(m=realloc(*mp,l)))
return ECORE_CONFIG_ERR_OOM;
l2=*lp;
*mp=m;
*lp=l;
m+=l2;
l2=strlen(dp)+1;
*(m++)='s';
*(m++)=l2<<8;
*(m++)=l2%256;
strcpy(m,dp);
return ECORE_CONFIG_ERR_SUCC; }
/*****************************************************************************/

View File

@ -1,25 +0,0 @@
typedef enum { OFFLINE,ONLINE } connstate;
typedef struct ex_ipc_server_list {
Ecore_Ipc_Server *srv;
connstate state;
struct ex_ipc_server_list *next; } ex_ipc_server_list;
/* in client */
int ex_ipc_server_con(void *data,int type,void *event);
int ex_ipc_server_dis(void *data,int type,void *event);
int ex_ipc_server_sent(void *data,int type,void *event);
/* in client lib */
const char *ecore_config_error(int no);
int ex_ipc_init(ex_ipc_server_list **srv_list,char *pipe_name,connstate *cs);
int ex_ipc_exit(ex_ipc_server_list **srv_list);
int ex_ipc_sigexit(void *data, int type, void *event);
int ex_ipc_send(ex_ipc_server_list **srv_list,int major,int minor,void *data,int size);
int send_append(char **mp,int *lp,char *dp);
extern int debug;
#ifndef E
# define E(lvl,fmt,args...) do { if(debug>=(lvl)) fprintf(stderr,fmt,## args); } while(0)
#endif

View File

@ -1,421 +0,0 @@
/* by Azundris */
/* Modified for ecore_config by HandyAndE */
#include "Ecore_Config.h"
#include <Ewl.h>
#include <Ecore.h>
#include <Ecore_Ipc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "ipc.h"
#include "ecore_config_client.h"
#define MI 4096
typedef enum {
P_NONE=0,
P_SERIAL=1,
P_DIR=2,
P_FILE=4,
P_KEY=8,
P_VALUE=16,
P_SILENT=32,
P_HELPONLY=64,
P_LAST=P_HELPONLY } para;
typedef struct _call {
ex_ipc_call id;
char *name;
para signature; } call;
static call calls[]={
{ IPC_NONE, "bundle", P_HELPONLY},
{ IPC_BUNDLE_LIST, "bundle-list", P_NONE},
{ IPC_BUNDLE_NEW, "bundle-new", P_DIR},
{ IPC_BUNDLE_LABEL_GET, "bundle-label-get", P_SILENT|P_SERIAL},
{ IPC_BUNDLE_LABEL_GET, "bundle-label", P_SERIAL},
{ IPC_BUNDLE_LABEL_SET, "bundle-label-set", P_SILENT|P_SERIAL|P_DIR},
{ IPC_BUNDLE_LABEL_SET, "bundle-label", P_SILENT|P_HELPONLY},
{ IPC_BUNDLE_LABEL_FIND, "bundle-label-find", P_SILENT|P_DIR},
{ IPC_BUNDLE_LABEL_FIND, "bundle-find", P_DIR},
{ IPC_NONE, "prop", P_HELPONLY},
{ IPC_PROP_LIST, "prop-list", P_SERIAL},
{ IPC_PROP_DESC, "prop-describe", P_SERIAL|P_KEY},
{ IPC_PROP_GET, "prop-get", P_SERIAL|P_KEY},
{ IPC_PROP_SET, "prop-set", P_SERIAL|P_KEY|P_VALUE},
{ IPC_PROP_LIST, "list", P_SILENT|P_SERIAL},
{ IPC_PROP_DESC, "describe", P_SILENT|P_SERIAL|P_KEY},
{ IPC_PROP_DESC, "explain", P_SILENT|P_SERIAL|P_KEY},
{ IPC_PROP_GET, "print", P_SILENT|P_SERIAL|P_KEY},
{ IPC_PROP_GET, "get", P_SILENT|P_SERIAL|P_KEY},
{ IPC_PROP_SET, "set", P_SILENT|P_SERIAL|P_KEY|P_VALUE},
{ IPC_PROP_SET, "let", P_SILENT|P_SERIAL|P_KEY|P_VALUE},
};
int debug=1;
void print_usage(void);
Ewl_Widget *main_win;
Ewl_Widget *main_box;
/*****************************************************************************/
int ex_ipc_server_con(void *data,int type,void *event) {
connstate *cs=(connstate *)data;
*cs=ONLINE;
E(1,"ecore_config: Connected .\n"); /*to %s.\n", pipe_name)); */
return 1; }
int ex_ipc_server_dis(void *data,int type,void *event) {
connstate *cs=(connstate *)data;
*cs=OFFLINE;
ecore_main_loop_quit();
E(1,"ecore_config: Disconnected.\n");
return 1; }
int ex_ipc_server_sent(void *data,int type,void *event) {
Ewl_Widget *row, *cell[2], *text[2];
char *label, *typename, *start, *end;
Ecore_Ipc_Event_Server_Data *e;
e=(Ecore_Ipc_Event_Server_Data *)event;
E(2,"application sent: %2d.%02d #%03d=>#%03d \"%s\".%d\n",
e->major,e->minor,0,0,(char *)e->data,e->size);
if(e->data&&(e->size>0)) {
printf("%s\n",(char *)e->data);
row = ewl_grid_new(2, 1);
cell[0] = ewl_cell_new();
cell[1] = ewl_cell_new();
text[0] = ewl_text_new("Property");
text[1] = ewl_text_new("type");
ewl_container_append_child(EWL_CONTAINER(cell[0]), text[0]);
ewl_container_append_child(EWL_CONTAINER(cell[1]), text[1]);
ewl_grid_add(EWL_GRID(row), cell[0], 1, 1, 1, 1);
ewl_grid_add(EWL_GRID(row), cell[1], 2, 2, 1, 1);
ewl_widget_show(cell[0]);
ewl_widget_show(cell[1]);
ewl_widget_show(text[0]);
ewl_widget_show(text[1]);
ewl_container_append_child(EWL_CONTAINER(main_box), row);
ewl_widget_show(row);
start = (char *)e->data;
end = ((char *)e->data) + strlen((char *)e->data);
while (*start) {
label = start;
while (*start) {
if (*start == ':') {
*start = '\0';
break;
}
start++;
}
start++;
typename = ++start;
while (*start) {
if (*start == '\n') {
*start = '\0';
break;
}
start++;
}
if (*label && *typename) {
row = ewl_grid_new(2, 1);
cell[0] = ewl_cell_new();
cell[1] = ewl_cell_new();
text[0] = ewl_text_new(label);
if (!strcmp(typename, "string"))
text[1] = ewl_entry_new("<a string>");
else if (!strcmp(typename, "integer"))
text[1] = ewl_spinner_new();
else
text[1] = ewl_text_new(typename);
ewl_object_set_minimum_h(EWL_OBJECT(text[1]), 12);
ewl_container_append_child(EWL_CONTAINER(cell[0]), text[0]);
ewl_container_append_child(EWL_CONTAINER(cell[1]), text[1]);
ewl_grid_add(EWL_GRID(row), cell[0], 1, 1, 1, 1);
ewl_grid_add(EWL_GRID(row), cell[1], 2, 2, 1, 1);
ewl_widget_show(cell[0]);
ewl_widget_show(cell[1]);
ewl_widget_show(text[0]);
ewl_widget_show(text[1]);
ewl_container_append_child(EWL_CONTAINER(main_box), row);
ewl_widget_show(row);
ewl_object_set_minimum_h(EWL_OBJECT(row), 20);
}
start++;
}
}
else if(e->response<0)
printf("error #%d\n",e->response);
else if(!e->response)
printf("OK\n");
else
printf("result: %d\n",e->response);
ecore_main_loop_quit();
return 1; }
/*****************************************************************************/
/* parser */
static long get_serial(char **m) {
long ret=-1;
if(m&&*m) {
char *b;
ret=strtol(*m,&b,10);
if(b==*m)
ret=0;
else {
while(isspace(*b))
b++;
*m=b; }}
return ret; }
static int get_token(char **beg,char **end,int tol) {
int l;
char *b=*beg,*e;
if(!b||!*b)
return ECORE_CONFIG_ERR_NODATA;
while(isspace(*b))
b++;
e=b;
if(*e=='\"') {
do {
e++;
if(*e=='\\')
e++;
} while(*e&&*e!='\"'); }
else {
while(*e&&!isspace(*e)) {
if(tol&&isupper(*e))
*e=tolower(*e);
e++; }}
if(*e) {
*(e++)='\0';
while(*e&&isspace(*e))
*(e++)='\0';
*end=e; }
else
*end=NULL;
*beg=b;
l=e-b;
return (l<=0)?ECORE_CONFIG_ERR_NODATA:l; }
/*****************************************************************************/
static int handle_any(ex_ipc_server_list **server,call *cp,char *line) {
long serial=-1;
int ret,pars=0,l=0;
char *b=line,*e,*file=NULL,*k=NULL,*v=NULL,*m=NULL;
if(cp->signature&P_SERIAL)
serial=get_serial(&b);
if(cp->signature&(P_DIR|P_FILE)) {
if((ret=get_token(&b,&e,FALSE))<0)
return ret;
file=b;
pars++;
b=e; }
/* b=e?e+1:NULL; */
if(cp->signature&(P_KEY)) {
if((ret=get_token(&b,&e,TRUE))<0)
return ret;
k=b;
pars++;
b=e; }
/* b=e?e+1:NULL; */
if(cp->signature&(P_VALUE)) {
if((ret=get_token(&b,&e,FALSE))<0)
return ret;
v=b;
pars++;
b=e; }
/* b=e?e+1:NULL; */
if(file)
send_append(&m,&l,file);
if(k)
send_append(&m,&l,k);
if(v)
send_append(&m,&l,v);
E(3,"found \"%s\" |serial:%ld|file:%s|key:%s|value:%s|\n",cp->name,serial,file,k,v);
ret=ex_ipc_send(server,cp->id,serial,m,l);
if(m)
free(m);
return ret; }
/*****************************************************************************/
static int abbrevcmp(char *a,char *t) {
size_t l1;
char *p,*q;
int ret;
while(1) {
if(!(p=strchr(a,'-')))
p=a+strlen(a);
l1=p-a;
if((ret=strncasecmp(a,t,l1)))
return ret;
a=p;
if(*a)
a++;
if(!(q=strchr(t,'-')))
t=t+strlen(t);
else
t=q+1;
if(!*a)
return *t?-1:0;
else if(!*t)
return 1; }}
static call *find_call(char *b) {
int nc=sizeof(calls)/sizeof(call);
call *cp=calls,*r=NULL;
while(nc-->0) {
if(!abbrevcmp(b,cp->name)) {
if(r) {
printf("\"%s\" is not unique.\n",b);
return NULL; }
r=cp; }
cp++; }
return r; }
/*****************************************************************************/
void __destroy_main_window(Ewl_Widget *main_win, void *ex_data, void *user_data) {
ewl_widget_destroy(main_win);
ewl_main_quit();
return;
}
int main(int argc,char **argv) {
ex_ipc_server_list *server=NULL;
int ret=ECORE_CONFIG_ERR_SUCC,cc=0;
connstate cs=OFFLINE;
char *pipe_name=NULL;
if (argc <= 1 || (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0)) {
print_usage();
return 0;
}
pipe_name=argv[1];
printf("ecore_configr: connecting to %s.\n", pipe_name);
ecore_init();
ecore_app_args_set(argc,(const char **)argv);
ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT,ex_ipc_sigexit,&cs);
ewl_init(&argc, argv);
main_win = ewl_window_new();
ewl_window_set_title(EWL_WINDOW(main_win), "Examine Configuration Client");
ewl_object_set_minimum_size(EWL_OBJECT(main_win), 200, 100);
ewl_callback_append(main_win, EWL_CALLBACK_DELETE_WINDOW, __destroy_main_window, NULL);
main_box = ewl_vbox_new();
ewl_container_append_child(EWL_CONTAINER(main_win), main_box);
ewl_object_set_padding(EWL_OBJECT(main_box), 2, 2, 2, 2);
ewl_widget_show(main_box);
reconnect:
cc++;
if((ret=ex_ipc_init(&server,pipe_name,&cs))!=ECORE_CONFIG_ERR_SUCC)
E(0,"exsh: %sconnect to %s failed: %d\n",(cc>1)?"re":"",pipe_name,ret);
else {
call *c=find_call("prop-list");
handle_any(&server, c, "");
ewl_widget_show(main_win);
ewl_main();
}
ex_ipc_exit(&server);
ecore_shutdown();
return ret; }
void print_usage(void) {
printf("Examine - ecore_config Graphical Configuration Client\n");
printf("Version 0.0.1 (Nov 3 2003)\n");
printf("(c)2002-2003 by Azundris and HandyAndE.\n");
printf("Usage: examine [options] target\n\n");
printf("Supported Options:\n");
printf("-h, --help Print this help text\n");
}
/*****************************************************************************/

View File

@ -1,575 +0,0 @@
/* by Azundris */
/* Modified for ecore_config by HandyAndE */
#include "Ecore_Config.h"
#include <Ecore.h>
#include <Ecore_Ipc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_LIBREADLINE
# define HISTORY "/.ecore/exsh_history"
# if defined(HAVE_READLINE_READLINE_H)
# include <readline/readline.h>
# elif defined(HAVE_READLINE_H)
# include <readline.h>
# else
extern char *readline();
# endif
char *cmdline=NULL;
#endif
#ifdef HAVE_READLINE_HISTORY
# if defined(HAVE_READLINE_HISTORY_H)
# include <readline/history.h>
# elif defined(HAVE_HISTORY_H)
# include <history.h>
# else
extern void add_history();
extern int write_history();
extern int read_history();
# endif
#endif
#include "ipc.h"
#include "ecore_config_client.h"
#define OUT "< "
#define ERR "! "
#define IN "> "
#define MI 4096
#define HELP_ALL "exsh -- ecore_config shell"
typedef enum {
P_NONE=0,
P_SERIAL=1,
P_DIR=2,
P_FILE=4,
P_KEY=8,
P_VALUE=16,
P_SILENT=32,
P_HELPONLY=64,
P_LAST=P_HELPONLY } para;
typedef struct _call {
ex_ipc_call id;
char *name;
para signature;
const char *help; } call;
void print_usage(void);
static call calls[]={
{ IPC_NONE, "bundle", P_HELPONLY, "List of propertyset-related commands" },
{ IPC_BUNDLE_LIST, "bundle-list", P_NONE, "bundle.list\nList all property sets, giving bundle id and label for each." },
{ IPC_BUNDLE_NEW, "bundle-new", P_DIR, "bundle.new <label>\nCreate a new bundle labeled <label>." },
{ IPC_BUNDLE_LABEL_GET, "bundle-label-get", P_SILENT|P_SERIAL, "bundle.label.get <bundle-id>\nShow the label of bundle <bundle-id>." },
{ IPC_BUNDLE_LABEL_GET, "bundle-label", P_SERIAL, "bundle.label -- short for bundle.label.get, see there." },
{ IPC_BUNDLE_LABEL_SET, "bundle-label-set", P_SILENT|P_SERIAL|P_DIR, "bundle.label.set <bundle-id> <label>\nLabel the bundle <bundle-id> <label>." },
{ IPC_BUNDLE_LABEL_SET, "bundle-label", P_SILENT|P_HELPONLY, "List of bundle-label related functions." },
{ IPC_BUNDLE_LABEL_FIND, "bundle-label-find", P_SILENT|P_DIR, "bundle.label.find <label>\nReturn the ID of the first bundle labeled as <label>." },
{ IPC_BUNDLE_LABEL_FIND, "bundle-find", P_DIR, "bundle.find -- short for bundle.label.find, see there." },
{ IPC_NONE, "prop", P_HELPONLY, "List of property-related commands" },
{ IPC_PROP_LIST, "prop-list", P_SERIAL, "prop.list <bundle-id>\nList all properties that are currently registered for bundle <bundle-id>." },
{ IPC_PROP_DESC, "prop-describe", P_SERIAL|P_KEY, "prop.desc <bundle-id> <prop>\nDescribe property <prop> set on bundle <bundle-id>." },
{ IPC_PROP_GET, "prop-get", P_SERIAL|P_KEY, "prop.get <bundle-id> <prop>\nShow the value of property <prop> set on bundle <bundle-id>." },
{ IPC_PROP_SET, "prop-set", P_SERIAL|P_KEY|P_VALUE, "prop.set <bundle-id> <prop> <new-value>\nSet the value of property <prop> set on bundle <bundle-id> to <new-value>." },
{ IPC_PROP_LIST, "list", P_SILENT|P_SERIAL, "list -- short for prop.list, see there." },
{ IPC_PROP_DESC, "describe", P_SILENT|P_SERIAL|P_KEY, "desc -- short for prop.desc, see there." },
{ IPC_PROP_DESC, "explain", P_SILENT|P_SERIAL|P_KEY, "desc -- short for prop.desc, see there." },
{ IPC_PROP_GET, "print", P_SILENT|P_SERIAL|P_KEY, "get -- short for prop.get, see there." },
{ IPC_PROP_GET, "get", P_SILENT|P_SERIAL|P_KEY, "get -- short for prop.get, see there." },
{ IPC_PROP_SET, "set", P_SILENT|P_SERIAL|P_KEY|P_VALUE, "set -- short for prop.get, see there." },
{ IPC_PROP_SET, "let", P_SILENT|P_SERIAL|P_KEY|P_VALUE, "let -- short for prop.get, see there." },
};
int debug=99;
/*****************************************************************************/
int ex_ipc_server_con(void *data,int type,void *event) {
connstate *cs=(connstate *)data;
*cs=ONLINE;
E(1,"exsh: Connected .\n", NULL); /*to %s.\n", pipe_name)); */
return 1; }
int ex_ipc_server_dis(void *data,int type,void *event) {
connstate *cs=(connstate *)data;
*cs=OFFLINE;
ecore_main_loop_quit();
E(1,"exsh: Disconnected.\n", NULL);
return 1; }
int ex_ipc_server_sent(void *data,int type,void *event) {
Ecore_Ipc_Event_Server_Data *e=(Ecore_Ipc_Event_Server_Data *)event;
E(2,"application sent: %2d.%02d #%03d=>#%03d \"%s\".%d\n",
e->major,e->minor,0,0,(char *)e->data,e->size);
if(e->data&&(e->size>0))
printf(OUT "%s\n",(char *)e->data);
else if(e->response<0)
printf(OUT "error #%d\n",e->response);
else if(!e->response)
printf(OUT "OK\n");
else
printf(OUT "result: %d\n",e->response);
ecore_main_loop_quit();
return 1; }
/*****************************************************************************/
/* parser */
static long get_serial(char **m) {
long ret=-1;
if(m&&*m) {
char *b;
ret=strtol(*m,&b,10);
if(b==*m)
ret=0;
else {
while(isspace(*b))
b++;
*m=b; }}
return ret; }
static int get_token(char **beg,char **end,int tol) {
int l;
char *b=*beg,*e;
if(!b||!*b)
return ECORE_CONFIG_ERR_NODATA;
while(isspace(*b))
b++;
e=b;
if(*e=='\"') {
do {
e++;
if(*e=='\\')
e++;
} while(*e&&*e!='\"'); }
else {
while(*e&&!isspace(*e)) {
if(tol&&isupper(*e))
*e=tolower(*e);
e++; }}
if(*e) {
*(e++)='\0';
while(*e&&isspace(*e))
*(e++)='\0';
*end=e; }
else
*end=NULL;
*beg=b;
l=e-b;
return (l<=0)?ECORE_CONFIG_ERR_NODATA:l; }
/*****************************************************************************/
static int handle_any(ex_ipc_server_list **server_list,call *cp,char *line) {
long serial=-1;
int ret,pars=0,l=0;
char *b=line,*e,*file=NULL,*k=NULL,*v=NULL,*m=NULL;
if(cp->signature&P_SERIAL)
serial=get_serial(&b);
if(cp->signature&(P_DIR|P_FILE)) {
if((ret=get_token(&b,&e,FALSE))<0)
return ret;
file=b;
pars++;
b=e; }
/* b=e?e+1:NULL; */
if(cp->signature&(P_KEY)) {
if((ret=get_token(&b,&e,TRUE))<0)
return ret;
k=b;
pars++;
b=e; }
/* b=e?e+1:NULL; */
if(cp->signature&(P_VALUE)) {
if((ret=get_token(&b,&e,FALSE))<0)
return ret;
v=b;
pars++;
b=e; }
/* b=e?e+1:NULL; */
if(file)
send_append(&m,&l,file);
if(k)
send_append(&m,&l,k);
if(v)
send_append(&m,&l,v);
E(3,"found \"%s\" |serial:%ld|file:%s|key:%s|value:%s|\n",cp->name,serial,file,k,v);
ret=ex_ipc_send(server_list,cp->id,serial,m,l);
if(m)
free(m);
return ret; }
/*****************************************************************************/
static char *clean(char *c) {
char *p=c;
size_t l;
while(*p) {
if(*p=='\"') {
do {
p++;
if(*p=='\\')
p++;
} while(*p&&*p!='\"');
if(!*p) {
E(0,"unterminated string in input?\n", NULL);
*c='\0';
return c; }
else
p++; }
else if(isspace(*p)) { /* turn any sort of space into a single ' ' */
l=strlen(p);
while(isspace(p[1]))
memmove(p,p+1,l--);
*(p++)=' '; }
else
p++; }
if((l=strlen(c))) {
while(isspace(*c))
memmove(c,c+1,l--);
while(isspace(c[l-1]))
c[l-1]='\0'; }
p=c;
while(*p&&!isspace(*p)) {
if(!isalpha(*p)) {
while(p[1]&&!isalpha(p[1]))
memmove(p,p+1,strlen(p));
*p='-'; }
p++; }
return c; }
static int abbrevcmp(char *a,char *t) {
size_t l1;
char *p,*q;
int ret;
while(1) {
if(!(p=strchr(a,'-')))
p=a+strlen(a);
l1=p-a;
if((ret=strncasecmp(a,t,l1)))
return ret;
a=p;
if(*a)
a++;
if(!(q=strchr(t,'-')))
t=t+strlen(t);
else
t=q+1;
if(!*a)
return *t?-1:0;
else if(!*t)
return 1; }}
static call *find_call(char *b) {
int nc=sizeof(calls)/sizeof(call);
call *cp=calls,*r=NULL;
while(nc-->0) {
if(!abbrevcmp(b,cp->name)) {
if(r) {
printf(ERR "\"%s\" is not unique.\n",b);
return NULL; }
r=cp; }
cp++; }
return r; }
static call *find_abbrev(char **beg,char **end) {
char *b=*beg,*m,*q;
size_t l=strlen(b);
call *cp=calls;
if(!(q=m=malloc(l*2)))
return NULL;
while(*b) {
*(q++)=*(b++);
*(q++)='-'; }
*(--q)='\0';
cp=find_call(m);
free(m);
return cp; }
static call *find_with_delims(char **beg,char **end) {
char *b=*beg;
int d=0;
while(*b) {
if(*b=='-')
d++;
b++; }
return d?find_call(*beg):NULL; }
static call *find_with_spaces(char **beg,char **end) {
call *cp=NULL,*lcp=NULL;
char *e=*end,*b=*beg,*d=NULL;
if(!*end)
return find_call(b);
while(1) {
if(!(cp=find_call(b))) {
*e=' ';
if(d) {
*d='\0';
*end=d; }
return lcp; }
lcp=cp;
d=e;
*(e++)='-';
if(!(e=strchr(e,' '))) {
if((cp=find_call(b))) {
*end=NULL;
return cp; }
*end=d;
return lcp; }
*e='\0'; }}
static int parse_line(ex_ipc_server_list **server_list,char *line) {
call *cp=NULL;
char *c=NULL,*b=line,*e=NULL,*p;
int ret=ECORE_CONFIG_ERR_SUCC,h=0;
if(!line||!*line)
return ECORE_CONFIG_ERR_IGNORED;
if(!(c=strdup(line)))
return ECORE_CONFIG_ERR_OOM;
if((p=clean(c))) {
if(!strcasecmp(p,"help")) {
int nc=sizeof(calls)/sizeof(call);
cp=calls;
puts(HELP_ALL);
while(nc-->0) {
if((cp->signature&P_HELPONLY)&&!(cp->signature&P_SILENT))
printf(" %s\n",cp->name);
cp++; }
goto done; }
else if(!strncasecmp(p,"help ",5)) {
h++;
p+=5; }
b=p;
if((e=strchr(b,' ')))
*e='\0';
if(!(cp=find_with_delims(&b,&e))) {
if(!(cp=find_with_spaces(&b,&e))) {
if(e)
*e='\0';
cp=find_abbrev(&b,&e); }}
if(!cp)
ret=ECORE_CONFIG_ERR_NOTFOUND;
else {
if(h)
puts(cp->help);
else if(cp->signature&P_HELPONLY) {
int nc=sizeof(calls)/sizeof(call),l=strlen(cp->name);
call *r=calls;
if(cp->help&&*cp->help)
puts(cp->help);
while(nc-->0) {
if(!strncmp(cp->name,r->name,l)&&(r->name[l]=='-')&&!(r->signature&P_SILENT))
printf(" %s\n",r->name);
r++; }}
else {
E(3,"parsed: \"%s\" => %s { \"%s\" }\n",b,cp->name,e?e:"");
if((ret=handle_any(server_list,cp,e?e+1:""))==ECORE_CONFIG_ERR_NODATA)
E(0,ERR "Insufficient parameters for %s: %s\n",cp->name,cp->help?cp->help:"");
else E(0,"ret: %d\n",ret); }}}
else
ret=ECORE_CONFIG_ERR_FAIL;
done:
free(c);
return ret; }
/*****************************************************************************/
int main(int argc,char **argv) {
ex_ipc_server_list *server;
int ret,cc;
connstate cs;
char *p,*f,*q;
char *pipe_name;
#ifndef HAVE_LIBREADLINE
char buf[MI];
#elif defined(HAVE_READLINE_HISTORY)
char *history;
#endif
f=NULL;
server=NULL;
pipe_name=NULL;
ret=ECORE_CONFIG_ERR_SUCC;
cc=0;
cs=OFFLINE;
if (argc <= 1 || (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0)) {
print_usage();
return 0;
}
pipe_name=argv[1];
printf("exsh: connecting to %s.\n", pipe_name);
#if defined(HAVE_READLINE_HISTORY)
*history=NULL;
using_history();
stifle_history(96);
if((p=getenv("HOME"))) {
if((history=malloc(strlen(p)+sizeof(HISTORY)))) {
strcat(strcpy(history,p),HISTORY);
read_history(history); }}
#endif
ecore_init();
ecore_app_args_set(argc,(const char **)argv);
ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT,ex_ipc_sigexit,&cs);
reconnect:
cc++;
if((ret=ex_ipc_init(&server,pipe_name,&cs))!=ECORE_CONFIG_ERR_SUCC)
E(0,"exsh: %sconnect to %s failed: %d\n",(cc>1)?"re":"",pipe_name,ret);
else {
while(1) {
p=NULL;
ecore_main_loop_iterate();
if(cs==OFFLINE) {
ex_ipc_exit(&server);
cs=ONLINE;
goto reconnect; }
#ifdef HAVE_LIBREADLINE
if((p=readline(IN))) {
#else
printf(IN);
if((f=p=fgets(buf,MI,stdin))) {
#endif
q=strchr(p,'\n');
if(q)
*q='\0';
if(!strcasecmp(p,"exit")||!strcasecmp(p,"quit")) {
if(f)
free(f);
break; }
#ifdef HAVE_READLINE_HISTORY
add_history(p);
#endif
ret=parse_line(&server,p);
if((ret<ECORE_CONFIG_ERR_SUCC)&&(ret!=ECORE_CONFIG_ERR_IGNORED))
printf(ERR "error #%d: \"%s.\"\n",-ret,ecore_config_error(ret));
if(f)
free(f); }
else
break; }}
ex_ipc_exit(&server);
ecore_shutdown();
#ifdef HAVE_READLINE_HISTORY
if(history) {
write_history(history);
free(history); }
#endif
return ret; }
void print_usage(void) {
printf("Examine Shell - ecore_config Configuration Client\n");
printf("Version 1.0.0 (Dec 6 2003)\n");
printf("(c)2002-2003 by Azundris et al.\n");
printf("Modified for ecore_config 2003 by HandyAndE.\n");
printf("Usage: exsh [options] target\n\n");
printf("Supported Options:\n");
printf("-h, --help Print this help text\n");
}
/*****************************************************************************/