summaryrefslogtreecommitdiffabout
path: root/pumpkin/TFTPPacket.h
blob: a46d5bca95fec99f8aabfbc55228c7c044f80105 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

#import <Cocoa/Cocoa.h>
#include <stdint.h>

enum TFTPOp {
	tftpOpRRQ=1, tftpOpWRQ=2,
	tftpOpDATA=3,
	tftpOpACK=4,
	tftpOpERROR=5,
	tftpOpOACK=6
};

enum TFTPError {
	tftpErrUndefined=0,
	tftpErrNotFound=1,
	tftpErrAccessViolation=2,
	tftpErrDiskFull=3,
	tftpErrIllegalOp=4,
	tftpErrUnknownTID=5,
	tftpErrFileExists=6,
	tftpErrNoUser=7,
	tftpErrOption=8
};

#pragma pack(push,1)
struct AnyTFTPPacket {
    uint16_t op;
    union {
	struct {
	    char data[1];
	} any;
	struct {
	    char data[1];
	} rq;
	struct {
	    char data[1];
	} rrq;
	struct {
	    char data[1];
	} wrq;
	struct {
	    uint16_t block;
	    char data[1];
	} data;
	struct {
	    uint16_t block;
	} ack;
	struct {
	    uint16_t code;
	    char data[1];
	} err;
	struct {
	    char data[1];
	} oack;
    };
};
#pragma pack(pop)

@interface TFTPPacket : NSObject {
    NSData *data;
    struct AnyTFTPPacket *packet;
}

@property (readonly) enum TFTPOp op;
@property (readonly) NSString* rqFilename;
@property (readonly) NSString* rqType;
@property (readonly) NSDictionary* rqOptions;
@property (readonly) NSData *data;
@property (readonly) uint16_t block;
@property (readonly) NSData *rqData;
@property (readonly) uint16_t rqCode;
@property (readonly) NSString* rqMessage;

-(TFTPPacket*)initWithData:(NSData*)d;

+(TFTPPacket*)packetWithData:(NSData*)d;
+(TFTPPacket*)packetWithBytesNoCopy:(void*)b andLength:(size_t)l;

+(TFTPPacket*)packetErrorWithCode:(enum TFTPError)c andMessage:(NSString*)m;
+(TFTPPacket*)packetErrorWithErrno:(int)en andFallback:(NSString*)fb;
+(TFTPPacket*)packetOACKWithOptions:(NSDictionary*)o;
+(TFTPPacket*)packetDataWithBlock:(uint16_t)b andData:(NSData*)d;
+(TFTPPacket*)packetACKWithBlock:(uint16_t)b;
+(TFTPPacket*)packetRRQWithFile:(NSString*)f xferType:(NSString*)t andOptions:(NSDictionary*)o;
+(TFTPPacket*)packetWRQWithFile:(NSString*)f xferType:(NSString*)t andOptions:(NSDictionary*)o;

@end