static VALUE rbffi_InvokeLLLLLrL(int argc, VALUE* argv, void* function, FunctionType* fnInfo) { return LCALL(fnInfo, argc, argv, (L (*)(L, L, L, L, L)) function, LARG(fnInfo, argv, 0), LARG(fnInfo, argv, 1), LARG(fnInfo, argv, 2), LARG(fnInfo, argv, 3), LARG(fnInfo, argv, 4)); }
static VALUE rbffi_InvokeLLLrL(int argc, VALUE* argv, void* function, FunctionType* fnInfo) { L (*fn)(L, L, L) = (L (*)(L, L, L)) function; L result; checkArity(argc, 3); if (unlikely(!isLongValue(argv[0])) || unlikely(!isLongValue(argv[1])) || unlikely(!isLongValue(argv[2]))) { return rbffi_CallFunction(argc, argv, function, fnInfo); } result = (*fn)(LARG(fnInfo, argv, 0), LARG(fnInfo, argv, 1), LARG(fnInfo, argv, 2)); return returnL(fnInfo, &result); }
int main(int argc, char **argv) { GnomeKeyringResult result; GList *results; char *host; int i, tried, verbose = 0, remove = 0, list = 0; int set_domain = 0, set_host = 0, set_server = 0; int set_protocol = 0, set_port = 0, set_passfd = 0; int dry = 0; char *user = default_user(); char *domain = NULL; char *server = NULL; char *object = NULL; char *protocol = NULL; char *authtype = NULL; guint32 port = 0; int passfd = 0; char *use_keyring = GNOME_KEYRING_DEFAULT; for (i = 1; i < argc; i++) { if (ARG(u) || LARG(user)) { S_OPT(user); } else if (ARG(h) || LARG(host)) { S_OPT_Q(host); } else if (ARG(s) || LARG(server)) { S_OPT_Q(server); } else if (ARG(d) || LARG(domain)) { S_OPT_Q(domain); } else if (ARG(P) || LARG(protocol)) { S_OPT_Q(protocol); } else if (ARG(p) || LARG(port)) { I_OPT_Q(port); } else if (LARG(passfd)) { I_OPT_Q(passfd); } else if (ARG(v) || LARG(verbose)) { verbose = 1; } else if (ARG(R) || LARG(remove)) { MODE(remove); } else if (ARG(l) || LARG(list)) { MODE(list); } else if (ARG(n) || LARG(dry)) { dry = 1; verbose++; } else if (ARG(k) || LARG(keyring)) { S_OPT(use_keyring); } else if (LARG(help)) { usage(); return 0; } else { fprintf(stderr, "Unknown argument: %s\n", argv[i]); return 1; } } if (set_host && !(set_domain && set_server)) { char *dot = index(host, '.'); if (dot) { dot[0] = '\0'; dot++; if (!set_domain) domain = dot; if (!set_server) server = host; } else { server = host; domain = ""; } } else if (set_domain && set_server) { host = NULL; } else if (!list) { fprintf(stderr, "Must set --host or (--server and --domain)\n"); return 1; } if ((set_port + set_protocol) == 1) { if (set_protocol) { set_port_by_protocol(&port, protocol); } else if (set_port) { set_protocol_by_port(&protocol, port); } } else if (!(set_port || set_protocol || list)) { fprintf(stderr, "Must set at least one of --port or --protocol\n"); return 1; } if (set_protocol && !port) { fprintf(stderr, "Couldn't determine port for --protocol %s\n", protocol); return 1; } if (verbose && !list) { #define VALUE(X) printf("%s: %s\n", #X, X ? X : "(null)") VALUE(user); VALUE(domain); VALUE(server); VALUE(host); VALUE(protocol); #undef VALUE printf("port: %d\n", port); if (dry) return 0; } if (!gnome_keyring_is_available()) { fprintf(stderr, "No keyring available\n"); return 1; } if (list) return key_listing(verbose); for (tried = 0; tried < 2; tried++) { result = gnome_keyring_find_network_password_sync( user, domain, server, object, protocol, authtype, port, &results ); if (verbose) printf("attempt #%d: ", tried); if (result == OK) { GList *current; GnomeKeyringNetworkPasswordData *passdata; char *password; for (i = 0, current = results; current; i++, current = current->next) { passdata = (GnomeKeyringNetworkPasswordData *)current->data; password = passdata->password; if (verbose) { printf("Result[%d]=%s\n", i, password); continue; } if (remove) { result = gnome_keyring_item_delete_sync( passdata->keyring, passdata->item_id ); if (verbose) printf("Remove %s %d -> %s\n", passdata->keyring, passdata->item_id, result == OK ? "OK" : "NOT OK"); if (!current->next) return 0; continue; } printf("%s", password); return 0; } if (password) break; } if (remove) { printf("No such password\n"); return 1; } if (verbose) printf("nope\n"); if (!tried) { char *password; if (set_passfd) { password = password_from(passfd); } else { password = password_prompt(user, server, domain, protocol, port); } if (password) { guint32 item_id; gnome_keyring_set_network_password_sync( use_keyring, user, domain, server, object, protocol, authtype, port, password, &item_id ); if (verbose) printf("Stored password? %s\n", item_id ? "yes" : "no"); } } } return 0; }