#include <libgen.h>
#include <sys/stat.h>
#include <stddef.h>
+#include <syslog.h>
+#include <time.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include "util/argconfig.h"
#include "common.h"
+#include "util/log.h"
#ifdef HAVE_SYSTEMD
#include <systemd/sd-id128.h>
int hdr_digest;
int data_digest;
bool persistent;
- bool quiet;
bool matching_only;
char *output_format;
} cfg = {
n = scandir(SYS_NVME, &devices, scan_ctrls_filter, alphasort);
if (n < 0) {
- fprintf(stderr, "no NVMe controller(s) detected.\n");
+ msg(LOG_ERR, "no NVMe controller(s) detected.\n");
return NULL;
}
if (ctrl_matches_connectargs(devices[i]->d_name, args)) {
devname = strdup(devices[i]->d_name);
if (devname == NULL)
- fprintf(stderr, "no memory for ctrl name %s\n",
+ msg(LOG_ERR, "no memory for ctrl name %s\n",
devices[i]->d_name);
goto cleanup_devices;
}
fd = open(PATH_NVME_FABRICS, O_RDWR);
if (fd < 0) {
- fprintf(stderr, "Failed to open %s: %s\n",
+ msg(LOG_ERR, "Failed to open %s: %s\n",
PATH_NVME_FABRICS, strerror(errno));
ret = -errno;
goto out;
ret = write(fd, argstr, len);
if (ret != len) {
- if (errno != EALREADY || !cfg.quiet)
- fprintf(stderr, "Failed to write to %s: %s\n",
+ if (errno != EALREADY)
+ msg(LOG_NOTICE, "Failed to write to %s: %s\n",
PATH_NVME_FABRICS, strerror(errno));
ret = -errno;
goto out_close;
len = read(fd, buf, BUF_SIZE);
if (len < 0) {
- fprintf(stderr, "Failed to read from %s: %s\n",
+ msg(LOG_ERR, "Failed to read from %s: %s\n",
PATH_NVME_FABRICS, strerror(errno));
ret = -errno;
goto out_close;
}
out_fail:
- fprintf(stderr, "Failed to parse ctrl info for \"%s\"\n", argstr);
+ msg(LOG_ERR, "Failed to parse ctrl info for \"%s\"\n", argstr);
ret = -EINVAL;
out_close:
close(fd);
fd = open(sysfs_path, O_WRONLY);
if (fd < 0) {
ret = -errno;
- fprintf(stderr, "Failed to open %s: %s\n", sysfs_path,
+ msg(LOG_ERR, "Failed to open %s: %s\n", sysfs_path,
strerror(errno));
goto out;
}
fd = open(dev_path, O_RDWR);
if (fd < 0) {
error = -errno;
- fprintf(stderr, "Failed to open %s: %s\n",
+ msg(LOG_ERR, "Failed to open %s: %s\n",
dev_path, strerror(errno));
goto out;
}
fd = open(cfg.raw, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
if (fd < 0) {
- fprintf(stderr, "failed to open %s: %s\n",
+ msg(LOG_ERR, "failed to open %s: %s\n",
cfg.raw, strerror(errno));
return;
}
numrec * sizeof(struct nvmf_disc_rsp_page_entry);
ret = write(fd, log, len);
if (ret < 0)
- fprintf(stderr, "failed to write to %s: %s\n",
+ msg(LOG_ERR, "failed to write to %s: %s\n",
cfg.raw, strerror(errno));
else
printf("Discovery log is saved to %s\n", cfg.raw);
int len;
if (!cfg.transport) {
- fprintf(stderr, "need a transport (-t) argument\n");
+ msg(LOG_ERR, "need a transport (-t) argument\n");
return -EINVAL;
}
if (strncmp(cfg.transport, "loop", 4)) {
if (!cfg.traddr) {
- fprintf(stderr, "need a address (-a) argument\n");
+ msg(LOG_ERR, "need a address (-a) argument\n");
return -EINVAL;
}
}
ret = getaddrinfo(cfg->traddr, NULL, &hints, &host_info);
if (ret) {
- fprintf(stderr, "failed to resolve host %s info\n", cfg->traddr);
+ msg(LOG_ERR, "failed to resolve host %s info\n", cfg->traddr);
return ret;
}
addrstr, NVMF_TRADDR_SIZE);
break;
default:
- fprintf(stderr, "unrecognized address family (%d) %s\n",
+ msg(LOG_ERR, "unrecognized address family (%d) %s\n",
host_info->ai_family, cfg->traddr);
ret = -EINVAL;
goto free_addrinfo;
}
if (!p) {
- fprintf(stderr, "failed to get traddr for %s\n", cfg->traddr);
+ msg(LOG_ERR, "failed to get traddr for %s\n", cfg->traddr);
ret = -errno;
goto free_addrinfo;
}
case NVME_NQN_NVME:
break;
default:
- fprintf(stderr, "skipping unsupported subtype %d\n",
+ msg(LOG_ERR, "skipping unsupported subtype %d\n",
e->subtype);
return -EINVAL;
}
transport = trtype_str(e->trtype);
if (!strcmp(transport, "unrecognized")) {
- fprintf(stderr, "skipping unsupported transport %d\n",
+ msg(LOG_ERR, "skipping unsupported transport %d\n",
e->trtype);
return -EINVAL;
}
p += len;
break;
default:
- fprintf(stderr, "skipping unsupported adrfam\n");
+ msg(LOG_ERR, "skipping unsupported adrfam\n");
return -EINVAL;
}
break;
p += len;
break;
default:
- fprintf(stderr, "skipping unsupported adrfam\n");
+ msg(LOG_ERR, "skipping unsupported adrfam\n");
return -EINVAL;
}
break;
if (instance == -EALREADY) {
const char *traddr = log->entries[i].traddr;
- if (!cfg.quiet)
- fprintf(stderr,
- "traddr=%.*s is already connected\n",
+ msg(LOG_NOTICE, "traddr=%.*s is already connected\n",
space_strip_len(NVMF_TRADDR_SIZE,
traddr),
traddr);
ret = nvmf_get_log_page_discovery(dev_name, &log, &numrec, &status);
free(dev_name);
if (cfg.persistent)
- printf("Persistent device: nvme%d\n", instance);
+ msg(LOG_NOTICE, "Persistent device: nvme%d\n", instance);
if (!cfg.device && !cfg.persistent) {
err = remove_ctrl(instance);
if (err)
print_discovery_log(log, numrec);
break;
case DISC_GET_NUMRECS:
- fprintf(stderr,
+ msg(LOG_ERR,
"Get number of discovery log entries failed.\n");
ret = status;
break;
case DISC_GET_LOG:
- fprintf(stderr, "Get discovery log entries failed.\n");
+ msg(LOG_ERR, "Get discovery log entries failed.\n");
ret = status;
break;
case DISC_NO_LOG:
ret = -EAGAIN;
break;
case DISC_NOT_EQUAL:
- fprintf(stderr,
+ msg(LOG_ERR,
"Numrec values of last two get discovery log page not equal\n");
ret = -EBADSLT;
break;
default:
- fprintf(stderr, "Get discovery log page failed: %d\n", ret);
+ msg(LOG_ERR, "Get discovery log page failed: %d\n", ret);
break;
}
f = fopen(PATH_NVMF_DISC, "r");
if (f == NULL) {
- fprintf(stderr, "No discover params given and no %s\n",
+ msg(LOG_ERR, "No discover params given and no %s\n",
PATH_NVMF_DISC);
return -EINVAL;
}
args = strdup(line);
if (!args) {
- fprintf(stderr, "failed to strdup args\n");
+ msg(LOG_ERR, "failed to strdup args\n");
ret = -ENOMEM;
goto out;
}
argv = calloc(MAX_DISC_ARGS, BUF_SIZE);
if (!argv) {
- perror("failed to allocate argv vector\n");
+ msg(LOG_ERR, "failed to allocate argv vector: %m\n");
free(args);
ret = -ENOMEM;
goto out;
char argstr[BUF_SIZE];
int ret;
enum nvme_print_flags flags;
+ bool quiet = false;
OPT_ARGS(opts) = {
OPT_LIST("transport", 't', &cfg.transport, "transport type"),
OPT_INT("nr-poll-queues", 'P', &cfg.nr_poll_queues, "number of poll queues to use (default 0)"),
OPT_INT("queue-size", 'Q', &cfg.queue_size, "number of io queue elements to use (default 128)"),
OPT_FLAG("persistent", 'p', &cfg.persistent, "persistent discovery connection"),
- OPT_FLAG("quiet", 'S', &cfg.quiet, "suppress already connected errors"),
+ OPT_FLAG("quiet", 'S', &quiet, "suppress already connected errors"),
OPT_FLAG("matching", 'm', &cfg.matching_only, "connect only records matching the traddr"),
OPT_FMT("output-format", 'o', &cfg.output_format, output_format),
OPT_END()
}
}
+ if (quiet)
+ log_level = LOG_WARNING;
+
+ if (cfg.device && !strcmp(cfg.device, "none"))
+ cfg.device = NULL;
+
cfg.nqn = NVME_DISC_SUBSYS_NAME;
if (!cfg.transport && !cfg.traddr) {
goto out;
if (!cfg.nqn) {
- fprintf(stderr, "need a -n argument\n");
+ msg(LOG_ERR, "need a -n argument\n");
ret = -EINVAL;
goto out;
}
fd = open(sysfs_nqn_path, O_RDONLY);
if (fd < 0) {
- fprintf(stderr, "Failed to open %s: %s\n",
+ msg(LOG_ERR, "Failed to open %s: %s\n",
sysfs_nqn_path, strerror(errno));
goto free;
}
goto out;
if (!cfg.nqn && !cfg.device) {
- fprintf(stderr, "need a -n or -d argument\n");
+ msg(LOG_ERR, "need a -n or -d argument\n");
ret = -EINVAL;
goto out;
}
if (cfg.nqn) {
ret = disconnect_by_nqn(cfg.nqn);
if (ret < 0)
- fprintf(stderr, "Failed to disconnect by NQN: %s\n",
+ msg(LOG_ERR, "Failed to disconnect by NQN: %s\n",
cfg.nqn);
else {
printf("NQN:%s disconnected %d controller(s)\n", cfg.nqn, ret);
if (cfg.device) {
ret = disconnect_by_device(cfg.device);
if (ret)
- fprintf(stderr,
+ msg(LOG_ERR,
"Failed to disconnect by device name: %s\n",
cfg.device);
}
err = scan_subsystems(&t, NULL, 0, 0, NULL);
if (err) {
- fprintf(stderr, "Failed to scan namespaces\n");
+ msg(LOG_ERR, "Failed to scan namespaces\n");
goto out;
}