URI: 
       tBe fully C99 portable. - git-restrict - simple utility for git repo permission management
  HTML git clone https://git.parazyd.org/git-restrict
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 8afd2755b983911dbed4b06f1cd86eea4f14c42b
   DIR parent d7a8d9d61816d229b7d1fe9214c01f8b8794204b
  HTML Author: parazyd <parazyd@dyne.org>
       Date:   Sun, 22 May 2022 14:12:04 +0200
       
       Be fully C99 portable.
       
       Diffstat:
         M Makefile                            |       5 ++---
         M README.md                           |       4 ++--
         M git-restrict.c                      |      24 ++++++++++++++----------
       
       3 files changed, 18 insertions(+), 15 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -5,8 +5,7 @@ PREFIX = /usr/local
        MANPREFIX = ${PREFIX}/share/man
        
        # Use system flags
       -GR_CFLAGS = $(CFLAGS) -Wall -Werror -pedantic -std=c99
       -GR_CPPFLAGS = $(CPPFLAGS) -D_GNU_SOURCE
       +GR_CFLAGS = $(CFLAGS) -Wall -Wextra -Werror -pedantic -std=c99
        GR_LDFLAGS = $(LDFLAGS) -static -s
        
        BIN = git-restrict
       t@@ -16,7 +15,7 @@ OBJ = $(BIN:=.o)
        all: $(BIN)
        
        .c.o:
       -        $(CC) -c $(GR_CFLAGS) $(GR_CPPFLAGS) $<
       +        $(CC) -c $(GR_CFLAGS) $<
        
        $(BIN): $(OBJ)
                $(CC) $(OBJ) $(GR_LDFLAGS) -o $@
   DIR diff --git a/README.md b/README.md
       t@@ -10,8 +10,8 @@ file.
        If used, it will only allow `git-upload-pack` and `git-receive-pack` as
        the commands allowed to be ran by a specific user/SSH key.
        
       -git-restrict is also compiled as a static binary so it's easy to use it
       -in chroot environments. This is obviously intentional.
       +git-restrict is C99 portable and compiled as a static binary so it's
       +easy to use it in chroot environments. This is obviously intentional.
        
        
        Basic usage
   DIR diff --git a/git-restrict.c b/git-restrict.c
       t@@ -1,4 +1,4 @@
       -/* Copyright (c) 2021 Ivan J. <parazyd@dyne.org>
       +/* Copyright (c) 2021-2022 Ivan J. <parazyd@dyne.org>
         *
         * This file is part of git-restrict
         *
       t@@ -14,7 +14,6 @@
         * You should have received a copy of the GNU Affero General Public License
         * along with this program. If not, see <https://www.gnu.org/licenses/>.
         */
       -#include <limits.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
       t@@ -26,10 +25,18 @@ static void die(const char *msg)
                exit(1);
        }
        
       +static char *strdup(const char *s)
       +{
       +        size_t l = strlen(s);
       +        char *d = malloc(l+1);
       +        if (!d) return NULL;
       +        return memcpy(d, s, l+1);
       +}
       +
        int main(int argc, char *argv[])
        {
                char *orig_cmd, *cmd, *repo, *buf;
       -        char git_cmd[PATH_MAX];
       +        char git_cmd[4096];
                int i, authorized = 0;
        
                if (argc < 2)
       t@@ -38,10 +45,9 @@ int main(int argc, char *argv[])
                if ((orig_cmd = getenv("SSH_ORIGINAL_COMMAND")) == NULL)
                        die("fatal: No $SSH_ORIGINAL_COMMAND in env.");
        
       -        repo = strdup(orig_cmd);
       -
       -        if ((cmd = strsep(&repo, " ")) == NULL)
       -                die("fatal: Invalid command.");
       +        if ((repo = strdup(orig_cmd)) == NULL) die("fatal: Internal error.");
       +        if ((cmd = strtok(repo, " ")) == NULL) die("fatal: Invalid command.");
       +        repo = strtok(NULL, " ");
        
                if (strcmp("git-upload-pack", cmd) && strcmp("git-receive-pack", cmd))
                        die("fatal: Unauthorized command.");
       t@@ -51,9 +57,7 @@ int main(int argc, char *argv[])
                        die("fatal: Invalid repository name.");
        
                /* Remove ' and / prefix and ' suffix */
       -        repo++;
       -        if (repo[0] == '/') repo++;
       -        repo[strlen(repo) - 1] = 0;
       +        repo++; if (repo[0] == '/') repo++; repo[strlen(repo) - 1] = 0;
        
                for (i = 1; i < argc; i++) {
                        /* This is so both "foo" and "foo.git" are supported */