int main(int argc, char **argv) { SetDefaultLogging("TEST"); SetNamePgm("verif_syntax"); char *errtxt; char *fichier; config_file_t config; if ((argc > 1) && (argv[1])) { fichier = argv[1]; } else { LogTest("Usage %s <config_file>", argv[0]); exit(EINVAL); } /* test de la syntaxe du fichier */ config = config_ParseFile(fichier); if (config == NULL) { errtxt = config_GetErrorMsg(); LogTest("Error parsing %s : %s", argv[1], errtxt); exit(EINVAL); } else { LogTest("The syntax of the file %s is correct!", argv[1]); exit(0); } return 0; }
/* Skips deleting first entry of export list. */ int rebuild_export_list() { #ifndef FIXME_EXPORT_RELOAD return 0; #else int status = 0; config_file_t config_struct; /* If no configuration file is given, then the caller must want to reparse the * configuration file from startup. */ if(config_path[0] == '\0') { LogCrit(COMPONENT_CONFIG, "Error: No configuration file was specified for reloading exports."); return 0; } /* Attempt to parse the new configuration file */ config_struct = config_ParseFile(config_path); if(!config_struct) { LogCrit(COMPONENT_CONFIG, "rebuild_export_list: Error while parsing new configuration file %s: %s", config_path, config_GetErrorMsg()); return 0; } /* Create the new exports list */ status = ReadExports(config_struct, &temp_exportlist); if(status < 0) { LogCrit(COMPONENT_CONFIG, "rebuild_export_list: Error while parsing export entries"); return status; } else if(status == 0) { LogWarn(COMPONENT_CONFIG, "rebuild_export_list: No export entries found in configuration file !!!"); return 0; } /* At least one worker thread should exist. Each worker thread has a pointer to * the same hash table. */ if(nfs_export_create_root_entry(&temp_exportlist) != TRUE) { LogCrit(COMPONENT_MAIN, "replace_exports: Error initializing Cache Inode root entries"); return 0; } return 1; #endif }
/* Skips deleting first entry of export list. */ int rebuild_export_list(void) { #if 0 int status = 0; config_file_t config_struct; /* If no configuration file is given, then the caller must want to reparse the * configuration file from startup. */ if(config_path == NULL) { LogCrit(COMPONENT_CONFIG, "Error: No configuration file was specified for reloading exports."); return 0; } /* Attempt to parse the new configuration file */ config_struct = config_ParseFile(config_path); if(!config_struct) { LogCrit(COMPONENT_CONFIG, "rebuild_export_list: Error while parsing new configuration file %s: %s", config_path, config_GetErrorMsg()); return 0; } /* Create the new exports list */ status = ReadExports(config_struct, &temp_exportlist); if(status < 0) { LogCrit(COMPONENT_CONFIG, "rebuild_export_list: Error while parsing export entries"); return status; } else if(status == 0) { LogWarn(COMPONENT_CONFIG, "rebuild_export_list: No export entries found in configuration file !!!"); return 0; } return 1; #else return 0; #endif }
int nfs_get_fsalpathlib_conf(char *configPath, path_str_t * PathLib, unsigned int *plen) { int var_max; int var_index; int err; char *key_name; char *key_value; config_item_t block; unsigned int found = FALSE; config_file_t config_struct; unsigned int index=0 ; /* Is the config tree initialized ? */ if(configPath == NULL || PathLib == NULL) LogFatal(COMPONENT_CONFIG, "nfs_get_fsalpathlib_conf configPath=%p PathLib=%p", configPath, PathLib); config_struct = config_ParseFile(configPath); if(!config_struct) LogFatal(COMPONENT_CONFIG, "Error while parsing %s: %s", configPath, config_GetErrorMsg()); /* Get the config BLOCK */ if((block = config_FindItemByName(config_struct, CONF_LABEL_NFS_CORE)) == NULL) { LogFatal(COMPONENT_CONFIG, "Cannot read item \"%s\" from configuration file", CONF_LABEL_NFS_CORE); } else if(config_ItemType(block) != CONFIG_ITEM_BLOCK) { /* Expected to be a block */ LogFatal(COMPONENT_CONFIG, "Item \"%s\" is expected to be a block", CONF_LABEL_NFS_CORE); } var_max = config_GetNbItems(block); for(var_index = 0; var_index < var_max; var_index++) { config_item_t item; item = config_GetItemByIndex(block, var_index); /* Get key's name */ if((err = config_GetKeyValue(item, &key_name, &key_value)) != 0) { LogFatal(COMPONENT_CONFIG, "Error reading key[%d] from section \"%s\" of configuration file.", var_index, CONF_LABEL_NFS_CORE); } if(!strcasecmp(key_name, "FSAL_Shared_Library")) { strncpy(PathLib[index], key_value, MAXPATHLEN); index += 1 ; found = TRUE; /* Do not exceed array size */ if( index == *plen ) break ; } } if(!found) { LogFatal(COMPONENT_CONFIG, "FSAL_Shared_Library not found"); return 1; } *plen = index ; return 0; } /* nfs_get_fsalpathlib_conf */
int main(int argc, char *argv[]) { char *tempo_exec_name = NULL; char localmachine[MAXHOSTNAMELEN + 1]; int c; int pidfile; #ifndef HAVE_DAEMON pid_t son_pid; #endif sigset_t signals_to_block; /* Set the server's boot time and epoch */ now(&ServerBootTime); ServerEpoch = (time_t) ServerBootTime.tv_sec; tempo_exec_name = strrchr(argv[0], '/'); if (tempo_exec_name != NULL) { exec_name = gsh_strdup(tempo_exec_name + 1); if (!exec_name) { fprintf(stderr, "Unable to allocate memory for exec name, exiting...\n"); exit(1); } } if (*exec_name == '\0') exec_name = argv[0]; /* get host name */ if (gethostname(localmachine, sizeof(localmachine)) != 0) { fprintf(stderr, "Could not get local host name, exiting...\n"); exit(1); } else { host_name = gsh_strdup(localmachine); if (!host_name) { fprintf(stderr, "Unable to allocate memory for hostname, exiting...\n"); exit(1); } } /* now parsing options with getopt */ while ((c = getopt(argc, argv, options)) != EOF) { switch (c) { case '@': /* A litlle backdoor to keep track of binary versions */ printf("%s compiled on %s at %s\n", exec_name, __DATE__, __TIME__); printf("Release = %s\n", VERSION); printf("Release comment = %s\n", VERSION_COMMENT); printf("Git HEAD = %s\n", _GIT_HEAD_COMMIT); printf("Git Describe = %s\n", _GIT_DESCRIBE); exit(0); break; case 'L': /* Default Log */ log_path = gsh_strdup(optarg); if (!log_path) { fprintf(stderr, "Unable to allocate memory for log path.\n"); exit(1); } break; case 'N': /* debug level */ debug_level = ReturnLevelAscii(optarg); if (debug_level == -1) { fprintf(stderr, "Invalid value for option 'N': NIV_NULL, NIV_MAJ, NIV_CRIT, NIV_EVENT, NIV_DEBUG, NIV_MID_DEBUG or NIV_FULL_DEBUG expected.\n"); exit(1); } break; case 'f': /* config file */ config_path = gsh_strdup(optarg); if (!config_path) { fprintf(stderr, "Unable to allocate memory for config path.\n"); exit(1); } break; case 'p': /* PID file */ pidfile_path = gsh_strdup(optarg); if (!pidfile_path) { fprintf(stderr, "Path %s too long for option 'f'.\n", optarg); exit(1); } break; case 'd': /* Detach or not detach ? */ detach_flag = true; break; case 'R': /* Shall we manage RPCSEC_GSS ? */ fprintf(stderr, "\n\nThe -R flag is deprecated, use this syntax in the configuration file instead:\n\n"); fprintf(stderr, "NFS_KRB5\n"); fprintf(stderr, "{\n"); fprintf(stderr, "\tPrincipalName = nfs@<your_host> ;\n"); fprintf(stderr, "\tKeytabPath = /etc/krb5.keytab ;\n"); fprintf(stderr, "\tActive_krb5 = true ;\n"); fprintf(stderr, "}\n\n\n"); exit(1); break; case 'T': /* Dump the default configuration on stdout */ my_nfs_start_info.dump_default_config = true; break; case 'E': ServerEpoch = (time_t) atoll(optarg); break; case '?': case 'h': default: /* display the help */ fprintf(stderr, usage, exec_name); exit(0); break; } } /* initialize memory and logging */ nfs_prereq_init(exec_name, host_name, debug_level, log_path); LogEvent(COMPONENT_MAIN, "%s Starting: Version %s, built at %s %s on %s", exec_name, GANESHA_VERSION, __DATE__, __TIME__, BUILD_HOST); /* Start in background, if wanted */ if (detach_flag) { #ifdef HAVE_DAEMON /* daemonize the process (fork, close xterm fds, * detach from parent process) */ if (daemon(0, 0)) LogFatal(COMPONENT_MAIN, "Error detaching process from parent: %s", strerror(errno)); #else /* Step 1: forking a service process */ switch (son_pid = fork()) { case -1: /* Fork failed */ LogFatal(COMPONENT_MAIN, "Could not start nfs daemon (fork error %d (%s)", errno, strerror(errno)); break; case 0: /* This code is within the son (that will actually work) * Let's make it the leader of its group of process */ if (setsid() == -1) { LogFatal(COMPONENT_MAIN, "Could not start nfs daemon (setsid error %d (%s)", errno, strerror(errno)); } break; default: /* This code is within the parent process, * it is useless, it must die */ LogFullDebug(COMPONENT_MAIN, "Starting a child of pid %d", son_pid); exit(0); break; } #endif } /* Make sure Linux file i/o will return with error * if file size is exceeded. */ #ifdef _LINUX signal(SIGXFSZ, SIG_IGN); #endif /* Echo PID into pidfile */ pidfile = open(pidfile_path, O_CREAT | O_RDWR, 0644); if (pidfile == -1) { LogFatal(COMPONENT_MAIN, "Can't open pid file %s for writing", pidfile_path); } else { char linebuf[1024]; struct flock lk; /* Try to obtain a lock on the file */ lk.l_type = F_WRLCK; lk.l_whence = SEEK_SET; lk.l_start = (off_t) 0; lk.l_len = (off_t) 0; if (fcntl(pidfile, F_SETLK, &lk) == -1) LogFatal(COMPONENT_MAIN, "Ganesha already started"); /* Put pid into file, then close it */ (void)snprintf(linebuf, sizeof(linebuf), "%u\n", getpid()); if (write(pidfile, linebuf, strlen(linebuf)) == -1) LogCrit(COMPONENT_MAIN, "Couldn't write pid to file %s", pidfile_path); } /* Set up for the signal handler. * Blocks the signals the signal handler will handle. */ sigemptyset(&signals_to_block); sigaddset(&signals_to_block, SIGTERM); sigaddset(&signals_to_block, SIGHUP); sigaddset(&signals_to_block, SIGPIPE); if (pthread_sigmask(SIG_BLOCK, &signals_to_block, NULL) != 0) LogFatal(COMPONENT_MAIN, "Could not start nfs daemon, pthread_sigmask failed"); /* Parse the configuration file so we all know what is going on. */ if (config_path == NULL) { LogFatal(COMPONENT_INIT, "start_fsals: No configuration file named."); return 1; } config_struct = config_ParseFile(config_path); if (!config_struct) { LogFatal(COMPONENT_INIT, "Error while parsing %s: %s", config_path, config_GetErrorMsg()); } /* We need all the fsal modules loaded so we can have * the list available at exports parsing time. */ start_fsals(config_struct); /* parse configuration file */ if (nfs_set_param_from_conf(config_struct, &my_nfs_start_info)) { LogFatal(COMPONENT_INIT, "Error setting parameters from configuration file."); } if (nfs_check_param_consistency()) { LogFatal(COMPONENT_INIT, "Inconsistent parameters found. Exiting..."); } if (init_fsals(config_struct)) { /* init the FSALs from the config */ LogFatal(COMPONENT_INIT, "FSALs could not initialize. Exiting..."); } /* freeing syntax tree : */ config_Free(config_struct); /* Everything seems to be OK! We can now start service threads */ nfs_start(&my_nfs_start_info); return 0; }