Skip to content

Commit

Permalink
cgi json command
Browse files Browse the repository at this point in the history
  • Loading branch information
himekifee committed Aug 23, 2022
1 parent 517ee9f commit f43cc97
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 20 deletions.
6 changes: 4 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ endif ()
add_compile_definitions(DB_BACKEND="${WITH_DB_BACKEND}")
target_link_libraries(_duc_lib_stub INTERFACE ${DB_BACKEND_LIB})

find_package(cJSON REQUIRED)


set(LIB_DUC_SOURCE
src/libduc/buffer.c
Expand All @@ -133,7 +135,7 @@ set(LIB_DUC_SOURCE
src/libduc/uthash.h
src/libduc/utlist.h
src/libduc/utstring.h
)
src/libduc/dir.h)

set(DUC_GLAD_SOURCE
src/glad/glad.c
Expand Down Expand Up @@ -175,4 +177,4 @@ file(WRITE ${CMAKE_BINARY_DIR}/config.h) # Empty. Make include happy
include_directories(src/libduc src/libduc-graph src/glad)

add_executable(duc ${LIB_DUC_SOURCE} ${DUC_GLAD_SOURCE} ${LIB_DUC_GRAPH_SOURCE} ${DUC_SOURCE})
target_link_libraries(duc PRIVATE dl m duc::LinkedLibs)
target_link_libraries(duc PRIVATE dl m duc::LinkedLibs cjson)
64 changes: 63 additions & 1 deletion src/duc/cmd-cgi.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
#include <unistd.h>
#include <libgen.h>
#include <ctype.h>
#include <cjson/cJSON.h>

#include "cmd.h"
#include "duc.h"
#include "duc-graph.h"
#include "dir.h"


struct param {
Expand Down Expand Up @@ -102,7 +104,7 @@ static int hexdigit(char a)


void decode_uri(char *src, char *dst)
{
{
char a, b;
while (*src) {
if((*src == '%') && ((a = src[1]) && (b = src[2])) && (isxdigit(a) && isxdigit(b))) {
Expand Down Expand Up @@ -477,6 +479,61 @@ void do_tooltip(duc *duc, duc_graph *graph, duc_dir *dir)
}
}

cJSON *dump_json(duc *duc, duc_dir *dir, int depth, off_t min_size, int ex_files) {
struct duc_dirent *e;
cJSON *self = cJSON_CreateObject();
cJSON *children = cJSON_CreateArray();

struct duc_size size;
duc_dir_get_size(dir, &size);

cJSON_AddStringToObject(self, "name", basename(dir->path));
cJSON_AddNumberToObject(self, "count", size.count);
cJSON_AddNumberToObject(self, "size_apparent", size.apparent);
cJSON_AddNumberToObject(self, "size_actual", size.actual);

duc_size_type st = opt_apparent ? DUC_SIZE_TYPE_APPARENT : DUC_SIZE_TYPE_ACTUAL;

while ((e = duc_dir_read(dir, DUC_SIZE_TYPE_ACTUAL, DUC_SORT_SIZE)) != NULL)
{

off_t size = duc_get_size(&e->size, st);

if (e->type == DUC_FILE_TYPE_DIR && size >= min_size)
{
duc_dir *dir_child = duc_dir_openent(dir, e);
if (dir_child)
{
cJSON *subdir = dump_json(duc, dir_child, depth--, min_size, ex_files);
cJSON_AddItemToArray(children, subdir);
}
duc_dir_close(dir_child);
}
else
{
if (!ex_files && size >= min_size)
{
cJSON *file = cJSON_CreateObject();
cJSON_AddStringToObject(file, "name", e->name);
cJSON_AddNumberToObject(file, "size_apparent", e->size.apparent);
cJSON_AddNumberToObject(file, "size_actual", e->size.actual);
cJSON_AddItemToArray(children, file);
}
}
}

cJSON_AddItemToObject(self, "children", children);
return self;
}

void do_json(duc *duc, duc_dir *dir) {
cJSON *json = dump_json(duc, dir, 4, 0, false);
char *out = cJSON_Print(json);
printf("%s", out);
free(out);
cJSON_Delete(json);
}


static int cgi_main(duc *duc, int argc, char **argv)
{
Expand Down Expand Up @@ -514,6 +571,11 @@ static int cgi_main(duc *duc, int argc, char **argv)
}
}

if (strcmp(cmd, "json") == 0) {
do_json(duc, dir);
return 0;
}

static enum duc_graph_palette palette = 0;

if(opt_palette) {
Expand Down
18 changes: 1 addition & 17 deletions src/libduc/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,14 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>
#include <libgen.h>

#include "duc.h"
#include "db.h"
#include "buffer.h"
#include "private.h"


struct duc_dir {
struct duc *duc;
struct duc_devino devino;
struct duc_devino devino_parent;
time_t mtime;
char *path;
struct duc_dirent *ent_list;
struct duc_size size;
size_t ent_cur;
size_t ent_count;
size_t ent_pool;
duc_size_type size_type;
duc_sort sort;
};
#include "dir.h"


struct duc_dir *duc_dir_new(struct duc *duc, const struct duc_devino *devino)
Expand Down
23 changes: 23 additions & 0 deletions src/libduc/dir.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//
// Created by grider on 22-8-22.
//

#ifndef DUC_DIR_H
#define DUC_DIR_H

struct duc_dir {
struct duc *duc;
struct duc_devino devino;
struct duc_devino devino_parent;
time_t mtime;
char *path;
struct duc_dirent *ent_list;
struct duc_size size;
size_t ent_cur;
size_t ent_count;
size_t ent_pool;
duc_size_type size_type;
duc_sort sort;
};

#endif //DUC_DIR_H

0 comments on commit f43cc97

Please sign in to comment.