44 #include <sys/select.h>
45 #include <sys/socket.h>
50 #include <sys/types.h>
53 #define SE_CLI_CMDLEN 6
55 static const char* cli_str =
"client";
64 fprintf(out,
"Usage: %s [<cmd>]\n",
"ods-signer");
65 fprintf(out,
"Simple command line interface to control the signer "
66 "engine daemon.\nIf no cmd is given, the tool is going "
67 "to interactive mode.\n");
68 fprintf(out,
"\nBSD licensed, see LICENSE in source package for "
70 fprintf(out,
"Version %s. Report bugs to <%s>.\n",
71 PACKAGE_VERSION, PACKAGE_BUGREPORT);
91 interface_run(FILE* fp,
int sockfd,
char* cmd)
102 char buf[ODS_SE_MAXLINE];
109 FD_SET(fileno(fp), &rset);
111 FD_SET(sockfd, &rset);
112 maxfdp1 = max(fileno(fp), sockfd) + 1;
114 if (!cmd || cmd_written) {
116 ret = select(maxfdp1, &rset, NULL, NULL, NULL);
118 if (errno != EINTR && errno != EWOULDBLOCK) {
120 cli_str, strerror(errno));
130 FD_CLR(fileno(fp), &rset);
134 if (cmd && cmd_written && cmd_response) {
139 if (FD_ISSET(sockfd, &rset)) {
141 for (i=0; i < ODS_SE_MAXLINE; i++) {
144 buf[ODS_SE_MAXLINE-1] =
'\0';
147 if ((n = read(sockfd, buf, ODS_SE_MAXLINE)) <= 0) {
150 fprintf(stderr,
"error: %s\n", strerror(errno));
159 fprintf(stderr,
"signer engine terminated "
169 fprintf(stderr,
"not enough response data received "
184 for (written=0; written < n; written += ret) {
186 ret = (int) write(fileno(stdout), &buf[written], n-written);
189 fprintf(stderr,
"no write\n");
193 if (errno == EINTR || errno == EWOULDBLOCK) {
197 fprintf(stderr,
"\n\nwrite error: %s\n", strerror(errno));
201 if (written+ret > n) {
202 fprintf(stderr,
"\n\nwrite error: more bytes (%d) written than required (%d)\n",
208 if (
ods_strcmp(buf, ODS_SE_STOP_RESPONSE) == 0 || cmd_response) {
209 fprintf(stdout,
"\n");
214 if (FD_ISSET(fileno(fp), &rset)) {
217 if (cmd && cmd_written) {
220 ret = shutdown(sockfd, SHUT_WR);
222 fprintf(stderr,
"shutdown failed: %s\n",
226 FD_CLR(fileno(fp), &rset);
231 for (i=0; i< ODS_SE_MAXLINE; i++) {
236 if ((n = read(fileno(fp), buf, ODS_SE_MAXLINE)) == 0) {
238 ret = shutdown(sockfd, SHUT_WR);
240 fprintf(stderr,
"shutdown failed: %s\n",
244 FD_CLR(fileno(fp), &rset);
248 buf[ODS_SE_MAXLINE-1] =
'\0';
249 if (strncmp(buf,
"exit", 4) == 0 ||
250 strncmp(buf,
"quit", 4) == 0) {
266 interface_start(
char* cmd)
268 int sockfd, ret, flags;
269 struct sockaddr_un servaddr;
270 const char* servsock_filename = ODS_SE_SOCKFILE;
275 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
277 fprintf(stderr,
"Unable to connect to engine. "
278 "socket() failed: %s\n", strerror(errno));
283 bzero(&servaddr,
sizeof(servaddr));
284 servaddr.sun_family = AF_UNIX;
285 strncpy(servaddr.sun_path, servsock_filename,
286 sizeof(servaddr.sun_path) - 1);
289 ret = connect(sockfd, (
const struct sockaddr*) &servaddr,
293 return system(ODS_SE_ENGINE);
296 if (cmd &&
ods_strcmp(cmd,
"running\n") == 0) {
297 fprintf(stderr,
"Engine not running.\n");
299 fprintf(stderr,
"Unable to connect to engine: "
300 "connect() failed: %s\n", strerror(errno));
308 flags = fcntl(sockfd, F_GETFL, 0);
310 ods_log_error(
"[%s] unable to start interface, fcntl(F_GETFL) "
311 "failed: %s", cli_str, strerror(errno));
316 if (fcntl(sockfd, F_SETFL, flags) < 0) {
317 ods_log_error(
"[%s] unable to start interface, fcntl(F_SETFL) "
318 "failed: %s", cli_str, strerror(errno));
325 fprintf(stderr,
"cmd> ");
329 ret = interface_run(stdin, sockfd, cmd);
343 int options_size = 0;
344 const char* options[5];
349 fprintf(stderr,
"error, malloc failed for client\n");
354 fprintf(stderr,
"error, too many arguments (%d)\n", argc);
359 for (c = 0; c < argc; c++) {
360 options[c] = argv[c];
362 options_size += strlen(argv[c]) + 1;
366 cmd = (
char*)
allocator_alloc(clialloc, (options_size+2)*
sizeof(char));
368 fprintf(stderr,
"memory allocation failed\n");
371 (void)strncpy(cmd,
"", 1);
372 for (c = 1; c < argc; c++) {
373 (void)strncat(cmd, options[c], strlen(options[c]));
374 (void)strncat(cmd,
" ", 1);
376 cmd[options_size-1] =
'\n';
383 }
else if (cmd &&
ods_strcmp(cmd,
"--help\n") == 0) {
387 ret = interface_start(cmd);