/*
   Par Julien Wajsberg <flash@rezosup.net>

   janvier 2004

   Distributed under the GPLv2

Usage :
	ssh user@box sendkey < identity.pub

   This program won't copy more than one key (= 1 line of the input file).
   It will copy the contents of stdin to .ssh/authorized_keys on the destination server.

   Please send me modifications you will do :)

   */


#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <pwd.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>

#define LINE_LENGTH 1000
#define KEYFILE "authorized_keys"
#define KEYDIR ".ssh"

int die (char * msg) {
	fprintf (stderr, msg);
	exit (1);
}

int create_dot_ssh_directory (struct passwd * uinfo) {
	char * dir;
	struct stat * ssh_dir_stat;

	dir = malloc(255 * sizeof(char));
	strncpy (dir, uinfo->pw_dir, 254);
	dir[254] = '\0'; /* devrait etre inutile mais on sait jamais */
	
	strncat (dir, "/", 254);
	strncat (dir, KEYDIR, 254);
	dir[254] = '\0'; /* idem */

	ssh_dir_stat = malloc(sizeof(struct stat));
	if (stat (dir, ssh_dir_stat) == 0) {
		return 0;
	}
	free(ssh_dir_stat);

	if (errno != ENOENT) {
		die ("Erreur lors du stat\n");
	}
	
	if (mkdir(dir, 0700) == 0) {
		return 0;
	}
	free(dir);

	die ("Erreur lors de la création du répertoire.\n");
	return 0;
}

int main (void) {
	struct passwd * user_info;
	char * line;
	char * output_file;
	FILE * fdoutput;

	user_info = getpwuid(getuid());
	if (user_info == NULL) {
		die ("Erreur lors de la récupération des infos de l'utilisateur.\n");
	}

	if (strlen(user_info->pw_dir) > 240) { /* On veut pas que le home soit trop grand */
		die ("Le nom du home directory est trop long.\n");
	}
	
	create_dot_ssh_directory (user_info);

	line = malloc(LINE_LENGTH * sizeof (char));
	
	if (fgets(line, LINE_LENGTH, stdin) == NULL) {
		die ("Erreur lors du fgets.\n");
	}

	output_file = malloc(255 * sizeof(char));
	snprintf(output_file, 255, "%s/%s/%s", user_info->pw_dir, KEYDIR, KEYFILE);

	fdoutput = fopen(output_file, "w");
	free(output_file);
	
	if (fdoutput == NULL) {
		die ("Erreur lors de l'ouverture du fichier.\n");
	}
	fprintf(fdoutput, "%s\n", line);
	fclose (fdoutput);
	free(line);
	free(user_info);

	printf ("Votre clé a été correctement écrite.\n");
	
	return 0;
}

