* [PATCH 1/3] snapshots: Don't allow sneaked in snapshots requests
@ 2012-06-21 7:09 cgit
2012-06-21 7:09 ` [PATCH 2/3] cache: use sendfile() instead of a pair of read() + write() cgit
2012-06-21 7:09 ` [PATCH 3/3] summary: Add tag head line in the dowload section cgit
0 siblings, 2 replies; 5+ messages in thread
From: cgit @ 2012-06-21 7:09 UTC (permalink / raw)
From: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
If the snapshots are not enabled then the frontend won't show a link to it.
The skilled user however may construct the URL on his own and the frontend
will obey the request.
This patch adds a check for this case so the requst won't be served.
Signed-off-by: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
---
ui-snapshot.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 07cc944..5034c19 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -168,6 +168,12 @@ void cgit_print_snapshot(const char *head, const char *hex,
return;
}
+ if (!(f->bit & snapshots)) {
+ show_error(xstrdup(fmt("Snapshot format %s is not enabled.",
+ f->suffix)));
+ return;
+ }
+
if (!hex && dwim) {
hex = get_ref_from_filename(ctx.repo->url, filename, f);
if (hex == NULL) {
--
1.7.2.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/3] cache: use sendfile() instead of a pair of read() + write()
2012-06-21 7:09 [PATCH 1/3] snapshots: Don't allow sneaked in snapshots requests cgit
@ 2012-06-21 7:09 ` cgit
2012-06-23 10:27 ` mathstuf
2012-06-21 7:09 ` [PATCH 3/3] summary: Add tag head line in the dowload section cgit
1 sibling, 1 reply; 5+ messages in thread
From: cgit @ 2012-06-21 7:09 UTC (permalink / raw)
From: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
sendfile() does the same job and avoids to copy the content into userland
and back. One has to define NO_SENDFILE in case the OS (kernel / libc)
does not supported. It is disabled by default on non-linux environemnts.
According to the glibc, sendfile64() was added in Linux 2.4 (so it has
been there for a while) but after browsing over the mapage of FreeBSD's I
noticed that the prototype is little different.
Signed-off-by: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
---
Makefile | 10 ++++++++++
cache.c | 26 +++++++++++++++++++++++++-
2 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/Makefile b/Makefile
index eac24ad..5cc84f4 100644
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,9 @@ DOC_PDF = $(patsubst %.txt,%.pdf,$(MAN_TXT))
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
# some C compilers supported these specifiers prior to C99 as an extension.
#
+# Define NO_SENDFILE to avoid using the sendfile() offered by libc. Use this
+# if your OS does not provide support for sendfile()
+#
#-include config.mak
@@ -49,6 +52,10 @@ ifeq ($(uname_O),Cygwin)
NEEDS_LIBICONV = YesPlease
endif
+ifneq ($(uname_S),Linux)
+ NO_SENDFILE = YesPlease
+endif
+
#
# Let the user override the above settings.
#
@@ -157,6 +164,9 @@ ifdef NO_OPENSSL
else
EXTLIBS += -lcrypto
endif
+ifdef NO_SENDFILE
+ CFLAGS += -DNO_SENDFILE
+endif
cgit: $(OBJECTS) libgit
$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
diff --git a/cache.c b/cache.c
index d7a8d5a..19bbc11 100644
--- a/cache.c
+++ b/cache.c
@@ -13,6 +13,9 @@
*
*/
+#ifndef NO_SENDFILE
+#include <sys/sendfile.h>
+#endif
#include "cgit.h"
#include "cache.h"
@@ -30,7 +33,6 @@ struct cache_slot {
const char *lock_name;
int match;
struct stat cache_st;
- struct stat lock_st;
int bufsize;
char buf[CACHE_BUFSIZE];
};
@@ -81,6 +83,7 @@ static int close_slot(struct cache_slot *slot)
/* Print the content of the active cache slot (but skip the key). */
static int print_slot(struct cache_slot *slot)
{
+#ifdef NO_SENDFILE
ssize_t i, j;
i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
@@ -97,6 +100,23 @@ static int print_slot(struct cache_slot *slot)
return errno;
else
return 0;
+#else
+ off_t start_off;
+ int ret;
+
+ start_off = slot->keylen + 1;
+
+ do {
+ ret = sendfile(STDOUT_FILENO, slot->cache_fd, &start_off,
+ slot->cache_st.st_size - start_off);
+ if (ret < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+ return errno;
+ }
+ return 0;
+ } while (1);
+#endif
}
/* Check if the slot has expired */
@@ -188,6 +208,10 @@ static int fill_slot(struct cache_slot *slot)
/* Generate cache content */
slot->fn(slot->cbdata);
+ /* update stat info */
+ if (fstat(slot->lock_fd, &slot->cache_st))
+ return errno;
+
/* Restore stdout */
if (dup2(tmp, STDOUT_FILENO) == -1)
return errno;
--
1.7.2.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3/3] summary: Add tag head line in the dowload section
2012-06-21 7:09 [PATCH 1/3] snapshots: Don't allow sneaked in snapshots requests cgit
2012-06-21 7:09 ` [PATCH 2/3] cache: use sendfile() instead of a pair of read() + write() cgit
@ 2012-06-21 7:09 ` cgit
1 sibling, 0 replies; 5+ messages in thread
From: cgit @ 2012-06-21 7:09 UTC (permalink / raw)
From: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
If the downloads are disabled one gets only ugly "commit sha1". With
downloads enabled you see the file name with different extensions a few
times.
This patches changes it a little. Instead of printing the hash number it
prints the first line of the tag i.e. the head line / commit subject if
available. With downloads enabled it prints additionally the extension
of the archive type (i.e. .tar, .tar.xz) next to it.
Signed-off-by: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
---
ui-refs.c | 7 ++++---
ui-tag.c | 34 ++++++++++++++++++++++++++++++++++
ui-tag.h | 1 +
3 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/ui-refs.c b/ui-refs.c
index caddfbc..9336703 100644
--- a/ui-refs.c
+++ b/ui-refs.c
@@ -9,6 +9,7 @@
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
+#include "ui-tag.h"
static int header;
@@ -119,7 +120,7 @@ static void print_tag_downloads(const struct cgit_repo *repo, const char *ref)
if (!(repo->snapshots & f->bit))
continue;
filename = fmt("%s%s", ref, f->suffix);
- cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename);
+ cgit_snapshot_link(f->suffix, NULL, NULL, NULL, NULL, filename);
html(" ");
}
}
@@ -137,10 +138,10 @@ static int print_tag(struct refinfo *ref)
html("<tr><td>");
cgit_tag_link(name, NULL, NULL, ctx.qry.head, name);
html("</td><td>");
+ cgit_print_tag_subject(name);
+ html(" ");
if (ctx.repo->snapshots && (tag->tagged->type == OBJ_COMMIT))
print_tag_downloads(ctx.repo, name);
- else
- cgit_object_link(tag->tagged);
html("</td><td>");
if (info->tagger)
html(info->tagger);
diff --git a/ui-tag.c b/ui-tag.c
index 39e4cb8..18c3361 100644
--- a/ui-tag.c
+++ b/ui-tag.c
@@ -38,6 +38,40 @@ void print_download_links(char *revname)
html("</td></tr>");
}
+void cgit_print_tag_subject(char *revname)
+{
+ unsigned char sha1[20];
+ struct object *obj;
+ struct taginfo *info;
+ struct tag *tag;
+ char *p;
+ size_t len;
+
+ if (get_sha1(fmt("refs/tags/%s", revname), sha1)) {
+ cgit_print_error(fmt("Bad tag reference: %s", revname));
+ return;
+ }
+ obj = parse_object(sha1);
+ if (!obj) {
+ cgit_print_error(fmt("Bad object id: %s", sha1_to_hex(sha1)));
+ return;
+ }
+
+ tag = lookup_tag(sha1);
+ if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) {
+ cgit_print_error(fmt("Bad tag object: %s", revname));
+ return;
+ }
+ p = strchr(info->msg, '\n');
+ if (p)
+ *p = '\0';
+ len = strlen(info->msg);
+ if (len > 74)
+ info->msg[74] = '\0';
+
+ html_txt(info->msg);
+}
+
void cgit_print_tag(char *revname)
{
unsigned char sha1[20];
diff --git a/ui-tag.h b/ui-tag.h
index d295cdc..352e0fd 100644
--- a/ui-tag.h
+++ b/ui-tag.h
@@ -2,5 +2,6 @@
#define UI_TAG_H
extern void cgit_print_tag(char *revname);
+void cgit_print_tag_subject(char *revname);
#endif /* UI_TAG_H */
--
1.7.2.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/3] cache: use sendfile() instead of a pair of read() + write()
2012-06-21 7:09 ` [PATCH 2/3] cache: use sendfile() instead of a pair of read() + write() cgit
@ 2012-06-23 10:27 ` mathstuf
2012-06-23 19:25 ` [PATCH 2/3 v2] " cgit
0 siblings, 1 reply; 5+ messages in thread
From: mathstuf @ 2012-06-23 10:27 UTC (permalink / raw)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
On Thu, Jun 21, 2012 at 07:09:47 GMT, cgit at ml.breakpoint.cc wrote:
> From: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
> +ifneq ($(uname_S),Linux)
> + NO_SENDFILE = YesPlease
> +endif
Double negatives suck. Can the option be made HAVE_SENDFILE?
- --Ben
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
iQIcBAEBCgAGBQJP5HsGAAoJEKaxavVX4C1XWsMQAM3rrvAmNE37u1OcfP9ovLZH
kXwOHxeWu+ikzKiZ/V8cnXU/kQCHpz0lqgD8MnSnvQlpEraTNw0Z315ZBb6776FY
XdV6RBitlXRMvQvPnL21fSEiHZrPsqLKD9VqG3Q9hYcDR2WZvtMIJubHRsnSD42a
KodYQc8zrjtUBuY5Vp9eQgH7ZF4f+yrMWGeB3E0oPF4UXL/6w7DNZB9XoZznfLvt
IvKUd+nV6z5PvvxNeq9wBAIlrQyhj5QGqWeHmQguAEtBOin/B/bgdx1vta5UYo2c
kKYloWclpyi8pzCfU8Zn90o3AivXSUu7RM+8F96r65q4a3rWxb5IGEXWQEjotmiN
A89AeYvFJJmsi//STxuXxNoSgDF796lIeo+y1CRmDaW1eOJdBdA9wQEMYH2vtY3h
rjDY8Pg21Ng8bowBv13J7d1Qz8R0mGT0AzmX3hyiN6cqgCu2g5MgNyr2y5WgkCBM
WhdV7v5b5xxrlhyIjtZbQM81m3D6s8g2rnb+gGR0IRGqXTTLFWUPiIx6QGPMsG2s
0VWGftwGql10YQ7qH53pCIyuXnqihyOmYVieA/C9KAnIL9l0dBmhvg5gqkHmCD/z
eubYXAm7sMzxqYZ/MS7WCMZiHPkQAz7CXMJT2Qku8j36pROuu9C9OXHNkUqxDb4v
/PC27P7JVkLcI5roLL89
=Jg5k
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/3 v2] cache: use sendfile() instead of a pair of read() + write()
2012-06-23 10:27 ` mathstuf
@ 2012-06-23 19:25 ` cgit
0 siblings, 0 replies; 5+ messages in thread
From: cgit @ 2012-06-23 19:25 UTC (permalink / raw)
From: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
sendfile() does the same job and avoids to copy the content into userland
and back. One has to define HAVE_LINUX_SENDFILE in case the OS (kernel & libc)
supports the Linux/glibc interface. It is disabled by default on non-linux
environments. According to the glibc, sendfile64() was added in Linux 2.4 (so
it has been there for a while) but after browsing over the mapage of FreeBSD's I
noticed that the prototype is little different.
Signed-off-by: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
---
On Sat, Jun 23, 2012 at 10:27:25AM +0000, Ben Boeckel wrote:
> On Thu, Jun 21, 2012 at 07:09:47 GMT, cgit at ml.breakpoint.cc wrote:
> > From: Sebastian Andrzej Siewior <sebastian at breakpoint.cc>
> > +ifneq ($(uname_S),Linux)
> > + NO_SENDFILE = YesPlease
> > +endif
>
> Double negatives suck. Can the option be made HAVE_SENDFILE?
Yes it does. What about this.
Makefile | 9 +++++++++
cache.c | 26 +++++++++++++++++++++++++-
2 files changed, 34 insertions(+), 1 deletions(-)
diff --git a/Makefile b/Makefile
index eac24ad..20cae98 100644
--- a/Makefile
+++ b/Makefile
@@ -33,6 +33,8 @@ DOC_PDF = $(patsubst %.txt,%.pdf,$(MAN_TXT))
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
# some C compilers supported these specifiers prior to C99 as an extension.
#
+# Define HAVE_LINUX_SENDFILE to use sendfile() as offered by glibc on Linux.
+#
#-include config.mak
@@ -49,6 +51,10 @@ ifeq ($(uname_O),Cygwin)
NEEDS_LIBICONV = YesPlease
endif
+ifeq ($(uname_S),Linux)
+ HAVE_LINUX_SENDFILE = YesPlease
+endif
+
#
# Let the user override the above settings.
#
@@ -157,6 +163,9 @@ ifdef NO_OPENSSL
else
EXTLIBS += -lcrypto
endif
+ifdef HAVE_LINUX_SENDFILE
+ CFLAGS += -DHAVE_LINUX_SENDFILE
+endif
cgit: $(OBJECTS) libgit
$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
diff --git a/cache.c b/cache.c
index d7a8d5a..963ec3a 100644
--- a/cache.c
+++ b/cache.c
@@ -13,6 +13,9 @@
*
*/
+#ifdef HAVE_LINUX_SENDFILE
+#include <sys/sendfile.h>
+#endif
#include "cgit.h"
#include "cache.h"
@@ -30,7 +33,6 @@ struct cache_slot {
const char *lock_name;
int match;
struct stat cache_st;
- struct stat lock_st;
int bufsize;
char buf[CACHE_BUFSIZE];
};
@@ -81,6 +83,23 @@ static int close_slot(struct cache_slot *slot)
/* Print the content of the active cache slot (but skip the key). */
static int print_slot(struct cache_slot *slot)
{
+#ifdef HAVE_LINUX_SENDFILE
+ off_t start_off;
+ int ret;
+
+ start_off = slot->keylen + 1;
+
+ do {
+ ret = sendfile(STDOUT_FILENO, slot->cache_fd, &start_off,
+ slot->cache_st.st_size - start_off);
+ if (ret < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+ return errno;
+ }
+ return 0;
+ } while (1);
+#else
ssize_t i, j;
i = lseek(slot->cache_fd, slot->keylen + 1, SEEK_SET);
@@ -97,6 +116,7 @@ static int print_slot(struct cache_slot *slot)
return errno;
else
return 0;
+#endif
}
/* Check if the slot has expired */
@@ -188,6 +208,10 @@ static int fill_slot(struct cache_slot *slot)
/* Generate cache content */
slot->fn(slot->cbdata);
+ /* update stat info */
+ if (fstat(slot->lock_fd, &slot->cache_st))
+ return errno;
+
/* Restore stdout */
if (dup2(tmp, STDOUT_FILENO) == -1)
return errno;
--
1.7.2.5
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-06-23 19:25 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-21 7:09 [PATCH 1/3] snapshots: Don't allow sneaked in snapshots requests cgit
2012-06-21 7:09 ` [PATCH 2/3] cache: use sendfile() instead of a pair of read() + write() cgit
2012-06-23 10:27 ` mathstuf
2012-06-23 19:25 ` [PATCH 2/3 v2] " cgit
2012-06-21 7:09 ` [PATCH 3/3] summary: Add tag head line in the dowload section cgit
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).