summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-02-27 03:53:13 -0500
committerJune McEnroe <june@causal.agency>2020-02-27 03:55:09 -0500
commitc1c002aea9d1f3a4438a657de669de75bcbe50e9 (patch)
tree850fc51f5bc21071d483f3efc659d270241e1346
parentRename causal.agency/consumer tag causal.agency/pos (diff)
downloadpounce-c1c002aea9d1f3a4438a657de669de75bcbe50e9.tar.gz
pounce-c1c002aea9d1f3a4438a657de669de75bcbe50e9.zip
Set consumer pos with CAP REQ causal.agency/consumer=n
So the spec doesn't say I can use cap values in CAP REQ. But it also
doesn't explicitly say I can't.
-rw-r--r--bounce.h1
-rw-r--r--client.c7
-rw-r--r--ring.c5
3 files changed, 12 insertions, 1 deletions
diff --git a/bounce.h b/bounce.h
index d5f4170..f8ab0c0 100644
--- a/bounce.h
+++ b/bounce.h
@@ -144,6 +144,7 @@ extern bool verbose;
 void ringAlloc(size_t len);
 void ringProduce(const char *line);
 size_t ringConsumer(const char *name);
+void ringSet(size_t consumer, size_t pos);
 size_t ringPos(size_t consumer);
 size_t ringDiff(size_t consumer);
 const char *ringPeek(struct timeval *time, size_t consumer);
diff --git a/client.c b/client.c
index a335b99..66d07d0 100644
--- a/client.c
+++ b/client.c
@@ -47,6 +47,7 @@ struct Client {
 	struct tls *tls;
 	enum Need need;
 	size_t consumer;
+	size_t setPos;
 	enum Cap caps;
 	char buf[MessageCap];
 	size_t len;
@@ -118,6 +119,7 @@ static void maybeSync(struct Client *client) {
 	if (client->need == NeedPass) passRequired(client);
 	if (!client->need) {
 		stateSync(client);
+		if (client->setPos) ringSet(client->consumer, client->setPos);
 		if (!(client->caps & CapPassive) && !active++) {
 			serverFormat("AWAY\r\n");
 		}
@@ -193,9 +195,12 @@ static void handleCap(struct Client *client, struct Message *msg) {
 
 	} else if (!strcmp(msg->params[0], "REQ") && msg->params[1]) {
 		if (client->need) client->need |= NeedCapEnd;
-		enum Cap caps = capParse(msg->params[1], NULL);
+		enum Cap caps = capParse(msg->params[1], values);
 		if (caps == (avail & caps)) {
 			client->caps |= caps;
+			if (caps & CapConsumer && values[CapConsumerBit]) {
+				client->setPos = strtoull(values[CapConsumerBit], NULL, 10);
+			}
 			clientFormat(client, ":%s CAP * ACK :%s\r\n", ORIGIN, msg->params[1]);
 		} else {
 			clientFormat(client, ":%s CAP * NAK :%s\r\n", ORIGIN, msg->params[1]);
diff --git a/ring.c b/ring.c
index 90e6f2a..254c285 100644
--- a/ring.c
+++ b/ring.c
@@ -81,6 +81,11 @@ size_t ringConsumer(const char *name) {
 	return consumers.len++;
 }
 
+void ringSet(size_t consumer, size_t pos) {
+	assert(consumer < consumers.len);
+	if (pos <= producer) consumers.ptr[consumer].pos = pos;
+}
+
 size_t ringPos(size_t consumer) {
 	assert(consumer < consumers.len);
 	return consumers.ptr[consumer].pos;
/etc/mime.types when `plain` view is requested for a file with an extension for which there is no mapping registered in cgitrc. Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-07-25cgit.h: keep config flags sortedLars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-07-25cgitrc.5.txt: document 'embedded' and 'noheader'Lars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-07-25Add support for 'noheader' optionLars Hjemli This option can be used to disable the standard cgit page header, which might be useful in combination with the 'embedded' option. Suggested-by: Mark Constable <markc@renta.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-07-25cgitrc.5.txt: document 'head-include'Lars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-07-25ui-blob: return 'application/octet-stream' for binary blobsLars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-07-25ui-plain: Return 'application/octet-stream' for binary files.Remko Tronçon Signed-off-by: Remko Tronçon <git@el-tramo.be> Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-06-11use cgit_httpscheme() for atom feedDiego Ongaro 2009-06-11add cgit_httpscheme() -> http:// or https://Diego Ongaro 2009-06-07Return http statuscode 404 on unknown branchLars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-06-07Add head-include configuration option.Mark Lodato This patch adds an option to the configuration file, "head-include", which works just like "header" or "footer", except the content is put into the HTML's <head> tag. 2009-03-15CGIT 0.8.2.1Lars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-03-15Fix doc-related glitches in Makefile and .gitignoreLars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-03-15ui-snapshot: avoid segfault when no filename is specifiedLars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-03-15fix segfault when displaying empty blobsEric Wong When size is zero, subtracting one from it turns it into ULONG_MAX which causes an out-of-bounds access on buf. Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-02-19Add support for HEAD requestsLars Hjemli This is a quick 'n dirty hack which makes cgit honor HEAD requests. Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-02-19Add support for ETag in 'plain' viewLars Hjemli When downloading a blob identified by its path, the client might want to know if the blob has been modified since a previous download of the same path. To this end, an ETag containing the blob SHA1 seems to be ideal. Todo: add support for HEAD requests... Suggested-by: Owen Taylor <otaylor@redhat.com> Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-02-12ui-tree: escape ascii-text properly in hexdump viewLars Hjemli Signed-off-by: Lars Hjemli <hjemli@gmail.com> 2009-02-12Makefile: add doc-related targetsLars Hjemli