* IN THE SOFTWARE.
*/
+#include <sys/types.h>
+#include <sys/param.h>
#include <sys/limits.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
return (true);
}
-time_t
-ctrltimet(struct mlmmj_list *list, const char *ctrlstr)
+static intmax_t
+ctrlim(struct mlmmj_list *list, const char *ctrlstr, intmax_t min, intmax_t max)
{
const char *errstr;
char *val = ctrlvalue(list, ctrlstr);
if (val == NULL)
return (0);
- ret = strtotimet(val, &errstr);
+ ret = strtoim(val, min, max, &errstr);
if (errstr != NULL) {
log_error(LOG_ARGS, "Invalid value for '%s': %s", ctrlstr, errstr);
}
return (ret);
}
-long
-ctrllong(struct mlmmj_list *list, const char *ctrlstr)
+time_t
+ctrltimet(struct mlmmj_list *list, const char *ctrlstr)
{
const char *errstr;
char *val = ctrlvalue(list, ctrlstr);
- long ret;
+ time_t ret;
if (val == NULL)
return (0);
- ret = strtoim(val, LONG_MIN, LONG_MAX, &errstr);
+ ret = strtotimet(val, &errstr);
if (errstr != NULL) {
log_error(LOG_ARGS, "Invalid value for '%s': %s", ctrlstr, errstr);
}
return (ret);
}
+long
+ctrllong(struct mlmmj_list *list, const char *ctrlstr)
+{
+ return (ctrlim(list, ctrlstr, LONG_MIN, LONG_MAX));
+}
+
int
ctrlint(struct mlmmj_list *list, const char *ctrlstr)
{
- const char *errstr;
- char *val = ctrlvalue(list, ctrlstr);
- int ret;
-
- if (val == NULL)
- return (0);
-
- ret = strtoim(val, INT_MIN, INT_MAX, &errstr);
- if (errstr != NULL) {
- log_error(LOG_ARGS, "Invalid value for '%s': %s", ctrlstr, errstr);
- }
- free(val);
- return (ret);
+ return (ctrlim(list, ctrlstr, INT_MIN, INT_MAX));
}
size_t
{
const char *errstr;
char *val = ctrlvalue(list, ctrlstr);
- size_t ret;
+ time_t ret;
if (val == NULL)
return (0);
- ret = strtoim(val, 0, SIZE_T_MAX, &errstr);
+ ret = strtouim(val, 0, SIZE_MAX, &errstr);
if (errstr != NULL) {
log_error(LOG_ARGS, "Invalid value for '%s': %s", ctrlstr, errstr);
}
ATF_TC(unsubscribe);
ATF_TC(lowercase);
ATF_TC(subbed);
+ATF_TC(controls);
ATF_TC_HEAD(random_int, tc) { }
ATF_TC_HEAD(statctrl, tc) { }
ATF_TC_HEAD(unsubscribe, tc) {}
ATF_TC_HEAD(lowercase, tc) {}
ATF_TC_HEAD(subbed, tc) {}
+ATF_TC_HEAD(controls, tc) {}
#ifndef NELEM
#define NELEM(array) (sizeof(array) / sizeof((array)[0]))
ATF_REQUIRE_EQ(errno, EINVAL);
ATF_REQUIRE(errp != NULL);
ATF_REQUIRE_STREQ(errp, "invalid");
+
+
+ ATF_REQUIRE_EQ(strtouim(NULL, 0, 10, &errp), 0);
+ ATF_REQUIRE(errp != NULL);
+ ATF_REQUIRE_STREQ(errp, "invalid");
+ ATF_REQUIRE_EQ(strtouim("10", 0, 10, &errp), 10);
+ ATF_CHECK(errp == NULL);
+ ATF_REQUIRE_EQ(strtouim("10", 0, 9, &errp), 0);
+ ATF_REQUIRE(errp != NULL);
+ ATF_REQUIRE_STREQ(errp, "too large");
+ ATF_REQUIRE_EQ(strtouim("1", 2, 9, &errp), 0);
+ ATF_REQUIRE(errp != NULL);
+ ATF_REQUIRE_STREQ(errp, "too small");
+ ATF_REQUIRE_EQ(strtouim("-1", 0, 9, &errp), 0);
+ ATF_REQUIRE(errp != NULL);
+ ATF_REQUIRE_STREQ(errp, "too large");
+ ATF_REQUIRE_EQ(strtouim("-1", 10, 9, &errp), 0);
+ ATF_REQUIRE(errp != NULL);
+ ATF_REQUIRE_STREQ(errp, "invalid");
+ ATF_REQUIRE_EQ(strtouim("ba12", 0, 9, &errp), 0);
+ ATF_REQUIRE_EQ(errno, EINVAL);
+ ATF_REQUIRE(errp != NULL);
+ ATF_REQUIRE_STREQ(errp, "invalid");
}
ATF_TC_BODY(strtotimet, tc)
ATF_CHECK_EQ(is_subbed(&list, "john@doe.org", false), SUB_NOMAIL);
}
+ATF_TC_BODY(controls, tc)
+{
+ struct mlmmj_list list;
+ init_ml(true);
+ mlmmj_list_init(&list);
+ list.dir = "list";
+
+ ATF_CHECK(mlmmj_list_open(&list));
+ ATF_REQUIRE_EQ(rename("list/control", "list/notcontrol"), 0);
+ pid_t p = atf_utils_fork();
+ close(list.controlfd);
+ list.controlfd = -1;
+ if (p == 0) {
+ ctrlcontent(&list, "plop");
+ }
+ atf_utils_wait(p, 1, "", "mlmmj: Unable to open list/control\n");
+ ATF_REQUIRE_EQ(rename("list/notcontrol", "list/control"), 0);
+ ATF_REQUIRE_EQ(ctrlcontent(&list, "plop"), NULL);
+ ATF_REQUIRE_STREQ(ctrlcontent(&list, "listaddress"), "test@test");
+ ATF_REQUIRE_EQ(ctrltimet(&list, "listaddress"), 0);
+ ATF_REQUIRE_EQ(ctrltimet(&list, "plop"), 0);
+ FILE *f = fopen("list/control/val", "w");
+ fputs("12",f);
+ fclose(f);
+ ATF_REQUIRE_EQ(ctrltimet(&list, "val"), 12);
+ ATF_REQUIRE_EQ(ctrllong(&list, "listaddress"), 0);
+ ATF_REQUIRE_EQ(ctrllong(&list, "plop"), 0);
+ ATF_REQUIRE_EQ(ctrllong(&list, "val"), 12);
+ ATF_REQUIRE_EQ(ctrlint(&list, "listaddress"), 0);
+ ATF_REQUIRE_EQ(ctrlint(&list, "plop"), 0);
+ ATF_REQUIRE_EQ(ctrlint(&list, "val"), 12);
+ ATF_REQUIRE_EQ(ctrlsizet(&list, "listaddress"), 0);
+ ATF_REQUIRE_EQ(ctrlsizet(&list, "plop"), 0);
+ ATF_REQUIRE_EQ(ctrlsizet(&list, "val"), 12);
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, random_int);
ATF_TP_ADD_TC(tp, unsubscribe);
ATF_TP_ADD_TC(tp, lowercase);
ATF_TP_ADD_TC(tp, subbed);
+ ATF_TP_ADD_TC(tp, controls);
return (atf_no_error());
}