summaryrefslogtreecommitdiff
path: root/serialclient.c
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2015-07-26 17:13:42 (GMT)
committerChristian Pointner <equinox@spreadspace.org>2015-07-26 17:13:42 (GMT)
commit1324242685b63a511be3b3625f78e1ebf2dafc76 (patch)
treeb83d4947415757fba945b7a91a25230c9d044144 /serialclient.c
parentc6bbdfbdde366bfbb37858e7dc9e0fc351595023 (diff)
moved sources to src/
Diffstat (limited to 'serialclient.c')
-rw-r--r--serialclient.c285
1 files changed, 0 insertions, 285 deletions
diff --git a/serialclient.c b/serialclient.c
deleted file mode 100644
index 18d62db..0000000
--- a/serialclient.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * rhctl
- *
- * Copyright (C) 2009-2014 Christian Pointner <equinox@helsinki.at>
- *
- * This file is part of rhctl.
- *
- * rhctl is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * any later version.
- *
- * rhctl is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with rhctl. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "datatypes.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "log.h"
-#include "sig_handler.h"
-#include "options.h"
-
-#include "daemon.h"
-#include "utils.h"
-
-int process_cmd(const char* cmd, int fd, cmd_t **cmd_q, client_t* client_lst, options_t* opt)
-{
- return 0;
-}
-
-int process_data(int src_fd, int dest_fd)
-{
- char* buffer[100];
- int ret = read(src_fd, buffer, 100);
- if(!ret)
- return 2;
- if(ret == -1 && errno == EAGAIN)
- return 0;
- if(ret < 0)
- return ret;
-
- log_printf(DEBUG, "read %d bytes from fd (%d)", ret, src_fd);
-
- int len = ret;
- int offset = 0;
- for(;;) {
- ret = write(dest_fd, &buffer[offset], len - offset);
- if(ret < 0) {
- if(errno != EINTR)
- return ret;
-
- ret = 0;
- }
-
- offset += ret;
- if(offset >= len)
- break;
- }
- log_printf(DEBUG, "wrote %d bytes to fd (%d)", offset, dest_fd);
- return 0;
-}
-
-int main_loop(int serial_fd, int cmd_fd, options_t* opt)
-{
- log_printf(NOTICE, "entering main loop");
-
- fd_set readfds, tmpfds;
- FD_ZERO(&readfds);
- FD_SET(serial_fd, &readfds);
- FD_SET(cmd_fd, &readfds);
- int max_fd = serial_fd > cmd_fd ? serial_fd : cmd_fd;
-
- int sig_fd = signal_init();
- if(sig_fd < 0)
- return -1;
- FD_SET(sig_fd, &readfds);
- max_fd = (max_fd < sig_fd) ? sig_fd : max_fd;
-
- int return_value = 0;
- if(opt->type_) {
- char* tmp;
- int len = asprintf(&tmp, "type %s\n", opt->type_);
- if(len < 0) {
- log_printf(ERROR, "memory error at init");
- return_value = -2;
- }
- else {
- return_value = send_string(cmd_fd, tmp);
- free(tmp);
- if(return_value <= 0) {
- log_printf(ERROR, "error setting client type");
- return_value = -1;
- }
- else {
- log_printf(NOTICE, "connecting as type '%s'", opt->type_);
- return_value = 0;
- }
- }
- }
-
- while(!return_value) {
- memcpy(&tmpfds, &readfds, sizeof(tmpfds));
-
- int ret = select(max_fd+1, &tmpfds, NULL, NULL, NULL);
- if(ret == -1 && errno != EINTR) {
- log_printf(ERROR, "select returned with error: %s", strerror(errno));
- return_value = -1;
- break;
- }
- if(ret == -1 || !ret)
- continue;
-
- if(FD_ISSET(sig_fd, &tmpfds))
- if(signal_handle())
- return_value = 1;
-
- if(FD_ISSET(serial_fd, &tmpfds))
- return_value = process_data(serial_fd, cmd_fd);
-
- if(FD_ISSET(cmd_fd, &tmpfds)) {
- return_value = process_data(cmd_fd, serial_fd);
- if(return_value == 2) return_value = 3;
- }
- }
-
- signal_stop();
- return return_value;
-}
-
-int main(int argc, char* argv[])
-{
- log_init();
-
- options_t opt;
- int ret = options_parse(&opt, argc, argv);
- if(ret) {
- if(ret > 0) {
- fprintf(stderr, "syntax error near: %s\n\n", argv[ret]);
- }
- if(ret == -2) {
- fprintf(stderr, "memory error on options_parse, exiting\n");
- }
- if(ret == -5) {
- fprintf(stderr, "syntax error: invalid baudrate\n");
- }
-
- if(ret != -2)
- options_print_usage();
-
- options_clear(&opt);
- log_close();
- exit(ret);
- }
- string_list_element_t* tmp = opt.log_targets_.first_;
- if(!tmp) {
- log_add_target("syslog:3,serialclient,daemon");
- }
- else {
- while(tmp) {
- ret = log_add_target(tmp->string_);
- if(ret) {
- switch(ret) {
- case -2: fprintf(stderr, "memory error on log_add_target, exitting\n"); break;
- case -3: fprintf(stderr, "unknown log target: '%s', exitting\n", tmp->string_); break;
- case -4: fprintf(stderr, "this log target is only allowed once: '%s', exitting\n", tmp->string_); break;
- default: fprintf(stderr, "syntax error near: '%s', exitting\n", tmp->string_); break;
- }
-
- options_clear(&opt);
- log_close();
- exit(ret);
- }
- tmp = tmp->next_;
- }
- }
- log_printf(NOTICE, "just started...");
- if(options_parse_post(&opt)) {
- options_clear(&opt);
- log_close();
- exit(-1);
- }
-
- priv_info_t priv;
- if(opt.username_)
- if(priv_init(&priv, opt.username_, opt.groupname_)) {
- options_clear(&opt);
- log_close();
- exit(-1);
- }
-
- FILE* pid_file = NULL;
- if(opt.pid_file_) {
- pid_file = fopen(opt.pid_file_, "w");
- if(!pid_file) {
- log_printf(WARNING, "unable to open pid file: %s", strerror(errno));
- }
- }
-
- if(opt.chroot_dir_)
- if(do_chroot(opt.chroot_dir_)) {
- options_clear(&opt);
- log_close();
- exit(-1);
- }
- if(opt.username_)
- if(priv_drop(&priv)) {
- options_clear(&opt);
- log_close();
- exit(-1);
- }
-
- if(opt.daemonize_) {
- pid_t oldpid = getpid();
- daemonize();
- log_printf(INFO, "running in background now (old pid: %d)", oldpid);
- }
-
- if(pid_file) {
- pid_t pid = getpid();
- fprintf(pid_file, "%d", pid);
- fclose(pid_file);
- }
-
- int cmd_fd = 0;
- int serial_fd = 0;
- for(;;) {
- cmd_fd = connect_command_socket(opt.command_sock_);
- if(cmd_fd < 0)
- ret = 3;
- else {
- serial_fd = open(opt.serial_dev_, O_RDWR | O_NOCTTY);
- if(serial_fd < 0)
- ret = 2;
- else {
- ret = setup_tty(serial_fd, opt.baudrate_);
- if(ret)
- ret = 2;
- else
- ret = main_loop(serial_fd, cmd_fd, &opt);
- }
- }
-
- if(ret == 2 || ret == 3) {
- if(ret == 2)
- log_printf(ERROR, "%s error, trying to reopen in 5 seconds..", opt.serial_dev_);
- if(ret == 3)
- log_printf(ERROR, "socket error, trying to reconnect in 5 seconds..");
-
- if(cmd_fd > 0)
- close(cmd_fd);
- if(serial_fd > 0)
- close(serial_fd);
- sleep(5);
- }
- else
- break;
- }
-
- if(cmd_fd > 0)
- close(cmd_fd);
- if(serial_fd > 0)
- close(serial_fd);
-
- if(!ret)
- log_printf(NOTICE, "normal shutdown");
- else if(ret < 0)
- log_printf(NOTICE, "shutdown after error (code %d)", ret);
- else
- log_printf(NOTICE, "shutdown after signal");
-
- options_clear(&opt);
- log_close();
-
- return ret;
-}