On Wed, Jan 16, 2013 at 7:15 PM, Tomas Mraz tmraz@redhat.com wrote:
Not really, the patches from your batch that were not commented about were already commited. The rest of them are waiting for you to fix or drop.
Hi Tomas & Marcela,
Oh, sorry. My bad. I wrote corrections to the patches but did not submit them to list, but pushed only to my branch at github. I do not know what I were thinking, but perhaps submission later is better than never. Notice that the patches I sent yesterday are these six without 'signed-off-by' lines, feel free to use them if signing is not preferred.
The following changes since commit c508ac6a34c8ccca0d831a69536457acb62d0c1d:
contrib: remove bashisms (2012-12-21 22:14:30 +0100)
are available in the git repository at:
git://github.com/kerolasa/cronie.git 2012wk52
for you to fetch changes up to 59a5448efaf41b91bb6c0da8b2f78ac4b586b8d1:
cron: clarify usage() print out (2012-12-31 12:57:35 +0000)
---------------------------------------------------------------- Sami Kerola (6): smatch scan: fix various warningss found using smatch anacron: fix shadow declarations anacron: use random device for random sleep when possible common: add gethostname() support functions cron, anacron: take safe gethostname() function in use cron: clarify usage() print out
anacron/global.h | 4 ++-- anacron/main.c | 37 +++++++++++++++++++++++++------------ anacron/readtab.c | 19 ++++++++++--------- anacron/runjob.c | 8 ++++---- cronie_common.h | 38 ++++++++++++++++++++++++++++++++++++++ src/crontab.c | 29 +++++++++++++++++------------ src/database.c | 10 +++++++--- src/do_command.c | 6 ++++-- src/entry.c | 6 ++---- src/macros.h | 2 ++ src/security.c | 2 +- 11 files changed, 112 insertions(+), 49 deletions(-)
entry.c:396 load_entry() info: redundant null check on e->pwd calling free() entry.c:398 load_entry() info: redundant null check on e->cmd calling free()
/usr/include/bits/fcntl.h:48:10: warning: preprocessor token O_NOFOLLOW redefined macros.h:136:9: this was the original definition
security.c:98:44: warning: non-ANSI function declaration of function 'cron_restore_default_security_context' crontab.c:439:29: warning: non-ANSI function declaration of function 'tmp_path'
Signed-off-by: Sami Kerola kerolasa@iki.fi --- src/crontab.c | 2 +- src/entry.c | 6 ++---- src/macros.h | 2 ++ src/security.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/crontab.c b/src/crontab.c index bfff182..5703a3b 100644 --- a/src/crontab.c +++ b/src/crontab.c @@ -436,7 +436,7 @@ static void check_error(const char *msg) { fprintf(stderr, ""%s":%d: %s\n", Filename, LineNumber - 1, msg); }
-static const char *tmp_path() { +static const char *tmp_path(void) { const char *tmpdir = NULL;
if ((getuid() == geteuid()) && (getgid() == getegid())) { diff --git a/src/entry.c b/src/entry.c index 0b482b9..e9142f5 100644 --- a/src/entry.c +++ b/src/entry.c @@ -392,10 +392,8 @@ entry *load_entry(FILE * file, void (*error_func) (), struct passwd *pw, eof: if (e->envp) env_free(e->envp); - if (e->pwd) - free(e->pwd); - if (e->cmd) - free(e->cmd); + free(e->pwd); + free(e->cmd); free(e); while (ch != '\n' && !feof(file)) ch = get_char(file); diff --git a/src/macros.h b/src/macros.h index 215753a..6c7ca6d 100644 --- a/src/macros.h +++ b/src/macros.h @@ -25,6 +25,7 @@ #ifdef HAVE_LIMITS_H #include <limits.h> #endif + /* these are really immutable, and are * defined for symbolic convenience only * TRUE, FALSE, and ERR must be distinct @@ -131,6 +132,7 @@ * we will just have to live without it. In order for this to be an * issue an attacker would have to subvert group CRON_GROUP. */ +#include <fcntl.h> #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif diff --git a/src/security.c b/src/security.c index b483134..c5fbc5e 100644 --- a/src/security.c +++ b/src/security.c @@ -100,7 +100,7 @@ static int cron_get_job_range(user * u, security_context_t * ucontextp, char **jobenv); #endif
-void cron_restore_default_security_context() { +void cron_restore_default_security_context(void) { #ifdef WITH_SELINUX setexeccon(NULL); #endif
Change global variables to have more specific name. This will make warnings about shadowing to go away, and may result to a little more readable code.
log.c:74:35: warning: declaration of 'args' shadows a global declaration [-Wshadow] global.h:97:15: warning: shadowed declaration is here [-Wshadow]
Reference: http://web.archiveorange.com/archive/v/N6p0RpcfZsIBsaU8B2sE#72jDywyk8NZ3i9g Signed-off-by: Sami Kerola kerolasa@iki.fi --- anacron/global.h | 4 ++-- anacron/main.c | 12 ++++++------ anacron/readtab.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/anacron/global.h b/anacron/global.h index 2298f3c..9d5ef76 100644 --- a/anacron/global.h +++ b/anacron/global.h @@ -94,8 +94,8 @@ extern int in_background; extern job_rec *first_job_rec; extern env_rec *first_env_rec;
-extern char **args; -extern int nargs; +extern char **job_args; +extern int job_nargs;
extern int njobs; extern job_rec **job_array; diff --git a/anacron/main.c b/anacron/main.c index be0585f..7889983 100644 --- a/anacron/main.c +++ b/anacron/main.c @@ -47,8 +47,8 @@ char *anacrontab; char *spooldir; int serialize, force, update_only, now, no_daemon, quiet, testing_only; /* command-line options */ -char **args; /* vector of "job" command-line arguments */ -int nargs; /* number of these */ +char **job_args; /* vector of "job" command-line arguments */ +int job_nargs; /* number of these */ char *defarg = "*"; int in_background; /* are we in the background? */ int old_umask; /* umask when started */ @@ -153,13 +153,13 @@ parse_opts(int argc, char *argv[]) if (optind == argc) { /* no arguments. Equivalent to: `*' */ - nargs = 1; - args = &defarg; + job_nargs = 1; + job_args = &defarg; } else { - nargs = argc - optind; - args = argv + optind; + job_nargs = argc - optind; + job_args = argv + optind; } }
diff --git a/anacron/readtab.c b/anacron/readtab.c index 48fd98b..e378faf 100644 --- a/anacron/readtab.c +++ b/anacron/readtab.c @@ -116,9 +116,9 @@ job_arg_num(const char *ident) { int i, r;
- for (i = 0; i < nargs; i++) + for (i = 0; i < job_nargs; i++) { - r = fnmatch(args[i], ident, 0); + r = fnmatch(job_args[i], ident, 0); if (r == 0) return i; if (r != FNM_NOMATCH) die("fnmatch() error"); }
The commit makes the random be more chaotic than it used to be. This change also makes the instance in readtab.c where random() is used a little bit easier to read.
Signed-off-by: Sami Kerola kerolasa@iki.fi --- anacron/main.c | 25 +++++++++++++++++++------ anacron/readtab.c | 15 ++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/anacron/main.c b/anacron/main.c index 7889983..88afaca 100644 --- a/anacron/main.c +++ b/anacron/main.c @@ -431,23 +431,36 @@ explain_intentions(void) explain("Jobs will be executed sequentially"); }
+/* Seed random(3). */ +static void +srandomdev(void) { + struct timeval tv; + unsigned int seed; + FILE *fd; + + if ((fd = fopen("/dev/urandom", "r"))) { + fread(&seed, sizeof seed, 1, fd); + fclose(fd); + } else { + gettimeofday(&tv, NULL); + /* NOTE: intentional use of uninitialized variable */ + seed ^= (getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec; + } + srandom(seed); +} + int main(int argc, char *argv[]) { int j; int cwd; - struct timeval tv; - struct timezone tz;
anacrontab = NULL; spooldir = NULL;
setlocale(LC_ALL, "");
- if (gettimeofday(&tv, &tz) != 0) - explain("Can't get exact time, failure."); - - srandom(getpid()+tv.tv_usec); + srandomdev();
if((program_name = strrchr(argv[0], '/')) == NULL) program_name = argv[0]; diff --git a/anacron/readtab.c b/anacron/readtab.c index e378faf..2d403e4 100644 --- a/anacron/readtab.c +++ b/anacron/readtab.c @@ -281,13 +281,14 @@ parse_tab_line(char *line) Debug(("Jobs will start in the %02d:00-%02d:00 range.", range_start, range_stop)); } if (strncmp(env_var, "RANDOM_DELAY", 12) == 0) { - r = match_rx("^([[:digit:]]+)$", value, 0); - if (r != -1) { - int i = random(); - double x = 0; - x = (double) i / (double) RAND_MAX * (double) (atoi(value)); - random_number = (int)x; - Debug(("Randomized delay set: %d", random_number)); + r = match_rx("^([[:digit:]]+)$", value, 0); + if (r != -1) { + int divisor = atoi(value); + random_number = random(); + /* The random_number is expected vary in between 0 and + * 'value', so divisor need to be value + 1. */ + random_number %= (divisor + 1); + Debug(("Randomized delay set: %d", random_number)); } else goto reg_invalid; }
On Thu, 2013-01-17 at 11:58 +0000, Sami Kerola wrote:
The commit makes the random be more chaotic than it used to be. This change also makes the instance in readtab.c where random() is used a little bit easier to read.
Signed-off-by: Sami Kerola kerolasa@iki.fi
anacron/main.c | 25 +++++++++++++++++++------ anacron/readtab.c | 15 ++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/anacron/main.c b/anacron/main.c index 7889983..88afaca 100644 --- a/anacron/main.c +++ b/anacron/main.c @@ -431,23 +431,36 @@ explain_intentions(void) explain("Jobs will be executed sequentially"); }
+/* Seed random(3). */ +static void +srandomdev(void) {
- struct timeval tv;
- unsigned int seed;
- FILE *fd;
- if ((fd = fopen("/dev/urandom", "r"))) {
- fread(&seed, sizeof seed, 1, fd);
- fclose(fd);
- } else {
- gettimeofday(&tv, NULL);
- /* NOTE: intentional use of uninitialized variable */
- seed ^= (getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec;
- }
- srandom(seed);
+}
I don't particularly like the use of uninitialized seed although harmless - valgrind will for example protest.
int main(int argc, char *argv[]) { int j; int cwd;
struct timeval tv;
struct timezone tz;
anacrontab = NULL; spooldir = NULL;
setlocale(LC_ALL, "");
if (gettimeofday(&tv, &tz) != 0)
explain("Can't get exact time, failure.");
srandom(getpid()+tv.tv_usec);
srandomdev();
if((program_name = strrchr(argv[0], '/')) == NULL) program_name = argv[0];
diff --git a/anacron/readtab.c b/anacron/readtab.c index e378faf..2d403e4 100644 --- a/anacron/readtab.c +++ b/anacron/readtab.c @@ -281,13 +281,14 @@ parse_tab_line(char *line) Debug(("Jobs will start in the %02d:00-%02d:00 range.", range_start, range_stop)); } if (strncmp(env_var, "RANDOM_DELAY", 12) == 0) {
r = match_rx("^([[:digit:]]+)$", value, 0);
if (r != -1) {
int i = random();
double x = 0;
x = (double) i / (double) RAND_MAX * (double) (atoi(value));
random_number = (int)x;
Debug(("Randomized delay set: %d", random_number));
r = match_rx("^([[:digit:]]+)$", value, 0);
if (r != -1) {
int divisor = atoi(value);
random_number = random();
/* The random_number is expected vary in between 0 and
* 'value', so divisor need to be value + 1. */
random_number %= (divisor + 1);
Debug(("Randomized delay set: %d", random_number));
This is as wrong as the old method - both are biased when the RANDOM_DELAY does not evenly divide the RAND_MAX interval. See: http://www.azillionmonkeys.com/qed/random.html
I am not sure it is worth it changing the code from one incorrect way to another. Also using /dev/urandom is probably not worth for seeding unless we fix this.
} else goto reg_invalid; }
These inline functions will allow hostname lenght to vary per system, which is significant because on some sysctl-based systems, gethostname() doesn't write anything if the output buffer is too small. While MAXHOSTNAMELEN is a good guess how long the name might be it is best to try to get the value from sysconf(), and fallback to values provided in headers when sysconf() does not work.
Reference: http://cr.yp.to/docs/unixport.html Reference: http://h21007.www2.hp.com/portal/download/files/unprot/stk/solaris_stk/impac... Reference: http://refspecs.linuxfoundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-gene... Signed-off-by: Sami Kerola kerolasa@iki.fi --- cronie_common.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
diff --git a/cronie_common.h b/cronie_common.h index 4ce172e..87699af 100644 --- a/cronie_common.h +++ b/cronie_common.h @@ -20,6 +20,8 @@ #ifndef CRONIE_COMMON_H #define CRONIE_COMMON_H
+#include <stdlib.h> + #ifndef __attribute__ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) # define __attribute__(x) /* empty */ @@ -34,4 +36,40 @@ # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #endif
+static inline size_t get_hostname_max(void) { + size_t len = sysconf(_SC_HOST_NAME_MAX); + + if (0 < len) + return len; +#ifdef MAXHOSTNAMELEN + return MAXHOSTNAMELEN; +#elif HOST_NAME_MAX + return HOST_NAME_MAX; +#endif + return 64; +} + +static inline char *alloc_hostname_array(void) { + char *array; + size_t sz = get_hostname_max() + 1; + + array = malloc(sizeof (char) * sz); + while (!array) { + usleep(1000); + array = malloc(sizeof (char) * sz); + } + return array; +} + +static inline char *xgethostname(void) { + char *name = alloc_hostname_array(); + size_t sz = get_hostname_max(); + + if (gethostname(name, sz) != 0) + return NULL; + + name[sz - 1] = '\0'; + return name; +} + #endif /* CRONIE_COMMON_H */
On Thu, 2013-01-17 at 11:58 +0000, Sami Kerola wrote:
These inline functions will allow hostname lenght to vary per system, which is significant because on some sysctl-based systems, gethostname() doesn't write anything if the output buffer is too small. While MAXHOSTNAMELEN is a good guess how long the name might be it is best to try to get the value from sysconf(), and fallback to values provided in headers when sysconf() does not work.
Reference: http://cr.yp.to/docs/unixport.html Reference: http://h21007.www2.hp.com/portal/download/files/unprot/stk/solaris_stk/impac... Reference: http://refspecs.linuxfoundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-gene... Signed-off-by: Sami Kerola kerolasa@iki.fi
cronie_common.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
You should not do it as inline functions - either you need to create a common internal library that would be linked to both cronie and anacron - this is preferable. Or at least create the file as cronie_common.c and include it only once in cronie and once in anacron and only declare the functions in cronie_common.h as extern.
diff --git a/cronie_common.h b/cronie_common.h index 4ce172e..87699af 100644 --- a/cronie_common.h +++ b/cronie_common.h @@ -20,6 +20,8 @@ #ifndef CRONIE_COMMON_H #define CRONIE_COMMON_H
+#include <stdlib.h>
#ifndef __attribute__ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) # define __attribute__(x) /* empty */ @@ -34,4 +36,40 @@ # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) #endif
+static inline size_t get_hostname_max(void) {
- size_t len = sysconf(_SC_HOST_NAME_MAX);
- if (0 < len)
return len;
+#ifdef MAXHOSTNAMELEN
- return MAXHOSTNAMELEN;
+#elif HOST_NAME_MAX
- return HOST_NAME_MAX;
+#endif
- return 64;
+}
+static inline char *alloc_hostname_array(void) {
- char *array;
- size_t sz = get_hostname_max() + 1;
- array = malloc(sizeof (char) * sz);
- while (!array) {
usleep(1000);
array = malloc(sizeof (char) * sz);
- }
- return array;
+}
This is plain wrong - if malloc() fails it should be a failure and you should not retry.
+static inline char *xgethostname(void) {
- char *name = alloc_hostname_array();
- size_t sz = get_hostname_max();
- if (gethostname(name, sz) != 0)
return NULL;
- name[sz - 1] = '\0';
- return name;
+}
#endif /* CRONIE_COMMON_H */
This commit fixes couple corner case buffer overflows at few locations where earlier a hostname[MAXHOSTNAMELEN] array had been defined exactly to maximum lenght of a hostname. If a host is using maxium hostname length the string will not be null terminated.
Reference: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=kernel... Signed-off-by: Sami Kerola kerolasa@iki.fi --- anacron/runjob.c | 8 ++++---- src/crontab.c | 25 +++++++++++++++---------- src/database.c | 10 +++++++--- src/do_command.c | 6 ++++-- 4 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/anacron/runjob.c b/anacron/runjob.c index 18e16d7..8f72412 100644 --- a/anacron/runjob.c +++ b/anacron/runjob.c @@ -36,6 +36,7 @@ #include "global.h"
#include <langinfo.h> +#include "cronie_common.h"
static int temp_file(job_rec *jr) @@ -236,13 +237,11 @@ launch_job(job_rec *jr) { pid_t pid; int fd; - char hostname[512]; + char *hostname; char *mailto;
/* get hostname */ - if (gethostname(hostname, 512)) { - strcpy (hostname,"unknown machine"); - } + hostname = xgethostname();
setup_env(jr);
@@ -276,6 +275,7 @@ launch_job(job_rec *jr) xwrite(fd, "' on "); xwrite(fd, hostname); xwrite(fd, "\n\n"); + free(hostname);
jr->mail_header_size = file_size(fd);
diff --git a/src/crontab.c b/src/crontab.c index 5703a3b..7a4f4a3 100644 --- a/src/crontab.c +++ b/src/crontab.c @@ -91,7 +91,7 @@ static char *selinux_context = 0; static PID_T Pid; static char User[MAX_UNAME], RealUser[MAX_UNAME]; static char Filename[MAX_FNAME], TempFilename[MAX_FNAME]; -static char Host[MAXHOSTNAMELEN]; +static char *Host; static FILE *NewCrontab; static int CheckErrorCount; static int PromptOnDelete; @@ -327,9 +327,13 @@ static void parse_args(int argc, char *argv[]) {
if (Option == opt_hostset && argv[optind] != NULL) { HostSpecified = 1; - if (strlen(argv[optind]) >= sizeof Host) + if (get_hostname_max() < strlen(argv[optind])) usage("hostname too long"); - (void) strcpy(Host, argv[optind]); + Host = strdup(argv[optind]); + if (Host == NULL) { + fprintf(stderr, "host argument strdup failed\n"); + exit(ERROR_EXIT); + } optind++; }
@@ -455,10 +459,7 @@ static char *host_specific_filename(const char *filename, int prefix) */
static char safename[MAX_FNAME]; - char hostname[MAXHOSTNAMELEN]; - - if (gethostname(hostname, sizeof hostname) != 0) - return NULL; + char *hostname = xgethostname();
if (prefix) { if (!glue_strings(safename, sizeof safename, hostname, filename, '.')) @@ -909,7 +910,7 @@ static int hostset_cmd(void) { char *safename; if (!HostSpecified) - gethostname(Host, sizeof Host); + Host = xgethostname(); safename = host_specific_filename("tmp.XXXXXXXXXX", 1); if (!safename || !glue_strings(TempFilename, sizeof TempFilename, SPOOL_DIR, @@ -967,6 +968,7 @@ static int hostset_cmd(void) { (void) unlink(TempFilename); TempFilename[0] = '\0'; } + free(Host); return (error); }
@@ -984,12 +986,14 @@ static int hostget_cmd(void) { fprintf(stderr, "File %s not found\n", n); else perror(n); - return (-2); + return (-2); }
- if (get_string(Host, sizeof Host, f, "\n") == EOF) { + Host = alloc_hostname_array(); + if (get_string(Host, get_hostname_max() + 1, f, "\n") == EOF) { fprintf(stderr, "Error reading from %s\n", n); fclose(f); + free(Host); return (-2); }
@@ -999,6 +1003,7 @@ static int hostget_cmd(void) { fflush(stdout);
log_it(RealUser, Pid, "GET HOST", Host, 0); + free(Host); return (0); }
diff --git a/src/database.c b/src/database.c index 61764d7..30d0f00 100644 --- a/src/database.c +++ b/src/database.c @@ -43,6 +43,7 @@ # include <sys/inotify.h> #endif
+#include "cronie_common.h" #include "funcs.h" #include "globals.h" #include "pathnames.h" @@ -255,7 +256,7 @@ cluster_host_is_local(void) char filename[MAXNAMLEN+1]; int is_local; FILE *f; - char hostname[MAXHOSTNAMELEN], myhostname[MAXHOSTNAMELEN]; + char *hostname, *myhostname;
if (!EnableClustering) return (1); @@ -275,14 +276,17 @@ cluster_host_is_local(void) is_local = 0; if (glue_strings(filename, sizeof filename, SPOOL_DIR, CRON_HOSTNAME, '/')) { if ((f = fopen(filename, "r"))) { + hostname = alloc_hostname_array(); + myhostname = xgethostname();
- if (EOF != get_string(hostname, MAXHOSTNAMELEN, f, "\n") && - gethostname(myhostname, MAXHOSTNAMELEN) == 0) { + if (EOF != get_string(hostname, get_hostname_max() + 1, f, "\n")) { is_local = (strcmp(myhostname, hostname) == 0); } else { Debug(DLOAD, ("cluster: hostname comparison error\n")); }
+ free(hostname); + free(myhostname); fclose(f); } else { Debug(DLOAD, ("cluster: file %s not found\n", filename)); diff --git a/src/do_command.c b/src/do_command.c index cb3d9e9..45330a8 100644 --- a/src/do_command.c +++ b/src/do_command.c @@ -31,6 +31,7 @@ #include <sys/wait.h> #include <unistd.h>
+#include "cronie_common.h" #include "externs.h" #include "funcs.h" #include "globals.h" @@ -413,12 +414,12 @@ static int child_process(entry * e, char **jobenv) { && strncmp(MailCmd,"off",4) && !SyslogOutput) { char **env; char mailcmd[MAX_COMMAND]; - char hostname[MAXHOSTNAMELEN]; + char *hostname; char *content_type = env_get("CONTENT_TYPE", jobenv), *content_transfer_encoding = env_get("CONTENT_TRANSFER_ENCODING", jobenv);
- gethostname(hostname, MAXHOSTNAMELEN); + hostname = xgethostname();
if (MailCmd[0] == '\0') { if (snprintf(mailcmd, sizeof mailcmd, MAILFMT, MAILARG, mailfrom) @@ -439,6 +440,7 @@ static int child_process(entry * e, char **jobenv) { fprintf(mail, "To: %s\n", mailto); fprintf(mail, "Subject: Cron <%s@%s> %s\n", usernm, first_word(hostname, "."), e->cmd); + free(hostname);
#ifdef MAIL_DATE fprintf(mail, "Date: %s\n", arpadate(&StartTime));
The -n option needs argument, which was missing from the usage().
Signed-off-by: Sami Kerola kerolasa@iki.fi --- src/crontab.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/crontab.c b/src/crontab.c index 7a4f4a3..b20e258 100644 --- a/src/crontab.c +++ b/src/crontab.c @@ -121,7 +121,7 @@ static void usage(const char *msg) { fprintf(stderr, " -l list user's crontab\n"); fprintf(stderr, " -r delete user's crontab\n"); fprintf(stderr, " -i prompt before deleting\n"); - fprintf(stderr, " -n set host in cluster to run users' crontabs\n"); + fprintf(stderr, " -n <host> set host in cluster to run users' crontabs\n"); fprintf(stderr, " -c get host in cluster to run users' crontabs\n"); #ifdef WITH_SELINUX fprintf(stderr, " -s selinux context\n");
On Thu, 2013-01-17 at 11:58 +0000, Sami Kerola wrote:
On Wed, Jan 16, 2013 at 7:15 PM, Tomas Mraz tmraz@redhat.com wrote:
Not really, the patches from your batch that were not commented about were already commited. The rest of them are waiting for you to fix or drop.
Hi Tomas & Marcela,
Oh, sorry. My bad. I wrote corrections to the patches but did not submit them to list, but pushed only to my branch at github. I do not know what I were thinking, but perhaps submission later is better than never. Notice that the patches I sent yesterday are these six without 'signed-off-by' lines, feel free to use them if signing is not preferred.
I've applied patches commits 1,2 and 6. The rest of them still needs work.
cronie-devel@lists.fedorahosted.org