]> gitweb.ps.run Git - ps-cgit/blobdiff - ui-shared.c
git: update to v2.20.0
[ps-cgit] / ui-shared.c
index 739505a865cc7660621f28666474ec9c6d624718..7a4c7265962fb93ad5261849360f1ef2b541eeb0 100644 (file)
@@ -68,15 +68,48 @@ char *cgit_hosturl(void)
 char *cgit_currenturl(void)
 {
        const char *root = cgit_rooturl();
-       size_t len = strlen(root);
 
        if (!ctx.qry.url)
                return xstrdup(root);
-       if (len && root[len - 1] == '/')
+       if (root[0] && root[strlen(root) - 1] == '/')
                return fmtalloc("%s%s", root, ctx.qry.url);
        return fmtalloc("%s/%s", root, ctx.qry.url);
 }
 
+char *cgit_currentfullurl(void)
+{
+       const char *root = cgit_rooturl();
+       const char *orig_query = ctx.env.query_string ? ctx.env.query_string : "";
+       size_t len = strlen(orig_query);
+       char *query = xmalloc(len + 2), *start_url, *ret;
+
+       /* Remove all url=... parts from query string */
+       memcpy(query + 1, orig_query, len + 1);
+       query[0] = '?';
+       start_url = query;
+       while ((start_url = strstr(start_url, "url=")) != NULL) {
+               if (start_url[-1] == '?' || start_url[-1] == '&') {
+                       const char *end_url = strchr(start_url, '&');
+                       if (end_url)
+                               memmove(start_url, end_url + 1, strlen(end_url));
+                       else
+                               start_url[0] = '\0';
+               } else
+                       ++start_url;
+       }
+       if (!query[1])
+               query[0] = '\0';
+
+       if (!ctx.qry.url)
+               ret = fmtalloc("%s%s", root, query);
+       else if (root[0] && root[strlen(root) - 1] == '/')
+               ret = fmtalloc("%s%s%s", root, ctx.qry.url, query);
+       else
+               ret = fmtalloc("%s/%s%s", root, ctx.qry.url, query);
+       free(query);
+       return ret;
+}
+
 const char *cgit_rooturl(void)
 {
        if (ctx.cfg.virtual_root)
@@ -1159,7 +1192,7 @@ void cgit_print_snapshot_links(const struct cgit_repo *repo, const char *ref,
 
 void cgit_set_title_from_path(const char *path)
 {
-       size_t path_len, path_index, path_last_end;
+       size_t path_len, path_index, path_last_end, line_len;
        char *new_title;
 
        if (!path)
@@ -1176,14 +1209,18 @@ void cgit_set_title_from_path(const char *path)
                                continue;
                        }
                        strncat(new_title, &path[path_index + 1], path_last_end - path_index - 1);
-                       strcat(new_title, "\\");
+                       line_len = strlen(new_title);
+                       new_title[line_len++] = '\\';
+                       new_title[line_len] = '\0';
                        path_last_end = path_index;
                }
        }
        if (path_last_end)
                strncat(new_title, path, path_last_end);
 
-       strcat(new_title, " - ");
-       strcat(new_title, ctx.page.title);
+       line_len = strlen(new_title);
+       memcpy(&new_title[line_len], " - ", 3);
+       new_title[line_len + 3] = '\0';
+       strncat(new_title, ctx.page.title, sizeof(new_title) - strlen(new_title) - 1);
        ctx.page.title = new_title;
 }