Listing 3 (client.c)
/* * Basic client process for time accounting system, non-network version. * This process (and those that are linked to it) are run as commands * and send events to the server process. */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include "time_entry.h" main(argc, argv) int argc; char *argv[]; { int skt_id, /* Socket descriptor */ msg_sock, /* Socket that will accept messages */ i,j; EVENT_TYPE event; struct sockaddr sa; /* Socket address structure */ char buff[80]; /* * Specify the socket domain and type we want... */ skt_id = socket(AF_UNIX, SOCK_STREAM, 0); if(skt_id == -1){ perror("Can't create socket"); exit(1); } /* * Now set up the address structure and connect to the socket. */ sa.sa_family = AF_UNIX; strcpy(sa.sa_data, SOCKET_NAME); if(connect(skt_id, &sa, sizeof(sa)) == -1){ perror("Can't connect to socket"); exit(1); } build_event(argv[0], &event); /* * Now, send the event */ if(write(skt_id, &event, sizeof(event)) != sizeof(event)){ perror("Write"); exit(1); } /* Cleanup */ close(skt_id); exit(0); } build_event(a, e) char *a; /* Name process was invoked with */ EVENT_TYPE *e; /* A time entry event */ { if(!strcmp(a, "pi")) /* A PHONE_IN event */ e->event_cd = PHONE_IN; else if(!strcmp(a, "po")) /* PHONE_OUT */ e->event_cd = PHONE_OUT; /* * Check any other types... */ else e->event_cd = SHUT_DOWN; /* Default is shut down */ e->bill_flag = 'Y'; /* Billable is the default */ /* * Code here to get the system time (e->event_st), and the * login name of the user (e->logname). For now, let's just * hard code something... */ e->event_st = 0; strcpy(e->logname, "bryang"); }