The first section of code here sets up the various manifest constants that we'll be using, the data structures, and includes all the header files required. We'll present this without comment. :-)
/* * time1.c * * Example of a server that receives periodic messages from * a timer, and regular messages from a client. * * Illustrates using the timer functions with a pulse. */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <signal.h> #include <errno.h> #include <unistd.h> #include <sys/siginfo.h> #include <sys/neutrino.h> // message send definitions // messages #define MT_WAIT_DATA 2 // message from client #define MT_SEND_DATA 3 // message from client // pulses #define CODE_TIMER 1 // pulse from timer // message reply definitions #define MT_OK 0 // message to client #define MT_TIMEDOUT 1 // message to client // message structure typedef struct { // contains both message to and from client int messageType; // optional data, depending upon message int messageData; } ClientMessageT; typedef union { // a message can be either from a client, or a pulse ClientMessageT msg; struct _pulse pulse; } MessageT; // client table #define MAX_CLIENT 16 // max # of simultaneous clients struct { int in_use; // is this client entry in use? int rcvid; // receive ID of client int timeout; // timeout left for client } clients [MAX_CLIENT]; // client table int chid; // channel ID (global) int debug = 1; // set debug value, 1=on, 0=off char *progname = "time1.c"; // forward prototypes static void setupPulseAndTimer (void); static void gotAPulse (void); static void gotAMessage (int rcvid, ClientMessageT *msg);