X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Futils.c;fp=ltt-sessiond%2Futils.c;h=936d3e1b891034321e4f79c48b0ff2b14729d72e;hp=0000000000000000000000000000000000000000;hb=8e68d1c8b15ef989f1abac8a241827013a5d4623;hpb=7d452e122923ade6f4dc7a6e21bef105851d79e3 diff --git a/ltt-sessiond/utils.c b/ltt-sessiond/utils.c new file mode 100644 index 000000000..936d3e1b8 --- /dev/null +++ b/ltt-sessiond/utils.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2011 - David Goulet + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +int mkdir_recursive(const char *path, mode_t mode) +{ + int ret; + char *p, tmp[PATH_MAX]; + size_t len; + mode_t old_umask; + + ret = snprintf(tmp, sizeof(tmp), "%s", path); + if (ret < 0) { + perror("snprintf mkdir"); + goto error; + } + + len = ret; + if (tmp[len - 1] == '/') { + tmp[len - 1] = 0; + } + + old_umask = umask(0); + for (p = tmp + 1; *p; p++) { + if (*p == '/') { + *p = 0; + ret = mkdir(tmp, mode); + if (ret < 0) { + if (!(errno == EEXIST)) { + perror("mkdir recursive"); + ret = errno; + goto umask_error; + } + } + *p = '/'; + } + } + + ret = mkdir(tmp, mode); + if (ret < 0) { + ret = errno; + } + +umask_error: + umask(old_umask); +error: + return ret; +}