meillo@0: /* MasqMail meillo@0: Copyright (C) 1999-2001 Oliver Kurth meillo@0: meillo@0: This program is free software; you can redistribute it and/or modify meillo@0: it under the terms of the GNU General Public License as published by meillo@0: the Free Software Foundation; either version 2 of the License, or meillo@0: (at your option) any later version. meillo@0: meillo@0: This program is distributed in the hope that it will be useful, meillo@0: but WITHOUT ANY WARRANTY; without even the implied warranty of meillo@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the meillo@0: GNU General Public License for more details. meillo@0: meillo@0: You should have received a copy of the GNU General Public License meillo@0: along with this program; if not, write to the Free Software meillo@0: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. meillo@0: */ meillo@0: meillo@0: #include meillo@0: #include meillo@0: #include "masqmail.h" meillo@0: #include "mserver.h" meillo@0: #include "peopen.h" meillo@0: meillo@0: gchar *connection_name; meillo@0: meillo@0: void set_online_name(gchar *name) meillo@0: { meillo@0: connection_name = g_strdup(name); meillo@0: } meillo@0: meillo@0: static meillo@0: gchar *detect_online_pipe(const gchar *pipe) meillo@0: { meillo@0: pid_t pid; meillo@0: void (*old_signal)(int); meillo@0: int status; meillo@0: FILE *in; meillo@0: gchar *name = NULL; meillo@0: meillo@0: old_signal = signal(SIGCHLD, SIG_DFL); meillo@0: meillo@0: in = peopen(pipe, "r", environ, &pid); meillo@0: if(in != NULL){ meillo@0: gchar output[256]; meillo@0: if(fgets(output, 255, in)){ meillo@0: g_strchomp(output); meillo@0: name = g_strdup(output); meillo@0: } meillo@0: fclose(in); meillo@0: waitpid(pid, &status, 0); meillo@0: if(WEXITSTATUS(status) != EXIT_SUCCESS){ meillo@0: g_free(name); meillo@0: name = NULL; meillo@0: } meillo@0: }else meillo@0: logwrite(LOG_ALERT, "could not open pipe '%s': %s\n", pipe, strerror(errno)); meillo@0: meillo@0: signal(SIGCHLD, old_signal); meillo@0: meillo@0: return name; meillo@0: } meillo@0: meillo@0: gchar *detect_online() meillo@0: { meillo@0: if(conf.online_detect != NULL){ meillo@0: if(strcmp(conf.online_detect, "file") == 0){ meillo@0: DEBUG(3) debugf("online detection method 'file'\n"); meillo@0: if(conf.online_file != NULL){ meillo@0: struct stat st; meillo@0: if(stat(conf.online_file, &st) == 0){ meillo@0: FILE *fptr = fopen(conf.online_file, "r"); meillo@0: if(fptr){ meillo@0: char buf[256]; meillo@0: fgets(buf, 256, fptr); meillo@0: g_strchomp(buf); meillo@0: fclose(fptr); meillo@0: return g_strdup(buf); meillo@0: }else{ meillo@0: logwrite(LOG_ALERT, "opening of %s failed: %s\n", meillo@0: conf.online_file, strerror(errno)); meillo@0: return NULL; meillo@0: } meillo@0: } meillo@0: else if(errno == ENOENT){ meillo@0: logwrite(LOG_NOTICE, "not online.\n"); meillo@0: return NULL; meillo@0: }else{ meillo@0: logwrite(LOG_ALERT, "stat of %s failed: %s", meillo@0: conf.online_file, strerror(errno)); meillo@0: return NULL; meillo@0: } meillo@0: }else meillo@0: logwrite(LOG_ALERT, meillo@0: "online detection mode is 'file', " meillo@0: "but online_file is undefined\n"); meillo@0: #ifdef ENABLE_MSERVER meillo@0: }else if(strcmp(conf.online_detect, "mserver") == 0){ meillo@0: DEBUG(3) debugf("connection method 'mserver'\n"); meillo@0: return mserver_detect_online(conf.mserver_iface); meillo@0: #endif meillo@0: }else if(strcmp(conf.online_detect, "pipe") == 0){ meillo@0: DEBUG(3) debugf("connection method 'pipe'\n"); meillo@0: if(conf.online_pipe) meillo@0: return detect_online_pipe(conf.online_pipe); meillo@0: else{ meillo@0: logwrite(LOG_ALERT, meillo@0: "online detection mode is 'pipe', " meillo@0: "but online_pipe is undefined\n"); meillo@0: return NULL; meillo@0: } meillo@0: }else if(strcmp(conf.online_detect, "argument") == 0){ meillo@0: return connection_name; meillo@0: }else{ meillo@0: DEBUG(3) debugf("no connection method selected\n"); meillo@0: } meillo@0: } meillo@0: return NULL; meillo@0: }