at work
This commit is contained in:
45
Makefile
45
Makefile
@@ -219,19 +219,19 @@ distuninstallcheck_listfiles = find . -type f -print
|
|||||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||||
distcleancheck_listfiles = find . -type f -print
|
distcleancheck_listfiles = find . -type f -print
|
||||||
ACLOCAL = ${SHELL} /home/ziggi/Projects/jcomp/missing aclocal
|
ACLOCAL = ${SHELL} /home/ziggi/Projects/cworker/missing aclocal
|
||||||
AMTAR = $${TAR-tar}
|
AMTAR = $${TAR-tar}
|
||||||
AM_DEFAULT_VERBOSITY = 1
|
AM_DEFAULT_VERBOSITY = 1
|
||||||
APP_CACHEDIR = /home/ziggi/Projects/jcomp/cache
|
APP_CACHEDIR = /home/ziggi/Projects/cworker/cache
|
||||||
APP_CONFIGDIR = /home/ziggi/Projects/jcomp/
|
APP_CONFIGDIR = /home/ziggi/Projects/cworker/
|
||||||
APP_DATABASEDIR = /home/ziggi/Projects/jcomp/data
|
APP_DATABASEDIR = /home/ziggi/Projects/cworker/data
|
||||||
APP_LIBDIR = /home/ziggi/Projects/jcomp/lib
|
APP_LIBDIR = /home/ziggi/Projects/cworker/lib
|
||||||
APP_LOGDIR = /home/ziggi/Projects/jcomp/log
|
APP_LOGDIR = /home/ziggi/Projects/cworker/log
|
||||||
APP_RUNDIR = /home/ziggi/Projects/jcomp/run
|
APP_RUNDIR = /home/ziggi/Projects/cworker/run
|
||||||
APP_USER = ziggi
|
APP_USER = ziggi
|
||||||
AUTOCONF = ${SHELL} /home/ziggi/Projects/jcomp/missing autoconf
|
AUTOCONF = ${SHELL} /home/ziggi/Projects/cworker/missing autoconf
|
||||||
AUTOHEADER = ${SHELL} /home/ziggi/Projects/jcomp/missing autoheader
|
AUTOHEADER = ${SHELL} /home/ziggi/Projects/cworker/missing autoheader
|
||||||
AUTOMAKE = ${SHELL} /home/ziggi/Projects/jcomp/missing automake
|
AUTOMAKE = ${SHELL} /home/ziggi/Projects/cworker/missing automake
|
||||||
AWK = gawk
|
AWK = gawk
|
||||||
CC = clang
|
CC = clang
|
||||||
CCDEPMODE = depmode=none
|
CCDEPMODE = depmode=none
|
||||||
@@ -255,7 +255,7 @@ LDFLAGS =
|
|||||||
LIBOBJS =
|
LIBOBJS =
|
||||||
LIBS =
|
LIBS =
|
||||||
LTLIBOBJS =
|
LTLIBOBJS =
|
||||||
MAKEINFO = ${SHELL} /home/ziggi/Projects/jcomp/missing makeinfo
|
MAKEINFO = ${SHELL} /home/ziggi/Projects/cworker/missing makeinfo
|
||||||
MKDIR_P = /usr/local/bin/gmkdir -p
|
MKDIR_P = /usr/local/bin/gmkdir -p
|
||||||
OBJEXT = o
|
OBJEXT = o
|
||||||
PACKAGE = cworker
|
PACKAGE = cworker
|
||||||
@@ -271,23 +271,23 @@ SHELL = /bin/sh
|
|||||||
STRIP =
|
STRIP =
|
||||||
VALGRIND = /usr/local/bin/valgrind
|
VALGRIND = /usr/local/bin/valgrind
|
||||||
VERSION = 0.0.1
|
VERSION = 0.0.1
|
||||||
abs_builddir = /home/ziggi/Projects/jcomp
|
abs_builddir = /home/ziggi/Projects/cworker
|
||||||
abs_srcdir = /home/ziggi/Projects/jcomp
|
abs_srcdir = /home/ziggi/Projects/cworker
|
||||||
abs_top_builddir = /home/ziggi/Projects/jcomp
|
abs_top_builddir = /home/ziggi/Projects/cworker
|
||||||
abs_top_srcdir = /home/ziggi/Projects/jcomp
|
abs_top_srcdir = /home/ziggi/Projects/cworker
|
||||||
ac_ct_CC = clang
|
ac_ct_CC = clang
|
||||||
am__include = include
|
am__include = include
|
||||||
am__leading_dot = .
|
am__leading_dot = .
|
||||||
am__quote =
|
am__quote =
|
||||||
am__tar = $${TAR-tar} chof - "$$tardir"
|
am__tar = $${TAR-tar} chof - "$$tardir"
|
||||||
am__untar = $${TAR-tar} xf -
|
am__untar = $${TAR-tar} xf -
|
||||||
app_cachedir = /home/ziggi/Projects/jcomp/cache
|
app_cachedir = /home/ziggi/Projects/cworker/cache
|
||||||
app_configdir = /home/ziggi/Projects/jcomp/
|
app_configdir = /home/ziggi/Projects/cworker/
|
||||||
app_databasedir = /home/ziggi/Projects/jcomp/data
|
app_databasedir = /home/ziggi/Projects/cworker/data
|
||||||
app_libdir = /home/ziggi/Projects/jcomp/lib
|
app_libdir = /home/ziggi/Projects/cworker/lib
|
||||||
app_logdir = /home/ziggi/Projects/jcomp/log
|
app_logdir = /home/ziggi/Projects/cworker/log
|
||||||
app_name = cworker
|
app_name = cworker
|
||||||
app_rundir = /home/ziggi/Projects/jcomp/run
|
app_rundir = /home/ziggi/Projects/cworker/run
|
||||||
app_user = ziggi
|
app_user = ziggi
|
||||||
bindir = ${exec_prefix}/bin
|
bindir = ${exec_prefix}/bin
|
||||||
build = amd64-unknown-freebsd12.4
|
build = amd64-unknown-freebsd12.4
|
||||||
@@ -309,7 +309,7 @@ host_vendor = unknown
|
|||||||
htmldir = ${docdir}
|
htmldir = ${docdir}
|
||||||
includedir = ${prefix}/include
|
includedir = ${prefix}/include
|
||||||
infodir = ${datarootdir}/info
|
infodir = ${datarootdir}/info
|
||||||
install_sh = ${SHELL} /home/ziggi/Projects/jcomp/install-sh
|
install_sh = ${SHELL} /home/ziggi/Projects/cworker/install-sh
|
||||||
libdir = ${exec_prefix}/lib
|
libdir = ${exec_prefix}/lib
|
||||||
libexecdir = ${exec_prefix}/libexec
|
libexecdir = ${exec_prefix}/libexec
|
||||||
localedir = ${datarootdir}/locale
|
localedir = ${datarootdir}/locale
|
||||||
@@ -895,6 +895,7 @@ valgrind: $(bin_TESTS)
|
|||||||
clean-local:
|
clean-local:
|
||||||
rm -rf autom4te.cache
|
rm -rf autom4te.cache
|
||||||
rm -rf *~
|
rm -rf *~
|
||||||
|
rm -rf run log
|
||||||
|
|
||||||
#install-data-local:
|
#install-data-local:
|
||||||
# test -z $(DESTDIR)$(APP_LIBDIR) || $(MKDIR_P) $(DESTDIR)$(APP_LIBDIR)
|
# test -z $(DESTDIR)$(APP_LIBDIR) || $(MKDIR_P) $(DESTDIR)$(APP_LIBDIR)
|
||||||
|
|||||||
@@ -895,6 +895,7 @@ valgrind: $(bin_TESTS)
|
|||||||
clean-local:
|
clean-local:
|
||||||
rm -rf autom4te.cache
|
rm -rf autom4te.cache
|
||||||
rm -rf *~
|
rm -rf *~
|
||||||
|
rm -rf run log
|
||||||
|
|
||||||
#install-data-local:
|
#install-data-local:
|
||||||
# test -z $(DESTDIR)$(APP_LIBDIR) || $(MKDIR_P) $(DESTDIR)$(APP_LIBDIR)
|
# test -z $(DESTDIR)$(APP_LIBDIR) || $(MKDIR_P) $(DESTDIR)$(APP_LIBDIR)
|
||||||
|
|||||||
10
cflexer.c
10
cflexer.c
@@ -11,6 +11,16 @@
|
|||||||
#include <cflexer.h>
|
#include <cflexer.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define CFLEXCONT_COMM 1
|
||||||
|
#define CFLEXCONT_END 2
|
||||||
|
#define CFLEXCONT_LWORD 3
|
||||||
|
#define CFLEXCONT_SEPAR 4
|
||||||
|
#define CFLEXCONT_SPACE 5
|
||||||
|
#define CFLEXCONT_UNDEF 6
|
||||||
|
#define CFLEXCONT_UNKNOW 7
|
||||||
|
#define CFLEXCONT_WORD 8
|
||||||
|
#define CFLEXCONT_NEWLN 9
|
||||||
|
|
||||||
#define CFLEXTYPE_CHAR 1
|
#define CFLEXTYPE_CHAR 1
|
||||||
#define CFLEXTYPE_COMM 2
|
#define CFLEXTYPE_COMM 2
|
||||||
#define CFLEXTYPE_EOF 3
|
#define CFLEXTYPE_EOF 3
|
||||||
|
|||||||
11
cflexer.h
11
cflexer.h
@@ -16,17 +16,6 @@ typedef struct {
|
|||||||
} cflexer_t;
|
} cflexer_t;
|
||||||
|
|
||||||
|
|
||||||
#define CFLEXCONT_COMM 1
|
|
||||||
#define CFLEXCONT_END 2
|
|
||||||
#define CFLEXCONT_LWORD 3
|
|
||||||
#define CFLEXCONT_SEPAR 4
|
|
||||||
#define CFLEXCONT_SPACE 5
|
|
||||||
#define CFLEXCONT_UNDEF 6
|
|
||||||
#define CFLEXCONT_UNKNOW 7
|
|
||||||
#define CFLEXCONT_WORD 8
|
|
||||||
#define CFLEXCONT_NEWLN 9
|
|
||||||
|
|
||||||
|
|
||||||
#define CFLEXTOK_BLOCKB 1
|
#define CFLEXTOK_BLOCKB 1
|
||||||
#define CFLEXTOK_COMM 2
|
#define CFLEXTOK_COMM 2
|
||||||
#define CFLEXTOK_END 3
|
#define CFLEXTOK_END 3
|
||||||
|
|||||||
@@ -9,6 +9,14 @@
|
|||||||
|
|
||||||
#include <cllexer.h>
|
#include <cllexer.h>
|
||||||
|
|
||||||
|
#define CLLEXCONT_UNDEF 0
|
||||||
|
#define CLLEXCONT_KEY 1
|
||||||
|
#define CLLEXCONT_WORD 2
|
||||||
|
#define CLLEXCONT_SPACE 3
|
||||||
|
#define CLLEXCONT_SEP 4
|
||||||
|
#define CLLEXCONT_END 5
|
||||||
|
#define CLLEXCONT_LWORD 6
|
||||||
|
|
||||||
#define CLLEXTYPE_UNDEF 0
|
#define CLLEXTYPE_UNDEF 0
|
||||||
#define CLLEXTYPE_KEY 1
|
#define CLLEXTYPE_KEY 1
|
||||||
#define CLLEXTYPE_CHAR 2
|
#define CLLEXTYPE_CHAR 2
|
||||||
|
|||||||
@@ -15,13 +15,6 @@ typedef struct {
|
|||||||
bool screen;
|
bool screen;
|
||||||
} cllexer_t;
|
} cllexer_t;
|
||||||
|
|
||||||
#define CLLEXCONT_UNDEF 0
|
|
||||||
#define CLLEXCONT_KEY 1
|
|
||||||
#define CLLEXCONT_WORD 2
|
|
||||||
#define CLLEXCONT_SPACE 3
|
|
||||||
#define CLLEXCONT_SEP 4
|
|
||||||
#define CLLEXCONT_END 5
|
|
||||||
#define CLLEXCONT_LWORD 6
|
|
||||||
|
|
||||||
#define CLLEXTOK_UNDEF 0
|
#define CLLEXTOK_UNDEF 0
|
||||||
#define CLLEXTOK_KEY 1
|
#define CLLEXTOK_KEY 1
|
||||||
|
|||||||
6
config.h
6
config.h
@@ -2,8 +2,8 @@
|
|||||||
#ifndef CONFIG_H_QWER
|
#ifndef CONFIG_H_QWER
|
||||||
#define CONFIG_H_QWER
|
#define CONFIG_H_QWER
|
||||||
|
|
||||||
static const char *srv_runpath = "/home/ziggi/Projects/jcomp/run/cworker.pid";
|
static const char *srv_runpath = "/home/ziggi/Projects/cworker/run/cworker.pid";
|
||||||
static const char *srv_logpath = "/home/ziggi/Projects/jcomp/log/cworker.log";
|
static const char *srv_logpath = "/home/ziggi/Projects/cworker/log/cworker.log";
|
||||||
static const char *srv_configpath = "/home/ziggi/Projects/jcomp//cworker.conf";
|
static const char *srv_configpath = "/home/ziggi/Projects/cworker//cworker.conf";
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -430,7 +430,7 @@ Copyright (C) 2021 Free Software Foundation, Inc.
|
|||||||
This config.status script is free software; the Free Software Foundation
|
This config.status script is free software; the Free Software Foundation
|
||||||
gives unlimited permission to copy, distribute and modify it."
|
gives unlimited permission to copy, distribute and modify it."
|
||||||
|
|
||||||
ac_pwd='/home/ziggi/Projects/jcomp'
|
ac_pwd='/home/ziggi/Projects/cworker'
|
||||||
srcdir='.'
|
srcdir='.'
|
||||||
INSTALL='/usr/bin/install -c'
|
INSTALL='/usr/bin/install -c'
|
||||||
MKDIR_P='/usr/local/bin/gmkdir -p'
|
MKDIR_P='/usr/local/bin/gmkdir -p'
|
||||||
@@ -612,20 +612,20 @@ S["am__EXEEXT_FALSE"]=""
|
|||||||
S["am__EXEEXT_TRUE"]="#"
|
S["am__EXEEXT_TRUE"]="#"
|
||||||
S["LTLIBOBJS"]=""
|
S["LTLIBOBJS"]=""
|
||||||
S["app_name"]="cworker"
|
S["app_name"]="cworker"
|
||||||
S["app_cachedir"]="/home/ziggi/Projects/jcomp/cache"
|
S["app_cachedir"]="/home/ziggi/Projects/cworker/cache"
|
||||||
S["APP_CACHEDIR"]="/home/ziggi/Projects/jcomp/cache"
|
S["APP_CACHEDIR"]="/home/ziggi/Projects/cworker/cache"
|
||||||
S["app_databasedir"]="/home/ziggi/Projects/jcomp/data"
|
S["app_databasedir"]="/home/ziggi/Projects/cworker/data"
|
||||||
S["APP_DATABASEDIR"]="/home/ziggi/Projects/jcomp/data"
|
S["APP_DATABASEDIR"]="/home/ziggi/Projects/cworker/data"
|
||||||
S["app_user"]="ziggi"
|
S["app_user"]="ziggi"
|
||||||
S["APP_USER"]="ziggi"
|
S["APP_USER"]="ziggi"
|
||||||
S["app_libdir"]="/home/ziggi/Projects/jcomp/lib"
|
S["app_libdir"]="/home/ziggi/Projects/cworker/lib"
|
||||||
S["APP_LIBDIR"]="/home/ziggi/Projects/jcomp/lib"
|
S["APP_LIBDIR"]="/home/ziggi/Projects/cworker/lib"
|
||||||
S["app_rundir"]="/home/ziggi/Projects/jcomp/run"
|
S["app_rundir"]="/home/ziggi/Projects/cworker/run"
|
||||||
S["APP_RUNDIR"]="/home/ziggi/Projects/jcomp/run"
|
S["APP_RUNDIR"]="/home/ziggi/Projects/cworker/run"
|
||||||
S["app_logdir"]="/home/ziggi/Projects/jcomp/log"
|
S["app_logdir"]="/home/ziggi/Projects/cworker/log"
|
||||||
S["APP_LOGDIR"]="/home/ziggi/Projects/jcomp/log"
|
S["APP_LOGDIR"]="/home/ziggi/Projects/cworker/log"
|
||||||
S["app_configdir"]="/home/ziggi/Projects/jcomp/"
|
S["app_configdir"]="/home/ziggi/Projects/cworker/"
|
||||||
S["APP_CONFIGDIR"]="/home/ziggi/Projects/jcomp/"
|
S["APP_CONFIGDIR"]="/home/ziggi/Projects/cworker/"
|
||||||
S["SYSTEMD_FALSE"]=""
|
S["SYSTEMD_FALSE"]=""
|
||||||
S["SYSTEMD_TRUE"]="#"
|
S["SYSTEMD_TRUE"]="#"
|
||||||
S["LINUX_OS_FALSE"]=""
|
S["LINUX_OS_FALSE"]=""
|
||||||
@@ -676,12 +676,12 @@ S["mkdir_p"]="$(MKDIR_P)"
|
|||||||
S["MKDIR_P"]="/usr/local/bin/gmkdir -p"
|
S["MKDIR_P"]="/usr/local/bin/gmkdir -p"
|
||||||
S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s"
|
S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s"
|
||||||
S["STRIP"]=""
|
S["STRIP"]=""
|
||||||
S["install_sh"]="${SHELL} /home/ziggi/Projects/jcomp/install-sh"
|
S["install_sh"]="${SHELL} /home/ziggi/Projects/cworker/install-sh"
|
||||||
S["MAKEINFO"]="${SHELL} /home/ziggi/Projects/jcomp/missing makeinfo"
|
S["MAKEINFO"]="${SHELL} /home/ziggi/Projects/cworker/missing makeinfo"
|
||||||
S["AUTOHEADER"]="${SHELL} /home/ziggi/Projects/jcomp/missing autoheader"
|
S["AUTOHEADER"]="${SHELL} /home/ziggi/Projects/cworker/missing autoheader"
|
||||||
S["AUTOMAKE"]="${SHELL} /home/ziggi/Projects/jcomp/missing automake"
|
S["AUTOMAKE"]="${SHELL} /home/ziggi/Projects/cworker/missing automake"
|
||||||
S["AUTOCONF"]="${SHELL} /home/ziggi/Projects/jcomp/missing autoconf"
|
S["AUTOCONF"]="${SHELL} /home/ziggi/Projects/cworker/missing autoconf"
|
||||||
S["ACLOCAL"]="${SHELL} /home/ziggi/Projects/jcomp/missing aclocal"
|
S["ACLOCAL"]="${SHELL} /home/ziggi/Projects/cworker/missing aclocal"
|
||||||
S["VERSION"]="0.0.1"
|
S["VERSION"]="0.0.1"
|
||||||
S["PACKAGE"]="cworker"
|
S["PACKAGE"]="cworker"
|
||||||
S["CYGPATH_W"]="echo"
|
S["CYGPATH_W"]="echo"
|
||||||
@@ -813,13 +813,13 @@ D["HAVE_MEMSET"]=" 1"
|
|||||||
D["HAVE_MKDIR"]=" 1"
|
D["HAVE_MKDIR"]=" 1"
|
||||||
D["HAVE_SETLOCALE"]=" 1"
|
D["HAVE_SETLOCALE"]=" 1"
|
||||||
D["HAVE_SOCKET"]=" 1"
|
D["HAVE_SOCKET"]=" 1"
|
||||||
D["APP_CONFIGDIR"]=" \"/home/ziggi/Projects/jcomp/\""
|
D["APP_CONFIGDIR"]=" \"/home/ziggi/Projects/cworker/\""
|
||||||
D["APP_LOGDIR"]=" \"/home/ziggi/Projects/jcomp/log\""
|
D["APP_LOGDIR"]=" \"/home/ziggi/Projects/cworker/log\""
|
||||||
D["APP_RUNDIR"]=" \"/home/ziggi/Projects/jcomp/run\""
|
D["APP_RUNDIR"]=" \"/home/ziggi/Projects/cworker/run\""
|
||||||
D["APP_LIBDIR"]=" \"/home/ziggi/Projects/jcomp/lib\""
|
D["APP_LIBDIR"]=" \"/home/ziggi/Projects/cworker/lib\""
|
||||||
D["APP_USER"]=" \"ziggi\""
|
D["APP_USER"]=" \"ziggi\""
|
||||||
D["APP_DATABASEDIR"]=" \"/home/ziggi/Projects/jcomp/data\""
|
D["APP_DATABASEDIR"]=" \"/home/ziggi/Projects/cworker/data\""
|
||||||
D["APP_CACHEDIR"]=" \"/home/ziggi/Projects/jcomp/cache\""
|
D["APP_CACHEDIR"]=" \"/home/ziggi/Projects/cworker/cache\""
|
||||||
for (key in D) D_is_set[key] = 1
|
for (key in D) D_is_set[key] = 1
|
||||||
FS = ""
|
FS = ""
|
||||||
}
|
}
|
||||||
|
|||||||
501
cworker.c
501
cworker.c
@@ -4,15 +4,26 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/event.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/types.h>
|
#include <pthread.h>
|
||||||
#include <sys/stat.h>
|
#include <poll.h>
|
||||||
#include <sys/wait.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#include <cllexer.h>
|
#include <cllexer.h>
|
||||||
#include <clparser.h>
|
#include <clparser.h>
|
||||||
@@ -20,16 +31,312 @@
|
|||||||
#include <cfparser.h>
|
#include <cfparser.h>
|
||||||
#include <massert.h>
|
#include <massert.h>
|
||||||
#include <rcache.h>
|
#include <rcache.h>
|
||||||
|
#include <jlexer.h>
|
||||||
|
#include <jparser.h>
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <cworker.h>
|
#include <cworker.h>
|
||||||
#include <logger.h>
|
#include <logger.h>
|
||||||
|
|
||||||
int log_fd = 0;
|
static const int64_t default_port = 9701;
|
||||||
|
static cworker_t* pworker = NULL;
|
||||||
|
|
||||||
|
static int mkdirall(const char* path, mode_t mode);
|
||||||
|
void sighandler(int signum);
|
||||||
|
|
||||||
|
static int cworker_readconf(const cworker_t* worker) {
|
||||||
|
log_debug("Configuration reading");
|
||||||
|
|
||||||
|
int conffd = -1;
|
||||||
|
if ((conffd = open(srv_configpath, O_RDONLY)) < 0) {
|
||||||
|
log_error("Configuration file opening error: %s %s", strerror(errno), srv_configpath);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rcache_t cache;
|
||||||
|
cflexer_t lexer;
|
||||||
|
cfparser_t parser;
|
||||||
|
|
||||||
|
rcache_init(&cache, conffd);
|
||||||
|
cflexer_init(&lexer, &cache);
|
||||||
|
cfparser_init(&parser, &lexer);
|
||||||
|
|
||||||
|
if (cfparser_parse(&parser) < 0) {
|
||||||
|
log_error("Configuration parsing error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfparser_bind(&parser, CFVALTYPE_INT, "port", (void *)&(worker->port));
|
||||||
|
cfparser_bind(&parser, CFVALTYPE_BOOL, "nofork", (void *)&(worker->nofork));
|
||||||
|
|
||||||
|
cfparser_destroy(&parser);
|
||||||
|
cflexer_destroy(&lexer);
|
||||||
|
rcache_destroy(&cache);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cworker_readopts(const cworker_t* worker, char** argv, int argc) {
|
||||||
|
log_debug("Reading options");
|
||||||
|
|
||||||
|
cllexer_t lexer;
|
||||||
|
clparser_t parser;
|
||||||
|
|
||||||
|
cllexer_init(&lexer);
|
||||||
|
clparser_init(&parser, &lexer);
|
||||||
|
|
||||||
|
clparser_bind(&parser, CLVALTYPE_INT, "port", (void *)&(worker->port));
|
||||||
|
clparser_bind(&parser, CLVALTYPE_BOOL, "nofork", (void *)&(worker->nofork));
|
||||||
|
|
||||||
|
if (clparser_parse(&parser, &argv[1], argc - 1) < 0) {
|
||||||
|
log_error("Args parsing error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cworker_openlog(cworker_t* worker) {
|
||||||
|
if (!worker->nofork) {
|
||||||
|
log_debug("Redirect output");
|
||||||
|
if (mkdirall(srv_logpath, S_IRWXU|S_IRGRP|S_IXGRP) < 0) {
|
||||||
|
log_error("Log dir creating error: %s %s", strerror(errno), srv_logpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((worker->logfd = open(srv_logpath, O_WRONLY|O_APPEND|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP)) < 0) {
|
||||||
|
log_error("Log file opening error: %s %s", strerror(errno), srv_logpath);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
dup2(worker->logfd, STDOUT_FILENO);
|
||||||
|
dup2(worker->logfd, STDERR_FILENO);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cworker_writepid(const cworker_t* worker) {
|
||||||
|
if (!worker->nofork) {
|
||||||
|
|
||||||
|
log_debug("Write pid file");
|
||||||
|
|
||||||
|
if (mkdirall(srv_runpath, S_IRWXU|S_IRGRP|S_IXGRP) < 0) {
|
||||||
|
log_error("Run directory creating error: %s %s", strerror(errno), srv_runpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
int pid_fd = -1;
|
||||||
|
if ((pid_fd = open(srv_runpath, O_WRONLY|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP)) < 0) {
|
||||||
|
log_error("Process ID file opening error: %s %s", strerror(errno), srv_runpath);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (dprintf(pid_fd, "%d", getpid()) < 0) {
|
||||||
|
log_error("Process ID file writing error: %s %s", strerror(errno), srv_runpath);
|
||||||
|
close(pid_fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
close(pid_fd);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int cworker_init(cworker_t* worker, char** argv, int argc) {
|
||||||
|
log_init();
|
||||||
|
|
||||||
|
log_debug("Init service");
|
||||||
|
worker->port = default_port;
|
||||||
|
worker->nofork = true;
|
||||||
|
worker->socket = 0;
|
||||||
|
worker->logfd = 0;
|
||||||
|
pworker = worker;
|
||||||
|
|
||||||
|
if (cworker_readconf(worker) < 0) {
|
||||||
|
log_error("Config reading error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (cworker_readopts(worker, argv, argc) < 0) {
|
||||||
|
log_error("Options reading error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!worker->nofork) {
|
||||||
|
if (cworker_openlog(worker) < 0) {
|
||||||
|
log_error("Log opening error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_debug("Listening port: %d", worker->port);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cworker_detach(const cworker_t* worker) {
|
||||||
|
if (!worker->nofork) {
|
||||||
|
log_debug("Service detaching");
|
||||||
|
int childpid = -1;
|
||||||
|
if((childpid = fork()) < 0) {
|
||||||
|
log_error("Fork error %d: %s ", errno, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (childpid == 0) {
|
||||||
|
log_debug("Service forked");
|
||||||
|
return 0;
|
||||||
|
// child
|
||||||
|
} else {
|
||||||
|
// parent
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cworker_build(cworker_t* worker) {
|
||||||
|
log_debug("Service building");
|
||||||
|
|
||||||
|
signal(SIGCHLD, SIG_IGN);
|
||||||
|
signal(SIGHUP, sighandler);
|
||||||
|
signal(SIGTERM, sighandler);
|
||||||
|
|
||||||
|
if((worker->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
|
||||||
|
log_debug("Socket creating error %d: %s", errno, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int optval = 1;
|
||||||
|
if (setsockopt(worker->socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
|
||||||
|
log_debug("Socket option setting error %d: %s", errno, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sockaddr addr;
|
||||||
|
struct sockaddr_in* paddr = (struct sockaddr_in*)&addr;
|
||||||
|
paddr->sin_family = AF_INET;
|
||||||
|
paddr->sin_addr.s_addr = INADDR_ANY;
|
||||||
|
paddr->sin_port = htons(worker->port);
|
||||||
|
paddr->sin_len = sizeof(struct sockaddr_in);
|
||||||
|
|
||||||
|
if (bind(worker->socket, (struct sockaddr*)paddr, paddr->sin_len) < 0) {
|
||||||
|
log_debug("Socket binding error %d: %s ", errno, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int backlog = 100;
|
||||||
|
if (listen(worker->socket, backlog) < 0) {
|
||||||
|
log_debug("Socket listening error %d: %s ", errno, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cworker_handler(const cworker_t* worker, int socket);
|
||||||
|
|
||||||
|
int cworker_run(const cworker_t* worker) {
|
||||||
|
log_debug("Service running");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
int newsocket = 0;
|
||||||
|
if ((newsocket = accept(worker->socket, NULL, 0)) > 3) {
|
||||||
|
|
||||||
|
int childpid = -1;
|
||||||
|
if((childpid = fork()) < 0) {
|
||||||
|
log_error("Fork error %d: %s ", errno, strerror(errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (childpid == 0) {
|
||||||
|
// child
|
||||||
|
log_debug("Service %d forked", getpid());
|
||||||
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
signal(SIGTERM, SIG_IGN);
|
||||||
|
|
||||||
|
struct timeval tv = { .tv_sec = 5, .tv_usec = 0 };
|
||||||
|
if (setsockopt(newsocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)) < 0) {
|
||||||
|
log_debug("Socket option setting error %d: %s ", errno, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
cworker_handler(worker, newsocket);
|
||||||
|
log_debug("Handler %d done", getpid());
|
||||||
|
close(newsocket);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
// parent
|
||||||
|
close(newsocket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(worker->socket);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int cworker_handler(const cworker_t* worker, int socket) {
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
rcache_t cache;
|
||||||
|
jlexer_t lexer;
|
||||||
|
jparser_t parser;
|
||||||
|
|
||||||
|
rcache_init(&cache, socket);
|
||||||
|
jlexer_init(&lexer, &cache);
|
||||||
|
jparser_init(&parser, &lexer);
|
||||||
|
|
||||||
|
if (jparser_parse(&parser) < 0) {
|
||||||
|
log_error("Cannot parse json");
|
||||||
|
err = -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t id = 0;
|
||||||
|
char* name = "none";
|
||||||
|
|
||||||
|
if (jparser_bind(&parser, JVALTYPE_NUM, "id", (void *)&id) < 0) {
|
||||||
|
log_error("Cannot bind id");
|
||||||
|
}
|
||||||
|
if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) {
|
||||||
|
log_error("Cannot bind name");
|
||||||
|
}
|
||||||
|
dprintf(socket, "{}");
|
||||||
|
|
||||||
|
free(name);
|
||||||
|
exit:
|
||||||
|
jparser_destroy(&parser);
|
||||||
|
jlexer_destroy(&lexer);
|
||||||
|
rcache_destroy(&cache);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cworker_shutdown(cworker_t* worker) {
|
||||||
|
log_warning("Shutdown service %d", getpid());
|
||||||
|
if (worker->socket != 0) {
|
||||||
|
close(worker->socket);
|
||||||
|
worker->logfd = 0;
|
||||||
|
}
|
||||||
|
if (worker->logfd != 0) {
|
||||||
|
close(worker->logfd);
|
||||||
|
worker->logfd = 0;
|
||||||
|
}
|
||||||
|
wait(NULL);
|
||||||
|
log_destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sighandler(int signum) {
|
||||||
|
log_warning("Handle signal %d", signum);
|
||||||
|
if (signum == SIGHUP) {
|
||||||
|
log_warning("Handle HUP signal");
|
||||||
|
} else if (signum == SIGTERM) {
|
||||||
|
log_warning("Handle TERM signal");
|
||||||
|
if (pworker != NULL) {
|
||||||
|
cworker_shutdown(pworker);
|
||||||
|
sleep(1);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int mkdirall(const char* path, mode_t mode) {
|
static int mkdirall(const char* path, mode_t mode) {
|
||||||
char buffer[1024];
|
char buffer[PATH_MAX];
|
||||||
size_t psize = strlen(path);
|
size_t psize = strlen(path);
|
||||||
|
if (psize > PATH_MAX) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (psize == 0) return 0;
|
if (psize == 0) return 0;
|
||||||
if (psize == 1 && path[0] == '/') {
|
if (psize == 1 && path[0] == '/') {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -47,187 +354,3 @@ static int mkdirall(const char* path, mode_t mode) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* path_last(const char* path) {
|
|
||||||
char buffer[1024];
|
|
||||||
size_t psize = strlen(path);
|
|
||||||
strcpy(buffer, path);
|
|
||||||
buffer[psize] = '\0';
|
|
||||||
if (buffer[psize - 1] == '/') {
|
|
||||||
buffer[--psize] = '\0';
|
|
||||||
}
|
|
||||||
size_t pos = psize;
|
|
||||||
for (size_t i = 1; i < psize; i++) {
|
|
||||||
if (buffer[i] == '/') pos = i;
|
|
||||||
}
|
|
||||||
char* b = &buffer[++pos];
|
|
||||||
int bsize = strlen(b);
|
|
||||||
char* res = malloc(bsize + 1);
|
|
||||||
strcpy(res, b);
|
|
||||||
//printf("\n%s\n", res);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* path_file(const char* path) {
|
|
||||||
char buffer[1024];
|
|
||||||
size_t psize = strlen(path);
|
|
||||||
strcpy(buffer, path);
|
|
||||||
buffer[psize] = '\0';
|
|
||||||
//if (buffer[psize - 1] == '/') {
|
|
||||||
// buffer[--psize] = '\0';
|
|
||||||
//}
|
|
||||||
size_t pos = psize;
|
|
||||||
for (size_t i = 1; i < psize; i++) {
|
|
||||||
if (buffer[i] == '/') pos = i;
|
|
||||||
}
|
|
||||||
char* b = &buffer[++pos];
|
|
||||||
int bsize = strlen(b);
|
|
||||||
char* res = malloc(bsize + 1);
|
|
||||||
strcpy(res, b);
|
|
||||||
//printf("\n%s\n", res);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int cworker_readconf(const cworker_t* worker) {
|
|
||||||
log_debug("reading configiration");
|
|
||||||
|
|
||||||
int conf_fd = -1;
|
|
||||||
if ((conf_fd = open(srv_configpath, O_RDONLY)) < 0) {
|
|
||||||
log_error("cannot open config file %s", srv_configpath);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rcache_t cache;
|
|
||||||
cflexer_t lexer;
|
|
||||||
cfparser_t parser;
|
|
||||||
|
|
||||||
rcache_init(&cache, conf_fd);
|
|
||||||
cflexer_init(&lexer, &cache);
|
|
||||||
cfparser_init(&parser, &lexer);
|
|
||||||
|
|
||||||
if (cfparser_parse(&parser) < 0) {
|
|
||||||
log_error("parse config error\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cfparser_bind(&parser, CFVALTYPE_INT, "port", (void *)&(worker->port));
|
|
||||||
|
|
||||||
cfparser_destroy(&parser);
|
|
||||||
cflexer_destroy(&lexer);
|
|
||||||
rcache_destroy(&cache);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cworker_readopts(const cworker_t* worker, char** argv, int argc) {
|
|
||||||
log_debug("reading options");
|
|
||||||
|
|
||||||
cllexer_t lexer;
|
|
||||||
clparser_t parser;
|
|
||||||
|
|
||||||
cllexer_init(&lexer);
|
|
||||||
clparser_init(&parser, &lexer);
|
|
||||||
|
|
||||||
clparser_bind(&parser, CLVALTYPE_INT, "port", (void *)&(worker->port));
|
|
||||||
|
|
||||||
if (clparser_parse(&parser, &argv[1], argc - 1) < 0) {
|
|
||||||
log_error("parse args error");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cworker_openlog(const cworker_t* worker) {
|
|
||||||
log_debug("redirect output");
|
|
||||||
|
|
||||||
if (mkdirall(srv_logpath, S_IRWXU|S_IRGRP|S_IXGRP) < 0) {
|
|
||||||
log_error("creating log dir error: %s %s", strerror(errno), srv_logpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((log_fd = open(srv_logpath, O_WRONLY|O_APPEND|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP)) < 0) {
|
|
||||||
log_error("open log file error %s %s", strerror(errno), srv_logpath);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
dup2(log_fd, STDOUT_FILENO);
|
|
||||||
dup2(log_fd, STDERR_FILENO);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cworker_writepid(const cworker_t* worker) {
|
|
||||||
log_debug("write pid file");
|
|
||||||
|
|
||||||
if (mkdirall(srv_runpath, S_IRWXU|S_IRGRP|S_IXGRP) < 0) {
|
|
||||||
log_error("createing run dir error: %s %s", strerror(errno), srv_runpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pid_fd = -1;
|
|
||||||
if ((pid_fd = open(srv_runpath, O_WRONLY|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP)) < 0) {
|
|
||||||
log_error("open pid file error %s %s", strerror(errno), srv_runpath);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (dprintf(pid_fd, "%d", getpid()) < 0) {
|
|
||||||
log_error("cannon write pid, error %s %s", strerror(errno), srv_runpath);
|
|
||||||
close(pid_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
close(pid_fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int64_t default_port = 9701;
|
|
||||||
|
|
||||||
int cworker_init(cworker_t* worker, char** argv, int argc) {
|
|
||||||
if (cworker_openlog(worker) < 0) {
|
|
||||||
log_error("openlog error");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
log_debug("init service");
|
|
||||||
worker->port = default_port;
|
|
||||||
|
|
||||||
if (cworker_readconf(worker) < 0) {
|
|
||||||
log_error("reading config error");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cworker_readopts(worker, argv, argc) < 0) {
|
|
||||||
log_error("reading config error");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
log_debug("port: %d", worker->port);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cworker_detach(const cworker_t* worker) {
|
|
||||||
log_debug("detach service");
|
|
||||||
|
|
||||||
int childpid = -1;
|
|
||||||
if((childpid = fork()) < 0) {
|
|
||||||
log_error("fork error: %s", strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (childpid == 0) {
|
|
||||||
log_debug("service forkerd");
|
|
||||||
return 0;
|
|
||||||
// child
|
|
||||||
} else {
|
|
||||||
// parent
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cworker_build(const cworker_t* worker) {
|
|
||||||
log_debug("build service");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cworker_run(const cworker_t* worker) {
|
|
||||||
log_debug("run service");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t port;
|
int64_t port;
|
||||||
|
int socket;
|
||||||
|
int nofork;
|
||||||
|
int logfd;
|
||||||
} cworker_t;
|
} cworker_t;
|
||||||
|
|
||||||
int cworker_init(cworker_t* worker, char** argv, int argc);
|
int cworker_init(cworker_t* worker, char** argv, int argc);
|
||||||
@@ -13,7 +16,7 @@ int cworker_init(cworker_t* worker, char** argv, int argc);
|
|||||||
int cworker_detach(const cworker_t* worker);
|
int cworker_detach(const cworker_t* worker);
|
||||||
int cworker_writepid(const cworker_t* worker);
|
int cworker_writepid(const cworker_t* worker);
|
||||||
int cworker_configure(const cworker_t* worker);
|
int cworker_configure(const cworker_t* worker);
|
||||||
int cworker_build(const cworker_t* worker);
|
int cworker_build(cworker_t* worker);
|
||||||
int cworker_run(const cworker_t* worker);
|
int cworker_run(const cworker_t* worker);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
12
defines.h
12
defines.h
@@ -2,22 +2,22 @@
|
|||||||
/* defines.h.in. Generated from configure.ac by autoheader. */
|
/* defines.h.in. Generated from configure.ac by autoheader. */
|
||||||
|
|
||||||
/* location of cache dir */
|
/* location of cache dir */
|
||||||
#define APP_CACHEDIR "/home/ziggi/Projects/jcomp/cache"
|
#define APP_CACHEDIR "/home/ziggi/Projects/cworker/cache"
|
||||||
|
|
||||||
/* location of configuration files for ${PACKAGE} */
|
/* location of configuration files for ${PACKAGE} */
|
||||||
#define APP_CONFIGDIR "/home/ziggi/Projects/jcomp/"
|
#define APP_CONFIGDIR "/home/ziggi/Projects/cworker/"
|
||||||
|
|
||||||
/* location of database dir */
|
/* location of database dir */
|
||||||
#define APP_DATABASEDIR "/home/ziggi/Projects/jcomp/data"
|
#define APP_DATABASEDIR "/home/ziggi/Projects/cworker/data"
|
||||||
|
|
||||||
/* location of libs */
|
/* location of libs */
|
||||||
#define APP_LIBDIR "/home/ziggi/Projects/jcomp/lib"
|
#define APP_LIBDIR "/home/ziggi/Projects/cworker/lib"
|
||||||
|
|
||||||
/* location of ${PACKAGE} logdir */
|
/* location of ${PACKAGE} logdir */
|
||||||
#define APP_LOGDIR "/home/ziggi/Projects/jcomp/log"
|
#define APP_LOGDIR "/home/ziggi/Projects/cworker/log"
|
||||||
|
|
||||||
/* location of pid file */
|
/* location of pid file */
|
||||||
#define APP_RUNDIR "/home/ziggi/Projects/jcomp/run"
|
#define APP_RUNDIR "/home/ziggi/Projects/cworker/run"
|
||||||
|
|
||||||
/* effective user */
|
/* effective user */
|
||||||
#define APP_USER "ziggi"
|
#define APP_USER "ziggi"
|
||||||
|
|||||||
17
jlexer.c
17
jlexer.c
@@ -10,6 +10,15 @@
|
|||||||
#include <rcache.h>
|
#include <rcache.h>
|
||||||
#include <jlexer.h>
|
#include <jlexer.h>
|
||||||
|
|
||||||
|
#define JLEXCONT_UNDEF 0
|
||||||
|
#define JLEXCONT_WORD 1
|
||||||
|
#define JLEXCONT_BLOCKB 2
|
||||||
|
#define JLEXCONT_BLOCKE 3
|
||||||
|
#define JLEXCONT_SEPAR 4
|
||||||
|
#define JLEXCONT_NUM 5
|
||||||
|
#define JLEXCONT_UNKNOW 6
|
||||||
|
#define JLEXCONT_END 9
|
||||||
|
|
||||||
#define JLEXTYPE_UNDEF 0
|
#define JLEXTYPE_UNDEF 0
|
||||||
#define JLEXTYPE_BLOCKB 1
|
#define JLEXTYPE_BLOCKB 1
|
||||||
#define JLEXTYPE_BLOCKE 2
|
#define JLEXTYPE_BLOCKE 2
|
||||||
@@ -83,8 +92,8 @@ int jlexer_gettoken(jlexer_t * lexer, char* token) {
|
|||||||
case JLEXCONT_END:{
|
case JLEXCONT_END:{
|
||||||
lexer->context = JLEXCONT_END;
|
lexer->context = JLEXCONT_END;
|
||||||
lexer->tokpos = 0;
|
lexer->tokpos = 0;
|
||||||
lexer->rewind = true;
|
//lexer->rewind = true;
|
||||||
strcpy(token, "END");
|
strcpy(token, "EOF");
|
||||||
return JLEXTOK_END;
|
return JLEXTOK_END;
|
||||||
}
|
}
|
||||||
case JLEXCONT_UNDEF:{
|
case JLEXCONT_UNDEF:{
|
||||||
@@ -95,12 +104,12 @@ int jlexer_gettoken(jlexer_t * lexer, char* token) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case JLEXTYPE_BLOCKB:{
|
case JLEXTYPE_BLOCKB:{
|
||||||
strcpy(token, "BEGIN");
|
strcpy(token, "BLOCK BEGIN");
|
||||||
lexer->context = JLEXCONT_UNDEF;
|
lexer->context = JLEXCONT_UNDEF;
|
||||||
return JLEXTOK_BLOCKB;
|
return JLEXTOK_BLOCKB;
|
||||||
}
|
}
|
||||||
case JLEXTYPE_BLOCKE:{
|
case JLEXTYPE_BLOCKE:{
|
||||||
strcpy(token, "END");
|
strcpy(token, "BLOCK END");
|
||||||
lexer->context = JLEXCONT_UNDEF;
|
lexer->context = JLEXCONT_UNDEF;
|
||||||
return JLEXTOK_BLOCKE;
|
return JLEXTOK_BLOCKE;
|
||||||
}
|
}
|
||||||
|
|||||||
8
jlexer.h
8
jlexer.h
@@ -14,14 +14,6 @@ typedef struct {
|
|||||||
bool rewind;
|
bool rewind;
|
||||||
} jlexer_t;
|
} jlexer_t;
|
||||||
|
|
||||||
#define JLEXCONT_UNDEF 0
|
|
||||||
#define JLEXCONT_WORD 1
|
|
||||||
#define JLEXCONT_BLOCKB 2
|
|
||||||
#define JLEXCONT_BLOCKE 3
|
|
||||||
#define JLEXCONT_SEPAR 4
|
|
||||||
#define JLEXCONT_NUM 5
|
|
||||||
#define JLEXCONT_UNKNOW 6
|
|
||||||
#define JLEXCONT_END 9
|
|
||||||
|
|
||||||
|
|
||||||
#define JLEXTOK_BLOCKB 1
|
#define JLEXTOK_BLOCKB 1
|
||||||
|
|||||||
48
jparser.c
48
jparser.c
@@ -40,11 +40,16 @@ int jparser_parse(jparser_t * parser) {
|
|||||||
char* key = "";
|
char* key = "";
|
||||||
|
|
||||||
while ((type = jlexer_gettoken(lex, token)) != JLEXTOK_END) {
|
while ((type = jlexer_gettoken(lex, token)) != JLEXTOK_END) {
|
||||||
|
//printf("pos %d %d: %s\n", pos, type, token);
|
||||||
switch (pos) {
|
switch (pos) {
|
||||||
// POS 0
|
// POS 0
|
||||||
case 0:{
|
case 0:{
|
||||||
|
if (type == JLEXTOK_END) {
|
||||||
|
log_error("End token received in position %d", pos);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (type != JLEXTOK_BLOCKB) {
|
if (type != JLEXTOK_BLOCKB) {
|
||||||
log_error("wrong block token: %s", token);
|
log_error("Wrong block token: %s", token);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
@@ -52,6 +57,10 @@ int jparser_parse(jparser_t * parser) {
|
|||||||
}
|
}
|
||||||
// POS 1
|
// POS 1
|
||||||
case 1:{
|
case 1:{
|
||||||
|
if (type == JLEXTOK_END) {
|
||||||
|
log_error("End token received in position %d", pos);
|
||||||
|
//return -1;
|
||||||
|
}
|
||||||
if (type == JLEXTOK_SPACE)
|
if (type == JLEXTOK_SPACE)
|
||||||
continue;
|
continue;
|
||||||
if (type == JLEXTOK_NEXT)
|
if (type == JLEXTOK_NEXT)
|
||||||
@@ -59,7 +68,7 @@ int jparser_parse(jparser_t * parser) {
|
|||||||
if (type == JLEXTOK_BLOCKE)
|
if (type == JLEXTOK_BLOCKE)
|
||||||
return 0;
|
return 0;
|
||||||
if (type != JLEXTOK_WORD) {
|
if (type != JLEXTOK_WORD) {
|
||||||
log_error("wrong word token: %s", token);
|
log_error("Wrong word token: %s", token);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
key = strcopy(token);
|
key = strcopy(token);
|
||||||
@@ -68,10 +77,14 @@ int jparser_parse(jparser_t * parser) {
|
|||||||
}
|
}
|
||||||
// POS 2
|
// POS 2
|
||||||
case 2:{
|
case 2:{
|
||||||
|
if (type == JLEXTOK_END) {
|
||||||
|
log_error("End token received in position %d", pos);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (type == JLEXTOK_SPACE)
|
if (type == JLEXTOK_SPACE)
|
||||||
continue;
|
continue;
|
||||||
if (type != JLEXTOK_SEPAR) {
|
if (type != JLEXTOK_SEPAR) {
|
||||||
log_error("wrong delimeter token: %s", token);
|
log_error("Wrong delimeter token: %s", token);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
@@ -79,10 +92,18 @@ int jparser_parse(jparser_t * parser) {
|
|||||||
}
|
}
|
||||||
// POS 3
|
// POS 3
|
||||||
case 3:{
|
case 3:{
|
||||||
|
if (type == JLEXTOK_END) {
|
||||||
|
log_error("End token received in position %d", pos);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (type == JLEXTOK_SPACE)
|
if (type == JLEXTOK_SPACE)
|
||||||
continue;
|
continue;
|
||||||
|
if (type == JLEXTOK_BLOCKB) {
|
||||||
|
pos = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (type != JLEXTOK_WORD && type != JLEXTOK_NUMB) {
|
if (type != JLEXTOK_WORD && type != JLEXTOK_NUMB) {
|
||||||
log_error("wrong delimeter token: %s", token);
|
log_error("Wrong value token: %s", token);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char* val = strcopy(token);
|
char* val = strcopy(token);
|
||||||
@@ -106,17 +127,28 @@ int jparser_parse(jparser_t * parser) {
|
|||||||
}
|
}
|
||||||
// POS 4
|
// POS 4
|
||||||
case 4:{
|
case 4:{
|
||||||
if (type == JLEXTOK_SPACE)
|
if (type == JLEXTOK_END) {
|
||||||
|
log_error("End token received in position %d", pos);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (type == JLEXTOK_SPACE) {
|
||||||
continue;
|
continue;
|
||||||
if (type != JLEXTOK_NEXT && type != JLEXTOK_BLOCKE) {
|
} else if (type == JLEXTOK_BLOCKE) {
|
||||||
log_error("wrong next token: %s", token);
|
//log_debug("Block ended: %s", token);
|
||||||
|
return 0;
|
||||||
|
} else if (type != JLEXTOK_NEXT && type != JLEXTOK_BLOCKE) {
|
||||||
|
log_error("Wrong next token: %s", token);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pos = 1;
|
pos = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:{
|
default:{
|
||||||
log_error("wrong parser stage: %s", token);
|
log_error("Wrong parser stage: %s", token);
|
||||||
|
if (type == JLEXTOK_END) {
|
||||||
|
log_error("End token received in position %d", pos);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
#ifndef CLPARSER_H_QWERTY
|
#ifndef JPARSER_H_QWERTY
|
||||||
#define CLPARSER_H_QWERTY
|
#define JPARSER_H_QWERTY
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <jlexer.h>
|
#include <jlexer.h>
|
||||||
|
|||||||
41
logger.c
41
logger.c
@@ -8,12 +8,27 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#define _CLOCK_SOURCE CLOCK_MONOTONIC
|
|
||||||
//#define CLOCK_SOURCE CLOCK_REALTIME_PRECISE
|
|
||||||
|
|
||||||
|
#define CLOCK_SOURCE CLOCK_MONOTONIC
|
||||||
#define MAX_TS_LEN 256
|
#define MAX_TS_LEN 256
|
||||||
|
|
||||||
|
|
||||||
|
static pthread_mutex_t logmutex = NULL;
|
||||||
|
static pthread_mutexattr_t logmutex_attrs;
|
||||||
|
|
||||||
|
void log_init(void) {
|
||||||
|
pthread_mutexattr_init(&logmutex_attrs);
|
||||||
|
pthread_mutexattr_setpshared(&logmutex_attrs, PTHREAD_PROCESS_SHARED);
|
||||||
|
pthread_mutex_init(&logmutex, &logmutex_attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_destroy(void) {
|
||||||
|
pthread_mutex_destroy(&logmutex);
|
||||||
|
pthread_mutexattr_destroy(&logmutex_attrs);
|
||||||
|
}
|
||||||
|
|
||||||
void static set_timestamp(char* buffer) {
|
void static set_timestamp(char* buffer) {
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
if (now < 0) {
|
if (now < 0) {
|
||||||
@@ -25,7 +40,7 @@ void static set_timestamp(char* buffer) {
|
|||||||
}
|
}
|
||||||
struct timespec tv;
|
struct timespec tv;
|
||||||
|
|
||||||
clock_gettime(_CLOCK_SOURCE, &tv);
|
clock_gettime(CLOCK_SOURCE, &tv);
|
||||||
memset(buffer, '\0', MAX_TS_LEN);
|
memset(buffer, '\0', MAX_TS_LEN);
|
||||||
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d.%ld+%s",
|
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d.%ld+%s",
|
||||||
ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
||||||
@@ -37,23 +52,43 @@ void log_error(const char* format, ...) {
|
|||||||
char timestamp[MAX_TS_LEN];
|
char timestamp[MAX_TS_LEN];
|
||||||
set_timestamp(timestamp);
|
set_timestamp(timestamp);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&logmutex);
|
||||||
va_list args;
|
va_list args;
|
||||||
fprintf(stderr, "%s error: ", timestamp);
|
fprintf(stderr, "%s error: ", timestamp);
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
vfprintf(stderr, format, args);
|
vfprintf(stderr, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
pthread_mutex_unlock(&logmutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void log_warning(const char* format, ...) {
|
||||||
|
|
||||||
|
char timestamp[MAX_TS_LEN];
|
||||||
|
set_timestamp(timestamp);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&logmutex);
|
||||||
|
va_list args;
|
||||||
|
fprintf(stderr, "%s warning: ", timestamp);
|
||||||
|
va_start(args, format);
|
||||||
|
vfprintf(stderr, format, args);
|
||||||
|
va_end(args);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
pthread_mutex_unlock(&logmutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void log_debug(const char* format, ...) {
|
void log_debug(const char* format, ...) {
|
||||||
|
|
||||||
char timestamp[MAX_TS_LEN];
|
char timestamp[MAX_TS_LEN];
|
||||||
set_timestamp(timestamp);
|
set_timestamp(timestamp);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&logmutex);
|
||||||
va_list args;
|
va_list args;
|
||||||
fprintf(stderr, "%s debug: ", timestamp);
|
fprintf(stderr, "%s debug: ", timestamp);
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
vfprintf(stderr, format, args);
|
vfprintf(stderr, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
pthread_mutex_unlock(&logmutex);
|
||||||
}
|
}
|
||||||
|
|||||||
5
logger.h
5
logger.h
@@ -1,6 +1,11 @@
|
|||||||
#ifndef LOGGER_H_QWERTY
|
#ifndef LOGGER_H_QWERTY
|
||||||
#define LOGGER_H_QWERTY
|
#define LOGGER_H_QWERTY
|
||||||
|
|
||||||
|
void log_init(void);
|
||||||
|
void log_destroy(void);
|
||||||
|
|
||||||
void log_error(const char* format, ... );
|
void log_error(const char* format, ... );
|
||||||
void log_debug(const char* format, ... );
|
void log_debug(const char* format, ... );
|
||||||
|
void log_warning(const char* format, ... );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
7
rcache.c
7
rcache.c
@@ -33,8 +33,10 @@ char rcache_getc(rcache_t * cache) {
|
|||||||
|
|
||||||
if (unread == 0) {
|
if (unread == 0) {
|
||||||
char* buffer[BUFFER_SIZE];
|
char* buffer[BUFFER_SIZE];
|
||||||
size_t rsize = read(cache->fd, buffer, sizeof(buffer));
|
ssize_t rsize = read(cache->fd, buffer, sizeof(buffer));
|
||||||
|
if (rsize < 0) {
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
if (rsize == 0) {
|
if (rsize == 0) {
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
@@ -51,6 +53,7 @@ char rcache_getc(rcache_t * cache) {
|
|||||||
memcpy(&(cache->data[cache->wpos]), buffer, (size_t)rsize);
|
memcpy(&(cache->data[cache->wpos]), buffer, (size_t)rsize);
|
||||||
cache->wpos += rsize;
|
cache->wpos += rsize;
|
||||||
}
|
}
|
||||||
|
//printf("[%c]", (char)cache->data[cache->rpos]);
|
||||||
return (char)cache->data[cache->rpos++];
|
return (char)cache->data[cache->rpos++];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
40
works/fileoper.c
Normal file
40
works/fileoper.c
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
char* path_last(const char* path) {
|
||||||
|
char buffer[1024];
|
||||||
|
size_t psize = strlen(path);
|
||||||
|
strcpy(buffer, path);
|
||||||
|
buffer[psize] = '\0';
|
||||||
|
if (buffer[psize - 1] == '/') {
|
||||||
|
buffer[--psize] = '\0';
|
||||||
|
}
|
||||||
|
size_t pos = psize;
|
||||||
|
for (size_t i = 1; i < psize; i++) {
|
||||||
|
if (buffer[i] == '/') pos = i;
|
||||||
|
}
|
||||||
|
char* b = &buffer[++pos];
|
||||||
|
int bsize = strlen(b);
|
||||||
|
char* res = malloc(bsize + 1);
|
||||||
|
strcpy(res, b);
|
||||||
|
//printf("\n%s\n", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* path_file(const char* path) {
|
||||||
|
char buffer[1024];
|
||||||
|
size_t psize = strlen(path);
|
||||||
|
strcpy(buffer, path);
|
||||||
|
buffer[psize] = '\0';
|
||||||
|
//if (buffer[psize - 1] == '/') {
|
||||||
|
// buffer[--psize] = '\0';
|
||||||
|
//}
|
||||||
|
size_t pos = psize;
|
||||||
|
for (size_t i = 1; i < psize; i++) {
|
||||||
|
if (buffer[i] == '/') pos = i;
|
||||||
|
}
|
||||||
|
char* b = &buffer[++pos];
|
||||||
|
int bsize = strlen(b);
|
||||||
|
char* res = malloc(bsize + 1);
|
||||||
|
strcpy(res, b);
|
||||||
|
//printf("\n%s\n", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
74
works/handlers.c
Normal file
74
works/handlers.c
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
|
||||||
|
int handler4(int socket) {
|
||||||
|
int err = 0;
|
||||||
|
rcache_t cache;
|
||||||
|
jlexer_t lexer;
|
||||||
|
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_sec = 1;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
|
||||||
|
|
||||||
|
rcache_init(&cache, socket);
|
||||||
|
jlexer_init(&lexer, &cache);
|
||||||
|
|
||||||
|
char token[1024];
|
||||||
|
int type = 0;
|
||||||
|
while ((type = jlexer_gettoken(&lexer, token)) != JLEXTOK_END) {
|
||||||
|
printf("%d: %s\n", type, token);
|
||||||
|
}
|
||||||
|
printf("= %d: %s\n", type, token);
|
||||||
|
//rcache_destroy(&cache);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int handler5(int socket) {
|
||||||
|
int err = 0;
|
||||||
|
rcache_t cache;
|
||||||
|
|
||||||
|
rcache_init(&cache, socket);
|
||||||
|
char c = '\0';
|
||||||
|
while ((c = rcache_getc(&cache)) != EOF) {
|
||||||
|
printf("%c", c);
|
||||||
|
if (c == '}') {
|
||||||
|
dprintf(socket, "good bay!\n");
|
||||||
|
close(socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rcache_destroy(&cache);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int handler3(int socket) {
|
||||||
|
|
||||||
|
//struct timeval tv;
|
||||||
|
//tv.tv_sec = 1;
|
||||||
|
//tv.tv_usec = 0;
|
||||||
|
//setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
|
||||||
|
|
||||||
|
const int bsize = 1024;
|
||||||
|
char buffer[bsize];
|
||||||
|
ssize_t rsize = 0;
|
||||||
|
ssize_t tsize = 0;
|
||||||
|
while(true) {
|
||||||
|
memset(buffer, '\0', bsize);
|
||||||
|
rsize = read(socket, buffer, bsize);
|
||||||
|
if (rsize < 0) {
|
||||||
|
log_debug("Socket error: %s", strerror(errno));
|
||||||
|
if (errno != EAGAIN) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (rsize == 0) {
|
||||||
|
log_debug("Socket rsize is zero");
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
tsize += rsize;
|
||||||
|
printf("%ld:%s\n", rsize, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user