mirror of
https://github.com/eddyem/snippets_library.git
synced 2025-12-06 02:35:20 +03:00
version 0.1.1.
This commit is contained in:
parent
53ec829cb7
commit
b147fee176
3
.gitignore
vendored
3
.gitignore
vendored
@ -13,3 +13,6 @@
|
|||||||
# Shared objects
|
# Shared objects
|
||||||
*.so
|
*.so
|
||||||
*.so.*
|
*.so.*
|
||||||
|
|
||||||
|
# qt-creator
|
||||||
|
Snippets.*
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
cmake_minimum_required(VERSION 3.9)
|
cmake_minimum_required(VERSION 3.9)
|
||||||
set(PROJ usefull_macros)
|
set(PROJ usefull_macros)
|
||||||
set(MINOR_VERSION "1")
|
set(MINOR_VERSION "1")
|
||||||
set(MID_VERSION "0")
|
set(MID_VERSION "1")
|
||||||
set(MAJOR_VERSION "0")
|
set(MAJOR_VERSION "0")
|
||||||
set(PROJ_VERSION "${MAJOR_VERSION}.${MID_VERSION}.${MINOR_VERSION}")
|
set(VERSION "${MAJOR_VERSION}.${MID_VERSION}.${MINOR_VERSION}")
|
||||||
|
|
||||||
project(${PROJ} VERSION ${PROJ_VERSION} LANGUAGES C)
|
project(${PROJ} VERSION ${VERSION} LANGUAGES C)
|
||||||
|
|
||||||
# default flags
|
# default flags
|
||||||
set(CMAKE_C_FLAGS "${CFLAGS} -O2")
|
set(CMAKE_C_FLAGS "${CFLAGS} -O2")
|
||||||
@ -95,7 +95,7 @@ include_directories(${${PROJ}_INCLUDE_DIRS})
|
|||||||
link_directories(${${PROJ}_LIBRARY_DIRS})
|
link_directories(${${PROJ}_LIBRARY_DIRS})
|
||||||
# -D
|
# -D
|
||||||
add_definitions(-DLOCALEDIR=\"${LOCALEDIR}\"
|
add_definitions(-DLOCALEDIR=\"${LOCALEDIR}\"
|
||||||
-DPACKAGE_VERSION=\"${PROJ_VERSION}\" -DGETTEXT_PACKAGE=\"${PROJ}\"
|
-DPACKAGE_VERSION=\"${VERSION}\" -DGETTEXT_PACKAGE=\"${PROJ}\"
|
||||||
-DMINOR_VERSION=\"${MINOR_VERSION}\" -DMID_VERSION=\"${MID_VERSION}\"
|
-DMINOR_VERSION=\"${MINOR_VERSION}\" -DMID_VERSION=\"${MID_VERSION}\"
|
||||||
-DMAJOR_VERSION=\"${MAJOR_VESION}\")
|
-DMAJOR_VERSION=\"${MAJOR_VESION}\")
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ target_link_libraries(${PROJ} ${${PROJ}_LIBRARIES})
|
|||||||
set(PCFILE "${CMAKE_BINARY_DIR}/${PROJ}.pc")
|
set(PCFILE "${CMAKE_BINARY_DIR}/${PROJ}.pc")
|
||||||
configure_file("${PROJ}.pc.in" ${PCFILE} @ONLY)
|
configure_file("${PROJ}.pc.in" ${PCFILE} @ONLY)
|
||||||
|
|
||||||
set_target_properties(${PROJ} PROPERTIES VERSION ${PROJ_VERSION})
|
set_target_properties(${PROJ} PROPERTIES VERSION ${VERSION})
|
||||||
set_target_properties(${PROJ} PROPERTIES PUBLIC_HEADER ${LIBHEADER})
|
set_target_properties(${PROJ} PROPERTIES PUBLIC_HEADER ${LIBHEADER})
|
||||||
|
|
||||||
# Installation of the program
|
# Installation of the program
|
||||||
|
|||||||
7
Changelog
Normal file
7
Changelog
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Wed Dec 23 17:22:39 MSK 2020
|
||||||
|
|
||||||
|
VERSION 0.1.1:
|
||||||
|
add tty_timeout()
|
||||||
|
fix read_tty() for disconnect
|
||||||
|
add logging
|
||||||
|
add sl_libversion()
|
||||||
@ -1,3 +0,0 @@
|
|||||||
// Add predefined macros for your project here. For example:
|
|
||||||
// #define THE_ANSWER 42
|
|
||||||
#define EBUG 1
|
|
||||||
@ -1 +0,0 @@
|
|||||||
[General]
|
|
||||||
@ -1,170 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 4.8.0, 2019-03-12T09:59:40. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{cf63021e-ef53-49b0-b03b-2f2570cdf3b6}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="int">0</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">KOI8-R</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">2</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
|
|
||||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{91347f2c-5221-46a7-80b1-0a054ca02f79}</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/eddy/Docs/SAO/C_diff/snippets_library</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
|
||||||
<value type="QString">all</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<valuelist type="QVariantList" key="GenericProjectManager.GenericMakeStep.BuildTargets">
|
|
||||||
<value type="QString">clean</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="GenericProjectManager.GenericMakeStep.MakeCommand"></value>
|
|
||||||
<value type="bool" key="GenericProjectManager.GenericMakeStep.OverrideMakeflags">false</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericMakeStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">По умолчанию</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">По умолчанию</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">GenericProjectManager.GenericBuildConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Установка</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Конфигурация установки</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
|
||||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
|
||||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
|
||||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Особая программа</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
|
||||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
|
||||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
|
||||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="int">1</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">20</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>Version</variable>
|
|
||||||
<value type="int">20</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
CMakeLists.txt
|
|
||||||
daemon.c
|
|
||||||
examples/CMakeLists.txt
|
|
||||||
examples/cmdlnopts.c
|
|
||||||
examples/cmdlnopts.h
|
|
||||||
examples/fifo.c
|
|
||||||
examples/helloworld.c
|
|
||||||
examples/options.c
|
|
||||||
fifo_lifo.c
|
|
||||||
parseargs.c
|
|
||||||
term.c
|
|
||||||
term.h
|
|
||||||
usefull_macros.c
|
|
||||||
usefull_macros.h
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
.
|
|
||||||
examples
|
|
||||||
1
TODO
Normal file
1
TODO
Normal file
@ -0,0 +1 @@
|
|||||||
|
Add prefixes sl_ to every function for solving further problems
|
||||||
8
daemon.c
8
daemon.c
@ -92,13 +92,13 @@ void check4running(char *selfname, char *pidfilename){
|
|||||||
if(selfname){ // block self
|
if(selfname){ // block self
|
||||||
fself = fopen(selfname, "r"); // open self binary to lock
|
fself = fopen(selfname, "r"); // open self binary to lock
|
||||||
if(!fself){
|
if(!fself){
|
||||||
WARN("fopen");
|
WARN("fopen()");
|
||||||
goto selfpid;
|
goto selfpid;
|
||||||
}
|
}
|
||||||
memset(&fl, 0, sizeof(struct flock));
|
memset(&fl, 0, sizeof(struct flock));
|
||||||
fl.l_type = F_WRLCK;
|
fl.l_type = F_WRLCK;
|
||||||
if(fcntl(fileno(fself), F_GETLK, &fl) == -1){ // check locking
|
if(fcntl(fileno(fself), F_GETLK, &fl) == -1){ // check locking
|
||||||
WARN("fcntl");
|
WARN("fcntl()");
|
||||||
goto selfpid;
|
goto selfpid;
|
||||||
}
|
}
|
||||||
if(fl.l_type != F_UNLCK){ // file is locking - exit
|
if(fl.l_type != F_UNLCK){ // file is locking - exit
|
||||||
@ -106,7 +106,7 @@ void check4running(char *selfname, char *pidfilename){
|
|||||||
}
|
}
|
||||||
fl.l_type = F_RDLCK;
|
fl.l_type = F_RDLCK;
|
||||||
if(fcntl(fileno(fself), F_SETLKW, &fl) == -1){
|
if(fcntl(fileno(fself), F_SETLKW, &fl) == -1){
|
||||||
WARN("fcntl");
|
WARN("fcntl()");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
selfpid:
|
selfpid:
|
||||||
@ -115,7 +115,7 @@ void check4running(char *selfname, char *pidfilename){
|
|||||||
ERR(PROC_BASE);
|
ERR(PROC_BASE);
|
||||||
}
|
}
|
||||||
if(!(name = readPSname(self))){ // error reading self name
|
if(!(name = readPSname(self))){ // error reading self name
|
||||||
ERR("Can't read self name");
|
ERR(_("Can't read self name"));
|
||||||
}
|
}
|
||||||
myname = strdup(name);
|
myname = strdup(name);
|
||||||
if(pidfilename && stat(pidfilename, &s_buf) == 0){ // pidfile exists
|
if(pidfilename && stat(pidfilename, &s_buf) == 0){ // pidfile exists
|
||||||
|
|||||||
@ -51,6 +51,7 @@ static glob_pars const Gdefault = {
|
|||||||
static myoption cmdlnopts[] = {
|
static myoption cmdlnopts[] = {
|
||||||
// common options
|
// common options
|
||||||
{"help", NO_ARGS, NULL, 'h', arg_int, APTR(&help), _("show this help")},
|
{"help", NO_ARGS, NULL, 'h', arg_int, APTR(&help), _("show this help")},
|
||||||
|
// {"dup", NO_ARGS, NULL, 'h', arg_int, APTR(&help), _("show this help")},
|
||||||
{"device", NEED_ARG, NULL, 'd', arg_string, APTR(&G.device), _("serial device name")},
|
{"device", NEED_ARG, NULL, 'd', arg_string, APTR(&G.device), _("serial device name")},
|
||||||
{"speed", NEED_ARG, NULL, 's', arg_int, APTR(&G.speed), _("serial device speed (default: 9600)")},
|
{"speed", NEED_ARG, NULL, 's', arg_int, APTR(&G.speed), _("serial device speed (default: 9600)")},
|
||||||
{"logfile", NEED_ARG, NULL, 'l', arg_string, APTR(&G.logfile), _("file to save logs")},
|
{"logfile", NEED_ARG, NULL, 'l', arg_string, APTR(&G.logfile), _("file to save logs")},
|
||||||
|
|||||||
@ -59,11 +59,11 @@ void signals(int sig){
|
|||||||
signal(sig, SIG_IGN);
|
signal(sig, SIG_IGN);
|
||||||
DBG("Get signal %d, quit.\n", sig);
|
DBG("Get signal %d, quit.\n", sig);
|
||||||
}
|
}
|
||||||
putlog("Exit with status %d", sig);
|
LOGERR("Exit with status %d", sig);
|
||||||
if(GP->pidfile) // remove unnesessary PID file
|
if(GP && GP->pidfile) // remove unnesessary PID file
|
||||||
unlink(GP->pidfile);
|
unlink(GP->pidfile);
|
||||||
restore_console();
|
restore_console();
|
||||||
close_tty(&dev);
|
if(dev) close_tty(&dev);
|
||||||
exit(sig);
|
exit(sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,38 +81,42 @@ int main(int argc, char *argv[]){
|
|||||||
printf("%s\n", GP->rest_pars[i]);
|
printf("%s\n", GP->rest_pars[i]);
|
||||||
}
|
}
|
||||||
check4running(self, GP->pidfile);
|
check4running(self, GP->pidfile);
|
||||||
|
red("%s started, snippets library version is %s\n", self, sl_libversion());
|
||||||
free(self);
|
free(self);
|
||||||
|
setup_con();
|
||||||
signal(SIGTERM, signals); // kill (-15) - quit
|
signal(SIGTERM, signals); // kill (-15) - quit
|
||||||
signal(SIGHUP, SIG_IGN); // hup - ignore
|
signal(SIGHUP, SIG_IGN); // hup - ignore
|
||||||
signal(SIGINT, signals); // ctrl+C - quit
|
signal(SIGINT, signals); // ctrl+C - quit
|
||||||
signal(SIGQUIT, signals); // ctrl+\ - quit
|
signal(SIGQUIT, signals); // ctrl+\ - quit
|
||||||
signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z
|
signal(SIGTSTP, SIG_IGN); // ignore ctrl+Z
|
||||||
if(GP->logfile) openlogfile(GP->logfile);
|
if(GP->logfile) OPENLOG(GP->logfile, LOGLEVEL_ANY, 1);
|
||||||
setup_con();
|
LOGMSG("Start application...");
|
||||||
putlog(("Start application..."));
|
|
||||||
if(GP->rest_pars_num){
|
if(GP->rest_pars_num){
|
||||||
for(int i = 0; i < GP->rest_pars_num; ++i)
|
for(int i = 0; i < GP->rest_pars_num; ++i)
|
||||||
printf("Extra argument: %s\n", GP->rest_pars[i]);
|
printf("Extra argument: %s\n", GP->rest_pars[i]);
|
||||||
}
|
}
|
||||||
if(GP->device){
|
if(GP->device){
|
||||||
putlog("Try to open serial %s", GP->device);
|
LOGDBG("Try to open serial %s", GP->device);
|
||||||
dev = new_tty(GP->device, GP->speed, 256);
|
dev = new_tty(GP->device, GP->speed, 4096);
|
||||||
if(dev) dev = tty_open(dev, GP->exclusive);
|
if(dev) dev = tty_open(dev, GP->exclusive);
|
||||||
if(!dev){
|
if(!dev){
|
||||||
putlog("Can't open %s with speed %d. Exit.", GP->device, GP->speed);
|
LOGERR("Can't open %s with speed %d. Exit.", GP->device, GP->speed);
|
||||||
signals(0);
|
signals(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// main stuff goes here
|
// main stuff goes here
|
||||||
long seed = throw_random_seed();
|
long seed = throw_random_seed();
|
||||||
green("Now I will sleep for 10 seconds. Do whatever you want. Random seed: %ld\n", seed);
|
green("Now I will sleep for 10 seconds after your last input.\n Do whatever you want. Random seed: %ld\n", seed);
|
||||||
|
LOGWARN("warning message example");
|
||||||
|
LOGWARNADD("with next string without timestamp");
|
||||||
double t0 = dtime();
|
double t0 = dtime();
|
||||||
char b[2] = {0};
|
char b[2] = {0};
|
||||||
while(dtime() - t0 < 10.){ // read data from port and print in into terminal
|
while(dtime() - t0 < 10.){ // read data from port and print in into terminal
|
||||||
if(dev){
|
if(dev){
|
||||||
if(read_tty(dev)){
|
if(read_tty(dev)){
|
||||||
printf("Got %zd bytes from port: %s\n", dev->buflen, dev->buf);
|
printf("Got %zd bytes from port: %s\n", dev->buflen, dev->buf);
|
||||||
|
LOGMSG("Got from serial: %s", dev->buf);
|
||||||
t0 = dtime();
|
t0 = dtime();
|
||||||
}
|
}
|
||||||
int r = read_console();
|
int r = read_console();
|
||||||
@ -120,10 +124,12 @@ int main(int argc, char *argv[]){
|
|||||||
t0 = dtime();
|
t0 = dtime();
|
||||||
b[0] = (char) r;
|
b[0] = (char) r;
|
||||||
printf("send to tty: %d (%c)\n", r, b[0]);
|
printf("send to tty: %d (%c)\n", r, b[0]);
|
||||||
|
LOGMSG("send to tty: %d (%c)\n", r, b[0]);
|
||||||
write_tty(dev->comfd, b, 1);
|
write_tty(dev->comfd, b, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// clean everything
|
// clean everything
|
||||||
signals(0);
|
signals(0);
|
||||||
|
// never reached
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2018-12-09 01:49+0300\n"
|
"POT-Creation-Date: 2020-12-24 12:22+0300\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -18,138 +18,162 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#. / \nïÂÎÁÒÕÖÅÎ ÏÄÎÏÉÍÅÎÎÙÊ ÐÒÏÃÅÓÓ (pid=%d), ×ÙÈÏÄ.\n
|
#. / \nïÂÎÁÒÕÖÅÎ ÏÄÎÏÉÍÅÎÎÙÊ ÐÒÏÃÅÓÓ (pid=%d), ×ÙÈÏÄ.\n
|
||||||
#: /Big/Data/C_sources/snippets_library/daemon.c:70
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/daemon.c:70
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
"Found running process (pid=%d), exit.\n"
|
"Found running process (pid=%d), exit.\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. error reading self name
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/daemon.c:118
|
||||||
|
msgid "Can't read self name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ PID ÆÁÊÌ
|
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ PID ÆÁÊÌ
|
||||||
#: /Big/Data/C_sources/snippets_library/daemon.c:143
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/daemon.c:143
|
||||||
msgid "Can't open PID file"
|
msgid "Can't open PID file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. amount of pcount and/or scount wrong
|
#. amount of pcount and/or scount wrong
|
||||||
#. / îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÓÔÒÏËÉ ÐÏÍÏÝÉ
|
#. / îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÓÔÒÏËÉ ÐÏÍÏÝÉ
|
||||||
#: /Big/Data/C_sources/snippets_library/parseargs.c:54
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:54
|
||||||
msgid "Wrong helpstring!"
|
msgid "Wrong helpstring!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / ãÅÌÏÅ ×ÎÅ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ
|
#. / ãÅÌÏÅ ×ÎÅ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ
|
||||||
#: /Big/Data/C_sources/snippets_library/parseargs.c:84
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:84
|
||||||
msgid "Integer out of range"
|
msgid "Integer out of range"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. / "îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ× ÂÅÚ ÁÒÇÕÍÅÎÔÏ×!"
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:151
|
||||||
|
msgid "Can't use multiple args with arg_none!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:252
|
||||||
|
#, c-format
|
||||||
|
msgid "double long arguments: --%s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:258
|
||||||
|
#, c-format
|
||||||
|
msgid "double short arguments: -%c"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅÐÒÁ×ÉÌØÎÙÊ ÐÁÒÁÍÅÔÒ: %s
|
#. / îÅÐÒÁ×ÉÌØÎÙÊ ÐÁÒÁÍÅÔÒ: %s
|
||||||
#: /Big/Data/C_sources/snippets_library/parseargs.c:478
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:470
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Wrong parameter: %s"
|
msgid "Wrong parameter: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / %s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!
|
#. / %s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!
|
||||||
#: /Big/Data/C_sources/snippets_library/parseargs.c:483
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:475
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s: argument needed!"
|
msgid "%s: need argument!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅÐÒÁ×ÉÌØÎÙÊ ÁÒÇÕÍÅÎÔ \"%s\" ÐÁÒÁÍÅÔÒÁ \"%s\"
|
#. / îÅÐÒÁ×ÉÌØÎÙÊ ÁÒÇÕÍÅÎÔ \"%s\" ÐÁÒÁÍÅÔÒÁ \"%s\"
|
||||||
#: /Big/Data/C_sources/snippets_library/parseargs.c:488
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:480
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Wrong argument \"%s\" of parameter \"%s\""
|
msgid "Wrong argument \"%s\" of parameter \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: /Big/Data/C_sources/snippets_library/term.c:92
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:92
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Wrong speed value: %d!"
|
msgid "Wrong speed value: %d!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÒÔ %s
|
#. / îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÒÔ %s
|
||||||
#: /Big/Data/C_sources/snippets_library/term.c:105
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:105
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Can't use port %s"
|
msgid "Can't use port %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Get settings
|
#. Get settings
|
||||||
#. / îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
#. / îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
||||||
#: /Big/Data/C_sources/snippets_library/term.c:111
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:110
|
||||||
msgid "Can't get old TTY settings"
|
msgid "Can't get old TTY settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÓÍÅÎÉÔØ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
#. / îÅ ÍÏÇÕ ÓÍÅÎÉÔØ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
||||||
#: /Big/Data/C_sources/snippets_library/term.c:123
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:121
|
||||||
msgid "Can't apply new TTY settings"
|
msgid "Can't apply new TTY settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÓÄÅÌÁÔØ ÐÏÒÔ ÜËÓËÌÀÚÉ×ÎÙÍ
|
#. / îÅ ÍÏÇÕ ÓÄÅÌÁÔØ ÐÏÒÔ ÜËÓËÌÀÚÉ×ÎÙÍ
|
||||||
#: /Big/Data/C_sources/snippets_library/term.c:129
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:128
|
||||||
msgid "Can't do exclusive open"
|
msgid "Can't do exclusive open"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / ïÔÓÕÔÓÔ×ÕÅÔ ÉÍÑ ÐÏÒÔÁ
|
#. / ïÔÓÕÔÓÔ×ÕÅÔ ÉÍÑ ÐÏÒÔÁ
|
||||||
#: /Big/Data/C_sources/snippets_library/term.c:168
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:164
|
||||||
msgid "Port name is missing"
|
msgid "Port name is missing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:170
|
||||||
|
msgid "Need non-zero buffer for TTY device"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ /dev/random
|
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ /dev/random
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:184
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:185
|
||||||
msgid "Can't open /dev/random"
|
msgid "Can't open /dev/random"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÐÒÏÞÅÓÔØ /dev/random
|
#. / îÅ ÍÏÇÕ ÐÒÏÞÅÓÔØ /dev/random
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:189
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:190
|
||||||
msgid "Can't read /dev/random"
|
msgid "Can't read /dev/random"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÚÁÄÁÎÏ ÉÍÑ ÆÁÊÌÁ!
|
#. / îÅ ÚÁÄÁÎÏ ÉÍÑ ÆÁÊÌÁ!
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:232
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:241
|
||||||
msgid "No filename given!"
|
msgid "No filename given!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s ÄÌÑ ÞÔÅÎÉÑ
|
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s ÄÌÑ ÞÔÅÎÉÑ
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:237
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Can't open %s for reading"
|
msgid "Can't open %s for reading"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ stat %s
|
#. / îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ stat %s
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:242
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:251
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Can't stat %s"
|
msgid "Can't stat %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / ïÛÉÂËÁ mmap
|
#. / ïÛÉÂËÁ mmap
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:249
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:258
|
||||||
msgid "Mmap error for input"
|
msgid "Mmap error for input"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÚÁËÒÙÔØ mmap'ÎÕÔÙÊ ÆÁÊÌ
|
#. / îÅ ÍÏÇÕ ÚÁËÒÙÔØ mmap'ÎÕÔÙÊ ÆÁÊÌ
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:254
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:263
|
||||||
msgid "Can't close mmap'ed file"
|
msgid "Can't close mmap'ed file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ munmap
|
#. / îÅ ÍÏÇÕ munmap
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:268
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:277
|
||||||
msgid "Can't munmap"
|
msgid "Can't munmap"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÎÁÓÔÒÏÉÔØ ËÏÎÓÏÌØ
|
#. / îÅ ÍÏÇÕ ÎÁÓÔÒÏÉÔØ ËÏÎÓÏÌØ
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:299
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:308
|
||||||
msgid "Can't setup console"
|
msgid "Can't setup console"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÚÁÄÁÎÏ ÉÍÑ ÌÏÇÆÁÊÌÁ
|
#. / îÅ ÚÁÄÁÎÏ ÉÍÑ ÌÏÇÆÁÊÌÁ
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:374
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:383
|
||||||
msgid "Need filename for log file"
|
msgid "Need filename for log file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / ðÒÏÂÕÀ ÏÔËÒÙÔØ ÌÏÇÆÁÊÌ %s × ÒÅÖÉÍÅ ÄÏÐÏÌÎÅÎÉÑ\n
|
#. / ðÒÏÂÕÀ ÏÔËÒÙÔØ ÌÏÇÆÁÊÌ %s × ÒÅÖÉÍÅ ÄÏÐÏÌÎÅÎÉÑ\n
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:378
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:387
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Try to open log file %s in append mode\n"
|
msgid "Try to open log file %s in append mode\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÌÏÇÆÁÊÌ
|
#. / îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÌÏÇÆÁÊÌ
|
||||||
#: /Big/Data/C_sources/snippets_library/usefull_macros.c:382
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:391
|
||||||
msgid "Can't open log file"
|
msgid "Can't open log file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr "Project-Id-Version: PACKAGE VERSION\n"
|
msgstr "Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-03-12 09:53+0300\n"
|
"POT-Creation-Date: 2020-12-24 12:22+0300\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -25,34 +25,45 @@ msgstr "\n"
|
|||||||
"Обнаружен одноименный процесс (pid=%d), выход.\n"
|
"Обнаружен одноименный процесс (pid=%d), выход.\n"
|
||||||
|
|
||||||
#. / %s: необходим аргумент!
|
#. / %s: необходим аргумент!
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:483
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:475
|
||||||
#, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%s: argument needed!"
|
msgid "%s: need argument!"
|
||||||
msgstr "%s: необходим аргумент!"
|
msgstr "%s: необходим аргумент!"
|
||||||
|
|
||||||
|
#. / îÅ ÍÏÇÕ ÓÍÅÎÉÔØ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:121
|
||||||
|
msgid "Can't apply new TTY settings"
|
||||||
|
msgstr "îÅ ÍÏÇÕ ÓÍÅÎÉÔØ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ"
|
||||||
|
|
||||||
#. / Не могу закрыть mmap'нутый файл
|
#. / Не могу закрыть mmap'нутый файл
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:262
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:263
|
||||||
msgid "Can't close mmap'ed file"
|
msgid "Can't close mmap'ed file"
|
||||||
msgstr "Не могу закрыть mmap'нутый файл"
|
msgstr "Не могу закрыть mmap'нутый файл"
|
||||||
|
|
||||||
#. / Не могу сделать порт эксклюзивным
|
#. / Не могу сделать порт эксклюзивным
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:129
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:128
|
||||||
msgid "Can't do exclusive open"
|
msgid "Can't do exclusive open"
|
||||||
msgstr "Не могу перевести порт в эксклюзивный режим"
|
msgstr "Не могу перевести порт в эксклюзивный режим"
|
||||||
|
|
||||||
|
#. Get settings
|
||||||
|
#. / îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:110
|
||||||
|
msgid "Can't get old TTY settings"
|
||||||
|
msgstr "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ"
|
||||||
|
|
||||||
#. / Не могу munmap
|
#. / Не могу munmap
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:276
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:277
|
||||||
msgid "Can't munmap"
|
msgid "Can't munmap"
|
||||||
msgstr "Не могу munmap"
|
msgstr "Не могу munmap"
|
||||||
|
|
||||||
#. / Не могу открыть %s для чтения
|
#. / Не могу открыть %s для чтения
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:245
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Can't open %s for reading"
|
msgid "Can't open %s for reading"
|
||||||
msgstr "Не могу открыть %s для чтения"
|
msgstr "Не могу открыть %s для чтения"
|
||||||
|
|
||||||
#. / Не могу открыть /dev/random
|
#. / Не могу открыть /dev/random
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:184
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:185
|
||||||
msgid "Can't open /dev/random"
|
msgid "Can't open /dev/random"
|
||||||
msgstr "Не могу открыть /dev/random"
|
msgstr "Не могу открыть /dev/random"
|
||||||
|
|
||||||
@ -62,64 +73,80 @@ msgid "Can't open PID file"
|
|||||||
msgstr "Не могу открыть PID файл"
|
msgstr "Не могу открыть PID файл"
|
||||||
|
|
||||||
#. / Не могу открыть логфайл
|
#. / Не могу открыть логфайл
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:390
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:391
|
||||||
msgid "Can't open log file"
|
msgid "Can't open log file"
|
||||||
msgstr "Не могу открыть логфайл"
|
msgstr "Не могу открыть логфайл"
|
||||||
|
|
||||||
#. / Не могу прочесть /dev/random
|
#. / Не могу прочесть /dev/random
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:189
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:190
|
||||||
msgid "Can't read /dev/random"
|
msgid "Can't read /dev/random"
|
||||||
msgstr "Не могу прочесть /dev/random"
|
msgstr "Не могу прочесть /dev/random"
|
||||||
|
|
||||||
|
#. error reading self name
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/daemon.c:118
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Can't read self name"
|
||||||
|
msgstr "îÅ ÍÏÇÕ ÐÒÏÞÅÓÔØ ÉÍÑ ÐÒÏÃÅÓÓÁ"
|
||||||
|
|
||||||
#. / Не могу настроить консоль
|
#. / Не могу настроить консоль
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:307
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:308
|
||||||
msgid "Can't setup console"
|
msgid "Can't setup console"
|
||||||
msgstr "Не могу настроить консоль"
|
msgstr "Не могу настроить консоль"
|
||||||
|
|
||||||
#. / Не могу выполнить stat %s
|
#. / Не могу выполнить stat %s
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:250
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:251
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Can't stat %s"
|
msgid "Can't stat %s"
|
||||||
msgstr "Не могу выполнить stat %s"
|
msgstr "Не могу выполнить stat %s"
|
||||||
|
|
||||||
|
#. / "îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ× ÂÅÚ ÁÒÇÕÍÅÎÔÏ×!"
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:151
|
||||||
|
msgid "Can't use multiple args with arg_none!"
|
||||||
|
msgstr "íÁÓÓÉ× ÐÁÒÁÍÅÔÒÏ× ÎÅ ÍÏÖÅÔ ÉÍÅÔØ ÔÉÐ arg_none!"
|
||||||
|
|
||||||
|
#. / îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÒÔ %s
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:105
|
||||||
|
#, fuzzy, c-format
|
||||||
|
msgid "Can't use port %s"
|
||||||
|
msgstr "îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÒÔ %s"
|
||||||
|
|
||||||
#. / Целое вне допустимого диапазона
|
#. / Целое вне допустимого диапазона
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:84
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:84
|
||||||
msgid "Integer out of range"
|
msgid "Integer out of range"
|
||||||
msgstr "Целое вне допустимого диапазона"
|
msgstr "Целое вне допустимого диапазона"
|
||||||
|
|
||||||
#. / Ошибка mmap
|
#. / Ошибка mmap
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:257
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:258
|
||||||
msgid "Mmap error for input"
|
msgid "Mmap error for input"
|
||||||
msgstr "Ошибка mmap"
|
msgstr "Ошибка mmap"
|
||||||
|
|
||||||
#. / Не задано имя логфайла
|
#. / Не задано имя логфайла
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:382
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:383
|
||||||
msgid "Need filename for log file"
|
msgid "Need filename for log file"
|
||||||
msgstr "Не задано имя логфайла"
|
msgstr "Не задано имя логфайла"
|
||||||
|
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:176
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:170
|
||||||
msgid "Need non-zero buffer for TTY device"
|
msgid "Need non-zero buffer for TTY device"
|
||||||
|
|
||||||
msgstr "Для последовательного устройства требуется буфер ненулевого размера"
|
msgstr "Для последовательного устройства требуется буфер ненулевого размера"
|
||||||
|
|
||||||
#. / Не задано имя файла!
|
#. / Не задано имя файла!
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:240
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:241
|
||||||
msgid "No filename given!"
|
msgid "No filename given!"
|
||||||
msgstr "Не задано имя файла!"
|
msgstr "Не задано имя файла!"
|
||||||
|
|
||||||
#. / Отсутствует имя порта
|
#. / Отсутствует имя порта
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:169
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/term.c:164
|
||||||
msgid "Port name is missing"
|
msgid "Port name is missing"
|
||||||
msgstr "Отсутствует имя порта"
|
msgstr "Отсутствует имя порта"
|
||||||
|
|
||||||
#. / Пробую открыть логфайл %s в режиме дополнения\n
|
#. / Пробую открыть логфайл %s в режиме дополнения\n
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:386
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/usefull_macros.c:387
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Try to open log file %s in append mode\n"
|
msgid "Try to open log file %s in append mode\n"
|
||||||
msgstr "Пробую открыть логфайл %s в режиме дополнения\n"
|
msgstr "Пробую открыть логфайл %s в режиме дополнения\n"
|
||||||
|
|
||||||
#. / Неправильный аргумент \"%s\" параметра \"%s\"
|
#. / Неправильный аргумент \"%s\" параметра \"%s\"
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:488
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:480
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Wrong argument \"%s\" of parameter \"%s\""
|
msgid "Wrong argument \"%s\" of parameter \"%s\""
|
||||||
msgstr "Неправильный аргумент \"%s\" параметра \"%s\""
|
msgstr "Неправильный аргумент \"%s\" параметра \"%s\""
|
||||||
@ -131,7 +158,7 @@ msgid "Wrong helpstring!"
|
|||||||
msgstr "Неправильный формат строки помощи"
|
msgstr "Неправильный формат строки помощи"
|
||||||
|
|
||||||
#. / Неправильный параметр: %s
|
#. / Неправильный параметр: %s
|
||||||
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:478
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:470
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Wrong parameter: %s"
|
msgid "Wrong parameter: %s"
|
||||||
msgstr "Неправильный параметр: %s"
|
msgstr "Неправильный параметр: %s"
|
||||||
@ -140,3 +167,13 @@ msgstr "
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid "Wrong speed value: %d!"
|
msgid "Wrong speed value: %d!"
|
||||||
msgstr "Неправильное значение скорости: %d!"
|
msgstr "Неправильное значение скорости: %d!"
|
||||||
|
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:252
|
||||||
|
#, c-format
|
||||||
|
msgid "double long arguments: --%s"
|
||||||
|
msgstr "ÄÕÂÌÉÒÕÀÝÉÊÓÑ ÄÌÉÎÎÙÊ ÐÁÒÁÍÅÔÒ: --%s"
|
||||||
|
|
||||||
|
#: /home/eddy/Docs/SAO/C_diff/snippets_library/parseargs.c:258
|
||||||
|
#, c-format
|
||||||
|
msgid "double short arguments: -%c"
|
||||||
|
msgstr "ÄÕÂÌÉÒÕÀÝÉÊÓÑ ËÏÒÏÔËÉÊ ÐÁÒÁÍÅÔÒ: -%c"
|
||||||
|
|||||||
18
parseargs.c
18
parseargs.c
@ -148,7 +148,7 @@ void *get_aptr(void *paptr, argtype type){
|
|||||||
default:
|
default:
|
||||||
case arg_none:
|
case arg_none:
|
||||||
/// "îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ× ÂÅÚ ÁÒÇÕÍÅÎÔÏ×!"
|
/// "îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ× ÂÅÚ ÁÒÇÕÍÅÎÔÏ×!"
|
||||||
ERRX("Can't use multiple args with arg_none!");
|
ERRX(_("Can't use multiple args with arg_none!"));
|
||||||
break;
|
break;
|
||||||
case arg_int:
|
case arg_int:
|
||||||
sz = sizeof(int);
|
sz = sizeof(int);
|
||||||
@ -206,18 +206,14 @@ void parseargs(int *argc, char ***argv, myoption *options){
|
|||||||
short_options = calloc(optsize * 3 + 1, 1); // multiply by three for '::' in case of args in opts
|
short_options = calloc(optsize * 3 + 1, 1); // multiply by three for '::' in case of args in opts
|
||||||
long_options = calloc(optsize + 1, sizeof(struct option));
|
long_options = calloc(optsize + 1, sizeof(struct option));
|
||||||
opts = options; loptr = long_options; soptr = short_options;
|
opts = options; loptr = long_options; soptr = short_options;
|
||||||
// in debug mode check the parameters are not repeated
|
// check the parameters are not repeated
|
||||||
#ifdef EBUG
|
|
||||||
char **longlist = MALLOC(char*, optsize);
|
char **longlist = MALLOC(char*, optsize);
|
||||||
char *shortlist = MALLOC(char, optsize);
|
char *shortlist = MALLOC(char, optsize);
|
||||||
#endif
|
|
||||||
// fill short/long parameters and make a simple checking
|
// fill short/long parameters and make a simple checking
|
||||||
for(i = 0; i < optsize; i++, loptr++, opts++){
|
for(i = 0; i < optsize; i++, loptr++, opts++){
|
||||||
// check
|
// check
|
||||||
assert(opts->name); // check name
|
assert(opts->name); // check name
|
||||||
#ifdef EBUG
|
|
||||||
longlist[i] = strdup(opts->name);
|
longlist[i] = strdup(opts->name);
|
||||||
#endif
|
|
||||||
if(opts->has_arg){
|
if(opts->has_arg){
|
||||||
assert(opts->type != arg_none); // check error with arg type
|
assert(opts->type != arg_none); // check error with arg type
|
||||||
assert(opts->argptr); // check pointer
|
assert(opts->argptr); // check pointer
|
||||||
@ -232,9 +228,7 @@ void parseargs(int *argc, char ***argv, myoption *options){
|
|||||||
loptr->val = opts->val;
|
loptr->val = opts->val;
|
||||||
// fill short options if they are:
|
// fill short options if they are:
|
||||||
if(!opts->flag && opts->val){
|
if(!opts->flag && opts->val){
|
||||||
#ifdef EBUG
|
|
||||||
shortlist[i] = (char) opts->val;
|
shortlist[i] = (char) opts->val;
|
||||||
#endif
|
|
||||||
*soptr++ = opts->val;
|
*soptr++ = opts->val;
|
||||||
if(loptr->has_arg) // add ':' if option has required argument
|
if(loptr->has_arg) // add ':' if option has required argument
|
||||||
*soptr++ = ':';
|
*soptr++ = ':';
|
||||||
@ -243,7 +237,6 @@ void parseargs(int *argc, char ***argv, myoption *options){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// sort all lists & check for repeating
|
// sort all lists & check for repeating
|
||||||
#ifdef EBUG
|
|
||||||
int cmpstringp(const void *p1, const void *p2){
|
int cmpstringp(const void *p1, const void *p2){
|
||||||
return strcmp(* (char * const *) p1, * (char * const *) p2);
|
return strcmp(* (char * const *) p1, * (char * const *) p2);
|
||||||
}
|
}
|
||||||
@ -256,18 +249,17 @@ void parseargs(int *argc, char ***argv, myoption *options){
|
|||||||
for(i = 1; i < optsize; ++i){
|
for(i = 1; i < optsize; ++i){
|
||||||
if(longlist[i]){
|
if(longlist[i]){
|
||||||
if(prevl){
|
if(prevl){
|
||||||
if(strcmp(prevl, longlist[i]) == 0) ERRX("double long arguments: --%s", prevl);
|
if(strcmp(prevl, longlist[i]) == 0) ERRX(_("double long arguments: --%s"), prevl);
|
||||||
}
|
}
|
||||||
prevl = longlist[i];
|
prevl = longlist[i];
|
||||||
}
|
}
|
||||||
if(shortlist[i]){
|
if(shortlist[i]){
|
||||||
if(prevshrt){
|
if(prevshrt){
|
||||||
if(prevshrt == shortlist[i]) ERRX("double short arguments: -%c", prevshrt);
|
if(prevshrt == shortlist[i]) ERRX(_("double short arguments: -%c"), prevshrt);
|
||||||
}
|
}
|
||||||
prevshrt = shortlist[i];
|
prevshrt = shortlist[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// now we have both long_options & short_options and can parse `getopt_long`
|
// now we have both long_options & short_options and can parse `getopt_long`
|
||||||
while(1){
|
while(1){
|
||||||
int opt;
|
int opt;
|
||||||
@ -480,7 +472,7 @@ bool get_suboption(char *str, mysuboption *opt){
|
|||||||
}
|
}
|
||||||
if(noarg && opt[idx].has_arg == NEED_ARG){
|
if(noarg && opt[idx].has_arg == NEED_ARG){
|
||||||
/// %s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!
|
/// %s: ÎÅÏÂÈÏÄÉÍ ÁÒÇÕÍÅÎÔ!
|
||||||
WARNX(_("%s: argument needed!"), tok);
|
WARNX(_("%s: need argument!"), tok);
|
||||||
goto returning;
|
goto returning;
|
||||||
}
|
}
|
||||||
if(!opt_setarg(opt, idx, val)){
|
if(!opt_setarg(opt, idx, val)){
|
||||||
|
|||||||
59
term.c
59
term.c
@ -99,13 +99,12 @@ tcflag_t conv_spd(int speed){
|
|||||||
* @return 0 if all OK or error code
|
* @return 0 if all OK or error code
|
||||||
*/
|
*/
|
||||||
static int tty_init(TTY_descr *descr){
|
static int tty_init(TTY_descr *descr){
|
||||||
DBG("\nOpen port..."); // |O_NONBLOCK
|
// |O_NONBLOCK ?
|
||||||
if ((descr->comfd = open(descr->portname, O_RDWR|O_NOCTTY)) < 0){
|
if ((descr->comfd = open(descr->portname, O_RDWR|O_NOCTTY)) < 0){
|
||||||
/// îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÒÔ %s
|
/// îÅ ÍÏÇÕ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÒÔ %s
|
||||||
WARN(_("Can't use port %s"), descr->portname);
|
WARN(_("Can't use port %s"), descr->portname);
|
||||||
return globErr ? globErr : 1;
|
return globErr ? globErr : 1;
|
||||||
}
|
}
|
||||||
DBG("OK\nGet current settings...");
|
|
||||||
if(tcgetattr(descr->comfd, &descr->oldtty) < 0){ // Get settings
|
if(tcgetattr(descr->comfd, &descr->oldtty) < 0){ // Get settings
|
||||||
/// îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
/// îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÅÊÓÔ×ÕÀÝÉÅ ÎÁÓÔÒÏÊËÉ ÐÏÒÔÁ
|
||||||
WARN(_("Can't get old TTY settings"));
|
WARN(_("Can't get old TTY settings"));
|
||||||
@ -128,7 +127,6 @@ static int tty_init(TTY_descr *descr){
|
|||||||
/// îÅ ÍÏÇÕ ÓÄÅÌÁÔØ ÐÏÒÔ ÜËÓËÌÀÚÉ×ÎÙÍ
|
/// îÅ ÍÏÇÕ ÓÄÅÌÁÔØ ÐÏÒÔ ÜËÓËÌÀÚÉ×ÎÙÍ
|
||||||
WARN(_("Can't do exclusive open"));
|
WARN(_("Can't do exclusive open"));
|
||||||
}}
|
}}
|
||||||
DBG("OK");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,14 +137,12 @@ void close_tty(TTY_descr **descr){
|
|||||||
if(descr == NULL || *descr == NULL) return;
|
if(descr == NULL || *descr == NULL) return;
|
||||||
TTY_descr *d = *descr;
|
TTY_descr *d = *descr;
|
||||||
if(d->comfd){
|
if(d->comfd){
|
||||||
DBG("close file..");
|
|
||||||
ioctl(d->comfd, TCSANOW, &d->oldtty); // return TTY to previous state
|
ioctl(d->comfd, TCSANOW, &d->oldtty); // return TTY to previous state
|
||||||
close(d->comfd);
|
close(d->comfd);
|
||||||
}
|
}
|
||||||
FREE(d->portname);
|
FREE(d->portname);
|
||||||
FREE(d->buf);
|
FREE(d->buf);
|
||||||
FREE(*descr);
|
FREE(*descr);
|
||||||
DBG("done!\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -159,7 +155,6 @@ void close_tty(TTY_descr **descr){
|
|||||||
TTY_descr *new_tty(char *comdev, int speed, size_t bufsz){
|
TTY_descr *new_tty(char *comdev, int speed, size_t bufsz){
|
||||||
tcflag_t spd = conv_spd(speed);
|
tcflag_t spd = conv_spd(speed);
|
||||||
if(!spd) return NULL;
|
if(!spd) return NULL;
|
||||||
DBG("create %s with speed %d and buffer size %zd", comdev, speed, bufsz);
|
|
||||||
TTY_descr *descr = MALLOC(TTY_descr, 1);
|
TTY_descr *descr = MALLOC(TTY_descr, 1);
|
||||||
descr->portname = strdup(comdev);
|
descr->portname = strdup(comdev);
|
||||||
descr->baudrate = spd;
|
descr->baudrate = spd;
|
||||||
@ -171,7 +166,6 @@ TTY_descr *new_tty(char *comdev, int speed, size_t bufsz){
|
|||||||
if(bufsz){
|
if(bufsz){
|
||||||
descr->buf = MALLOC(char, bufsz+1);
|
descr->buf = MALLOC(char, bufsz+1);
|
||||||
descr->bufsz = bufsz;
|
descr->bufsz = bufsz;
|
||||||
DBG("allocate buffer with size %zd", bufsz);
|
|
||||||
return descr;
|
return descr;
|
||||||
}else WARNX(_("Need non-zero buffer for TTY device"));
|
}else WARNX(_("Need non-zero buffer for TTY device"));
|
||||||
}
|
}
|
||||||
@ -187,7 +181,6 @@ TTY_descr *new_tty(char *comdev, int speed, size_t bufsz){
|
|||||||
* @return pointer to TTY structure if all OK
|
* @return pointer to TTY structure if all OK
|
||||||
*/
|
*/
|
||||||
TTY_descr *tty_open(TTY_descr *d, int exclusive){
|
TTY_descr *tty_open(TTY_descr *d, int exclusive){
|
||||||
DBG("open %s with speed %d%s", d->portname, d->speed, exclusive ? "" : " (exclusive)");
|
|
||||||
if(!d || !d->portname || !d->baudrate) return NULL;
|
if(!d || !d->portname || !d->baudrate) return NULL;
|
||||||
if(exclusive) d->exclusive = TRUE;
|
if(exclusive) d->exclusive = TRUE;
|
||||||
else d->exclusive = FALSE;
|
else d->exclusive = FALSE;
|
||||||
@ -195,14 +188,31 @@ TTY_descr *tty_open(TTY_descr *d, int exclusive){
|
|||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct timeval tvdefault = {.tv_sec = 0, .tv_usec = 5000};
|
||||||
|
/**
|
||||||
|
* @brief tty_timeout - set timeout for select() on reading
|
||||||
|
* @param usec - microseconds of timeout
|
||||||
|
* @return -1 if usec < 0, 0 if all OK
|
||||||
|
*/
|
||||||
|
int tty_timeout(double usec){
|
||||||
|
if(usec < 0.) return -1;
|
||||||
|
tvdefault.tv_sec = 0;
|
||||||
|
if(usec > 999999){
|
||||||
|
tvdefault.tv_sec = (__time_t)(usec / 1e6);
|
||||||
|
usec -= tvdefault.tv_sec * 1e6;
|
||||||
|
}
|
||||||
|
tvdefault.tv_usec = (__suseconds_t) usec;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief read_tty - read data from TTY with 10ms timeout
|
* @brief read_tty - read data from TTY with 10ms timeout
|
||||||
* @param buff (o) - buffer for data read
|
* @param buff (o) - buffer for data read
|
||||||
* @param length - buffer len
|
* @param length - buffer len
|
||||||
* @return amount of bytes read
|
* @return amount of bytes read or -1 if disconnected
|
||||||
*/
|
*/
|
||||||
size_t read_tty(TTY_descr *d){
|
int read_tty(TTY_descr *d){
|
||||||
if(d->comfd < 0) return 0;
|
if(!d || d->comfd < 0) return 0;
|
||||||
size_t L = 0;
|
size_t L = 0;
|
||||||
ssize_t l;
|
ssize_t l;
|
||||||
size_t length = d->bufsz;
|
size_t length = d->bufsz;
|
||||||
@ -214,31 +224,23 @@ size_t read_tty(TTY_descr *d){
|
|||||||
l = 0;
|
l = 0;
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
FD_SET(d->comfd, &rfds);
|
FD_SET(d->comfd, &rfds);
|
||||||
// wait for 10ms
|
//memcpy(&tv, &tvdefault, sizeof(struct timeval));
|
||||||
tv.tv_sec = 0; tv.tv_usec = 50000;
|
tv = tvdefault;
|
||||||
retval = select(d->comfd + 1, &rfds, NULL, NULL, &tv);
|
retval = select(d->comfd + 1, &rfds, NULL, NULL, &tv);
|
||||||
if (!retval) break;
|
if(!retval) break;
|
||||||
if(FD_ISSET(d->comfd, &rfds)){
|
if(retval < 0){
|
||||||
if((l = read(d->comfd, ptr, length)) < 1){
|
if(errno == EINTR) continue;
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef EBUG
|
if(FD_ISSET(d->comfd, &rfds)){
|
||||||
char *s = ptr;
|
l = read(d->comfd, ptr, length);
|
||||||
#endif
|
if(l < 1) return -1; // disconnected
|
||||||
ptr += l; L += l;
|
ptr += l; L += l;
|
||||||
#ifdef EBUG
|
|
||||||
*ptr = 0;
|
|
||||||
#endif
|
|
||||||
//DBG("got %zd bytes: %s\nBUF[%zd](%d): %s", l, s, L, d->bufsz, d->buf);
|
|
||||||
DBG("FD %d got %zd bytes: %s\nsym: %d, BUF[%zd](%zd): %s", d->comfd, l, s, (int)s[0], L, d->bufsz, d->buf);
|
|
||||||
length -= l;
|
length -= l;
|
||||||
}
|
}
|
||||||
}while(l && length);
|
}while(l && length);
|
||||||
d->buflen = L;
|
d->buflen = L;
|
||||||
d->buf[L] = 0;
|
d->buf[L] = 0;
|
||||||
#ifdef EBUG
|
|
||||||
if(L) DBG("Got %zd bytes total: %s", d->buflen, d->buf);
|
|
||||||
#endif
|
|
||||||
return (size_t)L;
|
return (size_t)L;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,7 +251,6 @@ size_t read_tty(TTY_descr *d){
|
|||||||
* @return 0 if all OK
|
* @return 0 if all OK
|
||||||
*/
|
*/
|
||||||
int write_tty(int comfd, const char *buff, size_t length){
|
int write_tty(int comfd, const char *buff, size_t length){
|
||||||
DBG("comfd: %d, buff: \"%s\", len: %zd", comfd, buff, length);
|
|
||||||
ssize_t L = write(comfd, buff, length);
|
ssize_t L = write(comfd, buff, length);
|
||||||
if((size_t)L != length){
|
if((size_t)L != length){
|
||||||
/// "ïÛÉÂËÁ ÚÁÐÉÓÉ!"
|
/// "ïÛÉÂËÁ ÚÁÐÉÓÉ!"
|
||||||
|
|||||||
114
usefull_macros.c
114
usefull_macros.c
@ -29,6 +29,7 @@
|
|||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <sys/file.h> // flock
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -46,6 +47,14 @@ void __attribute__ ((weak)) signals(int sig){
|
|||||||
exit(sig);
|
exit(sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief sl_libversion - version
|
||||||
|
* @return return string with library version
|
||||||
|
*/
|
||||||
|
const char *sl_libversion(){
|
||||||
|
return PACKAGE_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief dtime - function for different purposes that need to know time intervals
|
* @brief dtime - function for different purposes that need to know time intervals
|
||||||
* @return double value: UNIX time in seconds
|
* @return double value: UNIX time in seconds
|
||||||
@ -366,7 +375,7 @@ int str2double(double *num, const char *str){
|
|||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
* Logging to file
|
* Logging to file
|
||||||
* BE CAREFULL!!! There's only one log file per process!
|
* DEPRECATED!!! DEPRECATED!!! DEPRECATED!!! DEPRECATED!!! DEPRECATED!!! DEPRECATED!!!
|
||||||
\******************************************************************************/
|
\******************************************************************************/
|
||||||
FILE *Flog = NULL; // log file descriptor
|
FILE *Flog = NULL; // log file descriptor
|
||||||
char *logname = NULL;
|
char *logname = NULL;
|
||||||
@ -422,3 +431,106 @@ int putlog(const char *fmt, ...){
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Logging to file
|
||||||
|
\******************************************************************************/
|
||||||
|
sl_log *globlog = NULL; // "global" log file (the first opened logfile)
|
||||||
|
/**
|
||||||
|
* @brief sl_createlog - create log file, test file open ability
|
||||||
|
* @param logpath - path to log file
|
||||||
|
* @param level - lowest message level (e.g. LOGLEVEL_ERR won't allow to write warn/msg/dbg)
|
||||||
|
* @return allocated structure (should be free'd later by Cl_deletelog) or NULL
|
||||||
|
*/
|
||||||
|
sl_log *sl_createlog(const char *logpath, sl_loglevel level, int prefix){
|
||||||
|
if(level < LOGLEVEL_NONE || level > LOGLEVEL_ANY) return NULL;
|
||||||
|
if(!logpath) return NULL;
|
||||||
|
FILE *logfd = fopen(logpath, "a");
|
||||||
|
if(!logfd){
|
||||||
|
WARN("Can't open log file");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
fclose(logfd);
|
||||||
|
sl_log *log = MALLOC(sl_log, 1);
|
||||||
|
log->logpath = strdup(logpath);
|
||||||
|
if(!log->logpath){
|
||||||
|
WARN("strdup()");
|
||||||
|
FREE(log);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
log->loglevel = level;
|
||||||
|
log->addprefix = prefix;
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sl_deletelog(sl_log **log){
|
||||||
|
if(!log || !*log) return;
|
||||||
|
FREE((*log)->logpath);
|
||||||
|
FREE(*log);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief sl_putlog - put message to log file with/without timestamp
|
||||||
|
* @param timest - ==1 to put timestamp
|
||||||
|
* @param log - pointer to log structure
|
||||||
|
* @param lvl - message loglevel (if lvl > loglevel, message won't be printed)
|
||||||
|
* @param fmt - format and the rest part of message
|
||||||
|
* @return amount of symbols saved in file
|
||||||
|
*/
|
||||||
|
int sl_putlogt(int timest, sl_log *log, sl_loglevel lvl, const char *fmt, ...){
|
||||||
|
if(!log || !log->logpath) return 0;
|
||||||
|
if(lvl > log->loglevel) return 0;
|
||||||
|
int i = 0;
|
||||||
|
FILE *logfd = fopen(log->logpath, "a+");
|
||||||
|
if(!logfd) return 0;
|
||||||
|
int lfd = fileno(logfd);
|
||||||
|
// try to lock file
|
||||||
|
double t0 = dtime();
|
||||||
|
int locked = 0;
|
||||||
|
while(dtime() - t0 < 0.1){ // timeout for 0.1s
|
||||||
|
if(-1 == flock(lfd, LOCK_EX | LOCK_NB)) continue;
|
||||||
|
locked = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!locked) return 0; // can't lock
|
||||||
|
if(log->addprefix){
|
||||||
|
const char *p;
|
||||||
|
switch(lvl){
|
||||||
|
case LOGLEVEL_ERR:
|
||||||
|
p = "[ERR]";
|
||||||
|
break;
|
||||||
|
case LOGLEVEL_WARN:
|
||||||
|
p = "[WARN]";
|
||||||
|
break;
|
||||||
|
case LOGLEVEL_MSG:
|
||||||
|
p = "[MSG]";
|
||||||
|
break;
|
||||||
|
case LOGLEVEL_DBG:
|
||||||
|
p = "[DBG]";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
p = NULL;
|
||||||
|
}
|
||||||
|
if(p) i += fprintf(logfd, "%s\t", p);
|
||||||
|
}
|
||||||
|
if(timest){
|
||||||
|
char strtm[128];
|
||||||
|
time_t t = time(NULL);
|
||||||
|
struct tm *curtm = localtime(&t);
|
||||||
|
strftime(strtm, 128, "%Y/%m/%d-%H:%M:%S", curtm);
|
||||||
|
i = fprintf(logfd, "%s", strtm);
|
||||||
|
}
|
||||||
|
i += fprintf(logfd, "\t");
|
||||||
|
va_list ar;
|
||||||
|
va_start(ar, fmt);
|
||||||
|
i += vfprintf(logfd, fmt, ar);
|
||||||
|
va_end(ar);
|
||||||
|
fseek(logfd, -1, SEEK_CUR);
|
||||||
|
char c;
|
||||||
|
ssize_t r = fread(&c, 1, 1, logfd);
|
||||||
|
if(1 == r){ // add '\n' if there was no newline
|
||||||
|
if(c != '\n') i += fprintf(logfd, "\n");
|
||||||
|
}
|
||||||
|
flock(lfd, LOCK_UN);
|
||||||
|
fclose(logfd);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|||||||
@ -111,6 +111,9 @@ void WEAK signals(int sig);
|
|||||||
#define DBL_EPSILON (2.2204460492503131e-16)
|
#define DBL_EPSILON (2.2204460492503131e-16)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// library version
|
||||||
|
const char *sl_libversion();
|
||||||
|
|
||||||
// double value of UNIX time
|
// double value of UNIX time
|
||||||
double dtime();
|
double dtime();
|
||||||
|
|
||||||
@ -160,16 +163,52 @@ typedef struct {
|
|||||||
void close_tty(TTY_descr **descr);
|
void close_tty(TTY_descr **descr);
|
||||||
TTY_descr *new_tty(char *comdev, int speed, size_t bufsz);
|
TTY_descr *new_tty(char *comdev, int speed, size_t bufsz);
|
||||||
TTY_descr *tty_open(TTY_descr *d, int exclusive);
|
TTY_descr *tty_open(TTY_descr *d, int exclusive);
|
||||||
size_t read_tty(TTY_descr *descr);
|
int read_tty(TTY_descr *descr);
|
||||||
|
int tty_timeout(double usec);
|
||||||
int write_tty(int comfd, const char *buff, size_t length);
|
int write_tty(int comfd, const char *buff, size_t length);
|
||||||
tcflag_t conv_spd(int speed);
|
tcflag_t conv_spd(int speed);
|
||||||
|
|
||||||
// convert string to double with checking
|
// convert string to double with checking
|
||||||
int str2double(double *num, const char *str);
|
int str2double(double *num, const char *str);
|
||||||
|
|
||||||
// logging
|
// logging (deprecated)
|
||||||
void openlogfile(char *name);
|
void __attribute__ ((deprecated)) openlogfile(char *name);
|
||||||
int putlog(const char *fmt, ...);
|
int __attribute__ ((deprecated)) putlog(const char *fmt, ...);
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
Logging
|
||||||
|
\******************************************************************************/
|
||||||
|
typedef enum{
|
||||||
|
LOGLEVEL_NONE, // no logs
|
||||||
|
LOGLEVEL_ERR, // only errors
|
||||||
|
LOGLEVEL_WARN, // only warnings and errors
|
||||||
|
LOGLEVEL_MSG, // all without debug
|
||||||
|
LOGLEVEL_DBG, // all messages
|
||||||
|
LOGLEVEL_ANY // all shit
|
||||||
|
} sl_loglevel;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
char *logpath; // full path to logfile
|
||||||
|
sl_loglevel loglevel; // loglevel
|
||||||
|
int addprefix; // if !=0 add record type to each line(e.g. [ERR])
|
||||||
|
} sl_log;
|
||||||
|
|
||||||
|
extern sl_log *globlog; // "global" log file
|
||||||
|
|
||||||
|
sl_log *sl_createlog(const char *logpath, sl_loglevel level, int prefix);
|
||||||
|
void sl_deletelog(sl_log **log);
|
||||||
|
int sl_putlogt(int timest, sl_log *log, sl_loglevel lvl, const char *fmt, ...);
|
||||||
|
// open "global" log
|
||||||
|
#define OPENLOG(nm, lvl, prefix) (globlog = sl_createlog(nm, lvl, prefix))
|
||||||
|
// shortcuts for different log levels; ..ADD - add message without timestamp
|
||||||
|
#define LOGERR(...) do{sl_putlogt(1, globlog, LOGLEVEL_ERR, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGERRADD(...) do{sl_putlogt(0, globlog, LOGLEVEL_ERR, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGWARN(...) do{sl_putlogt(1, globlog, LOGLEVEL_WARN, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGWARNADD(...) do{sl_putlogt(0, globlog, LOGLEVEL_WARN, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGMSG(...) do{sl_putlogt(1, globlog, LOGLEVEL_MSG, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGMSGADD(...) do{sl_putlogt(0, globlog, LOGLEVEL_MSG, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGDBG(...) do{sl_putlogt(1, globlog, LOGLEVEL_DBG, __VA_ARGS__);}while(0)
|
||||||
|
#define LOGDBGADD(...) do{sl_putlogt(0, globlog, LOGLEVEL_DBG, __VA_ARGS__);}while(0)
|
||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
The original parseargs.h
|
The original parseargs.h
|
||||||
@ -276,7 +315,6 @@ void WEAK iffound_default(pid_t pid);
|
|||||||
void check4running(char *selfname, char *pidfilename);
|
void check4running(char *selfname, char *pidfilename);
|
||||||
// read name of process by its PID
|
// read name of process by its PID
|
||||||
char *readPSname(pid_t pid);
|
char *readPSname(pid_t pid);
|
||||||
#endif // __USEFULL_MACROS_H__
|
|
||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
The original fifo_lifo.h
|
The original fifo_lifo.h
|
||||||
@ -289,3 +327,7 @@ typedef struct buff_node{
|
|||||||
List *list_push_tail(List **lst, void *v);
|
List *list_push_tail(List **lst, void *v);
|
||||||
List *list_push(List **lst, void *v);
|
List *list_push(List **lst, void *v);
|
||||||
void *list_pop(List **lst);
|
void *list_pop(List **lst);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __USEFULL_MACROS_H__
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user