Add vanilla X-Sys sources
This commit is contained in:
parent
cb891a9732
commit
187351fa61
61
plugins/sysinfo/hwmon.c
Normal file
61
plugins/sysinfo/hwmon.c
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* hwmon.c - Hardware monitoring functions for X-Sys
|
||||
* Copyright (C) 2005 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"
|
||||
|
||||
int hwmon_chip_present()
|
||||
{
|
||||
FILE *fp = fopen("/sys/class/hwmon/hwmon0/device/name", "r");
|
||||
if(fp != NULL) {
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void get_hwmon_chip_name(char *name)
|
||||
{
|
||||
char *position, buffer[bsize];
|
||||
FILE *fp = fopen("/sys/class/hwmon/hwmon0/device/name", "r");
|
||||
if(fp != NULL) {
|
||||
if(fgets(buffer, bsize, fp) != NULL) {
|
||||
position = strstr(buffer, "\n");
|
||||
*(position) = '\0';
|
||||
snprintf(name, sizeof(name), "%s", buffer);
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
void get_hwmon_temp(unsigned int *value, unsigned int *sensor)
|
||||
{
|
||||
char buffer[bsize];
|
||||
snprintf(buffer, bsize, "/sys/class/hwmon/hwmon0/device/temp%i_input", *sensor);
|
||||
FILE *fp = fopen(buffer, "r");
|
||||
if(fp != NULL) {
|
||||
if(fgets(buffer, bsize, fp) != NULL)
|
||||
*value = atoi(buffer);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
28
plugins/sysinfo/hwmon.h
Normal file
28
plugins/sysinfo/hwmon.h
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* hwmon.h - Hardware monitoring header for X-Sys
|
||||
* Copyright (C) 2005 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
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _HWMON_H_
|
||||
#define _HWMON_H_
|
||||
|
||||
int hwmon_chip_present();
|
||||
void get_hwmon_chip_name(char *name);
|
||||
void get_hwmon_temp(unsigned int *value, unsigned int *sensor);
|
||||
|
||||
#endif
|
229
plugins/sysinfo/match.c
Normal file
229
plugins/sysinfo/match.c
Normal file
@ -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);
|
||||
}
|
35
plugins/sysinfo/match.h
Normal file
35
plugins/sysinfo/match.h
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* match.h - matching header for X-Sys
|
||||
* Copyright (C) 2005 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
|
||||
*/
|
||||
|
||||
#ifndef _MATCH_H_
|
||||
#define _MATCH_H_
|
||||
|
||||
void find_match_char(char *buffer, char *match, char *result);
|
||||
void find_match_double(char *buffer, char *match, double *result);
|
||||
void find_match_double_hex(char *buffer, char *match, double *result);
|
||||
void find_match_int(char *buffer, char *match, unsigned int *result);
|
||||
void find_match_ll(char *buffer, char *match, unsigned long long *result);
|
||||
void format_output(const char *arg, char *string, char *format);
|
||||
void flat_format_output(const char *arg, char *string, char *format);
|
||||
float percentage(unsigned long long *free, unsigned long long *total);
|
||||
char *pretty_freespace(const char *desc, unsigned long long *free_k, unsigned long long *total_k);
|
||||
void remove_leading_whitespace(char *buffer);
|
||||
char *decruft_filename(char *buffer);
|
||||
|
||||
#endif
|
451
plugins/sysinfo/parse.c
Normal file
451
plugins/sysinfo/parse.c
Normal file
@ -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;
|
||||
}
|
41
plugins/sysinfo/parse.h
Normal file
41
plugins/sysinfo/parse.h
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* parse.h - parsing header for X-Sys
|
||||
* by mikeshoup
|
||||
* Copyright (C) 2003, 2004, 2005 Michael Shoup
|
||||
* Copyright (C) 2005, 2006 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
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _PARSE_H_
|
||||
#define _PARSE_H_
|
||||
|
||||
int xs_parse_cpu(char *model, char *vendor, double *freq, char *cache, unsigned int *count);
|
||||
int xs_parse_uptime(int *weeks, int *days, int *hours, int *minutes, int *seconds);
|
||||
int xs_parse_os(char *user, char *host, char *kernel);
|
||||
int xs_parse_sound(char *snd_card);
|
||||
int xs_parse_netdev(const char *device, unsigned long long *bytes_recv, unsigned long long *bytes_sent);
|
||||
int xs_parse_df(const char *mount_point, char *string);
|
||||
int xs_parse_meminfo(unsigned long long *mem_tot, unsigned long long *mem_free, int swap);
|
||||
int xs_parse_video(char *vid_card);
|
||||
int xs_parse_agpbridge(char *agp_bridge);
|
||||
int xs_parse_ether(char *ethernet_card);
|
||||
int xs_parse_xmms_info(char **title, unsigned int *songtime, unsigned int *playtime);
|
||||
int xs_parse_distro(char *name);
|
||||
int xs_parse_hwmon_chip(char *chip);
|
||||
int xs_parse_hwmon_temp(char *temp, unsigned int *sensor);
|
||||
|
||||
#endif
|
149
plugins/sysinfo/pci.c
Normal file
149
plugins/sysinfo/pci.c
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* pci.c - PCI functions for X-Sys
|
||||
* Copyright (C) 1997-1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz> [PCI routines from lspci]
|
||||
* Copyright (C) 2000 Tom Rini <trini@kernel.crashing.org> [XorgAutoConfig pci.c, based on lspci]
|
||||
* Copyright (C) 2005, 2006 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 <pci/pci.h>
|
||||
#include "xsys.h"
|
||||
|
||||
static struct pci_filter filter; /* Device filter */
|
||||
static struct pci_access *pacc;
|
||||
int bus, dev, func; /* Location of the card */
|
||||
|
||||
struct device {
|
||||
struct device *next;
|
||||
struct pci_dev *dev;
|
||||
unsigned int config_cnt;
|
||||
u8 config[256];
|
||||
};
|
||||
|
||||
static struct device *first_dev;
|
||||
|
||||
static struct device *scan_device(struct pci_dev *p)
|
||||
{
|
||||
int how_much = 64;
|
||||
struct device *d;
|
||||
|
||||
if (!pci_filter_match(&filter, p))
|
||||
return NULL;
|
||||
d = malloc(sizeof(struct device));
|
||||
bzero(d, sizeof(*d));
|
||||
d->dev = p;
|
||||
if (!pci_read_block(p, 0, d->config, how_much))
|
||||
exit(1);
|
||||
if (how_much < 128 && (d->config[PCI_HEADER_TYPE] & 0x7f) == PCI_HEADER_TYPE_CARDBUS) {
|
||||
/* For cardbus bridges, we need to fetch 64 bytes more to get the full standard header... */
|
||||
if (!pci_read_block(p, 64, d->config+64, 64))
|
||||
exit(1);
|
||||
how_much = 128;
|
||||
}
|
||||
d->config_cnt = how_much;
|
||||
pci_setup_cache(p, d->config, d->config_cnt);
|
||||
pci_fill_info(p, PCI_FILL_IDENT);
|
||||
return d;
|
||||
}
|
||||
|
||||
static void scan_devices(void)
|
||||
{
|
||||
struct device *d;
|
||||
struct pci_dev *p;
|
||||
|
||||
pci_scan_bus(pacc);
|
||||
for(p=pacc->devices; p; p=p->next)
|
||||
if ((d = scan_device(p))) {
|
||||
d->next = first_dev;
|
||||
first_dev = d;
|
||||
}
|
||||
}
|
||||
|
||||
static u16 get_conf_word(struct device *d, unsigned int pos)
|
||||
{
|
||||
return d->config[pos] | (d->config[pos+1] << 8);
|
||||
}
|
||||
|
||||
int pci_find_by_class(u16 *class, char *vendor, char *device)
|
||||
{
|
||||
struct device *d;
|
||||
struct pci_dev *p;
|
||||
int nomatch = 1;
|
||||
|
||||
pacc = pci_alloc();
|
||||
pci_filter_init(pacc, &filter);
|
||||
pci_init(pacc);
|
||||
scan_devices();
|
||||
|
||||
for(d=first_dev; d; d=d->next) {
|
||||
p = d->dev;
|
||||
/* Acquire vendor & device ID if the class matches */
|
||||
if(get_conf_word(d, PCI_CLASS_DEVICE) == *class) {
|
||||
nomatch = 0;
|
||||
snprintf(vendor,7,"%04x",p->vendor_id);
|
||||
snprintf(device,7,"%04x",p->device_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pci_cleanup(pacc);
|
||||
return nomatch;
|
||||
}
|
||||
|
||||
void pci_find_fullname(char *fullname, char *vendor, char *device)
|
||||
{
|
||||
char buffer[bsize], vendorname[bsize/2] = "", devicename[bsize/2] = "", *position;
|
||||
int cardfound = 0;
|
||||
FILE *fp = fopen(PCIIDS, "r");
|
||||
if(fp == NULL) {
|
||||
snprintf(fullname, bsize, "%s:%s", vendor, device);
|
||||
return;
|
||||
}
|
||||
|
||||
while(fgets(buffer, bsize, fp) != NULL) {
|
||||
if (!isspace(buffer[0]) && strstr(buffer, vendor) != NULL) {
|
||||
position = strstr(buffer, vendor);
|
||||
position += 6;
|
||||
strncpy(vendorname, position, bsize/2);
|
||||
position = strstr(vendorname, "\n");
|
||||
*(position) = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(fgets(buffer, bsize, fp) != NULL) {
|
||||
if(strstr(buffer, device) != NULL) {
|
||||
position = strstr(buffer, device);
|
||||
position += 6;
|
||||
strncpy(devicename, position, bsize/2);
|
||||
position = strstr(devicename, " (");
|
||||
if (position == NULL)
|
||||
position = strstr(devicename, "\n");
|
||||
*(position) = '\0';
|
||||
cardfound = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (cardfound == 1)
|
||||
snprintf(fullname, bsize, "%s %s", vendorname, devicename);
|
||||
else
|
||||
snprintf(fullname, bsize, "%s:%s", vendor, device);
|
||||
fclose(fp);
|
||||
}
|
28
plugins/sysinfo/pci.h
Normal file
28
plugins/sysinfo/pci.h
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* pci.h - PCI header for X-Sys
|
||||
* Copyright (C) 2005 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
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _PCI_H_
|
||||
#define _PCI_H_
|
||||
|
||||
#include <pci/pci.h>
|
||||
void pci_find_fullname(char *fullname, char *vendor, char *device);
|
||||
int pci_find_by_class(u16 *class, char *vendor, char *device);
|
||||
|
||||
#endif
|
116
plugins/sysinfo/xsys-changelog
Normal file
116
plugins/sysinfo/xsys-changelog
Normal file
@ -0,0 +1,116 @@
|
||||
v2.2.0
|
||||
* (Thomas Cort) Report L2 cache info for Alpha CPUs
|
||||
* (Tony Vroon) Drop XMMS, port audacious features to D-Bus, make dependency mandatory
|
||||
* (Tony Vroon) Use pretty_freespace for memory & swap reporting as well as disk space
|
||||
* (Tony Vroon) Make pretty_freespace report none if total_size is 0, thanks to Emopig <andrew@nelless.net> for the report
|
||||
* (Tony Vroon) Make pretty_freespace aware of terabytes, petabytes, exabytes, zettabytes & yottabytes
|
||||
* (Tony Vroon) Remove xchatdirfs workaround
|
||||
|
||||
v2.1.0
|
||||
Removals & pending removal:
|
||||
* (Tony Vroon) Remove support for BMP, it is an abandoned project. Suggested upgrade path: audacious
|
||||
* (Tony Vroon) Remove /uname & /euname; the OS part of sysinfo displays similar info without requiring a process pipe
|
||||
* (Tony Vroon) Added a note that the xchatdirfs workaround is due for removal as X-Chat Gnome has fixed the bug
|
||||
|
||||
Bugfixes:
|
||||
* (Tony Vroon) Actually show the vendor that we retrieve in cpuinfo
|
||||
* (Tony Vroon) Display Gentoo Linux as stable or ~arch, the baselayout version doesn't really interest anyone
|
||||
* (Tony Vroon) Match framework: Make remove_leading_whitespace actually work
|
||||
* (Tony Vroon) Match framework: Do not assume that a delimiter is always followed by a space
|
||||
|
||||
Code improvements:
|
||||
* (Tony Vroon) PCI framework: We were requesting more info then we actually return to the caller
|
||||
* (Tony Vroon) Match framework: Consolidate delimiters in a single define & use 1 strpbrk instead of 2 strstr's
|
||||
* (Tony Vroon) Display the machine string instead of the pmac-generation as vendor info for PPC machines
|
||||
|
||||
New features
|
||||
* (Tony Vroon) Show memory capacity in gigabytes instead of in megabytes when appropriate
|
||||
* (Tony Vroon) Cut cpu name at comma (so overly long other info such as "altivec supported" is no longer displayed)
|
||||
* (Tony Vroon) Now Playing: Report time played as well as the song length
|
||||
* (Tony Vroon) Now Playing: Support reporting as an action; configurable at runtime
|
||||
* (Tony Vroon) Check LSB release data, prefer above all others; based on a code sample submitted by Thomas Winwood
|
||||
|
||||
v2.0.9
|
||||
* (Tony Vroon) Protect the matching framework against spurious matches (bug reported by Harm Geerts)
|
||||
* (Tony Vroon) Unexporting unnecessary symbols for PCI framework
|
||||
* (Tony Vroon) Deal with incompatible header changes in pciutils
|
||||
* (Tony Vroon) Begin implementing hardware monitoring support, not yet activated
|
||||
* (Tony Vroon) Add support for Audacious, a BMP fork
|
||||
|
||||
v2.0.8
|
||||
* (Tony Vroon) Make XMMS interface actually work, thanks to a patch from Morten Cools
|
||||
* (Tony Vroon) Use percentages for df information as well
|
||||
* (Gustavo Zacarias) Add support for Sparc architecture, cache size detection on sparc64 only
|
||||
* (Gustavo Zacarias) Consolidate buffer sizes into a single define
|
||||
|
||||
v2.0.7
|
||||
* (Tony Vroon) Have df parser ignore pseudo-filesystems; deal with other locales more gracefully
|
||||
* (Tony Vroon) Change default formatstring not to use mIRC color codes
|
||||
* (Tony Vroon) Add fallback to ~/.xchat2 for xchat-gnome which does not report xchatdirfs properly
|
||||
* (Tony Vroon) Revert to beepctrl.h style calls as infopipe is too unreliable
|
||||
|
||||
v2.0.6
|
||||
* (Tony Vroon) Rewrote PCI framework, no longer depends on sysfs, kernel 2.4 and lower will work now
|
||||
* (Tony Vroon) Made percentages configurable, can be set at runtime (feature request by Halcy0n)
|
||||
* (Tony Vroon) Abstract out all pointer voodoo from xsys.c
|
||||
* (Tony Vroon) Do not return XCHAT_EAT_NONE, causes spurious "unknown command" errors
|
||||
* (Tony Vroon) Deal more gracefully with a missing soundcard or unknown linux distribution
|
||||
* (Tony Vroon) Add error handling to the matching framework
|
||||
|
||||
v2.0.5
|
||||
* (Tony Vroon) Added support for parisc/hppa & ia64 architectures
|
||||
* (Tony Vroon) Proper report of L2 cache as "unknown" instead of showing bits of unitialized memory
|
||||
* (Tony Vroon) Upped PCI parser yield for ppc64 architecture, has high bus number for AGP card
|
||||
* (Tony Vroon) Use percentages in memory/swap information
|
||||
|
||||
v2.0.4
|
||||
* (Tony Vroon) /sound uses ALSA if possible, PCI now fallback (false positives reported with PCI code)
|
||||
* (Tony Vroon) Remove 0 prefix from first ALSA card; 1: and up will be shown for extra cards
|
||||
* (Tony Vroon) Matching code rewritten and separated out from other code
|
||||
* (Tony Vroon) Use new matching framework where possible
|
||||
* (Tony Vroon) Added support for Alpha architecture, thanks to Bert (bert@ev6.net)
|
||||
|
||||
v2.0.3
|
||||
* (Tony Vroon) Fix buttons, XMMS -> NP
|
||||
* (Tony Vroon) PCI functions separated out from other code; fully rewritten
|
||||
* (Tony Vroon) Use new PCI framework for sound detection; ALSA is now fallback
|
||||
* (Tony Vroon) Implement /ether
|
||||
* (Tony Vroon) /video now reports video card @ AGP bridge; resolution info dropped
|
||||
|
||||
v2.0.2
|
||||
* (Tony Vroon) XMMS/BMP: Delete XMMS/BMP detection; it just got obsoleted by a BMP bugfix
|
||||
* (Tony Vroon) XMMS/BMP: Change to /np & /enp as commands (np -> now playing)
|
||||
* (Tony Vroon) Allow customization of now_playing with /playing
|
||||
* (Tony Vroon) Separate out the length field for now_playing
|
||||
* (Tony Vroon) Better configuration file handling
|
||||
* (Tony Vroon) Set homepage to http://dev.gentoo.org/~chainsaw/xsys
|
||||
* (Tony Vroon) Make channel buttons optional, not everyone appreciates them
|
||||
* (Tony Vroon) Fix cpuinfo parsing on x86_64, a necessary define was missing
|
||||
|
||||
v2.0.1
|
||||
* (Tony Vroon) XMMS/BMP: Report "stream" if song length is -1
|
||||
* (Tony Vroon) XMMS/BMP: Determine whether XMMS or BMP is playing
|
||||
* (Tony Vroon) Better errorhandling if pci.ids parsing fails; at least mention raw PCI ID of card
|
||||
* (Tony Vroon) Remove AGP from video card messages; we detect plain PCI cards too
|
||||
* (Tony Vroon) Fix Debian release detector
|
||||
|
||||
v2.0.0
|
||||
* (mikeshoup) Clean up of code for 2.0.0 release
|
||||
* (Tony Vroon) Added PowerPC /proc/cpuinfo support
|
||||
* (Tony Vroon) Changed LSPCI to SYSFS
|
||||
|
||||
v1.9.3
|
||||
* (mikeshoup) Introduced distro function
|
||||
* (mikeshoup, Tony Vroon's suggestion) Removed bitrate from /XMMS
|
||||
|
||||
v1.9.2
|
||||
* 2005/01/14 (mikeshoup) Put in the userlist buttons
|
||||
* 2005/01/10 (mikeshoup) Added XMMS/BMP Support
|
||||
|
||||
v1.9.1
|
||||
* 2004/12/20 (mikeshoup) Added a dynamic formatting scheme
|
||||
* 2004/12/19 (mikeshoup) Changed some commands
|
||||
* 2004/12/18 (mikeshoup) Reintroducted /VIDEO
|
||||
|
||||
v1.9.0
|
||||
* 2004/12/17 (mikeshoup) Initial Release
|
15
plugins/sysinfo/xsys-install
Normal file
15
plugins/sysinfo/xsys-install
Normal file
@ -0,0 +1,15 @@
|
||||
INSTALLATION
|
||||
============
|
||||
Installation is straightforward. You need Audacious 1.4 or higher and D-Bus.
|
||||
Open up the Makefile, check to make sure PCIIDS points to your pci.ids file.
|
||||
(Symptom if you get it wrong: raw PCI ID's (XXXX:XXXX) emitted by /VIDEO and friends).
|
||||
|
||||
Run: make
|
||||
Run: make install
|
||||
|
||||
Voila!
|
||||
|
||||
NOTES:
|
||||
`make install' copies the compiled library (something like xsys-v.v.v.so) to
|
||||
$HOME/.xchat2/xsys-plugin.so for autoloading. If $HOME/.xchat2/xsys-plugin.so
|
||||
exists, it is removed first.
|
39
plugins/sysinfo/xsys-makefile
Normal file
39
plugins/sysinfo/xsys-makefile
Normal file
@ -0,0 +1,39 @@
|
||||
#### SET THIS VALUE TO THE LOCATION OF THE `pci.ids` file ####
|
||||
PCIIDS = /usr/share/misc/pci.ids
|
||||
|
||||
#### UNCOMMENT THIS IF YOU WANT THE BUTTONS ####
|
||||
#BUTTON = -Dbuttonbar
|
||||
|
||||
#### SHOULD NOT NEED TO EDIT BELOW THIS LINE ####
|
||||
VER_MAJOR = 2
|
||||
VER_MINOR = 2
|
||||
VER_PATCH = 0
|
||||
CC = gcc
|
||||
CFLAGS += -O2 -Wall -fPIC
|
||||
CFLAGS += $(shell pkg-config dbus-1 --cflags) $(shell pkg-config glib-2.0 --cflags)
|
||||
CFLAGS += -DVER_MINOR=$(VER_MINOR) -DVER_MAJOR=$(VER_MAJOR) -DVER_PATCH=$(VER_PATCH) \
|
||||
-DVER_STRING=\"$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH)\" -DPCIIDS=\"$(PCIIDS)\" $(BUTTON)
|
||||
LDFLAGS = $(CFLAGS) -shared
|
||||
LIBRARY = xsys-$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH).so
|
||||
OBJECTS = xsys.o parse.o pci.o match.o hwmon.o
|
||||
|
||||
ALL : $(LIBRARY)
|
||||
|
||||
$(LIBRARY) : $(OBJECTS)
|
||||
$(CC) $(LDFLAGS) -o $(LIBRARY) $(OBJECTS) -lpci $(shell pkg-config dbus-1 --libs) $(shell pkg-config glib-2.0 --libs) -laudclient
|
||||
|
||||
xsys.o : xsys.c
|
||||
parse.o : parse.c
|
||||
pci.o : pci.c
|
||||
match.o : match.c
|
||||
hwmon.o : hwmon.c
|
||||
|
||||
.PHONY : clean
|
||||
clean :
|
||||
rm -rf *.o *.so *~
|
||||
|
||||
.PHONY : install
|
||||
install : $(LIBRARY)
|
||||
rm -f $(HOME)/.xchat2/xsys-plugin.so
|
||||
cp ./$(LIBRARY) $(HOME)/.xchat2/xsys-plugin.so
|
||||
|
105
plugins/sysinfo/xsys-readme
Normal file
105
plugins/sysinfo/xsys-readme
Normal file
@ -0,0 +1,105 @@
|
||||
X-Sys README
|
||||
============
|
||||
What is X-Sys?
|
||||
|
||||
X-Sys is a plugin for X-Chat that allows you to display your current system statistics in
|
||||
a channel, private conversation or just in an echo to yourself for testing purposes.
|
||||
It is supported on Linux, running on various architectures. Right now x86, ppc, ppc64, sparc,
|
||||
sparc64 and alpha are supported, with parisc and ia64 implemented but awaiting testing.
|
||||
|
||||
---------------
|
||||
Who wrote this?
|
||||
|
||||
X-Sys is originally a Mike Shoup creation, from the very first alpha releases to the open-source
|
||||
version 1 releases. But then, things stalled. For a few months (more like a year almost)
|
||||
Mike didn't work on X-Sys. The last version that had been written was 1.0.5.
|
||||
The website was gone, and I (Tony) couldn't find Mike. So, I took over and improved it to my liking.
|
||||
It turned out that Mike was still around, though, he contacted me and started development again,
|
||||
now called version 2, a complete rewrite. Various 1.9 betas came out that I contributed patches to,
|
||||
and starting with version 2.0.0 I'm maintaining xchat-xsys again, this time with Mike's blessing.
|
||||
|
||||
---------------
|
||||
What do I need?
|
||||
|
||||
- X-Chat (regular or Gnome version)
|
||||
- Audacious 1.4 or higher
|
||||
- D-Bus (for communication with Audacious)
|
||||
- a working toolchain (compiler, binutils, etc).
|
||||
|
||||
------------------------------------------------
|
||||
What if I get errors about u8 not being defined?
|
||||
|
||||
Sorry to hear that, it appears your linux distribution neglected to install essential headers on your
|
||||
system. On Debian & Ubuntu, apt-get install pciutils-dev should make it happy.
|
||||
|
||||
========
|
||||
COMMANDS
|
||||
|
||||
X-Sys 2 has the following implemented commands:
|
||||
/XSYS & /EXSYS - Output current version, either to channel or echoed on screen.
|
||||
/CPUINFO & /ECPUINFO - Echoes or says current cpu statistics
|
||||
/SYSUPTIME & /ESYSUPTIME - Echoes or says current uptime
|
||||
/OSINFO & /EOSINFO - Echoes or says various OS statistics
|
||||
/SOUND & /ESOUND - Echoes or says the current sound card, as determined by ALSA
|
||||
/NETDATA & /ENETDATA - Echoes or says total amount transferred through a network
|
||||
interface. Use like: `/netdata eth0' (where eth0 is a network interface)
|
||||
/NETSTREAM & /ENETSTREAM - Echoes or says amount of bandwidth being used.
|
||||
Use like: `/netstream eth0' (where eth0 is a network interface)
|
||||
/DISKINFO & /EDISKINFO - Echoes or says free space on partitions. The DISK command has a
|
||||
few arguments as follows:
|
||||
ALL - Displays every partitions
|
||||
/mount - Displays free space for that specific mount point
|
||||
No arguments just displays total free space
|
||||
/MEMINFO & /EMEMINFO - Echoes or says memory information.
|
||||
/VIDEO & /EVIDEO - Echoes or says the current video card on the PCI bus
|
||||
/ETHER & /EETHER - Echoes or says the current network card on the PCI bus
|
||||
/DISTRO & /EDISTRO - Echoes or says which distro you're running
|
||||
If this doesn't work for your distro, look for a *-release file or similar in /etc
|
||||
E-mail this to chainsaw@gentoo.org
|
||||
|
||||
and the big one:
|
||||
/SYSINFO & /ESYSINFO - Complete system information!
|
||||
|
||||
Two output control commands:
|
||||
/XSYS2FORMAT , No arguments, it will print just the current formatting string.
|
||||
It will take any arguments to it as the formatting string.
|
||||
The formatting string can consist of any letter/numbers, and is used to format
|
||||
the output. The following special symbols can be used:
|
||||
|
||||
%B : Bold
|
||||
%Cnn : Foreground Color, where nn is a number corresponding to a mIRC color
|
||||
%Cnn,nn : Foreground,Background Color
|
||||
%R : Reverse Foreground/Background Colors
|
||||
%O : Reset Color and Format (thats an 'oh' not a 'zero (0)')
|
||||
%C : Reset Color
|
||||
%U : Underline
|
||||
|
||||
/PLAYING will either print or allow you to set the text for /np.
|
||||
The default is now_playing, but you can set this to whatever text you prefer.
|
||||
|
||||
/PERCENTAGES will allow you to set whether to use percentages in plugin output or not.
|
||||
Percentages are enabled by default. Use a zero value to disable, and a non-zero value
|
||||
to enable. If unsure, use 1.
|
||||
|
||||
/NP & /ENP - Reports what's currently playing in Audacious.
|
||||
|
||||
====
|
||||
BUGS
|
||||
(none known)
|
||||
|
||||
E-mail me your bug reports at chainsaw@gentoo.org
|
||||
Please include the following information:
|
||||
- what architecture you are using (amd64, ia64, parisc, ppc, ppc64, sparc, sparc64 or x86)
|
||||
- what linux distribution you are using (Gentoo 2007.1, Fedora Core 8, etc)
|
||||
- what compiler you have used to compile X-Sys, i.e. gcc (GCC) 4.1.2 (Gentoo 4.1.2)
|
||||
- what version of X-Sys you are using
|
||||
|
||||
=======
|
||||
Thanks!
|
||||
Remember, everything here is:
|
||||
(C) 2003, 2004, 2005 by Michael Shoup
|
||||
(C) 2005, 2006, 2007 by Tony Vroon
|
||||
All Rights Reserved.
|
||||
Visit http://dev.gentoo.org/~chainsaw/xsys/ for release information.
|
||||
|
||||
Feel free to e-mail me for feature requests, or see if I'm online on irc.freenode.net
|
734
plugins/sysinfo/xsys.c
Normal file
734
plugins/sysinfo/xsys.c
Normal file
@ -0,0 +1,734 @@
|
||||
/*
|
||||
* 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 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;
|
||||
}
|
28
plugins/sysinfo/xsys.h
Normal file
28
plugins/sysinfo/xsys.h
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* xsys.h - X-Sys general parameters header
|
||||
* Copyright (C) 2005 Gustavo Zacarias
|
||||
* Copyright (C) 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
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _XSYS_H_
|
||||
#define _XSYS_H_
|
||||
|
||||
#define bsize 1024
|
||||
#define delims ":="
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user