aboutsummaryrefslogtreecommitdiff
path: root/src/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/options.c')
-rw-r--r--src/options.c1051
1 files changed, 1051 insertions, 0 deletions
diff --git a/src/options.c b/src/options.c
new file mode 100644
index 0000000..65dd08d
--- /dev/null
+++ b/src/options.c
@@ -0,0 +1,1051 @@
+/*
+ * options.c
+ *
+ * Low-level option handling
+ *
+ * (c) 2002-2005 Thomas White <taw27@srcf.ucam.org>
+ * Part of TuxMessenger - GTK+-based MSN Messenger client
+ *
+ * This package 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; version 2 dated June, 1991.
+ *
+ * This package 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 package; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <glob.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "accountwindow.h"
+#include "options.h"
+#include "msngenerics.h"
+#include "mainwindow.h"
+#include "error.h"
+#include "routines.h"
+#include "listcache.h"
+
+#define DEFAULT_HOSTNAME "messenger.hotmail.com"
+#define DEFAULT_WGET "/usr/bin/wget"
+
+static struct {
+
+ char *username;
+ char *password;
+ unsigned int rememberlogindetails;
+
+ char *hostname;
+ unsigned int port;
+
+ char *wget;
+
+ char *gtc; /* Special - comes from list cache. */
+ char *blp; /* Special - comes from list cache. */
+
+ unsigned int hideoffline; /* Hide offline contacts? */
+ unsigned int hidecsm; /* Hide local CSM? */
+
+ GdkColor *localcolour_gdk; /* Colour for local user's messages. */
+ char *localcolour_string; /* String version of the above. */
+ unsigned int ofontoverride; /* Override other contacts' chosen fonts/colours? */
+ GdkColor *ocolour_gdk; /* Colour to override contacts' messages with. */
+ char *localfont; /* Font for local user's messages. */
+ char *ofont; /* Font to use for contacts' messages (if overriding). */
+
+ unsigned int ircstyle; /* Use IRC style for new IM windows? */
+ unsigned int timestamps; /* Show timestamps for messages in new IM windows? */
+ unsigned int showavatars; /* Display avatars in new IM windows? */
+ unsigned int showemoticons; /* Show emoticons in new IM windows? */
+
+} options = {
+
+ NULL, /* Username */
+ NULL, /* Password */
+ 0, /* Remember login details */
+
+ NULL, /* Hostname */
+ 0, /* Port */
+
+ NULL, /* Wget */
+
+ NULL, /* GTC */
+ NULL, /* BLP */
+
+ FALSE, /* Hide offline */
+ FALSE, /* Hide CSM */
+
+ NULL, /* localcolour_gdk */
+ NULL, /* localcolour_string */
+ FALSE, /* ofontoverride */
+ NULL, /* ocolour_gdk */
+ NULL, /* localfont */
+ NULL, /* ofont */
+
+ 0, /* ircstyle */
+ 0, /* timestamps */
+ 0, /* showavatars */
+ 0 /* showemoticons */
+
+};
+
+static void options_setdefaults() {
+
+ options.username = strdup("");
+ options.password = strdup("");
+ options.rememberlogindetails = 0;
+
+ options.hostname = strdup(DEFAULT_HOSTNAME);
+ options.port = DEFAULT_NS_PORT;
+
+ options.wget = strdup(DEFAULT_WGET);
+
+ options.gtc = strdup("BL");
+ options.blp = strdup("A");
+
+ options.hideoffline = FALSE;
+ options.hidecsm = FALSE;
+ options.ofontoverride = FALSE;
+
+ options.localcolour_gdk = NULL;
+ options.localcolour_string = NULL;
+ options.ocolour_gdk = NULL;
+ options.localfont = NULL;
+ options.ofont = NULL;
+
+ options.ircstyle = 0;
+ options.timestamps = 0;
+ options.showavatars = 0;
+ options.showemoticons = 0;
+
+}
+
+static void options_createhomedir(char *filename) {
+
+ char *av_name;
+ char *hg_name;
+
+ /* Create directory. */
+ if ( mkdir(filename, S_IRUSR | S_IWUSR | S_IXUSR) != 0 ) {
+ debug_print("OP: Couldn't create ~/.tuxmessenger directory.\n");
+ exit(1);
+ }
+
+ /* Create "avatars" subdirectory. */
+ av_name = malloc(strlen(filename) + 9);
+ strcpy(av_name, filename);
+ strcat(av_name, "/avatars");
+ if ( mkdir(av_name, S_IRUSR | S_IWUSR | S_IXUSR) != 0 ) {
+ debug_print("OP: Couldn't create ~/.tuxmessenger/avatars directory.\n");
+ exit(1);
+ }
+ free(av_name);
+
+ /* Link the "Hourglass", "Default" and "Own" avatars. */
+ hg_name = malloc(strlen(filename) + 20);
+
+ strcpy(hg_name, filename);
+ strcat(hg_name, "/wait_avatar.png");
+ if ( symlink(DATADIR"/tuxmessenger/hourglass.png", hg_name) != 0 ) {
+ debug_print("OP: Couldn't create ~/.tuxmessenger/wait_avatar.png.\n");
+ exit(1);
+ }
+
+ strcpy(hg_name, filename);
+ strcat(hg_name, "/default_avatar.png");
+ if ( symlink(DATADIR"/tuxmessenger/no_avatar.png", hg_name) != 0 ) {
+ debug_print("OP: Couldn't create ~/.tuxmessenger/default_avatar.png.\n");
+ exit(1);
+ }
+
+ strcpy(hg_name, filename);
+ strcat(hg_name, "/avatar.png");
+ if ( symlink(DATADIR"/tuxmessenger/no_avatar.png", hg_name) != 0 ) {
+ debug_print("OP: Couldn't create ~/.tuxmessenger/avatar.png.\n");
+ exit(1);
+ }
+
+ free(hg_name);
+
+}
+
+static void options_bailout() {
+
+ options_setdefaults();
+ accountwindow_open();
+
+}
+
+void options_setusername(const char *username) {
+
+ unsigned int changed = FALSE;
+
+ if ( (username != NULL) && (options.username != NULL) && (strcmp(options.username, "") != 0) && (strcmp(username, options.username) != 0) ) {
+ changed = TRUE;
+ }
+
+ if ( options.username != NULL ) {
+ free(options.username);
+ }
+ options.username = strdup(username);
+
+ if ( changed ) {
+ listcache_setcsm("");
+ listcache_invalidate();
+ }
+
+}
+
+void options_setpassword(const char *password) {
+
+ if ( options.password != NULL ) {
+ free(options.password);
+ }
+ options.password = strdup(password);
+
+}
+
+void options_sethostname(const char *hostname) {
+
+ if ( options.hostname != NULL ) {
+ free(options.hostname);
+ }
+ if ( strlen(hostname) > 0 ) {
+ options.hostname = strdup(hostname);
+ } else {
+ debug_print("OP: Using default server hostname instead of zero-length string.\n");
+ options.hostname = strdup(DEFAULT_HOSTNAME);
+ }
+
+}
+
+void options_setport(const int port) {
+
+ options.port = port;
+ if ( options.port == 0 ) {
+ /* That's just plain silly. */
+ debug_print("OP: Correcting port number: 0->%i.\n", DEFAULT_NS_PORT);
+ options_setport(DEFAULT_NS_PORT);
+ }
+ if ( options.port > 65535 ) {
+ /* D'oh */
+ debug_print("OP: Port number too large: correcting to %i\n", DEFAULT_NS_PORT);
+ options_setport(DEFAULT_NS_PORT);
+ }
+
+}
+
+void options_setwget(const char *wget) {
+
+ if ( options.wget != NULL ) {
+ free(options.wget);
+ }
+ if ( strlen(wget) > 0 ) {
+ options.wget = strdup(wget);
+ } else {
+ debug_print("OP: Using default wget instead of zero-length string.\n");
+ options.wget = strdup(DEFAULT_WGET);
+ }
+
+}
+
+void options_setrememberlogindetails(unsigned int remember) {
+ options.rememberlogindetails = remember;
+}
+
+void options_sethideoffline(unsigned int hide) {
+ options.hideoffline = hide;
+}
+
+void options_sethidecsm(unsigned int hide) {
+ options.hidecsm = hide;
+}
+
+void options_setlocalcolour_gdk(const GdkColor *colour) {
+
+ char *string;
+
+ if ( options.localcolour_gdk != NULL ) {
+ gdk_color_free(options.localcolour_gdk);
+ }
+ if ( options.localcolour_string != NULL ) {
+ free(options.localcolour_string);
+ }
+
+ options.localcolour_gdk = gdk_color_copy(colour);
+
+ /* Now work out the string version */
+ string = malloc(7);
+ /* Yukky BGR order instead of RGB */
+ snprintf(string, 7, "%02hhx%02hhx%02hhx", colour->blue >> 8, colour->green >> 8, colour->red >> 8);
+ options.localcolour_string = string;
+ debug_print("OP: String value '%s'\n", string);
+
+}
+
+void options_setlocalcolour_string(const char *colour) {
+
+ char *flipped;
+ char *string;
+ GdkColor gdkcolour;
+
+ if ( options.localcolour_gdk != NULL ) {
+ gdk_color_free(options.localcolour_gdk);
+ }
+ if ( options.localcolour_string != NULL ) {
+ free(options.localcolour_string);
+ }
+
+ options.localcolour_string = strdup(colour);
+
+ /* Now work out the GDK version - flip then parse */
+ flipped = routines_flipcolour(colour);
+ string = malloc(8);
+ strcpy(string, "#");
+ strncat(string, flipped, 7);
+ string[7] = '\0';
+ free(flipped);
+ if ( gdk_color_parse(string, &gdkcolour) ) {
+ options.localcolour_gdk = gdk_color_copy(&gdkcolour);
+ } else {
+
+ debug_print("OP: Whoops! Colour parsing failed (%s)...\n", string);
+ if ( options.localcolour_gdk != NULL ) {
+ gdk_color_free(options.localcolour_gdk);
+ }
+ if ( options.localcolour_string != NULL ) {
+ free(options.localcolour_string);
+ }
+ options.localcolour_string = NULL;
+ options.localcolour_gdk = NULL;
+
+ }
+ free(string);
+
+}
+
+void options_setocolour_gdk(const GdkColor *colour) {
+
+ if ( options.ocolour_gdk != NULL ) {
+ gdk_color_free(options.ocolour_gdk);
+ }
+
+ options.ocolour_gdk = gdk_color_copy(colour);
+
+}
+
+void options_setofontoverride(unsigned int override) {
+ options.ofontoverride = override;
+}
+
+void options_setocolour_string(const char *colour) {
+
+ char *string;
+ GdkColor gdkcolour;
+
+ if ( options.ocolour_gdk != NULL ) {
+ gdk_color_free(options.localcolour_gdk);
+ }
+
+ string = malloc(8);
+ strcpy(string, "#");
+ strncat(string, colour, 7);
+ string[7] = '\0';
+ if ( gdk_color_parse(string, &gdkcolour) ) {
+ options.ocolour_gdk = gdk_color_copy(&gdkcolour);
+ } else {
+ debug_print("OP: Whoops! Colour parsing failed (%s)...\n", string);
+ options.localcolour_gdk = NULL;
+ }
+ free(string);
+
+}
+
+void options_setlocalfont(const char *font) {
+ options.localfont = strdup(font);
+}
+
+void options_setofont(const char *font) {
+ options.ofont = strdup(font);
+}
+
+void options_setircstyle(unsigned int ircstyle) {
+ options.ircstyle = ircstyle;
+}
+
+void options_settimestamps(unsigned int timestamps) {
+ options.timestamps = timestamps;
+}
+
+void options_setshowavatars(unsigned int showavatars) {
+ options.showavatars = showavatars;
+}
+
+void options_setshowemoticons(unsigned int showemoticons) {
+ options.showemoticons = showemoticons;
+}
+
+void options_load() {
+
+ int glob_retval;
+ glob_t glob_result;
+ struct stat stat_buffer;
+ struct stat *statbuf;
+ char *dir_filename;
+ char *rc_filename;
+
+ glob_retval = glob("~", GLOB_TILDE, NULL, &glob_result);
+ statbuf = &stat_buffer;
+ if ( glob_retval != 0 ) {
+
+ debug_print("OP: glob() for ~/.tuxmessenger failed: ");
+ switch ( glob_retval ) {
+ case GLOB_NOSPACE : debug_print("GLOB_NOSPACE\n"); break;
+ case GLOB_ABORTED : debug_print("GLOB_ABORTED\n"); break;
+ case GLOB_NOMATCH : debug_print("GLOB_NOMATCH\n"); break;
+ default : debug_print("Unknown!\n"); break;
+ }
+ debug_print("OP: Can't continue :(\n");
+ exit(1);
+
+ }
+
+ dir_filename = malloc(strlen(glob_result.gl_pathv[0]) + 15);
+ strcpy(dir_filename, glob_result.gl_pathv[0]);
+ globfree(&glob_result);
+ strcat(dir_filename, "/.tuxmessenger");
+
+ if ( stat(dir_filename, statbuf) != -1 ) {
+
+ if ( S_ISDIR(stat_buffer.st_mode) ) {
+
+ debug_print("OP: Found '%s'.\n", dir_filename);
+ /* All is good. */
+
+ } else {
+
+ debug_print("OP: Found '%s', but it isn't a directory!\n", dir_filename);
+ debug_print("OP: Can't continue :(\n");
+ exit(1);
+
+ }
+
+ } else {
+
+ debug_print("OP: ~/.tuxmessenger directory not found: creating it.\n");
+ options_createhomedir(dir_filename);
+
+ }
+
+ /* Right - after all of that, let's take a look at the central config file. */
+ options_setdefaults(); /* Set defaults to begin with. */
+ rc_filename = malloc(strlen(dir_filename) + 8);
+ strcpy(rc_filename, dir_filename);
+ strcat(rc_filename, "/config");
+ if ( stat(rc_filename, statbuf) != -1 ) {
+
+ if ( (S_ISREG(stat_buffer.st_mode)) || (S_ISLNK(stat_buffer.st_mode)) ) {
+
+ /* Yay :D */
+ FILE *fh;
+ char *line;
+ char *rval;
+ int whoops = 0;
+
+ fh = fopen(rc_filename, "r");
+ if ( fh == NULL ) {
+ debug_print("OP: Error opening options file.\n");
+ options_bailout();
+ free(rc_filename);
+ free(dir_filename);
+ return;
+ }
+
+ line = malloc(1024);
+ assert(line != NULL);
+ rval = "hello"; /* Non-NULL */
+
+ while ( rval ) {
+
+ rval = fgets(line, 1023, fh);
+
+ if ( ferror(fh) && !feof(fh) ) {
+ whoops = 1;
+ break;
+ }
+ if ( strlen(line) > 1 ) {
+ if ( line[strlen(line)-1] == '\n' ) {
+ line[strlen(line)-1] = '\0'; /* Cut off trailing newline. */
+ }
+ } else {
+ line[0] = '\0';
+ }
+
+ if ( strncmp(line, "username ", 9) == 0 ) {
+ debug_print("OP: Got username from config file.\n");
+ options_setusername(line+9);
+ }
+ if ( strncmp(line, "password ", 9) == 0 ) {
+ debug_print("OP: Got password from config file.\n");
+ options_setpassword(line+9);
+ }
+ if ( strncmp(line, "hostname ", 9) == 0 ) {
+ debug_print("OP: Got server hostname from config file.\n");
+ options_sethostname(line+9);
+ }
+ if ( strncmp(line, "port ", 5) == 0 ) {
+ debug_print("OP: Got server port number from config file.\n");
+ options_setport(atoi(line+5));
+ }
+ if ( strncmp(line, "wget ", 5) == 0 ) {
+ debug_print("OP: Got wget command from config file.\n");
+ options_setwget(line+5);
+ }
+ if ( strncmp(line, "hide_offline", 12) == 0 ) {
+ debug_print("OP: Got hide_offline from config file.\n");
+ options_sethideoffline(TRUE);
+ }
+ if ( strncmp(line, "hide_localcsm", 12) == 0 ) {
+ debug_print("OP: Got hide_localcsm from config file.\n");
+ options_sethidecsm(TRUE);
+ }
+ if ( strncmp(line, "localcolour ", 12) == 0 ) {
+ debug_print("OP: Got local colour from config file.\n");
+ options_setlocalcolour_string(line+12);
+ }
+ if ( strncmp(line, "ofontoverride", 12) == 0 ) {
+ debug_print("OP: Got ofontoverride from config file.\n");
+ options_setofontoverride(TRUE);
+ }
+ if ( strncmp(line, "ocolour ", 8) == 0 ) {
+ debug_print("OP: Got override colour from config file.\n");
+ options_setocolour_string(line+8);
+ }
+ if ( strncmp(line, "localfont ", 10) == 0 ) {
+ debug_print("OP: Got localfont from config file.\n");
+ options_setlocalfont(line+10);
+ }
+ if ( strncmp(line, "ofont ", 6) == 0 ) {
+ debug_print("OP: Got ofont from config file.\n");
+ options_setofont(line+6);
+ }
+ if ( strncmp(line, "show_avatars", 12) == 0 ) {
+ debug_print("OP: Got show_avatars from config file.\n");
+ options_setshowavatars(TRUE);
+ }
+ if ( strncmp(line, "show_emoticons", 14) == 0 ) {
+ debug_print("OP: Got show_emoticons from config file.\n");
+ options_setshowemoticons(TRUE);
+ }
+ if ( strncmp(line, "timestamps", 10) == 0 ) {
+ debug_print("OP: Got timestamps from config file.\n");
+ options_settimestamps(TRUE);
+ }
+ if ( strncmp(line, "ircstyle", 8) == 0 ) {
+ debug_print("OP: Got ircstyle from config file.\n");
+ options_setircstyle(TRUE);
+ }
+
+ line[0] = '\0'; /* Prevent this line from being parsed twice. */
+
+ }
+
+ free(line);
+ fclose(fh);
+
+ if ( whoops ) {
+ debug_print("OP: Error reading options file.\n");
+ options_bailout();
+ }
+
+ } else {
+
+ /* FFS. I'm not handling that. */
+ debug_print("OP: Options file exists but isn't a file!\n");
+ exit(1);
+
+ }
+
+ } else {
+
+ /* Options file isn't there. Set "sensible defaults" and open the config window... */
+ debug_print("OP: Options file not found.\n");
+ options_bailout();
+
+ }
+
+ options_setrememberlogindetails(1);
+ /* If the username and password are blank, and the server is set to its default, we assume "Remember login details" was unticked last time. */
+ if ( (strlen(options_username())==0) && (strlen(options_password())==0) && (options_port()==DEFAULT_NS_PORT) && (strcmp(options_hostname(), DEFAULT_HOSTNAME)==0)) {
+ options_setrememberlogindetails(0);
+ }
+
+ free(dir_filename);
+ free(rc_filename);
+
+}
+
+const char *options_username() {
+
+ /* FIXME: Check length */
+ /* Don't forget to change to lower case. */
+
+ return options.username;
+
+}
+
+const char *options_password() {
+ return options.password;
+}
+
+const char *options_hostname() {
+ return options.hostname;
+}
+
+unsigned short int options_port() {
+ return options.port;
+}
+
+const char *options_wget() {
+ return options.wget;
+}
+
+const char *options_blp() {
+ return options.blp;
+}
+
+const char *options_gtc() {
+ return options.gtc;
+}
+
+unsigned int options_rememberlogindetails() {
+ return options.rememberlogindetails;
+}
+
+unsigned int options_hideoffline() {
+ return options.hideoffline;
+}
+
+unsigned int options_hidecsm() {
+ return options.hidecsm;
+}
+
+const GdkColor *options_localcolour_gdk() {
+ return options.localcolour_gdk;
+}
+
+const char *options_localcolour_string() {
+ return options.localcolour_string;
+}
+
+unsigned int options_ofontoverride() {
+ return options.ofontoverride;
+}
+
+const GdkColor *options_ocolour_gdk() {
+ return options.ocolour_gdk;
+}
+
+unsigned int options_ircstyle() {
+ return options.ircstyle;
+}
+
+unsigned int options_timestamps() {
+ return options.timestamps;
+}
+
+unsigned int options_showavatars() {
+ return options.showavatars;
+}
+
+unsigned int options_showemoticons() {
+ return options.showemoticons;
+}
+
+static char *options_ocolour_string() {
+
+ char *string;
+ const GdkColor *colour = options_ocolour_gdk();
+
+ if ( colour == NULL ) {
+ return NULL;
+ }
+
+ string = malloc(7);
+ /* RGB order here */
+ snprintf(string, 7, "%02hhx%02hhx%02hhx", colour->red >> 8, colour->green >> 8, colour->blue >> 8);
+
+ return string;
+
+}
+
+const char *options_localfont() {
+ return options.localfont;
+}
+
+const char *options_ofont() {
+ return options.ofont;
+}
+
+void options_save() {
+
+ FILE *fh;
+ int glob_retval;
+ glob_t glob_result;
+ struct stat stat_buffer;
+ struct stat *statbuf;
+ char *dir_filename;
+ char *rc_filename;
+ int whoops = 0;
+ char *newline;
+
+ const char *ousername;
+ const char *opassword;
+ const char *ohostname;
+ int oport;
+
+ glob_retval = glob("~", GLOB_TILDE, NULL, &glob_result);
+ statbuf = &stat_buffer;
+ if ( glob_retval != 0 ) {
+
+ debug_print("OP: glob() for ~/.tuxmessenger failed: ");
+ switch ( glob_retval ) {
+ case GLOB_NOSPACE : debug_print("GLOB_NOSPACE\n"); break;
+ case GLOB_ABORTED : debug_print("GLOB_ABORTED\n"); break;
+ case GLOB_NOMATCH : debug_print("GLOB_NOMATCH\n"); break;
+ default : debug_print("Unknown!\n"); break;
+ }
+ debug_print("OP: Couldn't save options :(\n");
+ return;
+
+ }
+
+ dir_filename = malloc(strlen(glob_result.gl_pathv[0]) + 15);
+ strcpy(dir_filename, glob_result.gl_pathv[0]);
+ globfree(&glob_result);
+ strcat(dir_filename, "/.tuxmessenger");
+
+ if ( stat(dir_filename, statbuf) != -1 ) {
+
+ if ( S_ISDIR(stat_buffer.st_mode) ) {
+
+ debug_print("OP: Found '%s'.\n", dir_filename);
+ /* All is good. */
+
+ } else {
+
+ debug_print("OP: Found '%s', but it isn't a directory!\n", dir_filename);
+ debug_print("OP: Couldn't save options :(\n");
+ return;
+
+ }
+
+ } else {
+
+ /* This shouldn't happen here unless someone's been a muppet. */
+ debug_print("OP: ~/.tuxmessenger directory not found: creating it.\n");
+ options_createhomedir(dir_filename);
+
+ }
+
+ rc_filename = malloc(strlen(dir_filename) + 8);
+ strcpy(rc_filename, dir_filename);
+ strcat(rc_filename, "/config");
+
+ fh = fopen(rc_filename, "w");
+ if ( chmod(rc_filename, S_IRUSR | S_IWUSR) != 0 ) {
+ error_report("Couldn't set permissions on config file!");
+ }
+ if ( fh == NULL ) {
+
+ debug_print("OP: Error opening options file.\n");
+ debug_print("OP: Couldn't save options :(\n");
+ return;
+
+ }
+
+ newline = malloc(2);
+ sprintf(newline, "\n");
+
+ if ( options_rememberlogindetails() ) {
+ ousername = options_username();
+ opassword = options_password();
+ ohostname = options_hostname();
+ oport = options_port();
+ } else {
+ ousername = "";
+ opassword = "";
+ ohostname = DEFAULT_HOSTNAME;
+ oport = DEFAULT_NS_PORT;
+ }
+
+ /* ----------------------- Username -------------------------- */
+ if ( fputs("username ", fh) == EOF ) {
+ whoops = 1;
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(ousername, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+
+ /* ----------------------- Password -------------------------- */
+ if ( whoops == 0 ) {
+ if ( fputs("password ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(opassword, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+
+ /* ----------------------- wget -------------------------- */
+ if ( whoops == 0 ) {
+ if ( fputs("wget ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(options_wget(), fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+
+ /* ----------------------- Hostname -------------------------- */
+ if ( whoops == 0 ) {
+ if ( fputs("hostname ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(ohostname, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+
+ /* ----------------------- Port -------------------------- */
+ if ( whoops == 0 ) {
+
+ char *port;
+
+ if ( fputs("port ", fh) == EOF ) {
+ whoops = 1;
+ }
+ /* options_port() < 65536 because of data size - so always fits. */
+ port = malloc(6);
+ sprintf(port, "%i", oport);
+ if ( whoops == 0 ) {
+ if ( fputs(port, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ free(port);
+
+ }
+
+ /* ----------------------- Show Offline Contacts ---------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_hideoffline() ) {
+ if ( fputs("hide_offline\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ /* ----------------------- Show CSM ---------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_hidecsm() ) {
+ if ( fputs("hide_localcsm\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ /* ----------------------- Local colour -------------------------- */
+ if ( options_localcolour_string() != NULL ) {
+ if ( whoops == 0 ) {
+ if ( fputs("localcolour ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(options_localcolour_string(), fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ }
+
+ /* ----------------------- Override Contacts' Fonts/Colours ---------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_ofontoverride() ) {
+ if ( fputs("ofontoverride\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ /* ----------------------- Override colour -------------------------- */
+ if ( options_ocolour_string() ) {
+ if ( whoops == 0 ) {
+ if ( fputs("ocolour ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ char *string = options_ocolour_string();
+ if ( fputs(string, fh) == EOF ) {
+ whoops = 1;
+ }
+ free(string);
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ }
+
+ /* ----------------------- Local font -------------------------- */
+ if ( options_localfont() ) {
+ if ( whoops == 0 ) {
+ if ( fputs("localfont ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(options_localfont(), fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ }
+
+ /* ----------------------- Contacts' font -------------------------- */
+ if ( options_ofont() ) {
+ if ( whoops == 0 ) {
+ if ( fputs("ofont ", fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(options_ofont(), fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ if ( whoops == 0 ) {
+ if ( fputs(newline, fh) == EOF ) {
+ whoops = 1;
+ }
+ }
+ }
+
+ /* ----------------------- IRC style ---------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_ircstyle() ) {
+ if ( fputs("ircstyle\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ /* ----------------------- Show emoticons ---------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_showemoticons() ) {
+ if ( fputs("show_emoticons\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ /* ----------------------- Show avatars --------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_showavatars() ) {
+ if ( fputs("show_avatars\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ /* ----------------------- Timestamps ---------------------- */
+ if ( whoops == 0 ) {
+
+ if ( options_timestamps() ) {
+ if ( fputs("timestamps\n", fh) == EOF ) {
+ whoops = 1;
+ }
+ } /* Else write nothing. */
+
+ }
+
+ if ( whoops != 0 ) {
+ debug_print("OP: Whoops! Config file write failed.\n");
+ }
+
+ fclose(fh);
+ free(newline);
+
+}