blob: c983fc7b86ed3c7792d4e325e4b88845719494d1 [file] [log] [blame]
Linus Torvalds35eb2d32005-10-23 14:30:45 -07001#include "cache.h"
2#include "quote.h"
Michal Ostrowski77cb17e2006-01-10 21:12:17 -05003#include "exec_cmd.h"
Linus Torvalds35eb2d32005-10-23 14:30:45 -07004
5static int do_generic_cmd(const char *me, char *arg)
6{
7 const char *my_argv[4];
8
Junio C Hamanoab5f8622005-11-25 20:57:02 -08009 if (!arg || !(arg = sq_dequote(arg)))
Linus Torvalds35eb2d32005-10-23 14:30:45 -070010 die("bad argument");
Junio C Hamanocc44c762007-02-20 01:53:29 -080011 if (prefixcmp(me, "git-"))
Michal Ostrowski77cb17e2006-01-10 21:12:17 -050012 die("bad command");
Linus Torvalds35eb2d32005-10-23 14:30:45 -070013
Michal Ostrowski77cb17e2006-01-10 21:12:17 -050014 my_argv[0] = me + 4;
Linus Torvalds35eb2d32005-10-23 14:30:45 -070015 my_argv[1] = arg;
16 my_argv[2] = NULL;
17
Junio C Hamano9201c702006-03-05 02:47:29 -080018 return execv_git_cmd(my_argv);
Linus Torvalds35eb2d32005-10-23 14:30:45 -070019}
20
21static struct commands {
22 const char *name;
23 int (*exec)(const char *me, char *arg);
24} cmd_list[] = {
25 { "git-receive-pack", do_generic_cmd },
26 { "git-upload-pack", do_generic_cmd },
27 { NULL },
28};
29
30int main(int argc, char **argv)
31{
32 char *prog;
33 struct commands *cmd;
34
35 /* We want to see "-c cmd args", and nothing else */
36 if (argc != 3 || strcmp(argv[1], "-c"))
37 die("What do you think I am? A shell?");
38
39 prog = argv[2];
40 argv += 2;
41 argc -= 2;
42 for (cmd = cmd_list ; cmd->name ; cmd++) {
43 int len = strlen(cmd->name);
44 char *arg;
45 if (strncmp(cmd->name, prog, len))
46 continue;
47 arg = NULL;
48 switch (prog[len]) {
49 case '\0':
50 arg = NULL;
51 break;
52 case ' ':
53 arg = prog + len + 1;
54 break;
55 default:
56 continue;
57 }
58 exit(cmd->exec(cmd->name, arg));
59 }
60 die("unrecognized command '%s'", prog);
61}