vector* breadth_first_traversal(avl_tree* _Tree) { queue* _Queue = create_queue(); vector* _Vector = create_vector(); push_queue(_Queue, (void*)_m_root); while (size_queue(_Queue) != 0) { avl_node* _Node = pop_queue(_Queue); _Vector = _Node->m_value; if (_Node->m_left_child != 0) push_queue(_Node->m_left_child); if (_Node->m_right_child != 0) push_queue(_Node->m_right_child); } return _Vector; }
int find_files(char* dirname, int socket, int *number, pthread_mutex_t *mtx) { int return_code, i, err; DIR *dir_ptr; struct dirent entry; struct dirent *result; struct stat mybuf; char buf[256]; if ((dir_ptr = opendir (dirname)) == NULL) { fprintf(stderr,"find files: couldn't open folder"); return -1; } else { while( ( return_code = readdir_r(dir_ptr, &entry, &result) ) == 0 && result!=NULL) { if (entry.d_ino==0) continue; if ( strcmp(entry.d_name,".")==0 || strcmp(entry.d_name,"..")==0) continue; strcpy(buf,dirname); strcat(buf,"/"); strcat(buf, entry.d_name); if ( stat (buf, & mybuf ) < 0) { perror ( buf ) ; continue ; } if (( mybuf.st_mode & S_IFMT ) == S_IFDIR ) // directory encountered { // printf("\ndirectory: %s\n", buf); if ( find_files(buf, socket, number, mtx) == -1) { fprintf(stderr,"find files recursion error"); return -1; } } else // file encountered { QueueNode *node; int filesize = (strlen(dirname)+strlen(entry.d_name)+2); node = create_node(); node->number = number; node->mutex = mtx; node->clientSock = socket; node->filesize = mybuf.st_size; node->mode = mybuf.st_mode; node->filename = malloc( filesize * sizeof(char) ); for (i=0; i<filesize; i++) node->filename[i] = '\0'; for (i=0; i<strlen(dirname); i++) node->filename[i] = dirname[i]; strcat(node->filename, "/"); strcat(node->filename, entry.d_name); node->filename_size = filesize-1; if (err = pthread_mutex_lock (& queue_lock )) { perror2 ("insert queue pthread_mutex_lock ", err ); exit (1); } while(size_queue(queue) == queue_size) { pthread_cond_wait ( &insert , &queue_lock ); } insert_queue(queue, node); pthread_cond_signal ( &worker_cond ); color_text(client_color); printf("[Client Thread: %ld]: Just added to queue: %s\n", pthread_self(), node->filename); if (err = pthread_mutex_unlock (& queue_lock )) { perror2 ("insernt queue pthread_mutex_unlock ", err ); exit (1) ; } // printf("file: %d, %s/%s\n", mybuf.st_size ,dirname, entry.d_name); } } closedir(dir_ptr); } return 0; }