[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

dup ve pipe.



Selamlar,
Hemen konuya girmek istiyorum. qmail-queue.c dosyasi initialize
edilidigi zaman 0 file descriptordan mailin body sini aliyor ve
1 file descriptordan da envelope bilgisini aliyor. Ve envelope bilgisi
kotrolu dogru ise mail qmail.queue.c sayesinde outgoing queue ye
ekleniyor. Fakat envelope ya da daha baska internal kaynakli hata 
var ise, ornegin insufficient memory, e.g. bazi die numaralari ile
_exit(exit_no); ile qmail-queue.c den cikiliyor. Boylece mail
outgoing queue ye eklenmiyor ve hata loglaniyor. Klasik bir virus
scanning olayi virus kodunun specific imzasi ( ben buna imza diyorum,
aslinda anlatmak istedigim virus kodunun virus oldugunu ispatlayan
byte zinciri) nin optimize bir sistem icinde degerlendirip eger mevcut
virus database icinde bulunan bir virus ise, herhangi bir islem
yapmasidir. Bu islemlerde mailin recipientlere gonderilmemesi,
loglanmasi, yada alicilara bu mail virusludur uyarisi gelmesi, vs,vs.

Bu iki olayi baglamak istiyorum. Simdi genelde inceledigim qmail virus
scannerler qmail-queue.c dosyasini kullaniyorlar. Yani yeni bir scanner
binary ile substitude edip, yeni gelen qmail-queue dosyasi cagriliyor.
Sonra asil qmail-queue spawn ediliyor. qmail-queue beklemede iken,
baska bir binary spawn ediliyor ve piping kullanilarak 0 dan gelen 
mail yeni spawn edilen binary tarafindan scan ediliyor. Ve eger bir
virus bulundu ise orijinal qmail-queue ye hata kode lu bir deger
donuyor piping ile. Eger mailde bir problem yoksa, qmail-queue nin
0 file desc den orijinal mail ve 1 nolu desc. den envelope degeri 
gonderilip mail islemi tamamlanmis olur. 

Simdi bazi sitelerde mail arsivleri inceledim. Biz yeni gelen
qmail-queue de orijinal qmail-queue yi spawn ettigimiz zamandan
once, orjinal qmail-queue ile haberlesmemiz icin, orjinal qmail-queue
nin 0 inci ve 1 inci file desc. leri icin piping kullanmamiz gerekiyor.
Yani orijinal qmail-queue ile ayni anda spawn edilen bin. ile orijinal
qmail-queue haberlesmesi icin....


----> qmail-queue(yeni) -- spawn -----> scanner
                        --
			-- spawn -----> qmail-queue(orjinal) 

simdi benim yapmaya calistigim yeni qmail-queue olusturmak
ve onun icinde, 0 ve 1 file desc. leri child processler icin
kullanilmak uzre pipe fdlerine iliskilendirmek...

mesela, ornek 

int fd[2];
int pid;

if(pipe(fd) != 0)
	perror("pipe fail"), exit(-1);


if((pid = fork()) != 0)
       write(fd[1], "deneme msg", 11);
else {
       execve("/usr/sbin/qmail-queue-original","qmail-queue-original", 0,0);
}



yukarida child icinde ben gercek qmail-queue yi calistiriyorum. ve 
qmail-queue-original a 0 dan data aktamam gerekiyor. ve bunu kesinlikle
yani 0 inci fd yi kesinlikle fd[0]  ile iliskilendirmem gerekiyor ki
parent te fd[1] e yazilan bir data pipe araciligi ile fd[0] a
aktarilmali ve ayni zamanda fd[0], 0 oldugu icin calisan programin
0. fd. sinden input olarak alinmali...

bunun dup ve dup2 syscall larla yapilacagini bir yerde okudum

close(0);
dup2(0, fd[0]);

gibi ama bir sey olmadi :)

yorumlarinizi alabilir miyim?
iyi calismalar.



Attachment: pgpSjoodeKOB9.pgp
Description: PGP signature


Reply to: