Lars Hjemli | 7640d90 | 2006-12-10 22:41:14 +0100 | [diff] [blame] | 1 | /* html.c: helper functions for html output |
| 2 | * |
Lukas Fleischer | f7f26f8 | 2014-01-08 15:10:49 +0100 | [diff] [blame] | 3 | * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com> |
Lars Hjemli | 7640d90 | 2006-12-10 22:41:14 +0100 | [diff] [blame] | 4 | * |
| 5 | * Licensed under GNU General Public License v2 |
| 6 | * (see COPYING for full license text) |
| 7 | */ |
| 8 | |
Lukas Fleischer | 3edfd83 | 2013-04-06 13:30:54 +0200 | [diff] [blame] | 9 | #include "cgit.h" |
John Keeping | 8f20879 | 2013-04-06 11:37:59 +0100 | [diff] [blame] | 10 | #include "html.h" |
Lukas Fleischer | 927b0ae | 2016-09-29 08:38:45 +0200 | [diff] [blame] | 11 | #include "url.h" |
Lars Hjemli | b1f9b9c | 2008-02-23 22:45:33 +0100 | [diff] [blame] | 12 | |
Mark Lodato | a2c6355 | 2010-02-09 10:12:43 -0500 | [diff] [blame] | 13 | /* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */ |
| 14 | static const char* url_escape_table[256] = { |
John Keeping | 438bac6 | 2015-03-08 16:32:27 +0000 | [diff] [blame] | 15 | "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", |
| 16 | "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f", |
| 17 | "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", |
| 18 | "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f", |
| 19 | "%20", NULL, "%22", "%23", NULL, "%25", "%26", "%27", |
| 20 | NULL, NULL, NULL, "%2b", NULL, NULL, NULL, NULL, |
| 21 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 22 | NULL, NULL, NULL, NULL, "%3c", "%3d", "%3e", "%3f", |
| 23 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 24 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 25 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 26 | NULL, NULL, NULL, NULL, "%5c", NULL, "%5e", NULL, |
| 27 | "%60", NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 28 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 29 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
| 30 | NULL, NULL, NULL, "%7b", "%7c", "%7d", NULL, "%7f", |
| 31 | "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", |
| 32 | "%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f", |
| 33 | "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", |
| 34 | "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f", |
| 35 | "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7", |
| 36 | "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af", |
| 37 | "%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7", |
| 38 | "%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf", |
| 39 | "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7", |
| 40 | "%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf", |
| 41 | "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", |
| 42 | "%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df", |
| 43 | "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7", |
| 44 | "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef", |
| 45 | "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", |
| 46 | "%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff" |
Mark Lodato | a2c6355 | 2010-02-09 10:12:43 -0500 | [diff] [blame] | 47 | }; |
| 48 | |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 49 | char *fmt(const char *format, ...) |
| 50 | { |
| 51 | static char buf[8][1024]; |
| 52 | static int bufidx; |
| 53 | int len; |
| 54 | va_list args; |
| 55 | |
| 56 | bufidx++; |
| 57 | bufidx &= 7; |
| 58 | |
| 59 | va_start(args, format); |
| 60 | len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args); |
| 61 | va_end(args); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 62 | if (len > sizeof(buf[bufidx])) { |
Lars Hjemli | b1f9b9c | 2008-02-23 22:45:33 +0100 | [diff] [blame] | 63 | fprintf(stderr, "[html.c] string truncated: %s\n", format); |
| 64 | exit(1); |
| 65 | } |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 66 | return buf[bufidx]; |
| 67 | } |
| 68 | |
John Keeping | fd00d2f | 2013-04-07 14:40:50 +0100 | [diff] [blame] | 69 | char *fmtalloc(const char *format, ...) |
| 70 | { |
| 71 | struct strbuf sb = STRBUF_INIT; |
| 72 | va_list args; |
| 73 | |
| 74 | va_start(args, format); |
| 75 | strbuf_vaddf(&sb, format, args); |
| 76 | va_end(args); |
| 77 | |
| 78 | return strbuf_detach(&sb, NULL); |
| 79 | } |
| 80 | |
Lars Hjemli | e5da4bc | 2008-08-06 10:53:50 +0200 | [diff] [blame] | 81 | void html_raw(const char *data, size_t size) |
| 82 | { |
John Keeping | fd31aa6 | 2014-01-12 17:13:48 +0000 | [diff] [blame] | 83 | if (write(STDOUT_FILENO, data, size) != size) |
John Keeping | 1fec7cd | 2013-05-18 15:57:03 +0100 | [diff] [blame] | 84 | die_errno("write error on html output"); |
Lars Hjemli | e5da4bc | 2008-08-06 10:53:50 +0200 | [diff] [blame] | 85 | } |
| 86 | |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 87 | void html(const char *txt) |
| 88 | { |
Jason A. Donenfeld | 6d7e359 | 2013-03-20 20:44:20 +0100 | [diff] [blame] | 89 | html_raw(txt, strlen(txt)); |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | void htmlf(const char *format, ...) |
| 93 | { |
John Keeping | fd00d2f | 2013-04-07 14:40:50 +0100 | [diff] [blame] | 94 | va_list args; |
| 95 | struct strbuf buf = STRBUF_INIT; |
| 96 | |
| 97 | va_start(args, format); |
| 98 | strbuf_vaddf(&buf, format, args); |
| 99 | va_end(args); |
| 100 | html(buf.buf); |
| 101 | strbuf_release(&buf); |
| 102 | } |
| 103 | |
| 104 | void html_txtf(const char *format, ...) |
| 105 | { |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 106 | va_list args; |
| 107 | |
| 108 | va_start(args, format); |
John Keeping | fd00d2f | 2013-04-07 14:40:50 +0100 | [diff] [blame] | 109 | html_vtxtf(format, args); |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 110 | va_end(args); |
John Keeping | fd00d2f | 2013-04-07 14:40:50 +0100 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | void html_vtxtf(const char *format, va_list ap) |
| 114 | { |
| 115 | va_list cp; |
| 116 | struct strbuf buf = STRBUF_INIT; |
| 117 | |
| 118 | va_copy(cp, ap); |
| 119 | strbuf_vaddf(&buf, format, cp); |
| 120 | va_end(cp); |
| 121 | html_txt(buf.buf); |
| 122 | strbuf_release(&buf); |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 123 | } |
| 124 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 125 | void html_txt(const char *txt) |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 126 | { |
Jeff Smith | 7078725 | 2017-10-01 23:39:05 -0500 | [diff] [blame] | 127 | if (txt) |
| 128 | html_ntxt(txt, strlen(txt)); |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 129 | } |
| 130 | |
Jeff Smith | 7078725 | 2017-10-01 23:39:05 -0500 | [diff] [blame] | 131 | ssize_t html_ntxt(const char *txt, size_t len) |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 132 | { |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 133 | const char *t = txt; |
Jeff Smith | 7078725 | 2017-10-01 23:39:05 -0500 | [diff] [blame] | 134 | ssize_t slen; |
| 135 | |
| 136 | if (len > SSIZE_MAX) |
| 137 | return -1; |
| 138 | |
| 139 | slen = (ssize_t) len; |
| 140 | while (t && *t && slen--) { |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 141 | int c = *t; |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 142 | if (c == '<' || c == '>' || c == '&') { |
Mark Lodato | d187b98 | 2010-09-04 14:18:16 -0400 | [diff] [blame] | 143 | html_raw(txt, t - txt); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 144 | if (c == '>') |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 145 | html(">"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 146 | else if (c == '<') |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 147 | html("<"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 148 | else if (c == '&') |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 149 | html("&"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 150 | txt = t + 1; |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 151 | } |
| 152 | t++; |
| 153 | } |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 154 | if (t != txt) |
Mark Lodato | d187b98 | 2010-09-04 14:18:16 -0400 | [diff] [blame] | 155 | html_raw(txt, t - txt); |
Jeff Smith | 7078725 | 2017-10-01 23:39:05 -0500 | [diff] [blame] | 156 | return slen; |
Lars Hjemli | 9d8d9b6 | 2006-12-22 00:58:18 +0100 | [diff] [blame] | 157 | } |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 158 | |
John Keeping | fd00d2f | 2013-04-07 14:40:50 +0100 | [diff] [blame] | 159 | void html_attrf(const char *fmt, ...) |
| 160 | { |
| 161 | va_list ap; |
| 162 | struct strbuf sb = STRBUF_INIT; |
| 163 | |
| 164 | va_start(ap, fmt); |
| 165 | strbuf_vaddf(&sb, fmt, ap); |
| 166 | va_end(ap); |
| 167 | |
| 168 | html_attr(sb.buf); |
| 169 | strbuf_release(&sb); |
| 170 | } |
| 171 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 172 | void html_attr(const char *txt) |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 173 | { |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 174 | const char *t = txt; |
Jason A. Donenfeld | bdae1d8 | 2013-03-03 23:21:33 -0500 | [diff] [blame] | 175 | while (t && *t) { |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 176 | int c = *t; |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 177 | if (c == '<' || c == '>' || c == '\'' || c == '\"' || c == '&') { |
Mark Lodato | d187b98 | 2010-09-04 14:18:16 -0400 | [diff] [blame] | 178 | html_raw(txt, t - txt); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 179 | if (c == '>') |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 180 | html(">"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 181 | else if (c == '<') |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 182 | html("<"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 183 | else if (c == '\'') |
Lars Hjemli | 7efcef0 | 2009-01-29 22:21:15 +0100 | [diff] [blame] | 184 | html("'"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 185 | else if (c == '"') |
Lars Hjemli | 7efcef0 | 2009-01-29 22:21:15 +0100 | [diff] [blame] | 186 | html("""); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 187 | else if (c == '&') |
Lukas Fleischer | 6938232 | 2011-05-24 20:38:40 +0200 | [diff] [blame] | 188 | html("&"); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 189 | txt = t + 1; |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 190 | } |
| 191 | t++; |
| 192 | } |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 193 | if (t != txt) |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 194 | html(txt); |
| 195 | } |
| 196 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 197 | void html_url_path(const char *txt) |
Lars Hjemli | 22a597e | 2008-10-05 16:52:57 +0200 | [diff] [blame] | 198 | { |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 199 | const char *t = txt; |
Jason A. Donenfeld | bdae1d8 | 2013-03-03 23:21:33 -0500 | [diff] [blame] | 200 | while (t && *t) { |
Eric Wong | 9cae75d | 2011-07-21 03:24:54 +0000 | [diff] [blame] | 201 | unsigned char c = *t; |
Mark Lodato | a2c6355 | 2010-02-09 10:12:43 -0500 | [diff] [blame] | 202 | const char *e = url_escape_table[c]; |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 203 | if (e && c != '+' && c != '&') { |
Mark Lodato | d187b98 | 2010-09-04 14:18:16 -0400 | [diff] [blame] | 204 | html_raw(txt, t - txt); |
Jonathon Mah | 7415274 | 2011-04-10 04:10:03 -0700 | [diff] [blame] | 205 | html(e); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 206 | txt = t + 1; |
Lars Hjemli | 22a597e | 2008-10-05 16:52:57 +0200 | [diff] [blame] | 207 | } |
| 208 | t++; |
| 209 | } |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 210 | if (t != txt) |
Lars Hjemli | 22a597e | 2008-10-05 16:52:57 +0200 | [diff] [blame] | 211 | html(txt); |
| 212 | } |
| 213 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 214 | void html_url_arg(const char *txt) |
Lars Hjemli | a36a0d9 | 2008-10-05 12:49:46 +0200 | [diff] [blame] | 215 | { |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 216 | const char *t = txt; |
Jason A. Donenfeld | bdae1d8 | 2013-03-03 23:21:33 -0500 | [diff] [blame] | 217 | while (t && *t) { |
Eric Wong | 9cae75d | 2011-07-21 03:24:54 +0000 | [diff] [blame] | 218 | unsigned char c = *t; |
Mark Lodato | a2c6355 | 2010-02-09 10:12:43 -0500 | [diff] [blame] | 219 | const char *e = url_escape_table[c]; |
Jonathon Mah | 7415274 | 2011-04-10 04:10:03 -0700 | [diff] [blame] | 220 | if (c == ' ') |
| 221 | e = "+"; |
Mark Lodato | a2c6355 | 2010-02-09 10:12:43 -0500 | [diff] [blame] | 222 | if (e) { |
Mark Lodato | d187b98 | 2010-09-04 14:18:16 -0400 | [diff] [blame] | 223 | html_raw(txt, t - txt); |
Jonathon Mah | 7415274 | 2011-04-10 04:10:03 -0700 | [diff] [blame] | 224 | html(e); |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 225 | txt = t + 1; |
Lars Hjemli | a36a0d9 | 2008-10-05 12:49:46 +0200 | [diff] [blame] | 226 | } |
| 227 | t++; |
| 228 | } |
Lukas Fleischer | 53bc747 | 2013-03-03 16:04:29 +0100 | [diff] [blame] | 229 | if (t != txt) |
Lars Hjemli | a36a0d9 | 2008-10-05 12:49:46 +0200 | [diff] [blame] | 230 | html(txt); |
| 231 | } |
| 232 | |
Jason A. Donenfeld | 513b386 | 2016-01-14 14:28:37 +0100 | [diff] [blame] | 233 | void html_header_arg_in_quotes(const char *txt) |
| 234 | { |
| 235 | const char *t = txt; |
| 236 | while (t && *t) { |
| 237 | unsigned char c = *t; |
| 238 | const char *e = NULL; |
| 239 | if (c == '\\') |
| 240 | e = "\\\\"; |
| 241 | else if (c == '\r') |
| 242 | e = "\\r"; |
| 243 | else if (c == '\n') |
| 244 | e = "\\n"; |
| 245 | else if (c == '"') |
| 246 | e = "\\\""; |
| 247 | if (e) { |
| 248 | html_raw(txt, t - txt); |
| 249 | html(e); |
| 250 | txt = t + 1; |
| 251 | } |
| 252 | t++; |
| 253 | } |
| 254 | if (t != txt) |
| 255 | html(txt); |
| 256 | |
| 257 | } |
| 258 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 259 | void html_hidden(const char *name, const char *value) |
Lars Hjemli | e39d738 | 2006-12-28 02:01:49 +0100 | [diff] [blame] | 260 | { |
| 261 | html("<input type='hidden' name='"); |
| 262 | html_attr(name); |
| 263 | html("' value='"); |
| 264 | html_attr(value); |
| 265 | html("'/>"); |
| 266 | } |
| 267 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 268 | void html_option(const char *value, const char *text, const char *selected_value) |
Lars Hjemli | 6ec5f36 | 2007-10-28 12:08:45 +0100 | [diff] [blame] | 269 | { |
| 270 | html("<option value='"); |
| 271 | html_attr(value); |
| 272 | html("'"); |
| 273 | if (selected_value && !strcmp(selected_value, value)) |
Lars Hjemli | 2915483 | 2007-11-11 13:04:28 +0100 | [diff] [blame] | 274 | html(" selected='selected'"); |
Lars Hjemli | 6ec5f36 | 2007-10-28 12:08:45 +0100 | [diff] [blame] | 275 | html(">"); |
| 276 | html_txt(text); |
| 277 | html("</option>\n"); |
| 278 | } |
| 279 | |
Lars Hjemli | 1a64fd2 | 2011-03-06 23:57:26 +0100 | [diff] [blame] | 280 | void html_intoption(int value, const char *text, int selected_value) |
| 281 | { |
| 282 | htmlf("<option value='%d'%s>", value, |
| 283 | value == selected_value ? " selected='selected'" : ""); |
| 284 | html_txt(text); |
| 285 | html("</option>"); |
| 286 | } |
| 287 | |
Mark Lodato | 8aab27f | 2010-02-08 23:04:41 -0500 | [diff] [blame] | 288 | void html_link_open(const char *url, const char *title, const char *class) |
Lars Hjemli | 0d169ad | 2006-12-09 15:18:17 +0100 | [diff] [blame] | 289 | { |
| 290 | html("<a href='"); |
| 291 | html_attr(url); |
| 292 | if (title) { |
| 293 | html("' title='"); |
| 294 | html_attr(title); |
| 295 | } |
| 296 | if (class) { |
| 297 | html("' class='"); |
| 298 | html_attr(class); |
| 299 | } |
| 300 | html("'>"); |
| 301 | } |
| 302 | |
| 303 | void html_link_close(void) |
| 304 | { |
| 305 | html("</a>"); |
| 306 | } |
Lars Hjemli | 6cb326c | 2006-12-17 23:07:28 +0100 | [diff] [blame] | 307 | |
| 308 | void html_fileperm(unsigned short mode) |
| 309 | { |
Lars Hjemli | b1f9b9c | 2008-02-23 22:45:33 +0100 | [diff] [blame] | 310 | htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), |
Lars Hjemli | 6cb326c | 2006-12-17 23:07:28 +0100 | [diff] [blame] | 311 | (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-')); |
| 312 | } |
| 313 | |
Lars Hjemli | 5e75128 | 2007-05-18 23:56:10 +0200 | [diff] [blame] | 314 | int html_include(const char *filename) |
| 315 | { |
| 316 | FILE *f; |
| 317 | char buf[4096]; |
| 318 | size_t len; |
| 319 | |
Harley Laue | 112b208 | 2008-04-29 17:59:53 +0200 | [diff] [blame] | 320 | if (!(f = fopen(filename, "r"))) { |
| 321 | fprintf(stderr, "[cgit] Failed to include file %s: %s (%d).\n", |
| 322 | filename, strerror(errno), errno); |
Lars Hjemli | 5e75128 | 2007-05-18 23:56:10 +0200 | [diff] [blame] | 323 | return -1; |
Harley Laue | 112b208 | 2008-04-29 17:59:53 +0200 | [diff] [blame] | 324 | } |
Jason A. Donenfeld | bdae1d8 | 2013-03-03 23:21:33 -0500 | [diff] [blame] | 325 | while ((len = fread(buf, 1, 4096, f)) > 0) |
Mark Lodato | d187b98 | 2010-09-04 14:18:16 -0400 | [diff] [blame] | 326 | html_raw(buf, len); |
Lars Hjemli | 5e75128 | 2007-05-18 23:56:10 +0200 | [diff] [blame] | 327 | fclose(f); |
| 328 | return 0; |
| 329 | } |
Lars Hjemli | e87e896 | 2008-04-08 21:11:36 +0200 | [diff] [blame] | 330 | |
Lukas Fleischer | 927b0ae | 2016-09-29 08:38:45 +0200 | [diff] [blame] | 331 | void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value)) |
Lars Hjemli | e87e896 | 2008-04-08 21:11:36 +0200 | [diff] [blame] | 332 | { |
Lukas Fleischer | 927b0ae | 2016-09-29 08:38:45 +0200 | [diff] [blame] | 333 | const char *t = txt; |
Lars Hjemli | e87e896 | 2008-04-08 21:11:36 +0200 | [diff] [blame] | 334 | |
Lukas Fleischer | 927b0ae | 2016-09-29 08:38:45 +0200 | [diff] [blame] | 335 | while (t && *t) { |
| 336 | char *name = url_decode_parameter_name(&t); |
| 337 | if (*name) { |
| 338 | char *value = url_decode_parameter_value(&t); |
| 339 | fn(name, value); |
| 340 | free(value); |
Lars Hjemli | e87e896 | 2008-04-08 21:11:36 +0200 | [diff] [blame] | 341 | } |
Lukas Fleischer | 927b0ae | 2016-09-29 08:38:45 +0200 | [diff] [blame] | 342 | free(name); |
Lars Hjemli | e87e896 | 2008-04-08 21:11:36 +0200 | [diff] [blame] | 343 | } |
Lars Hjemli | e87e896 | 2008-04-08 21:11:36 +0200 | [diff] [blame] | 344 | } |