Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
ex_file.c
Go to the documentation of this file.
1/*
2 * Nilorea Library
3 * Copyright (C) 2005-2026 Castagnier Mickael
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
27#include <stdio.h>
28#include <errno.h>
29#include <string.h>
30#include <sys/types.h>
31
32#include "nilorea/n_files.h"
33#include "nilorea/n_log.h"
34#include "nilorea/n_str.h"
35
36#ifndef __windows__
37#include <sys/wait.h>
38#endif
39
40void usage(void) {
41 fprintf(stderr,
42 " -v version\n"
43 " -V log level: LOG_INFO, LOG_NOTICE, LOG_ERR, LOG_DEBUG\n"
44 " -h help\n");
45}
46
47void process_args(int argc, char** argv) {
48 int getoptret = 0,
49 log_level = LOG_DEBUG; /* default log level */
50
51 /* Arguments optionnels */
52 /* -v version
53 * -V log level
54 * -h help
55 */
56 while ((getoptret = getopt(argc, argv, "hvV:")) != EOF) {
57 switch (getoptret) {
58 case 'v':
59 fprintf(stderr, "Date de compilation : %s a %s.\n", __DATE__, __TIME__);
60 exit(1);
61 case 'V':
62 if (!strcmp("LOG_NULL", optarg))
64 else if (!strcmp("LOG_NOTICE", optarg))
66 else if (!strcmp("LOG_INFO", optarg))
68 else if (!strcmp("LOG_ERR", optarg))
70 else if (!strcmp("LOG_DEBUG", optarg))
72 else {
73 fprintf(stderr, "%s n'est pas un niveau de log valide.\n", optarg);
74 exit(-1);
75 }
76 break;
77 default:
78 case '?': {
79 if (optopt == 'V') {
80 fprintf(stderr, "\n Missing log level\n");
81 } else if (optopt == 'p') {
82 fprintf(stderr, "\n Missing port\n");
83 } else if (optopt != 's') {
84 fprintf(stderr, "\n Unknow missing option %c\n", optopt);
85 }
86 usage();
87 exit(1);
88 }
89 case 'h': {
90 usage();
91 exit(1);
92 }
93 }
94 }
96} /* void process_args( ... ) */
97
99 n_log(LOG_DEBUG, "Inlined func");
100}
101
102int main(int argc, char** argv) {
103 /* processing args and set log_level */
104 process_args(argc, argv);
105
106 inlined_func();
107
108 n_log(LOG_INFO, "TRUE,true values: %d,%d / FALSE,false value: %d,%d", TRUE, true, FALSE, false);
109
110 n_log(LOG_INFO, "_str(\"TEST\")=\"%s\" , _str(NULL)=\"%s\"", _str("TEST"), _str(NULL));
111 n_log(LOG_INFO, "_strw(\"TEST\")=\"%s\" , _strw(NULL)=\"%s\"", _str("TEST"), _str(NULL));
112 N_STR* nstr = char_to_nstr("TEST");
113 n_log(LOG_INFO, "_nstr(nstrpointer)=\"%s\"", _nstr(nstr));
114 n_log(LOG_INFO, "_nstrp(nstrpointer)=\"%s\"", _nstrp(nstr));
115 free_nstr(&nstr);
116 n_log(LOG_INFO, "_nstr(nstrpointer_freed)=\"%s\"", _nstr(nstr));
117 n_log(LOG_INFO, "_nstrp(nstrpointer_freed)=\"%s\"", _nstrp(nstr));
118
119 char* data = NULL;
120 __n_assert(data, n_log(LOG_INFO, "data is NULL"));
121 Malloc(data, char, 1024);
122 __n_assert(data, n_log(LOG_INFO, "data is NULL"));
123 Free(data);
124 Malloc(data, char, 1024);
125 Realloc(data, char, 2048);
126 Free(data);
127 Malloc(data, char, 1024);
128 Reallocz(data, char, 1024, 2048);
129 FreeNoLog(data);
130 Alloca(data, 2048);
131 // Free( data ); alloca should not be free else it's double freeing on exit
132
133 n_log(LOG_INFO, "next_odd(10):%d , next_odd(11):%d", next_odd(10), next_odd(11));
134 n_log(LOG_INFO, "next_even(10):%d , next_even(11):%d", next_even(10), next_even(11));
135
137 ifzero(0) endif;
138 ifzero(1) endif;
139 ifnull(data) endif;
140 ifnull(NULL) endif;
141 iffalse(FALSE) endif;
142 iftrue(TRUE) endif;
143 checkerror();
144error:
145 if (get_error()) {
146 n_log(LOG_INFO, "got an error while processing test");
147 } else {
148 n_log(LOG_INFO, "All tests for checkerror() are OK");
149 }
150
151 if (file_exist(argv[0])) {
152 n_log(LOG_INFO, "%s exists !", argv[0]);
153 }
154
155 char *dir = NULL, *name = NULL;
156 dir = get_prog_dir();
157 name = get_prog_name();
158 n_log(LOG_INFO, "From %s/%s", dir, name);
159 Free(dir);
160 Free(name);
161
162 N_STR* out = NULL;
163 int ret = -1;
164 if (n_popen("ls -ltr", 2048, (void*)&out, &ret) == TRUE) {
165 n_log(LOG_INFO, "ls returned %d : %s", ret, _nstr(out));
166 } else {
167 n_log(LOG_ERR, "popen s returned an error");
168 }
169 free_nstr(&out);
170
171 char hidden_str[47] = "";
172 N_HIDE_STR(hidden_str, 'T', 'h', 'i', 's', ' ', 's', 't', 'r', 'i', 'n', 'g', ' ', 'w', 'i', 'l', 'l', ' ', 'b', 'e', ' ', 'h', 'i', 'd', 'd', 'e', 'n', ' ', 'i', 'n', ' ', 't', 'h', 'e', ' ', 'f', 'i', 'n', 'a', 'l', ' ', 'b', 'i', 'n', 'a', 'r', 'y', '\0');
173 printf("hidden str:%s\n", hidden_str);
174
175 /* test n_scan_dir and n_free_file_info from n_files.h */
176 LIST* file_list = new_generic_list(0);
177 if (n_scan_dir(".", file_list, 0) == TRUE) {
178 n_log(LOG_INFO, "n_scan_dir found %zu files in current directory", file_list->nb_items);
179 list_foreach(fnode, file_list) {
180 N_FILE_INFO* fi = (N_FILE_INFO*)fnode->ptr;
181 if (fi && fi->name) {
182 n_log(LOG_DEBUG, " file: %s (time: %ld)", fi->name, (long)fi->filetime);
183 }
184 }
185 } else {
186 n_log(LOG_ERR, "n_scan_dir failed");
187 }
188 list_destroy(&file_list);
189
190#ifndef __windows__
191 n_log(LOG_INFO, "before system_nb( sleep 3 )");
192 int pid = system_nb("sleep 3", NULL, NULL);
193 n_log(LOG_INFO, "after system_nb( sleep 3 )");
194 n_log(LOG_INFO, "wait for nb sys call");
195 wait(&pid);
196 n_log(LOG_INFO, "done");
197 n_daemonize();
198#endif
199 n_abort("Testing abort before exit");
200 n_log(LOG_INFO, "abort done");
201 exit(0);
202}
static void usage(void)
void process_args(int argc, char **argv)
Definition ex_common.c:47
void inlined_func(void)
Definition ex_common.c:98
int main(void)
int getoptret
Definition ex_fluid.c:60
int log_level
Definition ex_fluid.c:61
#define FreeNoLog(__ptr)
Free Handler without log.
Definition n_common.h:271
char * get_prog_name(void)
get current program name
Definition n_common.c:144
#define get_error()
pop up errors if any
Definition n_common.h:330
void N_HIDE_STR(char *buf,...)
store a hidden version of a string
Definition n_common.c:458
#define Malloc(__ptr, __struct, __size)
Malloc Handler to get errors and set to 0.
Definition n_common.h:203
#define __n_assert(__ptr, __ret)
macro to assert things
Definition n_common.h:278
#define _str(__PTR)
define true
Definition n_common.h:192
#define ifzero
error checker type if( 0 != toto )
Definition n_common.h:308
pid_t system_nb(const char *command, int *infp, int *outfp)
Non blocking system call.
Definition n_common.c:389
#define iffalse
error checker type if( toto == FALSE )
Definition n_common.h:311
#define Reallocz(__ptr, __struct, __old_size, __size)
Realloc + zero new memory zone Handler to get errors.
Definition n_common.h:246
#define next_odd(__val)
next odd helper
Definition n_common.h:295
#define Alloca(__ptr, __size)
Malloca Handler to get errors and set to 0.
Definition n_common.h:215
#define endif
close a ifwhatever block
Definition n_common.h:324
#define ifnull
error checker type if( !toto )
Definition n_common.h:305
#define _nstrp(__PTR)
N_STR or NULL pointer for testing purposes.
Definition n_common.h:200
#define next_even(__val)
next even helper
Definition n_common.h:298
char * get_prog_dir(void)
get current program running directory
Definition n_common.c:112
#define FORCE_INLINE
FORCE_INLINE portable macro.
Definition n_common.h:163
#define iftrue
error checker type if( toto == FALSE )
Definition n_common.h:314
#define checkerror()
check for errors
Definition n_common.h:317
void n_abort(char const *format,...)
abort program with a text
Definition n_common.c:52
int n_daemonize(void)
Daemonize program.
Definition n_common.c:283
#define init_error_check()
init error checking in a function
Definition n_common.h:301
#define Realloc(__ptr, __struct, __size)
Realloc Handler to get errors.
Definition n_common.h:230
int file_exist(const char *filename)
test if file exist and if it's readable
Definition n_common.c:99
#define Free(__ptr)
Free Handler to get errors.
Definition n_common.h:262
#define _nstr(__PTR)
N_STR or "NULL" string for logging purposes.
Definition n_common.h:198
int n_popen(char *cmd, size_t read_buf_size, void **nstr_output, int *ret)
launch a command and return output and status
Definition n_common.c:179
size_t nb_items
number of item currently in the list
Definition n_list.h:60
#define list_foreach(__ITEM_, __LIST_)
ForEach macro helper, safe for node removal during iteration.
Definition n_list.h:88
int list_destroy(LIST **list)
Empty and Free a list container.
Definition n_list.c:547
LIST * new_generic_list(size_t max_items)
Initialiaze a generic list container to max_items pointers.
Definition n_list.c:36
Structure of a generic LIST container.
Definition n_list.h:58
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition n_log.h:88
#define LOG_DEBUG
debug-level messages
Definition n_log.h:83
#define LOG_ERR
error conditions
Definition n_log.h:75
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
Definition n_log.c:120
#define LOG_NOTICE
normal but significant condition
Definition n_log.h:79
#define LOG_NULL
no log output
Definition n_log.h:45
#define LOG_INFO
informational
Definition n_log.h:81
time_t filetime
file creation time
Definition n_files.h:49
char * name
file name
Definition n_files.h:47
int n_scan_dir(const char *dir, LIST *result, const int recurse)
Scan a directory and append only regular files into a sorted list (oldest first).
Definition n_files.c:180
common file information
Definition n_files.h:45
#define free_nstr(__ptr)
free a N_STR structure and set the pointer to NULL
Definition n_str.h:201
N_STR * char_to_nstr(const char *src)
Convert a char into a N_STR, short version.
Definition n_str.c:254
A box including a string and his lenght.
Definition n_str.h:60
Files configuration header.
Generic log system.
N_STR and string function declaration.