pmaports/modem/tqftpserv/0002-tqftpserv-add-seek-option-parsing.patch
Luca Weiss d7c64500ee
modem/tqftpserv: upgrade and add patches for rsize & seek option handling (MR 4747)
Makes modem work on fairphone-fp4 (sm6350/sm7225) and fairphone-fp5
(sc7280/qcm6490)

Patches are submitted upstream:
https://github.com/andersson/tqftpserv/pull/13
[ci:skip-build]: already built successfully in CI
2024-03-06 01:50:52 +01:00

148 lines
4.6 KiB
Diff

From e6fc5c5cabd210317ac6acae185416eeaf2a83d9 Mon Sep 17 00:00:00 2001
From: Luca Weiss <luca.weiss@fairphone.com>
Date: Fri, 10 Feb 2023 14:23:34 +0100
Subject: [PATCH 2/5] tqftpserv: add seek option parsing
Actual handling will be added in follow-up commits as rsize is also not
currently handled, and both are quite interconnected.
---
tqftpserv.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/tqftpserv.c b/tqftpserv.c
index 9d1a2b3..eed99a1 100644
--- a/tqftpserv.c
+++ b/tqftpserv.c
@@ -67,6 +67,7 @@ struct tftp_client {
size_t rsize;
size_t wsize;
unsigned int timeoutms;
+ off_t seek;
};
static struct list_head readers = LIST_INIT(readers);
@@ -117,7 +118,8 @@ static int tftp_send_ack(int sock, int block)
}
static int tftp_send_oack(int sock, size_t *blocksize, size_t *tsize,
- size_t *wsize, unsigned int *timeoutms, size_t *rsize)
+ size_t *wsize, unsigned int *timeoutms, size_t *rsize,
+ off_t *seek)
{
char buf[512];
char *p = buf;
@@ -171,6 +173,15 @@ static int tftp_send_oack(int sock, size_t *blocksize, size_t *tsize,
*p++ = '\0';
}
+ if (seek) {
+ strcpy(p, "seek");
+ p += 5;
+
+ n = sprintf(p, "%zd", *seek);
+ p += n;
+ *p++ = '\0';
+ }
+
return send(sock, buf, p - buf, 0);
}
@@ -197,7 +208,7 @@ static int tftp_send_error(int sock, int code, const char *msg)
static void parse_options(const char *buf, size_t len, size_t *blksize,
ssize_t *tsize, size_t *wsize, unsigned int *timeoutms,
- size_t *rsize)
+ size_t *rsize, off_t *seek)
{
const char *opt, *value;
const char *p = buf;
@@ -217,6 +228,7 @@ static void parse_options(const char *buf, size_t len, size_t *blksize,
* tsize: total size - request to get file size in bytes
* rsize: read size - how many bytes to send, not full file
* wsize: window size - how many blocks to send without ACK
+ * seek: offset from beginning of file in bytes to start reading
*/
if (!strcmp(opt, "blksize")) {
*blksize = atoi(value);
@@ -228,6 +240,8 @@ static void parse_options(const char *buf, size_t len, size_t *blksize,
*rsize = atoi(value);
} else if (!strcmp(opt, "wsize")) {
*wsize = atoi(value);
+ } else if (!strcmp(opt, "seek")) {
+ *seek = atoi(value);
} else {
printf("[TQFTP] Ignoring unknown option '%s' with value '%s'\n", opt, value);
}
@@ -246,6 +260,7 @@ static void handle_rrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
unsigned int timeoutms = 1000;
size_t rsize = 0;
size_t wsize = 0;
+ off_t seek = 0;
bool do_oack = false;
int sock;
int ret;
@@ -270,7 +285,7 @@ static void handle_rrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
if (p < buf + len) {
do_oack = true;
parse_options(p, len - (p - buf), &blksize, &tsize, &wsize,
- &timeoutms, &rsize);
+ &timeoutms, &rsize, &seek);
}
sock = qrtr_open(0);
@@ -307,6 +322,7 @@ static void handle_rrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
client->rsize = rsize;
client->wsize = wsize;
client->timeoutms = timeoutms;
+ client->seek = seek;
// printf("[TQFTP] new reader added\n");
@@ -317,7 +333,8 @@ static void handle_rrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
tsize ? (size_t*)&tsize : NULL,
wsize ? &wsize : NULL,
&client->timeoutms,
- rsize ? &rsize: NULL);
+ rsize ? &rsize : NULL,
+ seek ? &seek : NULL);
} else {
tftp_send_data(client, 1, 0);
}
@@ -334,6 +351,7 @@ static void handle_wrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
unsigned int timeoutms = 1000;
size_t rsize = 0;
size_t wsize = 0;
+ off_t seek = 0;
bool do_oack = false;
int sock;
int ret;
@@ -354,7 +372,7 @@ static void handle_wrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
if (p < buf + len) {
do_oack = true;
parse_options(p, len - (p - buf), &blksize, &tsize, &wsize,
- &timeoutms, &rsize);
+ &timeoutms, &rsize, &seek);
}
fd = translate_open(filename, O_WRONLY | O_CREAT);
@@ -386,6 +404,7 @@ static void handle_wrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
client->rsize = rsize;
client->wsize = wsize;
client->timeoutms = timeoutms;
+ client->seek = seek;
// printf("[TQFTP] new writer added\n");
@@ -396,7 +415,8 @@ static void handle_wrq(const char *buf, size_t len, struct sockaddr_qrtr *sq)
tsize ? (size_t*)&tsize : NULL,
wsize ? &wsize : NULL,
&client->timeoutms,
- rsize ? &rsize: NULL);
+ rsize ? &rsize : NULL,
+ seek ? &seek : NULL);
} else {
tftp_send_data(client, 1, 0);
}
--
2.44.0