From 8690fb0594fbf5b09c93af2cc25da24fc87e8099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Fillod=2C=20F8CFE?= Date: Wed, 1 Dec 2010 21:41:55 +0000 Subject: [PATCH] Implement exit status according to manual page: 1 if there was an invalid command line option or argument; 2 if an error was returned by Hamlib. git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@3009 7ae35d74-ebe9-4afe-98af-79ac388436b8 --- tests/rigctl.c | 9 +++++++-- tests/rigctl_parse.c | 36 ++++++++++++++++++++++++++++-------- tests/rigctld.c | 2 +- tests/rotctl.c | 9 +++++++-- tests/rotctl_parse.c | 12 ++++++------ tests/rotctld.c | 2 +- 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/tests/rigctl.c b/tests/rigctl.c index ef58fd838..544c1a093 100644 --- a/tests/rigctl.c +++ b/tests/rigctl.c @@ -96,6 +96,7 @@ int main (int argc, char *argv[]) rig_model_t my_model = RIG_MODEL_DUMMY; int retcode; /* generic return code from functions */ + int exitcode; int verbose = 0; int show_conf = 0; @@ -320,15 +321,19 @@ int main (int argc, char *argv[]) rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", my_rig->caps->version, rig_strstatus(my_rig->caps->status)); + exitcode = 0; + do { retcode = rigctl_parse(my_rig, stdin, stdout, argv, argc); + if (retcode == 2) + exitcode = 2; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rig_close(my_rig); /* close port */ rig_cleanup(my_rig); /* if you care about memory */ - return 0; + return exitcode; } diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 04d7a1eff..84974e5fc 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -406,7 +406,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } vfo = rig_parse_vfo(argv[optind++]); } @@ -430,7 +430,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -446,7 +446,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -462,7 +462,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p2 = argv[optind++]; } @@ -478,7 +478,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p3 = argv[optind++]; } @@ -493,7 +493,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) #endif if (!prompt) - rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '0x%02x' '%s' '%s' '%s'\n", + rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '%s' '%s' '%s' '%s'\n", cmd, rig_strvfo(vfo), p1?p1:"", p2?p2:"", p3?p3:""); /* @@ -554,7 +554,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) fflush(fout); - return 0; + return retcode != RIG_OK ? 2 : 0; } @@ -1198,12 +1198,15 @@ declare_proto_rig(set_level) } level = rig_parse_level(arg1); + if (RIG_LEVEL_NONE == level) + return -RIG_EINVAL; + if (!rig_has_set_level(rig, level)) { const struct confparams *cfp; cfp = rig_ext_lookup(rig, arg1); if (!cfp) - return -RIG_EINVAL; /* no such parameter */ + return -RIG_ENAVAIL; /* no such parameter */ switch (cfp->type) { case RIG_CONF_BUTTON: @@ -1248,6 +1251,9 @@ declare_proto_rig(get_level) } level = rig_parse_level(arg1); + if (RIG_LEVEL_NONE == level) + return -RIG_EINVAL; + if (!rig_has_get_level(rig, level)) { const struct confparams *cfp; @@ -1310,6 +1316,9 @@ declare_proto_rig(set_func) } func = rig_parse_func(arg1); + if (RIG_FUNC_NONE == func) + return -RIG_EINVAL; + CHKSCN1ARG(sscanf(arg2, "%d", &func_stat)); return rig_set_func(rig, vfo, func, func_stat); } @@ -1329,6 +1338,9 @@ declare_proto_rig(get_func) } func = rig_parse_func(arg1); + if (RIG_FUNC_NONE == func) + return -RIG_EINVAL; + status = rig_get_func(rig, vfo, func, &func_stat); if (status != RIG_OK) return status; @@ -1353,6 +1365,8 @@ declare_proto_rig(set_parm) } parm = rig_parse_parm(arg1); + if (RIG_PARM_NONE == parm) + return -RIG_EINVAL; if (!rig_has_set_parm(rig, parm)) { const struct confparams *cfp; @@ -1404,6 +1418,9 @@ declare_proto_rig(get_parm) } parm = rig_parse_parm(arg1); + if (RIG_PARM_NONE == parm) + return -RIG_EINVAL; + if (!rig_has_get_parm(rig, parm)) { const struct confparams *cfp; @@ -1498,6 +1515,9 @@ declare_proto_rig(vfo_op) } op = rig_parse_vfo_op(arg1); + if (RIG_OP_NONE == op) + return -RIG_EINVAL; + return rig_vfo_op(rig, vfo, op); } diff --git a/tests/rigctld.c b/tests/rigctld.c index 019a3e153..17f3c9053 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -479,7 +479,7 @@ void * handle_socket(void *arg) if (ferror(fsockin) || ferror(fsockout)) retcode = 1; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rig_debug(RIG_DEBUG_VERBOSE, "Connection closed from %s:%d\n", inet_ntoa(handle_data_arg->cli_addr.sin_addr), diff --git a/tests/rotctl.c b/tests/rotctl.c index e4077991b..42ca4dfd2 100644 --- a/tests/rotctl.c +++ b/tests/rotctl.c @@ -81,6 +81,7 @@ int main (int argc, char *argv[]) rot_model_t my_model = ROT_MODEL_DUMMY; int retcode; /* generic return code from functions */ + int exitcode; int verbose = 0; int show_conf = 0; @@ -228,15 +229,19 @@ int main (int argc, char *argv[]) rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", my_rot->caps->version, rig_strstatus(my_rot->caps->status)); + exitcode = 0; + do { retcode = rotctl_parse(my_rot, stdin, stdout, argv, argc); + if (retcode == 2) + exitcode = 2; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rot_close(my_rot); /* close port */ rot_cleanup(my_rot); /* if you care about memory */ - return 0; + return exitcode; } void usage() diff --git a/tests/rotctl_parse.c b/tests/rotctl_parse.c index 7dce54c21..9600a910a 100644 --- a/tests/rotctl_parse.c +++ b/tests/rotctl_parse.c @@ -318,7 +318,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -333,7 +333,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -349,7 +349,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p2 = argv[optind++]; } @@ -365,7 +365,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p3 = argv[optind++]; } @@ -382,7 +382,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p4 = argv[optind++]; } @@ -457,7 +457,7 @@ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) fflush(fout); - return 0; + return retcode != RIG_OK ? 2 : 0; } diff --git a/tests/rotctld.c b/tests/rotctld.c index e5d7b95af..b34bd2c1a 100644 --- a/tests/rotctld.c +++ b/tests/rotctld.c @@ -394,7 +394,7 @@ void * handle_socket(void *arg) if (ferror(fsockin) || ferror(fsockout)) retcode = 1; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rig_debug(RIG_DEBUG_VERBOSE, "Connection closed from %s:%d\n", inet_ntoa(handle_data_arg->cli_addr.sin_addr),