Browse Source

Add seek()

Dehyphenate "data-transfer".
tags/v0.9.3
Michael Brown 18 years ago
parent
commit
280160139d
4 changed files with 137 additions and 38 deletions
  1. 4
    4
      src/core/open.c
  2. 75
    18
      src/core/xfer.c
  3. 2
    2
      src/include/gpxe/open.h
  4. 56
    14
      src/include/gpxe/xfer.h

+ 4
- 4
src/core/open.c View File

45
 /**
45
 /**
46
  * Open URI
46
  * Open URI
47
  *
47
  *
48
- * @v xfer		Data-transfer interface
48
+ * @v xfer		Data transfer interface
49
  * @v uri_string	URI string (e.g. "http://etherboot.org/kernel")
49
  * @v uri_string	URI string (e.g. "http://etherboot.org/kernel")
50
  * @ret rc		Return status code
50
  * @ret rc		Return status code
51
  */
51
  */
74
 /**
74
 /**
75
  * Open socket
75
  * Open socket
76
  *
76
  *
77
- * @v xfer		Data-transfer interface
77
+ * @v xfer		Data transfer interface
78
  * @v domain		Communication domain (e.g. PF_INET)
78
  * @v domain		Communication domain (e.g. PF_INET)
79
  * @v type		Communication semantics (e.g. SOCK_STREAM)
79
  * @v type		Communication semantics (e.g. SOCK_STREAM)
80
  */
80
  */
101
 /**
101
 /**
102
  * Open location
102
  * Open location
103
  *
103
  *
104
- * @v xfer		Data-transfer interface
104
+ * @v xfer		Data transfer interface
105
  * @v type		Location type
105
  * @v type		Location type
106
  * @v args		Remaining arguments depend upon location type
106
  * @v args		Remaining arguments depend upon location type
107
  * @ret rc		Return status code
107
  * @ret rc		Return status code
128
 /**
128
 /**
129
  * Open location
129
  * Open location
130
  *
130
  *
131
- * @v xfer		Data-transfer interface
131
+ * @v xfer		Data transfer interface
132
  * @v type		Location type
132
  * @v type		Location type
133
  * @v ...		Remaining arguments depend upon location type
133
  * @v ...		Remaining arguments depend upon location type
134
  * @ret rc		Return status code
134
  * @ret rc		Return status code

+ 75
- 18
src/core/xfer.c View File

26
  *
26
  *
27
  */
27
  */
28
 
28
 
29
+/**
30
+ * Close data transfer interface
31
+ *
32
+ * @v xfer		Data transfer interface
33
+ * @v rc		Reason for close
34
+ */
35
+void close ( struct xfer_interface *xfer, int rc ) {
36
+	struct xfer_interface *dest = xfer_dest ( xfer );
37
+
38
+	dest->op->close ( dest, rc );
39
+	xfer_unplug ( xfer );
40
+}
41
+
42
+/**
43
+ * Seek to position
44
+ *
45
+ * @v xfer		Data transfer interface
46
+ * @v pos		New position
47
+ * @ret rc		Return status code
48
+ */
49
+int seek ( struct xfer_interface *xfer, size_t pos ) {
50
+	struct xfer_interface *dest = xfer_dest ( xfer );
51
+
52
+	return dest->op->seek ( dest, pos );
53
+}
54
+
29
 /**
55
 /**
30
  * Send redirection event
56
  * Send redirection event
31
  *
57
  *
32
- * @v xfer		Data-transfer interface
58
+ * @v xfer		Data transfer interface
33
  * @v type		New location type
59
  * @v type		New location type
34
  * @v args		Remaining arguments depend upon location type
60
  * @v args		Remaining arguments depend upon location type
35
  * @ret rc		Return status code
61
  * @ret rc		Return status code
43
 /**
69
 /**
44
  * Send redirection event
70
  * Send redirection event
45
  *
71
  *
46
- * @v xfer		Data-transfer interface
72
+ * @v xfer		Data transfer interface
47
  * @v type		New location type
73
  * @v type		New location type
48
  * @v ...		Remaining arguments depend upon location type
74
  * @v ...		Remaining arguments depend upon location type
49
  * @ret rc		Return status code
75
  * @ret rc		Return status code
61
 /**
87
 /**
62
  * Deliver datagram
88
  * Deliver datagram
63
  *
89
  *
64
- * @v xfer		Data-transfer interface
90
+ * @v xfer		Data transfer interface
65
  * @v iobuf		Datagram I/O buffer
91
  * @v iobuf		Datagram I/O buffer
66
  * @ret rc		Return status code
92
  * @ret rc		Return status code
67
  */
93
  */
74
 /**
100
 /**
75
  * Deliver datagram as raw data
101
  * Deliver datagram as raw data
76
  *
102
  *
77
- * @v xfer		Data-transfer interface
103
+ * @v xfer		Data transfer interface
78
  * @v iobuf		Datagram I/O buffer
104
  * @v iobuf		Datagram I/O buffer
79
  * @ret rc		Return status code
105
  * @ret rc		Return status code
80
  */
106
  */
93
  *
119
  *
94
  */
120
  */
95
 
121
 
122
+/**
123
+ * Ignore close()
124
+ *
125
+ * @v xfer		Data transfer interface
126
+ * @v rc		Reason for close
127
+ */
128
+void ignore_close ( struct xfer_interface *xfer __unused, int rc __unused ) {
129
+	/* Nothing to do */
130
+}
131
+
132
+/**
133
+ * Ignore vredirect()
134
+ *
135
+ * @v xfer		Data transfer interface
136
+ * @v type		New location type
137
+ * @v args		Remaining arguments depend upon location type
138
+ * @ret rc		Return status code
139
+ */
140
+int ignore_vredirect ( struct xfer_interface *xfer __unused,
141
+		       int type __unused, va_list args __unused ) {
142
+	return 0;
143
+}
144
+
145
+/**
146
+ * Ignore seek()
147
+ *
148
+ * @v xfer		Data transfer interface
149
+ * @v pos		New position
150
+ * @ret rc		Return status code
151
+ */
152
+int ignore_seek ( struct xfer_interface *xfer __unused, size_t pos __unused ) {
153
+	return 0;
154
+}
155
+
96
 /**
156
 /**
97
  * Deliver datagram as raw data
157
  * Deliver datagram as raw data
98
  *
158
  *
99
- * @v xfer		Data-transfer interface
159
+ * @v xfer		Data transfer interface
100
  * @v iobuf		Datagram I/O buffer
160
  * @v iobuf		Datagram I/O buffer
101
  * @ret rc		Return status code
161
  * @ret rc		Return status code
102
  *
162
  *
115
 /**
175
 /**
116
  * Deliver datagram as I/O buffer
176
  * Deliver datagram as I/O buffer
117
  *
177
  *
118
- * @v xfer		Data-transfer interface
178
+ * @v xfer		Data transfer interface
119
  * @v data		Data buffer
179
  * @v data		Data buffer
120
  * @v len		Length of data buffer
180
  * @v len		Length of data buffer
121
  * @ret rc		Return status code
181
  * @ret rc		Return status code
135
 	return xfer->op->deliver ( xfer, iobuf );
195
 	return xfer->op->deliver ( xfer, iobuf );
136
 }
196
 }
137
 
197
 
138
-/****************************************************************************
139
- *
140
- * Null data transfer interface
141
- *
142
- */
143
-
144
 /**
198
 /**
145
- * Null deliver datagram as raw data
199
+ * Ignore datagram as raw data
146
  *
200
  *
147
- * @v xfer		Data-transfer interface
201
+ * @v xfer		Data transfer interface
148
  * @v data		Data buffer
202
  * @v data		Data buffer
149
  * @v len		Length of data buffer
203
  * @v len		Length of data buffer
150
  * @ret rc		Return status code
204
  * @ret rc		Return status code
151
  */
205
  */
152
-static int null_deliver_raw ( struct xfer_interface *xfer,
153
-			      const void *data __unused, size_t len ) {
206
+int ignore_deliver_raw ( struct xfer_interface *xfer,
207
+			 const void *data __unused, size_t len ) {
154
 	DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
208
 	DBGC ( xfer, "XFER %p %zd bytes delivered %s\n", xfer, len,
155
 	       ( ( xfer == &null_xfer ) ?
209
 	       ( ( xfer == &null_xfer ) ?
156
 		 "before connection" : "after termination" ) );
210
 		 "before connection" : "after termination" ) );
157
-	return -EPIPE;
211
+	return 0;
158
 }
212
 }
159
 
213
 
160
 /** Null data transfer interface operations */
214
 /** Null data transfer interface operations */
161
 struct xfer_interface_operations null_xfer_ops = {
215
 struct xfer_interface_operations null_xfer_ops = {
216
+	.close		= ignore_close,
217
+	.vredirect	= ignore_vredirect,
218
+	.seek		= ignore_seek,
162
 	.deliver	= deliver_as_raw,
219
 	.deliver	= deliver_as_raw,
163
-	.deliver_raw	= null_deliver_raw,
220
+	.deliver_raw	= ignore_deliver_raw,
164
 };
221
 };
165
 
222
 
166
 /**
223
 /**

+ 2
- 2
src/include/gpxe/open.h View File

41
 	const char *scheme;
41
 	const char *scheme;
42
 	/** Open URI
42
 	/** Open URI
43
 	 *
43
 	 *
44
-	 * @v xfer		Data-transfer interface
44
+	 * @v xfer		Data transfer interface
45
 	 * @v uri		URI
45
 	 * @v uri		URI
46
 	 * @ret rc		Return status code
46
 	 * @ret rc		Return status code
47
 	 *
47
 	 *
62
 	int type;
62
 	int type;
63
 	/** Open socket
63
 	/** Open socket
64
 	 *
64
 	 *
65
-	 * @v xfer		Data-transfer interface
65
+	 * @v xfer		Data transfer interface
66
 	 * @v sa		Socket address
66
 	 * @v sa		Socket address
67
 	 * @ret rc		Return status code
67
 	 * @ret rc		Return status code
68
 	 */
68
 	 */

+ 56
- 14
src/include/gpxe/xfer.h View File

32
 
32
 
33
 	/** Close interface
33
 	/** Close interface
34
 	 *
34
 	 *
35
-	 * @v xfer		Data-transfer interface
35
+	 * @v xfer		Data transfer interface
36
 	 * @v rc		Reason for close
36
 	 * @v rc		Reason for close
37
 	 */
37
 	 */
38
 	void ( * close ) ( struct xfer_interface *xfer, int rc );
38
 	void ( * close ) ( struct xfer_interface *xfer, int rc );
39
 	/** Redirect to new location
39
 	/** Redirect to new location
40
 	 *
40
 	 *
41
-	 * @v xfer		Data-transfer interface
41
+	 * @v xfer		Data transfer interface
42
 	 * @v type		New location type
42
 	 * @v type		New location type
43
 	 * @v args		Remaining arguments depend upon location type
43
 	 * @v args		Remaining arguments depend upon location type
44
 	 * @ret rc		Return status code
44
 	 * @ret rc		Return status code
45
 	 */
45
 	 */
46
 	int ( * vredirect ) ( struct xfer_interface *xfer, int type,
46
 	int ( * vredirect ) ( struct xfer_interface *xfer, int type,
47
 			      va_list args );
47
 			      va_list args );
48
+	/** Seek to position
49
+	 *
50
+	 * @v xfer		Data transfer interface
51
+	 * @v pos		New position
52
+	 * @ret rc		Return status code
53
+	 */
54
+	int ( * seek ) ( struct xfer_interface *xfer, size_t pos );
48
 	/** Deliver datagram
55
 	/** Deliver datagram
49
 	 *
56
 	 *
50
-	 * @v xfer		Data-transfer interface
57
+	 * @v xfer		Data transfer interface
51
 	 * @v iobuf		Datagram I/O buffer
58
 	 * @v iobuf		Datagram I/O buffer
52
 	 * @ret rc		Return status code
59
 	 * @ret rc		Return status code
53
 	 *
60
 	 *
59
 			    struct io_buffer *iobuf );
66
 			    struct io_buffer *iobuf );
60
 	/** Deliver datagram as raw data
67
 	/** Deliver datagram as raw data
61
 	 *
68
 	 *
62
-	 * @v xfer		Data-transfer interface
69
+	 * @v xfer		Data transfer interface
63
 	 * @v data		Data buffer
70
 	 * @v data		Data buffer
64
 	 * @v len		Length of data buffer
71
 	 * @v len		Length of data buffer
65
 	 * @ret rc		Return status code
72
 	 * @ret rc		Return status code
83
 extern struct xfer_interface null_xfer;
90
 extern struct xfer_interface null_xfer;
84
 extern struct xfer_interface_operations null_xfer_ops;
91
 extern struct xfer_interface_operations null_xfer_ops;
85
 
92
 
93
+extern void close ( struct xfer_interface *xfer, int rc );
94
+extern int seek ( struct xfer_interface *xfer, size_t pos );
86
 extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
95
 extern int vredirect ( struct xfer_interface *xfer, int type, va_list args );
87
 extern int redirect ( struct xfer_interface *xfer, int type, ... );
96
 extern int redirect ( struct xfer_interface *xfer, int type, ... );
88
 extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
97
 extern int deliver ( struct xfer_interface *xfer, struct io_buffer *iobuf );
89
 extern int deliver_raw ( struct xfer_interface *xfer,
98
 extern int deliver_raw ( struct xfer_interface *xfer,
90
 			 const void *data, size_t len );
99
 			 const void *data, size_t len );
91
 
100
 
101
+extern void ignore_close ( struct xfer_interface *xfer, int rc );
102
+extern int ignore_vredirect ( struct xfer_interface *xfer,
103
+			      int type, va_list args );
104
+extern int ignore_seek ( struct xfer_interface *xfer, size_t pos );
92
 extern int deliver_as_raw ( struct xfer_interface *xfer,
105
 extern int deliver_as_raw ( struct xfer_interface *xfer,
93
 			    struct io_buffer *iobuf );
106
 			    struct io_buffer *iobuf );
94
 extern int deliver_as_iobuf ( struct xfer_interface *xfer,
107
 extern int deliver_as_iobuf ( struct xfer_interface *xfer,
95
 			      const void *data, size_t len );
108
 			      const void *data, size_t len );
109
+extern int ignore_deliver_raw ( struct xfer_interface *xfer,
110
+				const void *data __unused, size_t len );
111
+
112
+/**
113
+ * Initialise a data transfer interface
114
+ *
115
+ * @v xfer		Data transfer interface
116
+ * @v op		Data transfer interface operations
117
+ * @v refcnt		Data transfer interface reference counting method
118
+ */
119
+static inline void xfer_init ( struct xfer_interface *xfer,
120
+			       struct xfer_interface_operations *op,
121
+			       void ( * refcnt ) ( struct interface *intf,
122
+						   int delta ) ) {
123
+	xfer->intf.dest = &null_xfer.intf;
124
+	xfer->intf.refcnt = refcnt;
125
+	xfer->op = op;
126
+}
127
+
128
+/**
129
+ * Get data transfer interface from generic object communication interface
130
+ *
131
+ * @v intf		Generic object communication interface
132
+ * @ret xfer		Data transfer interface
133
+ */
134
+static inline struct xfer_interface *
135
+intf_to_xfer ( struct interface *intf ) {
136
+	return container_of ( intf, struct xfer_interface, intf );
137
+}
96
 
138
 
97
 /**
139
 /**
98
- * Get destination data-transfer interface
140
+ * Get destination data transfer interface
99
  *
141
  *
100
- * @v xfer		Data-transfer interface
142
+ * @v xfer		Data transfer interface
101
  * @ret dest		Destination interface
143
  * @ret dest		Destination interface
102
  */
144
  */
103
 static inline struct xfer_interface *
145
 static inline struct xfer_interface *
104
 xfer_dest ( struct xfer_interface *xfer ) {
146
 xfer_dest ( struct xfer_interface *xfer ) {
105
-	return container_of ( xfer->intf.dest, struct xfer_interface, intf );
147
+	return intf_to_xfer ( xfer->intf.dest );
106
 }
148
 }
107
 
149
 
108
 /**
150
 /**
109
- * Plug a data-transfer interface into a new destination interface
151
+ * Plug a data transfer interface into a new destination interface
110
  *
152
  *
111
- * @v xfer		Data-transfer interface
153
+ * @v xfer		Data transfer interface
112
  * @v dest		New destination interface
154
  * @v dest		New destination interface
113
  */
155
  */
114
 static inline void xfer_plug ( struct xfer_interface *xfer,
156
 static inline void xfer_plug ( struct xfer_interface *xfer,
117
 }
159
 }
118
 
160
 
119
 /**
161
 /**
120
- * Unplug a data-transfer interface
162
+ * Unplug a data transfer interface
121
  *
163
  *
122
- * @v xfer		Data-transfer interface
164
+ * @v xfer		Data transfer interface
123
  */
165
  */
124
 static inline void xfer_unplug ( struct xfer_interface *xfer ) {
166
 static inline void xfer_unplug ( struct xfer_interface *xfer ) {
125
 	plug ( &xfer->intf, &null_xfer.intf );
167
 	plug ( &xfer->intf, &null_xfer.intf );
126
 }
168
 }
127
 
169
 
128
 /**
170
 /**
129
- * Terminate a data-transfer interface
171
+ * Stop using a data transfer interface
130
  *
172
  *
131
- * @v xfer		Data-transfer interface
173
+ * @v xfer		Data transfer interface
132
  *
174
  *
133
  * After calling this method, no further messages will be received via
175
  * After calling this method, no further messages will be received via
134
  * the interface.
176
  * the interface.
135
  */
177
  */
136
-static inline void xfer_terminate ( struct xfer_interface *xfer ) {
178
+static inline void xfer_nullify ( struct xfer_interface *xfer ) {
137
 	xfer->op = &null_xfer_ops;
179
 	xfer->op = &null_xfer_ops;
138
 };
180
 };
139
 
181
 

Loading…
Cancel
Save