implementing messaging.

ToDo: remove pprint.
mscp should use mpr_* functions, and main.c should use
just fprintf(stdout, "\r\033[K" fmt, ...) for printing progress bar.
This commit is contained in:
Ryo Nakamura
2023-03-03 22:14:54 +09:00
parent 1b9ae51974
commit 1e57e8fb2f
5 changed files with 105 additions and 34 deletions

View File

@@ -184,6 +184,7 @@ int main(int argc, char **argv)
memset(&s, 0, sizeof(s)); memset(&s, 0, sizeof(s));
memset(&o, 0, sizeof(o)); memset(&o, 0, sizeof(o));
o.severity = MSCP_SEVERITY_WARN;
while ((ch = getopt(argc, argv, "n:m:s:S:a:b:vqDrl:p:i:c:M:C:HdNh")) != -1) { while ((ch = getopt(argc, argv, "n:m:s:S:a:b:vqDrl:p:i:c:M:C:HdNh")) != -1) {
switch (ch) { switch (ch) {
@@ -211,10 +212,10 @@ int main(int argc, char **argv)
o.buf_sz = atoi(optarg); o.buf_sz = atoi(optarg);
break; break;
case 'v': case 'v':
o.verbose_level++; o.severity++;
break; break;
case 'q': case 'q':
o.verbose_level = -1; o.severity = MSCP_SEVERITY_NONE;
break; break;
case 'D': case 'D':
o.dryrun = true; o.dryrun = true;

View File

@@ -2,9 +2,12 @@
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <pthread.h>
#include <message.h> #include <message.h>
/* mscp error message buffer */
#define MSCP_ERRMSG_SIZE (PATH_MAX * 2) #define MSCP_ERRMSG_SIZE (PATH_MAX * 2)
static char errmsg[MSCP_ERRMSG_SIZE]; static char errmsg[MSCP_ERRMSG_SIZE];
@@ -23,3 +26,33 @@ const char *mscp_get_error()
{ {
return errmsg; return errmsg;
} }
/* message print functions */
static int mprint_serverity = MSCP_SEVERITY_WARN;
static pthread_mutex_t mprint_lock = PTHREAD_MUTEX_INITIALIZER;
void mprint_set_severity(int serverity)
{
if (serverity < 0)
mprint_serverity = -1; /* no print */
mprint_serverity = serverity;
}
void mprint(int fd, int serverity, const char *fmt, ...)
{
va_list va;
int ret;
if (fd < 0)
return;
if (serverity <= mprint_serverity) {
pthread_mutex_lock(&mprint_lock);
va_start(va, fmt);
vdprintf(fd, fmt, va);
va_end(va);
pthread_mutex_unlock(&mprint_lock);
}
}

View File

@@ -3,27 +3,26 @@
#include <libgen.h> #include <libgen.h>
enum { #include <mscp.h>
MSCP_SEVERITY_ERR = 0,
MSCP_SEVERITY_WARN,
MSCP_SEVERITY_NOTICE,
MSCP_SEVERITY_INFO,
MSCP_SEVERITY_DEBUG,
};
/* message print. printed messages are passed to application via msg_fd */ /* message print. printed messages are passed to application via msg_fd */
//void mprint_set_severity(int severity); void mprint_set_severity(int severity);
//void mprint(int severity, const char *fmt, ...); void mprint(int fd, int severity, const char *fmt, ...);
#define mpr_err(fmt, ...) mprint(MSCP_SEVERITY_ERR, fmt, ##__VA_ARGS__) #define mpr_err(m, fmt, ...) \
#define mpr_warn(fmt, ...) mprint(MSCP_SEVERITY_WARN, fmt, ##__VA_ARGS__) mprint(m->msg_fd, MSCP_SEVERITY_ERR, fmt, ##__VA_ARGS__)
#define mpr_notice(fmt, ...) mprint(MSCP_SEVERITY_NOTICE, fmt, ##__VA_ARGS__) #define mpr_warn(m, fmt, ...) \
#define mpr_info(fmt, ...) mprint(MSCP_SEVERITY_INFO, fmt, ##__VA_ARGS__) mprint(m->msg_fd, MSCP_SEVERITY_WARN, fmt, ##__VA_ARGS__)
#define mpr_debug(fmt, ...) mprint(MSCP_SEVERITY_DEBUG, fmt, ##__VA_ARGS__) #define mpr_notice(m, fmt, ...) \
mprint(m->msg_fd, MSCP_SEVERITY_NOTICE, fmt, ##__VA_ARGS__)
#define mpr_info(m, fmt, ...) \
mprint(m->msg_fd, MSCP_SEVERITY_INFO, fmt, ##__VA_ARGS__)
#define mpr_debug(m, fmt, ...) \
mprint(m->msg_fd, MSCP_SEVERITY_DEBUG, fmt, ##__VA_ARGS__)
/* error message buffer */ /* error message buffer */
#define mscp_set_error(fmt, ...) \ #define mscp_set_error(fmt, ...) \
_mscp_set_error("%s:%d:%s: " fmt, \ _mscp_set_error("%s:%d:%s: " fmt, \
basename(__FILE__), __LINE__, __func__, ##__VA_ARGS__) basename(__FILE__), __LINE__, __func__, ##__VA_ARGS__)

View File

@@ -19,6 +19,8 @@ struct mscp {
struct mscp_opts *opts; struct mscp_opts *opts;
struct mscp_ssh_opts *ssh_opts; struct mscp_ssh_opts *ssh_opts;
int msg_fd; /* writer fd for message pipe */
int *cores; /* usable cpu cores by COREMASK */ int *cores; /* usable cpu cores by COREMASK */
int nr_cores; /* length of array of cores */ int nr_cores; /* length of array of cores */
@@ -197,6 +199,9 @@ struct mscp *mscp_init(const char *remote_host,
return NULL; return NULL;
} }
m->msg_fd = o->msg_fd;
mprint_set_severity(o->severity);
if (validate_and_set_defaut_params(o) < 0) if (validate_and_set_defaut_params(o) < 0)
goto free_out; goto free_out;
@@ -214,17 +219,15 @@ struct mscp *mscp_init(const char *remote_host,
if (strlen(o->coremask) > 0) { if (strlen(o->coremask) > 0) {
if (expand_coremask(o->coremask, &m->cores, &m->nr_cores) < 0) if (expand_coremask(o->coremask, &m->cores, &m->nr_cores) < 0)
goto free_out; goto free_out;
pprint(1, "usable cpu cores:"); mpr_notice(m, "usable cpu cores:");
for (n = 0; n < m->nr_cores; n++) for (n = 0; n < m->nr_cores; n++)
pprint(2, " %d", m->cores[n]); mpr_notice(m, "%d", m->cores[n]);
pprint(1, "\n"); mpr_notice(m, "\n");
} }
m->opts = o; m->opts = o;
m->ssh_opts = s; m->ssh_opts = s;
pprint_set_level(o->verbose_level);
return m; return m;
free_out: free_out:
@@ -232,6 +235,16 @@ free_out:
return NULL; return NULL;
} }
void mscp_set_msg_fd(struct mscp *m, int fd)
{
m->msg_fd = fd;
}
int mscp_get_msg_fd(struct mscp *m)
{
return m->msg_fd;
}
int mscp_connect(struct mscp *m) int mscp_connect(struct mscp *m)
{ {
m->first = ssh_init_sftp_session(m->remote, m->ssh_opts); m->first = ssh_init_sftp_session(m->remote, m->ssh_opts);
@@ -367,8 +380,8 @@ int mscp_start(struct mscp *m)
int n, ret; int n, ret;
if ((n = list_count(&m->chunk_list)) < m->opts->nr_threads) { if ((n = list_count(&m->chunk_list)) < m->opts->nr_threads) {
pprint1("we have only %d chunk(s). " mpr_notice(m, "we have only %d chunk(s). "
"set number of connections to %d\n", n, n); "set number of connections to %d\n", n, n);
m->opts->nr_threads = n; m->opts->nr_threads = n;
} }
@@ -388,7 +401,8 @@ int mscp_start(struct mscp *m)
m->first = NULL; m->first = NULL;
} }
else { else {
pprint2("connecting to %s for a copy thread...\n", m->remote); mpr_notice(m, "connecting to %s for a copy thread...\n",
m->remote);
t->sftp = ssh_init_sftp_session(m->remote, m->ssh_opts); t->sftp = ssh_init_sftp_session(m->remote, m->ssh_opts);
if (!t->sftp) if (!t->sftp)
return -1; return -1;

View File

@@ -20,10 +20,12 @@ struct mscp_opts {
size_t buf_sz; size_t buf_sz;
char coremask[MSCP_MAX_COREMASK_STR]; char coremask[MSCP_MAX_COREMASK_STR];
int verbose_level; /* messaging */
bool quiet; int severity; /* messaging severity. set MSCP_SERVERITY_* */
bool dryrun; int msg_fd; /* fd to output message. default STDOUT,
* and -1 disables output */
bool dryrun;
}; };
#define MSCP_SSH_MAX_LOGIN_NAME 64 #define MSCP_SSH_MAX_LOGIN_NAME 64
@@ -63,12 +65,6 @@ struct mscp;
struct mscp *mscp_init(const char *remote_host, struct mscp *mscp_init(const char *remote_host,
struct mscp_opts *o, struct mscp_ssh_opts *s); struct mscp_opts *o, struct mscp_ssh_opts *s);
/* return a fd for read message from mscp */
int mscp_msg_fd(struct mscp *m);
/* get message for the most recent error (not thread safe) */
const char *mscp_get_error();
/* establish the first SFTP session. mscp_prepare() and mscp_start() /* establish the first SFTP session. mscp_prepare() and mscp_start()
* requires mscp_connect() beforehand */ * requires mscp_connect() beforehand */
int mscp_connect(struct mscp *m); int mscp_connect(struct mscp *m);
@@ -99,4 +95,32 @@ void mscp_cleanup(struct mscp *m);
/* free mscp instance */ /* free mscp instance */
void mscp_free(struct mscp *m); void mscp_free(struct mscp *m);
/* messaging with mscp */
/* severity filter for messages. specifiy it with mscp_opts->serverity.
*/
enum {
MSCP_SEVERITY_NONE = -1,
MSCP_SEVERITY_ERR = 0,
MSCP_SEVERITY_WARN = 1,
MSCP_SEVERITY_NOTICE = 2,
MSCP_SEVERITY_INFO = 3,
MSCP_SEVERITY_DEBUG = 4,
};
/* set fd to which mscp writes messages. default is STDOUT.
* supposed fd is pipe write fd.
*/
void mscp_set_msg_fd(struct mscp *m, int fd);
/* retrieve the fd for read message from mscp */
int mscp_get_msg_fd(struct mscp *m);
/* get message for the most recent error (not thread safe) */
const char *mscp_get_error();
#endif /* _MSCP_H_ */ #endif /* _MSCP_H_ */