42 #include <sys/select.h>
43 #include <sys/socket.h>
48 #include <sys/types.h>
51 #define SE_CLI_CMDLEN 6
53 static const char* cli_str =
"client";
62 fprintf(out,
"Usage: %s [<cmd>]\n",
"ods-signer");
63 fprintf(out,
"Simple command line interface to control the signer "
64 "engine daemon.\nIf no cmd is given, the tool is going "
65 "into interactive mode.\n");
66 fprintf(out,
"\nBSD licensed, see LICENSE in source package for "
68 fprintf(out,
"Version %s. Report bugs to <%s>.\n",
69 PACKAGE_VERSION, PACKAGE_BUGREPORT);
89 interface_run(FILE* fp,
int sockfd,
char* cmd)
100 char buf[ODS_SE_MAXLINE];
106 FD_SET(fileno(fp), &rset);
108 FD_SET(sockfd, &rset);
109 maxfdp1 = max(fileno(fp), sockfd) + 1;
111 if (!cmd || cmd_written) {
113 ret = select(maxfdp1, &rset, NULL, NULL, NULL);
115 if (errno != EINTR && errno != EWOULDBLOCK) {
117 cli_str, strerror(errno));
127 FD_CLR(fileno(fp), &rset);
131 if (cmd && cmd_written && cmd_response) {
136 if (FD_ISSET(sockfd, &rset)) {
138 for (i=0; i < ODS_SE_MAXLINE; i++) {
141 buf[ODS_SE_MAXLINE-1] =
'\0';
144 if ((n = read(sockfd, buf, ODS_SE_MAXLINE)) <= 0) {
147 fprintf(stderr,
"error: %s\n", strerror(errno));
156 fprintf(stderr,
"signer engine terminated "
166 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 "
203 "than required (%d)\n",
209 if (
ods_strcmp(buf, ODS_SE_STOP_RESPONSE) == 0 || cmd_response) {
210 fprintf(stdout,
"\n");
215 if (FD_ISSET(fileno(fp), &rset)) {
218 if (cmd && cmd_written) {
221 ret = shutdown(sockfd, SHUT_WR);
223 fprintf(stderr,
"shutdown failed: %s\n",
227 FD_CLR(fileno(fp), &rset);
232 for (i=0; i< ODS_SE_MAXLINE; i++) {
237 if ((n = read(fileno(fp), buf, ODS_SE_MAXLINE)) == 0) {
239 ret = shutdown(sockfd, SHUT_WR);
241 fprintf(stderr,
"shutdown failed: %s\n",
245 FD_CLR(fileno(fp), &rset);
249 buf[ODS_SE_MAXLINE-1] =
'\0';
250 if (strncmp(buf,
"exit", 4) == 0 ||
251 strncmp(buf,
"quit", 4) == 0) {
268 interface_start(
char* cmd)
270 int sockfd, ret, flags;
271 struct sockaddr_un servaddr;
272 const char* servsock_filename = ODS_SE_SOCKFILE;
277 sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
279 fprintf(stderr,
"Unable to connect to engine. "
280 "socket() failed: %s\n", strerror(errno));
285 bzero(&servaddr,
sizeof(servaddr));
286 servaddr.sun_family = AF_UNIX;
287 strncpy(servaddr.sun_path, servsock_filename,
288 sizeof(servaddr.sun_path) - 1);
291 ret = connect(sockfd, (
const struct sockaddr*) &servaddr,
295 return system(ODS_SE_ENGINE);
298 if (cmd &&
ods_strcmp(cmd,
"running\n") == 0) {
299 fprintf(stderr,
"Engine not running.\n");
301 fprintf(stderr,
"Unable to connect to engine: "
302 "connect() failed: %s\n", strerror(errno));
310 flags = fcntl(sockfd, F_GETFL, 0);
312 ods_log_error(
"[%s] unable to start interface, fcntl(F_GETFL) "
313 "failed: %s", cli_str, strerror(errno));
318 if (fcntl(sockfd, F_SETFL, flags) < 0) {
319 ods_log_error(
"[%s] unable to start interface, fcntl(F_SETFL) "
320 "failed: %s", cli_str, strerror(errno));
327 fprintf(stderr,
"cmd> ");
331 ret = interface_run(stdin, sockfd, cmd);
345 int options_size = 0;
346 const char* options[5];
351 fprintf(stderr,
"error, malloc failed for client\n");
356 fprintf(stderr,
"error, too many arguments (%d)\n", argc);
361 for (c = 0; c < argc; c++) {
362 options[c] = argv[c];
364 options_size += strlen(argv[c]) + 1;
368 cmd = (
char*)
allocator_alloc(clialloc, (options_size+2)*
sizeof(char));
370 fprintf(stderr,
"memory allocation failed\n");
373 (void)strncpy(cmd,
"", 1);
374 for (c = 1; c < argc; c++) {
375 (void)strncat(cmd, options[c], strlen(options[c]));
376 (void)strncat(cmd,
" ", 1);
378 cmd[options_size-1] =
'\n';
385 }
else if (cmd &&
ods_strcmp(cmd,
"--help\n") == 0) {
389 ret = interface_start(cmd);
void * allocator_alloc(allocator_type *allocator, size_t size)
void ods_log_error(const char *format,...)
int ods_strcmp(const char *s1, const char *s2)
void ods_str_trim(char *str)
allocator_type * allocator_create(void *(*allocator)(size_t size), void(*deallocator)(void *))
ssize_t ods_writen(int fd, const void *vptr, size_t n)
int main(int argc, char *argv[])
void allocator_cleanup(allocator_type *allocator)
void allocator_deallocate(allocator_type *allocator, void *data)
void ods_log_init(const char *filename, int use_syslog, int verbosity)
void ods_log_warning(const char *format,...)