milk  1.01
Modular Image processing Library toolKit
CLIcore.h
Go to the documentation of this file.
1 
13 #ifndef _GNU_SOURCE
14 #define _GNU_SOURCE
15 #endif
16 
17 
18 
19 
20 #ifndef _CLICORE_H
21 #define _CLICORE_H
22 
23 
24 // include sem_timedwait
25 #ifndef _POSIX_C_SOURCE
26 #define _POSIX_C_SOURCE 200809L
27 #endif
28 
29 
30 #include <stdint.h>
31 #include <stdio.h>
32 #include <errno.h>
33 #include <unistd.h>
34 #include <stdlib.h>
35 #include <sys/types.h>
36 #include <unistd.h>
37 #include <semaphore.h>
38 #include <fftw3.h>
39 #include <gsl/gsl_rng.h> // for random numbers
40 #include <signal.h>
41 #include <string.h>
42 
43 
44 
45 
46 
47 
48 // define (custom) types for function return value
49 
50 #ifndef __STDC_LIB_EXT1__
51 typedef int errno_t;
52 #endif
53 
54 typedef long imageID;
55 typedef long variableID;
56 
57 #ifndef STANDALONE
58 #include "config.h"
59 
62 
63 
64 
68 #endif
69 
70 
71 #define PI 3.14159265358979323846264338328
72 
74 #define SZ_CLICOREVARRAY 1000
75 
76 #define STRINGMAXLEN_DEFAULT 1000
77 #define STRINGMAXLEN_ERRORMSG 1000
78 #define STRINGMAXLEN_CLICMDLINE 1000 // CPU input command line
79 #define STRINGMAXLEN_COMMAND 1000
80 #define STRINGMAXLEN_STREAMNAME 100
81 #define STRINGMAXLEN_IMGNAME 100
82 #define STRINGMAXLEN_FILENAME 200 // without directory, includes extension
83 #define STRINGMAXLEN_DIRNAME 800
84 #define STRINGMAXLEN_FULLFILENAME 1000 // includes directory name
85 #define STRINGMAXLEN_FUNCTIONNAME 200
86 #define STRINGMAXLEN_FUNCTIONARGS 1000
87 #define STRINGMAXLEN_SHMDIRNAME 200
88 
89 #define STRINGMAXLEN_FPSPROCESSTYPE 64
90 
91 
93 extern pid_t CLIPID; // command line interface PID
94 extern char DocDir[200]; // location of documentation
95 extern char SrcDir[200]; // location of source
96 extern char BuildFile[200]; // file name for source
97 extern char BuildDate[200];
98 extern char BuildTime[200];
99 
100 extern int C_ERRNO; // C errno (from errno.h)
101 
102 /* #define DEBUG */
103 #define CFITSEXIT printf("Program abnormally terminated, File \"%s\", line %d\n", __FILE__, __LINE__);exit(0)
104 
105 #ifdef DEBUG
106 #define nmalloc(f,type,n) f = (type*) malloc(sizeof(type)*n);if(f==NULL){printf("ERROR: pointer \"" #f "\" allocation failed\n");exit(0);}else{printf("\nMALLOC: \""#f "\" allocated\n");}
107 #define nfree(f) free(f);printf("\nMALLOC: \""#f"\" freed\n");
108 #else
109 #define nmalloc(f,type,n) f = (type*) malloc(sizeof(type)*n);if(f==NULL){printf("ERROR: pointer \"" #f "\" allocation failed\n");exit(0);}
110 #define nfree(f) free(f);
111 #endif
112 
113 #define TEST_ALLOC(f) if(f==NULL){printf("ERROR: pointer \"" #f "\" allocation failed\n");exit(0);}
114 
115 
116 #define NB_ARG_MAX 20
117 
118 
119 
120 
121 
122 //
123 // ************ lib module init **********************************
124 //
125 
128 #define INIT_MODULE_LIB(modname) \
129 static errno_t init_module_CLI(); /* forward declaration */ \
130 static int INITSTATUS_##modname = 0; \
131 void __attribute__ ((constructor)) libinit_##modname() \
132 { \
133 if ( INITSTATUS_##modname == 0 ) /* only run once */ \
134 { \
135 strcpy(data.moduleshortname_default, MODULE_SHORTNAME_DEFAULT); \
136 strcpy(data.moduledatestring, __DATE__); \
137 strcpy(data.moduletimestring, __TIME__); \
138 strcpy(data.modulename, (#modname)); \
139 RegisterModule(__FILE__, PROJECT_NAME, MODULE_DESCRIPTION, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); \
140 init_module_CLI(); \
141 INITSTATUS_##modname = 1; \
142 strcpy(data.modulename, ""); /* reset after use */ \
143 strcpy(data.moduleshortname_default, ""); /* reset after use */ \
144 strcpy(data.moduleshortname, ""); /* reset after use */ \
145 } \
146 } \
147 void __attribute__ ((destructor)) libclose_##modname() \
148 { \
149 if ( INITSTATUS_##modname == 1 ) \
150 { \
151 } \
152 }
153 
154 
155 
156 
157 
158 
159 //
160 // ************ ERROR HANDLING **********************************
161 //
162 
166 #ifndef STANDALONE
167 #define PRINT_ERROR(...) do { \
168 sprintf(data.testpoint_msg, __VA_ARGS__); \
169 printf("ERROR: %c[%d;%dm %s %c[%d;m\n", (char) 27, 1, 31, data.testpoint_msg, (char) 27, 0); \
170 sprintf(data.testpoint_file, "%s", __FILE__); \
171 sprintf(data.testpoint_func, "%s", __func__); \
172 data.testpoint_line = __LINE__; \
173 clock_gettime(CLOCK_REALTIME, &data.testpoint_time); \
174 } while(0)
175 #else
176 #define PRINT_ERROR(...) printf("ERROR: %c[%d;%dm %s %c[%d;m\n", (char) 27, 1, 31, __VA_ARGS__, (char) 27, 0)
177 #endif
178 
179 
180 
185 #define PRINT_WARNING(...) do { \
186 char warnmessage[1000]; \
187 sprintf(warnmessage, __VA_ARGS__); \
188 fprintf(stderr, \
189 "%c[%d;%dm WARNING [ FILE: %s FUNCTION: %s LINE: %d ] %c[%d;m\n", \
190 (char) 27, 1, 35, __FILE__, __func__, __LINE__, (char) 27, 0); \
191 if(C_ERRNO != 0) \
192 { \
193 char buff[256]; \
194 if( strerror_r( errno, buff, 256 ) == 0 ) { \
195 fprintf(stderr,"C Error: %s\n", buff ); \
196 } else { \
197 fprintf(stderr,"Unknown C Error\n"); \
198 } \
199 } else { \
200 fprintf(stderr,"No C error (errno = 0)\n"); } \
201 fprintf(stderr, "%c[%d;%dm ", (char) 27, 1, 35); \
202 fprintf(stderr, "%s", warnmessage); \
203 fprintf(stderr, " %c[%d;m\n", (char) 27, 0); \
204 C_ERRNO = 0; \
205 } while(0)
206 
207 
208 
209 
214 #if defined NDEBUG || defined STANDALONE
215 #define DEBUG_TRACEPOINT(...)
216 #else
217 #define DEBUG_TRACEPOINT(...) do { \
218 sprintf(data.testpoint_file, "%s", __FILE__); \
219 sprintf(data.testpoint_func, "%s", __func__); \
220 data.testpoint_line = __LINE__; \
221 clock_gettime(CLOCK_REALTIME, &data.testpoint_time); \
222 sprintf(data.testpoint_msg, __VA_ARGS__); \
223 } while(0)
224 #endif
225 
226 
231 #if defined NDEBUG || defined STANDALONE
232 #define DEBUG_TRACEPOINTLOG(...)
233 #else
234 #define DEBUG_TRACEPOINTLOG(...) do { \
235 sprintf(data.testpoint_file, "%s", __FILE__); \
236 sprintf(data.testpoint_func, "%s", __func__); \
237 data.testpoint_line = __LINE__; \
238 clock_gettime(CLOCK_REALTIME, &data.testpoint_time); \
239 sprintf(data.testpoint_msg, __VA_ARGS__); \
240 write_process_log(); \
241 } while(0)
242 #endif
243 
244 
245 
246 //
247 // ************ ERROR-CHECKING FUNCTIONS **********************************
248 //
249 
250 
251 
252 
258 #define EXECUTE_SYSTEM_COMMAND(...) do { \
259 char syscommandstring[STRINGMAXLEN_COMMAND]; \
260 int slen = snprintf(syscommandstring, STRINGMAXLEN_COMMAND, __VA_ARGS__); \
261 if(slen<1) { \
262  PRINT_ERROR("snprintf wrote <1 char"); \
263  abort(); \
264 } \
265 if(slen >= STRINGMAXLEN_COMMAND) { \
266  PRINT_ERROR("snprintf string truncation"); \
267  abort(); \
268 } \
269 data.retvalue = system(syscommandstring); \
270 } while(0)
271 
272 
273 
279 #define SNPRINTF_CHECK(string, maxlen, ...) do { \
280 int slen = snprintf(string, maxlen, __VA_ARGS__); \
281 if(slen<1) { \
282  PRINT_ERROR("snprintf wrote <1 char"); \
283  abort(); \
284 } \
285 if(slen >= maxlen) { \
286  PRINT_ERROR("snprintf string truncation"); \
287  abort(); \
288 } \
289 } while(0)
290 
291 
292 
309 #define WRITE_IMAGENAME(imname, ...) do { \
310 int slen = snprintf(imname, STRINGMAXLEN_IMGNAME, __VA_ARGS__); \
311 if(slen<1) { \
312  PRINT_ERROR("snprintf wrote <1 char"); \
313  abort(); \
314 } \
315 if(slen >= STRINGMAXLEN_IMGNAME) { \
316  PRINT_ERROR("snprintf string truncation"); \
317  abort(); \
318 } \
319 } while(0)
320 
321 
322 #define CREATE_IMAGENAME(imname, ...) \
323 char imname[STRINGMAXLEN_IMGNAME]; \
324 do { \
325 int slen = snprintf(imname, STRINGMAXLEN_IMGNAME, __VA_ARGS__); \
326 if(slen<1) { \
327  PRINT_ERROR("snprintf wrote <1 char"); \
328  abort(); \
329 } \
330 if(slen >= STRINGMAXLEN_IMGNAME) { \
331  PRINT_ERROR("snprintf string truncation"); \
332  abort(); \
333 } \
334 } while(0)
335 
336 
337 
338 
353 #define WRITE_DIRNAME(dirname, ...) do { \
354 int slen = snprintf(dirname, STRINGMAXLEN_DIRNAME, __VA_ARGS__); \
355 if(slen<1) { \
356  PRINT_ERROR("snprintf wrote <1 char"); \
357  abort(); \
358 } \
359 if(slen >= STRINGMAXLEN_DIRNAME) { \
360  PRINT_ERROR("snprintf string truncation"); \
361  abort(); \
362 } \
363 } while(0)
364 
365 
366 
367 
382 #define WRITE_FILENAME(fname, ...) do { \
383 int slen = snprintf(fname, STRINGMAXLEN_FILENAME, __VA_ARGS__); \
384 if(slen<1) { \
385  PRINT_ERROR("snprintf wrote <1 char"); \
386  abort(); \
387 } \
388 if(slen >= STRINGMAXLEN_FILENAME) { \
389  PRINT_ERROR("snprintf string truncation"); \
390  abort(); \
391 } \
392 } while(0)
393 
394 
395 
396 
412 #define WRITE_FULLFILENAME(ffname, ...) do { \
413 int slen = snprintf(ffname, STRINGMAXLEN_FULLFILENAME, __VA_ARGS__); \
414 if(slen<1) { \
415  PRINT_ERROR("snprintf wrote <1 char"); \
416  abort(); \
417 } \
418 if(slen >= STRINGMAXLEN_FULLFILENAME) { \
419  PRINT_ERROR("snprintf string truncation"); \
420  abort(); \
421 } \
422 } while(0)
423 
424 
425 
426 
440 #define WRITE_STRING_TO_FILE(fname, ...) do { \
441 FILE *fptmp; \
442 fptmp = fopen(fname, "w"); \
443 if (fptmp == NULL) { \
444 int errnum = errno; \
445 PRINT_ERROR("fopen() returns NULL"); \
446 fprintf(stderr, "Error opening file %s: %s\n", fname, strerror( errnum )); \
447 abort(); \
448 } else { \
449 fprintf(fptmp, __VA_ARGS__); \
450 fclose(fptmp); \
451 } \
452 } while(0)
453 
454 
455 
456 
457 
458 
459 
460 
461 
462 
463 // *************************** FUNCTION RETURN VALUE *********************************************
464 // For function returning type errno_t (= int)
465 //
466 #define RETURN_SUCCESS 0
467 #define RETURN_FAILURE 1 // generic error code
468 #define RETURN_MISSINGFILE 2
469 
470 
471 #define MAX_NB_FRAMENAME_CHAR 500
472 #define MAX_NB_EXCLUSIONS 40
473 
474 #ifndef STANDALONE
475 
476 
477 
478 // testing argument type for command line interface
479 #define CLIARG_FLOAT 1 // floating point number
480 #define CLIARG_LONG 2 // integer (int or long)
481 #define CLIARG_STR_NOT_IMG 3 // string, not existing image
482 #define CLIARG_IMG 4 // existing image
483 #define CLIARG_STR 5 // string
484 
485 #define CLICMD_SUCCESS 0
486 #define CLICMD_INVALID_ARG 1
487 #define CLICMD_ERROR 2
488 
489 
490 // declare a boolean type "BOOL"
491 // TRUE and FALSE improve code readability
492 //
493 typedef uint_fast8_t BOOL;
494 #define FALSE 0
495 #define TRUE 1
496 
497 
498 
499 
500 #define DATA_NB_MAX_COMMAND 1000
501 #define DATA_NB_MAX_MODULE 100
502 
503 // In STATIC allocation mode, IMAGE and VARIABLE arrays are allocated statically
504 
505 //#define DATA_STATIC_ALLOC // comment if DYNAMIC
506 #define STATIC_NB_MAX_IMAGE 520
507 #define STATIC_NB_MAX_VARIABLE 5030
508 
509 
510 
511 //Need to install process with setuid. Then, so you aren't running privileged all the time do this:
512 extern uid_t euid_real;
513 extern uid_t euid_called;
514 extern uid_t suid;
515 
516 
517 
518 
519 
520 
521 
522 
523 
524 /*^-----------------------------------------------------------------------------
525 | commands available through the CLI
526 +-----------------------------------------------------------------------------*/
527 
528 
529 
530 typedef struct
531 {
532  char key[100]; // command keyword
533  char module[200]; // module name
534  // index of module to which command belongs
535  // set to -1 if does not belong to any module
536  long moduleindex;
537  char modulesrc[200]; // module source filename
538  errno_t (* fp)(); // command function pointer
539  char info[1000]; // short description/help
540  char syntax[1000]; // command syntax
541  char example[1000]; // command example
542  char Ccall[1000];
543 } CMD;
544 
545 
546 
547 typedef struct
548 {
549  char name[50]; // module name
550 
551  char shortname[80]; // short name. If non-empty, access functions as <shortname>.<functionname>
552 
553  char package[50]; // package to which module belongs
554  int versionmajor; // package version
555  int versionminor;
556  int versionpatch;
557 
558  char info[1000]; // short description
559 
560  char datestring[20]; // Compilation date
561  char timestring[20]; // Compilation time
562 
563 } MODULE;
564 
565 
566 
567 
568 /* ---------------------------------------------------------- */
569 /* */
570 /* */
571 /* COMMAND LINE ARGs / TOKENS */
572 /* */
573 /* */
574 /* ---------------------------------------------------------- */
575 
576 
577 // The command line is parsed and
578 
579 // cmdargtoken type
580 // 0 : unsolved
581 // 1 : floating point (double precision)
582 // 2 : long
583 // 3 : string
584 // 4 : existing image
585 // 5 : command
586 
587 #define CMDARG_TYPE_UNSOLVED 0
588 #define CMDARG_TYPE_FLOAT 1
589 #define CMDARG_TYPE_LONG 2
590 #define CMDARG_TYPE_STRING 3
591 #define CMDARG_TYPE_EXISTINGIMAGE 4
592 #define CMDARG_TYPE_COMMAND 5
593 #define CMDARG_TYPE_RAWSTRING 6
594 
595 typedef struct
596 {
597  int type;
598  struct
599  {
600  double numf;
601  long numl;
602  char string[200];
603  } val;
604 } CMDARGTOKEN;
605 
606 
607 
608 int CLI_checkarg(int argnum, int argtype);
609 int CLI_checkarg_noerrmsg(int argnum, int argtype);
610 
611 
612 
613 
614 
615 
616 extern uint8_t TYPESIZE[32];
617 
618 
619 
620 
621 typedef struct
622 {
623  int used;
624  char name[80];
625  int type;
626  union
627  {
628  double f;
629  long l;
630  char s[80];
631  } value;
632  char comment[200];
633 } VARIABLE;
634 
635 
636 
637 
638 
639 
640 // THIS IS WHERE EVERYTHING THAT NEEDS TO BE WIDELY ACCESSIBLE GETS STORED
641 typedef struct
642 {
643  char package_name[100];
644  int package_version_major;
645  int package_version_minor;
646  int package_version_patch;
647  char package_version[100];
648  char configdir[100];
649  char sourcedir[100];
650 
651  char shmdir[100];
652  char shmsemdirname[100]; // same ad above with .s instead of /s
653 
654 
655  // SIGNALS
656  // =================================================
657 
658  struct sigaction sigact;
659 
660  int signal_USR1;
661  int signal_USR2;
662  int signal_TERM;
663  int signal_INT;
664  int signal_SEGV;
665  int signal_ABRT;
666  int signal_BUS;
667  int signal_HUP;
668  int signal_PIPE;
669 
670 
671 
672  // TEST POINTS
673  // =================================================
674  // can be used to trace program execution for runtime profiling and debugging
675 
676  int testpoint_line;
677  char testpoint_file[STRINGMAXLEN_FILENAME];
678  char testpoint_func[STRINGMAXLEN_FUNCTIONNAME];
679  char testpoint_msg[STRINGMAXLEN_FUNCTIONARGS]; // function arguments
680  struct timespec testpoint_time;
681 
682 
683 
684 
685  int progStatus; // main program status
686  // 0: before automatic loading of shared objects
687  // 1: after automatic loading of shared objects
688 
689 
690  // REAL-TIME PRIO
691  // =================================================
692 
693  uid_t ruid; // Real UID (= user launching process at startup)
694  uid_t euid; // Effective UID (= owner of executable at startup)
695  uid_t suid; // Saved UID (= owner of executable at startup)
696  // system permissions are set by euid
697  // at startup, euid = owner of executable (meant to be root)
698  // -> we first drop privileges by setting euid to ruid
699  // when root privileges needed, we set euid <- suid
700  // when reverting to user privileges : euid <- ruid
701 
702 
703  // OPERATION MODE
704  // =================================================
705 
706  int Debug;
707  int quiet;
708  int overwrite; // automatically overwrite FITS files
709  int rmSHMfile; // remove shared memory files upon delete
710  double INVRANDMAX;
711  gsl_rng *rndgen; // random number generator
712  int precision; // default precision: 0 for float, 1 for double
713 
714 
715  // LOGGING, PROCESS MONITORING
716  // =================================================
717 
718  int CLIloopON;
719  int CLIlogON;
720  char CLIlogname[200];
721  int processinfo; // 1 if processes info is to be logged
722  int processinfoActive; // 1 is the process is currently logged
723  PROCESSINFO *pinfo; // pointer to process info structure
724 
725 
726 
727  // COMMAND LINE INTERFACE (CLI)
728  // =================================================
729 
730  int fifoON;
731  char processname[100];
732  char processname0[100];
733  int processnameflag;
734  char fifoname[100];
735  uint32_t NBcmd;
736 
737  long NB_MAX_COMMAND;
738  CMD cmd[1000];
739 
740  char CLIcmdline[STRINGMAXLEN_CLICMDLINE];
741  int CLIexecuteCMDready;
742  int CLImatchMode;
743  // 1 if error, 0 otherwise
744  int parseerror;
745  // number of arguments in last command line
746  long cmdNBarg;
747  CMDARGTOKEN cmdargtoken[NB_ARG_MAX];
748 
749  // when command is found in command line, holds index of command
750  long cmdindex;
751  // used to create temporary images
752  long calctmp_imindex;
753  // 0 if command has not been executed, 1 otherwise
754  int CMDexecuted;
755 
756 
757 
758  // MODULES
759  // =================================================
760 
761  long NBmodule;
762  long NB_MAX_MODULE;
763  MODULE module[100];
764  long moduleindex;
765  char modulename[100];
766  char moduleshortname[80];
767  char moduleshortname_default[80];
768  char moduledatestring[20];
769  char moduletimestring[20];
770 
771 
772  // FUNCTION PARAMETER STRUCTURES (FPSs)
773  // =================================================
774 
775  // array of FPSs
776  long NB_MAX_FPS;
778 
779 
780  // Function parameter structure (FPS) CLI integration
781  // These entries are set when CLI process links to FPS
782  char FPS_name[STRINGMAXLEN_FPS_NAME]; // name of FPS if in use
783  // Which type of FPS process is the current process ?
784  // conf, run, ctrl
785  char FPS_PROCESS_TYPE[STRINGMAXLEN_FPSPROCESSTYPE]; // included in log file name
786  long FPS_TIMESTAMP; // included in log file name
787  uint32_t FPS_CMDCODE; // current FPS mode
788  errno_t (*FPS_CONFfunc)(); // pointer to FPS conf function
789  errno_t (*FPS_RUNfunc)(); // pointer to FPS run function
790 
791 
792 
793 
794 
795  // IMAGES
796  // =================================================
797  long NB_MAX_IMAGE;
798 #ifdef DATA_STATIC_ALLOC
799  // image static allocation mode
800  IMAGE image[STATIC_NB_MAX_IMAGE];
801 #else
802  IMAGE *image;
803 #endif
804  int MEM_MONITOR; // memory monitor enabled ?
805 
806  // shared memory default
807  int SHARED_DFT;
808 
809  // Number of keyword per image default
810  int NBKEWORD_DFT;
811 
812 
813 
814  // VARIABLES
815  // =================================================
816 
817  long NB_MAX_VARIABLE;
818 #ifdef DATA_STATIC_ALLOC
819  // variable static allocation mode
820  VARIABLE variable[STATIC_NB_MAX_VARIABLE];
821 #else
822  VARIABLE *variable;
823 #endif
824 
825 
826 
827 
828 
829  // CONVENIENCE STORAGE
830  // =================================================
831  float FLOATARRAY[1000]; // array to store temporary variables
832  double DOUBLEARRAY[1000]; // for convenience
833  char SAVEDIR[500];
834 
835  // gen purpose return value
836  // used for system commands
837  int retvalue;
838 
839  // status counter (used for profiling)
840  int status0;
841  int status1;
842 
843 } DATA;
844 
845 
846 extern DATA data;
847 
848 
849 
850 
851 
852 
853 errno_t set_signal_catch();
854 
855 void sig_handler(int signo);
856 
857 
858 
859 errno_t RegisterModule(
860  const char *restrict FileName,
861  const char *restrict PackageName,
862  const char *restrict InfoString,
863  int versionmajor,
864  int versionminor,
865  int versionpatch
866 );
867 
868 uint32_t RegisterCLIcommand(
869  const char *restrict CLIkey,
870  const char *restrict CLImodulesrc,
871  errno_t (*CLIfptr)(),
872  const char *restrict CLIinfo,
873  const char *restrict CLIsyntax,
874  const char *restrict CLIexample,
875  const char *restrict CLICcall
876 );
877 
878 
879 errno_t runCLItest(int argc, char *argv[], char *promptstring);
880 
881 errno_t runCLI(int argc, char *argv[], char *promptstring);
882 
883 errno_t CLI_execute_line();
884 
885 
886 
887 
888 #endif // ifndef STANDALONE
889 
890 errno_t write_process_log();
891 
892 #endif
PROCESSINFO
Definition: processtools.h:92
MODULE
Definition: CLIcore.h:547
FUNCTION_PARAMETER_STRUCT
Definition: function_parameters.h:502
set_signal_catch
errno_t set_signal_catch()
signal catching
Definition: CLIcore_signals.c:104
IMAGE
IMAGE structure The IMAGE structure includes :
Definition: ImageStruct.h:366
runCLI
errno_t runCLI(int argc, char *argv[], char *promptstring)
Command Line Interface (CLI) main .
Definition: CLIcore.c:567
ImageStreamIO.h
Function prototypes for ImageStreamIO.
streamCTRL.h
Data streams control panel.
CMD
Definition: CLIcore.h:530
VARIABLE
Definition: CLIcore.h:621
ImageStruct.h
Image structure definition.
processtools.h
Command line interface.
write_process_log
errno_t write_process_log()
Write entry into debug log.
Definition: CLIcore_signals.c:28
sig_handler
void sig_handler(int signo)
Signal handler.
Definition: CLIcore_signals.c:249
DATA
Definition: CLIcore.h:641
CMDARGTOKEN
Definition: CLIcore.h:595
function_parameters.h
Tools to help expose and control function parameters.
CLIPID
pid_t CLIPID
important directories and info
Definition: CLIcore.c:109