#include "common.h" #include #include #include /* Shamelessly borrowed from http://stackoverflow.com/questions/3417837/ * with permission of the original author, Martin Pool. * http://sourcefrog.net/weblog/software/languages/C/unused.html */ #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #elif defined(__LCLINT__) # define UNUSED(x) /*@unused@*/ x #else # define UNUSED(x) x #endif static int readline(char **out) { int c, error = 0, length = 0, allocated = 0; char *line = NULL; errno = 0; while ((c = getchar()) != EOF) { if (length == allocated) { allocated += 16; if ((line = realloc(line, allocated)) == NULL) { error = -1; goto error; } } if (c == '\n') break; line[length++] = c; } if (errno != 0) { error = -1; goto error; } line[length] = '\0'; *out = line; line = NULL; error = length; error: free(line); return error; } int cred_acquire_cb(git_cred **out, const char * UNUSED(url), const char * UNUSED(username_from_url), unsigned int UNUSED(allowed_types), void * UNUSED(payload)) { char *username = NULL, *password = NULL; int error; printf("Username: "); if (readline(&username) < 0) { fprintf(stderr, "Unable to read username: %s", strerror(errno)); return -1; } /* Yup. Right there on your terminal. Careful where you copy/paste output. */ printf("Password: "); if (readline(&password) < 0) { fprintf(stderr, "Unable to read password: %s", strerror(errno)); free(username); return -1; } error = git_cred_userpass_plaintext_new(out, username, password); free(username); free(password); return error; }