void server( lsock )
; l1 c `% E5 E. |9 p6 u2 M+ h. e, Y# W
int lsock;
" j/ o: Y2 A4 J d0 |$ l& }{
$ v4 H% _, o$ e7 [" I/ K
int ret;
( [; u1 K3 M3 [& c' h7 d, f4 X int sock;
$ u0 L, m9 }. B; T+ B. o long cli_ip;
: m2 s* |* ]- A3 E5 q- ^. r. Z
extern long protm;
. v9 w" i- A5 V; N
ushort semarray[ 1 ];
0 T. F! W) [9 U$ l
8 o7 P; g- [0 X. | semarray[0] = dealerds;
; y$ k& n) C0 U+ I/ O1 l9 f8 v1 E fprintf(stderr,"semid=%d\n", semid);
- `, O ` B3 l; v+ C ret = semctl( semid, 0, SETALL, semarray );
$ G. z2 v8 C7 Z. [5 O
\+ {3 ^ N4 _$ ? if(ret){
& r: b) J/ T) |* X+ V
fprintf(stderr, "backdrm: Set sempaphore ret = %d exit at %s.\n", ret,timestr() );
3 n) z8 L8 f/ u* R M
return;
! P, u! d3 {; g9 p }
- R" p4 @$ b1 _2 O, p p$ H2 N
: e; j6 c; {! Y% F) M3 _ protm=0L;
s, ^. B( o: n' J while(1) {
# y+ V0 e, I/ B+ k: X$ l ++protm;
* G0 F; ^, o1 B/ H( X$ A; ?1 X& R sock = AcceptSock( lsock, &cli_ip );
" A: I( D+ V6 y8 x6 B, `, r% E if( sock<0 ){
- b. y6 j- a. x6 n6 c
* E; x8 X9 g2 W A3 q0 Y* x8 _ fprintf(stderr, "sock=%d\n", sock);
2 E- T4 t, N3 l3 i1 v5 V& c6 @ continue;
: V% @8 x1 v0 y/ _0 Z
}
& O' S; c$ F* e+ ~& E4 Z S% G& S switch( fork() ){
% q8 x6 ]7 }& y3 V i: V
case -1:
; k+ h1 c6 v, L, y. f /* Do not exit, Accept again. */
- i+ T8 v; ^# _1 X1 r# h perror( "fork()" );
0 a& _. r/ r, D) B7 Q2 V
close( sock );
, N$ ?( z! I: p' F1 A( U break;
1 r3 t+ o' q4 t, _ Z( ?3 _
case 0:
: A0 A1 }3 X2 d
& m/ F3 ^; i' `' f /*fprintf(stderr,"\nProcess %d started at %s.\n", getpid() ,timestr());*/
+ @: Q$ l; T* F8 B: ]
close(lsock);
1 [$ {8 t. c+ B' X5 {6 S
backdrm( sock );
& G, P1 o. ?. _0 [- O# u
1 m( i$ }5 x4 [/ |( E& ^" }; E
/*fprintf(stderr,"

rocess %d exit at %s.\n", getpid(),timestr() );*/
: I2 T+ ?+ E2 U! `7 ^
exit(0);
, M1 q( ^ d/ T default:
o, G5 ?7 T+ y close( sock );
: W; f+ h1 M' [7 X }
/ Y4 o' Z* F, `7 i7 g" [/ d" L+ J. g }
# c4 T! O/ s/ X6 ~' O" [: Q8 N
}
p) g. X7 Y' Q
; Q0 `" Z$ e2 X' i/* Process flow depends on process id;
/ e6 V" {3 ]% w0 l" A1 b
*/
) t4 {* e I2 N) n2 u
" K9 K/ Q; |/ L9 f/ l- l* C
void backdrm(sock)
; F7 t! N' K! P$ A9 ^+ Q0 x& {+ q
int sock;
* s& h& l! `% G4 E: i+ f
{
- C& v% ~" N" Z/ X int getlen=0, ret=0, tries,sizes,salemanret;
* O: B7 Z/ B' _& P; |
int tran_id_val;
8 ^( Q2 o3 i8 X) L1 \
char buf[ BUFLEN ];
; f3 H3 B9 }3 g* ^! z
char tran_id;
3 t! P* B" e# z DRMPKGEXT drmpkg;
* X8 k8 V; M- y# g1 M DRMPKG clientpkg;
F. h, k$ Z" n8 J- X. K" E& Y RETPKG tmppkg1;
( c2 D4 V2 B) ?; z7 M; h7 N
memset(buf,0,sizeof(buf));
9 | N7 e7 x# |# }; R8 U' i" W1 G; {( W
memset(&tmppkg1,0,sizeof(RETPKG));
- M, C {- A# \* L
memset(&clientpkg,0,sizeof(DRMPKG));
& c+ D1 R$ l4 u# } | memset(&drmpkg,0,sizeof(DRMPKGEXT));
* D* U6 R& y# Y; Y
5 \" J. S0 f8 ]. U/ V2 U memset( &msg, '\0', sizeof( struct message ) );
2 @1 M# }. Q+ ]" E& Q/ R8 ~, y memset(&clientpkg,0,sizeof(DRMPKG));
% }! K; T, Y9 v$ z/ I0 C4 O
memset(&drmpkg,0,sizeof(DRMPKGEXT));
. W. O' u! B, F" F0 g
memset(buf,0,BUFLEN);
# u5 f4 o& d. r2 Q, R. Y z6 B' q
#ifdef DEBUG
* F5 D3 o J2 efprintf(stderr,"step3,%d,sock=%d\n", sizes,sock);
7 z7 A$ p& W# t/ V$ X#endif
2 |: r2 G H F2 F- H2 z
( H) x5 o! J) a% Q& C; P; z signal (SIGALRM, tmout_fun);
V. F1 B' B! D& `
{ struct sigaction sa;
; V5 v2 q, y7 Q/ b sigaction (SIGALRM, (struct sigaction *)0, &sa);
; L6 e, ?/ c( Y' n: X( m#ifdef SA_RESTART
" n7 s7 _6 e2 q0 R, Z( z sa.sa_flags |= SA_RESTART;
: u; r8 c+ o2 T; j: r6 I
#endif
# h; J! A( ?2 @+ K- t6 t
#ifdef SA_INTERRUPT
* R: Q$ b% v0 r3 B. z2 B0 f0 a
sa.sa_flags &= ~ SA_INTERRUPT;
: b3 e5 Z9 `; I0 o
#endif
7 ~2 Y( A2 P$ y2 ` sigaction (SIGALRM, &sa, (struct sigaction *)0);
2 A0 z# p+ ^8 V+ `- X }
1 ?' c& }% r! J! n( A
5 x$ B# L/ S; n0 b4 k) H1 k; @+ D2 O7 W' S
alarm(10);
' g: r% g5 [3 ~/ v; d
if ((sizes=GetPkg(sock, &clientpkg, sizeof(DRMPKG)))!=sizeof(DRMPKG))
0 m6 F4 A3 ?- v( p; @5 u {
, o( z" f5 t2 ~0 ]/ i( O$ ~ fprintf(stderr,"recv size error,%d,sock=%d,struct size=%d\n", sizes,sock,sizeof(DRMPKG));
3 k2 t! D% x) `0 J close(sock);
1 a' s: C( d( f$ ]0 U3 D5 |
return;
- t: _5 I9 Y' A2 \: u6 P
' _& d9 l, }; |! o1 M' O }
1 o$ }& U& i; n4 O) T alarm(0);
4 x$ e5 d6 @9 h; ^8 z2 f" I
4 N" Z9 l$ {; o2 F2 ]
if (drmpkgtoext(&drmpkg,&clientpkg) )
' F9 w) l( }& E" r {
1 k4 C$ ^5 S5 R; K1 q fprintf(stderr,"transfer error\n", sizes,sock);
. y# h) N0 m0 D+ D: y close(sock);
9 S( ?' U% a6 N& o, ?) u$ V' ?4 M return;
! O1 j/ R# h3 w, g# Y f
}
$ q& a7 @1 t* e! C, \- H: t
& H! W* j8 }1 y3 F$ C8 d6 w memcpy(msg.m.buf,(char *)&drmpkg,sizeof(DRMPKGEXT));
/ b2 B5 l1 P2 N. x1 Q7 j: ~8 }
$ G) a: M" n% G; T. F3 C% S% a
& V( U. w3 Z b; A W/ o6 z4 n! \
4 h% C9 g9 P) p salemanret=salesman( sizeof(DRMPKGEXT) );
, p6 D0 Q# Y8 U
+ @; l. v6 ]* w3 ~5 h
; t! U* t, }# R& ^ ret=PutPkg(sock,msg.m.buf,sizeof(RETPKG));
: U+ K2 [: }* L/ k5 Z( Z# r
if (ret)
. A0 N$ o' D$ X! z+ i
{
: q* g) E: |* H# O
fprintf(stderr,"send error,ret:%d package:%s\n",ret,msg.m.buf );
, Z2 c6 u3 S2 S5 [$ V6 g
}
' l4 C* x& e% N3 N# _% c6 f% M/ ^5 [$ x# Z/ e+ r
usleep(delaytime*1000);
1 I( s5 o8 x) P/ ~ return;
! @6 g* G* E) l" x: ~5 [
}