static gboolean up_sync_file(GFile* root, GFile* file, const gchar* remote_path) { GError *local_err = NULL; mega_node* node = mega_session_stat(s, remote_path); if (node) { g_printerr("ERROR: File already exists at %s\n", remote_path); return FALSE; } g_print("F %s\n", remote_path); if (!opt_dryrun) { if (!mega_session_put(s, remote_path, g_file_get_path(file), &local_err)) { if (!opt_noprogress) g_print("\r" ESC_CLREOL); g_printerr("ERROR: Upload failed for %s: %s\n", remote_path, local_err->message); g_clear_error(&local_err); return FALSE; } if (!opt_noprogress) g_print("\r" ESC_CLREOL); } return TRUE; }
int main(int ac, char* av[]) { mega_session* s; gc_error_free GError *local_err = NULL; GSList *l = NULL, *i; gint j; tool_init(&ac, &av, "- list files stored at mega.nz", entries); s = tool_start_session(); if (!s) return 1; // gather nodes if (ac == 1) { l = mega_session_ls_all(s); opt_names = FALSE; } else { if (ac > 2 || opt_recursive) opt_names = FALSE; for (j = 1; j < ac; j++) { gc_free gchar* path = tool_convert_filename(av[j], FALSE); mega_node* n = mega_session_stat(s, path); if (n && (n->type == MEGA_NODE_FILE || !opt_names)) l = g_slist_append(l, n); l = g_slist_concat(l, mega_session_ls(s, path, opt_recursive)); } } l = g_slist_sort(l, (GCompareFunc)compare_node); // export if requested if (opt_export && !mega_session_addlinks(s, l, &local_err)) { g_printerr("ERROR: Can't read links info from mega.nz: %s\n", local_err->message); g_slist_free(l); tool_fini(s); return 1; } if (l && opt_long && opt_header && !opt_export) { g_print("===================================================================================\n"); g_print("%-11s %-11s %-1s %13s %-19s %s\n", "Handle", "Owner", "T", "Size", "Mod. Date", opt_names ? "Filename" : "Path"); g_print("===================================================================================\n"); } for (i = l; i; i = i->next) { mega_node* n = i->data; gc_free gchar* node_path = mega_node_get_path_dup(n); if (opt_export) g_print("%73s ", n->link ? mega_node_get_link(n, TRUE) : ""); if (opt_long) { GDateTime* dt = g_date_time_new_from_unix_local(n->timestamp); gc_free gchar* time_str = g_date_time_format(dt, "%Y-%m-%d %H:%M:%S"); g_date_time_unref(dt); gc_free gchar* size_str = NULL; if (opt_human) size_str = n->size > 0 ? g_format_size_full(n->size, G_FORMAT_SIZE_IEC_UNITS) : g_strdup("-"); else size_str = n->size > 0 ? g_strdup_printf("%" G_GUINT64_FORMAT, n->size) : g_strdup("-"); g_print("%-11s %-11s %d %13s %19s %s\n", n->handle, n->user_handle ? n->user_handle : "", n->type, size_str, n->timestamp > 0 ? time_str : "", opt_names ? n->name : node_path ); } else g_print("%s\n", opt_names ? n->name : node_path); } g_slist_free(l); tool_fini(s); return 0; }
static gboolean up_sync_dir(GFile* root, GFile* file, const gchar* remote_path) { GError *local_err = NULL; GFileInfo* i; if (root != file) { mega_node* node = mega_session_stat(s, remote_path); if (node && node->type == MEGA_NODE_FILE) { g_printerr("ERROR: File already exists at %s\n", remote_path); return FALSE; } if (!node) { g_print("D %s\n", remote_path); if (!opt_dryrun) { if (!mega_session_mkdir(s, remote_path, &local_err)) { g_printerr("ERROR: Can't create remote directory %s: %s\n", remote_path, local_err->message); g_clear_error(&local_err); return FALSE; } } } } // sync children GFileEnumerator* e = g_file_enumerate_children(file, "standard::*", G_FILE_QUERY_INFO_NONE, NULL, &local_err); if (!e) { g_printerr("ERROR: Can't read local directory %s: %s\n", g_file_get_relative_path(root, file), local_err->message); g_clear_error(&local_err); return FALSE; } while ((i = g_file_enumerator_next_file(e, NULL, NULL))) { const gchar* name = g_file_info_get_name(i); GFile* child = g_file_get_child(file, name); GFileType type = g_file_query_file_type(child, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL); gchar* child_remote_path = g_strconcat(remote_path, "/", name, NULL); if (type == G_FILE_TYPE_DIRECTORY) { up_sync_dir(root, child, child_remote_path); } else if (type == G_FILE_TYPE_REGULAR) { up_sync_file(root, child, child_remote_path); } else { g_printerr("ERROR: Skipping file %s\n", g_file_get_relative_path(root, file)); } g_free(child_remote_path); g_object_unref(child); g_object_unref(i); } g_object_unref(e); return TRUE; }
int main(int ac, char* av[]) { tool_init(&ac, &av, "- synchronize local and remote mega.nz directories", entries); if (!opt_local_path || !opt_remote_path) { g_printerr("ERROR: You must specify local and remote paths\n"); return 1; } s = tool_start_session(); if (!s) { tool_fini(NULL); return 1; } mega_session_watch_status(s, status_callback, NULL); // check remote dir existence mega_node* remote_dir = mega_session_stat(s, opt_remote_path); if (!remote_dir) { g_printerr("ERROR: Remote directory not found %s\n", opt_remote_path); goto err0; } else if (!mega_node_is_container(remote_dir)) { g_printerr("ERROR: Remote path must be a folder: %s\n", opt_remote_path); goto err0; } // check local dir existence GFile* local_file = g_file_new_for_path(opt_local_path); if (opt_download) { dl_sync_dir(remote_dir, local_file, opt_remote_path); } else { if (g_file_query_file_type(local_file, 0, NULL) != G_FILE_TYPE_DIRECTORY) { g_printerr("ERROR: Local directory not found %s\n", opt_local_path); goto err1; } up_sync_dir(local_file, local_file, opt_remote_path); mega_session_save(s, NULL); } g_object_unref(local_file); tool_fini(s); return 0; err1: g_object_unref(local_file); err0: tool_fini(s); return 1; }
int main(int ac, char* av[]) { gc_error_free GError *local_err = NULL; mega_session* s; tool_init(&ac, &av, "- move files on the remote filesystem at mega.nz", entries); if (ac < 3) { g_printerr("ERROR: You must specify both source path(s) and destination path"); return 1; } s = tool_start_session(); if (!s) return 1; gboolean rename = FALSE; gc_free gchar* dest = tool_convert_filename(av[ac - 1], FALSE); // check destination path mega_node* destination = mega_session_stat(s, dest); if (destination) { if (destination->type == MEGA_NODE_FILE) { gc_free gchar* path = mega_node_get_path_dup(destination); g_printerr("Destination file already exists: %s", path); goto err; } if (!mega_node_is_writable(s, destination) || destination->type == MEGA_NODE_NETWORK || destination->type == MEGA_NODE_CONTACT) { gc_free gchar* path = mega_node_get_path_dup(destination); g_printerr("You can't move files into: %s", path); goto err; } } else { rename = TRUE; gc_free gchar* parent_path = g_path_get_dirname(dest); destination = mega_session_stat(s, parent_path); if (!destination) { g_printerr("Destination directory doesn't exist: %s", parent_path); goto err; } if (destination->type == MEGA_NODE_FILE) { gc_free gchar* path = mega_node_get_path_dup(destination); g_printerr("Destination is not directory: %s", path); goto err; } if (!mega_node_is_writable(s, destination) || destination->type == MEGA_NODE_NETWORK || destination->type == MEGA_NODE_CONTACT) { gc_free gchar* path = mega_node_get_path_dup(destination); g_printerr("You can't move files into: %s", path); goto err; } } if (rename && ac > 3) { g_printerr("You can't use multiple source paths when renaming file or directory"); goto err; } // enumerate source paths gint i; for (i = 1; i < ac - 1; i++) { gc_free gchar* path = tool_convert_filename(av[i], FALSE); mega_node* n = mega_session_stat(s, path); if (!n) { g_printerr("Source file doesn't exists: %s", path); goto err; } if (n->type != MEGA_NODE_FILE && n->type != MEGA_NODE_FOLDER) { g_printerr("Source is not movable: %s", path); goto err; } // check destination gc_free gchar* n_path = mega_node_get_path_dup(n); gc_free gchar* destination_path = mega_node_get_path_dup(destination); gc_free gchar* basename = g_path_get_basename(n_path); gc_free gchar* tmp = g_strconcat(destination_path, "/", basename, NULL); // check destination path mega_node* dn = mega_session_stat(s, tmp); if (dn) { gc_free gchar* dn_path = mega_node_get_path_dup(dn); g_printerr("Destination file already exists: %s", dn_path); goto err; } // perform move //if (!mega_session_mkdir(s, path, &local_err)) //{ //g_printerr("ERROR: Can't create directory %s: %s\n", path, local_err->message); //g_clear_error(&local_err); //} g_print("mv %s %s/%s\n", n_path, destination_path, tmp); } mega_session_save(s, NULL); tool_fini(s); return 0; err: tool_fini(s); return 1; }