static int push_git(struct discovery *heads, int nr_spec, char **specs) { struct rpc_state rpc; const char **argv; int argc = 0, i, err; argv = xmalloc((10 + nr_spec) * sizeof(char*)); argv[argc++] = "send-pack"; argv[argc++] = "--stateless-rpc"; argv[argc++] = "--helper-status"; if (options.thin) argv[argc++] = "--thin"; if (options.dry_run) argv[argc++] = "--dry-run"; if (options.verbosity == 0) argv[argc++] = "--quiet"; else if (options.verbosity > 1) argv[argc++] = "--verbose"; argv[argc++] = options.progress ? "--progress" : "--no-progress"; argv[argc++] = url; for (i = 0; i < nr_spec; i++) argv[argc++] = specs[i]; argv[argc++] = NULL; memset(&rpc, 0, sizeof(rpc)); rpc.service_name = "git-receive-pack", rpc.argv = argv; err = rpc_service(&rpc, heads); if (rpc.result.len) safe_write(1, rpc.result.buf, rpc.result.len); strbuf_release(&rpc.result); free(argv); return err; }
static int vlc_rpc_mainloop(access_t *p_access, struct rpc_context *p_rpc_ctx, bool (*pf_until_cb)(access_t *)) { access_sys_t *p_sys = p_access->p_sys; while (!p_sys->b_error && !pf_until_cb(p_access)) { struct pollfd p_fds[1]; int i_ret; p_fds[0].fd = rpc_get_fd(p_rpc_ctx); p_fds[0].events = rpc_which_events(p_rpc_ctx); if ((i_ret = vlc_poll_i11e(p_fds, 1, -1)) < 0) { if (errno == EINTR) msg_Warn(p_access, "vlc_poll_i11e interrupted"); else msg_Err(p_access, "vlc_poll_i11e failed"); p_sys->b_error = true; } else if (i_ret > 0 && p_fds[0].revents && rpc_service(p_rpc_ctx, p_fds[0].revents) < 0) { msg_Err(p_access, "nfs_service failed"); p_sys->b_error = true; } } return p_sys->b_error ? -1 : 0; }
static void wait_for_reply(struct rpc_context *rpc, struct sync_cb_data *cb_data) { struct pollfd pfd; assert(rpc->magic == RPC_CONTEXT_MAGIC); while (!cb_data->is_finished) { pfd.fd = rpc_get_fd(rpc); pfd.events = rpc_which_events(rpc); if (poll(&pfd, 1, -1) < 0) { rpc_set_error(rpc, "Poll failed"); cb_data->status = -EIO; break; } if (rpc_service(rpc, pfd.revents) < 0) { rpc_set_error(rpc, "rpc_service failed"); cb_data->status = -EIO; break; } if (rpc_get_fd(rpc) == -1) { rpc_set_error(rpc, "Socket closed\n"); break; } } }
static int fetch_git(struct discovery *heads, int nr_heads, struct ref **to_fetch) { struct rpc_state rpc; struct strbuf preamble = STRBUF_INIT; char *depth_arg = NULL; int argc = 0, i, err; const char *argv[16]; argv[argc++] = "fetch-pack"; argv[argc++] = "--stateless-rpc"; argv[argc++] = "--stdin"; argv[argc++] = "--lock-pack"; if (options.followtags) argv[argc++] = "--include-tag"; if (options.thin) argv[argc++] = "--thin"; if (options.verbosity >= 3) { argv[argc++] = "-v"; argv[argc++] = "-v"; } if (options.check_self_contained_and_connected) argv[argc++] = "--check-self-contained-and-connected"; if (!options.progress) argv[argc++] = "--no-progress"; if (options.depth) { struct strbuf buf = STRBUF_INIT; strbuf_addf(&buf, "--depth=%lu", options.depth); depth_arg = strbuf_detach(&buf, NULL); argv[argc++] = depth_arg; } argv[argc++] = url.buf; argv[argc++] = NULL; for (i = 0; i < nr_heads; i++) { struct ref *ref = to_fetch[i]; if (!ref->name || !*ref->name) die("cannot fetch by sha1 over smart http"); packet_buf_write(&preamble, "%s\n", ref->name); } packet_buf_flush(&preamble); memset(&rpc, 0, sizeof(rpc)); rpc.service_name = "git-upload-pack", rpc.argv = argv; rpc.stdin_preamble = &preamble; rpc.gzip_request = 1; err = rpc_service(&rpc, heads); if (rpc.result.len) write_or_die(1, rpc.result.buf, rpc.result.len); strbuf_release(&rpc.result); strbuf_release(&preamble); free(depth_arg); return err; }
static int fetch_git(struct discovery *heads, int nr_heads, struct ref **to_fetch) { struct rpc_state rpc; char *depth_arg = NULL; const char **argv; int argc = 0, i, err; argv = xmalloc((15 + nr_heads) * sizeof(char*)); argv[argc++] = "fetch-pack"; argv[argc++] = "--stateless-rpc"; argv[argc++] = "--lock-pack"; if (options.followtags) argv[argc++] = "--include-tag"; if (options.thin) argv[argc++] = "--thin"; if (options.verbosity >= 3) { argv[argc++] = "-v"; argv[argc++] = "-v"; } if (!options.progress) argv[argc++] = "--no-progress"; if (options.depth) { struct strbuf buf = STRBUF_INIT; strbuf_addf(&buf, "--depth=%lu", options.depth); depth_arg = strbuf_detach(&buf, NULL); argv[argc++] = depth_arg; } argv[argc++] = url; for (i = 0; i < nr_heads; i++) { struct ref *ref = to_fetch[i]; if (!ref->name || !*ref->name) die("cannot fetch by sha1 over smart http"); argv[argc++] = ref->name; } argv[argc++] = NULL; memset(&rpc, 0, sizeof(rpc)); rpc.service_name = "git-upload-pack", rpc.argv = argv; rpc.gzip_request = 1; err = rpc_service(&rpc, heads); if (rpc.result.len) safe_write(1, rpc.result.buf, rpc.result.len); strbuf_release(&rpc.result); free(argv); free(depth_arg); return err; }
static int push_git(struct discovery *heads, int nr_spec, char **specs) { struct rpc_state rpc; int i, err; struct argv_array args; struct string_list_item *cas_option; struct strbuf preamble = STRBUF_INIT; argv_array_init(&args); argv_array_pushl(&args, "send-pack", "--stateless-rpc", "--helper-status", NULL); if (options.thin) argv_array_push(&args, "--thin"); if (options.dry_run) argv_array_push(&args, "--dry-run"); if (options.push_cert == SEND_PACK_PUSH_CERT_ALWAYS) argv_array_push(&args, "--signed=yes"); else if (options.push_cert == SEND_PACK_PUSH_CERT_IF_ASKED) argv_array_push(&args, "--signed=if-asked"); if (options.verbosity == 0) argv_array_push(&args, "--quiet"); else if (options.verbosity > 1) argv_array_push(&args, "--verbose"); for (i = 0; i < options.push_options.nr; i++) argv_array_pushf(&args, "--push-option=%s", options.push_options.items[i].string); argv_array_push(&args, options.progress ? "--progress" : "--no-progress"); for_each_string_list_item(cas_option, &cas_options) argv_array_push(&args, cas_option->string); argv_array_push(&args, url.buf); argv_array_push(&args, "--stdin"); for (i = 0; i < nr_spec; i++) packet_buf_write(&preamble, "%s\n", specs[i]); packet_buf_flush(&preamble); memset(&rpc, 0, sizeof(rpc)); rpc.service_name = "git-receive-pack", rpc.argv = args.argv; rpc.stdin_preamble = &preamble; err = rpc_service(&rpc, heads); if (rpc.result.len) write_or_die(1, rpc.result.buf, rpc.result.len); strbuf_release(&rpc.result); strbuf_release(&preamble); argv_array_clear(&args); return err; }
static void client_io(evutil_socket_t fd, short events, void *private_data) { struct client *client = private_data; struct server *server; int revents = 0; if (events & EV_READ) { revents |= POLLIN; } if (events & EV_WRITE) { revents |= POLLOUT; } if (rpc_service(client->rpc, revents) < 0) { fprintf(stderr, "rpc_service failed\n"); exit(10); } update_events(client->rpc, client->read_event, client->write_event); if (client->is_finished) { /* * Stop listening for new connections. */ event_free(client->listen_event); client->listen_event = NULL; /* * Stop listening for events on the client context. */ event_free(client->read_event); client->read_event = NULL; event_free(client->write_event); client->write_event = NULL; /* * Stop listening to server connections. */ for (server = server_list; server; server = server->next) { if (server->read_event) { event_free(server->read_event); server->read_event = NULL; } if (server->write_event) { event_free(server->write_event); server->write_event = NULL; } } } }
static void server_io(evutil_socket_t fd, short events, void *private_data) { struct server *server = private_data; int revents = 0; if (events & EV_READ) { revents |= POLLIN; } if (events & EV_WRITE) { revents |= POLLOUT; } if (rpc_service(server->rpc, revents) < 0) { fprintf(stderr, "rpc_service() failed for server\n"); exit(10); } update_events(server->rpc, server->read_event, server->write_event); }
static void wait_for_reply(struct rpc_context *rpc, struct sync_cb_data *cb_data) { struct pollfd pfd; for (;;) { if (cb_data->is_finished) { break; } pfd.fd = rpc_get_fd(rpc); pfd.events = rpc_which_events(rpc); if (poll(&pfd, 1, -1) < 0) { rpc_set_error(rpc, "Poll failed"); cb_data->status = -EIO; break; } if (rpc_service(rpc, pfd.revents) < 0) { rpc_set_error(rpc, "rpc_service failed"); cb_data->status = -EIO; break; } } }
static int push_git(struct discovery *heads, int nr_spec, char **specs) { struct rpc_state rpc; int i, err; struct argv_array args; struct string_list_item *cas_option; argv_array_init(&args); argv_array_pushl(&args, "send-pack", "--stateless-rpc", "--helper-status", NULL); if (options.thin) argv_array_push(&args, "--thin"); if (options.dry_run) argv_array_push(&args, "--dry-run"); if (options.verbosity == 0) argv_array_push(&args, "--quiet"); else if (options.verbosity > 1) argv_array_push(&args, "--verbose"); argv_array_push(&args, options.progress ? "--progress" : "--no-progress"); for_each_string_list_item(cas_option, &cas_options) argv_array_push(&args, cas_option->string); argv_array_push(&args, url.buf); for (i = 0; i < nr_spec; i++) argv_array_push(&args, specs[i]); memset(&rpc, 0, sizeof(rpc)); rpc.service_name = "git-receive-pack", rpc.argv = args.argv; err = rpc_service(&rpc, heads); if (rpc.result.len) write_or_die(1, rpc.result.buf, rpc.result.len); strbuf_release(&rpc.result); argv_array_clear(&args); return err; }
static int fetch_git(struct discovery *heads, int nr_heads, struct ref **to_fetch) { struct rpc_state rpc; struct strbuf preamble = STRBUF_INIT; int i, err; struct argv_array args = ARGV_ARRAY_INIT; argv_array_pushl(&args, "fetch-pack", "--stateless-rpc", "--stdin", "--lock-pack", NULL); if (options.followtags) argv_array_push(&args, "--include-tag"); if (options.thin) argv_array_push(&args, "--thin"); if (options.verbosity >= 3) argv_array_pushl(&args, "-v", "-v", NULL); if (options.check_self_contained_and_connected) argv_array_push(&args, "--check-self-contained-and-connected"); if (options.cloning) argv_array_push(&args, "--cloning"); if (options.update_shallow) argv_array_push(&args, "--update-shallow"); if (!options.progress) argv_array_push(&args, "--no-progress"); if (options.depth) argv_array_pushf(&args, "--depth=%lu", options.depth); if (options.deepen_since) argv_array_pushf(&args, "--shallow-since=%s", options.deepen_since); for (i = 0; i < options.deepen_not.nr; i++) argv_array_pushf(&args, "--shallow-exclude=%s", options.deepen_not.items[i].string); if (options.deepen_relative && options.depth) argv_array_push(&args, "--deepen-relative"); if (options.from_promisor) argv_array_push(&args, "--from-promisor"); if (options.no_dependents) argv_array_push(&args, "--no-dependents"); if (options.filter) argv_array_pushf(&args, "--filter=%s", options.filter); argv_array_push(&args, url.buf); for (i = 0; i < nr_heads; i++) { struct ref *ref = to_fetch[i]; if (!*ref->name) die("cannot fetch by sha1 over smart http"); packet_buf_write(&preamble, "%s %s\n", oid_to_hex(&ref->old_oid), ref->name); } packet_buf_flush(&preamble); memset(&rpc, 0, sizeof(rpc)); rpc.service_name = "git-upload-pack", rpc.argv = args.argv; rpc.stdin_preamble = &preamble; rpc.gzip_request = 1; err = rpc_service(&rpc, heads); if (rpc.result.len) write_or_die(1, rpc.result.buf, rpc.result.len); strbuf_release(&rpc.result); strbuf_release(&preamble); argv_array_clear(&args); return err; }