summaryrefslogtreecommitdiff
path: root/net/ccxstream/files/patch-ccxstream.c
blob: 4af51400cc14aaa93c62837803e7e5eb1f709d02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
--- ccxstream.c.orig	Mon Mar 17 11:29:15 2003
+++ ccxstream.c	Tue May 15 15:02:31 2007
@@ -1004,7 +1004,7 @@
 	for (fh = 0; fh < CC_XSTREAM_MAX_OPEN_FILES; fh++)
 	  if (conn->open_file_handle[fh] == handle)
 	    break;
-	if (fh >= CC_XSTREAM_MAX_OPEN_FILES)
+	if ( (fh >= CC_XSTREAM_MAX_OPEN_FILES) || (conn->open_file_handle[fh] <= 0) )
 	  {
 	    cc_xstream_send_error(conn, id, CC_XSTREAM_XBMSP_ERROR_INVALID_HANDLE, "Invalid file handle.");
 	    return 1;
@@ -1016,10 +1016,19 @@
 	  }
 	hlp = cc_xmalloc(rlen);
 	sz = fread(hlp, 1, rlen, conn->f[fh]);
+	if ( (sz < rlen) && ( (ferror(conn->f[fh]) != 0) || (feof(conn->f[fh]) == 0) ) )
+	  {
+	    fclose(conn->f[fh]);
+	    conn->f[fh] = NULL;
+	    cc_xstream_send_error(conn, id, CC_XSTREAM_XBMSP_ERROR_ILLEGAL_SEEK, "File read failed.");
+	  }
+	else
+	  {
 	cc_xstream_write_int(conn, 1 + 4 + 4 + sz);
 	cc_xstream_write_byte(conn, (int)CC_XSTREAM_XBMSP_PACKET_FILE_CONTENTS);
 	cc_xstream_write_int(conn, id);
 	cc_xstream_write_data_string(conn, (unsigned char *)hlp, sz);
+	  }
 	cc_xfree(hlp);
 	return 1;
       }
@@ -1661,6 +1670,16 @@
   setsockopt(prog->s, SOL_SOCKET, SO_REUSEPORT, (char *)&c, sizeof (c));
 #endif /* SO_REUSEPORT */
 
+#ifdef TCP_NODELAY
+  c = 1;
+  setsockopt(prog->s, IPPROTO_TCP, TCP_NODELAY, (char *)&c, sizeof (c));
+#endif /* TCP_NODELAY */
+
+#ifdef SO_KEEPALIVE
+  c = 1;
+  setsockopt(prog->s, SOL_SOCKET, SO_KEEPALIVE, (char *)&c, sizeof (c));
+#endif /* SO_KEEPALIVE */
+
   memset(&sa, 0, sizeof (sa));
   sa.sin_family = AF_INET;
   sa.sin_addr = la;
@@ -1693,6 +1712,10 @@
       c = 1;
       setsockopt(prog->bs, SOL_SOCKET, SO_BROADCAST, (char *)&c, sizeof (c));
 #endif /* SO_BROADCAST */
+#ifdef SO_KEEPALIVE
+      c = 1;
+      setsockopt(prog->bs, SOL_SOCKET, SO_KEEPALIVE, (char *)&c, sizeof (c));
+#endif /* SO_KEEPALIVE */
 
       memset(&sa, 0, sizeof (sa));
       sa.sin_family = AF_INET;