summaryrefslogtreecommitdiff
path: root/quote.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2005-10-23 14:30:45 -0700
committerJunio C Hamano <junkio@cox.net>2005-10-24 15:12:41 -0700
commit35eb2d36418a25f9e956b116a622d8d99f4abad9 (patch)
tree2ada0cb8fce070b6b2c56fa689791230636f1857 /quote.c
parent38cc7ab8144e111b47ac0ad3fcf6cb70d546e473 (diff)
downloadgit-35eb2d36418a25f9e956b116a622d8d99f4abad9.tar.gz
Add git-shell.
This adds a very git specific restricted shell, that can be added to /etc/shells and set to the pw_shell in the /etc/passwd file, to give users ability to push into repositories over ssh without giving them full interactive shell acount. [jc: I updated Linus' patch to match what the current sq_quote() does.] Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'quote.c')
-rw-r--r--quote.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/quote.c b/quote.c
index 009e69494b..e662a7da71 100644
--- a/quote.c
+++ b/quote.c
@@ -15,6 +15,11 @@
#undef EMIT
#define EMIT(x) ( (++len < n) && (*bp++ = (x)) )
+static inline int need_bs_quote(char c)
+{
+ return (c == '\'' || c == '!');
+}
+
size_t sq_quote_buf(char *dst, size_t n, const char *src)
{
char c;
@@ -23,7 +28,7 @@ size_t sq_quote_buf(char *dst, size_t n, const char *src)
EMIT('\'');
while ((c = *src++)) {
- if (c == '\'' || c == '!') {
+ if (need_bs_quote(c)) {
EMIT('\'');
EMIT('\\');
EMIT(c);
@@ -52,6 +57,40 @@ char *sq_quote(const char *src)
return buf;
}
+char *sq_dequote(char *arg)
+{
+ char *dst = arg;
+ char *src = arg;
+ char c;
+
+ if (*src != '\'')
+ return NULL;
+ for (;;) {
+ c = *++src;
+ if (!c)
+ return NULL;
+ if (c != '\'') {
+ *dst++ = c;
+ continue;
+ }
+ /* We stepped out of sq */
+ switch (*++src) {
+ case '\0':
+ *dst = 0;
+ return arg;
+ case '\\':
+ c = *++src;
+ if (need_bs_quote(c) && *++src == '\'') {
+ *dst++ = c;
+ continue;
+ }
+ /* Fallthrough */
+ default:
+ return NULL;
+ }
+ }
+}
+
/*
* C-style name quoting.
*