0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering/***
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering This file is part of systemd.
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering Copyright 2016 Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering systemd is free software; you can redistribute it and/or modify it
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering under the terms of the GNU Lesser General Public License as published by
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering (at your option) any later version.
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering systemd is distributed in the hope that it will be useful, but
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering Lesser General Public License for more details.
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering You should have received a copy of the GNU Lesser General Public License
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering***/
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering#include "ordered-set.h"
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering#include "strv.h"
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poetteringint ordered_set_consume(OrderedSet *s, void *p) {
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering int r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering r = ordered_set_put(s, p);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering if (r <= 0)
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering free(p);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering return r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering}
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poetteringint ordered_set_put_strdup(OrderedSet *s, const char *p) {
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering char *c;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering int r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering assert(s);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering assert(p);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering c = strdup(p);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering if (!c)
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering return -ENOMEM;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering r = ordered_set_consume(s, c);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering if (r == -EEXIST)
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering return 0;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering return r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering}
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poetteringint ordered_set_put_strdupv(OrderedSet *s, char **l) {
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering int n = 0, r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering char **i;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering STRV_FOREACH(i, l) {
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering r = ordered_set_put_strdup(s, *i);
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering if (r < 0)
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering return r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering n += r;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering }
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering return n;
0061695507e889069c0c974cf85cd570f7ec9a88Lennart Poettering}