Skip to content
JustNick

 Patch and recompile source rpm

   от JustNick


Както обикновено когато е последен работен ден изникват странни проблеми. Днес попаднах на интересен client/server side bug, който се наложи да оправям. Оказа се, че в PureFTPd има проблем засягащ timestamp на файлове. При upload на файл timestamp-а локално и този на сървъра се различават с по няколко часа, в зависимост от часовата зона, като за нашата часовете са 2. Това е когато се използва preserve timestamp опцията от страна на клиента, и е доста неудобно при синхронизация на файлове. За щастие проблема се оказа елементарен за решаване – описано е как да стане тук. Аз обаче нямах време да чакам bugfix от upstream-a и взех нещата в свои ръце. Реших да прекомпилирам source rpm и по-надолу ще опиша как точно може да се направи това.

  • Като за начало имаме нужда от rpm-build, така че ако го няма, се налага да го инсталираме :
yum -y install rpm-build
  • Намираме и инсталираме src rpm-а. В моя случай той е ето тук.
rpm -ivh pure-ftpd-1.0.21-15.el5.src.rpm
  • Отиваме в specs директорията:
cd /usr/src/redhat/SPECS/
  • Където подготвяме source за компилиране, като го разархивираме и apply-ваме вече дефинираните patch-ове
rpmbuild -bp pure-ftpd.spec

#Възможно е да има проблеми със зависимости, като естествено трябва да инсталираме посочените пакети, ако има такава необходимост

  • Отиваме в /usr/src/redhat/BUILD където би трябвало да има директория от рода pure-ftpd-1.0.21. Правиме й backup, който ще ползваме при генериране на patch-a в последствие.
cd /usr/src/redhat/BUILD

cp -r pure-ftpd-1.0.21 pure-ftpd-1.0.21.orig

Промяната, която трябва да направим е да заменим "mktime()" с "timegm()" във файла ftpd.c. И така с любимия файлов редактор vim, правим нужната промяна във файла /usr/src/redhat/BUILD/pure-ftpd-1.0.21/src/ftpd.c

  • Генерираме patch-a
diff -Naur pure-ftpd-1.0.21.orig/src/ftpd.c pure-ftpd-1.0.21/src/ftpd.c > ../SOURCES/pure-ftpd-1.0.21-utime.patch

като той трябва да съдържа нещо от рода:

1
2
3
4
5
6
7
8
9
10
11
--- pure-ftpd-1.0.21.orig/src/ftpd.c    2009-04-30 13:39:37.000000000 +0300
+++ pure-ftpd-1.0.21/src/ftpd.c 2009-04-30 13:40:55.000000000 +0300
@@ -2541,7 +2541,7 @@
tm.tm_mon--;
tm.tm_year -= 1900;
if (tm.tm_mon < 0 || tm.tm_year <= 0 ||
-       (ts = mktime(&tm)) == (time_t) -1) {
+       (ts = timegm(&tm)) == (time_t) -1) {
addreply_noformat(501, MSG_TIMESTAMP_FAILURE);
return;
}
  • Редактираме spec файла /usr/src/redhat/SPECS/pure-ftpd.spec като правим следните промени
Release:    15%{?dist}

на

Release:    15%{?dist}.1
  • Добавяме ред, в който описваме направения patch
Patch3:     pure-ftpd-1.0.21-utime.patch
  • в %prep секцията, добавяме следния ред, след другите patch-ове
%patch3 -p1 -b .utime
  • в %changelog секцията описваме направената промяна
1
2
* Thu Apr 30 2009 package maintainer <mail> - 1.0.21-15.1
- patch pure-ftpd "SITE UTIME" bugmail>
  • остава да прекомпилираме пакета
rpmbuild -ba pure-ftpd.spec
  • Ако всичко мине гладко, готовият RPM трябва да се намира в /usr/src/redhat/RPMS/$arch/ и можем да пристъпим към update/инсталация на готовия пакет.

Още информация:

http://docs.fedoraproject.org/drafts/rpm-guide-en/ch-rpmbuild.html

http://linux.die.net/man/8/rpmbuild

Допълнение:

Настройка на winscp за Daylight saving time (DST) - http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time