added znfs daemon - for znfs host side; touch.c was missing
[ZeXOS.git] / tools / znfsd / proto.c
blob9c8812e648c77db7ebda9371929aa10c4e325a4a
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/stat.h>
5 #include <sys/types.h>
6 #include "client.h"
8 #define PROTO_MKDIR 0x1
9 #define PROTO_RMDIR 0x2
10 #define PROTO_CREAT 0x3
11 #define PROTO_RM 0x4
12 #define PROTO_CHDIR 0x5
13 #define PROTO_READ 0x6
15 int proto_handle (client_t *c, char *data, unsigned len)
17 char name[256];
18 unsigned char l = 0;
19 int r = -1;
21 printf ("proto_handle () - '%s' : %d\n", data, len);
23 switch (data[0]) {
24 case PROTO_MKDIR:
25 if (len < 3)
26 return 0;
28 l = data[1];
30 if (l > len-2)
31 return 0;
33 memcpy (name, data+2, l);
34 name[l] = '\0';
36 r = mkdir (name, 0777);
38 printf ("mkdir (%s, %x) = %d\n", name, 0x0777, r);
39 break;
40 case PROTO_RMDIR:
41 if (len < 3)
42 return 0;
44 l = data[1];
46 if (l > len-2)
47 return 0;
49 memcpy (name, data+2, l);
50 name[l] = '\0';
52 r = rmdir (name);
54 printf ("rmdir (%s) = %d\n", name, r);
55 break;
56 case PROTO_CREAT:
57 if (len < 3)
58 return 0;
60 l = data[1];
62 if (l > len-2)
63 return 0;
65 memcpy (name, data+2, l);
66 name[l] = '\0';
68 r = creat (name, 0777);
70 printf ("creat (%s, %x) = %d\n", name, 0x0777, r);
71 break;
72 case PROTO_RM:
74 printf ("rm (%s) = %d\n", "", r);
75 break;
76 case PROTO_CHDIR:
77 if (len < 3)
78 return 0;
80 l = data[1];
82 if (l > len-2)
83 return 0;
85 memcpy (name, data+2, l);
86 name[l] = '\0';
88 r = chdir (name);
90 printf ("chdir (%s) = %d\n", name, r);
91 break;
92 case PROTO_READ:
93 if (len < 3)
94 return 0;
96 l = data[1];
98 if (l > len-2)
99 return 0;
101 memcpy (name, data+2, l);
102 name[l] = '\0';
104 FILE *fr;
105 char s[1024];
107 fr = fopen (name, "r");
109 if (!fr) {
110 goto done;
113 while (fgets (s, sizeof (s), fr) != NULL) {
114 client_send (c, s, 1024);
115 usleep (10);
118 fclose (fr);
120 unsigned p = 0xf9da1e9; // some kind of magic .. eh it is match for EOF
121 client_send (c, (char *) &p, 4);
123 r = 0;
125 done:
126 printf ("read (%s) = %d\n", name, r);
127 break;
130 return 1;