Blame examples/network/common.c

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