~ruther/CTU-FEE-B0B35APO-Semestral-project

8b7f377702bd0f7ff8ac422f67c668309d515975 — František Boháček 4 years ago a9aa5ba
feat: add extern device access
A file-browser/include/device_mount.h => file-browser/include/device_mount.h +12 -0
@@ 0,0 1,12 @@
#ifndef __MOUNT_UTILS_H__
#define __MOUNT_UTILS_H__

#include <sys/mount.h>
#include "file_access.h"

file_operation_error_t device_mount(char *device, char *target);
file_operation_error_t device_umount(char *device, char *target);

char *device_mount_get_filesystem(char *device);

#endif // __MOUNT_UTILS_H__

A file-browser/include/extern_file_access.h => file-browser/include/extern_file_access.h +31 -0
@@ 0,0 1,31 @@
#ifndef __EXTERN_FILE_ACCESS_H__
#define __EXTERN_FILE_ACCESS_H__

#include "file_access.h"

fileaccess_state_t extern_fileaccess_init_state(void *data);
bool extern_fileaccess_deinit_state(fileaccess_state_t state);

directory_or_error_t extern_fileaccess_directory_list(fileaccess_state_t state,
                                                     char *path);
directory_or_error_t extern_fileaccess_root_list(fileaccess_state_t state);

directory_or_error_t extern_fileaccess_directory_create(fileaccess_state_t state,
                                                       char *path);
file_operation_error_t
extern_fileaccess_directory_delete(fileaccess_state_t state, char *path);

file_operation_error_t
extern_fileaccess_directory_close(fileaccess_state_t state,
                                 directory_t *directory);

file_operation_error_t
extern_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file,
                                    char *mime);
executing_file_or_error_t
extern_fileaccess_file_execute(fileaccess_state_t state, file_t *file,
                              char *args);
file_operation_error_t extern_fileaccess_file_delete(fileaccess_state_t state,
                                                    char *path);

#endif __EXTERN_FILE_ACCESS_H__

A file-browser/src/extern_file_access.c => file-browser/src/extern_file_access.c +148 -0
@@ 0,0 1,148 @@
#include "extern_file_access.h"
#include "device_mount.h"
#include "local_file_access.h"
#include <stdlib.h>
#include <string.h>

static bool extern_fileaccess_check_mount(fileaccess_state_t state) {
  return true;
}

fileaccess_state_t extern_fileaccess_init_state(void *data) {
  size_t device_length = strlen(data);

  extern_fileaccess_state_t externstate = {.path = "/mnt/file_browser_device",
                                           .mount_device = NULL,
                                           .mounted = false,
                                           .error = FILOPER_SUCCESS};

  char *malloced = malloc(sizeof(char) * (device_length + 1));
  if (malloced == NULL) {
    externstate.error = FILOPER_UNKNOWN;
  } else {
    strcpy(malloced, data);
    externstate.mount_device = malloced;
  }

  externstate.error = device_mount(externstate.mount_device, externstate.path);

  fileaccess_state_t state = {
      .fileaccess = &extern_file_access,
      .payload.exter = externstate,
  };

  return state;
}

bool extern_fileaccess_deinit_state(fileaccess_state_t state) {
  // unmount
  state.payload.exter.error =
      device_umount(state.payload.exter.mount_device, state.payload.exter.path);
  free(state.payload.exter.mount_device);

  return true;
}

directory_or_error_t extern_fileaccess_directory_list(fileaccess_state_t state,
                                                      char *path) {
  if (!extern_fileaccess_check_mount(state)) {
    directory_or_error_t error = {.error = true,
                                  .payload.error = FILOPER_UNKNOWN};

    return error;
  }

  return local_fileaccess_directory_list(state, path);
}

directory_or_error_t extern_fileaccess_root_list(fileaccess_state_t state) {
  if (!extern_fileaccess_check_mount(state)) {
    directory_or_error_t error = {.error = true,
                                  .payload.error = FILOPER_UNKNOWN};

    return error;
  }

  return local_fileaccess_root_list(state);
}

directory_or_error_t
extern_fileaccess_directory_create(fileaccess_state_t state, char *path) {
  if (!extern_fileaccess_check_mount(state)) {
    directory_or_error_t error = {.error = true,
                                  .payload.error = FILOPER_UNKNOWN};

    return error;
  }

  return local_fileaccess_directory_create(state, path);
}

file_operation_error_t
extern_fileaccess_directory_delete(fileaccess_state_t state, char *path) {
  if (!extern_fileaccess_check_mount(state)) {
    return FILOPER_UNKNOWN;
  }

  return local_fileaccess_directory_delete(state, path);
}

file_operation_error_t
extern_fileaccess_directory_close(fileaccess_state_t state,
                                  directory_t *directory) {
  if (!extern_fileaccess_check_mount(state)) {
    return FILOPER_UNKNOWN;
  }

  return local_fileaccess_directory_close(state, directory);
}

file_operation_error_t
extern_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file,
                                     char *mime) {
  if (!extern_fileaccess_check_mount(state)) {
    return FILOPER_UNKNOWN;
  }

  return local_fileaccess_file_get_mime_type(state, file, mime);
}

executing_file_or_error_t
extern_fileaccess_file_execute(fileaccess_state_t state, file_t *file,
                               char *args) {
  if (!extern_fileaccess_check_mount(state)) {
    executing_file_or_error_t error = {.error = true,
                                       .payload.error = FILOPER_UNKNOWN};

    return error;
  }

  return local_fileaccess_file_execute(state, file, args);
}

file_operation_error_t extern_fileaccess_file_delete(fileaccess_state_t state,
                                                     char *path) {
  if (!extern_fileaccess_check_mount(state)) {
    return FILOPER_UNKNOWN;
  }

  return local_fileaccess_file_delete(state, path);
}

const fileaccess_t temp_file_access = {
    .type = FA_EXTERN,
    .init = extern_fileaccess_init_state,
    .deinit = extern_fileaccess_deinit_state,

    .delete_file = extern_fileaccess_file_delete,
    .execute_file = extern_fileaccess_file_execute,
    .get_mime_type = extern_fileaccess_file_get_mime_type,

    .list_directory = extern_fileaccess_directory_list,
    .close_directory = extern_fileaccess_directory_close,
    .create_directory = extern_fileaccess_directory_create,
    .delete_directory = extern_fileaccess_directory_delete,

    .list_root = extern_fileaccess_root_list,

};