* [PATCH 00/10] pull: release v2.28 prep work
@ 2016-03-13 10:31 Sami Kerola
2016-03-13 10:31 ` [PATCH 01/10] logger: fix memory leak [ASAN and valgrind] Sami Kerola
` (10 more replies)
0 siblings, 11 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Hello,
Changes in this pull request are mostly resubmissions with fixes (bash
completion stuff). There are also some ASAN & valgrind fixes to correct
issues found running test-suite.
----------------------------------------------------------------
The following changes since commit 8c97556ecfc0af358d35dc7a842aaadde5eeafd3:
build-sys: release++ (v2.28-rc1) (2016-03-11 11:41:05 +0100)
are available in the git repository at:
git://github.com/kerolasa/lelux-utiliteetit.git v2.28-prep
for you to fetch changes up to 3f2c19ff39a616c192b3a0dfb8a985a0f156e588:
docs: update AUTHORS file (2016-03-13 10:23:00 +0000)
----------------------------------------------------------------
Sami Kerola (10):
logger: fix memory leak [ASAN and valgrind]
getopt: fix memory leaks and integer overflows [ASAN & valgrind]
lsipc, lslogins, rtcwake: replace asctime() with strftime()
isosize: stop unmeaningful printing errno message
setsid: fix argument count bug
bash-completion: fsck.cramfs, isosize: find files an argument
bash-completion: ipcmk: add missing completion file
bash-completion: lslogins: add missing completion file
bash-completion: lsns: add missing completion file
docs: update AUTHORS file
AUTHORS | 2 +-
bash-completion/Makemodule.am | 9 +++++
bash-completion/fsck.cramfs | 11 +++++--
bash-completion/ipcmk | 27 +++++++++++++++
bash-completion/isosize | 11 +++++--
bash-completion/lslogins | 76 +++++++++++++++++++++++++++++++++++++++++++
bash-completion/lsns | 56 +++++++++++++++++++++++++++++++
disk-utils/isosize.c | 2 +-
include/timeutils.h | 3 ++
login-utils/lslogins.c | 5 ++-
misc-utils/getopt.c | 36 +++++++++++++++-----
misc-utils/logger.c | 4 ++-
sys-utils/lsipc.c | 6 ++--
sys-utils/rtcwake.c | 15 +++++----
sys-utils/setsid.c | 2 +-
15 files changed, 236 insertions(+), 29 deletions(-)
create mode 100644 bash-completion/ipcmk
create mode 100755 bash-completion/lslogins
create mode 100644 bash-completion/lsns
--
2.7.2
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 01/10] logger: fix memory leak [ASAN and valgrind]
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind] Sami Kerola
` (9 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
misc-utils/logger.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index 7b88b17..1ef12cd 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -341,8 +341,10 @@ static int journald_entry(struct logger_ctl *ctl, FILE *fp)
for (lines = 0; /* nothing */ ; lines++) {
buf = NULL;
sz = getline(&buf, &dummy, fp);
- if (sz == -1)
+ if (sz == -1) {
+ free(buf);
break;
+ }
if (0 < sz && buf[sz - 1] == '\n') {
sz--;
buf[sz] = '\0';
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind]
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
2016-03-13 10:31 ` [PATCH 01/10] logger: fix memory leak [ASAN and valgrind] Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 12:11 ` Yuriy M. Kaminskiy
2016-03-13 10:31 ` [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime() Sami Kerola
` (8 subsequent siblings)
10 siblings, 1 reply; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
The getopt(1) is short living command, and one could argue ensuring all
allocations are freed at end of execution is waste of time. There is a
point in that, but making test-suite runs to be less noisy with ASAN is also
nice as it encourages reading the errors when/if they happen.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
misc-utils/getopt.c | 36 ++++++++++++++++++++++++++++--------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/misc-utils/getopt.c b/misc-utils/getopt.c
index c4144f6..be2ed38 100644
--- a/misc-utils/getopt.c
+++ b/misc-utils/getopt.c
@@ -79,13 +79,23 @@
/* The shells recognized. */
typedef enum { BASH, TCSH } shell_t;
+/* This is a copy of getopt_long(3) structure, in which *name does not have
+ * const, so that is can be free'd at end of execution. */
+struct getoption {
+ char *name;
+ int has_arg;
+ int *flag;
+ int val;
+};
+
struct getopt_control {
shell_t shell; /* the shell we generate output for */
char *optstr; /* getopt(3) optstring */
- struct option *long_options; /* long options */
+ struct getoption *long_options; /* long options */
int long_options_length; /* length of options array */
int long_options_nr; /* number of used elements in array */
unsigned int
+ free_name:1, /* free up argv[0] after printout */
compatible:1, /* compatibility mode for 'difficult' programs */
quiet_errors:1, /* print errors */
quiet_output:1, /* print output */
@@ -181,7 +191,7 @@ static void print_normalized(const struct getopt_control *ctl, const char *arg)
* optstr must contain the short options, and longopts the long options.
* Other settings are found in global variables.
*/
-static int generate_output(const struct getopt_control *ctl, char *argv[], int argc)
+static int generate_output(struct getopt_control *ctl, char *argv[], int argc)
{
int exit_code = EXIT_SUCCESS; /* Assume everything will be OK */
int opt;
@@ -195,8 +205,10 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
optind = 0;
while ((opt =
- (getopt_long_fp(argc, argv, ctl->optstr, ctl->long_options, &longindex)))
- != EOF)
+ (getopt_long_fp
+ (argc, argv, ctl->optstr,
+ (const struct option *)ctl->long_options, &longindex)))
+ != EOF) {
if (opt == '?' || opt == ':')
exit_code = GETOPT_EXIT_CODE;
else if (!ctl->quiet_output) {
@@ -216,13 +228,19 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
print_normalized(ctl, optarg ? optarg : "");
}
}
-
+ }
if (!ctl->quiet_output) {
printf(" --");
while (optind < argc)
print_normalized(ctl, argv[optind++]);
printf("\n");
}
+ for (longindex = 0; longindex < ctl->long_options_nr; longindex++)
+ free(ctl->long_options[longindex].name);
+ free(ctl->long_options);
+ free(ctl->optstr);
+ if (ctl->free_name)
+ free(argv[0]);
return exit_code;
}
@@ -373,9 +391,6 @@ int main(int argc, char *argv[])
textdomain(PACKAGE);
atexit(close_stdout);
- add_longopt(&ctl, NULL, 0); /* init */
- getopt_long_fp = getopt_long;
-
if (getenv("GETOPT_COMPATIBLE"))
ctl.compatible = 1;
@@ -391,6 +406,9 @@ int main(int argc, char *argv[])
parse_error(_("missing optstring argument"));
}
+ add_longopt(&ctl, NULL, 0); /* init */
+ getopt_long_fp = getopt_long;
+
if (argv[1][0] != '-' || ctl.compatible) {
ctl.quote = 0;
ctl.optstr = xmalloc(strlen(argv[1]) + 1);
@@ -417,6 +435,7 @@ int main(int argc, char *argv[])
case 'n':
free(name);
name = xstrdup(optarg);
+ ctl.free_name = 1;
break;
case 'q':
ctl.quiet_errors = 1;
@@ -428,6 +447,7 @@ int main(int argc, char *argv[])
ctl.shell = shell_type(optarg);
break;
case 'T':
+ free(ctl.long_options);
return TEST_EXIT_CODE;
case 'u':
ctl.quote = 0;
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime()
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
2016-03-13 10:31 ` [PATCH 01/10] logger: fix memory leak [ASAN and valgrind] Sami Kerola
2016-03-13 10:31 ` [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind] Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 11:28 ` Ruediger Meier
2016-03-13 13:20 ` Yuriy M. Kaminskiy
2016-03-13 10:31 ` [PATCH 04/10] isosize: stop unmeaningful printing errno message Sami Kerola
` (7 subsequent siblings)
10 siblings, 2 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
POSIX.1-2008 marks asctime() and asctime_r() as obsolete, recommending the
use of strftime(3) instead.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
include/timeutils.h | 3 +++
login-utils/lslogins.c | 5 ++---
sys-utils/lsipc.c | 6 ++----
sys-utils/rtcwake.c | 15 +++++++++------
4 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/include/timeutils.h b/include/timeutils.h
index 8ed501b..427f833 100644
--- a/include/timeutils.h
+++ b/include/timeutils.h
@@ -51,6 +51,9 @@ typedef uint64_t nsec_t;
#define FORMAT_TIMESTAMP_RELATIVE_MAX 256
#define FORMAT_TIMESPAN_MAX 64
+/* Original asctime(3) format ends to '\n' that we do not do here. */
+#define STRFTIME_ASCTIME_FORMAT "%a %b %e %T %Y"
+
int parse_timestamp(const char *t, usec_t *usec);
#endif /* UTIL_LINUX_TIME_UTIL_H */
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
index 40a1343..554a1a3 100644
--- a/login-utils/lslogins.c
+++ b/login-utils/lslogins.c
@@ -56,6 +56,7 @@
#include "pathnames.h"
#include "logindefs.h"
#include "procutils.h"
+#include "timeutils.h"
/*
* column description
@@ -333,9 +334,7 @@ static char *make_time(int mode, time_t time)
switch(mode) {
case TIME_FULL:
- asctime_r(&tm, buf);
- if (*(s = buf + strlen(buf) - 1) == '\n')
- *s = '\0';
+ strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
break;
case TIME_SHORT:
if (date_is_today(time))
diff --git a/sys-utils/lsipc.c b/sys-utils/lsipc.c
index 938728a..19cf5a8 100644
--- a/sys-utils/lsipc.c
+++ b/sys-utils/lsipc.c
@@ -39,6 +39,7 @@
#include "xalloc.h"
#include "procutils.h"
#include "ipcutils.h"
+#include "timeutils.h"
/*
* time modes
@@ -445,7 +446,6 @@ static int date_is_thisyear(time_t t)
static char *make_time(int mode, time_t time)
{
- char *s;
struct tm tm;
char buf[64] = {0};
@@ -453,9 +453,7 @@ static char *make_time(int mode, time_t time)
switch(mode) {
case TIME_FULL:
- asctime_r(&tm, buf);
- if (*(s = buf + strlen(buf) - 1) == '\n')
- *s = '\0';
+ strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
break;
case TIME_SHORT:
if (date_is_today(time))
diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c
index 7c748dc..32df785 100644
--- a/sys-utils/rtcwake.c
+++ b/sys-utils/rtcwake.c
@@ -173,7 +173,7 @@ static int get_basetimes(struct rtcwake_control *ctl, int fd)
return -1;
}
/* Convert rtc_time to normal arithmetic-friendly form,
- * updating tm.tm_wday as used by asctime().
+ * updating tm.tm_wday as used by strftime().
*/
tm.tm_sec = rtc.tm_sec;
tm.tm_min = rtc.tm_min;
@@ -193,14 +193,17 @@ static int get_basetimes(struct rtcwake_control *ctl, int fd)
/* Unless the system uses UTC, either delta or tzone
* reflects a seconds offset from UTC. The value can
* help sort out problems like bugs in your C library. */
+ char buf[64] = { 0 };
+ struct tm sys_tm = { 0 };
+
printf("\tdelta = %ld\n", ctl->sys_time - ctl->rtc_time);
printf("\ttzone = %ld\n", timezone);
printf("\ttzname = %s\n", tzname[daylight]);
- gmtime_r(&ctl->rtc_time, &tm);
- printf("\tsystime = %ld, (UTC) %s",
- (long) ctl->sys_time, asctime(gmtime(&ctl->sys_time)));
- printf("\trtctime = %ld, (UTC) %s",
- (long) ctl->rtc_time, asctime(&tm));
+ gmtime_r(&ctl->sys_time, &sys_tm);
+ strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &sys_tm);
+ printf("\tsystime = %ld, (UTC) %s\n", (long) ctl->sys_time, buf);
+ strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
+ printf("\trtctime = %ld, (UTC) %s\n", (long) ctl->rtc_time, buf);
}
return 0;
}
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 04/10] isosize: stop unmeaningful printing errno message
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (2 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime() Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 05/10] setsid: fix argument count bug Sami Kerola
` (6 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Earlier printout had strange looking 'Success'.
$ isosize --sectors /dev/urandom
isosize: /dev/urandom: might not be an ISO filesystem
isosize: 733error: le=-1971599244 be=1633181607: Success
...
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
disk-utils/isosize.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/disk-utils/isosize.c b/disk-utils/isosize.c
index 43569ae..0f676ca 100644
--- a/disk-utils/isosize.c
+++ b/disk-utils/isosize.c
@@ -84,7 +84,7 @@ static int isonum_733(unsigned char *p, int xflag)
int be = isonum_732(p + 4);
if (xflag && le != be)
/* translation is useless */
- warn("733error: le=%d be=%d", le, be);
+ warnx("733error: le=%d be=%d", le, be);
return (le);
}
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 05/10] setsid: fix argument count bug
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (3 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 04/10] isosize: stop unmeaningful printing errno message Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 06/10] bash-completion: fsck.cramfs, isosize: find files an argument Sami Kerola
` (5 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
The below demonstrates what happen before this change.
$ setsid --wait
setsid: child 3252 did not exit normally: Success
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
sys-utils/setsid.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sys-utils/setsid.c b/sys-utils/setsid.c
index adc34ec..bb089df 100644
--- a/sys-utils/setsid.c
+++ b/sys-utils/setsid.c
@@ -83,7 +83,7 @@ int main(int argc, char **argv)
usage(stderr);
}
- if (argc < 2)
+ if (argc - optind < 1)
usage(stderr);
if (getpgrp() == getpid()) {
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 06/10] bash-completion: fsck.cramfs, isosize: find files an argument
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (4 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 05/10] setsid: fix argument count bug Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 07/10] bash-completion: ipcmk: add missing completion file Sami Kerola
` (4 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Earlier completion suggested only options for the command, this changes
options to be proposed when first character of an argument is dash.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
bash-completion/fsck.cramfs | 11 +++++++++--
bash-completion/isosize | 11 +++++++++--
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/bash-completion/fsck.cramfs b/bash-completion/fsck.cramfs
index acf6564..b3276b9 100644
--- a/bash-completion/fsck.cramfs
+++ b/bash-completion/fsck.cramfs
@@ -15,8 +15,15 @@ _fsck.cramfs_module()
return 0
;;
esac
- OPTS='--verbose --destination --help --version file'
- COMPREPLY=( $(compgen -W "${OPTS[*]}" -S ' ' -- $cur) )
+ case $cur in
+ -*)
+ COMPREPLY=( $(compgen -W "--verbose --blocksize --extract --help --version" -- $cur) )
+ return 0
+ ;;
+ esac
+ local IFS=$'\n'
+ compopt -o filenames
+ COMPREPLY=( $(compgen -f -- $cur) )
return 0
}
complete -F _fsck.cramfs_module fsck.cramfs
diff --git a/bash-completion/isosize b/bash-completion/isosize
index 13d4d29..fec2f8b 100644
--- a/bash-completion/isosize
+++ b/bash-completion/isosize
@@ -13,8 +13,15 @@ _isosize_module()
return 0
;;
esac
- OPTS='--divisor --sectors --help --version'
- COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
+ case $cur in
+ -*)
+ COMPREPLY=( $(compgen -W "--divisor --sectors --help --version" -- $cur) )
+ return 0
+ ;;
+ esac
+ local IFS=$'\n'
+ compopt -o filenames
+ COMPREPLY=( $(compgen -f -- $cur) )
return 0
}
complete -F _isosize_module isosize
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 07/10] bash-completion: ipcmk: add missing completion file
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (5 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 06/10] bash-completion: fsck.cramfs, isosize: find files an argument Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 08/10] bash-completion: lslogins: " Sami Kerola
` (3 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
bash-completion/Makemodule.am | 3 +++
bash-completion/ipcmk | 27 +++++++++++++++++++++++++++
2 files changed, 30 insertions(+)
create mode 100644 bash-completion/ipcmk
diff --git a/bash-completion/Makemodule.am b/bash-completion/Makemodule.am
index 5372ed0..e4196a3 100644
--- a/bash-completion/Makemodule.am
+++ b/bash-completion/Makemodule.am
@@ -30,6 +30,9 @@ endif
if BUILD_HEXDUMP
dist_bashcompletion_DATA += bash-completion/hexdump
endif
+if BUILD_IPCMK
+dist_bashcompletion_DATA += bash-completion/ipcmk
+endif
if BUILD_IPCRM
dist_bashcompletion_DATA += bash-completion/ipcrm
endif
diff --git a/bash-completion/ipcmk b/bash-completion/ipcmk
new file mode 100644
index 0000000..696266c
--- /dev/null
+++ b/bash-completion/ipcmk
@@ -0,0 +1,27 @@
+_ipcmk_module()
+{
+ local cur prev
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ case $prev in
+ '-M'|'--shmem')
+ COMPREPLY=( $(compgen -W "size" -- $cur) )
+ return 0
+ ;;
+ '-S'|'--semaphore')
+ COMPREPLY=( $(compgen -W "number" -- $cur) )
+ return 0
+ ;;
+ '-p'|'--mode')
+ COMPREPLY=( $(compgen -W "mode" -- $cur) )
+ return 0
+ ;;
+ '-h'|'--help'|'-V'|'--version')
+ return 0
+ ;;
+ esac
+ COMPREPLY=( $(compgen -W "--shmem --semaphore --queue --mode --help --version" -- $cur) )
+ return 0
+}
+complete -F _ipcmk_module ipcmk
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 08/10] bash-completion: lslogins: add missing completion file
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (6 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 07/10] bash-completion: ipcmk: add missing completion file Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 09/10] bash-completion: lsns: " Sami Kerola
` (2 subsequent siblings)
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
bash-completion/Makemodule.am | 3 ++
bash-completion/lslogins | 76 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+)
create mode 100755 bash-completion/lslogins
diff --git a/bash-completion/Makemodule.am b/bash-completion/Makemodule.am
index e4196a3..9479087 100644
--- a/bash-completion/Makemodule.am
+++ b/bash-completion/Makemodule.am
@@ -150,6 +150,9 @@ endif
if BUILD_LAST
dist_bashcompletion_DATA += bash-completion/last
endif
+if BUILD_LSLOGINS
+dist_bashcompletion_DATA += bash-completion/lslogins
+endif
if BUILD_NEWGRP
dist_bashcompletion_DATA += bash-completion/newgrp
endif
diff --git a/bash-completion/lslogins b/bash-completion/lslogins
new file mode 100755
index 0000000..967b644
--- /dev/null
+++ b/bash-completion/lslogins
@@ -0,0 +1,76 @@
+_lslogins_module()
+{
+ local cur prev OPTS LSLOGINS_COLS_ALL
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ LSLOGINS_COLS_ALL="
+ USER UID GECOS HOMEDIR SHELL NOLOGIN PWD-LOCK PWD-EMPTY
+ PWD-DENY GROUP GID SUPP-GROUPS SUPP-GIDS LAST-LOGIN LAST-TTY
+ LAST-HOSTNAME FAILED-LOGIN FAILED-TTY HUSHED PWD-WARN
+ PWD-CHANGE PWD-MIN PWD-MAX PWD-EXPIR CONTEXT PROC
+ "
+ case $prev in
+ '-g'|'--groups')
+ COMPREPLY=( $(compgen -W "$(getent group | awk -F: '{print $1}')" -- $cur) )
+ return 0
+ ;;
+ '-l'|'--logins')
+ COMPREPLY=( $(compgen -W "$(getent passwd | awk -F: '{print $1}')" -- $cur) )
+ return 0
+ ;;
+ '--time-format')
+ COMPREPLY=( $(compgen -W "short full iso" -- $cur) )
+ return 0
+ ;;
+ '--wtmp-file'|'--btmp-file')
+ local IFS=$'\n'
+ compopt -o filenames
+ COMPREPLY=( $(compgen -f -- $cur) )
+ return 0
+ ;;
+ '-o'|'--output')
+ local prefix realcur LSLOGINS_COLS
+ realcur="${cur##*,}"
+ prefix="${cur%$realcur}"
+ for WORD in $LSLOGINS_COLS_ALL; do
+ if ! [[ $prefix == *"$WORD"* ]]; then
+ LSLOGINS_COLS="$WORD $LSLOGINS_COLS"
+ fi
+ done
+ compopt -o nospace
+ COMPREPLY=( $(compgen -P "$prefix" -W "$LSLOGINS_COLS" -S ',' -- $realcur) )
+ return 0
+ ;;
+ '-h'|'--help'|'-V'|'--version')
+ return 0
+ ;;
+ esac
+ COMPREPLY=( $(compgen -W "
+ --acc-expiration
+ --colon-separate
+ --export
+ --failed
+ --supp-groups
+ --groups
+ --last
+ --logins
+ --newline
+ --noheadings
+ --notruncate
+ --output
+ --pwd
+ --raw
+ --system-accs
+ --time-format
+ --user-accs
+ --context
+ --print0
+ --wtmp-file
+ --btmp-file
+ --help
+ --version
+ " -- $cur) )
+ return 0
+}
+complete -F _lslogins_module lslogins
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 09/10] bash-completion: lsns: add missing completion file
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (7 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 08/10] bash-completion: lslogins: " Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 10/10] docs: update AUTHORS file Sami Kerola
2016-03-14 12:17 ` [PATCH 00/10] pull: release v2.28 prep work Karel Zak
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
bash-completion/Makemodule.am | 3 +++
bash-completion/lsns | 56 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+)
create mode 100644 bash-completion/lsns
diff --git a/bash-completion/Makemodule.am b/bash-completion/Makemodule.am
index 9479087..56fdd32 100644
--- a/bash-completion/Makemodule.am
+++ b/bash-completion/Makemodule.am
@@ -51,6 +51,9 @@ endif
if BUILD_LSIPC
dist_bashcompletion_DATA += bash-completion/lsipc
endif
+if BUILD_LSNS
+dist_bashcompletion_DATA += bash-completion/lsns
+endif
if BUILD_MCOOKIE
dist_bashcompletion_DATA += bash-completion/mcookie
endif
diff --git a/bash-completion/lsns b/bash-completion/lsns
new file mode 100644
index 0000000..8e6a335
--- /dev/null
+++ b/bash-completion/lsns
@@ -0,0 +1,56 @@
+_lsns_module()
+{
+ local cur prev OPTS LSNS_COLS_ALL
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ LSNS_COLS_ALL="
+ NS TYPE PATH NPROCS PID PPID COMMAND UID USER
+ "
+ case $prev in
+ '-o'|'--output')
+ local prefix realcur LSNS_COLS
+ realcur="${cur##*,}"
+ prefix="${cur%$realcur}"
+ for WORD in $LSNS_COLS_ALL; do
+ if ! [[ $prefix == *"$WORD"* ]]; then
+ LSNS_COLS="$WORD $LSNS_COLS"
+ fi
+ done
+ compopt -o nospace
+ COMPREPLY=( $(compgen -P "$prefix" -W "$LSNS_COLS" -S ',' -- $realcur) )
+ return 0
+ ;;
+ '-p'|'--task')
+ COMPREPLY=( $(compgen -W "$(cd /proc && echo [0-9]*)" -- $cur) )
+ return 0
+ ;;
+ '-t'|'--type')
+ COMPREPLY=( $(compgen -W "mnt net ipc user pid uts" -- $cur) )
+ return 0
+ ;;
+ '-h'|'--help'|'-V'|'--version')
+ return 0
+ ;;
+ esac
+ case $cur in
+ -*)
+ COMPREPLY=( $(compgen -W "
+ --json
+ --list
+ --noheadings
+ --output
+ --task
+ --raw
+ --notruncate
+ --type
+ --help
+ --version
+ " -- $cur) )
+ return 0
+ ;;
+ esac
+ COMPREPLY=( $(compgen -W "mnt net pid uts ipc user" -- $cur ) )
+ return 0
+}
+complete -F _lsns_module lsns
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 10/10] docs: update AUTHORS file
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (8 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 09/10] bash-completion: lsns: " Sami Kerola
@ 2016-03-13 10:31 ` Sami Kerola
2016-03-14 12:17 ` [PATCH 00/10] pull: release v2.28 prep work Karel Zak
10 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-13 10:31 UTC (permalink / raw)
To: util-linux; +Cc: Sami Kerola
Former email address has not reached me since summer 2015.
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
AUTHORS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/AUTHORS b/AUTHORS
index c788396..a0835b6 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -459,7 +459,7 @@ CONTRIBUTORS:
Ross Biro <biro@yggdrasil.com>
Roy Peled <the.roy.peled@gmail.com>
Ruediger Meier <ruediger.meier@ga-group.nl>
- Sami Kerola <sami.kerola@lastminute.com>
+ Sami Kerola <kerolasa@iki.fi>
Sami Liedes <sami.liedes@iki.fi>
Samuel Thibault <samuel.thibault@ens-lyon.org>
Sam Varshavchik <mrsam@courier-mta.com>
--
2.7.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime()
2016-03-13 10:31 ` [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime() Sami Kerola
@ 2016-03-13 11:28 ` Ruediger Meier
2016-03-13 13:20 ` Yuriy M. Kaminskiy
1 sibling, 0 replies; 17+ messages in thread
From: Ruediger Meier @ 2016-03-13 11:28 UTC (permalink / raw)
To: Sami Kerola; +Cc: util-linux
On Sunday 13 March 2016, Sami Kerola wrote:
> POSIX.1-2008 marks asctime() and asctime_r() as obsolete,
> recommending the use of strftime(3) instead.
>
> Signed-off-by: Sami Kerola <kerolasa@iki.fi>
> ---
> include/timeutils.h | 3 +++
> login-utils/lslogins.c | 5 ++---
> sys-utils/lsipc.c | 6 ++----
> sys-utils/rtcwake.c | 15 +++++++++------
> 4 files changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/include/timeutils.h b/include/timeutils.h
> index 8ed501b..427f833 100644
> --- a/include/timeutils.h
> +++ b/include/timeutils.h
> @@ -51,6 +51,9 @@ typedef uint64_t nsec_t;
> #define FORMAT_TIMESTAMP_RELATIVE_MAX 256
> #define FORMAT_TIMESPAN_MAX 64
>
> +/* Original asctime(3) format ends to '\n' that we do not do here.
> */ +#define STRFTIME_ASCTIME_FORMAT "%a %b %e %T %Y"
> +
> int parse_timestamp(const char *t, usec_t *usec);
>
> #endif /* UTIL_LINUX_TIME_UTIL_H */
> diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
> index 40a1343..554a1a3 100644
> --- a/login-utils/lslogins.c
> +++ b/login-utils/lslogins.c
> @@ -56,6 +56,7 @@
> #include "pathnames.h"
> #include "logindefs.h"
> #include "procutils.h"
> +#include "timeutils.h"
>
> /*
> * column description
> @@ -333,9 +334,7 @@ static char *make_time(int mode, time_t time)
>
> switch(mode) {
> case TIME_FULL:
> - asctime_r(&tm, buf);
> - if (*(s = buf + strlen(buf) - 1) == '\n')
> - *s = '\0';
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
char *s is now unused and could be removed.
> break;
> case TIME_SHORT:
> if (date_is_today(time))
> diff --git a/sys-utils/lsipc.c b/sys-utils/lsipc.c
> index 938728a..19cf5a8 100644
> --- a/sys-utils/lsipc.c
> +++ b/sys-utils/lsipc.c
> @@ -39,6 +39,7 @@
> #include "xalloc.h"
> #include "procutils.h"
> #include "ipcutils.h"
> +#include "timeutils.h"
>
> /*
> * time modes
> @@ -445,7 +446,6 @@ static int date_is_thisyear(time_t t)
>
> static char *make_time(int mode, time_t time)
> {
> - char *s;
> struct tm tm;
> char buf[64] = {0};
>
> @@ -453,9 +453,7 @@ static char *make_time(int mode, time_t time)
>
> switch(mode) {
> case TIME_FULL:
> - asctime_r(&tm, buf);
> - if (*(s = buf + strlen(buf) - 1) == '\n')
> - *s = '\0';
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
> break;
> case TIME_SHORT:
> if (date_is_today(time))
> diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c
> index 7c748dc..32df785 100644
> --- a/sys-utils/rtcwake.c
> +++ b/sys-utils/rtcwake.c
> @@ -173,7 +173,7 @@ static int get_basetimes(struct rtcwake_control
> *ctl, int fd) return -1;
> }
> /* Convert rtc_time to normal arithmetic-friendly form,
> - * updating tm.tm_wday as used by asctime().
> + * updating tm.tm_wday as used by strftime().
> */
> tm.tm_sec = rtc.tm_sec;
> tm.tm_min = rtc.tm_min;
> @@ -193,14 +193,17 @@ static int get_basetimes(struct rtcwake_control
> *ctl, int fd) /* Unless the system uses UTC, either delta or tzone
> * reflects a seconds offset from UTC. The value can
> * help sort out problems like bugs in your C library. */
> + char buf[64] = { 0 };
> + struct tm sys_tm = { 0 };
> +
> printf("\tdelta = %ld\n", ctl->sys_time - ctl->rtc_time);
> printf("\ttzone = %ld\n", timezone);
> printf("\ttzname = %s\n", tzname[daylight]);
> - gmtime_r(&ctl->rtc_time, &tm);
> - printf("\tsystime = %ld, (UTC) %s",
> - (long) ctl->sys_time, asctime(gmtime(&ctl->sys_time)));
> - printf("\trtctime = %ld, (UTC) %s",
> - (long) ctl->rtc_time, asctime(&tm));
> + gmtime_r(&ctl->sys_time, &sys_tm);
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &sys_tm);
> + printf("\tsystime = %ld, (UTC) %s\n", (long) ctl->sys_time, buf);
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
> + printf("\trtctime = %ld, (UTC) %s\n", (long) ctl->rtc_time, buf);
> }
> return 0;
> }
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind]
2016-03-13 10:31 ` [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind] Sami Kerola
@ 2016-03-13 12:11 ` Yuriy M. Kaminskiy
2016-03-14 21:24 ` Sami Kerola
0 siblings, 1 reply; 17+ messages in thread
From: Yuriy M. Kaminskiy @ 2016-03-13 12:11 UTC (permalink / raw)
To: util-linux
On 03/13/16 13:31 , Sami Kerola wrote:
> The getopt(1) is short living command, and one could argue ensuring all
> allocations are freed at end of execution is waste of time. There is a
> point in that, but making test-suite runs to be less noisy with ASAN is also
> nice as it encourages reading the errors when/if they happen.
>
> Signed-off-by: Sami Kerola <kerolasa@iki.fi>
> ---
> misc-utils/getopt.c | 36 ++++++++++++++++++++++++++++--------
> 1 file changed, 28 insertions(+), 8 deletions(-)
>
> diff --git a/misc-utils/getopt.c b/misc-utils/getopt.c
> index c4144f6..be2ed38 100644
> --- a/misc-utils/getopt.c
> +++ b/misc-utils/getopt.c
> @@ -79,13 +79,23 @@
> /* The shells recognized. */
> typedef enum { BASH, TCSH } shell_t;
>
> +/* This is a copy of getopt_long(3) structure, in which *name does not have
> + * const, so that is can be free'd at end of execution. */
> +struct getoption {
> + char *name;
> + int has_arg;
> + int *flag;
> + int val;
> +};
What will happen if some implementation will add new fields in `struct
option`? (Sure, unlikely, but).
IMO, `free((char *)option->name)` is *much* safer.
> struct getopt_control {
> shell_t shell; /* the shell we generate output for */
> char *optstr; /* getopt(3) optstring */
> - struct option *long_options; /* long options */
> + struct getoption *long_options; /* long options */
> int long_options_length; /* length of options array */
> int long_options_nr; /* number of used elements in array */
> unsigned int
> + free_name:1, /* free up argv[0] after printout */
> compatible:1, /* compatibility mode for 'difficult' programs */
> quiet_errors:1, /* print errors */
> quiet_output:1, /* print output */
> @@ -181,7 +191,7 @@ static void print_normalized(const struct getopt_control *ctl, const char *arg)
> * optstr must contain the short options, and longopts the long options.
> * Other settings are found in global variables.
> */
> -static int generate_output(const struct getopt_control *ctl, char *argv[], int argc)
> +static int generate_output(struct getopt_control *ctl, char *argv[], int argc)
> {
> int exit_code = EXIT_SUCCESS; /* Assume everything will be OK */
> int opt;
> @@ -195,8 +205,10 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
> optind = 0;
>
> while ((opt =
> - (getopt_long_fp(argc, argv, ctl->optstr, ctl->long_options, &longindex)))
> - != EOF)
> + (getopt_long_fp
> + (argc, argv, ctl->optstr,
> + (const struct option *)ctl->long_options, &longindex)))
> + != EOF) {
> if (opt == '?' || opt == ':')
> exit_code = GETOPT_EXIT_CODE;
> else if (!ctl->quiet_output) {
> @@ -216,13 +228,19 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
> print_normalized(ctl, optarg ? optarg : "");
> }
> }
> -
> + }
> if (!ctl->quiet_output) {
> printf(" --");
> while (optind < argc)
> print_normalized(ctl, argv[optind++]);
> printf("\n");
> }
> + for (longindex = 0; longindex < ctl->long_options_nr; longindex++)
> + free(ctl->long_options[longindex].name);
> + free(ctl->long_options);
> + free(ctl->optstr);
> + if (ctl->free_name)
> + free(argv[0]);
> return exit_code;
> }
>
> @@ -373,9 +391,6 @@ int main(int argc, char *argv[])
> textdomain(PACKAGE);
> atexit(close_stdout);
>
> - add_longopt(&ctl, NULL, 0); /* init */
> - getopt_long_fp = getopt_long;
> -
> if (getenv("GETOPT_COMPATIBLE"))
> ctl.compatible = 1;
>
> @@ -391,6 +406,9 @@ int main(int argc, char *argv[])
> parse_error(_("missing optstring argument"));
> }
>
> + add_longopt(&ctl, NULL, 0); /* init */
> + getopt_long_fp = getopt_long;
> +
> if (argv[1][0] != '-' || ctl.compatible) {
> ctl.quote = 0;
> ctl.optstr = xmalloc(strlen(argv[1]) + 1);
> @@ -417,6 +435,7 @@ int main(int argc, char *argv[])
> case 'n':
> free(name);
> name = xstrdup(optarg);
> + ctl.free_name = 1;
> break;
> case 'q':
> ctl.quiet_errors = 1;
> @@ -428,6 +447,7 @@ int main(int argc, char *argv[])
> ctl.shell = shell_type(optarg);
> break;
> case 'T':
> + free(ctl.long_options);
> return TEST_EXIT_CODE;
> case 'u':
> ctl.quote = 0;
> --
> 2.7.2
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime()
2016-03-13 10:31 ` [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime() Sami Kerola
2016-03-13 11:28 ` Ruediger Meier
@ 2016-03-13 13:20 ` Yuriy M. Kaminskiy
2016-03-14 12:08 ` Karel Zak
1 sibling, 1 reply; 17+ messages in thread
From: Yuriy M. Kaminskiy @ 2016-03-13 13:20 UTC (permalink / raw)
To: util-linux
[-- Attachment #1: Type: text/plain, Size: 389 bytes --]
On 03/13/16 13:31 , Sami Kerola wrote:
> POSIX.1-2008 marks asctime() and asctime_r() as obsolete, recommending the
> use of strftime(3) instead.
stftime uses locale, asctime is not. And if you want *locale-specific*
time presentation, it is "%c" --- it can be very different from your "%a
%b...", e.g. compare with attached
gcc -o asctime asctime.c
LC_ALL=ja_JP.UTF-8 ./asctime
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: asctime.c --]
[-- Type: text/x-csrc, Size: 312 bytes --]
#include <stdio.h>
#include <time.h>
#include <locale.h>
int main()
{
time_t t = time(NULL);
char buf[64];
struct tm *tm;
setlocale(LC_ALL, "");
puts(asctime(tm = localtime(&t)));
strftime(buf, sizeof(buf), "%a %b %e %T %Y", tm);
puts(buf);
strftime(buf, sizeof(buf), "%c", tm);
puts(buf);
return 0;
}
[-- Attachment #3: Type: text/plain, Size: 3735 bytes --]
> Signed-off-by: Sami Kerola <kerolasa@iki.fi>
> ---
> include/timeutils.h | 3 +++
> login-utils/lslogins.c | 5 ++---
> sys-utils/lsipc.c | 6 ++----
> sys-utils/rtcwake.c | 15 +++++++++------
> 4 files changed, 16 insertions(+), 13 deletions(-)
>
> diff --git a/include/timeutils.h b/include/timeutils.h
> index 8ed501b..427f833 100644
> --- a/include/timeutils.h
> +++ b/include/timeutils.h
> @@ -51,6 +51,9 @@ typedef uint64_t nsec_t;
> #define FORMAT_TIMESTAMP_RELATIVE_MAX 256
> #define FORMAT_TIMESPAN_MAX 64
>
> +/* Original asctime(3) format ends to '\n' that we do not do here. */
> +#define STRFTIME_ASCTIME_FORMAT "%a %b %e %T %Y"
> +
> int parse_timestamp(const char *t, usec_t *usec);
>
> #endif /* UTIL_LINUX_TIME_UTIL_H */
> diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
> index 40a1343..554a1a3 100644
> --- a/login-utils/lslogins.c
> +++ b/login-utils/lslogins.c
> @@ -56,6 +56,7 @@
> #include "pathnames.h"
> #include "logindefs.h"
> #include "procutils.h"
> +#include "timeutils.h"
>
> /*
> * column description
> @@ -333,9 +334,7 @@ static char *make_time(int mode, time_t time)
>
> switch(mode) {
> case TIME_FULL:
> - asctime_r(&tm, buf);
> - if (*(s = buf + strlen(buf) - 1) == '\n')
> - *s = '\0';
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
> break;
> case TIME_SHORT:
> if (date_is_today(time))
> diff --git a/sys-utils/lsipc.c b/sys-utils/lsipc.c
> index 938728a..19cf5a8 100644
> --- a/sys-utils/lsipc.c
> +++ b/sys-utils/lsipc.c
> @@ -39,6 +39,7 @@
> #include "xalloc.h"
> #include "procutils.h"
> #include "ipcutils.h"
> +#include "timeutils.h"
>
> /*
> * time modes
> @@ -445,7 +446,6 @@ static int date_is_thisyear(time_t t)
>
> static char *make_time(int mode, time_t time)
> {
> - char *s;
> struct tm tm;
> char buf[64] = {0};
>
> @@ -453,9 +453,7 @@ static char *make_time(int mode, time_t time)
>
> switch(mode) {
> case TIME_FULL:
> - asctime_r(&tm, buf);
> - if (*(s = buf + strlen(buf) - 1) == '\n')
> - *s = '\0';
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
> break;
> case TIME_SHORT:
> if (date_is_today(time))
> diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c
> index 7c748dc..32df785 100644
> --- a/sys-utils/rtcwake.c
> +++ b/sys-utils/rtcwake.c
> @@ -173,7 +173,7 @@ static int get_basetimes(struct rtcwake_control *ctl, int fd)
> return -1;
> }
> /* Convert rtc_time to normal arithmetic-friendly form,
> - * updating tm.tm_wday as used by asctime().
> + * updating tm.tm_wday as used by strftime().
> */
> tm.tm_sec = rtc.tm_sec;
> tm.tm_min = rtc.tm_min;
> @@ -193,14 +193,17 @@ static int get_basetimes(struct rtcwake_control *ctl, int fd)
> /* Unless the system uses UTC, either delta or tzone
> * reflects a seconds offset from UTC. The value can
> * help sort out problems like bugs in your C library. */
> + char buf[64] = { 0 };
> + struct tm sys_tm = { 0 };
> +
> printf("\tdelta = %ld\n", ctl->sys_time - ctl->rtc_time);
> printf("\ttzone = %ld\n", timezone);
> printf("\ttzname = %s\n", tzname[daylight]);
> - gmtime_r(&ctl->rtc_time, &tm);
> - printf("\tsystime = %ld, (UTC) %s",
> - (long) ctl->sys_time, asctime(gmtime(&ctl->sys_time)));
> - printf("\trtctime = %ld, (UTC) %s",
> - (long) ctl->rtc_time, asctime(&tm));
> + gmtime_r(&ctl->sys_time, &sys_tm);
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &sys_tm);
> + printf("\tsystime = %ld, (UTC) %s\n", (long) ctl->sys_time, buf);
> + strftime(buf, sizeof(buf), STRFTIME_ASCTIME_FORMAT, &tm);
> + printf("\trtctime = %ld, (UTC) %s\n", (long) ctl->rtc_time, buf);
> }
> return 0;
> }
> --
> 2.7.2
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime()
2016-03-13 13:20 ` Yuriy M. Kaminskiy
@ 2016-03-14 12:08 ` Karel Zak
0 siblings, 0 replies; 17+ messages in thread
From: Karel Zak @ 2016-03-14 12:08 UTC (permalink / raw)
To: Yuriy M. Kaminskiy; +Cc: util-linux
On Sun, Mar 13, 2016 at 04:20:42PM +0300, Yuriy M. Kaminskiy wrote:
>
> On 03/13/16 13:31 , Sami Kerola wrote:
> > POSIX.1-2008 marks asctime() and asctime_r() as obsolete, recommending the
> > use of strftime(3) instead.
>
> stftime uses locale, asctime is not. And if you want *locale-specific*
> time presentation, it is "%c" --- it can be very different from your "%a
> %b...", e.g. compare with attached
This is why I have asked for functions in lib/timeutils.c to make
short, full or iso formats explicitly defined on one place to avoid
creativity in utils code and such discussions.
We need:
- human readable times:
* full (%c -- now asctime)
* short ("%H:%M:%S, "%b%d/%H:%M", "%Y-%b%d")
- ISO:
* full
* short
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 00/10] pull: release v2.28 prep work
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
` (9 preceding siblings ...)
2016-03-13 10:31 ` [PATCH 10/10] docs: update AUTHORS file Sami Kerola
@ 2016-03-14 12:17 ` Karel Zak
10 siblings, 0 replies; 17+ messages in thread
From: Karel Zak @ 2016-03-14 12:17 UTC (permalink / raw)
To: Sami Kerola; +Cc: util-linux
On Sun, Mar 13, 2016 at 10:31:39AM +0000, Sami Kerola wrote:
> getopt: fix memory leaks and integer overflows [ASAN & valgrind]
Not applied, it's really not elegant to have private definition of
options struct for getopt_long().
> lsipc, lslogins, rtcwake: replace asctime() with strftime()
Not applied, I think we need more discussion about it.
> isosize: stop unmeaningful printing errno message
> setsid: fix argument count bug
> bash-completion: fsck.cramfs, isosize: find files an argument
> bash-completion: ipcmk: add missing completion file
> bash-completion: lslogins: add missing completion file
> bash-completion: lsns: add missing completion file
> docs: update AUTHORS file
Applied, thanks!
Karel
--
Karel Zak <kzak@redhat.com>
http://karelzak.blogspot.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind]
2016-03-13 12:11 ` Yuriy M. Kaminskiy
@ 2016-03-14 21:24 ` Sami Kerola
0 siblings, 0 replies; 17+ messages in thread
From: Sami Kerola @ 2016-03-14 21:24 UTC (permalink / raw)
To: Yuriy M. Kaminskiy; +Cc: util-linux
On Sun, 13 Mar 2016, Yuriy M. Kaminskiy wrote:
> On 03/13/16 13:31 , Sami Kerola wrote:
> > The getopt(1) is short living command, and one could argue ensuring all
> > allocations are freed at end of execution is waste of time. There is a
> > point in that, but making test-suite runs to be less noisy with ASAN is also
> > nice as it encourages reading the errors when/if they happen.
> >
> > Signed-off-by: Sami Kerola <kerolasa@iki.fi>
> > ---
> > misc-utils/getopt.c | 36 ++++++++++++++++++++++++++++--------
> > 1 file changed, 28 insertions(+), 8 deletions(-)
> >
> > diff --git a/misc-utils/getopt.c b/misc-utils/getopt.c
> > index c4144f6..be2ed38 100644
> > --- a/misc-utils/getopt.c
> > +++ b/misc-utils/getopt.c
> > @@ -79,13 +79,23 @@
> > /* The shells recognized. */
> > typedef enum { BASH, TCSH } shell_t;
> >
> > +/* This is a copy of getopt_long(3) structure, in which *name does not have
> > + * const, so that is can be free'd at end of execution. */
> > +struct getoption {
> > + char *name;
> > + int has_arg;
> > + int *flag;
> > + int val;
> > +};
>
> What will happen if some implementation will add new fields in `struct
> option`? (Sure, unlikely, but).
> IMO, `free((char *)option->name)` is *much* safer.
Hi Yuriy and Karel,
Okay, sounds fair adding a 'copy struct' wasn't the brightest idea ever.
See below a const cast to read-write char pointer. This seems to make
compiler happy.
--->8----
From: Sami Kerola <kerolasa@iki.fi>
Date: Mon, 14 Mar 2016 21:06:30 +0000
Subject: getopt: fix memory leaks and integer overflows [ASAN & valgrind]
The getopt(1) is short living command, and one could argue ensuring all
allocations are freed at end of execution is waste of time. There is a
point in that, but making test-suite runs to be less noisy with ASAN is
also nice as it encourages reading the errors when/if they happen.
Reviewed-by: Yuriy M. Kaminskiy <yumkam@gmail.com>
Reviewed-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
misc-utils/getopt.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/misc-utils/getopt.c b/misc-utils/getopt.c
index c4144f6..7f4547c 100644
--- a/misc-utils/getopt.c
+++ b/misc-utils/getopt.c
@@ -86,6 +86,7 @@ struct getopt_control {
int long_options_length; /* length of options array */
int long_options_nr; /* number of used elements in array */
unsigned int
+ free_name:1, /* free up argv[0] after printout */
compatible:1, /* compatibility mode for 'difficult' programs */
quiet_errors:1, /* print errors */
quiet_output:1, /* print output */
@@ -181,7 +182,7 @@ static void print_normalized(const struct getopt_control *ctl, const char *arg)
* optstr must contain the short options, and longopts the long options.
* Other settings are found in global variables.
*/
-static int generate_output(const struct getopt_control *ctl, char *argv[], int argc)
+static int generate_output(struct getopt_control *ctl, char *argv[], int argc)
{
int exit_code = EXIT_SUCCESS; /* Assume everything will be OK */
int opt;
@@ -195,8 +196,10 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
optind = 0;
while ((opt =
- (getopt_long_fp(argc, argv, ctl->optstr, ctl->long_options, &longindex)))
- != EOF)
+ (getopt_long_fp
+ (argc, argv, ctl->optstr,
+ (const struct option *)ctl->long_options, &longindex)))
+ != EOF) {
if (opt == '?' || opt == ':')
exit_code = GETOPT_EXIT_CODE;
else if (!ctl->quiet_output) {
@@ -216,13 +219,19 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
print_normalized(ctl, optarg ? optarg : "");
}
}
-
+ }
if (!ctl->quiet_output) {
printf(" --");
while (optind < argc)
print_normalized(ctl, argv[optind++]);
printf("\n");
}
+ for (longindex = 0; longindex < ctl->long_options_nr; longindex++)
+ free((char *)ctl->long_options[longindex].name);
+ free(ctl->long_options);
+ free(ctl->optstr);
+ if (ctl->free_name)
+ free(argv[0]);
return exit_code;
}
@@ -373,9 +382,6 @@ int main(int argc, char *argv[])
textdomain(PACKAGE);
atexit(close_stdout);
- add_longopt(&ctl, NULL, 0); /* init */
- getopt_long_fp = getopt_long;
-
if (getenv("GETOPT_COMPATIBLE"))
ctl.compatible = 1;
@@ -391,6 +397,9 @@ int main(int argc, char *argv[])
parse_error(_("missing optstring argument"));
}
+ add_longopt(&ctl, NULL, 0); /* init */
+ getopt_long_fp = getopt_long;
+
if (argv[1][0] != '-' || ctl.compatible) {
ctl.quote = 0;
ctl.optstr = xmalloc(strlen(argv[1]) + 1);
@@ -417,6 +426,7 @@ int main(int argc, char *argv[])
case 'n':
free(name);
name = xstrdup(optarg);
+ ctl.free_name = 1;
break;
case 'q':
ctl.quiet_errors = 1;
@@ -428,6 +438,7 @@ int main(int argc, char *argv[])
ctl.shell = shell_type(optarg);
break;
case 'T':
+ free(ctl.long_options);
return TEST_EXIT_CODE;
case 'u':
ctl.quote = 0;
--
2.7.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
end of thread, other threads:[~2016-03-14 21:24 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-13 10:31 [PATCH 00/10] pull: release v2.28 prep work Sami Kerola
2016-03-13 10:31 ` [PATCH 01/10] logger: fix memory leak [ASAN and valgrind] Sami Kerola
2016-03-13 10:31 ` [PATCH 02/10] getopt: fix memory leaks and integer overflows [ASAN & valgrind] Sami Kerola
2016-03-13 12:11 ` Yuriy M. Kaminskiy
2016-03-14 21:24 ` Sami Kerola
2016-03-13 10:31 ` [PATCH 03/10] lsipc, lslogins, rtcwake: replace asctime() with strftime() Sami Kerola
2016-03-13 11:28 ` Ruediger Meier
2016-03-13 13:20 ` Yuriy M. Kaminskiy
2016-03-14 12:08 ` Karel Zak
2016-03-13 10:31 ` [PATCH 04/10] isosize: stop unmeaningful printing errno message Sami Kerola
2016-03-13 10:31 ` [PATCH 05/10] setsid: fix argument count bug Sami Kerola
2016-03-13 10:31 ` [PATCH 06/10] bash-completion: fsck.cramfs, isosize: find files an argument Sami Kerola
2016-03-13 10:31 ` [PATCH 07/10] bash-completion: ipcmk: add missing completion file Sami Kerola
2016-03-13 10:31 ` [PATCH 08/10] bash-completion: lslogins: " Sami Kerola
2016-03-13 10:31 ` [PATCH 09/10] bash-completion: lsns: " Sami Kerola
2016-03-13 10:31 ` [PATCH 10/10] docs: update AUTHORS file Sami Kerola
2016-03-14 12:17 ` [PATCH 00/10] pull: release v2.28 prep work Karel Zak
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.