You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/ktalkd/ktalkd/readconf.cpp

189 lines
6.1 KiB

/*
* readconf.cpp
*
* Routines for reading talkd.conf and .talkdrc
*
* Copyright 1999-2002, David Faure, faure@kde.org
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* (BSD License, from tdelibs/doc/common/bsd-license.html)
*
*/
#include <pwd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <syslog.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include "proto.h"
#include "readconf.h"
#include "defs.h"
FILE * fd;
int booleanresult(const char * s)
{
if (strlen(s)==1)
{ return atoi(s); }
else if ((!strncasecmp(s,"on",2))||(!strncasecmp(s,"true",4))) {return 1;}
else if ((!strncasecmp(s,"off",3))||(!strncasecmp(s,"false",5))){return 0;}
else {
syslog(LOG_ERR,"Wrong boolean value %s in %s",s,TALKD_CONF);
return 0;
}
}
/* obsolete routine, but still used for .talkdrc */
int read_user_config(const char * key, char * result, int max)
{
char * value;
char * buff = new char[S_CFGLINE];
char * ret;
fseek(fd,0,SEEK_SET);
do {
ret = fgets(buff,S_CFGLINE,fd);
} while ((ret) && (strncasecmp(buff,key,strlen(key))));
if (ret) {
value = strchr(buff,':')+1;
while (isspace(*value)) value++; /* get rid of spaces, tabs... */
strncpy(result,value,max);
result[max-1]='\0'; /* in case it was longer than max chars */
char * lastchar = result + strlen(result) - 1; /* points to last char */
if (*lastchar=='\n') *lastchar = '\0'; /* get rid of \n */
}
delete buff;
if (Options.debug_mode) {
if (ret)
syslog(LOG_DEBUG,"read_user_config : %s, %s",key,result);
else
syslog(LOG_DEBUG,"read_user_config : %s -> not found",key);
}
return (ret) ? 1 : 0;
}
int read_bool_user_config(const char * key, int * result)
{
char msgtmpl[S_CFGLINE];
int ret = read_user_config(key, msgtmpl, S_CFGLINE); // ret=1 if found
if (ret!=0) *result = booleanresult(msgtmpl);
return ret;
}
int init_user_config(const char * l_name)
{
#define S_MSGPATH 50
char msgpath[S_MSGPATH];
struct passwd * pw = getpwnam(l_name);
if (!pw) return 0;
else {
snprintf(msgpath, S_MSGPATH, "%s/.talkdrc", pw->pw_dir);
endpwent();
fd=fopen(msgpath, "r");
return (fd != 0);
}
}
void end_user_config()
{
fclose(fd);
}
/* routine for reading talkd.conf */
int process_config_file(void)
{
FILE * fd = fopen(TALKD_CONF,"r");
char * ret;
char buff[S_CFGLINE];
char * result;
#define found(k) (!strncasecmp(buff,k,strlen(k)))
if (!fd) { return 0; }
do {
ret = fgets(buff,S_CFGLINE,fd);
if ((ret) && (*buff!='#') && ((result = strchr(buff,':')))) {
result++;
while (isspace(*result))
result++; /* get rid of spaces, tabs... */
result[strlen(result)-1]='\0'; /* get rid of \n */
if (found("AnswMach:")) {
Options.answmach=booleanresult(result);
debug("AnswMach : %d",Options.answmach);}
if (found("XAnnounce:")) {
Options.XAnnounce=booleanresult(result);
debug("XAnnounce : %d",Options.XAnnounce); }
if (found("Time:")) {
Options.time_before_answmach=atoi(result);
debug("Time : %d",Options.time_before_answmach); }
if (found("Sound:")) {
Options.sound=booleanresult(result);
debug("Sound : %d",Options.sound); }
if (found("SoundFile:")) {
strncpy(Options.soundfile,result,S_CFGLINE);
debug("SoundFile =");debug(Options.soundfile); }
if (found("SoundPlayer:")) {
strncpy(Options.soundplayer,result,S_CFGLINE);
debug("SoundPlayer ="); debug(result); }
if (found("SoundPlayerOpt:")) {
strncpy(Options.soundplayeropt,result,S_CFGLINE);
debug("SoundPlayerOpt ="); debug(result); }
if (found("MailProg:")) {
strncpy(Options.mailprog,result,S_CFGLINE);
debug("Mail prog ="); debug(result); }
/* text based announcement */
if (found("Announce1")) { strncpy(Options.announce1,result,S_CFGLINE); }
if (found("Announce2")) { strncpy(Options.announce2,result,S_CFGLINE); }
if (found("Announce3")) { strncpy(Options.announce3,result,S_CFGLINE); }
if (found("NEUUser")) { strncpy(Options.NEU_user,result,S_INVITE_LINES); }
if (found("NEUBehaviour")) { Options.NEU_behaviour=booleanresult(result); }
if (found("NEUBanner1")) { strncpy(Options.NEUBanner1,result,S_CFGLINE); }
if (found("NEUBanner2")) { strncpy(Options.NEUBanner2,result,S_CFGLINE); }
if (found("NEUBanner3")) { strncpy(Options.NEUBanner3,result,S_CFGLINE); }
if (found("NEUForwardMethod")) { strncpy(Options.NEU_forwardmethod,result,5); }
}
} while (ret);
fclose(fd);
return 1;
}