diff options
author | unknown <monty@mysql.com> | 2004-06-21 10:21:20 +0300 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-06-21 10:21:20 +0300 |
commit | 0c0b2bae9059600def579ac9cce0ad02cc416c0c (patch) | |
tree | a55d40c04126c696aec19a9bdd340a11258e07e6 /netware | |
parent | c18d847386c7fd050cfca341b466bf9ac24aa2b2 (diff) | |
download | mariadb-git-0c0b2bae9059600def579ac9cce0ad02cc416c0c.tar.gz |
After merge fixes
Return NULL if a time argument is given to date_add(). (Warning will be shown after Dimitri's timezone patch is pushed)
client/mysqltest.c:
Added MAX_VAR_NAME which was lost in merge
Added more debugging
Fixed bug in 'eval'
innobase/data/data0type.c:
After merge fix
innobase/fil/fil0fil.c:
After merge fix
innobase/log/log0recv.c:
After merge fix
myisam/mi_unique.c:
Better checksum handling
mysql-test/r/func_time.result:
Return NULL if a time argument is given to date_add()
mysql-test/r/rpl_free_items.result:
After merge fix
mysql-test/r/rpl_get_lock.result:
Test was depending on when server was restarted.
mysql-test/r/type_date.result:
After merge fix
mysql-test/r/type_decimal.result:
After merge fix
mysql-test/t/func_time.test:
Removed comment that is not needed anymore
(After Dimitri's timezone patch is pushed, we should get a warning for the date_add(time...) entry)
mysql-test/t/rpl_get_lock.test:
Test was depending on when server was restarted.
mysql-test/t/type_date.test:
Addded missing explanation for bug
netware/mysqld_safe.c:
Removed end \r
Run program through indent-ex to get MySQL indentation
sql-common/client.c:
After merge fix
sql/field.cc:
Fixed that get_date(time) gives a warning
sql/field.h:
After merge fix
sql/net_serv.cc:
More debugging (if DEBUG_DATA_PACKETS is set)
sql/sql_class.cc:
Removed compiler warning
sql/table.cc:
Better comment
Diffstat (limited to 'netware')
-rw-r--r-- | netware/mysqld_safe.c | 534 |
1 files changed, 272 insertions, 262 deletions
diff --git a/netware/mysqld_safe.c b/netware/mysqld_safe.c index 8d4a5c4a296..a307b52bb7e 100644 --- a/netware/mysqld_safe.c +++ b/netware/mysqld_safe.c @@ -1,20 +1,20 @@ /*
- Copyright (c) 2003 Novell, Inc. All Rights Reserved.
+ Copyright (c) 2003 Novell, Inc. All Rights Reserved. - This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
+ You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
+*/ #include <stdlib.h>
#include <stdio.h>
@@ -32,7 +32,7 @@ /******************************************************************************
global variables
-
+ ******************************************************************************/
char autoclose;
char basedir[PATH_MAX];
@@ -47,38 +47,38 @@ char mysqld[PATH_MAX]; char hostname[PATH_MAX];
char default_option[PATH_MAX];
-FILE *log_fd = NULL;
+FILE *log_fd= NULL; /******************************************************************************
prototypes
-
+ ******************************************************************************/
void usage(void); void vlog(char *, va_list);
void log(char *, ...);
-void start_defaults(int, char*[]);
+void start_defaults(int, char *[]); void finish_defaults();
void read_defaults(arg_list_t *); -void parse_args(int, char*[]);
-void get_options(int, char*[]);
+void parse_args(int, char *[]); +void get_options(int, char *[]); void check_data_vol();
void check_setup();
void check_tables();
-void mysql_start(int, char*[]);
+void mysql_start(int, char *[]); void parse_setvar(char *arg); /******************************************************************************
functions
-
+ ******************************************************************************/
/******************************************************************************
usage() - + Show usage. ******************************************************************************/ @@ -86,7 +86,7 @@ void usage(void) { // keep the screen up setscreenmode(SCR_NO_MODE); - + puts("\ \n\ usage: mysqld_safe [options]\n\ @@ -107,14 +107,14 @@ options:\n\ --mysqld=<file> Use the <file> MySQL daemon.\n\ \n\ "); - + exit(-1); } /****************************************************************************** vlog()
-
+ Log the message.
******************************************************************************/
@@ -122,7 +122,7 @@ void vlog(char *format, va_list ap) {
vfprintf(stdout, format, ap);
fflush(stdout);
-
+ if (log_fd)
{
vfprintf(log_fd, format, ap);
@@ -133,25 +133,25 @@ void vlog(char *format, va_list ap) /******************************************************************************
log()
-
+ Log the message.
******************************************************************************/
void log(char *format, ...)
{
va_list ap;
-
+ va_start(ap, format);
vlog(format, ap);
-
+ va_end(ap);
}
/******************************************************************************
start_defaults()
-
+ Start setting the defaults.
******************************************************************************/
@@ -159,30 +159,30 @@ void start_defaults(int argc, char *argv[]) {
struct stat buf;
int i;
-
+ // default options
- static char *default_options[] =
+ static char *default_options[]= {
- "--no-defaults",
- "--defaults-file=",
- "--defaults-extra-file=",
- NULL
+ "--no-defaults", + "--defaults-file=", + "--defaults-extra-file=", + NULL };
-
+ // autoclose
- autoclose = FALSE;
-
+ autoclose= FALSE; + // basedir
get_basedir(argv[0], basedir);
-
+ // check-tables - checktables = FALSE; - + checktables= FALSE; + // hostname
- if (gethostname(hostname,PATH_MAX) < 0)
+ if (gethostname(hostname, PATH_MAX) < 0) {
// default
- strcpy(hostname,"mysql");
+ strcpy(hostname, "mysql"); }
// address
@@ -190,30 +190,30 @@ void start_defaults(int argc, char *argv[]) // port
snprintf(port, PATH_MAX, "3306");
-
+ // default option
- default_option[0] = NULL;
- for (i=0; (argc > 1) && default_options[i]; i++)
- {
- if(!strnicmp(argv[1], default_options[i], strlen(default_options[i])))
- {
- strncpy(default_option, argv[1], PATH_MAX);
- break;
- }
- }
-
+ default_option[0]= NULL; + for (i= 0; (argc > 1) && default_options[i]; i++) + { + if (!strnicmp(argv[1], default_options[i], strlen(default_options[i]))) + { + strncpy(default_option, argv[1], PATH_MAX); + break; + } + } + // set after basedir is established
- datadir[0] = NULL;
- pid_file[0] = NULL;
- err_log[0] = NULL;
- safe_log[0] = NULL;
- mysqld[0] = NULL;
+ datadir[0]= NULL; + pid_file[0]= NULL; + err_log[0]= NULL; + safe_log[0]= NULL; + mysqld[0]= NULL; }
/******************************************************************************
finish_defaults()
-
+ Finish settig the defaults.
******************************************************************************/
@@ -221,22 +221,27 @@ void finish_defaults() {
struct stat buf;
int i;
-
+ // datadir
- if (!datadir[0]) snprintf(datadir, PATH_MAX, "%s/data", basedir);
-
+ if (!datadir[0]) + snprintf(datadir, PATH_MAX, "%s/data", basedir); + // pid-file
- if (!pid_file[0]) snprintf(pid_file, PATH_MAX, "%s/%s.pid", datadir, hostname);
-
+ if (!pid_file[0]) + snprintf(pid_file, PATH_MAX, "%s/%s.pid", datadir, hostname); + // err-log
- if (!err_log[0]) snprintf(err_log, PATH_MAX, "%s/%s.err", datadir, hostname);
+ if (!err_log[0]) + snprintf(err_log, PATH_MAX, "%s/%s.err", datadir, hostname); // safe-log
- if (!safe_log[0]) snprintf(safe_log, PATH_MAX, "%s/%s.safe", datadir, hostname); + if (!safe_log[0]) + snprintf(safe_log, PATH_MAX, "%s/%s.safe", datadir, hostname); // mysqld
- if (!mysqld[0]) snprintf(mysqld, PATH_MAX, "%s/bin/mysqld-max", basedir);
-
+ if (!mysqld[0]) + snprintf(mysqld, PATH_MAX, "%s/bin/mysqld-max", basedir); + if (stat(mysqld, &buf))
{
snprintf(mysqld, PATH_MAX, "%s/bin/mysqld", basedir);
@@ -246,7 +251,7 @@ void finish_defaults() /******************************************************************************
read_defaults()
-
+ Read the defaults.
******************************************************************************/
@@ -257,64 +262,66 @@ void read_defaults(arg_list_t *pal) char mydefaults[PATH_MAX];
char line[PATH_MAX];
FILE *fp;
-
- // defaults output file
- snprintf(defaults_file, PATH_MAX, "%s/bin/defaults.out", basedir);
- remove(defaults_file);
- // mysqladmin file
+ // defaults output file + snprintf(defaults_file, PATH_MAX, "%s/bin/defaults.out", basedir); + remove(defaults_file); + + // mysqladmin file snprintf(mydefaults, PATH_MAX, "%s/bin/my_print_defaults", basedir);
-
+ // args
init_args(&al); add_arg(&al, mydefaults); - if (default_option[0]) add_arg(&al, default_option); + if (default_option[0]) + add_arg(&al, default_option); add_arg(&al, "mysqld"); add_arg(&al, "server"); add_arg(&al, "mysqld_safe"); add_arg(&al, "safe_mysqld"); - spawn(mydefaults, &al, TRUE, NULL, defaults_file, NULL); + spawn(mydefaults, &al, TRUE, NULL, defaults_file, NULL); free_args(&al); - // gather defaults
- if((fp = fopen(defaults_file, "r")) != NULL)
- {
- while(fgets(line, PATH_MAX, fp))
- {
+ // gather defaults + if ((fp= fopen(defaults_file, "r")) != NULL) + { + while (fgets(line, PATH_MAX, fp)) + { char *p;
-
+ // remove end-of-line character
- if ((p = strrchr(line, '\n')) != NULL) *p = '\0';
-
+ if ((p= strrchr(line, '\n')) != NULL) + *p= '\0'; + // add the option as an argument
- add_arg(pal, line);
- }
-
- fclose(fp);
- }
-
- // remove file
- remove(defaults_file);
+ add_arg(pal, line); + } + + fclose(fp); + } + + // remove file + remove(defaults_file); }
/******************************************************************************
parse_args()
-
+ Get the options.
******************************************************************************/
void parse_args(int argc, char *argv[])
{
- int index = 0;
+ int index= 0; int c;
-
+ // parse options
enum opts
{
- OPT_BASEDIR = 0xFF,
+ OPT_BASEDIR= 0xFF, OPT_DATADIR,
OPT_PID_FILE,
OPT_BIND_ADDRESS,
@@ -325,65 +332,64 @@ void parse_args(int argc, char *argv[]) OPT_HELP, OPT_SETVAR };
-
- static struct option options[] =
+ + static struct option options[]= {
- {"autoclose", no_argument, &autoclose, TRUE},
- {"basedir", required_argument, 0, OPT_BASEDIR},
- {"check-tables", no_argument, &checktables, TRUE}, - {"datadir", required_argument, 0, OPT_DATADIR},
- {"pid-file", required_argument, 0, OPT_PID_FILE},
- {"bind-address", required_argument, 0, OPT_BIND_ADDRESS},
- {"port", required_argument, 0, OPT_PORT},
- {"err-log", required_argument, 0, OPT_ERR_LOG},
- {"safe-log", required_argument, 0, OPT_SAFE_LOG},
- {"mysqld", required_argument, 0, OPT_MYSQLD},
- {"help", no_argument, 0, OPT_HELP}, - {"set-variable", required_argument, 0, OPT_SETVAR}, - {0, 0, 0, 0}
+ {"autoclose", no_argument, &autoclose, TRUE}, + {"basedir", required_argument, 0, OPT_BASEDIR}, + {"check-tables", no_argument, &checktables, TRUE}, + {"datadir", required_argument, 0, OPT_DATADIR}, + {"pid-file", required_argument, 0, OPT_PID_FILE}, + {"bind-address", required_argument, 0, OPT_BIND_ADDRESS}, + {"port", required_argument, 0, OPT_PORT}, + {"err-log", required_argument, 0, OPT_ERR_LOG}, + {"safe-log", required_argument, 0, OPT_SAFE_LOG}, + {"mysqld", required_argument, 0, OPT_MYSQLD}, + {"help", no_argument, 0, OPT_HELP}, + {"set-variable", required_argument, 0, OPT_SETVAR}, + {0, 0, 0, 0} };
-
+ // we have to reset getopt_long because we use it multiple times
- optind = 1;
-
+ optind= 1; + // turn off error reporting
- opterr = 0;
-
- while ((c = getopt_long(argc, argv, "b:h:P:", options, &index)) >= 0)
+ opterr= 0; + + while ((c= getopt_long(argc, argv, "b:h:P:", options, &index)) >= 0) {
- switch (c)
- {
+ switch (c) { case OPT_BASEDIR:
case 'b':
strcpy(basedir, optarg);
break;
-
+ case OPT_DATADIR:
case 'h':
strcpy(datadir, optarg);
break;
-
+ case OPT_PID_FILE:
strcpy(pid_file, optarg);
break;
-
+ case OPT_BIND_ADDRESS:
strcpy(address, optarg);
break;
-
+ case OPT_PORT:
case 'P':
strcpy(port, optarg);
break;
-
+ case OPT_ERR_LOG:
strcpy(err_log, optarg);
break;
-
+ case OPT_SAFE_LOG:
strcpy(safe_log, optarg);
break;
-
+ case OPT_MYSQLD:
strcpy(mysqld, optarg);
break;
@@ -391,11 +397,11 @@ void parse_args(int argc, char *argv[]) case OPT_SETVAR: parse_setvar(optarg); break; - + case OPT_HELP: usage(); break; - + default:
// ignore
break;
@@ -410,14 +416,15 @@ void parse_args(int argc, char *argv[]) void parse_setvar(char *arg) { char *pos; - + if ((pos= strindex(arg, "port"))) { - for (; *pos && *pos != '='; pos++) ; + for (; *pos && *pos != '='; pos++); if (*pos) strcpy(port, pos + 1); } } + /****************************************************************************** @@ -425,14 +432,14 @@ void parse_setvar(char *arg) /******************************************************************************
get_options()
-
+ Get the options.
******************************************************************************/
void get_options(int argc, char *argv[])
{
arg_list_t al; -
+ // start defaults
start_defaults(argc, argv);
@@ -442,10 +449,10 @@ void get_options(int argc, char *argv[]) read_defaults(&al); parse_args(al.argc, al.argv); free_args(&al); -
+ // command-line arguments
parse_args(argc, argv);
-
+ // finish defaults
finish_defaults();
}
@@ -453,7 +460,7 @@ void get_options(int argc, char *argv[]) /******************************************************************************
check_data_vol()
-
+ Check the database volume.
******************************************************************************/
@@ -463,23 +470,23 @@ void check_data_vol() struct volume_info vol;
char buff[PATH_MAX];
char *p;
-
+ // clear struct
memset(&vol, 0, sizeof(vol));
-
+ // find volume name
strcpy(buff, datadir);
- if (p = strchr(buff, ':'))
+ if (p= strchr(buff, ':')) {
// terminate after volume name
- *p = 0;
+ *p= 0; }
else
{
// assume SYS volume
strcpy(buff, "SYS");
}
-
+ // retrieve information
netware_vol_info_from_name(&vol, buff);
@@ -493,25 +500,25 @@ void check_data_vol() /******************************************************************************
check_setup()
-
+ Check the current setup.
******************************************************************************/
void check_setup()
{
- struct stat info;
+ struct stat info; char temp[PATH_MAX];
-
+ // remove any current pid_file
- if (!stat(pid_file, &info) && (remove(pid_file) < 0))
- {
+ if (!stat(pid_file, &info) && (remove(pid_file) < 0)) + { log("ERROR: Unable to remove current pid file!\n\n");
exit(-1);
- }
-
- // check the data volume
+ } + + // check the data volume check_data_vol();
-
+ // check for a database
snprintf(temp, PATH_MAX, "%s/mysql/host.frm", datadir);
if (stat(temp, &info))
@@ -524,7 +531,7 @@ void check_setup() /******************************************************************************
check_tables()
-
+ Check the database tables.
******************************************************************************/
@@ -532,21 +539,21 @@ void check_tables() {
arg_list_t al; char mycheck[PATH_MAX];
- char table[PATH_MAX];
- char db[PATH_MAX];
- DIR *datadir_entry, *db_entry, *table_entry;
-
- // status
+ char table[PATH_MAX]; + char db[PATH_MAX]; + DIR *datadir_entry, *db_entry, *table_entry; + + // status log("checking tables...\n");
-
+ // list databases
- if ((datadir_entry = opendir(datadir)) == NULL)
- {
- return;
- }
+ if ((datadir_entry= opendir(datadir)) == NULL) + { + return; + } - while((db_entry = readdir(datadir_entry)) != NULL)
- {
+ while ((db_entry= readdir(datadir_entry)) != NULL) + { if (db_entry->d_name[0] == '.')
{
// Skip
@@ -555,71 +562,71 @@ void check_tables() {
// create long db name
snprintf(db, PATH_MAX, "%s/%s", datadir, db_entry->d_name);
-
+ // list tables
- if ((db_entry = opendir(db)) == NULL)
+ if ((db_entry= opendir(db)) == NULL) {
- continue;
+ continue; }
-
- while((table_entry = readdir(db_entry)) != NULL)
+ + while ((table_entry= readdir(db_entry)) != NULL) {
- // create long table name
- snprintf(table, PATH_MAX, "%s/%s", db, strlwr(table_entry->d_name));
-
- if (strindex(table, ".myi"))
- {
- // ** myisamchk
-
- // mysqladmin file
- snprintf(mycheck, PATH_MAX, "%s/bin/myisamchk", basedir);
-
- // args
- init_args(&al); - add_arg(&al, mycheck); - add_arg(&al, "--silent"); - add_arg(&al, "--force"); - add_arg(&al, "--fast"); - add_arg(&al, "--medium-check"); - add_arg(&al, "-O"); - add_arg(&al, "key_buffer=64M"); - add_arg(&al, "-O"); - add_arg(&al, "sort_buffer=64M"); - add_arg(&al, table); -
- spawn(mycheck, &al, TRUE, NULL, NULL, NULL); -
- free_args(&al); - }
- else if (strindex(table, ".ism"))
- {
- // ** isamchk
-
- // mysqladmin file
- snprintf(mycheck, PATH_MAX, "%s/bin/isamchk", basedir);
-
- // args
- init_args(&al); - add_arg(&al, mycheck); - add_arg(&al, "--silent"); - add_arg(&al, "--force"); - add_arg(&al, "-O"); - add_arg(&al, "sort_buffer=64M"); - add_arg(&al, table); -
- spawn(mycheck, &al, TRUE, NULL, NULL, NULL); -
- free_args(&al); - }
+ // create long table name + snprintf(table, PATH_MAX, "%s/%s", db, strlwr(table_entry->d_name)); + + if (strindex(table, ".myi")) + { + // ** myisamchk + + // mysqladmin file + snprintf(mycheck, PATH_MAX, "%s/bin/myisamchk", basedir); +
+ // args + init_args(&al); + add_arg(&al, mycheck); + add_arg(&al, "--silent"); + add_arg(&al, "--force"); + add_arg(&al, "--fast"); + add_arg(&al, "--medium-check"); + add_arg(&al, "-O"); + add_arg(&al, "key_buffer=64M"); + add_arg(&al, "-O"); + add_arg(&al, "sort_buffer=64M"); + add_arg(&al, table); +
+ spawn(mycheck, &al, TRUE, NULL, NULL, NULL); + + free_args(&al); + } + else if (strindex(table, ".ism")) + { + // ** isamchk + + // mysqladmin file + snprintf(mycheck, PATH_MAX, "%s/bin/isamchk", basedir); + + // args + init_args(&al); + add_arg(&al, mycheck); + add_arg(&al, "--silent"); + add_arg(&al, "--force"); + add_arg(&al, "-O"); + add_arg(&al, "sort_buffer=64M"); + add_arg(&al, table); + + spawn(mycheck, &al, TRUE, NULL, NULL, NULL); + + free_args(&al); + } }
}
- }
+ } }
/******************************************************************************
mysql_start()
-
+ Start the mysql server.
******************************************************************************/
@@ -632,9 +639,9 @@ void mysql_start(int argc, char *argv[]) struct tm lt; char stamp[PATH_MAX]; char skip; -
+ // private options
- static char *private_options[] =
+ static char *private_options[]= {
"--autoclose", "--check-tables", @@ -643,56 +650,57 @@ void mysql_start(int argc, char *argv[]) "--mysqld=", NULL };
-
+ // args init_args(&al); add_arg(&al, "%s", mysqld); - + // parent args - for(i = 1; i < argc; i++) + for (i= 1; i < argc; i++) { - skip = FALSE;
-
+ skip= FALSE; + // skip private arguments
- for (j=0; private_options[j]; j++)
+ for (j= 0; private_options[j]; j++) {
- if(!strnicmp(argv[i], private_options[j], strlen(private_options[j])))
+ if (!strnicmp(argv[i], private_options[j], strlen(private_options[j]))) {
- skip = TRUE;
- consoleprintf("The argument skipped is %s\n",argv[i]); - break;
+ skip= TRUE; + consoleprintf("The argument skipped is %s\n", argv[i]); + break; }
}
- + if (!skip) { add_arg(&al, "%s", argv[i]); - consoleprintf("The final argument is %s\n",argv[i]); + consoleprintf("The final argument is %s\n", argv[i]); } } // spawn
do { // check the database tables - if (checktables) check_tables(); - + if (checktables) + check_tables(); + // status time(&cal);
localtime_r(&cal, <);
strftime(stamp, PATH_MAX, "%d %b %Y %H:%M:%S", <);
log("mysql started : %s\n", stamp);
- + // spawn mysqld spawn(mysqld, &al, TRUE, NULL, NULL, err_log); } while (!stat(pid_file, &info)); - + // status time(&cal);
localtime_r(&cal, <);
strftime(stamp, PATH_MAX, "%d %b %Y %H:%M:%S", <);
log("mysql stopped : %s\n\n", stamp);
-
+ // free args free_args(&al); }
@@ -700,43 +708,45 @@ void mysql_start(int argc, char *argv[]) /******************************************************************************
main()
-
+ ******************************************************************************/
int main(int argc, char **argv)
{
- char temp[PATH_MAX];
-
+ char temp[PATH_MAX]; + // get the options
- get_options(argc, argv);
+ get_options(argc, argv); // keep the screen up
- if (!autoclose) setscreenmode(SCR_NO_MODE);
-
+ if (!autoclose) + setscreenmode(SCR_NO_MODE); + // create log file
- log_fd = fopen(safe_log, "w+");
-
+ log_fd= fopen(safe_log, "w+"); + // header
log("MySQL Server %s, for %s (%s)\n\n", VERSION, SYSTEM_TYPE, MACHINE_TYPE);
-
- // status
- log("address : %s\n", address);
- log("port : %s\n", port);
+ + // status + log("address : %s\n", address); + log("port : %s\n", port); log("daemon : %s\n", mysqld);
- log("base directory : %s\n", basedir);
- log("data directory : %s\n", datadir);
- log("pid file : %s\n", pid_file);
- log("error file : %s\n", err_log);
- log("log file : %s\n", safe_log);
+ log("base directory : %s\n", basedir); + log("data directory : %s\n", datadir); + log("pid file : %s\n", pid_file); + log("error file : %s\n", err_log); + log("log file : %s\n", safe_log); log("\n");
-
+ // check setup
check_setup();
-
+ // start the MySQL server
- mysql_start(argc, argv);
-
- // close log file
- if (log_fd) fclose(log_fd);
-
+ mysql_start(argc, argv); + + // close log file + if (log_fd) + fclose(log_fd); + return 0;
}
|