Как-то было несколько минут свободных и захотелось немного пошутить, сделал патчик для Pidgin, который открывает возможность показа информации об операционной системе для протокола XMPP.
Но показ информации об ОС — это не главная и не основная функция данного патча.
В первую очередь патч сделан для того, чтобы показывать произвольный текст вместо информации об операционной системе.
Сразу оговорюсь, что патч для свежей версии 2.10.0, проверен и работает на GNU/Linux.
Итак, сам патч:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | diff -uNdr pidgin-1.10.11.orig/libpurple/protocols/jabber/iq.c pidgin-2.10.11/libpurple/protocols/jabber/iq.c --- pidgin-2.10.11.orig/libpurple/protocols/jabber/iq.c 2014-11-23 19:41:26.000000000 +0300 +++ pidgin-2.10.11/libpurple/protocols/jabber/iq.c 2015-06-07 00:50:01.532323234 +0300 @@ -20,6 +20,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA * */ +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> + #include "internal.h" #include "core.h" #include "debug.h" @@ -49,6 +57,10 @@ static GHashTable *iq_handlers = NULL; static GHashTable *signal_iq_handlers = NULL; +#define BUF_SIZE 1024 +#define PATH_AND_NAME_OSINFO "/.purple/osinfo.txt" +extern char **environ; + struct _JabberIqCallbackData { JabberIqCallback *callback; gpointer data; @@ -61,6 +73,49 @@ g_free(jcd); } +char *get_my_osinfo() { + + const char *homepath = getenv("HOME"); + const char *filename_raw = PATH_AND_NAME_OSINFO; + char* filename = calloc(strlen(homepath) + strlen(filename_raw) + 1, sizeof(char)); + if ( filename == NULL ) { + return NULL; + } + sprintf(filename, "%s%s", homepath, filename_raw); + + struct stat stat_buf; + if ( stat( filename, &stat_buf) != 0 ) { + return NULL; + } + + int osinfo_file = open( filename, O_RDONLY ); + if ( osinfo_file == -1 ) { + return NULL; + } + + char *buf = (char *)calloc(BUF_SIZE, sizeof(char)); + if ( buf == NULL ) { + return NULL; + } + + char *clear = calloc(1, sizeof(char)); + int clear_size = 0; + + ssize_t bytes_readed = 0; + while ( (bytes_readed = read(osinfo_file, buf, BUF_SIZE)) > 0 ) { + clear = (char *)realloc(clear, clear_size + bytes_readed + 1); + if ( clear == NULL ) { + break; + } + sprintf(clear, "%s%s", clear, buf); + } + close(osinfo_file); + + free(buf); + free(filename); + return clear; +} + JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type) { JabberIq *iq; @@ -232,14 +287,17 @@ if(type == JABBER_IQ_GET) { GHashTable *ui_info; const char *ui_name = NULL, *ui_version = NULL; -#if 0 +#if 1 char *os = NULL; if(!purple_prefs_get_bool("/plugins/prpl/jabber/hide_os")) { struct utsname osinfo; uname(&osinfo); - os = g_strdup_printf("%s %s %s", osinfo.sysname, osinfo.release, - osinfo.machine); + os = get_my_osinfo(); + if ( os == NULL ) { + os = g_strdup_printf("%s %s %s", osinfo.sysname, osinfo.release, + osinfo.machine); + } } #endif @@ -267,7 +325,7 @@ xmlnode_insert_data(xmlnode_new_child(query, "version"), VERSION, -1); } -#if 0 +#if 1 if(os) { xmlnode_insert_data(xmlnode_new_child(query, "os"), os, -1); g_free(os); |
Применяем патч к исходникам: сохраняем его как ~/pidgin-os-info.patch
Заходим в каталог исходников pidgin и выполняем:
1 | patch -p1 < ~/pidgin-os-info.patch |
Все. Если не применился, то ты, друг (подруга), имеешь не ту версию. Пока мне не скучно этот патч поддерживать, я буду это делать. Но как станет не интересно — брошу.
И так, применили, собрали, установили (для пользователей Fedora и RHEL/SL/CentOS в моем хранилище пакетов есть уже готовые версии пакетов). И pidgin для протокола XMPP начал показывать скучную строчку с текущей версией ядра.
Давайте украшать, создаем файл ~/.purple/osinfo.txt с любым содержимым (я не проверял как оно будет работать в несколько строк или, если туда вогнать «Войну и Мир», но в одну строку работает точно). Все, в конференциях и просто по запросу друзей вместо операционной системы будет показано выбранное тобой сообщение.
Финал.
P.S. Ребят, для тех, кто в танке: XMPP и Jabber — это одно и тоже (почти).
UPD 23.02.2012
Обновил патч, сложил все в один файл, иначе патч не работает в 17-ой и в деб-о-дистрах.
UPD 05.06.2012
Обновил патч для pidgin 2.10.4.
UPD 06.06.2015
Обновил патч для pidgin 2.10.11.