Pidgin патч, который откроет информацию об ОС

Как-то было несколько минут свободных и захотелось немного пошутить, сделал патчик для 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.

Добавить комментарий