diff options
author | Erich Eckner <git@eckner.net> | 2015-12-20 13:32:42 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-12-20 13:32:42 +0100 |
commit | 10e1d35fd12326e48f20f095c590d9a16dfa9156 (patch) | |
tree | 86a382a6c7ef1b73c192588305a7abbc3a7d50ca /popunit.pas | |
parent | bb3f27ddefa235a0db2e91d0565aadc73220830f (diff) | |
download | units-10e1d35fd12326e48f20f095c590d9a16dfa9156.tar.xz |
etwas aufgeräumt in popunit.pas und openssl wird jetzt sauberer beendet
Diffstat (limited to 'popunit.pas')
-rw-r--r-- | popunit.pas | 155 |
1 files changed, 64 insertions, 91 deletions
diff --git a/popunit.pas b/popunit.pas index 00b9844..1664f8a 100644 --- a/popunit.pas +++ b/popunit.pas @@ -10,6 +10,7 @@ uses type tMarkenValiditaet = (mvKeine,mvGueltig,mvUngueltig); + tBefehlAusfuehrenErgebnis = (baeOk,baeError,baeTimeout); tPopClient = class; @@ -72,6 +73,12 @@ type procedure loeschen; end; +function readString(p: tProcess): string; +procedure writeString(p: tProcess; s: string); +function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended): tBefehlAusfuehrenErgebnis; overload; inline; +function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis; overload; inline; +function befehlAusfuehren(var pr: tProcess; bef,ende: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis; overload; + implementation uses lowlevelunit; @@ -101,6 +108,46 @@ begin i:=i+p.input.write(s[i],length(s)-i+1); end; +function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended): tBefehlAusfuehrenErgebnis; +var + dummy: string; +begin + result:=befehlAusfuehren(pr,bef,timeout,dummy); +end; + +function befehlAusfuehren(var pr: tProcess; bef: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis; +begin + result:=befehlAusfuehren(pr,bef,'+OK',timeout,ausg); +end; + +function befehlAusfuehren(var pr: tProcess; bef,ende: string; timeout: extended; out ausg: string): tBefehlAusfuehrenErgebnis; +var + zeit: extended; +begin + writeString(pr,bef+#10); + + zeit:=now+timeout/24/60/60; + ausg:=''; + while (zeit>now) and (pos(ende,ausg)=0) and (pos('-ERR',ausg)=0) do + ausg:=ausg+readString(pr); + + if pos(ende,ausg)>0 then begin + result:=baeOk; + exit; + end; + + if pos('-ERR',ausg)>0 then begin + writeln(stderr,bef+' fehlgeschlagen (Antwort: '''+ausg+''')!'); + result:=baeError; + exit; + end; + + writeln(stderr,bef+' fehlgeschlagen (timeout erreicht)!'); + pr.free; + pr:=nil; + result:=baeTimeout; +end; + // tNachricht ****************************************************************** constructor tNachricht.create; @@ -250,26 +297,18 @@ end; procedure tPopThread.auszenWeltKontakt(var pr: tProcess); var i,j,k: longint; - zeit: extended; - buf: string; begin synchronize(@datenReinNehmen); if assigned(pr) then begin for i:=0 to length(_lIds)-1 do begin - writeString(pr,'DELE '+intToStr(_lIds[i])+#10); - - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos('+OK',buf)=0) do - buf:=buf+readString(pr); - - if pos('+OK',buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'DELE '+intToStr(_lIds[i])+' fehlgeschlagen!'); - exit; - end; + case befehlAusfuehren(pr,'DELE '+intToStr(_lIds[i]),_besitzer.timeout) of + baeTimeout: exit; + baeError: begin + if beenden then exit; + continue; + end; + end{of case}; if beenden then exit; @@ -309,18 +348,8 @@ begin auszenWeltKontakt(pr); if (_user<>'') and (_host<>'') and (_pass<>'') and (_port<>0) then begin if assigned(pr) then begin - writeString(pr,'QUIT'#10); - - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos('+OK',buf)=0) do - buf:=buf+readString(pr); - - if pos('+OK',buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'QUIT fehlgeschlagen!'); - end; + if befehlAusfuehren(pr,'QUIT',_besitzer.timeout)=baeOk then + pr.WaitOnExit; pr.free; pr:=nil; @@ -363,50 +392,20 @@ begin if beenden then break; - writeString(pr,'USER '+_user+#10); - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos('+OK',buf)=0) do - buf:=buf+readString(pr); - - if pos('+OK',buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'USER fehlgeschlagen!'); + if befehlAusfuehren(pr,'USER '+_user,_besitzer.timeout)<>baeOk then continue; - end; if beenden then break; - writeString(pr,'PASS '+_pass+#10); - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos('+OK',buf)=0) do - buf:=buf+readString(pr); - - if pos('+OK',buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'PASS fehlgeschlagen!'); + if befehlAusfuehren(pr,'PASS '+_pass,_besitzer.timeout)<>baeOk then continue; - end; if beenden then break; - writeString(pr,'LIST'#10); - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos(#13#10'.'#13#10,buf)=0) do - buf:=buf+readString(pr); - - if pos(#13#10'.'#13#10,buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'LIST fehlgeschlagen!'); + if befehlAusfuehren(pr,'LIST',#13#10'.'#13#10,_besitzer.timeout,buf)<>baeOk then continue; - end; if beenden then break; @@ -447,19 +446,8 @@ begin for i:=0 to length(_nachrichten)-1 do if _nachrichten[i].count=0 then begin - writeString(pr,'TOP '+intToStr(_nachrichten[i].id)+' 0'#10); - - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos(#13#10'.'#13#10,buf)=0) do - buf:=buf+readString(pr); - - if pos(#13#10'.'#13#10,buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'TOP '+intToStr(_nachrichten[i].id)+' fehlgeschlagen!'); + if befehlAusfuehren(pr,'TOP '+intToStr(_nachrichten[i].id)+' 0',#13#10'.'#13#10,_besitzer.timeout,buf)<>baeOk then break; - end; if beenden then break; @@ -487,18 +475,9 @@ begin zeit:=now; for i:=0 to 5 do begin - writeString(pr,'NOOP'#10); - zeit:=zeit+1/24/60/6; - buf:=''; - while (zeit>now) and (pos('+OK',buf)=0) do - buf:=buf+readString(pr); - - if pos('+OK',buf)=0 then begin - pr.free; - pr:=nil; - writeln(stderr,'NOOP fehlgeschlagen!'); + zeit:=now+1/24/60/6; + if befehlAusfuehren(pr,'NOOP',10)<>baeOk then break; - end; while (not beenden) and (zeit>now) and (not esGibtArbeit) do sleep(100); @@ -510,14 +489,8 @@ begin sleep(10); end; if assigned(pr) then begin - writeString(pr,'QUIT'#10); - - zeit:=now+_besitzer.timeout/24/60/60; - buf:=''; - while (zeit>now) and (pos('+OK',buf)=0) do - buf:=buf+readString(pr); - if pos('+OK',buf)=0 then - writeln(stderr,'QUIT fehlgeschlagen!'); + if befehlAusfuehren(pr,'QUIT',_besitzer.timeout)=baeOk then + pr.waitOnExit; pr.free; pr:=nil; |