chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
calendar: make freeing a calendar spec object deal fine with NULL
[elogind.git]
/
src
/
shared
/
calendarspec.c
diff --git
a/src/shared/calendarspec.c
b/src/shared/calendarspec.c
index c2eae3f139cd542241d4cdd978db390fd0be21c4..4ac74ab0a2066028bc0079bc6b7f322fc4256f1e 100644
(file)
--- a/
src/shared/calendarspec.c
+++ b/
src/shared/calendarspec.c
@@
-35,7
+35,9
@@
static void free_chain(CalendarComponent *c) {
}
void calendar_spec_free(CalendarSpec *c) {
}
void calendar_spec_free(CalendarSpec *c) {
- assert(c);
+
+ if (!c)
+ return;
free_chain(c->year);
free_chain(c->month);
free_chain(c->year);
free_chain(c->month);
@@
-133,7
+135,7
@@
int calendar_spec_normalize(CalendarSpec *c) {
return 0;
}
return 0;
}
-static bool chain_valid(CalendarComponent *c, int from, int to) {
+
_pure_
static bool chain_valid(CalendarComponent *c, int from, int to) {
if (!c)
return true;
if (!c)
return true;
@@
-149,7
+151,7
@@
static bool chain_valid(CalendarComponent *c, int from, int to) {
return true;
}
return true;
}
-bool calendar_spec_valid(CalendarSpec *c) {
+
_pure_
bool calendar_spec_valid(CalendarSpec *c) {
assert(c);
if (c->weekdays_bits > 127)
assert(c);
if (c->weekdays_bits > 127)
@@
-391,7
+393,7
@@
static int prepend_component(const char **p, CalendarComponent **c) {
errno = 0;
value = strtoul(*p, &e, 10);
errno = 0;
value = strtoul(*p, &e, 10);
- if (errno
!=
0)
+ if (errno
>
0)
return -errno;
if (e == *p)
return -EINVAL;
return -errno;
if (e == *p)
return -EINVAL;
@@
-400,7
+402,7
@@
static int prepend_component(const char **p, CalendarComponent **c) {
if (*e == '/') {
repeat = strtoul(e+1, &ee, 10);
if (*e == '/') {
repeat = strtoul(e+1, &ee, 10);
- if (errno
!=
0)
+ if (errno
>
0)
return -errno;
if (ee == e+1)
return -EINVAL;
return -errno;
if (ee == e+1)
return -EINVAL;
@@
-653,7
+655,18
@@
int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
if (!c)
return -ENOMEM;
if (!c)
return -ENOMEM;
- if (strcasecmp(p, "hourly") == 0) {
+ if (strcaseeq(p, "hourly")) {
+ r = const_chain(0, &c->minute);
+ if (r < 0)
+ goto fail;
+ r = const_chain(0, &c->second);
+ if (r < 0)
+ goto fail;
+
+ } else if (strcaseeq(p, "daily")) {
+ r = const_chain(0, &c->hour);
+ if (r < 0)
+ goto fail;
r = const_chain(0, &c->minute);
if (r < 0)
goto fail;
r = const_chain(0, &c->minute);
if (r < 0)
goto fail;
@@
-661,7
+674,10
@@
int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
if (r < 0)
goto fail;
if (r < 0)
goto fail;
- } else if (strcasecmp(p, "daily") == 0) {
+ } else if (strcaseeq(p, "monthly")) {
+ r = const_chain(1, &c->day);
+ if (r < 0)
+ goto fail;
r = const_chain(0, &c->hour);
if (r < 0)
goto fail;
r = const_chain(0, &c->hour);
if (r < 0)
goto fail;
@@
-672,7
+688,10
@@
int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
if (r < 0)
goto fail;
if (r < 0)
goto fail;
- } else if (strcasecmp(p, "monthly") == 0) {
+ } else if (strcaseeq(p, "anually") || strcaseeq(p, "yearly")) {
+ r = const_chain(1, &c->month);
+ if (r < 0)
+ goto fail;
r = const_chain(1, &c->day);
if (r < 0)
goto fail;
r = const_chain(1, &c->day);
if (r < 0)
goto fail;
@@
-686,7
+705,7
@@
int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
if (r < 0)
goto fail;
if (r < 0)
goto fail;
- } else if (strcase
cmp(p, "weekly") == 0
) {
+ } else if (strcase
eq(p, "weekly")
) {
c->weekdays_bits = 1;
c->weekdays_bits = 1;
@@
-921,7
+940,6
@@
int calendar_spec_next_usec(const CalendarSpec *spec, usec_t usec, usec_t *next)
if (t == (time_t) -1)
return -EINVAL;
if (t == (time_t) -1)
return -EINVAL;
-
*next = (usec_t) t * USEC_PER_SEC;
return 0;
}
*next = (usec_t) t * USEC_PER_SEC;
return 0;
}