Implement JNI command-line interface (untested)

- argv is (const char *const *) everywhere, to avoid having to strdup() all the
  Java arg strings
- changed (char*) to (const char*) in lots of places to fix cascading compiler
  warnings as a result of argv constness
- fixed a bug in "config get" command when used without 'variable' arg
This commit is contained in:
Andrew Bettison 2012-04-23 17:12:10 +09:30
parent b585ff962b
commit a73916e85a
7 changed files with 245 additions and 73 deletions

View File

@ -35,7 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
static int servalNodeRunning(int *pid)
{
char *instancepath = serval_instancepath();
const char *instancepath = serval_instancepath();
struct stat st;
int r=stat(instancepath,&st);
if (r) {
@ -90,6 +90,61 @@ int cli_usage() {
return -1;
}
/* Data structures for accumulating output of a single JNI call.
*/
struct outv_field {
struct outv_field *next;
size_t length;
};
#define OUTV_CHUNK_MIN_SIZE (8192)
int in_jni_call = 0;
struct outv_field *outv = NULL;
size_t outc = 0;
struct outv_field **outv_fieldp = NULL;
struct outv_field *outv_field = NULL;
char *outv_current = NULL;
char *outv_limit = NULL;
static void outv_end_field()
{
outv_field->length = outv_current - (char*)outv_field - sizeof(struct outv_field);
outv_fieldp = &outv_field->next;
outv_field = NULL;
}
static int outv_create_field(size_t needed)
{
if (outv_field == NULL) {
size_t bufsiz = (needed > OUTV_CHUNK_MIN_SIZE) ? needed : OUTV_CHUNK_MIN_SIZE;
size_t size = sizeof(struct outv_field) + bufsiz;
struct outv_field *field = (struct outv_field *) malloc(size);
if (field == NULL)
return WHYF("Out of memory allocating %lu bytes", (unsigned long) size);
*outv_fieldp = outv_field = field;
++outc;
field->next = NULL;
field->length = 0;
outv_current = (char *)field + sizeof(struct outv_field);
outv_limit = outv_current + bufsiz;
}
return 0;
}
static int outv_growbuf(size_t needed)
{
size_t bufsiz = (needed > OUTV_CHUNK_MIN_SIZE) ? needed : OUTV_CHUNK_MIN_SIZE;
size_t size = (outv_current - (char*)outv_field) + bufsiz;
struct outv_chunk* chunk = (struct outv_chunk *) malloc(size);
if (chunk == NULL)
return WHYF("Out of memory allocating %lu bytes", (unsigned long) size);
outv_limit = outv_current + bufsiz;
return 0;
}
#ifdef HAVE_JNI_H
@ -101,35 +156,69 @@ JNIEXPORT jobject JNICALL Java_org_servalproject_servald_ServalD_command(JNIEnv
jclass resultClass = NULL;
jclass stringClass = NULL;
jmethodID resultConstructorId = NULL;
jobjectArray outv = NULL;
jint status = 42;
jobjectArray outArray = NULL;
// Enforce non re-entrancy.
if (in_jni_call) {
jclass exceptionClass = NULL;
if ((exceptionClass = (*env)->FindClass(env, "org/servalproject/servald/ServalDReentranceException")) == NULL)
return NULL; // exception
(*env)->ThrowNew(env, exceptionClass, "re-entrancy not supported");
return NULL;
}
if ((resultClass = (*env)->FindClass(env, "org/servalproject/servald/ServalDResult")) == NULL)
return NULL; // exception
if ((resultConstructorId = (*env)->GetMethodID(env, resultClass, "<init>", "(I[Ljava/lang/String;)V")) == NULL)
return NULL; // exception
if ((stringClass = (*env)->FindClass(env, "java/lang/String")) == NULL)
return NULL; // exception
// Eventually we will return the output buffer, but for now just echo the args.
// Construct argv, argc from method arguments.
jsize len = (*env)->GetArrayLength(env, args);
if ((outv = (*env)->NewObjectArray(env, len, stringClass, NULL)) == NULL)
return NULL; // out of memory exception
const char **argv = malloc(sizeof(char*) * (len + 1));
if (argv == NULL) {
jclass exceptionClass = NULL;
if ((exceptionClass = (*env)->FindClass(env, "java/lang/OutOfMemoryError")) == NULL)
return NULL; // exception
(*env)->ThrowNew(env, exceptionClass, "malloc returned NULL");
return NULL;
}
jsize i;
for (i = 0; i != len; ++i) {
const jstring arg = (jstring)(*env)->GetObjectArrayElement(env, args, i);
const char *str = (*env)->GetStringUTFChars(env, arg, NULL);
if (str == NULL)
return NULL; // out of memory exception
(*env)->SetObjectArrayElement(env, outv, i, (*env)->NewStringUTF(env, str));
(*env)->ReleaseStringUTFChars(env, arg, str);
argv[i] = str;
}
return (*env)->NewObject(env, resultClass, resultConstructorId, status, outv);
argv[len] = NULL;
int argc = len;
// Set up the output buffer.
outv = NULL;
outc = 0;
outv_field = NULL;
outv_fieldp = &outv;
// Execute the command.
in_jni_call = 1;
jint status = parseCommandLine(argc, argv);
in_jni_call = 0;
free(argv);
// Unpack the output.
outv_end_field();
if ((outArray = (*env)->NewObjectArray(env, outc, stringClass, NULL)) == NULL)
return NULL; // out of memory exception
for (i = 0; i != outc; ++i) {
const jstring str = (jstring)(*env)->NewString(env, (jchar*)((char*)&outv[i] + sizeof(struct outv_field)), outv[i].length);
if (str == NULL)
return NULL; // out of memory exception
(*env)->SetObjectArrayElement(env, outArray, i, str);
}
return (*env)->NewObject(env, resultClass, resultConstructorId, status, outArray);
}
#endif /* HAVE_JNI_H */
/* args[] excludes command name (unless hardlinks are used to use first words
of command sequences as alternate names of the command. */
int parseCommandLine(int argc, char **args)
int parseCommandLine(int argc, const char *const *args)
{
int i;
int ambiguous=0;
@ -188,10 +277,10 @@ int parseCommandLine(int argc, char **args)
/* Otherwise, make call */
setVerbosity(confValueGet("debug",""));
return command_line_options[cli_call].function(argc,args, &command_line_options[cli_call]);
return command_line_options[cli_call].function(argc, args, &command_line_options[cli_call]);
}
int cli_arg(int argc, char **argv, command_line_option *o, char *argname, char **dst, int (*validator)(const char *arg), char *defaultvalue)
int cli_arg(int argc, const char *const *argv, command_line_option *o, char *argname, const char **dst, int (*validator)(const char *arg), char *defaultvalue)
{
int arglen = strlen(argname);
int i;
@ -204,7 +293,7 @@ int cli_arg(int argc, char **argv, command_line_option *o, char *argname, char *
&&( (wordlen == arglen + 2 && word[0] == '<' && !strncasecmp(&word[1], argname, arglen))
|| (wordlen == arglen + 4 && word[0] == '[' && !strncasecmp(&word[2], argname, arglen)))
) {
char *value = argv[i];
const char *value = argv[i];
if (validator && !(*validator)(value)) {
fprintf(stderr, "Invalid argument %d '%s': \"%s\"\n", i, argname, value);
return -1;
@ -221,17 +310,100 @@ int cli_arg(int argc, char **argv, command_line_option *o, char *argname, char *
return 1;
}
/* Write a single character to output. If in a JNI call, then this appends the character to the
current output field. Returns the character written cast to an unsigned char then to int, or EOF
on error.
*/
int cli_putchar(char c)
{
if (in_jni_call) {
if (outv_create_field(1) == -1)
return EOF;
if (outv_current == outv_limit && outv_growbuf(1) == -1)
return EOF;
*outv_current++ = c;
return (unsigned char) c;
}
else
return putchar(c);
}
/* Write a null-terminated string to output. If in a JNI call, then this appends the string to the
current output field. The terminating null is not included. Returns a non-negative integer on
success, EOF on error.
*/
int cli_puts(const char *str)
{
if (in_jni_call) {
size_t len = strlen(str);
if (outv_create_field(1) == -1)
return EOF;
size_t avail = outv_limit - outv_current;
if (avail < len) {
strncpy(outv_current, str, avail);
outv_current = outv_limit;
if (outv_growbuf(len) == -1)
return EOF;
len -= avail;
str += avail;
}
strncpy(outv_current, str, len);
outv_current += len;
return 0;
}
else
return fputs(str, stdout);
}
/* Write a formatted string to output. If in a JNI call, then this appends the string to the
current output field, excluding the terminating null. Returns the number of bytes
written/appended, or -1 on error.
*/
int cli_printf(const char *fmt, ...)
{
int ret = 0;
va_list ap,ap2;
va_start(ap,fmt);
va_copy(ap2,ap);
//vsnprintf(msg,8192,fmt,ap2);
if (in_jni_call) {
if (outv_create_field(0) == -1)
return -1;
size_t avail = outv_limit - outv_current;
int count = vsnprintf(outv_current, avail, fmt, ap2);
if (count >= avail) {
if (outv_growbuf(count) == -1)
return -1;
vsprintf(outv_current, fmt, ap2);
}
outv_current += count;
ret = count;
} else
ret = vfprintf(stdout, fmt, ap2);
va_end(ap);
return ret;
}
/* Delimit the current output field. This closes the current field, so that the next cli_ output
function will start appending to a new field. Returns 0 on success, -1 on error. If not in a
JNI call, then this simply writes a newline to standard output (or the value of the
SERVALD_OUTPUT_DELIMITER env var if set).
*/
int cli_delim()
{
if (in_jni_call) {
if (outv_create_field(0) == -1)
return -1;
outv_end_field();
} else {
const char *delim = getenv("SERVALD_OUTPUT_DELIMITER");
if (delim == NULL)
delim = "\n";
fputs(delim, stdout);
}
return 0;
}
int app_dna_lookup(int argc,char **argv,struct command_line_option *o)
int app_dna_lookup(int argc, const char *const *argv, struct command_line_option *o)
{
/* Create the instance directory if it does not yet exist */
if (create_serval_instance_dir() == -1)
@ -284,7 +456,7 @@ int cli_absolute_path(const char *arg)
return arg[0] == '/' && arg[1] != '\0';
}
int app_server_start(int argc,char **argv,struct command_line_option *o)
int app_server_start(int argc, const char *const *argv, struct command_line_option *o)
{
/* Process optional arguments */
int foregroundP= (argc >= 3 && !strcasecmp(argv[2], "foreground"));
@ -324,7 +496,7 @@ int app_server_start(int argc,char **argv,struct command_line_option *o)
return server(NULL,foregroundP);
}
int app_server_stop(int argc,char **argv,struct command_line_option *o)
int app_server_stop(int argc, const char *const *argv, struct command_line_option *o)
{
if (cli_arg(argc, argv, o, "instance path", &thisinstancepath, cli_absolute_path, NULL) == -1)
return -1;
@ -389,7 +561,7 @@ int app_server_stop(int argc,char **argv,struct command_line_option *o)
return WHY("Not implemented");
}
int app_server_status(int argc,char **argv,struct command_line_option *o)
int app_server_status(int argc, const char *const *argv, struct command_line_option *o)
{
if (cli_arg(argc, argv, o, "instance path", &thisinstancepath, cli_absolute_path, NULL) == -1)
return -1;
@ -422,9 +594,9 @@ int app_server_status(int argc,char **argv,struct command_line_option *o)
return 0;
}
int app_mdp_ping(int argc,char **argv,struct command_line_option *o)
int app_mdp_ping(int argc, const char *const *argv, struct command_line_option *o)
{
char *sid;
const char *sid;
if (cli_arg(argc, argv, o, "SID|broadcast", &sid, validateSid, "broadcast") == -1)
return -1;
@ -638,9 +810,9 @@ int cli_configvarname(const char *arg)
return 1;
}
int app_config_set(int argc,char **argv,struct command_line_option *o)
int app_config_set(int argc, const char *const *argv, struct command_line_option *o)
{
char *var, *val;
const char *var, *val;
if ( cli_arg(argc, argv, o, "variable", &var, cli_configvarname, NULL)
|| cli_arg(argc, argv, o, "value", &val, NULL, ""))
return -1;
@ -649,9 +821,9 @@ int app_config_set(int argc,char **argv,struct command_line_option *o)
return set_variable(var, val);
}
int app_config_del(int argc,char **argv,struct command_line_option *o)
int app_config_del(int argc, const char *const *argv, struct command_line_option *o)
{
char *var;
const char *var;
if (cli_arg(argc, argv, o, "variable", &var, cli_configvarname, NULL))
return -1;
if (create_serval_instance_dir() == -1)
@ -659,10 +831,10 @@ int app_config_del(int argc,char **argv,struct command_line_option *o)
return set_variable(var, NULL);
}
int app_config_get(int argc,char **argv,struct command_line_option *o)
int app_config_get(int argc, const char *const *argv, struct command_line_option *o)
{
char *var;
if (cli_arg(argc, argv, o, "variable", &var, cli_configvarname, NULL))
const char *var;
if (cli_arg(argc, argv, o, "variable", &var, cli_configvarname, NULL) == -1)
return -1;
if (create_serval_instance_dir() == -1)
return -1;
@ -675,7 +847,7 @@ int app_config_get(int argc,char **argv,struct command_line_option *o)
}
/* Read lines of config file. */
char line[1024];
int varlen=strlen(var);
int varlen = var ? strlen(var) : 0;
line[0]=0; fgets(line,1024,in);
while(line[0]) {
if (varlen == 0) {
@ -692,9 +864,9 @@ int app_config_get(int argc,char **argv,struct command_line_option *o)
return 0;
}
int app_rhizome_add_file(int argc, char **argv, struct command_line_option *o)
int app_rhizome_add_file(int argc, const char *const *argv, struct command_line_option *o)
{
char *filepath, *manifestpath;
const char *filepath, *manifestpath;
cli_arg(argc, argv, o, "filepath", &filepath, NULL, "");
cli_arg(argc, argv, o, "manifestpath", &manifestpath, NULL, "");
/* Ensure the Rhizome database exists and is open */
@ -758,9 +930,9 @@ int cli_uint(const char *arg)
return s != arg && *s == '\0';
}
int app_rhizome_list(int argc, char **argv, struct command_line_option *o)
int app_rhizome_list(int argc, const char *const *argv, struct command_line_option *o)
{
char *offset, *limit;
const char *offset, *limit;
cli_arg(argc, argv, o, "offset", &offset, cli_uint, "0");
cli_arg(argc, argv, o, "limit", &limit, cli_uint, "0");
/* Create the instance directory if it does not yet exist */
@ -771,18 +943,18 @@ int app_rhizome_list(int argc, char **argv, struct command_line_option *o)
return rhizome_list_manifests(atoi(offset), atoi(limit));
}
int app_keyring_create(int argc, char **argv, struct command_line_option *o)
int app_keyring_create(int argc, const char *const *argv, struct command_line_option *o)
{
char *pin;
const char *pin;
cli_arg(argc, argv, o, "pin,pin ...", &pin, NULL, "");
keyring_file *k=keyring_open_with_pins(pin);
if (!k) fprintf(stderr,"keyring create:Failed to create/open keyring file\n");
return 0;
}
int app_keyring_list(int argc, char **argv, struct command_line_option *o)
int app_keyring_list(int argc, const char *const *argv, struct command_line_option *o)
{
char *pin;
const char *pin;
cli_arg(argc, argv, o, "pin,pin ...", &pin, NULL, "");
keyring_file *k=keyring_open_with_pins(pin);
@ -812,9 +984,9 @@ int app_keyring_list(int argc, char **argv, struct command_line_option *o)
return 0;
}
int app_keyring_add(int argc, char **argv, struct command_line_option *o)
int app_keyring_add(int argc, const char *const *argv, struct command_line_option *o)
{
char *pin;
const char *pin;
cli_arg(argc, argv, o, "pin", &pin, NULL, "");
keyring_file *k=keyring_open_with_pins("");
@ -834,9 +1006,9 @@ int app_keyring_add(int argc, char **argv, struct command_line_option *o)
return 0;
}
int app_keyring_set_did(int argc, char **argv, struct command_line_option *o)
int app_keyring_set_did(int argc, const char *const *argv, struct command_line_option *o)
{
char *sid, *did, *pin;
const char *sid, *did, *pin;
cli_arg(argc, argv, o, "sid", &sid, NULL, "");
cli_arg(argc, argv, o, "did", &did, NULL, "");
cli_arg(argc, argv, o, "pin", &pin, NULL, "");

10
dna.c
View File

@ -246,11 +246,11 @@ int exec_argc=0;
int servalShutdown=0;
char *thisinstancepath=NULL;
char *serval_instancepath()
const char *thisinstancepath=NULL;
const char *serval_instancepath()
{
if (thisinstancepath) return thisinstancepath;
char *instancepath=getenv("SERVALINSTANCE_PATH");
const char *instancepath=getenv("SERVALINSTANCE_PATH");
if (!instancepath) instancepath=DEFAULT_INSTANCE_PATH;
return instancepath;
}
@ -507,7 +507,7 @@ int setVerbosity(char *optarg) {
return 0;
}
int main(int argc,char **argv)
int main(int argc, char **argv)
{
int c;
char *pin=NULL;
@ -548,7 +548,7 @@ int main(int argc,char **argv)
parser. */
/* Don't include name of program in arguments */
int return_value=parseCommandLine(argc-1,&argv[1]);
int return_value = parseCommandLine(argc - 1, (const char*const*)&argv[1]);
#if defined WIN32
WSACleanup();

View File

@ -332,7 +332,7 @@ int keyring_enter_identitypin(keyring_file *k,char *pin)
*/
int keyring_munge_block(unsigned char *block,int len /* includes the first 96 bytes */,
unsigned char *KeyRingSalt,int KeyRingSaltLen,
char *KeyRingPin,char *PKRPin)
const char *KeyRingPin, const char *PKRPin)
{
int exit_code=1;
unsigned char hashKey[crypto_hash_sha512_BYTES];
@ -509,7 +509,7 @@ int keyring_pack_identity(keyring_context *c,keyring_identity *i,
return exit_code;
}
keyring_identity *keyring_unpack_identity(unsigned char *slot,char *pin)
keyring_identity *keyring_unpack_identity(unsigned char *slot, const char *pin)
{
/* Skip salt and MAC */
int i;
@ -651,7 +651,7 @@ int keyring_identity_mac(keyring_context *c,keyring_identity *id,
unpack the details of the identity.
*/
int keyring_decrypt_pkr(keyring_file *k,keyring_context *c,
char *pin,int slot_number)
const char *pin,int slot_number)
{
int exit_code=1;
unsigned char slot[KEYRING_PAGE_SIZE];
@ -711,7 +711,7 @@ int keyring_decrypt_pkr(keyring_file *k,keyring_context *c,
/* Try all valid slots with the PIN and see if we find any identities with that PIN.
We might find more than one. */
int keyring_enter_pin(keyring_file *k,char *pin)
int keyring_enter_pin(keyring_file *k, const char *pin)
{
if (!k) return -1;
if (!pin) pin="";
@ -1293,7 +1293,7 @@ int keyring_find_sid(keyring_file *k,int *cn,int *in,int *kp,unsigned char *sid)
}
int keyring_enter_pins(keyring_file *k,char *pinlist)
int keyring_enter_pins(keyring_file *k, const char *pinlist)
{
char pin[1024];
int i,j=0;
@ -1311,13 +1311,13 @@ int keyring_enter_pins(keyring_file *k,char *pinlist)
return 0;
}
keyring_file *keyring_open_with_pins(char *pinlist)
keyring_file *keyring_open_with_pins(const char *pinlist)
{
keyring_file *k=NULL;
if (create_serval_instance_dir() == -1)
return NULL;
char *instancePath = serval_instancepath();
const char *instancePath = serval_instancepath();
char keyringFile[1024];
snprintf(keyringFile,1024,"%s/serval.keyring",instancePath);
if ((k=keyring_open(keyringFile))==NULL)

View File

@ -154,7 +154,7 @@ typedef struct rhizome_manifest {
} rhizome_manifest;
extern long long rhizome_space;
extern char *rhizome_datastore_path;
extern const char *rhizome_datastore_path;
extern sqlite3 *rhizome_db;

View File

@ -22,7 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include <stdlib.h>
long long rhizome_space=0;
char *rhizome_datastore_path=NULL;
const char *rhizome_datastore_path = NULL;
sqlite3 *rhizome_db=NULL;

View File

@ -145,7 +145,7 @@ extern int returnMultiVars;
extern char *gatewayspec;
extern char *rhizome_datastore_path;
extern const char *rhizome_datastore_path;
extern struct in_addr client_addr;
extern int client_port;
@ -238,9 +238,9 @@ extern keyring_file *keyring;
/* Public calls to keyring management */
keyring_file *keyring_open(char *file);
keyring_file *keyring_open_with_pins(char *pinlist);
int keyring_enter_pin(keyring_file *k,char *pin);
int keyring_enter_pins(keyring_file *k,char *pinlist);
keyring_file *keyring_open_with_pins(const char *pinlist);
int keyring_enter_pin(keyring_file *k, const char *pin);
int keyring_enter_pins(keyring_file *k, const char *pinlist);
int keyring_set_did(keyring_identity *id,char *did);
int keyring_sanitise_position(keyring_file *k,int *cn,int *in,int *kp);
int keyring_next_identity(keyring_file *k,int *cn,int *in,int *kp);
@ -1054,7 +1054,7 @@ typedef struct dna_identity_status {
int uniqueDidAndName;
} dna_identity_status;
int parseCommandLine(int argc,char *argv[]);
int parseCommandLine(int argc, const char *const *argv);
dna_identity_status *dnacache_lookup(char *did,char *name,char *sid);
dna_identity_status *dnacache_lookup_next();
@ -1072,8 +1072,8 @@ int _memabuseCheck(const char *func,const char *file,const int line);
#define memabuseCheck() /* */
#endif
char *thisinstancepath;
char *serval_instancepath();
const char *thisinstancepath;
const char *serval_instancepath();
int form_serval_instance_path(char * buf, size_t bufsiz, const char *path);
int create_serval_instance_dir();
@ -1304,7 +1304,7 @@ int vomp_tick();
int vomp_tick_interval();
typedef struct command_line_option {
int (*function)(int argc,char **argv,struct command_line_option *o);
int (*function)(int argc, const char *const *argv, struct command_line_option *o);
char *words[32]; // 32 words should be plenty!
unsigned long long flags;
#define CLIFLAG_NONOVERLAY (1<<0) /* Uses a legacy IPv4 DNA call instead of overlay mnetwork */
@ -1313,12 +1313,12 @@ typedef struct command_line_option {
} command_line_option;
extern command_line_option command_line_options[];
int cli_arg(int argc, char **argv, command_line_option *o, char *argname, char **dst, int (*validator)(const char *arg), char *defaultvalue);
int cli_arg(int argc, const char *const *argv, command_line_option *o, char *argname, const char **dst, int (*validator)(const char *arg), char *defaultvalue);
int overlay_mdp_getmyaddr(int index,unsigned char *sid);
int app_vomp_status(int argc, char **argv, struct command_line_option *o);
int app_vomp_dial(int argc, char **argv, struct command_line_option *o);
int app_vomp_pickup(int argc, char **argv, struct command_line_option *o);
int app_vomp_hangup(int argc, char **argv, struct command_line_option *o);
int app_vomp_monitor(int argc, char **argv, struct command_line_option *o);
int app_vomp_status(int argc, const char *const *argv, struct command_line_option *o);
int app_vomp_dial(int argc, const char *const *argv, struct command_line_option *o);
int app_vomp_pickup(int argc, const char *const *argv, struct command_line_option *o);
int app_vomp_hangup(int argc, const char *const *argv, struct command_line_option *o);
int app_vomp_monitor(int argc, const char *const *argv, struct command_line_option *o);

10
vomp.c
View File

@ -952,7 +952,7 @@ char *vomp_describe_codec(int c)
return "unknown";
}
int app_vomp_status(int argc, char **argv, struct command_line_option *o)
int app_vomp_status(int argc, const char *const *argv, struct command_line_option *o)
{
overlay_mdp_frame mdp;
bzero(&mdp,sizeof(mdp));
@ -1021,7 +1021,7 @@ int app_vomp_status(int argc, char **argv, struct command_line_option *o)
return overlay_mdp_client_done();
}
int app_vomp_dial(int argc, char **argv, struct command_line_option *o)
int app_vomp_dial(int argc, const char *const *argv, struct command_line_option *o)
{
char *sid,*did,*callerid;
cli_arg(argc, argv, o, "sid", &sid, NULL, "");
@ -1053,7 +1053,7 @@ int app_vomp_dial(int argc, char **argv, struct command_line_option *o)
}
int app_vomp_pickup(int argc, char **argv, struct command_line_option *o)
int app_vomp_pickup(int argc, const char *const *argv, struct command_line_option *o)
{
char *call_token;
cli_arg(argc, argv, o, "call", &call_token, NULL, "");
@ -1078,7 +1078,7 @@ int app_vomp_pickup(int argc, char **argv, struct command_line_option *o)
return overlay_mdp_client_done();
}
int app_vomp_hangup(int argc, char **argv, struct command_line_option *o)
int app_vomp_hangup(int argc, const char *const *argv, struct command_line_option *o)
{
char *call_token;
cli_arg(argc, argv, o, "call", &call_token, NULL, "");
@ -1103,7 +1103,7 @@ int app_vomp_hangup(int argc, char **argv, struct command_line_option *o)
return overlay_mdp_client_done();
}
int app_vomp_monitor(int argc, char **argv, struct command_line_option *o)
int app_vomp_monitor(int argc, const char *const *argv, struct command_line_option *o)
{
overlay_mdp_frame mdp;
bzero(&mdp,sizeof(mdp));