diff -pruN 2.2.0-4/debian/changelog 2.2.0-4ubuntu1/debian/changelog
--- 2.2.0-4/debian/changelog	2014-08-31 05:14:37.000000000 +0000
+++ 2.2.0-4ubuntu1/debian/changelog	2014-11-12 06:11:31.000000000 +0000
@@ -1,3 +1,16 @@
+xchat-xsys (2.2.0-4ubuntu1) vivid; urgency=medium
+
+  * Merge from Debian unstable. Remaining changes:
+    - debian/control: Add lsb-release to Depends.
+    - debian/patches/fix_whitespace: Change remove_leading_whitespace in
+      match.c so that it removes all leading whitespaces (tabs included).
+    - debian/patches/fix_wrong_distro: Change xs_parse_distro in parse.c to
+      use lsb_release instead of its own version.
+    - debian/patches/fix_xsys2.conf: Fix xchat crashing when xchat-xsys
+      configuration file is not present.
+
+ -- Logan Rosen <logan@ubuntu.com>  Wed, 12 Nov 2014 01:11:02 -0500
+
 xchat-xsys (2.2.0-4) unstable; urgency=medium
 
   * Replace build-dep on audacious/dbus.h switched off to libaudclient-dev.
@@ -8,6 +21,19 @@ xchat-xsys (2.2.0-4) unstable; urgency=m
 
  -- Ulises Vitulli <dererk@debian.org>  Sat, 30 Aug 2014 19:53:01 -0300
 
+xchat-xsys (2.2.0-3ubuntu1) saucy; urgency=low
+
+  * Merge from Debian unstable. Remaining changes:
+    - debian/control: Add lsb-release to Depends.
+    - debian/patches/fix_whitespace: Change remove_leading_whitespace in
+      match.c so that it removes all leading whitespaces (tabs included).
+    - debian/patches/fix_wrong_distro: Change xs_parse_distro in parse.c to
+      use lsb_release instead of its own version.
+    - debian/patches/fix_xsys2.conf: Fix xchat crashing when xchat-xsys
+      configuration file is not present.
+
+ -- Logan Rosen <logan@ubuntu.com>  Thu, 16 May 2013 15:24:46 -0400
+
 xchat-xsys (2.2.0-3) unstable; urgency=low
 
   * The 'hey-long-time-no-see' dupload.
@@ -22,12 +48,64 @@ xchat-xsys (2.2.0-3) unstable; urgency=l
 
  -- Ulises Vitulli <dererk@debian.org>  Mon, 05 Nov 2012 19:59:16 -0300
 
+xchat-xsys (2.2.0-2ubuntu4) lucid; urgency=low
+
+  * Fix bug in the fix_whitespace patch
+    (LP: #512113)
+
+ -- Jean-Louis Dupond <info@dupondje.be>  Mon, 25 Jan 2010 00:45:26 +0100
+
+xchat-xsys (2.2.0-2ubuntu3) karmic; urgency=low
+
+  * No-change rebuild for libaudclient1 -> libaudclient2 transition.
+
+ -- Steve Kowalik <stevenk@ubuntu.com>  Sun, 09 Aug 2009 22:46:35 +1000
+
+xchat-xsys (2.2.0-2ubuntu2) intrepid; urgency=low
+
+  * debian/patches/fix_xsys2.conf:
+    fix xchat crashing when xchat-xsys configuration file is not present
+    (LP: #58513)
+
+ -- Cesare Tirabassi <norsetto@ubuntu.com>  Wed, 14 May 2008 22:16:10 +0200
+
+xchat-xsys (2.2.0-2ubuntu1) intrepid; urgency=low
+
+  * Merge from Debian unstable. Remaining Ubuntu changes:
+    - Add quilt support in debian/control and debian/rules.
+    - debian/patches/fix_wrong_distro (LP: #221171):
+      change xs_parse_distro in parse.c to use lsb_release instead of its own
+      version.
+    - debian/patches/fix_whitespace:
+      change remove_leading_whitespace in match.c so that it removes all
+      leading whitespaces (tabs included).
+    - Modify Maintainer value to match the DebianMaintainerField
+      specification.
+  * debian/control:
+    Add lsb-release as a Depends
+
+ -- Cesare Tirabassi <norsetto@ubuntu.com>  Fri, 09 May 2008 22:25:47 +0200
+
 xchat-xsys (2.2.0-2) unstable; urgency=low
 
   * libpci-dev replaced pciutils-dev (Closes: #478399).
 
  -- Ulises Vitulli <uvitulli@fi.uba.ar>  Tue, 29 Apr 2008 14:03:01 -0300
 
+xchat-xsys (2.2.0-1ubuntu1) intrepid; urgency=low
+
+  * Add quilt support in debian/control and debian/rules.
+  * debian/patches/fix_wrong_distro (LP: #221171):
+    change xs_parse_distro in parse.c to use lsb_release instead of its own
+    version.
+  * debian/patches/fix_whitespace:
+    change remove_leading_whitespace in match.c so that it removes all
+    leading whitespaces (tabs included).
+  * Modify Maintainer value to match the DebianMaintainerField
+    specification.
+
+ -- Cesare Tirabassi <norsetto@ubuntu.com>  Tue, 29 Apr 2008 20:28:54 +0200
+
 xchat-xsys (2.2.0-1) unstable; urgency=high
 
   * New upstrem release (Closes: #352350, #372306).
diff -pruN 2.2.0-4/debian/control 2.2.0-4ubuntu1/debian/control
--- 2.2.0-4/debian/control	2014-08-30 23:34:02.000000000 +0000
+++ 2.2.0-4ubuntu1/debian/control	2014-11-12 06:11:33.000000000 +0000
@@ -1,14 +1,15 @@
 Source: xchat-xsys
 Section: misc
 Priority: optional
-Maintainer: Ulises Vitulli <dererk@debian.org>
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Ulises Vitulli <dererk@debian.org>
 Build-Depends: debhelper (>= 9), libpci-dev, libaudclient-dev
 Standards-Version: 3.9.5
 Homepage: http://dev.gentoo.org/~chainsaw/xsys/
 
 Package: xchat-xsys
 Architecture: any
-Depends: xchat (>= 2.4.0), ${shlibs:Depends}, ${misc:Depends}
+Depends: xchat (>= 2.4.0), lsb-release, ${shlibs:Depends}, ${misc:Depends}
 Recommends: audacious
 Description: x-chat plugin that can display your current system statistics 
  X-Sys is a plugin for X-Chat that allows you to display your current system
diff -pruN 2.2.0-4/debian/patches/fix_whitespace 2.2.0-4ubuntu1/debian/patches/fix_whitespace
--- 2.2.0-4/debian/patches/fix_whitespace	1970-01-01 00:00:00.000000000 +0000
+++ 2.2.0-4ubuntu1/debian/patches/fix_whitespace	2014-11-12 06:10:13.000000000 +0000
@@ -0,0 +1,23 @@
+--- xchat-xsys-2.2.0.orig/match.c	2007-11-12 21:00:39.000000000 +0100
++++ xchat-xsys-2.2.0/match.c	2010-01-25 00:26:06.837498322 +0100
+@@ -68,12 +68,14 @@
+ 
+ void remove_leading_whitespace(char *buffer)
+ {
+-	char *pos;
+-        while((pos = memchr(buffer, 0x20, 1)))
+-	{
+-		pos += 1;
+-		strcpy(buffer, pos);
+-	}
++	char *pos = malloc(bsize);
++
++	strcpy(pos, buffer);
++
++	while (*pos && isspace(*pos))
++		pos++;
++
++	strcpy(buffer, pos);
+ }
+ 
+ char *decruft_filename(char *buffer)
diff -pruN 2.2.0-4/debian/patches/fix_wrong_distro 2.2.0-4ubuntu1/debian/patches/fix_wrong_distro
--- 2.2.0-4/debian/patches/fix_wrong_distro	1970-01-01 00:00:00.000000000 +0000
+++ 2.2.0-4ubuntu1/debian/patches/fix_wrong_distro	2014-11-12 06:10:13.000000000 +0000
@@ -0,0 +1,63 @@
+Index: xchat-xsys-2.2.0/parse.c
+===================================================================
+--- xchat-xsys-2.2.0.orig/parse.c	2008-04-29 20:37:15.000000000 +0200
++++ xchat-xsys-2.2.0/parse.c	2008-04-29 20:38:19.000000000 +0200
+@@ -374,8 +374,8 @@
+ {
+ 	FILE *fp = NULL;
+ 	char buffer[bsize], *pos = NULL;
+-	
+-	if((fp = fopen("/etc/lsb_release", "r")) != NULL)
++
++	if((fp = popen("/usr/bin/lsb_release -icr", "r")) != NULL)
+ 	{
+ 		char id[bsize], codename[bsize], release[bsize];
+ 		strcpy(id, "?");
+@@ -383,42 +383,16 @@
+ 		strcpy(release, "?");
+ 		while(fgets(buffer, bsize, fp) != NULL)
+ 		{
+-			find_match_char(buffer, "DISTRIB_ID", id);
+-			find_match_char(buffer, "DISTRIB_CODENAME", codename);
+-			find_match_char(buffer, "DISTRIB_RELEASE", release);
++			find_match_char(buffer, "Distributor ID", id);
++			find_match_char(buffer, "Codename", codename);
++			find_match_char(buffer, "Release", release);
+ 		}
+ 		snprintf(buffer, bsize, "%s \"%s\" %s", id, codename, release);
++		pclose(fp);
+ 	}
+-	else if((fp = fopen("/etc/make.conf", "r")) != NULL)
+-	{
+-		char keywords[bsize];
+-		while(fgets(buffer, bsize, fp) != NULL)
+-			find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
+-		if (strstr(keywords, "\"") == NULL)
+-			snprintf(buffer, bsize, "Gentoo Linux (stable)");
+-		else
+-			snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
+-	}		
+-	else if((fp = fopen("/etc/redhat-release", "r")) != NULL)
+-		fgets(buffer, bsize, fp);
+-	else if((fp = fopen("/etc/slackware-version", "r")) != NULL)
+-		fgets(buffer, bsize, fp);
+-	else if((fp = fopen("/etc/mandrake-release", "r")) != NULL)
+-		fgets(buffer, bsize, fp);
+-	else if((fp = fopen("/etc/debian_version", "r")) != NULL)
+-	{
+-		char release[bsize];
+-		fgets(release, bsize, fp);
+-		snprintf(buffer, bsize, "Debian %s", release);
+-	}
+-	else if((fp = fopen("/etc/SuSE-release", "r")) != NULL)
+-		fgets(buffer, bsize, fp);
+-	else if((fp = fopen("/etc/turbolinux-release", "r")) != NULL)
+-		fgets(buffer, bsize, fp);
+ 	else
+ 		snprintf(buffer, bsize, "Unknown Distro");
+-	if(fp != NULL) fclose(fp);
+-	
++
+ 	pos=strchr(buffer, '\n');
+ 	if(pos != NULL) *pos = '\0';
+ 	strcpy(name, buffer);
diff -pruN 2.2.0-4/debian/patches/fix_xsys2.conf 2.2.0-4ubuntu1/debian/patches/fix_xsys2.conf
--- 2.2.0-4/debian/patches/fix_xsys2.conf	1970-01-01 00:00:00.000000000 +0000
+++ 2.2.0-4ubuntu1/debian/patches/fix_xsys2.conf	2014-11-12 06:10:13.000000000 +0000
@@ -0,0 +1,17 @@
+Index: xchat-xsys-2.2.0/xsys.c
+===================================================================
+--- xchat-xsys-2.2.0.orig/xsys.c	2008-05-14 22:14:00.000000000 +0200
++++ xchat-xsys-2.2.0/xsys.c	2008-05-14 22:15:15.000000000 +0200
+@@ -153,8 +153,11 @@
+ 	snprintf(buffer, bsize, "%s/xsys2.conf", xchat_get_info(ph, "xchatdirfs"));
+ 	fp = fopen(buffer, "r");
+ 	if(fp == NULL)
++	{
+ 		save_config();
+-	
++		fp = fopen(buffer, "r");
++	}
++
+ 	while(fgets(buffer, bsize, fp) != NULL)
+ 	{
+ 		find_match_char(buffer, "format", format);
diff -pruN 2.2.0-4/debian/patches/series 2.2.0-4ubuntu1/debian/patches/series
--- 2.2.0-4/debian/patches/series	2014-08-31 02:57:04.000000000 +0000
+++ 2.2.0-4ubuntu1/debian/patches/series	2014-11-12 06:10:41.000000000 +0000
@@ -1,2 +1,5 @@
 fix-ldflags.patch
 include-slash-ether.patch
+fix_wrong_distro
+fix_whitespace
+fix_xsys2.conf
diff -pruN 2.2.0-4/match.c 2.2.0-4ubuntu1/match.c
--- 2.2.0-4/match.c	2007-11-12 20:00:39.000000000 +0000
+++ 2.2.0-4ubuntu1/match.c	2014-11-12 09:08:13.000000000 +0000
@@ -68,12 +68,14 @@ char *pretty_freespace(const char *desc,
 
 void remove_leading_whitespace(char *buffer)
 {
-	char *pos;
-        while((pos = memchr(buffer, 0x20, 1)))
-	{
-		pos += 1;
-		strcpy(buffer, pos);
-	}
+	char *pos = malloc(bsize);
+
+	strcpy(pos, buffer);
+
+	while (*pos && isspace(*pos))
+		pos++;
+
+	strcpy(buffer, pos);
 }
 
 char *decruft_filename(char *buffer)
diff -pruN 2.2.0-4/parse.c 2.2.0-4ubuntu1/parse.c
--- 2.2.0-4/parse.c	2007-11-12 20:42:20.000000000 +0000
+++ 2.2.0-4ubuntu1/parse.c	2014-11-12 09:08:13.000000000 +0000
@@ -374,8 +374,8 @@ int xs_parse_distro(char *name)
 {
 	FILE *fp = NULL;
 	char buffer[bsize], *pos = NULL;
-	
-	if((fp = fopen("/etc/lsb_release", "r")) != NULL)
+
+	if((fp = popen("/usr/bin/lsb_release -icr", "r")) != NULL)
 	{
 		char id[bsize], codename[bsize], release[bsize];
 		strcpy(id, "?");
@@ -383,42 +383,16 @@ int xs_parse_distro(char *name)
 		strcpy(release, "?");
 		while(fgets(buffer, bsize, fp) != NULL)
 		{
-			find_match_char(buffer, "DISTRIB_ID", id);
-			find_match_char(buffer, "DISTRIB_CODENAME", codename);
-			find_match_char(buffer, "DISTRIB_RELEASE", release);
+			find_match_char(buffer, "Distributor ID", id);
+			find_match_char(buffer, "Codename", codename);
+			find_match_char(buffer, "Release", release);
 		}
 		snprintf(buffer, bsize, "%s \"%s\" %s", id, codename, release);
+		pclose(fp);
 	}
-	else if((fp = fopen("/etc/make.conf", "r")) != NULL)
-	{
-		char keywords[bsize];
-		while(fgets(buffer, bsize, fp) != NULL)
-			find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
-		if (strstr(keywords, "\"") == NULL)
-			snprintf(buffer, bsize, "Gentoo Linux (stable)");
-		else
-			snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
-	}		
-	else if((fp = fopen("/etc/redhat-release", "r")) != NULL)
-		fgets(buffer, bsize, fp);
-	else if((fp = fopen("/etc/slackware-version", "r")) != NULL)
-		fgets(buffer, bsize, fp);
-	else if((fp = fopen("/etc/mandrake-release", "r")) != NULL)
-		fgets(buffer, bsize, fp);
-	else if((fp = fopen("/etc/debian_version", "r")) != NULL)
-	{
-		char release[bsize];
-		fgets(release, bsize, fp);
-		snprintf(buffer, bsize, "Debian %s", release);
-	}
-	else if((fp = fopen("/etc/SuSE-release", "r")) != NULL)
-		fgets(buffer, bsize, fp);
-	else if((fp = fopen("/etc/turbolinux-release", "r")) != NULL)
-		fgets(buffer, bsize, fp);
 	else
 		snprintf(buffer, bsize, "Unknown Distro");
-	if(fp != NULL) fclose(fp);
-	
+
 	pos=strchr(buffer, '\n');
 	if(pos != NULL) *pos = '\0';
 	strcpy(name, buffer);
diff -pruN 2.2.0-4/.pc/applied-patches 2.2.0-4ubuntu1/.pc/applied-patches
--- 2.2.0-4/.pc/applied-patches	2014-11-12 09:08:12.842820162 +0000
+++ 2.2.0-4ubuntu1/.pc/applied-patches	2014-11-12 09:08:13.038825433 +0000
@@ -1,2 +1,5 @@
 fix-ldflags.patch
 include-slash-ether.patch
+fix_wrong_distro
+fix_whitespace
+fix_xsys2.conf
diff -pruN 2.2.0-4/.pc/fix_whitespace/match.c 2.2.0-4ubuntu1/.pc/fix_whitespace/match.c
--- 2.2.0-4/.pc/fix_whitespace/match.c	1970-01-01 00:00:00.000000000 +0000
+++ 2.2.0-4ubuntu1/.pc/fix_whitespace/match.c	2007-11-12 20:00:39.000000000 +0000
@@ -0,0 +1,229 @@
+/*
+ * match.c - matching functions for X-Sys
+ * Copyright (C) 2005, 2006, 2007 Tony Vroon
+ *
+ * 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 2 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
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include "xsys.h"
+
+extern int percentages;
+
+float percentage(unsigned long long *free, unsigned long long *total)
+{
+        unsigned long long result = (*free) * (unsigned long long)1000 / (*total);
+        return result / 10.0;
+}
+
+char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k)
+{
+        char *result, *bytesize;
+	double free_space, total_space;
+	free_space = *free_k;
+	total_space = *total_k;
+        result = malloc(bsize * sizeof(char));
+        bytesize = malloc(3 * sizeof(char));
+	const char *quantities = "KB\0MB\0GB\0TB\0PB\0EB\0ZB\0YB\0";
+	int i=0;
+	if (total_space == 0)
+	{
+		snprintf(result, bsize, "%s: none", desc);
+		return result;
+	}
+	while (total_space > 1023 && i <= 14)
+	{
+		i=i+3;
+		*bytesize=*(quantities+i);
+		*(bytesize+1)=*(quantities+i+1);
+		*(bytesize+2)=*(quantities+i+2);
+		free_space = free_space / 1024;
+		total_space = total_space / 1024;
+	}
+	if (percentages != 0)
+		snprintf(result, bsize, "%s: %.1f%s, %.1f%% free",
+		desc, total_space, bytesize,
+		percentage(free_k, total_k));
+	else
+		snprintf(result, bsize, "%s: %.1f%s/%.1f%s free",
+		desc, free_space, bytesize, total_space, bytesize);
+        return result;
+}
+
+void remove_leading_whitespace(char *buffer)
+{
+	char *pos;
+        while((pos = memchr(buffer, 0x20, 1)))
+	{
+		pos += 1;
+		strcpy(buffer, pos);
+	}
+}
+
+char *decruft_filename(char *buffer)
+{
+	char *match, *match_end;
+
+	while ((match = strstr(buffer, "%20")))
+	{
+		match_end = match + 3;
+		*match++ = ' ';
+		while (*match_end)
+			*match++ = *match_end++;
+		*match = 0;
+	}
+	return buffer;
+}
+
+void find_match_char(char *buffer, char *match, char *result)
+{
+	char *position;
+	remove_leading_whitespace(buffer);
+	if(strstr(buffer, match) == strstr(buffer, buffer))
+		{
+			position = strpbrk(buffer, delims);
+			if (position != NULL) {
+				position += 1;
+				strcpy(result, position);
+				position = strstr(result, "\n");
+				*(position) = '\0';
+				remove_leading_whitespace(result);
+				}
+			else
+				strcpy(result, "\0");
+		}
+}
+
+void find_match_double(char *buffer, char *match, double *result)
+{
+	char *position;
+	remove_leading_whitespace(buffer);
+	if(strstr(buffer, match) == strstr(buffer, buffer))
+		{
+			position = strpbrk(buffer, delims);
+			if (position != NULL) {
+                        	position += 1;
+                        	*result = strtod(position, NULL);
+				}
+			else
+				*result = 0;
+		}
+}
+
+void find_match_double_hex(char *buffer, char *match, double *result)
+{
+	char *position;
+	remove_leading_whitespace(buffer);
+	if(strstr(buffer, match) == strstr(buffer, buffer))
+		{
+			position = strpbrk(buffer, delims);
+			if (position != NULL) {
+				memcpy(position,"0x",2);
+				*result = strtod(position,NULL);
+				}
+			else
+				*result = 0;
+		}
+}
+
+void find_match_int(char *buffer, char *match, unsigned int *result)
+{
+	char *position;
+	remove_leading_whitespace(buffer);
+	if(strstr(buffer, match) == strstr(buffer, buffer))
+		{
+			position = strpbrk(buffer, delims);
+			if (position != NULL) {
+                        	position += 1;
+                        	*result = atoi(position);
+				}
+			else
+				*result = 0;
+		}
+}
+
+void find_match_ll(char *buffer, char *match, unsigned long long *result)
+{
+	char *position;
+	remove_leading_whitespace(buffer);
+	if(strstr(buffer, match) == strstr(buffer, buffer))
+		{
+			position = strpbrk(buffer, delims);
+			if (position != NULL) {
+		               	position += 1;
+		               	*result = strtoll(position, NULL, 10);
+				}
+			else
+				*result = 0;
+		}
+}
+
+void format_output(const char *arg, char *string, char *format)
+{
+        char *pos1, *pos2, buffer[bsize];
+        pos1 = &format[0];
+        strncpy(buffer, string, bsize);
+        string[0] = '\0';
+
+        while((pos2 = strstr(pos1, "%")) != NULL)
+        {
+                strncat(string, pos1, (size_t)(pos2-pos1));
+                if(*(pos2+1) == '1')
+                        strcat(string, arg);
+                else if(*(pos2+1) == '2')
+                        strcat(string, buffer);
+                else if(*(pos2+1) == 'C' || *(pos2+1) == 'c')
+                        strcat(string, "\003");
+                else if(*(pos2+1) == 'B' || *(pos2+1) == 'b')
+                        strcat(string, "\002");
+                else if(*(pos2+1) == 'R' || *(pos2+1) == 'r')
+                        strcat(string, "\026");
+                else if(*(pos2+1) == 'O' || *(pos2+1) == 'o')
+                        strcat(string, "\017");
+                else if(*(pos2+1) == 'U' || *(pos2+1) == 'u')
+                        strcat(string, "\037");
+                else if(*(pos2+1) == '%')
+                        strcat(string, "%");
+                pos1=pos2+2;
+        }
+
+        strcat(string, pos1);
+}
+
+void flat_format_output(const char *arg, char *string, char *format)
+{
+        char *pos1, *pos2, buffer[bsize];
+        pos1 = &format[0];
+        strncpy(buffer, string, bsize);
+        string[0] = '\0';
+
+        while((pos2 = strstr(pos1, "%")) != NULL)
+        {
+                strncat(string, pos1, (size_t)(pos2-pos1));
+                if(*(pos2+1) == '1')
+                        strcat(string, arg);
+                else if(*(pos2+1) == '2')
+                        strcat(string, buffer);
+                else if(*(pos2+1) == '%')
+                        strcat(string, "%");
+                pos1=pos2+2;
+        }
+
+        strcat(string, pos1);
+}
diff -pruN 2.2.0-4/.pc/fix_wrong_distro/parse.c 2.2.0-4ubuntu1/.pc/fix_wrong_distro/parse.c
--- 2.2.0-4/.pc/fix_wrong_distro/parse.c	1970-01-01 00:00:00.000000000 +0000
+++ 2.2.0-4ubuntu1/.pc/fix_wrong_distro/parse.c	2007-11-12 20:42:20.000000000 +0000
@@ -0,0 +1,451 @@
+/*
+ * parse.c - parsing functions for X-Sys
+ * by mike9010
+ * Copyright (C) 2003, 2004, 2005 Michael Shoup
+ * Copyright (C) 2005, 2006, 2007 Tony Vroon
+ *
+ * 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 2 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
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/utsname.h>
+#include <unistd.h>
+#include <time.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <pci/header.h>
+
+#include "pci.h"
+#include "match.h"
+#include "hwmon.h"
+#include "xsys.h"
+
+int xs_parse_cpu(char *model, char *vendor, double *freq, char *cache, unsigned int *count)
+{
+	char buffer[bsize], *pos;
+	FILE *fp = fopen("/proc/cpuinfo", "r");
+	pos = NULL;
+	if(fp == NULL)
+		return 1;
+	if(count != NULL) *count = 0;
+	strcpy(cache,"unknown\0");
+	
+	#if defined(__i386__) || defined(__x86_64__)
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "model name", model);
+		find_match_char(buffer, "vendor_id", vendor);
+		find_match_double(buffer, "cpu MHz", freq);
+		find_match_char(buffer, "cache size", cache);
+		find_match_int(buffer, "processor", count);
+	}
+	*count = *count + 1;
+	#endif
+	#ifdef __powerpc__
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "cpu", model);
+		find_match_char(buffer, "machine", vendor);
+		find_match_double(buffer, "clock", freq);
+		find_match_char(buffer, "L2 cache", cache);
+		find_match_int(buffer, "processor", count);
+	}
+	*count = *count + 1;
+	pos = strstr(model, ",");
+	if (pos != NULL) *pos = '\0';
+	#endif
+	#ifdef __alpha__
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "cpu model", model);
+		find_match_char(buffer, "system type", vendor);
+		find_match_double(buffer, "cycle frequency [Hz]", freq);
+		find_match_char(buffer, "L2 cache", cache);
+		find_match_int(buffer, "cpus detected", count);
+	}
+	*freq = *freq / 1000000;
+	#endif
+	#ifdef __ia64__
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "model", model);
+		find_match_char(buffer, "vendor", vendor);
+		find_match_double(buffer, "cpu MHz", freq);
+		find_match_int(buffer, "processor", count);
+	}
+	*count = *count + 1;
+	#endif
+	#ifdef __parisc__
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "cpu  ", model);
+		find_match_char(buffer, "cpu family", vendor);
+		find_match_char(buffer, "D-cache", cache);
+		find_match_double(buffer, "cpu MHz", freq);
+		find_match_int(buffer, "processor", count);
+	}
+	*count = *count + 1;
+	#endif
+	#ifdef __sparc__
+	DIR *dir;
+	struct dirent *entry;
+	FILE *fp2;
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "cpu	", model);
+		find_match_char(buffer, "type	", vendor);
+		find_match_int(buffer, "ncpus active", count);
+		find_match_double_hex(buffer, "Cpu0ClkTck", freq);
+	}
+	/* Cache is tricky, only implemented for sparc64 */
+	if ((dir = opendir("/proc/openprom")) != NULL)
+		while ((entry = readdir(dir)) != NULL)
+			if (strncmp(entry->d_name,"SUNW,UltraSPARC",15) == 0)
+			{
+				snprintf(buffer,bsize,"/proc/openprom/%s/ecache-size",entry->d_name);
+				fp2 = fopen(buffer, "r");
+				if (fp2 == NULL) break;
+				fscanf(fp2,"%16s",cache);
+				fclose(fp2);
+				sprintf(buffer,"0x%s",cache);
+				sprintf(cache,"%0.0f KB",strtod(buffer,NULL)/1024);
+			}
+	*freq = *freq / 1000000;
+	#endif
+	fclose(fp);
+	
+	return 0;
+}
+
+int xs_parse_uptime(int *weeks, int *days, int *hours, int *minutes, int *seconds)
+{
+	char buffer[bsize];
+	long long uptime = 0;
+	FILE *fp = fopen("/proc/uptime", "r");
+	if(fp == NULL)
+		return 1;
+
+	if(fgets(buffer, bsize, fp) != NULL)
+		uptime = strtol(buffer, NULL, 0);
+	
+	*seconds = uptime%60;
+	*minutes = (uptime/60)%60;
+	*hours   = (uptime/3600)%24;
+	*days    = (uptime/86400)%7;
+	*weeks   = uptime/604800;
+	
+	fclose(fp);
+	
+	return 0;
+}
+
+int xs_parse_os(char *user, char *host, char *kernel)
+{
+	struct utsname osinfo;
+	char hostn[bsize], *usern = getenv("USER");
+	
+	if(uname(&osinfo)<0)
+		return 1;	
+	if(gethostname(hostn, bsize)<0)
+		return 1;
+	
+	strncpy(user, usern, bsize);
+	strcpy(host, hostn);
+	snprintf(kernel, bsize, "%s %s %s", osinfo.sysname, osinfo.release, osinfo.machine);
+	
+	return 0;
+}
+
+int xs_parse_sound(char *snd_card)
+{
+	char buffer[bsize], cards[bsize] = "\0", vendor[7] = "\0", device[7] = "\0", *pos;
+	u16 class = PCI_CLASS_MULTIMEDIA_AUDIO;
+
+	FILE *fp = NULL;
+	if((fp = fopen("/proc/asound/cards", "r"))== NULL) {
+		if (pci_find_by_class(&class, vendor, device) == 0) 
+			{
+				pci_find_fullname(snd_card, vendor, device);
+				return 0;
+			}
+		else
+			return 1;
+	}
+	
+	
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		if(isdigit(buffer[0]) || isdigit(buffer[1]))
+		{
+			char card_buf[bsize];
+			long card_id = 0;
+			pos = strstr(buffer, ":");
+			card_id = strtoll(buffer, NULL, 0);
+			if (card_id == 0)
+				snprintf(card_buf, bsize, "%s", pos+2);
+			else
+				snprintf(card_buf, bsize, "%ld: %s", card_id, pos+2);
+			pos = strstr(card_buf, "\n");
+			*pos = '\0';
+			strcat(cards, card_buf);
+		}
+	}
+
+	strcpy(snd_card, cards);
+	
+	fclose(fp);
+	return 0;
+}
+
+int xs_parse_video(char *vid_card)
+{
+	char vendor[7] = "\0", device[7] = "\0";
+	u16 class = PCI_CLASS_DISPLAY_VGA;
+	if (pci_find_by_class(&class, vendor, device))
+		return 1;
+	else
+		pci_find_fullname(vid_card, vendor, device);
+	return 0;
+}
+
+int xs_parse_ether(char *ethernet_card)
+{
+	char vendor[7] = "\0", device[7] = "\0";
+	u16 class = PCI_CLASS_NETWORK_ETHERNET;
+	if (pci_find_by_class(&class, vendor, device))
+		return 1;
+	else
+		pci_find_fullname(ethernet_card, vendor, device);
+	return 0;
+}
+
+int xs_parse_agpbridge(char *agp_bridge)
+{
+	char vendor[7] = "\0", device[7] = "\0";
+	u16 class = PCI_CLASS_BRIDGE_HOST;
+	if (pci_find_by_class(&class, vendor, device))
+		return 1;
+	else
+		pci_find_fullname(agp_bridge, vendor, device);
+	return 0;
+}
+
+int xs_parse_netdev(const char *device, unsigned long long *bytes_recv, unsigned long long *bytes_sent)
+{
+	FILE *fp;
+	char buffer[bsize], *pos;
+	int i;
+	
+	fp=fopen("/proc/net/dev", "r");
+	if(fp==NULL)
+		return 1;
+	
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		for(i=0; isspace(buffer[i]); i++);
+		if(strncmp(device, &buffer[i], strlen(device)) == 0) break;
+	}
+	fclose(fp);
+	pos = strstr(buffer, ":");
+	pos++;
+	*bytes_recv = strtoull(pos, &pos, 0);
+
+	for(i=0;i<7;i++) strtoull(pos, &pos, 0);
+	
+	*bytes_sent = strtoull(pos, NULL, 0);
+
+	return 0;
+}
+
+int xs_parse_df(const char *mount_point, char *result)
+{
+	FILE *pipe;
+	char buffer[bsize], *pos;
+	unsigned long long total_k=0, free_k=0;
+	int i=0;
+	
+	pipe = popen("df -k -l -P", "r");
+	if(pipe==NULL)
+		return 1;
+	
+	while(fgets(buffer, bsize, pipe) != NULL)
+	{
+		/* Skip over pseudo-filesystems and description line */
+		if(isalpha(buffer[0]))
+			continue;
+		
+		for(pos=buffer; !isspace(*pos); pos++);
+		for(;isspace(*pos);pos++);
+		if(mount_point == NULL)
+		{
+			total_k += strtoull(pos, &pos, 0);
+			strtoull(pos, &pos, 0);
+			free_k += strtoull(pos, &pos, 0);
+			continue;
+		}
+		total_k = strtoull(pos, &pos, 0);
+		strtoull(pos, &pos, 0);
+		free_k = strtoull(pos, &pos, 0);
+		strtoull(pos, &pos, 0);
+		for(;isspace(*pos);pos++);
+		for(;*pos!='/';pos++);
+		for(i=0;*(buffer+i)!='\n';i++);
+		*(buffer+i)='\0';
+		
+		if(strncasecmp(mount_point, "ALL", 3)==0)
+		{
+			char *tmp_buf = pretty_freespace(pos, &free_k, &total_k);
+			strcat(tmp_buf, " | ");
+			strcat(result, tmp_buf);
+			free(tmp_buf);
+		}
+		else if(strncmp(mount_point, pos, strlen(mount_point)) == 0)
+		{
+			char *tmp_buf = pretty_freespace(mount_point, &free_k, &total_k);
+			strncpy(result, tmp_buf, bsize);
+			free(tmp_buf);
+			break;
+		}
+		else snprintf(result, bsize, "Mount point %s not found!", mount_point);
+	}
+	
+	if(mount_point != NULL && strncasecmp(mount_point, "ALL", 3)==0)
+		*(result+strlen(result)-3) = '\0';
+	
+	if(mount_point == NULL)
+	{
+		char *tmp_buf = pretty_freespace("Total", &free_k, &total_k);
+		strncpy(result, tmp_buf, bsize);
+		free(tmp_buf);
+	}
+	pclose(pipe);
+	return 0;
+}
+
+int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free, int swap)
+{
+	FILE *fp;
+        char buffer[bsize];
+	unsigned long long freemem = 0, buffers = 0, cache = 0;
+        *mem_tot = 0;
+        *mem_free = 0;
+
+        if((fp = fopen("/proc/meminfo", "r")) == NULL)
+                return 1;
+
+        while(fgets(buffer, bsize, fp) != NULL)
+        {
+                if(!swap)
+                {
+			find_match_ll(buffer, "MemTotal:", mem_tot);
+			find_match_ll(buffer, "MemFree:", &freemem);
+			find_match_ll(buffer, "Buffers:", &buffers);
+			find_match_ll(buffer, "Cached:", &cache);
+                }
+                else
+                {
+			find_match_ll(buffer, "SwapTotal:", mem_tot);
+			find_match_ll(buffer, "SwapFree:", mem_free);
+                }
+        }
+	if (!swap) {
+		*mem_free = freemem + buffers + cache;
+	}
+        fclose(fp);
+        return 0;
+}
+
+int xs_parse_distro(char *name)
+{
+	FILE *fp = NULL;
+	char buffer[bsize], *pos = NULL;
+	
+	if((fp = fopen("/etc/lsb_release", "r")) != NULL)
+	{
+		char id[bsize], codename[bsize], release[bsize];
+		strcpy(id, "?");
+		strcpy(codename, "?");
+		strcpy(release, "?");
+		while(fgets(buffer, bsize, fp) != NULL)
+		{
+			find_match_char(buffer, "DISTRIB_ID", id);
+			find_match_char(buffer, "DISTRIB_CODENAME", codename);
+			find_match_char(buffer, "DISTRIB_RELEASE", release);
+		}
+		snprintf(buffer, bsize, "%s \"%s\" %s", id, codename, release);
+	}
+	else if((fp = fopen("/etc/make.conf", "r")) != NULL)
+	{
+		char keywords[bsize];
+		while(fgets(buffer, bsize, fp) != NULL)
+			find_match_char(buffer, "ACCEPT_KEYWORDS", keywords);
+		if (strstr(keywords, "\"") == NULL)
+			snprintf(buffer, bsize, "Gentoo Linux (stable)");
+		else
+			snprintf(buffer, bsize, "Gentoo Linux %s", keywords);
+	}		
+	else if((fp = fopen("/etc/redhat-release", "r")) != NULL)
+		fgets(buffer, bsize, fp);
+	else if((fp = fopen("/etc/slackware-version", "r")) != NULL)
+		fgets(buffer, bsize, fp);
+	else if((fp = fopen("/etc/mandrake-release", "r")) != NULL)
+		fgets(buffer, bsize, fp);
+	else if((fp = fopen("/etc/debian_version", "r")) != NULL)
+	{
+		char release[bsize];
+		fgets(release, bsize, fp);
+		snprintf(buffer, bsize, "Debian %s", release);
+	}
+	else if((fp = fopen("/etc/SuSE-release", "r")) != NULL)
+		fgets(buffer, bsize, fp);
+	else if((fp = fopen("/etc/turbolinux-release", "r")) != NULL)
+		fgets(buffer, bsize, fp);
+	else
+		snprintf(buffer, bsize, "Unknown Distro");
+	if(fp != NULL) fclose(fp);
+	
+	pos=strchr(buffer, '\n');
+	if(pos != NULL) *pos = '\0';
+	strcpy(name, buffer);
+	return 0;
+}
+
+int xs_parse_hwmon_chip(char *chip)
+{
+	if (!hwmon_chip_present())
+		return 1;
+	else
+		get_hwmon_chip_name(chip);
+	return 0;
+}
+
+int xs_parse_hwmon_temp(char *temp, unsigned int *sensor)
+{
+	unsigned int *value;
+	float celsius;
+        value = malloc(sizeof(int));
+
+	if (!hwmon_chip_present())
+		return 1;
+	else
+		get_hwmon_temp(value, sensor);
+		celsius = (float)*value;
+		snprintf(temp, bsize, "%.1fC", celsius/1000.0);
+		free(value);
+	return 0;
+}
diff -pruN 2.2.0-4/.pc/fix_xsys2.conf/xsys.c 2.2.0-4ubuntu1/.pc/fix_xsys2.conf/xsys.c
--- 2.2.0-4/.pc/fix_xsys2.conf/xsys.c	1970-01-01 00:00:00.000000000 +0000
+++ 2.2.0-4ubuntu1/.pc/fix_xsys2.conf/xsys.c	2014-11-12 09:08:13.000000000 +0000
@@ -0,0 +1,742 @@
+/*
+ * xsys.c - main functions for X-Sys 2
+ * by mikeshoup
+ * Copyright (C) 2003, 2004, 2005 Michael Shoup
+ * Copyright (C) 2005, 2006, 2007 Tony Vroon
+ *
+ * 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 2 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
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "xchat-plugin.h"
+#include "parse.h"
+#include "match.h"
+#include "xsys.h"
+#include <audacious/dbus.h>
+#include <audacious/audctrl.h>
+
+static xchat_plugin *ph;
+
+static char format[bsize] = "%B%1%B[%2]";
+static char playing[42] = "now_playing";
+unsigned int percentages = 1;
+static unsigned int action = 0;
+
+static void load_config();
+static void save_config();
+static gboolean dbus_init(void);
+
+static int format_cb		(char *word[], char *word_eol[], void *userdata);
+static int playing_cb		(char *word[], char *word_eol[], void *userdata);
+static int percentages_cb	(char *word[], char *word_eol[], void *userdata);
+static int action_cb		(char *word[], char *word_eol[], void *userdata);
+static int sysinfo_cb		(char *word[], char *word_eol[], void *userdata);
+static int xsys_cb		(char *word[], char *word_eol[], void *userdata);
+static int cpuinfo_cb		(char *word[], char *word_eol[], void *userdata);
+static int uptime_cb		(char *word[], char *word_eol[], void *userdata);
+static int osinfo_cb		(char *word[], char *word_eol[], void *userdata);
+static int sound_cb		(char *word[], char *word_eol[], void *userdata);
+static int netdata_cb		(char *word[], char *word_eol[], void *userdata);
+static int netstream_cb		(char *word[], char *word_eol[], void *userdata);
+static int disk_cb		(char *word[], char *word_eol[], void *userdata);
+static int mem_cb		(char *word[], char *word_eol[], void *userdata);
+static int video_cb		(char *word[], char *word_eol[], void *userdata);
+static int ether_cb		(char *word[], char *word_eol[], void *userdata);
+static int distro_cb		(char *word[], char *word_eol[], void *userdata);
+#if 0
+static int hwmon_cb		(char *word[], char *word_eol[], void *userdata);
+#endif
+static int np_cb		(char *word[], char *word_eol[], void *userdata);
+static DBusGProxy *dbus_proxy = NULL;
+static DBusGConnection *connection = NULL;
+
+int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name,
+                      char **plugin_desc, char **plugin_version, char *arg)
+{
+	ph = plugin_handle;
+	*plugin_name    = "X-Sys_2";
+	*plugin_desc    = "A sysinfo/audacious plugin";
+	*plugin_version = VER_STRING;
+
+	xchat_hook_command(ph, "XSYS2FORMAT",XCHAT_PRI_NORM, format_cb,    NULL, NULL);
+	xchat_hook_command(ph, "PLAYING",    XCHAT_PRI_NORM, playing_cb,   NULL, NULL);
+	xchat_hook_command(ph, "PERCENTAGES",XCHAT_PRI_NORM, percentages_cb,   NULL, NULL);
+	xchat_hook_command(ph, "NPACTION",   XCHAT_PRI_NORM, action_cb,    NULL, NULL);
+	xchat_hook_command(ph, "SYSINFO",    XCHAT_PRI_NORM, sysinfo_cb,   NULL, (void *) 0);
+	xchat_hook_command(ph, "ESYSINFO",   XCHAT_PRI_NORM, sysinfo_cb,   NULL, (void *) 1);
+	xchat_hook_command(ph, "XSYS",       XCHAT_PRI_NORM, xsys_cb,      NULL, (void *) 0);
+	xchat_hook_command(ph, "EXSYS",      XCHAT_PRI_NORM, xsys_cb,      NULL, (void *) 1);
+	xchat_hook_command(ph, "CPUINFO",    XCHAT_PRI_NORM, cpuinfo_cb,   NULL, (void *) 0);
+	xchat_hook_command(ph, "ECPUINFO",   XCHAT_PRI_NORM, cpuinfo_cb,   NULL, (void *) 1);
+	xchat_hook_command(ph, "SYSUPTIME",  XCHAT_PRI_NORM, uptime_cb,    NULL, (void *) 0);
+	xchat_hook_command(ph, "ESYSUPTIME", XCHAT_PRI_NORM, uptime_cb,    NULL, (void *) 1);
+	xchat_hook_command(ph, "OSINFO",     XCHAT_PRI_NORM, osinfo_cb,    NULL, (void *) 0);
+	xchat_hook_command(ph, "EOSINFO",    XCHAT_PRI_NORM, osinfo_cb,    NULL, (void *) 1);
+	xchat_hook_command(ph, "SOUND",      XCHAT_PRI_NORM, sound_cb,     NULL, (void *) 0);
+	xchat_hook_command(ph, "ESOUND",     XCHAT_PRI_NORM, sound_cb,     NULL, (void *) 1);
+	xchat_hook_command(ph, "NETDATA",    XCHAT_PRI_NORM, netdata_cb,   NULL, (void *) 0);
+	xchat_hook_command(ph, "ENETDATA",   XCHAT_PRI_NORM, netdata_cb,   NULL, (void *) 1);
+	xchat_hook_command(ph, "NETSTREAM",  XCHAT_PRI_NORM, netstream_cb, NULL, (void *) 0);
+	xchat_hook_command(ph, "ENETSTREAM", XCHAT_PRI_NORM, netstream_cb, NULL, (void *) 1);
+	xchat_hook_command(ph, "DISKINFO",   XCHAT_PRI_NORM, disk_cb,      NULL, (void *) 0);
+	xchat_hook_command(ph, "EDISKINFO",  XCHAT_PRI_NORM, disk_cb,      NULL, (void *) 1);
+	xchat_hook_command(ph, "MEMINFO",    XCHAT_PRI_NORM, mem_cb,       NULL, (void *) 0);
+	xchat_hook_command(ph, "EMEMINFO",   XCHAT_PRI_NORM, mem_cb,       NULL, (void *) 1);
+	xchat_hook_command(ph, "VIDEO",      XCHAT_PRI_NORM, video_cb,     NULL, (void *) 0);
+	xchat_hook_command(ph, "EVIDEO",     XCHAT_PRI_NORM, video_cb,     NULL, (void *) 1);
+	xchat_hook_command(ph, "ETHER",      XCHAT_PRI_NORM, ether_cb,     NULL, (void *) 0);
+	xchat_hook_command(ph, "EETHER",     XCHAT_PRI_NORM, ether_cb,     NULL, (void *) 1);
+	xchat_hook_command(ph, "DISTRO",     XCHAT_PRI_NORM, distro_cb,    NULL, (void *) 0);
+	xchat_hook_command(ph, "EDISTRO",    XCHAT_PRI_NORM, distro_cb,    NULL, (void *) 1);
+#if 0
+	xchat_hook_command(ph, "HWMON",      XCHAT_PRI_NORM, hwmon_cb,     NULL, (void *) 0);
+	xchat_hook_command(ph, "EHWMON",     XCHAT_PRI_NORM, hwmon_cb,     NULL, (void *) 1);
+#endif
+	if (dbus_init())
+	{
+		xchat_hook_command(ph, "NP",         XCHAT_PRI_NORM, np_cb,        NULL, (void *) 0);
+		xchat_hook_command(ph, "ENP",        XCHAT_PRI_NORM, np_cb,        NULL, (void *) 1);
+		xchat_printf(ph, "D-Bus MPRIS support initialized", VER_STRING);
+	}
+	
+	load_config();
+
+	xchat_printf(ph, "X-Sys %s Loaded Succesfully", VER_STRING);
+	
+	return 1;
+}
+
+static void xchat_plugin_deinit()
+{
+	/* blahblahblah */
+}
+
+static void save_config()
+{
+	FILE *fp;
+	char buffer[bsize];
+	snprintf(buffer, bsize, "%s/xsys2.conf", xchat_get_info(ph, "xchatdirfs"));
+	fp = fopen(buffer, "w");
+	if(fp == NULL)
+	{
+		printf("ERROR writing xsys2.conf");
+		return;
+	}
+	fprintf(fp, "format: %s\n", format);
+	fprintf(fp, "playing: %s\n", playing);
+	fprintf(fp, "percentages: %i\n", percentages);
+	fprintf(fp, "action: %i\n", action);
+	fclose(fp);
+	return;
+}
+
+static void load_config()
+{
+	FILE *fp;
+	char buffer[bsize];
+	snprintf(buffer, bsize, "%s/xsys2.conf", xchat_get_info(ph, "xchatdirfs"));
+	fp = fopen(buffer, "r");
+	if(fp == NULL)
+		save_config();
+	
+	while(fgets(buffer, bsize, fp) != NULL)
+	{
+		find_match_char(buffer, "format", format);
+		find_match_char(buffer, "playing", playing);
+		find_match_int(buffer, "percentages", &percentages);
+		find_match_int(buffer, "action", &action);
+	}
+	fclose(fp);
+}
+
+static gboolean dbus_init(void)
+{
+        GError *error = NULL;
+
+        connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+        if (connection == NULL)
+                return FALSE;
+
+        dbus_proxy = dbus_g_proxy_new_for_name(connection, AUDACIOUS_DBUS_SERVICE,
+                                                           AUDACIOUS_DBUS_PATH,
+                                                           AUDACIOUS_DBUS_INTERFACE);
+        if (dbus_proxy == NULL)
+                return FALSE;
+
+        return TRUE;
+}
+
+static int format_cb(char *word[], char *word_eol[], void *userdata)
+{
+	if(*(word[2]) == '\0')
+		xchat_printf(ph, "Current format string:\n%s", format);
+	else
+	{
+		strncpy(format, word_eol[2], bsize);
+		save_config();
+	}
+	return XCHAT_EAT_ALL;
+}
+
+static int playing_cb(char *word[], char *word_eol[], void *userdata)
+{
+	if(*(word[2]) == '\0')
+		xchat_printf(ph, "Current playing string:\n%s", playing);
+	else
+	{
+		strncpy(playing, word_eol[2], 42);
+		save_config();
+	}
+	return XCHAT_EAT_ALL;
+}
+
+static int percentages_cb(char *word[], char *word_eol[], void *userdata)
+{
+	if(*(word[2]) == '\0')
+		if (percentages != 0)
+			xchat_printf(ph, "Percentages currently enabled");
+		else
+			xchat_printf(ph, "Percentages currently disabled");		
+	else
+	{
+		percentages = atoi(word[2]);
+		save_config();
+	}
+	return XCHAT_EAT_ALL;
+}
+
+static int action_cb(char *word[], char *word_eol[], void *userdata)
+{
+	if(*(word[2]) == '\0')
+		if (action != 0)
+			xchat_printf(ph, "Now playing action currently enabled");
+		else
+			xchat_printf(ph, "Now playing action currently disabled");		
+	else
+	{
+		action = atoi(word[2]);
+		save_config();
+	}
+	return XCHAT_EAT_ALL;
+}
+
+static int sysinfo_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char sysinfo[bsize], buffer[bsize], cpu_model[bsize], cpu_cache[bsize], cpu_vendor[bsize];
+	char os_host[bsize], os_user[bsize], os_kernel[bsize];
+	unsigned long long mem_total, mem_free;
+	unsigned int count;
+	double cpu_freq;
+	int giga = 0;
+	sysinfo[0] = '\0';
+
+// BEGIN OS PARSING
+	if(xs_parse_os(os_user, os_host, os_kernel) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_os()");
+		return XCHAT_EAT_ALL;
+	}
+
+	snprintf(buffer, bsize, "%s", os_kernel);
+	format_output("os", buffer, format);
+	strncat(sysinfo, buffer, bsize-strlen(sysinfo));
+
+// BEGIN DISTRO PARSING
+        if(xs_parse_distro(buffer) != 0)
+		strncpy(buffer, "Unknown", bsize);
+	format_output("distro", buffer, format);
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(sysinfo));	
+	
+// BEGIN CPU PARSING
+	if(xs_parse_cpu(cpu_model, cpu_vendor, &cpu_freq, cpu_cache, &count) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_cpu()");
+		return XCHAT_EAT_ALL;
+	}
+	
+	if(cpu_freq > 1000)
+	{
+		cpu_freq /= 1000;
+		giga = 1;
+	}
+	
+	if(giga) snprintf(buffer, bsize, "%d x %s (%s) @ %.2fGHz", count, cpu_model, cpu_vendor, cpu_freq);
+	else snprintf(buffer, bsize, "%d x %s (%s) @ %.0fMHz", count, cpu_model, cpu_vendor, cpu_freq);
+	format_output("cpu", buffer, format);
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(sysinfo));
+
+// BEGIN MEMORY PARSING
+	if(xs_parse_meminfo(&mem_total, &mem_free, 0) == 1)
+	{
+		xchat_printf(ph, "ERROR in parse_meminfo!");
+		return XCHAT_EAT_ALL;
+	}
+	snprintf(buffer, bsize, "%s", pretty_freespace("Physical", &mem_free, &mem_total));
+	format_output("mem", buffer, format);	
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(sysinfo));
+	
+// BEGIN DISK PARSING
+	if(xs_parse_df(NULL, buffer))
+	{
+		xchat_printf(ph, "ERROR in parse_df");
+		return XCHAT_EAT_ALL;
+	}
+	format_output("disk", buffer, format);
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(buffer));
+	
+//BEGIN VIDEO PARSING
+	if(xs_parse_video(buffer))
+	{
+		xchat_printf(ph, "ERROR in parse_video");
+		return XCHAT_EAT_ALL;
+	}
+	format_output("video", buffer, format);
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(buffer));
+
+//BEGIN ETHER PARSING
+       if(xs_parse_ether(buffer))
+		strncpy(buffer, "None found", bsize);
+	format_output("ether", buffer, format);
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(buffer));
+
+//BEGIN SOUND PARSING
+	if(xs_parse_sound(buffer))
+		strncpy(buffer, "Not present", bsize);
+	format_output("sound", buffer, format);
+	strcat(sysinfo, "\017 ");
+	strncat(sysinfo, buffer, bsize-strlen(buffer));
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", sysinfo);
+	else
+		xchat_commandf(ph, "say %s", sysinfo);	
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int xsys_cb(char *word[], char *word_eol[], void *userdata)
+{
+	if((long)userdata)
+		xchat_printf(ph, "You are using X-Sys v%s (http://dev.gentoo.org/~chainsaw/xsys)", VER_STRING);
+	else
+		xchat_commandf(ph, "me is using X-Sys v%s (http://dev.gentoo.org/~chainsaw/xsys)", VER_STRING);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int cpuinfo_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char model[bsize], vendor[bsize], cache[bsize], buffer[bsize];
+	unsigned int count;
+	double freq;
+	int giga = 0;
+	
+	if(xs_parse_cpu(model, vendor, &freq, cache, &count) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_cpu()");
+		return XCHAT_EAT_ALL;
+	}
+	
+	if(freq > 1000)
+	{
+		freq /= 1000;
+		giga = 1;
+	}
+	
+	if(giga) snprintf(buffer, bsize, "%d x %s (%s) @ %.2fGHz w/ %s L2 Cache", count, model, vendor, freq, cache);
+	else snprintf(buffer, bsize, "%d x %s (%s) @ %.0fMHz w/ %s L2 Cache", count, model, vendor, freq, cache);
+	
+	format_output("cpu", buffer, format);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", buffer);
+	else
+		xchat_commandf(ph, "say %s", buffer);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int uptime_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char buffer[bsize];
+	int weeks, days, hours, minutes, seconds;
+	
+	if(xs_parse_uptime(&weeks, &days, &hours, &minutes, &seconds))
+	{
+		xchat_printf(ph, "ERROR in parse_uptime()");
+		return XCHAT_EAT_ALL;
+	}
+	
+	if( minutes != 0 || hours != 0 || days != 0 || weeks != 0 )
+	{
+		if( hours != 0 || days != 0 || weeks != 0 )
+		{
+			if( days  !=0 || weeks != 0 )
+			{
+                                if( weeks != 0 )
+                                {
+                                        snprintf( buffer, bsize, "%dw %dd %dh %dm %ds",
+                                                  weeks, days, hours, minutes, seconds );
+                                }
+                                else
+                                {
+                                        snprintf( buffer, bsize, "%dd %dh %dm %ds",
+                                                  days, hours, minutes, seconds );
+                                }
+                        }
+                        else
+                        {
+                                snprintf( buffer, bsize, "%dh %dm %ds",
+                                          hours, minutes, seconds );
+                        }
+                }
+                else
+                {
+                        snprintf( buffer, bsize, "%dm %ds", minutes, seconds );
+                }
+        }
+
+	format_output("uptime", buffer, format);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", buffer);
+	else
+		xchat_commandf(ph, "say %s", buffer);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int osinfo_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char buffer[bsize], user[bsize], host[bsize], kernel[bsize];
+	
+	if(xs_parse_os(user, host, kernel) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_os()");
+		return XCHAT_EAT_ALL;
+	}
+
+	snprintf(buffer, bsize, "%s@%s, %s", user, host, kernel);
+	format_output("os", buffer, format);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", buffer);
+	else
+		xchat_commandf(ph, "say %s", buffer);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int sound_cb(char *word[], char *world_eol[], void *userdata)
+{
+	char sound[bsize];
+	if(xs_parse_sound(sound) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_asound()!");
+		return XCHAT_EAT_ALL;
+	}
+	
+	format_output("sound", sound, format);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", sound);
+	else
+		xchat_commandf(ph, "say %s", sound);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int distro_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char name[bsize];
+	if(xs_parse_distro(name) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_distro()!");
+		return XCHAT_EAT_ALL;
+	}
+	
+	format_output("distro", name, format);
+	if((long)userdata)
+		xchat_printf(ph, "%s", name);
+	else
+		xchat_commandf(ph, "say %s", name);
+	return XCHAT_EAT_ALL;
+}	
+
+static int netdata_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char netdata[bsize];
+	unsigned long long bytes_recv, bytes_sent;
+	
+	if(*word[2] == '\0')
+	{
+		xchat_printf(ph, "You must specify a network device! (eg.: /netdata eth0)");
+		return XCHAT_EAT_ALL;
+	}
+	
+	if(xs_parse_netdev(word[2], &bytes_recv, &bytes_sent) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_netdev");
+		return XCHAT_EAT_ALL;
+	}
+	
+	bytes_recv /= 1024;
+	bytes_sent /= 1024;
+	
+	snprintf(netdata, bsize, "%s: %.1f MB Recieved, %.1f MB Sent", word[2], (double)bytes_recv/1024.0, (double)bytes_sent/1024.0);
+	format_output("netdata", netdata, format);
+	if((long)userdata)
+		xchat_printf(ph, "%s", netdata);
+	else
+		xchat_commandf(ph, "say %s", netdata);
+		
+	return XCHAT_EAT_ALL;
+}
+
+static int netstream_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char netstream[bsize], mag_r[3], mag_s[5];
+	unsigned long long bytes_recv, bytes_sent, bytes_recv_p, bytes_sent_p;
+	struct timespec ts = {1, 0};
+	
+
+	if(*word[2] == '\0')
+	{
+		xchat_printf(ph, "You must specify a network device! (eg.: /netstream eth0)");
+		return XCHAT_EAT_ALL;
+	}
+	
+	if(xs_parse_netdev(word[2], &bytes_recv, &bytes_sent) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_netdev");
+		return XCHAT_EAT_ALL;
+	}
+	
+	while(nanosleep(&ts, &ts) < 0);
+	
+	if(xs_parse_netdev(word[2], &bytes_recv_p, &bytes_sent_p) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_netdev");
+		return XCHAT_EAT_ALL;
+	}
+	
+	bytes_recv = (bytes_recv_p - bytes_recv);
+	bytes_sent = (bytes_sent_p - bytes_sent);
+	
+	if(bytes_recv>1024)
+	{
+		bytes_recv /= 1024;
+		snprintf(mag_r, 5, "KB/s");
+	}
+	else snprintf(mag_r, 5, "B/s");
+	
+	if(bytes_sent>1024)
+	{
+		bytes_sent /= 1024;
+		snprintf(mag_s, 5, "KB/s");
+	}
+	else snprintf(mag_s, 5, "B/s");
+	
+	snprintf(netstream, bsize, "%s: Receiving %llu %s, Sending %llu %s", word[2], bytes_recv, mag_r, bytes_sent, mag_s);
+	format_output("netstream", netstream, format);
+	if((long)userdata)
+		xchat_printf(ph, "%s", netstream);
+	else
+		xchat_commandf(ph, "say %s", netstream);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int disk_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char string[bsize] = {0,};
+	
+	if(*word[2] == '\0')
+	{
+		if(xs_parse_df(NULL, string))
+		{
+			xchat_printf(ph, "ERROR in parse_df");
+			return XCHAT_EAT_ALL;
+		}
+	}
+	else
+	{
+		if(xs_parse_df(word[2], string))
+		{
+			xchat_printf(ph, "ERROR in parse_df");
+			return XCHAT_EAT_ALL;
+		}
+	}
+	
+	format_output("disk", string, format);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", string);
+	else
+		xchat_commandf(ph, "say %s", string);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int mem_cb(char *word[], char *word_eol[], void *userdata)
+{
+	unsigned long long mem_total, mem_free, swap_total, swap_free;
+	char string[bsize];
+	
+	if(xs_parse_meminfo(&mem_total, &mem_free, 0) == 1)
+	{
+		xchat_printf(ph, "ERROR in parse_meminfo!");
+		return XCHAT_EAT_ALL;
+	}
+	if(xs_parse_meminfo(&swap_total, &swap_free, 1) == 1)
+	{
+		xchat_printf(ph, "ERROR in parse_meminfo!");
+		return XCHAT_EAT_ALL;
+	}
+
+	snprintf(string, bsize, "%s - %s", pretty_freespace("Physical", &mem_free, &mem_total),
+		 pretty_freespace("Swap", &swap_free, &swap_total));
+	format_output("mem", string, format);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", string);
+	else
+		xchat_commandf(ph, "say %s", string);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int video_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char vid_card[bsize], agp_bridge[bsize], buffer[bsize];
+	int ret;
+	if((ret = xs_parse_video(vid_card)) != 0)
+	{
+		xchat_printf(ph, "ERROR in parse_video! %d", ret);
+		return XCHAT_EAT_ALL;
+	}
+	
+	if(xs_parse_agpbridge(agp_bridge) != 0)
+		snprintf(buffer, bsize, "%s", vid_card);
+	else
+		snprintf(buffer, bsize, "%s @ %s", vid_card, agp_bridge);
+	
+	format_output("video", buffer, format);
+	if((long)userdata)
+		xchat_printf(ph, "%s", buffer);
+	else
+		xchat_commandf(ph, "say %s", buffer);
+	
+	return XCHAT_EAT_ALL;
+}
+
+static int ether_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char ethernet_card[bsize];
+	if(xs_parse_ether(ethernet_card))
+		strncpy(ethernet_card, "None found", bsize);
+	format_output("ether", ethernet_card, format);
+	if((long)userdata)
+		xchat_printf(ph, "%s", ethernet_card);
+	else
+		xchat_commandf(ph, "say %s", ethernet_card);
+	
+	return XCHAT_EAT_ALL;
+}
+
+#if 0
+static int hwmon_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char chip[bsize], buffer[bsize];
+	
+	if(xs_parse_hwmon_chip(chip))
+	{
+		xchat_printf(ph, "ERROR No hardware monitoring support found");
+		return XCHAT_EAT_ALL;
+	}
+	format_output("sensor", chip, format);
+	strcat(chip, "\017 ");
+
+	xs_parse_hwmon_temp(buffer, 1);
+	format_output("temp1", buffer, format);
+	strncat(chip, buffer, bsize);
+	
+	if((long)userdata)
+		xchat_printf(ph, "%s", chip);
+	else
+		xchat_commandf(ph, "say %s", chip);
+	
+	return XCHAT_EAT_ALL;
+}
+#endif
+
+static int np_cb(char *word[], char *word_eol[], void *userdata)
+{
+	char *buffer = NULL, title[bsize], length[42];
+	int pos, len, p = audacious_remote_get_playlist_pos(dbus_proxy);
+
+	if (!audacious_remote_is_running(dbus_proxy))
+	{
+		xchat_printf(ph, "Audacious is not currently running");
+		return XCHAT_EAT_ALL;
+        }
+
+	pos = audacious_remote_get_output_time(dbus_proxy);
+	len = audacious_remote_get_playlist_time(dbus_proxy, p);
+	buffer = decruft_filename(audacious_remote_get_playlist_title(dbus_proxy, p));
+
+	strncpy(title, buffer, bsize);
+	
+	if (action != 0)
+		flat_format_output(playing, title, format);
+	else
+		format_output(playing, title, format);
+	strcat(title, "\017 ");
+
+	if(len == -1)
+		snprintf(length, 42, "%d:%02d/stream",
+		 ((pos/1000)-((pos/1000)%60))/60, (pos/1000)%60);
+	else 
+		snprintf(length, 42, "%d:%02d/%d:%02d",
+		 ((pos/1000)-((pos/1000)%60))/60, (pos/1000)%60,
+		 ((len/1000)-((len/1000)%60))/60, (len/1000)%60);
+	
+	if (action != 0)
+		flat_format_output("length", length, format);
+	else
+		format_output("length", length, format);
+	strncat(title, length, bsize);
+	
+	if ((action != 0) && (long)userdata)
+		xchat_printf(ph, "You are %s", title);
+	else if (action != 0)
+		xchat_commandf(ph, "me is %s", title);
+	else if ((long)userdata)
+		xchat_printf(ph, "%s", title);
+	else
+		xchat_commandf(ph, "say %s", title);
+	
+	return XCHAT_EAT_ALL;
+}
diff -pruN 2.2.0-4/xsys.c 2.2.0-4ubuntu1/xsys.c
--- 2.2.0-4/xsys.c	2014-11-12 09:08:12.000000000 +0000
+++ 2.2.0-4ubuntu1/xsys.c	2014-11-12 09:08:13.000000000 +0000
@@ -153,8 +153,11 @@ static void load_config()
 	snprintf(buffer, bsize, "%s/xsys2.conf", xchat_get_info(ph, "xchatdirfs"));
 	fp = fopen(buffer, "r");
 	if(fp == NULL)
+	{
 		save_config();
-	
+		fp = fopen(buffer, "r");
+	}
+
 	while(fgets(buffer, bsize, fp) != NULL)
 	{
 		find_match_char(buffer, "format", format);
