00001
00002
00003
00004
00005
00006 TFTP_Option option;
00007
00008 class Buffer
00009 {
00010 private:
00011 char* buf;
00012 public:
00013 Buffer()
00014 {
00015 }
00016 ~Buffer();
00017 };
00018
00019
00020 class TFTPpacket {
00021
00022 };
00023
00024
00025
00026
00027
00028 class TFTPfile {
00029 public:
00030 void open();
00031 void close();
00032
00033 FILE* fichier;
00034
00035 Buffer* toNetascii();
00036 Buffer* toMail();
00037 Buffer* toOctet();
00038 };
00039
00040
00041
00042
00043
00044 class UnixSocket;
00045
00046
00047
00048
00049
00050
00051
00052
00053 class UnixSocketReceiver;
00054
00055
00056
00057
00058
00059
00060
00061
00062 class UnixSocketSender;
00063
00064
00065
00066 #define printError( s ) sprintf( stderr, char* s )
00067
00068 struct tftp_rrq_wrq_t {
00069 short opcode;
00070 char* filename;
00071 char null1;
00072 char* mode;
00073 char null2;
00074 }rrq_wrq;
00075
00076 class TFTPRequestPacket
00077 {
00078 private:
00079 tftp_rrq_wrq_t rrq_wrq_packet;
00080 public:
00081 TFTPRequestPacket(short opcode, char* filename)
00082 {
00083 rrq_wrq_packet.opcode= opcode;
00084 rrq_wrq_packet.filename = filename;
00085 rrq_wrq_packet.null1= '0';
00086 rrq_wrq_packet.mode = "octect";
00087 rrq_wrq_packet.null2= '0';
00088
00089 }
00090 ~TFTPRequestPacket()
00091 {
00092 }
00093
00094 short getopcode()
00095 {
00096 return rrq_wrq_packet.opcode;
00097 }
00098
00099 void setfilename(char* filename)
00100 {
00101 rrq_wrq_packet.filename = filename;
00102 }
00103
00104 char* getfilename()
00105 {
00106 return rrq_wrq_packet.filename;
00107 }
00108 tftp_rrq_wrq_t* get_rrq_wrq_packet()
00109 {
00110 return &rrq_wrq_packet;
00111 }
00112 };
00113
00114
00115 #define TFTP_RRQ_WRQ_INIT { 1 , NULL, 0, NULL, 0 }
00116
00117 struct tftp_optext_t {
00118 char* opt1;
00119 char null1;
00120 char* value1;
00121 char null2;
00122 };
00123
00124 #define TFTP_OPTEXT_INIT { NULL, 0, NULL, 0}
00125
00126
00127
00128
00129 struct tftp_data_t {
00130 short opcode;
00131 short blockNo;
00132 char* data;
00133 };
00134
00135
00136 #define TFTP_DATA_INIT { 3, 0, NULL }
00137 class TFTPDataPacket
00138 {
00139 private:
00140 tftp_data_t datapacket;
00141 public:
00142 TFTPDataPacket (short num, char* data){
00143 datapacket.opcode = 3;
00144 datapacket.blockNo= num;
00145 datapacket.data= data;
00146 }
00147
00148 ~TFTPDataPacket()
00149 {
00150 }
00151
00152 short getblockNo()
00153 {
00154 return datapacket.blockNo;
00155 }
00156 void setblockNo(short num)
00157 {
00158 datapacket.blockNo=num;
00159
00160 }
00161 void setdata(char* data)
00162 {
00163 datapacket.data = data;
00164 }
00165
00166
00167 tftp_data_t* getdatapacket()
00168 {
00169 return &datapacket;
00170 }
00171
00172 };
00173
00174
00175
00176
00177 struct tftp_ack_t {
00178 short opcode;
00179 short blockNo;
00180 };
00181
00182 #define TFTP_ACK_INIT { 4, 0 }
00183
00184 class TFTPAckPacket
00185 {
00186 private:
00187 tftp_ack_t ackpacket;
00188 public:
00189 TFTPAckPacket (short num){
00190 ackpacket.opcode = 4;
00191 ackpacket.blockNo= num;
00192 }
00193
00194 ~TFTPAckPacket()
00195 {
00196 }
00197
00198 short getblockNo()
00199 {
00200 return ackpacket.blockNo;
00201 }
00202 void setblockNo(short num)
00203 {
00204 ackpacket.blockNo=num;
00205
00206 }
00207
00208 tftp_ack_t* getackpacket()
00209 {
00210 return &ackpacket;
00211 }
00212
00213
00214 };
00215
00216 struct tftp_error_t {
00217 short opcode;
00218 short errorCode;
00219 char* errorMsg;
00220 char null1;
00221 };
00222
00223 class TFTPErrorPacket
00224 {
00225 private:
00226 tftp_error_t errorpacket;
00227
00228
00229 public:
00230 TFTPErrorPacket( short errorcode)
00231 {
00232 errorpacket.opcode = 5;
00233 errorpacket.errorCode = errorcode;
00234 errorpacket.errorMsg = NULL;
00235 errorpacket.null1= '0';
00236
00237 }
00238 ~TFTPErrorPacket()
00239 {
00240 }
00241
00242 short geterrorCode()
00243 {
00244 return errorpacket.errorCode;
00245 }
00246 void seterrorCode(errorcode)
00247 {
00248 errorpacket.errorCode = errorcode;
00249 }
00250
00251
00252 char* getErrorMsg()
00253 {
00254 return "Error";
00255 }
00256 tftp_error_t* geterrorpacket()
00257 {
00258 return &errorpacket;
00259 }
00260
00261 };
00262 #define TFTP_ERROR_INIT { 5, 0, NULL, 0 }
00263
00264 enum tftp_error_code_t {
00265 NotDefined = 0,
00266 FileNotFound = 1,
00267 AccessViolation = 2,
00268 DiskFull = 3,
00269 AllocationExceed = 3,
00270 IllegalOperation = 4,
00271 UnknownTransferID = 5,
00272 FileAlreadyExists = 6,
00273 NoSuchUser = 7
00274 };
00275
00276 struct StringData_t
00277 {
00278 char* s;
00279 size_t len;
00280 };
00281
00282 StringData_t tftp_error_msg[8] = {
00283 { "Not defined.", 12 },
00284 { "File not found", 14 },
00285 { "Access violation", 15 },
00286 { "Disk full", 9 },
00287 { "Allocation exceeded", 19},
00288 { "Illegal operation", 17 },
00289 { "Unknown transfer id", 19 },
00290 { "File already exists", 19 },
00291 { "No such user", 12 }
00292 };
00293
00294 enum tftp_opcode {
00295 ReadRequest = 1,
00296 WriteRequest = 2,
00297 Data = 3,
00298 Acknowledgement = 4,
00299 Error = 5
00300 };
00301
00302
00303 class TFTP {
00304 Buffer* buffer;
00305 UCHAR windowSize;
00306 ULONG blockSize;
00307 char* filename;
00308 int Opt;
00309
00310 Packet* pkt;
00311
00312 TFTP(short listenport, short destport, char* desthost, char* f, int o)
00313 {
00314
00315 UnixSocketReceiver Receiver( listeningport );
00316 UnixSocketSender Sender( desthost, destport );
00317
00318 Sender.setSocket( Receiver.getSocket());
00319 pkt = new Packet( Sender);
00320 char* filename= f;
00321 int Opt;
00322 }
00323
00324 ~TFTP()
00325 {
00326 }
00327
00328 int Negotiate ( UnixSocketSender Sender)
00329 {
00330 pkt.SendRRQ(3,filename,mode,Opt_None);
00331
00332 pkt.SendError( 23);
00333
00334 }
00335 void negotatiate()
00336 {
00337
00338
00339
00340
00341 };
00342
00343
00344
00345
00346
00347
00348
00349 void sendPacket( siz1e_t begin, size_t length ) {
00350 char* pkt = new char[ blockSize ];
00351 char* pos = buffer.getPtr();
00352 memcpy( pkt, pos+begin, length );
00353 sender.send( pkt, length );
00354 }
00355
00356 void sendRRQ_WRQ( char opcode, char* filename)
00357
00358 void sendRR( int frameNo);
00359 void sendErr();
00360
00361 };