1 #ifndef __FILEMAN_HPP_ 2 #define __FILEMAN_HPP_ 3 4 #include <unistd.h> 5 #include "sock.h" 6 #include <stdlib.h> 7 #include <string.h> 8 9 10 class file_manager 11 { 12 net_address *default_fs; 13 int no_security; 14 15 class nfs_client 16 { 17 public : 18 net_socket *sock; 19 int file_fd; 20 21 nfs_client *next; 22 int32_t size_to_read; 23 int32_t size; 24 nfs_client(net_socket *sock, int file_fd, nfs_client *next); 25 int send_read(); // flushes as much of size_to_read as possible 26 ~nfs_client(); 27 } ; 28 29 30 class remote_file // a remote client has opened this file with us 31 { 32 public : 33 net_socket *sock; 34 void r_close(char const *reason); 35 int32_t size; // server tells us the size of the file when we open it 36 int open_local; 37 remote_file *next; 38 remote_file(net_socket *sock, char const *filename, char const *mode, remote_file *Next); 39 40 int unbuffered_read(void *buffer, size_t count); unbuffered_write(void const * buf,size_t count)41 int unbuffered_write(void const *buf, size_t count) { return 0; } // not supported 42 int32_t unbuffered_tell(); 43 int32_t unbuffered_seek(int32_t offset); file_size()44 int32_t file_size() { return size; } open_failure()45 int open_failure() { return sock==NULL; } 46 ~remote_file(); fd()47 int fd() { if (sock) return sock->get_fd(); else return -1; } 48 } ; 49 50 51 nfs_client *nfs_list; 52 remote_file *remote_list; 53 54 int process_nfs_command(nfs_client *c); 55 void secure_filename(char *filename, char *mode); 56 remote_file *find_rf(int fd); 57 net_protocol *proto; 58 public : 59 60 file_manager(int argc, char **argv, net_protocol *proto); 61 void process_net(); 62 void add_nfs_client(net_socket *sock); 63 64 65 int rf_open_file(char const *&filename, char const *mode); 66 int32_t rf_tell(int fd); 67 int32_t rf_seek(int fd, int32_t offset); 68 int rf_read(int fd, void *buffer, size_t count); 69 int rf_close(int fd); 70 int32_t rf_file_size(int fd); set_default_fs(net_address * def)71 void set_default_fs(net_address *def) { default_fs=def->copy(); } ~file_manager()72 ~file_manager() { if (default_fs) delete default_fs; } 73 } ; 74 75 extern file_manager *fman; 76 77 78 #endif 79