mirror of
https://github.com/eclipse/tinydtls.git
synced 2025-10-14 03:10:09 +08:00
dtls-client.c: accept options after arguments.
Signed-off-by: Achim Kraus <achim.kraus@cloudcoap.net>
This commit is contained in:
@@ -359,7 +359,7 @@ usage( const char *program, const char *version) {
|
||||
program = ++p;
|
||||
|
||||
fprintf(stderr, "%s v%s -- DTLS client implementation\n"
|
||||
"(c) 2011-2014 Olaf Bergmann <bergmann@tzi.org>\n\n"
|
||||
"(c) 2011-2024 Olaf Bergmann <bergmann@tzi.org>\n\n"
|
||||
#ifdef DTLS_PSK
|
||||
"usage: %s [-c cipher suites] [-e] [-i file] [-k file] [-o file]\n"
|
||||
" %*s [-p port] [-r] [-v num] addr [port]\n",
|
||||
@@ -411,6 +411,7 @@ int
|
||||
main(int argc, char **argv) {
|
||||
fd_set rfds, wfds;
|
||||
struct timeval timeout;
|
||||
unsigned short dst_port = 0;
|
||||
unsigned short port = DEFAULT_PORT;
|
||||
char port_str[NI_MAXSERV] = "0";
|
||||
log_t log_level = DTLS_LOG_WARN;
|
||||
@@ -423,7 +424,7 @@ main(int argc, char **argv) {
|
||||
size_t len = 0;
|
||||
int buf_ready = 0;
|
||||
|
||||
|
||||
memset(&dst, 0, sizeof(session_t));
|
||||
dtls_init();
|
||||
snprintf(port_str, sizeof(port_str), "%d", port);
|
||||
|
||||
@@ -434,7 +435,8 @@ main(int argc, char **argv) {
|
||||
memcpy(psk_key, PSK_DEFAULT_KEY, psk_key_length);
|
||||
#endif /* DTLS_PSK */
|
||||
|
||||
while ((opt = getopt(argc, argv, "c:eo:p:rv:" PSK_OPTIONS)) != -1) {
|
||||
while (optind < argc) {
|
||||
opt = getopt(argc, argv, "c:eo:p:rv:z" PSK_OPTIONS);
|
||||
switch (opt) {
|
||||
#ifdef DTLS_PSK
|
||||
case 'i' :
|
||||
@@ -482,31 +484,48 @@ main(int argc, char **argv) {
|
||||
case 'v' :
|
||||
log_level = strtol(optarg, NULL, 10);
|
||||
break;
|
||||
case -1 :
|
||||
/* handle arguments */
|
||||
if (!dst.size) {
|
||||
/* first argument: destination address */
|
||||
/* resolve destination address of server where data should be sent */
|
||||
res = resolve_address(argv[optind++], &dst.addr.sa);
|
||||
if (res < 0) {
|
||||
dtls_emerg("failed to resolve address\n");
|
||||
exit(-1);
|
||||
}
|
||||
dst.size = res;
|
||||
} else if (!dst_port) {
|
||||
/* second argument: destination port (optional) */
|
||||
dst_port = atoi(argv[optind++]);
|
||||
} else {
|
||||
dtls_warn("too many arguments!\n");
|
||||
usage(argv[0], dtls_package_version());
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
usage(argv[0], dtls_package_version());
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
dtls_set_log_level(log_level);
|
||||
|
||||
if (argc <= optind) {
|
||||
if (!dst.size) {
|
||||
dtls_warn("missing destination address!\n");
|
||||
usage(argv[0], dtls_package_version());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
memset(&dst, 0, sizeof(session_t));
|
||||
/* resolve destination address where server should be sent */
|
||||
res = resolve_address(argv[optind++], &dst.addr.sa);
|
||||
if (res < 0) {
|
||||
dtls_emerg("failed to resolve address\n");
|
||||
exit(-1);
|
||||
if (!dst_port) {
|
||||
/* destination port not provided, use default */
|
||||
dst_port = DEFAULT_PORT;
|
||||
}
|
||||
if (dst.addr.sa.sa_family == AF_INET6) {
|
||||
dst.addr.sin6.sin6_port = htons(dst_port);
|
||||
} else {
|
||||
dst.addr.sin.sin_port = htons(dst_port);
|
||||
}
|
||||
dst.size = res;
|
||||
|
||||
/* use port number from command line when specified or the listen
|
||||
port, otherwise */
|
||||
dst.addr.sin.sin_port = htons(atoi(optind < argc ? argv[optind++] : port_str));
|
||||
dtls_set_log_level(log_level);
|
||||
|
||||
/* init socket and set it to non-blocking */
|
||||
fd = socket(dst.addr.sa.sa_family, SOCK_DGRAM, 0);
|
||||
|
Reference in New Issue
Block a user