X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=ssh-push.c;h=a562df1b31d4d884877963f5a1b3ac849f73f30c;hb=7612a1efdb0c0806b43db10ce784707aae874340;hp=aac70af514e0dc5507fa4997ebad54352c973215;hpb=89ab859e9452cbc8f1f15afab52257e9b789c899;p=git.git diff --git a/ssh-push.c b/ssh-push.c index aac70af5..a562df1b 100644 --- a/ssh-push.c +++ b/ssh-push.c @@ -1,131 +1,4 @@ -#include "cache.h" -#include "rsh.h" -#include "refs.h" - -#include - -static unsigned char local_version = 1; -static unsigned char remote_version = 0; - -static int verbose = 0; - -static int serve_object(int fd_in, int fd_out) { - ssize_t size; - unsigned char sha1[20]; - signed char remote; - int posn = 0; - do { - size = read(fd_in, sha1 + posn, 20 - posn); - if (size < 0) { - perror("git-ssh-push: read "); - return -1; - } - if (!size) - return -1; - posn += size; - } while (posn < 20); - - if (verbose) - fprintf(stderr, "Serving %s\n", sha1_to_hex(sha1)); - - remote = 0; - - if (!has_sha1_file(sha1)) { - fprintf(stderr, "git-ssh-push: could not find %s\n", - sha1_to_hex(sha1)); - remote = -1; - } - - write(fd_out, &remote, 1); - - if (remote < 0) - return 0; - - return write_sha1_to_fd(fd_out, sha1); -} - -static int serve_version(int fd_in, int fd_out) -{ - if (read(fd_in, &remote_version, 1) < 1) - return -1; - write(fd_out, &local_version, 1); - return 0; -} - -static int serve_ref(int fd_in, int fd_out) -{ - char ref[PATH_MAX]; - unsigned char sha1[20]; - int posn = 0; - signed char remote = 0; - do { - if (read(fd_in, ref + posn, 1) < 1) - return -1; - posn++; - } while (ref[posn - 1]); - - if (verbose) - fprintf(stderr, "Serving %s\n", ref); - - if (get_ref_sha1(ref, sha1)) - remote = -1; - write(fd_out, &remote, 1); - if (remote) - return 0; - write(fd_out, sha1, 20); - return 0; -} - - -static void service(int fd_in, int fd_out) { - char type; - int retval; - do { - retval = read(fd_in, &type, 1); - if (retval < 1) { - if (retval < 0) - perror("git-ssh-push: read "); - return; - } - if (type == 'v' && serve_version(fd_in, fd_out)) - return; - if (type == 'o' && serve_object(fd_in, fd_out)) - return; - if (type == 'r' && serve_ref(fd_in, fd_out)) - return; - } while (1); -} - -static const char *ssh_push_usage = - "git-ssh-push [-c] [-t] [-a] [-w ref] commit-id url"; - -int main(int argc, char **argv) -{ - int arg = 1; - char *commit_id; - char *url; - int fd_in, fd_out; - const char *prog = getenv("GIT_SSH_PULL") ? : "git-ssh-pull"; - unsigned char sha1[20]; - char hex[41]; - - while (arg < argc && argv[arg][0] == '-') { - if (argv[arg][1] == 'w') - arg++; - arg++; - } - if (argc < arg + 2) - usage(ssh_push_usage); - commit_id = argv[arg]; - url = argv[arg + 1]; - if (get_sha1(commit_id, sha1)) - usage(ssh_push_usage); - memcpy(hex, sha1_to_hex(sha1), sizeof(hex)); - argv[arg] = hex; - - if (setup_connection(&fd_in, &fd_out, prog, url, arg, argv + 1)) - return 1; - - service(fd_in, fd_out); - return 0; -} +#define COUNTERPART_ENV_NAME "GIT_SSH_PULL" +#define COUNTERPART_PROGRAM_NAME "git-ssh-pull" +#define MY_PROGRAM_NAME "git-ssh-push" +#include "ssh-upload.c"