From 93715c46a99c96d6c866968312691ec9ab0f6a03 Mon Sep 17 00:00:00 2001 From: jcid Date: Sun, 7 Oct 2007 00:36:34 +0200 Subject: Initial revision --- dpid/dpi_socket_dir.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 dpid/dpi_socket_dir.c (limited to 'dpid/dpi_socket_dir.c') diff --git a/dpid/dpi_socket_dir.c b/dpid/dpi_socket_dir.c new file mode 100644 index 00000000..c18faf0d --- /dev/null +++ b/dpid/dpi_socket_dir.c @@ -0,0 +1,128 @@ +/* + Copyright (C) 2003 Ferdi Franceschini + + 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 3 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 + */ + +/*! \file + * Create a per user temporary directory for dpi sockets + */ + +#include +#include "dpid_common.h" +#include "dpi.h" +#include "misc_new.h" +#include "dpi_socket_dir.h" /* for function prototypes */ + +/*! Save socket directory name in ~/.dillo/dpi_socket_dir + * \Return + * \li 1 on success + * \li -1 on failure + */ +int w_dpi_socket_dir(char *dirname, char *sockdir) +{ + FILE *dir; + + if ((dir = fopen(dirname, "w")) == NULL) { + ERRMSG("w_dpi_socket_dir", "fopen", errno); + return (-1); + } + fprintf(dir, "%s", sockdir); + fclose(dir); + return (1); +} + +/*! Test that socket directory exists and is a directory + * \Return + * \li 1 on success + * \li 0 on failure + * \bug Does not check permissions or that it's a symbolic link + * to another directory. + */ +int tst_dir(char *dir) +{ + char *dirtest; + int ret = 0; + + /* test for a directory */ + dirtest = dStrconcat(dir, "/", NULL); + if (access(dirtest, F_OK) == -1) { + ERRMSG("tst_dir", "access", errno); + MSG_ERR(" - %s\n", dirtest); + } else { + ret = 1; + } + dFree(dirtest); + + return ret; +} + +/*! Create socket directory + * \Return + * \li Socket directory path on success + * \li NULL on failure + */ +char *mk_sockdir(void) +{ + char *template; + + template = dStrconcat("/tmp/", getlogin(), "-", "XXXXXX", NULL); + if (a_Misc_mkdtemp(template) == NULL) { + ERRMSG("mk_sockdir", "a_Misc_mkdtemp", 0); + MSG_ERR(" - %s\n", template); + dFree(template); + return (NULL); + } + return template; +} + +/*! Create socket directory if it does not exist and save its name in + * ~/.dillo/dpi_socket_dir. + * \Return + * \li Socket directory name on success + * \li NULL on failure. + */ +char *init_sockdir(char *dpi_socket_dir) +{ + char *sockdir = NULL; + int dir_ok = 0; + + if ((sockdir = a_Dpi_rd_dpi_socket_dir(dpi_socket_dir)) == NULL) { + MSG_ERR("init_sockdir: The dpi_socket_dir file %s does not exist\n", + sockdir); + } else { + if ((dir_ok = tst_dir(sockdir)) == 1) { + MSG_ERR("init_sockdir: The socket directory %s exists and is OK\n", + sockdir); + } else { + MSG_ERR("init_sockdir: The socket directory %s does not exist " + "or is not a directory\n", sockdir); + dFree(sockdir); + } + } + if (!dir_ok) { + sockdir = mk_sockdir(); + if (sockdir == NULL) { + ERRMSG("init_sockdir", "mk_sockdir", 0); + MSG_ERR(" - Failed to create dpi socket directory\n"); + } else if ((w_dpi_socket_dir(dpi_socket_dir, sockdir)) == -1) { + ERRMSG("init_sockdir", "w_dpi_socket_dir", 0); + MSG_ERR(" - failed to save %s\n", sockdir); + dFree(sockdir); + sockdir = NULL; + } + } + return (sockdir); +} -- cgit v1.2.3