#define _POSIX_PTHREAD_SEMANTICS 1 #include #include #include #include #include #include #include #include #include #include char *nazwa; char **slowa; unsigned int ilosc; //ilosc slow unsigned int ilosc_watkow = 0; pthread_mutex_t ilosc_watkow_mutex = PTHREAD_MUTEX_INITIALIZER; void *dofile(void *arg){ char *file = (char*) arg; int fd,res; char *plik,*ptr; off_t rozmiar; unsigned int n; if ((fd = open(file,O_RDWR))<0) { perror("open"); free(file); pthread_mutex_lock(&ilosc_watkow_mutex); ilosc_watkow--; pthread_mutex_unlock(&ilosc_watkow_mutex); return -1; }; rozmiar = lseek (fd,0,SEEK_END); lseek (fd,0,SEEK_SET); if (rozmiar == 0){ fprintf(stderr,"%s: pusty plik!\n",file); close(fd); free(file); pthread_mutex_lock(&ilosc_watkow_mutex); ilosc_watkow--; pthread_mutex_unlock(&ilosc_watkow_mutex); return -1; }; plik = (char *) mmap(0,rozmiar,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if (plik == MAP_FAILED) { perror("mmap"); close(fd); free(file); pthread_mutex_lock(&ilosc_watkow_mutex); ilosc_watkow--; pthread_mutex_unlock(&ilosc_watkow_mutex); return -1; }; for (n=0;nd_name,".")==0) || (strcmp(de->d_name,"..")==0)) continue; struct stat st; if (stat(de->d_name,&st)!=0) continue; if (S_ISDIR(st.st_mode)) glob(de->d_name); else if(S_ISREG(st.st_mode)&&(strcmp(de->d_name,nazwa)==0)) { char *cwd = getcwd(0,256); if (!cwd) { perror("getcwd"); continue; } char *fname = malloc(strlen(cwd)+strlen(de->d_name)+1+1); if (!fname) { perror("malloc"); continue; } sprintf(fname,"%s/%s",cwd,de->d_name); free(cwd); pthread_mutex_lock(&ilosc_watkow_mutex); ilosc_watkow++; pthread_mutex_unlock(&ilosc_watkow_mutex); if (pthread_create(0,0,dofile,fname)!=0){ perror("pthread_create"); ret = -1; free(fname); pthread_mutex_lock(&ilosc_watkow_mutex); ilosc_watkow--; pthread_mutex_unlock(&ilosc_watkow_mutex); } } }; closedir(dir); out: if (where) { fprintf(stderr,"%s ..\n",where); chdir(".."); }; return ret; }; int main(int argc, char *argv[]){ if (argc < 3) { fprintf(stderr,"Uzycie: %s plik slowo1 (...) slowoN\n",argv[0]); return -1; }; nazwa = argv[1]; ilosc = argc-2; slowa = argv+2; int ret = glob(0); while (1) { pthread_mutex_lock(&ilosc_watkow_mutex); if (!ilosc_watkow) return ret; pthread_mutex_unlock(&ilosc_watkow_mutex); sleep (2); }; };