131 lines
3.5 KiB
C++
131 lines
3.5 KiB
C++
/*
|
|
Copyright (C) 2003 Ferdi Franceschini <ferdif@optusnet.com.au>
|
|
|
|
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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*! \file
|
|
* Create a per user temporary directory for dpi sockets
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <stdlib.h>
|
|
#include "dpid_common.hh"
|
|
#include "dpi.hh"
|
|
#include "misc_new.hh"
|
|
#include "dpi_socket_dir.hh" /* 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_;
|
|
const char *logname;
|
|
|
|
logname = getenv("LOGNAME") ? getenv("LOGNAME") : "flenser";
|
|
template_ = dStrconcat("/tmp/", logname, "-", "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
|
|
* ~/.flenser/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",
|
|
dpi_socket_dir);
|
|
} 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);
|
|
}
|