Newsgroup: it.comp.lang.c
Titolo: AIUTO URGENTISSIMO 2

Non riesco a capire come mai questo programma non vada, il tempo per
consegnarlo stà per scadere e sono nella cacca, VI PREGO AIUTATEMI!!
Quello che segue è il listato, so che è molto lungo, ma ad un programmatore
esperto probabilmente non servirà nemmeno eseguirlo, se quindi qualche anima
MOOLTO PIA avesse il buon cuore di potermi aiutare a trovare gli errori
gliene sarei MOOLTO grato, anzi MOOLTISSIMO!!
AH, alla compilazione non dà errori, ma dà una segmentation fault. Tramite
delle printf di debug ho scoperto che si ferma alla riga dove faccio opendir
(dir);
A costo di sembrare patetico vi richiedo ancora AIUTOOOOOOOOOOOO!!!!!
Ciao e grazie anticipatamente
                                                                    Nicola
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <stdio.h>
#include <dirent.h>
#include <ctype.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#define MAXLUNG 1024
#define dirp getenv("HOME")
#include <signal.h>
void sigint(int);
int times = 0;
void elimina (char *dir, char dpr[MAXLUNG], char kk[2]){
  int k;
  char path[MAXLUNG], comando[MAXLUNG];
  struct stat inform;
  DIR * ddd;
  struct dirent * cartella;
  printf ("check 1bis dpr: %s\n",dpr);
  printf ("check 1 dir: %s\n", dir);
  ddd = opendir ( dir );    /*          ****** SI FERMA QUI' QUALE E'
L'ERRORE??******* */
  printf ("check 2\n"); fflush(stdout);
  while((cartella = readdir(ddd))!=NULL) {
    printf ("file attuale: %s\n", cartella->d_name);
    if (!( (strcmp(cartella->d_name,".") == 0) ||
(strcmp(cartella->d_name,"..") == 0)))
      {
    printf ("check 5\n");
 strcat(path, dir);
 printf ("path al check 5: %s\n",path);
 strcat(path,"/");
 printf ("path al check 5bis: %s\n",path);
 strcat(path,cartella->d_name);
 printf ("path al check 6: %s\n",path);
 k = ((stat(path, &inform) != -1) && S_ISDIR(inform.st_mode));
 printf("k: %d\n",k);
 if  (k != 0)
   {
  printf("ricorsione su %s\n",path);
  elimina (path, dpr, kk);
  }
 else {
  sprintf (comando,"mv %s " ,path);
  strcat (comando, dpr);
  strcat (comando,"/.Gepaw/#altro#");
  system (comando);
  if (strcmp(kk,"-f")==0){sprintf(comando,"perl 
posiziona.pl
%s",cartella->d_name); system(comando);}
  }
      }
   path[0]=0;
  }
  return;
}
int main(int argc, char *argv[])
{
  FILE *ifp, *ifp2;
  int find;
  char *key, *demoscopea, file[MAXLUNG], file2[MAXLUNG], *com, c[MAXLUNG],
*p, *homer,  b[MAXLUNG], kd[2];
  extern int errno;
  void (*vecchio)(int);
  system ("mkdir ~/.CopiaGepaw");
  system ("mcopy ~/.Gepaw/* ~/.CopiaGepaw");
  vecchio = signal(SIGINT,sigint);
  key = argv[argc-1];
  sprintf (file,"%s/gepaw_keys",dirp);
  find=0;
  ifp = fopen(file, "r");
  while ((fgets(c, MAXLUNG,ifp)) && (find==0)) {
    p=strtok(c,"\n"); p=NULL;
    if (strcmp(c,key) == 0) find = 1;
  }
  fclose (ifp);
  if (find == 0){
    perror("chiave inesistente.\n");
    exit(-1);
  }
  com = malloc(sizeof(key)+16);
  sprintf (com, "perl 
rimuovi.pl
 %s",key);     /*elimina la chiave da
gepaw_keys*/
  system (com);
  sprintf (file2,"%s/homer",dirp);
  demoscopea=getenv("HOME");
  sprintf (demoscopea, "%s/.Gepaw/%s", demoscopea, key);
  if (strcmp(argv[1],"-f") ==0)  sprintf(kd,"-f");
     else sprintf(kd,"nn");
  ifp2 = fopen(file2, "r");
  fgets(b, MAXLUNG,ifp2);
  fclose (ifp2);
  elimina (demoscopea, b, kd);
  sprintf (com,"rm %s -rf", demoscopea);
  printf ("com: %s\n",com);
  system(com);
  system ("rm ~/homer");
  system ("rm ~/.CopiaGepaw/ -rf");
  exit(0);
}
void sigint(int sig)
{
  printf("SIGINT\n");
  if(++times == 2) {      // cioe' alla seconda termina ...
    signal(SIGINT,SIG_DFL);
     system ("mcopy  ~/.CopiaGepaw/*  ~/.Gepaw/");
     system ("rm ~/.CopiaGepaw/ -rf");
     }
  return;
}

  sprintf (com,"rm %s -rf", demoscopea);
com decisamente non e' lungo a sufficienza per contenere
il risultato di questa sprintf. Anche 17+strlen(key) non
bastano in questo caso.
Il problema con gli sconfinamenti che hai provocato e'
che questi danneggiano *altre* strutture dati spesso
le cose sembrano apparentemente funzionare (in quel punto
del codice). I sintomi del bug possono manifestarsi molto
dopo ed in un punto diverso da quello in cui gli
sconfinamenti sono avvenuti; per questa ragione con
linguaggi come il C o il C++ bisogna prestare la *massima*
attenzione a queste cose.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff