Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / int / net / ip / srv.c
1 #include "sock.h"
2 #include "srv.h"
3 #include <sys/stat.h>
4
5 struct sockaddr_in it;
6 int sock, namelen, seq = 0;
7
8 #ifndef NO_PROTOTYPES
9 int main(int argc,char **argv);
10 #endif
11
12 int main(argc,argv) int argc; char** argv; {
13    msg m;
14
15    if( argc>1 ){
16       set_srv_send_delay( atoi(argv[1]) );
17       printf("delay set to %d ms\n",atoi(argv[1]));
18    }
19
20    fclose(stdin);
21
22    {
23       int retval=fork();
24       if( retval<0 )  perror("fork failed"),exit(0);
25       if( retval>0 )  exit(0);
26    }
27
28    setpgrp();
29    freopen("srv.log","a",stdout);
30    freopen("srv.log","a",stderr);
31
32    sock = sock_open( SOCK_DGRAM, "udp", NULL, NULL, PORT, AS_SERVER );
33    if( sock < 0 ){
34       perror("sockopen");
35       fflush(stdout);
36       fflush(stderr);
37       exit(10);
38    }
39
40    if (fork())  exit(0);
41
42    for ( ;; ) {
43
44       int namelen = sizeof(it);
45       int size;
46
47       fflush(stdout);
48       fflush(stderr);
49
50       size=sock_srv_crc_recv(sock, &m, sizeof(m), &it, &namelen );
51
52       if( size>0 )   /* there was no error & I'm not interested in 0 size */
53       switch( ntohl(m.req) ){
54
55          case RQ_FILE_SIZE  :
56                     {
57                        struct stat status;
58                        if( stat(m.data,&status) ) status.st_size=0;
59                        m.req=htonl(0);
60                        printf("file %s size %d\n",m.data,status.st_size);
61                        fflush(stdout);
62                        fflush(stderr);
63                        *(int*)(m.data)=htonl(status.st_size);
64                        sock_srv_crc_send(sock,&m,HEAD+sizeof(int),&it,namelen);
65                     }
66                     break;
67
68          case RQ_FILE :
69                     {
70                        FILE *f=fopen(m.data+2*sizeof(int),"rb");
71                        int size,cnt=0;
72                        int packets = ntohl(((int *)m.data)[1]);
73                        int seek=ntohl(((int *)m.data)[0]);
74                        int errors=0;
75                        if( f==NULL ) break;
76                        printf("file %s from %d %d packets\n",
77                               m.data+2*sizeof(int),seek,packets);
78                        fflush(stdout);
79                        fflush(stderr);
80                        fseek(f,DATA_PIECE*seek,0);
81                        while( (size=fread(m.data,1,DATA_PIECE,f)) > 0 ){
82                           m.req=htonl(seek++);
83                           cnt++;
84                           if(sock_srv_crc_send(sock,&m,HEAD+size,&it,namelen)<0)
85                              errors++;
86                           else
87                              errors=0;
88                           if( errors>=10 ) break;
89                           if( cnt==packets )  break;
90                        }
91                        fclose(f);
92                        while( sock_poll( sock, 0 ) )
93                           sock_srv_crc_recv(sock,&m,sizeof(m),&it,&namelen);
94                     }
95                     break;
96
97          default:
98                     printf("srv:unknown req %d\n",ntohl(m.req));
99
100       }
101    }
102
103    return 0;
104 }
105