xsys-2.2.0/0000775000175000000000000000000010716135254012054 5ustar chainsawrootxsys-2.2.0/match.c0000644000175000000120000001421510716130347013437 0ustar chainsawwheel/* * 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 #include #include #include #include #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); } xsys-2.2.0/INSTALL0000644000175000000120000000076110716132321013223 0ustar chainsawwheelINSTALLATION ============ 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. xsys-2.2.0/xsys.c0000644000175000000120000005172010645761333013361 0ustar chainsawwheel/* * 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 #include #include #include "xchat-plugin.h" #include "parse.h" #include "match.h" #include "xsys.h" #include #include 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; } xsys-2.2.0/parse.c0000644000175000000120000002633410716135254013464 0ustar chainsawwheel/* * 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 #include #include #include #include #include #include #include #include #include #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; } xsys-2.2.0/hwmon.c0000644000175000000120000000327410436660264013503 0ustar chainsawwheel/* * 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 #include #include #include #include #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); } } xsys-2.2.0/parse.c.orig0000644000175000000120000002625610630621305014416 0ustar chainsawwheel/* * 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 #include #include #include #include #include #include #include #include #include #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_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; } xsys-2.2.0/match.h0000644000175000000120000000305010645527573013453 0ustar chainsawwheel/* * 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 xsys-2.2.0/xchat-plugin.h0000644000175000000120000002177510650751523014766 0ustar chainsawwheel/* You can distribute this header with your plugins for easy compilation */ #ifndef XCHAT_PLUGIN_H #define XCHAT_PLUGIN_H #include #define XCHAT_IFACE_MAJOR 1 #define XCHAT_IFACE_MINOR 9 #define XCHAT_IFACE_MICRO 11 #define XCHAT_IFACE_VERSION ((XCHAT_IFACE_MAJOR * 10000) + \ (XCHAT_IFACE_MINOR * 100) + \ (XCHAT_IFACE_MICRO)) #define XCHAT_PRI_HIGHEST 127 #define XCHAT_PRI_HIGH 64 #define XCHAT_PRI_NORM 0 #define XCHAT_PRI_LOW (-64) #define XCHAT_PRI_LOWEST (-128) #define XCHAT_FD_READ 1 #define XCHAT_FD_WRITE 2 #define XCHAT_FD_EXCEPTION 4 #define XCHAT_FD_NOTSOCKET 8 #define XCHAT_EAT_NONE 0 /* pass it on through! */ #define XCHAT_EAT_XCHAT 1 /* don't let xchat see this event */ #define XCHAT_EAT_PLUGIN 2 /* don't let other plugins see this event */ #define XCHAT_EAT_ALL (XCHAT_EAT_XCHAT|XCHAT_EAT_PLUGIN) /* don't let anything see this event */ #ifdef __cplusplus extern "C" { #endif typedef struct _xchat_plugin xchat_plugin; typedef struct _xchat_list xchat_list; typedef struct _xchat_hook xchat_hook; #ifndef PLUGIN_C typedef struct _xchat_context xchat_context; #endif #ifndef PLUGIN_C struct _xchat_plugin { /* these are only used on win32 */ xchat_hook *(*xchat_hook_command) (xchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], void *user_data), const char *help_text, void *userdata); xchat_hook *(*xchat_hook_server) (xchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], void *user_data), void *userdata); xchat_hook *(*xchat_hook_print) (xchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], void *user_data), void *userdata); xchat_hook *(*xchat_hook_timer) (xchat_plugin *ph, int timeout, int (*callback) (void *user_data), void *userdata); xchat_hook *(*xchat_hook_fd) (xchat_plugin *ph, int fd, int flags, int (*callback) (int fd, int flags, void *user_data), void *userdata); void *(*xchat_unhook) (xchat_plugin *ph, xchat_hook *hook); void (*xchat_print) (xchat_plugin *ph, const char *text); void (*xchat_printf) (xchat_plugin *ph, const char *format, ...); void (*xchat_command) (xchat_plugin *ph, const char *command); void (*xchat_commandf) (xchat_plugin *ph, const char *format, ...); int (*xchat_nickcmp) (xchat_plugin *ph, const char *s1, const char *s2); int (*xchat_set_context) (xchat_plugin *ph, xchat_context *ctx); xchat_context *(*xchat_find_context) (xchat_plugin *ph, const char *servname, const char *channel); xchat_context *(*xchat_get_context) (xchat_plugin *ph); const char *(*xchat_get_info) (xchat_plugin *ph, const char *id); int (*xchat_get_prefs) (xchat_plugin *ph, const char *name, const char **string, int *integer); xchat_list * (*xchat_list_get) (xchat_plugin *ph, const char *name); void (*xchat_list_free) (xchat_plugin *ph, xchat_list *xlist); const char * const * (*xchat_list_fields) (xchat_plugin *ph, const char *name); int (*xchat_list_next) (xchat_plugin *ph, xchat_list *xlist); const char * (*xchat_list_str) (xchat_plugin *ph, xchat_list *xlist, const char *name); int (*xchat_list_int) (xchat_plugin *ph, xchat_list *xlist, const char *name); void * (*xchat_plugingui_add) (xchat_plugin *ph, const char *filename, const char *name, const char *desc, const char *version, char *reserved); void (*xchat_plugingui_remove) (xchat_plugin *ph, void *handle); int (*xchat_emit_print) (xchat_plugin *ph, const char *event_name, ...); int (*xchat_read_fd) (xchat_plugin *ph, void *src, char *buf, int *len); time_t (*xchat_list_time) (xchat_plugin *ph, xchat_list *xlist, const char *name); char *(*xchat_gettext) (xchat_plugin *ph, const char *msgid); void (*xchat_send_modes) (xchat_plugin *ph, const char **targets, int ntargets, int modes_per_line, char sign, char mode); char *(*xchat_strip) (xchat_plugin *ph, const char *str, int len, int flags); void (*xchat_free) (xchat_plugin *ph, void *ptr); }; #endif xchat_hook * xchat_hook_command (xchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], void *user_data), const char *help_text, void *userdata); xchat_hook * xchat_hook_server (xchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], void *user_data), void *userdata); xchat_hook * xchat_hook_print (xchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], void *user_data), void *userdata); xchat_hook * xchat_hook_timer (xchat_plugin *ph, int timeout, int (*callback) (void *user_data), void *userdata); xchat_hook * xchat_hook_fd (xchat_plugin *ph, int fd, int flags, int (*callback) (int fd, int flags, void *user_data), void *userdata); void * xchat_unhook (xchat_plugin *ph, xchat_hook *hook); void xchat_print (xchat_plugin *ph, const char *text); void xchat_printf (xchat_plugin *ph, const char *format, ...); void xchat_command (xchat_plugin *ph, const char *command); void xchat_commandf (xchat_plugin *ph, const char *format, ...); int xchat_nickcmp (xchat_plugin *ph, const char *s1, const char *s2); int xchat_set_context (xchat_plugin *ph, xchat_context *ctx); xchat_context * xchat_find_context (xchat_plugin *ph, const char *servname, const char *channel); xchat_context * xchat_get_context (xchat_plugin *ph); const char * xchat_get_info (xchat_plugin *ph, const char *id); int xchat_get_prefs (xchat_plugin *ph, const char *name, const char **string, int *integer); xchat_list * xchat_list_get (xchat_plugin *ph, const char *name); void xchat_list_free (xchat_plugin *ph, xchat_list *xlist); const char * const * xchat_list_fields (xchat_plugin *ph, const char *name); int xchat_list_next (xchat_plugin *ph, xchat_list *xlist); const char * xchat_list_str (xchat_plugin *ph, xchat_list *xlist, const char *name); int xchat_list_int (xchat_plugin *ph, xchat_list *xlist, const char *name); time_t xchat_list_time (xchat_plugin *ph, xchat_list *xlist, const char *name); void * xchat_plugingui_add (xchat_plugin *ph, const char *filename, const char *name, const char *desc, const char *version, char *reserved); void xchat_plugingui_remove (xchat_plugin *ph, void *handle); int xchat_emit_print (xchat_plugin *ph, const char *event_name, ...); char * xchat_gettext (xchat_plugin *ph, const char *msgid); void xchat_send_modes (xchat_plugin *ph, const char **targets, int ntargets, int modes_per_line, char sign, char mode); char * xchat_strip (xchat_plugin *ph, const char *str, int len, int flags); void xchat_free (xchat_plugin *ph, void *ptr); #if !defined(PLUGIN_C) && defined(WIN32) #ifndef XCHAT_PLUGIN_HANDLE #define XCHAT_PLUGIN_HANDLE (ph) #endif #define xchat_hook_command ((XCHAT_PLUGIN_HANDLE)->xchat_hook_command) #define xchat_hook_server ((XCHAT_PLUGIN_HANDLE)->xchat_hook_server) #define xchat_hook_print ((XCHAT_PLUGIN_HANDLE)->xchat_hook_print) #define xchat_hook_timer ((XCHAT_PLUGIN_HANDLE)->xchat_hook_timer) #define xchat_hook_fd ((XCHAT_PLUGIN_HANDLE)->xchat_hook_fd) #define xchat_unhook ((XCHAT_PLUGIN_HANDLE)->xchat_unhook) #define xchat_print ((XCHAT_PLUGIN_HANDLE)->xchat_print) #define xchat_printf ((XCHAT_PLUGIN_HANDLE)->xchat_printf) #define xchat_command ((XCHAT_PLUGIN_HANDLE)->xchat_command) #define xchat_commandf ((XCHAT_PLUGIN_HANDLE)->xchat_commandf) #define xchat_nickcmp ((XCHAT_PLUGIN_HANDLE)->xchat_nickcmp) #define xchat_set_context ((XCHAT_PLUGIN_HANDLE)->xchat_set_context) #define xchat_find_context ((XCHAT_PLUGIN_HANDLE)->xchat_find_context) #define xchat_get_context ((XCHAT_PLUGIN_HANDLE)->xchat_get_context) #define xchat_get_info ((XCHAT_PLUGIN_HANDLE)->xchat_get_info) #define xchat_get_prefs ((XCHAT_PLUGIN_HANDLE)->xchat_get_prefs) #define xchat_list_get ((XCHAT_PLUGIN_HANDLE)->xchat_list_get) #define xchat_list_free ((XCHAT_PLUGIN_HANDLE)->xchat_list_free) #define xchat_list_fields ((XCHAT_PLUGIN_HANDLE)->xchat_list_fields) #define xchat_list_str ((XCHAT_PLUGIN_HANDLE)->xchat_list_str) #define xchat_list_int ((XCHAT_PLUGIN_HANDLE)->xchat_list_int) #define xchat_list_time ((XCHAT_PLUGIN_HANDLE)->xchat_list_time) #define xchat_list_next ((XCHAT_PLUGIN_HANDLE)->xchat_list_next) #define xchat_plugingui_add ((XCHAT_PLUGIN_HANDLE)->xchat_plugingui_add) #define xchat_plugingui_remove ((XCHAT_PLUGIN_HANDLE)->xchat_plugingui_remove) #define xchat_emit_print ((XCHAT_PLUGIN_HANDLE)->xchat_emit_print) #define xchat_gettext ((XCHAT_PLUGIN_HANDLE)->xchat_gettext) #define xchat_send_modes ((XCHAT_PLUGIN_HANDLE)->xchat_send_modes) #define xchat_strip ((XCHAT_PLUGIN_HANDLE)->xchat_strip) #define xchat_free ((XCHAT_PLUGIN_HANDLE)->xchat_free) #endif #ifdef __cplusplus } #endif #endif xsys-2.2.0/xsys.h0000644000175000000120000000164110645530771013363 0ustar chainsawwheel/* * 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 xsys-2.2.0/ChangeLog0000644000175000000120000001414710716135354013760 0ustar chainsawwheelv2.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 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 xsys-2.2.0/parse.h0000644000175000000120000000334510440153144013456 0ustar chainsawwheel/* * 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 xsys-2.2.0/pci.c0000644000175000000120000001042010436674714013122 0ustar chainsawwheel/* * pci.c - PCI functions for X-Sys * Copyright (C) 1997-1999 Martin Mares [PCI routines from lspci] * Copyright (C) 2000 Tom Rini [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 #include #include #include #include #include #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); } xsys-2.2.0/Makefile0000644000175000000120000000214710645531641013643 0ustar chainsawwheel#### 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 xsys-2.2.0/README0000644000175000000120000001114510716133776013067 0ustar chainsawwheelX-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 xsys-2.2.0/hwmon.h0000644000175000000120000000172510322027426013476 0ustar chainsawwheel/* * 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 xsys-2.2.0/pci.h0000644000175000000120000000173010327742003013115 0ustar chainsawwheel/* * 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 void pci_find_fullname(char *fullname, char *vendor, char *device); int pci_find_by_class(u16 *class, char *vendor, char *device); #endif