int do_list_paths(FILE *input, print_flags pflags) { int path_count = 0; int error_count = 0; rodsEnv env; rcComm_t *conn = rods_login(&env); if (!conn) goto error; size_t jflags = JSON_DISABLE_EOF_CHECK | JSON_REJECT_DUPLICATES; while (!feof(input)) { json_error_t load_error; json_t *target = json_loadf(input, jflags, &load_error); if (!target) { if (!feof(input)) { log(ERROR, "JSON error at line %d, column %d: %s", load_error.line, load_error.column, load_error.text); } continue; } baton_error_t path_error; char *path = json_to_path(target, &path_error); path_count++; if (path_error.code != 0) { error_count++; add_error_value(target, &path_error); print_json(target); } else { rodsPath_t rods_path; int status = resolve_rods_path(conn, &env, &rods_path, path); if (status < 0) { error_count++; set_baton_error(&path_error, status, "Failed to resolve path '%s'", path); add_error_value(target, &path_error); print_json(target); } else { baton_error_t error; json_t *results = list_path(conn, &rods_path, pflags, &error); if (error.code != 0) { error_count++; add_error_value(target, &error); print_json(target); } else { print_json(results); json_decref(results); } } if (rods_path.rodsObjStat) free(rods_path.rodsObjStat); } if (unbuffered_flag) fflush(stdout); json_decref(target); free(path); } // while rcDisconnect(conn); log(DEBUG, "Processed %d paths with %d errors", path_count, error_count); return error_count; error: if (conn) rcDisconnect(conn); log(ERROR, "Processed %d paths with %d errors", path_count, error_count); return 1; }
int do_modify_permissions(FILE *input, recursive_op recurse, option_flags oflags) { int item_count = 0; int error_count = 0; rodsEnv env; rcComm_t *conn = rods_login(&env); if (!conn) goto error; while (!feof(input)) { size_t flags = JSON_DISABLE_EOF_CHECK | JSON_REJECT_DUPLICATES; json_error_t load_error; json_t *target = json_loadf(input, flags, &load_error); if (!target) { if (!feof(input)) { logmsg(ERROR, "JSON error at line %d, column %d: %s", load_error.line, load_error.column, load_error.text); } continue; } item_count++; if (!json_is_object(target)) { logmsg(ERROR, "Item %d in stream was not a JSON object; skipping", item_count); error_count++; json_decref(target); continue; } baton_error_t path_error; char *path = json_to_path(target, &path_error); if (add_error_report(target, &path_error)) { error_count++; } else { json_t *perms = json_object_get(target, JSON_ACCESS_KEY); if (!json_is_array(perms)) { error_count++; set_baton_error(&path_error, -1, "Permissions data for %s is not in " "a JSON array", path); add_error_report(target, &path_error); } else { rodsPath_t rods_path; resolve_rods_path(conn, &env, &rods_path, path, oflags, &path_error); if (add_error_report(target, &path_error)) { error_count++; } else { for (size_t i = 0; i < json_array_size(perms); i++) { json_t *perm = json_array_get(perms, i); baton_error_t mod_error; modify_json_permissions(conn, &rods_path, recurse, perm, &mod_error); if (add_error_report(target, &mod_error)) { error_count++; } } if (rods_path.rodsObjStat) free(rods_path.rodsObjStat); } } } print_json(target); if (unbuffered_flag) fflush(stdout); json_decref(target); if (path) free(path); } // while rcDisconnect(conn); if (error_count > 0) { logmsg(WARN, "Processed %d items with %d errors", item_count, error_count); } else { logmsg(DEBUG, "Processed %d items with %d errors", item_count, error_count); } return error_count; error: if (conn) rcDisconnect(conn); logmsg(ERROR, "Processed %d items with %d errors", item_count, error_count); return 1; }
int do_search_metadata(FILE *input, char *zone_name, option_flags oflags) { int item_count = 0; int error_count = 0; rodsEnv env; rcComm_t *conn = rods_login(&env); if (!conn) goto error; while (!feof(input)) { size_t jflags = JSON_DISABLE_EOF_CHECK | JSON_REJECT_DUPLICATES; json_error_t load_error; json_t *target = json_loadf(input, jflags, &load_error); if (!target) { if (!feof(input)) { logmsg(ERROR, "JSON error at line %d, column %d: %s", load_error.line, load_error.column, load_error.text); } continue; } item_count++; if (!json_is_object(target)) { logmsg(ERROR, "Item %d in stream was not a JSON object; skipping", item_count); error_count++; json_decref(target); continue; } json_t *results = NULL; if (has_collection(target)) { baton_error_t resolve_error; resolve_collection(target, conn, &env, oflags, &resolve_error); if (add_error_report(target, &resolve_error)) { error_count++; } else { baton_error_t search_error; results = search_metadata(conn, target, zone_name, oflags, &search_error); if (add_error_report(target, &search_error)) { error_count++; print_json(target); } else { print_json(results); } } } else { baton_error_t search_error; results = search_metadata(conn, target, zone_name, oflags, &search_error); if (add_error_report(target, &search_error)) { error_count++; print_json(target); } else { print_json(results); } } if (unbuffered_flag) fflush(stdout); if (results) json_decref(results); json_decref(target); } // while rcDisconnect(conn); if (error_count > 0) { logmsg(WARN, "Processed %d items with %d errors", item_count, error_count); } else { logmsg(DEBUG, "Processed %d items with %d errors", item_count, error_count); } return error_count; error: if (conn) rcDisconnect(conn); logmsg(ERROR, "Processed %d items with %d errors", item_count, error_count); return 1; }