Notatka służbowa

Jak zainstalowac ekg na starym Red Hacie, oraz zrobić 2 dirty-hacki do ekg.
Notatka powstała jako zapis całej rozrywki związanej z ulepszeniem ekg. Mi głównie jest potrzeby patch, napisy o instalacji (make && make install) są ogólnoedukacyjne dla innych. ;-)
Co do patcha... Podobno taki bajer jest w ekg2, ale ono jest "fuj", jest zbyt trudne (jak dla mnie) i oczywiście szczerze wątpie, żeby się na takim starym linuxie zainstalowało. (Rzecz jasna, na starym Solarisie 9 się instaluje, tylko linuxowe patafiany mają takie problemy jak Zbyt-Stara-Biblioteka(TM), której się nie da upgrade'ować, bo "dependecy-hell". Giń Torvaldsie!)
Założenia:

1. Instalacja libgadu

Nie ma lekko, ktoś wydzielił libgadu z ekg, więc trzeba 'cd libgadu'. :(((

1.1. Żeby się libgadu kompilowało

Ze względu na pewne błędy w ld 2.11.90.0.8 (prawdopodobnie), libgadu myśli, że pthread nie może. A ono może, tylko trzeba je ręcznie zmusić do linkowania ekg z pthread.
[kotek@paf73 libgadu]$ diff -u configure.orig configure
--- configure.orig      Sat Jan 12 22:56:17 2008
+++ configure   Sat Jan 12 22:56:40 2008
@@ -20616,7 +20616,7 @@
# FIXME: -fPIC is required for -shared on many architectures,
# so we specify it here, but the right way would probably be to
# properly detect whether it is actually required.
-               CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+               CFLAGS="-shared -fPIC $CFLAGS $PTHREAD_CFLAGS"
                LIBS="$PTHREAD_LIBS $LIBS"
                CC="$PTHREAD_CC"

1.2. Powiększenie opisu z 70 do 75 znaków.

[kotek@paf73 libgadu]$ diff -u include/libgadu.h.in include/libgadu.h.in.orig
--- include/libgadu.h.in.orig   Sat Jan 12 22:54:04 2008
+++ include/libgadu.h.in        Sat Jan 12 22:54:13 2008
@@ -1429,7 +1429,7 @@
  *
  * Maksymalna długośc opisu.
  */
-#define GG_STATUS_DESCR_MAXSIZE 70
+#define GG_STATUS_DESCR_MAXSIZE 75

 /* GG_S_F() tryb tylko dla znajomych */
#define GG_S_F(x) (((x) & GG_STATUS_FRIENDS_MASK) != 0)

1.3. Odpalamy instalkę

Tu nie ma nic mądrego, no może poza opcjami do configure. ;)
[kotek@paf73 libgadu]$ ./configure --enable-libgadu-openssl --with-pthread
...
checking whether to check for GCC pthread/shared inconsistencies... yes
checking whether -pthread is sufficient with -shared... yes
...
checking for ssl.h... /usr/include/openssl/ssl.h
checking for RSA_new in -lssl... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating include/Makefile
config.status: creating pkgconfig/Makefile
config.status: creating pkgconfig/libgadu.pc
config.status: creating config.h
config.status: creating include/libgadu.h
config.status: executing depfiles commands
[kotek@paf73 libgadu]$ 
Narzeka wprawdzie na brak OpenSSL'a z pkgconfig, ale jak da -lssl (samo z siebie działa).
[kotek@paf73 libgadu]$ make
...
[kotek@paf73 libgadu]$ su
Password:
[root@paf73 liggadu]# make install
...
[root@paf73 liggadu]# ^D
Tak tak, pamiętaj, nigdy nie działaj na roocie dłużej niż musisz. ;)

2. Hackowanie ekg

Ekg też wymaga pewnych zabiegów, pthread'owych, żeby działać...

2.1. Nowe kolory act

Tu jest cała mądrość. Kolorowe "act", czyli numery aktywnych okien. Defaultowy szary zostaje dla zmian statusów itp, a wiadomości dostają brand new "silnie biały". Prawie jak irssi. ;-)
--- src/ui-ncurses.c.orig	2008-01-12 20:09:52.000000000 +0100
+++ src/ui-ncurses.c	2008-01-12 20:58:05.000000000 +0100
@@ -1392,6 +1392,15 @@
 			w->act = 1;
 			w->first_act_time = w->last_act_time;
}
+		// MiKylie hack
+		if (w->act != 2){
+			if(w->id >= 2){
+				if((*(line+7) != ':') && (*(line+15) != ':')){
+					// message from user, win importance ++
+					w->act++;
+				}
+			}
+		}
 		if (!command_processing)
 			update_statusbar(0);
}
@@ -1897,15 +1906,32 @@
 					iso_to_ascii((unsigned char*) text);
}
 
-				for (j = 0; text && j < strlen(text); j++) {
-					if (text[j] != 10) {
-						waddch(w, (unsigned char) text[j]);
-						continue;
+				// MiKylie really dirty hack
+				if (strcmp(data[i].name, "activity") == 0){//act
+					for (j = 0; text && j < strlen(text); j++) {
+						if (text[j] != 10) {
+							if(text[j] == '-'){
+								x--;
+								wattrset(w, color_pair(COLOR_WHITE, 1, bgcolor));
+							}else if(text[j] == ','){
+								wattrset(w, color_pair(fgcolor, bold, bgcolor));
+								waddch(w, (unsigned char) text[j]);
+							}else{
+								waddch(w, (unsigned char) text[j]);
+							}
+						}
}
+				}else{
+					for (j = 0; text && j < strlen(text); j++) {
+						if (text[j] != 10) {
+							waddch(w, (unsigned char) text[j]);
+							continue;
+						}
 
-					wattrset(w, color_pair(COLOR_BLACK, 1, bgcolor));
-					waddch(w, '|');
-					wattrset(w, color_pair(fgcolor, bold, bgcolor));
+						wattrset(w, color_pair(COLOR_BLACK, 1, bgcolor));
+						waddch(w, '|');
+						wattrset(w, color_pair(fgcolor, bold, bgcolor));
+					}
}
 
 				p += len;
@@ -2231,7 +2257,11 @@
 			if (!first)
 				string_append_c(s, ',');
 			
-			string_append(s, itoa(w->id));
+			// MiKylie hack
+			if(w->act == 2)
+				string_append(s, itoa(- w->id));
+			else
+				string_append(s, itoa(w->id));
 			first = 0;
 			act = 1;
}
Pozostaje zpatche'ować... A więc, nie wiem jak to można inaczej zrobić niż
[kotek@paf73 ekg-20080112]$ patch src/ui-ncurses.c < ~/ekg-color-act.patch
patching file src/ui-ncurses.c
[kotek@paf73 ekg-20080112]$ 

2.2. Kompilacja

Jeśli przy configure nam wypluje (a wypluje, bo stary system):
checking for gg_login in -lgadu... no
configure: error: You have to install libgadu. Please see docs/libgadu.txt
To jest kiszka. Jak grzecznie zrobiliśmy to co wyżej było (i mamy fajny ldconfig) to trzeba będzie gwałcić ekg... Problem tkwi w pthread, które niby są w libgadu, ale linker mówi, że ich nie ma. (Bo faktycznie ich tam nie ma.) Trzeba jawnie ekg (tj. linkerowi na etapie ekg) powiedzieć, żeby jednak linkował do pthread'ów. No to "jazda, w górę w górę, DJ MATUSH!".
[kotek@paf73 ekg-20080112]$ setenv LIBS -pthread
[kotek@paf73 ekg-20080112]$ ./configure --enable-openssl
...
configure: creating ./config.status
config.status: creating src/Makefile
config.status: creating Makefile
config.status: creating examples/Makefile
config.status: creating config.h

configured options:
 - openssl: enabled
 - ioctld: disabled
 - python: disabled
 - zlib: enabled
 - pthread: disabled
 - libungif: enabled
 - libjpeg: enabled
 - ui-readline: disabled
 - ui-ncurses: enabled (default)
 - ui-gtk: disabled
 - aspell: disabled
 
Przeszło. ;-) Teraz pora na ostatniego make'a i fingers crossed.
[kotek@paf73 ekg-20080112]$ make
...
gcc  -I.. -g -O2 -Wall   -DDATADIR=\"/usr/local/share/ekg\" -DSYSCONFDIR=\"/usr/local/etc\" -o ekg stuff.o commands.o events.o themes.o vars.o dynstuff.o userlist.o ekg.o xmalloc.o mail.o msgqueue.o emoticons.o configfile.o  simlite.o ../compat/strlcat.o ../compat/strlcpy.o ui-ncurses.o voice.o ui-batch.o ui-none.o log.o comptime.o -lz -ljpeg -lungif -lgsm  -lssl -lcrypto    -lncurses -pthread -lgadu
gmake[1]: Opuszczam katalog `/tmp/ekg-20080112/src'
[kotek@paf73 ekg-20080112]$ 
Super. Mamy skompilowane ekg. Zobaczmy co ono ma:
[kotek@paf73 ~]$ ldd /tmp/ekg-20080112/src/ekg
        libz.so.1 => /usr/lib/libz.so.1 (0x40033000)
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40041000)
        libungif.so.4 => /usr/lib/libungif.so.4 (0x40060000)
        libssl.so.2 => /lib/libssl.so.2 (0x40068000)
        libcrypto.so.2 => /lib/libcrypto.so.2 (0x40095000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x40159000)
        libgadu.so.3 => /usr/local/lib/libgadu.so.3 (0x40175000)
        libpthread.so.0 => /lib/i686/libpthread.so.0 (0x4018e000)
        libc.so.6 => /lib/i686/libc.so.6 (0x401a3000)
        libtinfo.so.5 => /lib/libtinfo.so.5 (0x402df000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40308000)
        libdl.so.2 => /lib/libdl.so.2 (0x403fe000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Istotnie, linkowane do libgadu i libpthread. A czemu taki cyrk z pthread? Ano podobno wywędrował do libgadu. Dla porównania na FC7.92 (oczywiście bez żadnych zmian w configure itp...) mamy:
[kotek@kylie src]$ ldd ./ekg|grep pthread
[kotek@kylie src]$ ldd ./ekg|wc -l
51
[kotek@kylie src]$ 
Co świadczy o tym, że ld linkuje pthread do libgadu, i ekg nie musi go widzieć. No i że nowszy linux linkuje ogromną masę śmiecia gratis. ;-)
Ale coż, ważne, że dało się to obejść. Pozostaje
[kotek@paf73 ~]$ make install

3. Podsumowanie

I można cieszyć się nowym ekg-20080112 z moim dirty hackiem. :-)
Greetz & respect dla firmy Sun Microsystems, twórców i koderów ekg i irssi oraz producenta fletów poprzecznych Yamaha. ;-)
Sux dla Linusa T. oraz pomysłu i realizacji ekg2.
ver. 0.947 / 12Feb08
--MiKylie - GG 292433