4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "renderfarm.h"
24 #include "renderfarmfsserver.h"
33 RenderFarmFSServer::RenderFarmFSServer(RenderFarmServerThread *server)
35 this->server = server;
40 RenderFarmFSServer::~RenderFarmFSServer()
44 void RenderFarmFSServer::initialize()
48 int RenderFarmFSServer::handle_request(int request_id, int request_size, unsigned char *buffer)
53 printf("RenderFarmFSServer::handle_request request_id=%d\n", request_id);
56 case RENDERFARM_FOPEN:
61 unsigned char datagram[8];
67 mode = (char*)buffer + strlen(path) + 1;
70 file = fopen64(path, mode);
71 file_int64 = Units::ptr_to_int64(file);
72 STORE_INT64(file_int64);
73 server->write_socket((char*)datagram, 8, RENDERFARM_TIMEOUT);
75 printf("RenderFarmFSServer::handle_request RENDERFARM_FOPEN file=%p file_int64=%llx datagram=%02x%02x%02x%02x%02x%02x%02x%02x path=%s mode=%s\n",
76 file, file_int64, datagram[0], datagram[1], datagram[2], datagram[3], datagram[4], datagram[5], datagram[6], datagram[7], path, mode);
81 case RENDERFARM_FCLOSE:
83 int64_t pointer = READ_INT64((unsigned char*)buffer);
84 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
86 printf("RenderFarmFSServer::handle_request RENDERFARM_FCLOSE file=%p\n", file);
92 case RENDERFARM_REMOVE:
94 remove((char*)buffer);
96 printf("RenderFarmFSServer::handle_request path=%s\n", buffer);
101 case RENDERFARM_RENAME:
103 char *oldpath = (char*)buffer;
104 char *newpath = (char*)buffer + strlen(oldpath) + 1;
105 rename(oldpath, newpath);
107 printf("RenderFarmFSServer::handle_request old=%s new=%s\n", oldpath, newpath);
112 case RENDERFARM_FGETC:
114 int64_t pointer = READ_INT64((unsigned char*)buffer);
115 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
116 unsigned char datagram[1];
117 datagram[0] = fgetc(file);
118 server->write_socket((char*)datagram, 1, RENDERFARM_TIMEOUT);
120 printf("RenderFarmFSServer::handle_request file=%p\n", file);
125 case RENDERFARM_FPUTC:
127 int64_t pointer = READ_INT64((unsigned char*)buffer);
128 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
129 fputc(buffer[8], file);
132 printf("RenderFarmFSServer::handle_request file=%p\n", file);
136 case RENDERFARM_FREAD:
138 int64_t pointer = READ_INT64((unsigned char*)buffer);
139 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
140 int size = READ_INT32((unsigned char*)buffer + 8);
141 int num = READ_INT32((unsigned char*)buffer + 12);
142 unsigned char datagram[4];
145 // printf("RenderFarmFSServer::handle_request RENDERFARM_FREAD %02x%02x%02x%02x%02x%02x%02x%02x %p %d %d\n",
146 // buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7],
152 server->reallocate_buffer(size * num);
153 bytes = fread(server->buffer, size, num, file);
155 server->write_socket((char*)datagram, 4, RENDERFARM_TIMEOUT);
156 server->write_socket((char*)server->buffer, size * bytes, RENDERFARM_TIMEOUT);
159 printf("RenderFarmFSServer::handle_request file=%p size=%d num=%d bytes=%d\n",
160 file, size, num, bytes);
164 case RENDERFARM_FGETS:
166 int64_t pointer = READ_INT64((unsigned char*)buffer);
167 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
168 int size = READ_INT32((unsigned char*)buffer + 8);
169 unsigned char datagram[4];
172 server->reallocate_buffer(size);
173 char *return_value = fgets((char*)server->buffer, size, file);
177 bytes = strlen(return_value) + 1;
180 server->write_socket((char*)datagram, 4, RENDERFARM_TIMEOUT);
181 server->write_socket((char*)server->buffer, bytes, RENDERFARM_TIMEOUT);
186 case RENDERFARM_FILENO:
188 int64_t pointer = READ_INT64((unsigned char*)buffer);
189 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
190 unsigned char datagram[4];
193 int return_value = fileno(file);
194 STORE_INT32(return_value);
195 server->write_socket((char*)datagram, 4, RENDERFARM_TIMEOUT);
197 printf("RenderFarmFSServer::handle_request file=%p fileno=%d\n",
203 case RENDERFARM_FWRITE:
205 int64_t pointer = READ_INT64((unsigned char*)buffer);
206 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
207 int size = READ_INT32((unsigned char*)buffer + 8);
208 int num = READ_INT32((unsigned char*)buffer + 12);
209 unsigned char datagram[4];
213 server->reallocate_buffer(size * num);
214 server->read_socket((char*)server->buffer, size * num, RENDERFARM_TIMEOUT);
215 bytes = fwrite(server->buffer, size, num, file);
217 server->write_socket((char*)datagram, 4, RENDERFARM_TIMEOUT);
220 printf("RenderFarmFSServer::handle_request RENDERFARM_FWRITE file=%p size=%d num=%d bytes=%d\n",
221 file, size, num, bytes);
225 case RENDERFARM_FSEEK:
227 int64_t pointer = READ_INT64((unsigned char*)buffer);
228 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
229 // printf("RENDERFARM_FSEEK 1 buffer=%02x%02x%02x%02x%02x%02x%02x%02x %p %llx\n",
230 // buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], file, pointer);
231 int64_t offset = READ_INT64((unsigned char*)buffer + 8);
232 int whence = READ_INT32((unsigned char*)buffer + 16);
234 unsigned char datagram[4];
237 return_value = fseeko64(file, offset, whence);
238 STORE_INT32(return_value);
239 server->write_socket((char*)datagram, 4, RENDERFARM_TIMEOUT);
242 printf("RenderFarmFSServer::handle_request file=%p offset=" _LD " whence=%d result=%d\n",
243 file, offset, whence, result);
247 case RENDERFARM_FTELL:
249 int64_t pointer = READ_INT64((unsigned char*)buffer);
250 FILE *file = (FILE*)Units::int64_to_ptr(pointer);
251 unsigned char datagram[8];
253 int64_t return_value = ftello64(file);
254 STORE_INT64(return_value);
255 server->write_socket((char*)datagram, 8, RENDERFARM_TIMEOUT);
258 printf("RenderFarmFSServer::handle_request file=%p result=" _LD "\n",
263 case RENDERFARM_STAT:
265 struct stat stat_buf;
266 int return_value = stat((char*)buffer, &stat_buf);
267 server->write_socket((char*)&stat_buf, sizeof(struct stat), RENDERFARM_TIMEOUT);
270 printf("RenderFarmFSServer::handle_request path=%s result=%d\n",
271 buffer, return_value);
275 case RENDERFARM_STAT64:
277 struct stat64 stat_buf;
278 int return_value = stat64((char*)buffer, &stat_buf);
280 arg.dev = stat_buf.st_dev;
281 // arg.ino32 = stat_buf.__st_ino;
282 arg.ino = stat_buf.st_ino;
283 arg.nlink = stat_buf.st_nlink;
284 arg.mode = stat_buf.st_mode;
285 arg.uid = stat_buf.st_uid;
286 arg.gid = stat_buf.st_gid;
287 arg.rdev = stat_buf.st_rdev;
288 arg.size = stat_buf.st_size;
289 arg.blksize = stat_buf.st_blksize;
290 arg.blocks = stat_buf.st_blocks;
291 arg.atim = stat_buf.st_atim.tv_sec;
292 arg.mtim = stat_buf.st_mtim.tv_sec;
293 arg.ctim = stat_buf.st_ctim.tv_sec;
294 server->write_socket((char*)&arg, sizeof(arg), RENDERFARM_TIMEOUT);
297 printf("RenderFarmFSServer::handle_request path=%s result=%d\n",
298 buffer, return_value);