From a73916e85aaf51b697248f1fd1692211126d1a5a Mon Sep 17 00:00:00 2001 From: Andrew Bettison Date: Mon, 23 Apr 2012 17:12:10 +0930 Subject: [PATCH] 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 --- commandline.c | 252 ++++++++++++++++++++++++++++++++++++++------- dna.c | 10 +- keyring.c | 14 +-- rhizome.h | 2 +- rhizome_database.c | 2 +- serval.h | 28 ++--- vomp.c | 10 +- 7 files changed, 245 insertions(+), 73 deletions(-) diff --git a/commandline.c b/commandline.c index 21622b86..b025437e 100644 --- a/commandline.c +++ b/commandline.c @@ -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, "", "(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, ""); diff --git a/dna.c b/dna.c index 29310b77..f91d989e 100644 --- a/dna.c +++ b/dna.c @@ -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(); diff --git a/keyring.c b/keyring.c index 610b91d7..d08bac6a 100644 --- a/keyring.c +++ b/keyring.c @@ -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) diff --git a/rhizome.h b/rhizome.h index b2006a5c..73fd5f8b 100644 --- a/rhizome.h +++ b/rhizome.h @@ -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; diff --git a/rhizome_database.c b/rhizome_database.c index a5055c7c..f1dabf45 100644 --- a/rhizome_database.c +++ b/rhizome_database.c @@ -22,7 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include long long rhizome_space=0; -char *rhizome_datastore_path=NULL; +const char *rhizome_datastore_path = NULL; sqlite3 *rhizome_db=NULL; diff --git a/serval.h b/serval.h index bedddb4c..863868b3 100644 --- a/serval.h +++ b/serval.h @@ -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); diff --git a/vomp.c b/vomp.c index 042ef88d..c7e3e9e9 100644 --- a/vomp.c +++ b/vomp.c @@ -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));