Ayuda con Md5sum

Vereis tengo que escribir en un fichero de texto la salida que genera el comando propio de linux md5sum (suma de verificacion nombre de fichero) pero realizando dicho programa en C. Hasta ahora recorro bien el directorio y demas pero el problema viene a la hora de sacar la suma que siendo sinceros no tengo ni idea de como hacerlo, aqui os pongo el codigo de lo que llevo de programa (el programa genera el fichero pero en la 1ª columna pone cosas raras en vez de la suma).
#include <ftw.h>

#include <stdio.h>

#include <sys/stat.h>

#include <string.h>

#define MD5_STRING_LENGTH 32

char nomfich[150]; //Variable global donde meteremos el nombre del fichero

unsigned char md5sum(const unsigned char *d, unsigned long n, unsigned char *md)

{   

   return "f76eb1aa49433d52476cd3dcbc3794";

}



int list(const char *nombre, const struct stat *status, int type) //Funcion que pinta en el fichero

{

FILE *F;

F=fopen(nomfich,"a+t");

unsigned char suma[MD5_STRING_LENGTH + 1];



if(type == FTW_F)  //Si es fichero normal

{

  md5sum(nombre,strlen(nombre),suma); //Mandamos a md5sum nombre de ficher, el tamaño de la cadena y la variable suma

  fprintf(F,"%s\t./%s\n",suma,nombre);  //Pintamos la suma devuelta y el nombre del fichero

}

 

close(F);

return 0;

}   



int main(int argc, char *argv[]) {   //argv es el nombre del directorio que le mandamos

  char *extension=".md5sum";

   

  if(argc == 1) //Sino se especifica directorio salimos

  {

   printf("No se ha especificado directorio\n");

   exit (0);

  }

  strcpy(nomfich,argv[1]); //Copiamos el nombre del directorio en la cadena global nomfich

  strcat(nomfich,extension); // Añadimos la extension a la cadena

  ftw(argv[1],list, 1); //Si se ha especificado le mandamos la ruta del directorio

 

return 0;

}
No entendí muy bien tu problema...

Saludos.Ferdy
Si weno no me explique bien. Veras si en consola ejecutamos md5sum y el nombre de un fichero, el comando nos devuelve la suma de verificacion de dicho fichero (son 32 digitos alfanumericos), en el codigo del programa que he puesto hay una funcion md5sum que solo tiene puesto un return y un numero ya que no se como implementar (el codigo que hay que poner en dicha funcion) para que haye la suma de verificacion. Si alguien sabe que tendria que poner en dicha funcion para hayar dicho numero le estaria muy agracedido.
¿ Esa función tiene que implementar el algoritmo md5 ? ¿ O simplemente llamar al comando md5sum ?

De ser este último caso, mírate la función popen.

Saludos.Ferdy
Si me pudieras explicar como quedaria con la funcion popen, me vendria de perlas ya que no se su funcionamiento. :-P

Edito: El principal problema que encuentro es a la hora de especificar a md5sum el fichero al cual le tiene que hayar la suma de verificacion.
Si pongo
md=popen("md5sum d","r");
donde d es una cadena que contiene el nombre de fichero, me interpreta d literalmente y no coje el contenido de dicha cadena.
¿Seguro? Esto funciona bien:

#include <stdio.h>

const char *comando = "ls -l /";

int main(int argc, char **argv)
{
    FILE *fd;
    char buf[BUFSIZ];
   
    if ((fd = popen(comando,"r"))!=NULL)
    {
        while (fgets(buf,sizeof(buf),fd)!=NULL)
        {
            printf("%s",buf);
        }

        pclose(fd);
    }
    else
    {
        fprintf(stderr,"Aieeeeee\n");
        return 1;
    }

    return 0;
}
Si pero el problema esta en que cada vez que va a la funcion le tengo que mandar al comando un nombre de fichero distinto, estoy probando esto pero no funciona, da violacion de segmento:
const char *comando="md5sum ";

unsigned char md5sum(const unsigned char *d, unsigned long n, unsigned char *md)

{   

strcat(comando,d);

   md=popen(comando,"r");

}

Le añado a comando la cadena d que es el nombre del fichero pero no funciona [triston]
Lo que tienes que aprender entonces es C. No puedes hacer strcat sobre esa zona de memoria porque solo tienes reservado espacio para "md5sum ".

Utiliza un buffer o memoria dinámica (malloc,realloc,free)

Saludos.Ferdy
7 respuestas