if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
return;
PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count);
- t->ret = client_parse_config(argc, argv, &st->pcd);
+ t->ret = client_open(argc, argv, &st->pcd);
} else {
char *argv[] = {"audiod", "stat", NULL};
int argc = 2;
- t->ret = client_parse_config(argc, argv, &st->pcd);
+ t->ret = client_open(argc, argv, &st->pcd);
}
- if (t->ret < 0)
- return;
- t->ret = client_open(st->pcd);
if (t->ret < 0)
return;
st->pcd->task.event_handler = client_task_event_handler;
s.default_timeout.tv_sec = 1;
s.default_timeout.tv_usec = 0;
- ret = client_parse_config(argc, argv, &pcd);
- if (ret < 0)
- goto out;
+ ret = client_open(argc, argv, &pcd);
+ if (ret < 0) /* can not use PARA_LOG here */
+ exit(EXIT_FAILURE);
pcd->task.event_handler = client_event_handler;
- ret = client_open(pcd);
- if (ret < 0)
- goto out;
ret = sched(&s);
- client_close(pcd);
-out:
if (ret < 0)
PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+ client_close(pcd);
return ret >= 0? EXIT_SUCCESS: EXIT_FAILURE;
}
/*
- * Copyright (C) 1997-2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2007 Andre Noll <maan@systemlinux.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
int *in_eof;
};
-int client_open(struct private_client_data *pcd);
void client_close(struct private_client_data *pcd);
-int client_parse_config(int argc, char *argv[],
- struct private_client_data **pcd_ptr);
+int client_open(int argc, char *argv[], struct private_client_data **pcd_ptr);
void client_pre_select(struct sched *s, struct task *t);
void client_post_select(struct sched *s, struct task *t);
/*
- * Copyright (C) 1997-2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2007 Andre Noll <maan@systemlinux.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
void client_close(struct private_client_data *pcd)
{
- if (pcd)
+ if (!pcd)
return;
if (pcd->fd >= 0) {
disable_crypt(pcd->fd);
free(pcd);
}
-int client_parse_config(int argc, char *argv[],
- struct private_client_data **pcd_ptr)
+static int client_connect(struct private_client_data *pcd)
+{
+ int ret;
+ struct hostent *he;
+ struct sockaddr_in their_addr;
+
+ pcd->fd = -1;
+ ret = get_host_info(pcd->conf.hostname_arg, &he);
+ if (ret < 0)
+ return ret;
+ /* get new socket */
+ ret = get_socket();
+ if (ret < 0)
+ return ret;
+ pcd->fd = ret;
+ /* init their_addr */
+ init_sockaddr(&their_addr, pcd->conf.server_port_arg, he);
+ ret = para_connect(pcd->fd, &their_addr);
+ if (ret < 0)
+ goto err_out;
+ pcd->status = CL_CONNECTED;
+ ret = mark_fd_nonblock(pcd->fd);
+ if (ret < 0)
+ goto err_out;
+ pcd->task.pre_select = client_pre_select;
+ pcd->task.post_select = client_post_select;
+ pcd->task.private_data = pcd;
+ sprintf(pcd->task.status, "client");
+ register_task(&pcd->task);
+ return 1;
+err_out:
+ close(pcd->fd);
+ pcd->fd = -1;
+ return ret;
+}
+
+int client_open(int argc, char *argv[], struct private_client_data **pcd_ptr)
{
char *home = para_homedir();
struct stat statbuf;
struct private_client_data *pcd =
para_calloc(sizeof(struct private_client_data));
+ *pcd_ptr = pcd;
pcd->fd = -1;
- client_cmdline_parser(argc, argv, &pcd->conf);
- ret = - E_CLIENT_SYNTAX;
+ ret = client_cmdline_parser(argc, argv, &pcd->conf);
+ ret = -E_CLIENT_SYNTAX;
if (!pcd->conf.inputs_num)
goto out;
pcd->user = pcd->conf.user_given?
client_cmdline_parser_configfile(pcd->config_file,
&pcd->conf, 0, 0, 0);
ret = 1;
- *pcd_ptr = pcd;
PARA_INFO_LOG("loglevel: %d\n", pcd->conf.loglevel_arg);
PARA_INFO_LOG("config_file: %s\n", pcd->config_file);
PARA_INFO_LOG("key_file: %s\n", pcd->key_file);
PARA_NOTICE_LOG("connecting %s:%d\n", pcd->conf.hostname_arg,
pcd->conf.server_port_arg);
+ ret = client_connect(pcd);
out:
free(home);
- if (ret < 0)
+ if (ret < 0) {
+ PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
client_close(pcd);
+ }
return ret;
}
}
}
-
-int client_open(struct private_client_data *pcd)
-{
- int ret;
- struct hostent *he;
- struct sockaddr_in their_addr;
-
- pcd->fd = -1;
- ret = get_host_info(pcd->conf.hostname_arg, &he);
- if (ret < 0)
- goto err_out;
- /* get new socket */
- ret = get_socket();
- if (ret < 0)
- goto err_out;
- pcd->fd = ret;
- /* init their_addr */
- init_sockaddr(&their_addr, pcd->conf.server_port_arg, he);
- ret = para_connect(pcd->fd, &their_addr);
- if (ret < 0)
- goto err_out;
- pcd->status = CL_CONNECTED;
- ret = mark_fd_nonblock(pcd->fd);
- if (ret < 0)
- goto err_out;
- pcd->task.pre_select = client_pre_select;
- pcd->task.post_select = client_post_select;
- pcd->task.private_data = pcd;
- sprintf(pcd->task.status, "client");
- register_task(&pcd->task);
- return 1;
-err_out:
- if (pcd->fd >= 0)
- close(pcd->fd);
- return ret;
-}