Fixed possible memory corruption in commands exec and netexec; fixed command netcp...
[ZeXOS.git] / tools / znfsd / net.c
blob202866791b758d30258ab8915e01fa2fb35db894
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <sys/socket.h>
6 #include <arpa/inet.h>
7 #include "client.h"
9 int mainsocket;
10 struct sockaddr_in sockserver;
11 struct sockaddr_in sockclient;
12 socklen_t addrlen;
13 char buffer[1530];
15 extern client_t client_list;
17 int net_send (int fd, char *str, unsigned len)
19 int oldFlag = fcntl (fd, F_GETFL, 0);
20 if (fcntl (fd, F_SETFL, oldFlag & ~O_NONBLOCK) == -1) {
21 printf ("Cant set socket to blocking mode\n");
22 return 0;
25 int ret = send (fd, str, len, 0);
27 oldFlag = fcntl (fd, F_GETFL, 0);
28 if (fcntl (fd, F_SETFL, oldFlag | O_NONBLOCK) == -1) {
29 printf ("Cant set socket to nonblocking mode\n");
30 return 0;
33 return ret;
36 int net_accept ()
38 int newfd = accept (mainsocket, (struct sockaddr *) &sockclient, &addrlen);
40 if (newfd > 0) {
41 printf ("> New client connected fd (%d) - %s\n", newfd, inet_ntoa (sockclient.sin_addr));
43 client_add (newfd);
45 return newfd;
48 return 0;
51 int net_loop ()
53 net_accept ();
55 usleep (32);
57 client_t *c;
58 for (c = client_list.next; c != &client_list; c = c->next) {
59 if (!c)
60 continue;
62 int ret = recv (c->fd, buffer, 1500, 0);
64 if (ret > 0)
65 if (!client_handle (c, buffer, ret))
66 break;
69 return 1;
72 int net_init ()
74 int port = 5333;
76 if ((mainsocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
77 printf ("Cant create socket\n");
78 return -1;
81 // 1) Family of protocols
82 sockserver.sin_family = AF_INET;
83 // 2) Set number of listen port
84 sockserver.sin_port = htons (port);
85 // 3) Listen IP address
86 sockserver.sin_addr.s_addr = INADDR_ANY;
88 unsigned long yes = 1;
89 setsockopt (mainsocket, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof (yes));
91 // Bind on our socket
92 if (bind (mainsocket, (struct sockaddr *) &sockserver, sizeof (sockserver)) == -1) {
93 printf ("bind () - port is used\n");
94 return -1;
97 // Create queue for accept
98 if (listen (mainsocket, 10) == -1) {
99 printf ("ERROR -> listen () == -1\n");
100 return -1;
103 // set mainSocket to non-blocking mode
104 int oldFlag = fcntl (mainsocket, F_GETFL, 0);
105 if (fcntl (mainsocket, F_SETFL, oldFlag | O_NONBLOCK) == -1) {
106 printf ("Cant set socket to nonblocking mode\n");
107 return 0;
110 return 1;