source: hvcontrol/src/CCCommand.cc@ 15

Last change on this file since 15 was 14, checked in by lstark, 16 years ago
first version of hvcontrol added
File size: 3.4 KB
Line 
1
2/********************************************************************\
3
4 Name: CCCommand.cc
5
6 Created by: Oliver Grimm, Sebastian Commichau, January 2009
7 oliver.grimm@phys.ethz.ch, commichau@phys.ethz.ch
8
9 Actions: Listen to commands from Central Control (CC)
10
11\********************************************************************/
12
13#include "CCCommand.h"
14
15
16void CCCommand(ProcessIO *m) {
17
18 siginterrupt(SIGUSR1, true);
19
20 int ServerSocket,ConnectionSocket,ReadResult;
21 struct sockaddr_in SocketAddress, ClientAddress;
22 socklen_t SizeClientAddress=sizeof(ClientAddress);
23 char comline[MAX_COM_SIZE], str[MAX_COM_SIZE];
24
25 // Set up server socket
26 if ((ServerSocket = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
27 sprintf(str,"error: could not open server socket, no remote connection possible");
28 m->PrintMessage(str);
29 return;
30 }
31
32 SocketAddress.sin_family = PF_INET;
33 SocketAddress.sin_port = htons((unsigned short) m->config->fCCPort);
34 SocketAddress.sin_addr.s_addr = INADDR_ANY;
35
36 if (bind(ServerSocket, (struct sockaddr *) &SocketAddress, sizeof(SocketAddress)) == -1) {
37 sprintf(str,"error: could not bind port to socket");
38 m->PrintMessage(str);
39 close(ServerSocket);
40 return;
41 }
42 if (listen(ServerSocket, 0) == -1) {
43 sprintf(str,"error: could not set socket to listening");
44 m->PrintMessage(str);
45 close(ServerSocket);
46 return;
47 }
48
49 while (!m->status->Exit) { // Looping to wait for incoming connection
50
51 if ((ConnectionSocket = accept(ServerSocket, (struct sockaddr *) &ClientAddress, &SizeClientAddress)) == -1) {
52 if (errno!=EINTR) {
53 sprintf(str,"error: failed to accept incoming connection");
54 m->PrintMessage(str);
55 }
56 close(ServerSocket);
57 return;
58 }
59
60 pthread_mutex_lock(&m->control_mutex);
61 m->status->Socket = ConnectionSocket;
62 m->status->cc_state = connected;
63 sprintf(str,"connected to client (%s)",inet_ntoa(ClientAddress.sin_addr));
64 m->PrintMessage(str);
65 pthread_mutex_unlock(&m->control_mutex);
66
67 while (!m->status->Exit) { // Looping as long as client exists
68 bzero(comline,sizeof(comline));
69 ReadResult = read(ConnectionSocket, comline, MAX_COM_SIZE);
70 if (ReadResult==0) break; // Client does not exist anymore
71 if (ReadResult==-1) {
72 if (errno!=EINTR) {
73 sprintf(str,"error: socket read failed");
74 m->PrintMessage(str);
75 }
76 break;
77 }
78
79 m->status->Pc = comline;
80
81 sprintf(str,"Test in CCComand: %s",m->status->Pc);
82 printf(str);
83
84 ParseInput(m->status->Pc,&(m->status->NParam),m->status->Param);
85
86 if (!(Match(m->status->Param[0], "exit") || Match(m->status->Param[0], "quit"))) {
87
88 sprintf(str,"CC> %s",m->status->Pc);
89 m->log->LogWrite(str);
90
91 sprintf(str,"%s",m->status->Pc);
92 printf(str);
93
94 pthread_mutex_lock(&m->control_mutex);
95 // Process CC command
96 if (m->CommandControl()==0)
97 pthread_cond_broadcast(&m->control_cond);
98 pthread_mutex_unlock(&m->control_mutex);
99
100 }
101 else
102 printf("remote exit|quit forbidden\n");
103
104 m->PrintMessage(NULL);
105
106 }
107
108 if (!(m->status->Exit)) {
109 sprintf(str,"disconnected from client (%s)",inet_ntoa(ClientAddress.sin_addr));
110 m->PrintMessage(str);
111 }
112 m->status->Socket = -1;
113 pthread_mutex_lock(&m->control_mutex);
114 m->status->cc_state = disconnected;
115 pthread_mutex_unlock(&m->control_mutex);
116 close(ConnectionSocket);
117
118 }
119 close(ServerSocket);
120
121}
Note: See TracBrowser for help on using the repository browser.