--- /dev/null
+From 49d6cfa5c2874d78360dc4b16558bb45b5f8e003 Mon Sep 17 00:00:00 2001
+From: Jeff King <peff@peff.net>
+Date: Mon, 26 Aug 2013 17:57:18 -0400
+Subject: [PATCH] config: do not use C function names as struct members
+
+According to C99, section 7.1.4:
+
+ Any function declared in a header may be additionally
+ implemented as a function-like macro defined in the
+ header.
+
+Therefore calling our struct member function pointer "fgetc"
+may run afoul of unwanted macro expansion when we call:
+
+ char c = cf->fgetc(cf);
+
+This turned out to be a problem on uclibc, which defines
+fgetc as a macro and causes compilation failure.
+
+The standard suggests fixing this in a few ways:
+
+ 1. Using extra parentheses to inhibit the function-like
+ macro expansion. E.g., "(cf->fgetc)(cf)". This is
+ undesirable as it's ugly, and each call site needs to
+ remember to use it (and on systems without the macro,
+ forgetting will compile just fine).
+
+ 2. Using #undef (because a conforming implementation must
+ also be providing fgetc as a function). This is
+ undesirable because presumably the implementation was
+ using the macro for a performance benefit, and we are
+ dropping that optimization.
+
+Instead, we can simply use non-colliding names.
+
+Signed-off-by: Jeff King <peff@peff.net>
+Signed-off-by: Junio C Hamano <gitster@pobox.com>
+---
+ config.c | 32 ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+diff --git a/config.c b/config.c
+index 680dd6d..95f9a44 100644
+--- a/config.c
++++ b/config.c
+@@ -27,9 +27,9 @@ struct config_source {
+ struct strbuf value;
+ struct strbuf var;
+
+- int (*fgetc)(struct config_source *c);
+- int (*ungetc)(int c, struct config_source *conf);
+- long (*ftell)(struct config_source *c);
++ int (*do_fgetc)(struct config_source *c);
++ int (*do_ungetc)(int c, struct config_source *conf);
++ long (*do_ftell)(struct config_source *c);
+ };
+
+ static struct config_source *cf;
+@@ -217,13 +217,13 @@ int git_config_from_parameters(config_fn_t fn, void *data)
+
+ static int get_next_char(void)
+ {
+- int c = cf->fgetc(cf);
++ int c = cf->do_fgetc(cf);
+
+ if (c == '\r') {
+ /* DOS like systems */
+- c = cf->fgetc(cf);
++ c = cf->do_fgetc(cf);
+ if (c != '\n') {
+- cf->ungetc(c, cf);
++ cf->do_ungetc(c, cf);
+ c = '\r';
+ }
+ }
+@@ -982,9 +982,9 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
+ top.u.file = f;
+ top.name = filename;
+ top.die_on_error = 1;
+- top.fgetc = config_file_fgetc;
+- top.ungetc = config_file_ungetc;
+- top.ftell = config_file_ftell;
++ top.do_fgetc = config_file_fgetc;
++ top.do_ungetc = config_file_ungetc;
++ top.do_ftell = config_file_ftell;
+
+ ret = do_config_from(&top, fn, data);
+
+@@ -1003,9 +1003,9 @@ int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
+ top.u.buf.pos = 0;
+ top.name = name;
+ top.die_on_error = 0;
+- top.fgetc = config_buf_fgetc;
+- top.ungetc = config_buf_ungetc;
+- top.ftell = config_buf_ftell;
++ top.do_fgetc = config_buf_fgetc;
++ top.do_ungetc = config_buf_ungetc;
++ top.do_ftell = config_buf_ftell;
+
+ return do_config_from(&top, fn, data);
+ }
+@@ -1186,7 +1186,7 @@ static int store_aux(const char *key, const char *value, void *cb)
+ return 1;
+ }
+
+- store.offset[store.seen] = cf->ftell(cf);
++ store.offset[store.seen] = cf->do_ftell(cf);
+ store.seen++;
+ }
+ break;
+@@ -1213,19 +1213,19 @@ static int store_aux(const char *key, const char *value, void *cb)
+ * Do not increment matches: this is no match, but we
+ * just made sure we are in the desired section.
+ */
+- store.offset[store.seen] = cf->ftell(cf);
++ store.offset[store.seen] = cf->do_ftell(cf);
+ /* fallthru */
+ case SECTION_END_SEEN:
+ case START:
+ if (matches(key, value)) {
+- store.offset[store.seen] = cf->ftell(cf);
++ store.offset[store.seen] = cf->do_ftell(cf);
+ store.state = KEY_SEEN;
+ store.seen++;
+ } else {
+ if (strrchr(key, '.') - key == store.baselen &&
+ !strncmp(key, store.key, store.baselen)) {
+ store.state = SECTION_SEEN;
+- store.offset[store.seen] = cf->ftell(cf);
++ store.offset[store.seen] = cf->do_ftell(cf);
+ }
+ }
+ }
+--
+1.8.3.2
+
--- a/Makefile
+++ b/Makefile
-@@ -536,16 +536,7 @@ EXTRA_PROGRAMS =
+@@ -540,16 +540,7 @@ EXTRA_PROGRAMS =
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
# Binary suffix, set to .exe for Windows builds
X =
-@@ -985,6 +976,12 @@ BUILTIN_OBJS += builtin/var.o
+@@ -996,6 +987,12 @@ BUILTIN_OBJS += builtin/var.o
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
BUILTIN_OBJS += builtin/write-tree.o
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
EXTLIBS =
-@@ -1148,7 +1145,7 @@ endif
+@@ -1159,7 +1156,7 @@ endif
EXTLIBS += -lz
ifndef NO_OPENSSL
ifdef OPENSSLDIR
BASIC_CFLAGS += -I$(OPENSSLDIR)/include
OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
-@@ -2033,10 +2030,6 @@ endif
+@@ -2048,10 +2045,6 @@ endif
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIBS) $(CURL_LIBCURL)
-@@ -2344,24 +2337,22 @@ endif
+@@ -2363,24 +2356,22 @@ endif
bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
{ test "$$bindir/" = "$$execdir/" || \
done && \
--- a/builtin.h
+++ b/builtin.h
-@@ -146,5 +146,11 @@ extern int cmd_verify_pack(int argc, con
+@@ -134,5 +134,11 @@ extern int cmd_verify_pack(int argc, con
extern int cmd_show_ref(int argc, const char **argv, const char *prefix);
extern int cmd_pack_refs(int argc, const char **argv, const char *prefix);
extern int cmd_replace(int argc, const char **argv, const char *prefix);
+extern int cmd_daemon(int argc, char **argv, const char *prefix);
-+extern int cmd_fast_import(int argc, const char **argv, const char *prefix);
++extern int cmd_fast_import(int argc, char **argv, const char *prefix);
+extern int cmd_http_backend(int argc, char **argv, const char *prefix);
+extern int cmd_imap_send(int argc, char **argv, const char *prefix);
+extern int cmd_shell(int argc, char **argv, const char *prefix);
+#include "../upload-pack.c"
--- a/daemon.c
+++ b/daemon.c
-@@ -1160,7 +1160,7 @@ static int serve(struct string_list *lis
+@@ -1148,7 +1148,7 @@ static int serve(struct string_list *lis
return service_loop(&socklist);
}
read_marks();
}
--int main(int argc, const char **argv)
-+int cmd_fast_import(int argc, const char **argv, const char *prefix)
+-int main(int argc, char **argv)
++int cmd_fast_import(int argc, char **argv, const char *prefix)
{
unsigned int i;
{
const char *cmd = argv[0];
static struct cmd_struct commands[] = {
-@@ -337,6 +337,7 @@ static void handle_internal_command(int
+@@ -338,6 +338,7 @@ static void handle_internal_command(int
{ "commit-tree", cmd_commit_tree, RUN_SETUP },
{ "config", cmd_config, RUN_SETUP_GENTLY },
{ "count-objects", cmd_count_objects, RUN_SETUP },
{ "credential", cmd_credential, RUN_SETUP_GENTLY },
{ "describe", cmd_describe, RUN_SETUP },
{ "diff", cmd_diff },
-@@ -344,6 +345,7 @@ static void handle_internal_command(int
+@@ -345,6 +346,7 @@ static void handle_internal_command(int
{ "diff-index", cmd_diff_index, RUN_SETUP },
{ "diff-tree", cmd_diff_tree, RUN_SETUP },
{ "fast-export", cmd_fast_export, RUN_SETUP },
{ "fetch", cmd_fetch, RUN_SETUP },
{ "fetch-pack", cmd_fetch_pack, RUN_SETUP },
{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
-@@ -356,6 +358,8 @@ static void handle_internal_command(int
+@@ -357,6 +359,8 @@ static void handle_internal_command(int
{ "grep", cmd_grep, RUN_SETUP_GENTLY },
{ "hash-object", cmd_hash_object },
{ "help", cmd_help },
{ "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
{ "init", cmd_init_db },
{ "init-db", cmd_init_db },
-@@ -404,6 +408,7 @@ static void handle_internal_command(int
+@@ -405,6 +409,7 @@ static void handle_internal_command(int
{ "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
{ "rm", cmd_rm, RUN_SETUP },
{ "send-pack", cmd_send_pack, RUN_SETUP },
{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
{ "show", cmd_show, RUN_SETUP },
{ "show-branch", cmd_show_branch, RUN_SETUP },
-@@ -421,6 +426,7 @@ static void handle_internal_command(int
+@@ -422,6 +427,7 @@ static void handle_internal_command(int
{ "update-server-info", cmd_update_server_info, RUN_SETUP },
{ "upload-archive", cmd_upload_archive },
{ "upload-archive--writer", cmd_upload_archive_writer },