#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <string.h>
#include <errno.h>


int main(int argc, char** argv) {
	if (argc < 2)
	{
		printf("%s usage: %s file\n", argv[0], argv[0]);
		exit(EXIT_FAILURE);
	}

	char* fichier = argv[1];
	FILE *f;
	char *contenu;

	/* Ouverture du fichier */
	if (!(f = fopen(fichier, "r")))
	{
		printf("Impossible d'ouvrir %s en lecture : %s.\n", fichier, strerror(errno));
		exit(EXIT_FAILURE);
	}

	/* Détermination de la taille */
	fseek(f, 0, SEEK_END);

	int taille = ftell(f);

	/* Si le fichier est vide, on s'arrête. */
	if (taille == 0) return 0;	

	/* Si le fichier a une taille négative, il y a une erreur ! */
	if (taille < 0)	
	{
		printf("Erreur lors de l'appel à fseek : %s.\n", strerror(errno));
		exit(EXIT_FAILURE);
	}

	/* On alloue la mémoire pour lire le fichier */
	contenu = (char*) malloc((taille) * sizeof(char));

	/* On se remet au début pour lire */
	fseek(f, 0, SEEK_SET);

	/* On n'essaie de lire que si on veut lire au moins un caractère */
	if (taille - 1 > 0)
	{
		/* On lit */
		if (!(fread(contenu, 1, taille - 1, f)))
		{
			printf("Erreur lors de la lecture : %s.\n", strerror(errno));
			exit(EXIT_FAILURE);
		}
	}
	fclose(f);
		
	/* On rouvre le fichier pour écriture */
	f = fopen(fichier, "w");

	/* On n'essaie d'écrire que si on a au moins un caractère à écrire. */
	if (taille - 1 > 0)	
	{
		/* On écrit le tout sauf le dernier octet */
		if(!(fwrite(contenu, 1, taille - 1, f)))
		{
			printf("Erreur lors de l'écriture : %s.\n", strerror(errno));
			exit(EXIT_FAILURE);
		}
	}
	fclose(f);

	return 0;
	
}