Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / int / net / ip / sockcrc.c
1 #include "sock.h"
2
3 #ifndef NO_PROTOTYPES
4 static int get_crc( char *data, int data_size );
5 #else
6 static int get_crc();
7 #endif
8
9
10 static char buffer[8192];   /* shouldn't be bigger message */
11
12
13 int sock_cli_crc_send( sock, m, size ) int sock,size; void *m; {
14    *(int *)buffer = htonl(get_crc( m, size ));
15    bcopy( m, buffer+sizeof(int), size );
16    return sock_cli_send( sock, buffer, size+sizeof(int) );
17 }
18
19 int sock_cli_crc_recv( sock, m, size ) int sock,size; void *m; {
20    int recv_size;
21    recv_size = sock_cli_recv(sock, buffer, size+sizeof(int) );
22    if( recv_size == 0 ) return 0;
23    else
24    if( recv_size < sizeof(int) ) return -1;
25    else{
26       recv_size-=sizeof(int);
27       bcopy( buffer+sizeof(int), m, recv_size );
28       if( get_crc(m,recv_size)!=ntohl(*(int *)buffer) )
29          return -1;  /* error */
30       else
31          return recv_size;
32    }
33 }
34
35 int sock_srv_crc_send( sock, m, size, addr, namelen )
36    int sock,size,namelen;
37    void *m;
38    struct sockaddr_in *addr;
39 {
40    *(int *)buffer = htonl(get_crc( m, size ));
41    bcopy( m, buffer+sizeof(int), size );
42    return sock_srv_send( sock, buffer, size+sizeof(int) , addr, namelen );
43 }
44
45 int  sock_srv_crc_recv( sock, m, size, addr, namelen )
46    int sock,size,*namelen;
47    void *m;
48    struct sockaddr_in *addr;
49 {
50    int recv_size;
51    recv_size = sock_srv_recv(sock, buffer, size+sizeof(int), addr, namelen );
52    if( recv_size == 0 ) return -1;
53    else
54    if( recv_size < sizeof(int) ) return -1;
55    else{
56       recv_size-=sizeof(int);
57       bcopy( buffer+sizeof(int), m, recv_size );
58       if( get_crc(m,recv_size)!=ntohl(*(int *)buffer) )
59          return -1;  /* error */
60       else
61          return recv_size;
62    }
63 }
64
65
66
67 static int get_crc( data, data_size ) char *data; int data_size; {
68    int i;
69    unsigned long crc=0L;
70    for( i=0; i<data_size; i++,data++ ){
71       crc ^= (unsigned long)(unsigned char)(*(char *)data);
72       if( crc&1 )
73          crc = ( crc<<1 ) | 1;
74       else
75          crc = ( crc<<1 );
76    }
77    return crc;
78 }
79