diff --git a/Makefile b/Makefile index c988b98..d49b08d 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ VERSION = 1.0.0 PREFIX = /usr # Linux PREFIX = /usr/local # BSD MANPREFIX = ${PREFIX}/share/man -SRC = main.c +SRC = main.c stringex.c prep.c pager.c srv.c HDR = config.h OBJ = ${SRC:.c=.o} CC = cc @@ -12,7 +12,7 @@ STD = c99 # Linux #INCS = -I LIBS = -lcurl -CPPFLAGS = -DVERSION=\"${VERSION}\" +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_POSIX_C_SOURCE=200809L CFLAGS = -std=${STD} -Os ${INCS} ${CPPFLAGS} LDFLAGS = ${LIBS} diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..54ee352 Binary files /dev/null and b/favicon.ico differ diff --git a/git.png b/git.png new file mode 100644 index 0000000..df3afde Binary files /dev/null and b/git.png differ diff --git a/main.c b/main.c index 7f1ae9d..a0e6346 100644 --- a/main.c +++ b/main.c @@ -1,142 +1,17 @@ #include #include #include -#include -#include -#include -//#include #include -//#include -#include -// http -// regex + +#include "prep.h" +#include "pager.h" +#include "srv.h" // http://かhttps://で始まるかどうか bool checkprefix (const char *url) { return strncmp("http://", url, 7) == 0 || strncmp("https://", url, 8) == 0; } -void mkdirs (char *path, int perm) { - char **res = NULL; - char *subpath = strtok(path, "/"); - int nsla = 0, i; - - while (subpath) { - res = realloc(res, sizeof(char*) * ++nsla); - if (res == NULL) exit(-1); - res[nsla-1] = subpath; - subpath = strtok(NULL, "/"); - } - - res = realloc (res, sizeof (char*) * (nsla+1)); - res[nsla] = 0; - - for (i = 0; i < (nsla+1); ++i) { - mkdir(res[i], perm); - chdir(res[i]); - } - - free(res); -} - -char *preparepage (char *url) { - // URLは「/」で終わなければ、追加 - char *ext = url + strlen(url)-1; - char surl[strlen(url)+1]; - strncpy(surl, url, sizeof(surl)); - if (!strcmp(ext, "/") == 0) { - strcat(surl, "/"); - } - else { - strcat(surl, ""); - } - - // タイムスタンプ - int timestamp = time(NULL); - char strtimestamp[10]; - - // パス - int sublen; - if (strncmp("http://", url, 7) == 0) sublen = 6; - else if (strncmp("https://", url, 8) == 0) sublen = 7; - int reslen = strlen(surl); - char nurl[reslen]; - int j = 0; - int i = 0; - - while (surl[i] != '\0') { - i++; - if (i >= sublen) { - nurl[j] = surl[i]; - j++; - } - } - - // タイムスタンプはintからchar *に交換 - sprintf(strtimestamp, "%d", timestamp); - - // パスの創作 - char *path = malloc(strlen("archive/") + strlen(strtimestamp) + strlen(nurl)); - strcpy(path, "archive/"); - strcat(path, strtimestamp); - strcat(path, nurl); - - // フォルダの創作 - char mpath[strlen(path)]; - strcpy(mpath, path); - mkdirs(mpath, 0755); - - return(path); -} - -// TODO -void scanpage (char *url) {} - -int getpage (char *url, char *path) { - char fpath[strlen(path) + strlen("index.html")]; - strcpy(fpath, path); - strcat(fpath, "index.html"); - //strncpy(fpath, path, sizeof(fpath)); - //strncat(fpath, "index.html", sizeof(fpath)); - printf("FPATH: %s\n", fpath); - FILE* file = fopen(fpath, "w"); - CURL* curl = curl_easy_init(); - CURLcode curlres; - - // ウェブページを読み込む - if (curl) { - // CURLの実行 - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); - - // リターンコード - curlres = curl_easy_perform(curl); - - // エラーの確認 - if (curlres != CURLE_OK) { - fprintf(stderr, "curl_easy_perform()の実行に失敗しました。 %s\n", curl_easy_strerror(curlres)); - return(-1); - } - - // 掃除 - curl_easy_cleanup(curl); - - // TODO: JS、動画等の削除 - // TODO: CSS、画像等ファイルのダウンロード - // TODO: 全部/usr/(local/)share/hozonsite/archiveに保存する - - return(0); - } - - return(-1); -} - -// TODO -void startsrv (int port) { - printf("http://127.0.0.1:%d でサーバーを実行中。終了するには、CTRL+Cを押して下さい。\n", port); -} - int main (int argc, char *argv[]) { if (argc == 2) { if (!strcmp("-v", argv[1])) { @@ -149,9 +24,9 @@ int main (int argc, char *argv[]) { } else { if (checkprefix(argv[1]) == 1) { - printf("archive\n"); - char * path = preparepage(argv[1]); - getpage(argv[1], path); + char * path = preparepage(argv[1]); // mkdir等 + getpage(argv[1], path); // ページの保存 + scanpage(argv[1], path); free(path); } else { diff --git a/pager.c b/pager.c new file mode 100644 index 0000000..23bfe26 --- /dev/null +++ b/pager.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include + +#include "stringex.h" + +char* scanurl (char *url, int resnum) { + char *res; + char *pch; + int i = 0; + pch = strtok(url, ":/"); + + while (pch != NULL) { + i++; + if (i == resnum) res = pch; + pch = strtok(NULL, ":/"); + } + + return(res); +} + +// TODO +// TODO: 画像等ファイルのダウンロード +// TODO: JS、動画等の削除 +// TODO: 全部/usr/(local/)share/hozonsite/archiveに保存する +void scanpage (char *url, char *path) { + chdir(path); + FILE *file = fopen("index.html", "r"); + char line[2000]; + char *furl = url; + + // URLの修正 + char *rurl = scanurl(url, 2); + + while (fgets(line, sizeof(line), file)) { + // TODO: JS + if (strstr(line, ".js")) { + printf("JS: %s\n", line); + } + if (strstr(line, " +#include +#include +#include +#include +#include + +void mkdirs (char *path, int perm) { + char **res = NULL; + char *subpath = strtok(path, "/"); + int n = 0, i; + + while (subpath) { + res = realloc(res, sizeof(char*) * ++n); + if (res == NULL) exit(-1); + res[n-1] = subpath; + subpath = strtok(NULL, "/"); + } + + res = realloc(res, sizeof (char*) * (n+1)); + res[n] = 0; + + for (i = 0; i < (n+1); ++i) { + mkdir(res[i], perm); + chdir(res[i]); + } + + free(res); +} + +char *preparepage (char *url) { + // URLは「/」で終わなければ、追加 + char *ext = url + strlen(url)-1; + char surl[strlen(url)+1]; + strncpy(surl, url, sizeof(surl)); + if (!strcmp(ext, "/") == 0) { + strcat(surl, "/"); + } + else { + strcat(surl, ""); + } + + // タイムスタンプ + int timestamp = time(NULL); + char strtimestamp[10]; + + // パス + int sublen; + if (strncmp("http://", url, 7) == 0) sublen = 6; + else if (strncmp("https://", url, 8) == 0) sublen = 7; + int reslen = strlen(surl); + char nurl[reslen]; + int j = 0; + int i = 0; + + while (surl[i] != '\0') { + i++; + if (i >= sublen) { + nurl[j] = surl[i]; + j++; + } + } + + // タイムスタンプはintからchar *に交換 + sprintf(strtimestamp, "%d", timestamp); + + // パスの創作 + char *path = malloc(strlen("archive/") + strlen(strtimestamp) + strlen(nurl)); + strcpy(path, "archive/"); + strcat(path, strtimestamp); + strcat(path, nurl); + + // フォルダの創作 + char mpath[strlen(path)]; + strcpy(mpath, path); + mkdirs(mpath, 0755); + + return(path); +} diff --git a/prep.h b/prep.h new file mode 100644 index 0000000..54bf161 --- /dev/null +++ b/prep.h @@ -0,0 +1,7 @@ +#ifndef PREP_H +#define PREP_H + +void mkdirs (char *path, int perm); +char *preparepage (char *url); + +#endif diff --git a/srv.c b/srv.c new file mode 100644 index 0000000..c8583f6 --- /dev/null +++ b/srv.c @@ -0,0 +1,6 @@ +#include + +// TODO +void startsrv (int port) { + printf("http://127.0.0.1:%d でサーバーを実行中。終了するには、CTRL+Cを押して下さい。\n", port); +} diff --git a/srv.h b/srv.h new file mode 100644 index 0000000..97107d7 --- /dev/null +++ b/srv.h @@ -0,0 +1,6 @@ +#ifndef SRV_H +#define SRV_H + +void startsrv (int port); + +#endif diff --git a/stringex.c b/stringex.c new file mode 100644 index 0000000..d0d21f5 --- /dev/null +++ b/stringex.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +#include "stringex.h" + +bool str_begin (const char *a, const char *b) { + return strncmp(a, b, strlen(b)) == 0; +} + +char* str_split (char *str) { + char *res; + char *pch; + pch = strtok(str, " <>"); + while (pch != NULL) { + if (str_begin(pch, "href=")) { + char *pch2; + pch2 = strtok(pch, "=\"'"); + + while (pch2 != NULL) { + if (pch2 != "href") { + res = pch2; + } + pch2 = strtok(NULL, "=\"'"); + } + } + pch = strtok(NULL, " <>"); + } + + return(res); +} diff --git a/stringex.h b/stringex.h new file mode 100644 index 0000000..e01a591 --- /dev/null +++ b/stringex.h @@ -0,0 +1,9 @@ +#ifndef STRINGEX_H +#define STRINGEX_H + +#include + +bool str_begin (const char *a, const char *b); +char* str_split(char *a_str); + +#endif