From eafa0b1d66877b12f15974906fd54dfd2a1db082 Mon Sep 17 00:00:00 2001 From: joan Date: Sun, 11 Mar 2018 13:24:54 +0000 Subject: [PATCH] V67: #198 added process exit codes for pigs --- MakeRemote | 2 +- Makefile | 2 +- README | 3 ++- pigpio.h | 2 +- pigs.1 | 20 ++++++++++++++++++++ pigs.c | 44 +++++++++++++++++++++++++++++--------------- pigs.h | 41 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 pigs.h diff --git a/MakeRemote b/MakeRemote index a3a235c..250d40e 100644 --- a/MakeRemote +++ b/MakeRemote @@ -96,6 +96,6 @@ command.o: command.c pigpio.h command.h pigpiod.o: pigpiod.c pigpio.h pigpiod_if.o: pigpiod_if.c pigpio.h pigpiod_if.h command.h pigpiod_if2.o: pigpiod_if2.c pigpio.h pigpiod_if2.h command.h -pigs.o: pigs.c pigpio.h command.h +pigs.o: pigs.c pigpio.h command.h pigs.h diff --git a/Makefile b/Makefile index ac68064..3d94f4d 100644 --- a/Makefile +++ b/Makefile @@ -135,7 +135,7 @@ $(LIB3): $(OBJ3) pig2vcd.o: pig2vcd.c pigpio.h pigpiod.o: pigpiod.c pigpio.h -pigs.o: pigs.c pigpio.h command.h +pigs.o: pigs.c pigpio.h command.h pigs.h x_pigpio.o: x_pigpio.c pigpio.h x_pigpiod_if.o: x_pigpiod_if.c pigpiod_if.h pigpio.h x_pigpiod_if2.o: x_pigpiod_if2.c pigpiod_if2.h pigpio.h diff --git a/README b/README index 35b4789..ed453a9 100644 --- a/README +++ b/README @@ -23,6 +23,7 @@ o the library (libpigpiod_if2.so) in /usr/local/lib o the header file (pigpio.h) in /usr/local/include o the header file (pigpiod_if.h) in /usr/local/include o the header file (pigpiod_if2.h) in /usr/local/include +o the header file (pigs.h) in /usr/local/include o the daemon (pigpiod) in /usr/local/bin o the socket interface (pigs) in /usr/local/bin o the utility pig2vcd in /usr/local/bin @@ -35,7 +36,7 @@ TEST (optional) * * * All the tests make extensive use of gpio 25 (pin 22). * * Ensure that either nothing or just a LED is connected to * -* gpio 4 before running any of the tests. * +* gpio 25 before running any of the tests. * * * * Some tests are statistical in nature and so may on * * occasion fail. Repeated failures on the same test or * diff --git a/pigpio.h b/pigpio.h index 65dc902..11ee4b9 100644 --- a/pigpio.h +++ b/pigpio.h @@ -31,7 +31,7 @@ For more information, please refer to #include #include -#define PIGPIO_VERSION 6701 +#define PIGPIO_VERSION 6702 /*TEXT diff --git a/pigs.1 b/pigs.1 index 51a9e08..df8fcb5 100644 --- a/pigs.1 +++ b/pigs.1 @@ -96,6 +96,26 @@ echo "{command}+" >/dev/pigpio .br pigs will show the result of the command on screen. +.br +The pigs process returns an exit status (which can be displayed with +the command echo $?). + +.br + +.EX +PIGS_OK 0 +.br +PIGS_CONNECT_ERR 255 +.br +PIGS_OPTION_ERR 254 +.br +PIGS_SCRIPT_ERR 253 +.br +.br +.br + +.EE + .br The results of /dev/pigpio commands need to be read from /dev/pigout, e.g. cat /dev/pigout (try cat /dev/pigout& so that all subsequent diff --git a/pigs.c b/pigs.c index 24f1fee..4ae97eb 100644 --- a/pigs.c +++ b/pigs.c @@ -26,7 +26,7 @@ For more information, please refer to */ /* -This version is for pigpio version 56+ +This version is for pigpio version 67+ */ #include @@ -42,6 +42,7 @@ This version is for pigpio version 56+ #include "pigpio.h" #include "command.h" +#include "pigs.h" /* This program provides a socket interface to some of @@ -53,16 +54,20 @@ char response_buf[CMD_MAX_EXTENSION]; int printFlags = 0; +int status = PIGS_OK; + #define SOCKET_OPEN_FAILED -1 #define PRINT_HEX 1 #define PRINT_ASCII 2 -void fatal(char *fmt, ...) +void report(int err, char *fmt, ...) { char buf[128]; va_list ap; + if (err > status) status = err; + va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); @@ -76,6 +81,8 @@ static int initOpts(int argc, char *argv[]) { int opt, args; + opterr = 0; + args = 1; while ((opt = getopt(argc, argv, "ax")) != -1) @@ -91,7 +98,11 @@ static int initOpts(int argc, char *argv[]) printFlags |= PRINT_HEX; args++; break; - } + + default: + args++; + report(PIGS_OPTION_ERR, "ERROR: bad option %c", optopt); + } } return args; } @@ -150,13 +161,13 @@ void print_result(int sock, int rv, cmdCmd_t cmd) if (r < 0) { printf("%d\n", r); - fatal("ERROR: %s", cmdErrStr(r)); + report(PIGS_SCRIPT_ERR, "ERROR: %s", cmdErrStr(r)); } break; case 2: printf("%d\n", r); - if (r < 0) fatal("ERROR: %s", cmdErrStr(r)); + if (r < 0) report(PIGS_SCRIPT_ERR, "ERROR: %s", cmdErrStr(r)); break; case 3: @@ -176,7 +187,7 @@ void print_result(int sock, int rv, cmdCmd_t cmd) I2CZ SERR SLR SPIX SPIR */ printf("%d", r); - if (r < 0) fatal("ERROR: %s", cmdErrStr(r)); + if (r < 0) report(PIGS_SCRIPT_ERR, "ERROR: %s", cmdErrStr(r)); if (r > 0) { if (printFlags == PRINT_ASCII) printf(" "); @@ -203,7 +214,7 @@ void print_result(int sock, int rv, cmdCmd_t cmd) if (r != (4 + (4*PI_MAX_SCRIPT_PARAMS))) { printf("%d", r); - fatal("ERROR: %s", cmdErrStr(r)); + report(PIGS_SCRIPT_ERR, "ERROR: %s", cmdErrStr(r)); } else { @@ -223,7 +234,7 @@ void print_result(int sock, int rv, cmdCmd_t cmd) if (r < 0) { printf("%d", r); - fatal("ERROR: %s", cmdErrStr(r)); + report(PIGS_SCRIPT_ERR, "ERROR: %s", cmdErrStr(r)); } p = (uint32_t *)response_buf; @@ -354,26 +365,29 @@ int main(int argc , char *argv[]) print_result(sock, cmdInfo[idx].rv, cmd); } - else fatal("socket receive failed"); + else report(PIGS_CONNECT_ERR, "socket receive failed"); } - else fatal("socket send failed"); + else report(PIGS_CONNECT_ERR, "socket send failed"); } - else fatal("socket connect failed"); + else report(PIGS_CONNECT_ERR, "socket connect failed"); } } - else fatal("%s only allowed within a script", cmdInfo[idx].name); + else report(PIGS_SCRIPT_ERR, + "%s only allowed within a script", cmdInfo[idx].name); } else { if (idx == CMD_UNKNOWN_CMD) - fatal("%s? unknown command, pigs h for help", cmdStr()); + report(PIGS_SCRIPT_ERR, + "%s? unknown command, pigs h for help", cmdStr()); else - fatal("%s: bad parameter, pigs h for help", cmdStr()); + report(PIGS_SCRIPT_ERR, + "%s: bad parameter, pigs h for help", cmdStr()); } } if (sock >= 0) close(sock); - return 0; + return status; } diff --git a/pigs.h b/pigs.h new file mode 100644 index 0000000..16cfcdd --- /dev/null +++ b/pigs.h @@ -0,0 +1,41 @@ +/* +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to +*/ + +/* +This version is for pigpio version 67+ +*/ + +#ifndef PIGS_H +#define PIGS_H + +#define PIGS_OK 0 +#define PIGS_CONNECT_ERR 255 +#define PIGS_OPTION_ERR 254 +#define PIGS_SCRIPT_ERR 253 + +#endif +