Esempio n. 1
0
int send_files(unsigned char **files_path, int files_count, const char *ip) {
    char block_type;
    int sock, file, c;
    int trans_cond = EXIT_SUCCESS;
    /** Opening socket descriptor */
    if ((sock = open_socket(ip)) == EXIT_FAILURE) {
        return EXIT_FAILURE;
    }
    for (c = 0; c < files_count; c++) {
        /** Opening file descriptor */
        if ((file = open_file((const char *) files_path[c], O_RDONLY)) == EXIT_FAILURE) {
            return EXIT_FAILURE;
        }
        /** Sending block, file name and file size **/
        block_type = BLOCK_FILE_START;
        write_total(sock, &block_type, 1);
        const char *file_name = fname((const char *) files_path[c]);
        write_total(sock, file_name, strlen(file_name));
        write_total(sock, &"\n", 1);
        off_t file_size = fsize((const char *) files_path[c]);
        /** Checking for file size unavailable **/
        if (file_size == -1) {
            return EXIT_FAILURE;
        }
        write_total(sock, &file_size, 8);
        setup_bar(file_name, file_size);
        trans_cond = transfer_data(file, sock, 0, file_size);
        /** Closing streams **/
        close(file);
        /** Checking for transfer condition **/
        if (trans_cond == EXIT_FAILURE) {
            /** Nothing to do **/
            break;
        }
        printf("\n");
    }
    /** Checking for transaction success **/
    if (trans_cond == EXIT_SUCCESS) {
        /** Sending end-block **/
        block_type = BLOCK_FILE_END;
        write_total(sock, &block_type, 1);
    }
    shutdown(sock, SHUT_RDWR);
    return trans_cond;
}
Esempio n. 2
0
void n_addrec (NDX *n, char *r, unsigned long index_num) {
  unsigned char i, num;
  char *rs;
  int cmp, top;
  unsigned long page_index;
  bool changed[64], header_changed;
  NDX_NODE* key;
  key=(NDX_NODE*)malloc(8+n->key_length);
  rs=(char*)malloc(n->key_length);
  strscpy(rs,r,n->key_length);
  memset(changed,0,sizeof(changed));
  header_changed=false;

  page_index=n->root_page; top=-1;
  while (page_index) {
    get_page(n,page_index,++top);
    if (pages[top].keys[0]->index) break;
    for (i=0;i<pages[top].key_num;i++) {
      cmp=memcmp(rs,pages[top].keys[i]->key_data,n->key_length);
      if ((cmp<0) || (cmp==0 && index_num<pages[top].keys[i]->index))
       { page_index=pages[top].keys[i]->left_page; break; }
    }
    if (i==pages[top].key_num) {
      memcpy(pages[top].keys[--i],rs,n->key_length);
      changed[i]=true;
      page_index=pages[top].keys[--i]->left_page;
    }
  }
  key=make_node(n,0,index_num,rs);
  addrec(n,num=top,key);
  changed[top]=true;
  while (pages[num].key_num>n->max_keys && num>1) {
    spilt_page(n,num,++top);
    header_changed=true;
    addrec(n,num-1,get_last(n,num));
    changed[num]=changed[top]=true;
  }
  if (pages[num].key_num>n->max_keys) {
    spilt_page(n,num,++top);
    header_changed=true;
    changed[num]=changed[top]=true;
    make_page(n,num,top,top+1); top++;
    changed[top]=true;
  }
  for (i=0;i<=top;i++) {
    if (changed[i]) put_page(n,i);
    dispose_page(i);
  }
  if (header_changed) write_total(n);
}
Esempio n. 3
0
int load_file(const char *directory, const char *ip) {
    char block_type;
    int sock, file;
    int trans_cond = EXIT_SUCCESS;
    /** Opening socket descriptor */
    if ((sock = open_socket(ip)) == EXIT_FAILURE) {
        return EXIT_FAILURE;
    }
    /** Reading block until all files will not be received **/
    while (read_total(sock, &block_type, 1) == 1
           && block_type == BLOCK_FILE_START) {
        /** Reading file name **/
        const char *file_name = (const char *) read_data(sock, '\n', 0);
        /** Concatinating into file path **/
        char *file_path = fpath(file_name, directory);
        /** Reading file size **/
        off_t file_size = *((unsigned long *) read_data(sock, 0, 8));
        /** Opening file descriptor */
        if ((file = open_file(file_path, O_CREAT | O_WRONLY)) == EXIT_FAILURE) {
            return EXIT_FAILURE;
        }
        setup_bar(file_name, file_size);
        trans_cond = transfer_data(sock, file, 0, file_size);
        /** Closing streams **/
        close(file);
        /** Checking for transfer condition **/
        if (trans_cond == EXIT_FAILURE) {
            /** Nothing to do now **/
            break;
        }
        printf("\n");
    }
    /** Checking for transaction success **/
    if (trans_cond == EXIT_SUCCESS) {
        block_type = BLOCK_FILE_END;
        write_total(sock, &block_type, 1);
    }
    shutdown(sock, SHUT_RDWR);
    return trans_cond;
}