diff options
Diffstat (limited to 'src/daemon')
-rwxr-xr-x | src/daemon/dlt-daemon.c | 213 | ||||
-rwxr-xr-x | src/daemon/dlt-daemon.h | 15 | ||||
-rwxr-xr-x | src/daemon/dlt_daemon_common.c | 4 |
3 files changed, 194 insertions, 38 deletions
diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c index 4f30a86..41ef12b 100755 --- a/src/daemon/dlt-daemon.c +++ b/src/daemon/dlt-daemon.c @@ -152,6 +152,7 @@ void usage() printf(" -f filename Enable filtering of messages\n"); printf(" -u size Size of the ringbuffer in bytes (Default: 10024)\n"); printf(" -i directory Directory where to store the persistant configuration (Default: /tmp)\n"); + printf(" -c filename DLT daemon configuration file (Default: /etc/dlt.conf)\n"); } /* usage() */ /** @@ -172,7 +173,7 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) opterr = 0; - while ((c = getopt (argc, argv, "hvasxdlrmnf:o:e:b:y:u:i:")) != -1) + while ((c = getopt (argc, argv, "hvasxdlrmnf:o:e:b:y:u:i:c:")) != -1) { switch (c) { @@ -223,37 +224,42 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) } case 'f': { - daemon_local->flags.fvalue = optarg; + strncpy(daemon_local->flags.fvalue,optarg,sizeof(daemon_local->flags.fvalue)); break; } case 'o': { - daemon_local->flags.ovalue = optarg; + strncpy(daemon_local->flags.ovalue,optarg,sizeof(daemon_local->flags.ovalue)); break; } case 'e': { - daemon_local->flags.evalue = optarg; + strncpy(daemon_local->flags.evalue,optarg,sizeof(daemon_local->flags.evalue)); break; } case 'b': { - daemon_local->flags.bvalue = optarg; + strncpy(daemon_local->flags.bvalue,optarg,sizeof(daemon_local->flags.bvalue)); break; } case 'y': { - daemon_local->flags.yvalue = optarg; + strncpy(daemon_local->flags.yvalue,optarg,sizeof(daemon_local->flags.yvalue)); break; } case 'u': { - daemon_local->flags.uvalue = optarg; + strncpy(daemon_local->flags.uvalue,optarg,sizeof(daemon_local->flags.uvalue)); break; } case 'i': { - daemon_local->flags.ivalue = optarg; + strncpy(daemon_local->flags.ivalue,optarg,sizeof(daemon_local->flags.ivalue)); + break; + } + case 'c': + { + strncpy(daemon_local->flags.cvalue,optarg,sizeof(daemon_local->flags.cvalue)); break; } case 'h': @@ -263,7 +269,7 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) } case '?': { - if (optopt == 'f' || optopt == 'o' || optopt == 'e' || optopt == 'b' || optopt == 'y' || optopt == 'u') + if (optopt == 'f' || optopt == 'o' || optopt == 'e' || optopt == 'b' || optopt == 'y' || optopt == 'u' || optopt == 'c') { fprintf (stderr, "Option -%c requires an argument.\n", optopt); } @@ -292,6 +298,144 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) } /* option_handling() */ /** + * Option file parser + */ +int option_file_parser(DltDaemonLocal *daemon_local) +{ + FILE * pFile; + char line[1024]; + char token[1024]; + char value[1024]; + char *pch; + const char *filename; + + + /* open configuration file */ + if(daemon_local->flags.cvalue[0]) + filename = daemon_local->flags.cvalue; + else + filename = "/etc/dlt.conf"; + printf("Load configuration from file: %s\n",filename); + pFile = fopen (filename,"r"); + + if (pFile!=NULL) + { + while(1) + { + /* fetch line from configuration file */ + if ( fgets (line , 1024 , pFile) != NULL ) + { + //printf("Line: %s\n",line); + pch = strtok (line," =\r\n"); + token[0]=0; + value[0]=0; + + while (pch != NULL) + { + if(strcmp(pch,"#")==0) + break; + + if(token[0]==0) + { + strncpy(token,pch,sizeof(token)); + } + else + { + strncpy(value,pch,sizeof(value)); + break; + } + + pch = strtok (NULL, " =\r\n"); + } + + if(token[0] && value[0]) + { + /* parse arguments here */ + printf("%s = %s\n",token,value); + if(strcmp(token,"Verbose")==0) + { + daemon_local->flags.vflag = atoi(pch); + } + if(strcmp(token,"PrintASCII")==0) + { + daemon_local->flags.aflag = atoi(pch); + } + if(strcmp(token,"PrintHex")==0) + { + daemon_local->flags.xflag = atoi(pch); + } + if(strcmp(token,"PrintHeadersOnly")==0) + { + daemon_local->flags.sflag = atoi(pch); + } + if(strcmp(token,"Daemonize")==0) + { + daemon_local->flags.dflag = atoi(pch); + } + if(strcmp(token,"SendSerialHeader")==0) + { + daemon_local->flags.lflag = atoi(pch); + } + if(strcmp(token,"SendContextRegistration")==0) + { + daemon_local->flags.rflag = atoi(pch); + } + if(strcmp(token,"RS232SyncSerialHeader")==0) + { + daemon_local->flags.mflag = atoi(pch); + } + if(strcmp(token,"TCPSyncSerialHeader")==0) + { + daemon_local->flags.nflag = atoi(pch); + } + if(strcmp(token,"RS232DeviceName")==0) + { + strncpy(daemon_local->flags.yvalue,pch,sizeof(daemon_local->flags.yvalue)); + } + if(strcmp(token,"RS232Baudrate")==0) + { + strncpy(daemon_local->flags.bvalue,pch,sizeof(daemon_local->flags.bvalue)); + } + if(strcmp(token,"ECUId")==0) + { + strncpy(daemon_local->flags.evalue,pch,sizeof(daemon_local->flags.evalue)); + } + if(strcmp(token,"LocalLogFilename")==0) + { + strncpy(daemon_local->flags.ovalue,pch,sizeof(daemon_local->flags.ovalue)); + } + if(strcmp(token,"FilterFilename")==0) + { + strncpy(daemon_local->flags.fvalue,pch,sizeof(daemon_local->flags.fvalue)); + } + if(strcmp(token,"RingbufferSize")==0) + { + strncpy(daemon_local->flags.uvalue,pch,sizeof(daemon_local->flags.uvalue)); + } + if(strcmp(token,"PersistanceStoragePath")==0) + { + strncpy(daemon_local->flags.ivalue,pch,sizeof(daemon_local->flags.ivalue)); + } + } + //printf ("Token: %s\n",pch); + + } + else + { + break; + } + } + fclose (pFile); + } + else + { + fprintf(stderr, "Cannot open configuration file: %s\n",filename); + } + + return 0; +} + +/** * Main function of tool. */ int main(int argc, char* argv[]) @@ -311,6 +455,17 @@ int main(int argc, char* argv[]) return -1; } + /* Configuration file option handling */ + if ((back = option_file_parser(&daemon_local))<0) + { + if(back!=-2) { + fprintf (stderr, "option_file_parser() failed!\n"); + } + return -1; + } + + //return(0); + /* Initialize logging facility */ dlt_log_init(daemon_local.flags.dflag); @@ -379,7 +534,7 @@ int main(int argc, char* argv[]) return -1; } } - else if ((i == daemon_local.fdserial) && (daemon_local.flags.yvalue!=0)) + else if ((i == daemon_local.fdserial) && (daemon_local.flags.yvalue[0])) { /* event from serial connection to client received */ if (dlt_daemon_process_client_messages_serial(&daemon, &daemon_local, daemon_local.flags.vflag)==-1) @@ -436,7 +591,7 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in } /* first parse filter file if filter parameter is used */ - if (daemon_local->flags.fvalue) + if (daemon_local->flags.fvalue[0]) { if (dlt_filter_load(&(daemon_local->filter),daemon_local->flags.fvalue,daemon_local->flags.vflag)<0) { @@ -464,7 +619,7 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in /* open DLT output file */ daemon_local->ohandle=-1; - if (daemon_local->flags.ovalue) + if (daemon_local->flags.ovalue[0]) { daemon_local->ohandle = open(daemon_local->flags.ovalue,O_WRONLY|O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); /* mode: wb */ if (daemon_local->ohandle == -1) @@ -498,7 +653,7 @@ int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, in } /* Set ECU id of daemon */ - if (daemon_local->flags.evalue!=0) + if (daemon_local->flags.evalue[0]) { dlt_set_id(daemon->ecuid,daemon_local->flags.evalue); } @@ -511,7 +666,7 @@ int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, in daemon->sendserialheader = daemon_local->flags.lflag; /* prepare ringbuffer size */ - if (daemon_local->flags.uvalue!=0) + if (daemon_local->flags.uvalue[0]) { daemon_local->ringbufferSize = atoi(daemon_local->flags.uvalue); } @@ -540,7 +695,7 @@ int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, in return -1; } - if (daemon_local->flags.yvalue!=0) + if (daemon_local->flags.yvalue[0]) { if (dlt_receiver_init(&(daemon_local->receiverSerial),daemon_local->fdserial,DLT_DAEMON_RCVBUFSIZESERIAL)==-1) { @@ -675,22 +830,22 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon, DltDaemonLocal *daemon_l daemon_local->fdmax = daemon_local->fp; } - if (daemon_local->flags.yvalue!=0) + if (daemon_local->flags.yvalue[0]) { /* create and open serial connection from/to client */ /* open serial connection */ daemon_local->fdserial=open(daemon_local->flags.yvalue,O_RDWR); if (daemon_local->fdserial<0) { - daemon_local->flags.yvalue = 0; sprintf(str,"Failed to open serial device %s\n", daemon_local->flags.yvalue); + daemon_local->flags.yvalue[0] = 0; dlt_log(LOG_ERR, str); return -1; } if (isatty(daemon_local->fdserial)) { - if (daemon_local->flags.bvalue!=0) + if (daemon_local->flags.bvalue[0]) { daemon_local->baudrate = dlt_convert_serial_speed(atoi(daemon_local->flags.bvalue)); } @@ -702,8 +857,8 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon, DltDaemonLocal *daemon_l if (dlt_setup_serial(daemon_local->fdserial,daemon_local->baudrate)<0) { close(daemon_local->fdserial); - daemon_local->flags.yvalue = 0; sprintf(str,"Failed to configure serial device %s (%s) \n", daemon_local->flags.yvalue, strerror(errno)); + daemon_local->flags.yvalue[0] = 0; dlt_log(LOG_ERR, str); return -1; } @@ -723,8 +878,8 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon, DltDaemonLocal *daemon_l else { close(daemon_local->fdserial); - daemon_local->flags.yvalue = 0; fprintf(stderr,"Device is not a serial device, device = %s (%s) \n", daemon_local->flags.yvalue, strerror(errno)); + daemon_local->flags.yvalue[0] = 0; return -1; } } @@ -752,7 +907,7 @@ void dlt_daemon_local_cleanup(DltDaemon *daemon, DltDaemonLocal *daemon_local, i dlt_message_free(&(daemon_local->msg),daemon_local->flags.vflag); close(daemon_local->fp); - if (daemon_local->flags.ovalue) + if (daemon_local->flags.ovalue[0]) { close(daemon_local->ohandle); } /* if */ @@ -1611,7 +1766,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo if (dlt_message_read(&(daemon_local->msg),(unsigned char*)daemon_local->receiver.buf+sizeof(DltUserHeader),daemon_local->receiver.bytesRcvd-sizeof(DltUserHeader),0,verbose)==0) { /* set overwrite ecu id */ - if (daemon_local->flags.evalue!=0) + if (daemon_local->flags.evalue[0]) { /* Set header extra parameters */ dlt_set_id(daemon_local->msg.headerextra.ecu, daemon->ecuid ); @@ -1644,8 +1799,8 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo } } - if ((daemon_local->flags.fvalue==0) || - (daemon_local->flags.fvalue && (dlt_message_filter_check(&(daemon_local->msg),&(daemon_local->filter),verbose)==1))) + if ((daemon_local->flags.fvalue[0]==0) || + (daemon_local->flags.fvalue[0] && (dlt_message_filter_check(&(daemon_local->msg),&(daemon_local->filter),verbose)==1))) { /* if no filter set or filter is matching display message */ if (daemon_local->flags.xflag) @@ -1672,7 +1827,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo } /* if */ /* if file output enabled write message */ - if (daemon_local->flags.ovalue) + if (daemon_local->flags.ovalue[0]) { /* write message to output buffer */ if (dlt_user_log_out2(daemon_local->ohandle, @@ -1694,7 +1849,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo if (FD_ISSET(j, &(daemon_local->master))) { /* except the listener and ourselves */ - if (daemon_local->flags.yvalue!=0) + if (daemon_local->flags.yvalue[0]) { third_value = daemon_local->fdserial; } @@ -1719,7 +1874,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo sent=1; } /* if */ - else if ((j == daemon_local->fdserial) && (daemon_local->flags.yvalue!=0)) + else if ((j == daemon_local->fdserial) && (daemon_local->flags.yvalue[0])) { DLT_DAEMON_SEM_LOCK(); @@ -1869,7 +2024,7 @@ int dlt_daemon_send_ringbuffer_to_client(DltDaemon *daemon, DltDaemonLocal *daem if (FD_ISSET(j, &(daemon_local->master))) { /* except the listener and ourselves */ - if (daemon_local->flags.yvalue!=0) + if (daemon_local->flags.yvalue[0]) { third_value = daemon_local->fdserial; } @@ -1891,7 +2046,7 @@ int dlt_daemon_send_ringbuffer_to_client(DltDaemon *daemon, DltDaemonLocal *daem DLT_DAEMON_SEM_FREE(); } /* if */ - else if ((j == daemon_local->fdserial) && (daemon_local->flags.yvalue!=0)) + else if ((j == daemon_local->fdserial) && (daemon_local->flags.yvalue[0])) { DLT_DAEMON_SEM_LOCK(); diff --git a/src/daemon/dlt-daemon.h b/src/daemon/dlt-daemon.h index 8489ee6..97357e1 100755 --- a/src/daemon/dlt-daemon.h +++ b/src/daemon/dlt-daemon.h @@ -98,13 +98,14 @@ typedef struct int rflag; /**< (Boolean) Send automatic get log info response during context registration */
int mflag; /**< (Boolean) Sync to serial header on serial connection */
int nflag; /**< (Boolean) Sync to serial header on all TCP connections */
- char *ovalue; /**< (String: Filename) Store DLT messages to local log file */
- char *fvalue; /**< (String: Filename) Enable filtering of messages */
- char *evalue; /**< (String: ECU ID) Set ECU ID (Default: ECU1) */
- char *bvalue; /**< (String: Baudrate) Serial device baudrate (Default: 115200) */
- char *yvalue; /**< (String: Devicename) Additional support for serial device */
- char *uvalue; /**< (String: Ringbuffer) Size of the ringbuffer in bytes (Default: 10024) */
- char *ivalue; /**< (String: Directory) Directory where to store the persistant configuration (Default: /tmp) */
+ char ovalue[256]; /**< (String: Filename) Store DLT messages to local log file */
+ char fvalue[256]; /**< (String: Filename) Enable filtering of messages */
+ char evalue[256]; /**< (String: ECU ID) Set ECU ID (Default: ECU1) */
+ char bvalue[256]; /**< (String: Baudrate) Serial device baudrate (Default: 115200) */
+ char yvalue[256]; /**< (String: Devicename) Additional support for serial device */
+ char uvalue[256]; /**< (String: Ringbuffer) Size of the ringbuffer in bytes (Default: 10024) */
+ char ivalue[256]; /**< (String: Directory) Directory where to store the persistant configuration (Default: /tmp) */
+ char cvalue[256]; /**< (String: Directory) Filename of DLT configuration file (Default: /etc/dlt.conf) */
} DltDaemonFlags;
/**
diff --git a/src/daemon/dlt_daemon_common.c b/src/daemon/dlt_daemon_common.c index a4d5dba..ed6103c 100755 --- a/src/daemon/dlt_daemon_common.c +++ b/src/daemon/dlt_daemon_common.c @@ -154,12 +154,12 @@ int dlt_daemon_init(DltDaemon *daemon,const char *runtime_directory, int verbose daemon->runtime_context_cfg_loaded = 0; /* prepare filenames for configuration */ - if(runtime_directory) + if(runtime_directory[0]) strcpy(daemon->runtime_application_cfg,runtime_directory); else strcpy(daemon->runtime_application_cfg,DLT_RUNTIME_DEFAULT_DIRECTORY); strcat(daemon->runtime_application_cfg,DLT_RUNTIME_APPLICATION_CFG); - if(runtime_directory) + if(runtime_directory[0]) strcpy(daemon->runtime_context_cfg,runtime_directory); else strcpy(daemon->runtime_context_cfg,DLT_RUNTIME_DEFAULT_DIRECTORY); |