osaf/tools/saflog/saflogger/Makefile.am | 1 + osaf/tools/saflog/saflogger/saf_logger.c | 90 ++++++++++++++++++++++++++----- 2 files changed, 75 insertions(+), 16 deletions(-)
With app stream, saflogger used app stream DN as logFileName. With Long DN, the app stream DN could be longer than 255 characters in length. This patch provides one new option -f <filename>. This option is only applicable for app stream. diff --git a/osaf/tools/saflog/saflogger/Makefile.am b/osaf/tools/saflog/saflogger/Makefile.am --- a/osaf/tools/saflog/saflogger/Makefile.am +++ b/osaf/tools/saflog/saflogger/Makefile.am @@ -22,6 +22,7 @@ MAINTAINERCLEANFILES = Makefile.in bin_PROGRAMS = saflogger saflogger_CPPFLAGS = \ + -DSA_EXTENDED_NAME_SOURCE \ $(AM_CPPFLAGS) \ -I$(top_srcdir)/osaf/tools/saflog/include diff --git a/osaf/tools/saflog/saflogger/saf_logger.c b/osaf/tools/saflog/saflogger/saf_logger.c --- a/osaf/tools/saflog/saflogger/saf_logger.c +++ b/osaf/tools/saflog/saflogger/saf_logger.c @@ -37,8 +37,9 @@ #include <poll.h> #include <unistd.h> #include <limits.h> +#include <stdbool.h> +#include "osaf_extended_name.h" -#include <saAis.h> #include <saLog.h> #include "saf_error.h" @@ -83,7 +84,7 @@ static void usage(void) printf("\t%s - write log record to log stream\n", progname); printf("\nSYNOPSIS\n"); - printf("\t%s [options] [message ...]\n", progname); + printf("\t%s [options] [-f <FILENAME>] [message ...]\n", progname); printf("\nDESCRIPTION\n"); printf("\t%s is a SAF LOG client used to write a log record into a specified log stream.\n", progname); @@ -95,11 +96,16 @@ static void usage(void) printf("\t-n or --notification write to notification stream\n"); printf("\t-y or --system write to system stream (default)\n"); printf("\t-a NAME or --application=NAME write to application stream NAME (create it if not exist)\n"); + printf("\t-f FILENAME write log record to FILENAME\n"); printf("\t-s SEV or --severity=SEV use severity SEV, default INFO\n"); printf("\t\tvalid severity names: emerg, alert, crit, error, warn, notice, info\n"); + printf("\nNOTES\n"); + printf("\t1) -f is only applicable for app stream.\n"); + printf("\t1) <FILENAME> length must not be longer than 255 characters.\n"); printf("\nEXAMPLES\n"); printf("\tsaflogger -a safLgStrCfg=Test \"Hello world\"\n"); + printf("\tsaflogger -a safLgStrCfg=Test -f testLogFile \"Hello world\"\n"); printf("\tsaflogger -s crit \"I am going down\"\n\n"); } @@ -230,7 +236,7 @@ static SaLogSeverityT get_severity(char int main(int argc, char *argv[]) { int c; - SaNameT logStreamName = {.length = 0 }; + SaNameT logStreamName; SaLogFileCreateAttributesT_2 *logFileCreateAttributes = NULL; SaLogFileCreateAttributesT_2 appLogFileCreateAttributes; SaLogStreamOpenFlagsT logStreamOpenFlags = 0; @@ -253,6 +259,7 @@ int main(int argc, char *argv[]) SaLogStreamHandleT logStreamHandle; SaSelectionObjectT selectionObject; unsigned int wait_time; + bool is_appstream = false, f_opt = false; srandom(getpid()); @@ -261,11 +268,23 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - sprintf((char *)logSvcUsrName.value, "%s.%u@%s", "saflogger", getpid(), hostname); - logSvcUsrName.length = strlen((char *)logSvcUsrName.value); + if (setenv("SA_ENABLE_EXTENDED_NAMES", "1", 1) != 0) { + fprintf(stderr, "Failed to enable Extended SaNameT"); + exit(EXIT_FAILURE); + } + + /** + * osaf_extended_name_init() is added in case osaf_extended_* APIs + * are used before saLogInitialize(). + */ + osaf_extended_name_init(); + + char svcUserName[kOsafMaxDnLength]; + snprintf(svcUserName, sizeof(svcUserName), "%s.%u@%s", "saflogger", getpid(), hostname); + saAisNameLend(svcUserName, &logSvcUsrName); /* Setup default values */ - strcpy((char *)logStreamName.value, SA_LOG_STREAM_SYSTEM); /* system stream is default */ + saAisNameLend(SA_LOG_STREAM_SYSTEM, &logStreamName); logRecord.logTimeStamp = SA_TIME_UNKNOWN; /* LOG service should supply timestamp */ logRecord.logHdrType = SA_LOG_GENERIC_HEADER; logRecord.logHeader.genericHdr.notificationClassId = NULL; @@ -280,32 +299,58 @@ int main(int argc, char *argv[]) appLogFileCreateAttributes.maxFilesRotated = DEFAULT_MAX_FILES_ROTATED; /* Use built-in log file format in log server for app stream */ appLogFileCreateAttributes.logFileFmt = NULL; + appLogFileCreateAttributes.logFileName = NULL; while (1) { - c = getopt_long(argc, argv, "?hlnya:s:", long_options, NULL); + c = getopt_long(argc, argv, "?hlnya:s:f:", long_options, NULL); if (c == -1) { break; } switch (c) { case 'l': - strcpy((char *)logStreamName.value, SA_LOG_STREAM_ALARM); + saAisNameLend(SA_LOG_STREAM_ALARM, &logStreamName); logRecord.logHdrType = SA_LOG_NTF_HEADER; break; case 'n': - strcpy((char *)logStreamName.value, SA_LOG_STREAM_NOTIFICATION); + saAisNameLend(SA_LOG_STREAM_NOTIFICATION, &logStreamName); logRecord.logHdrType = SA_LOG_NTF_HEADER; break; case 'y': - strcpy((char *)logStreamName.value, SA_LOG_STREAM_SYSTEM); + saAisNameLend(SA_LOG_STREAM_SYSTEM, &logStreamName); break; case 'a': + logFileCreateAttributes = &appLogFileCreateAttributes; + logStreamOpenFlags = SA_LOG_STREAM_CREATE; + + char tmpDn[kOsafMaxDnLength + 8 + 1] = {0}; if (strstr(optarg, "safLgStr")) - strcpy((char *)logStreamName.value, optarg); + strncpy(tmpDn, optarg, sizeof(tmpDn) - 1); else - sprintf((char *)logStreamName.value, "safLgStr=%s", optarg); - logFileCreateAttributes = &appLogFileCreateAttributes; + snprintf(tmpDn, sizeof(tmpDn), "safLgStr=%s", optarg); + + if (strlen(tmpDn) > kOsafMaxDnLength) { + fprintf(stderr, "Application stream DN is so long (%lu). Max: %d \n", + strlen(optarg), kOsafMaxDnLength); + fprintf(stderr, "Shut down app. \n"); + exit(EXIT_FAILURE); + } + saAisNameLend(tmpDn, &logStreamName); + is_appstream = true; + if (f_opt == false) + appLogFileCreateAttributes.logFileName = strdup(optarg); + break; + case 'f': + if (f_opt == true) { + fprintf(stderr, "More than one option -f are given.\n"); + fprintf(stderr, "Try saflogger -h for more information.\n"); + exit(EXIT_FAILURE); + + } + if (appLogFileCreateAttributes.logFileName != NULL) + free(appLogFileCreateAttributes.logFileName); + appLogFileCreateAttributes.logFileName = strdup(optarg); - logStreamOpenFlags = SA_LOG_STREAM_CREATE; + f_opt = true; break; case 's': logRecord.logHeader.genericHdr.logSeverity = get_severity(optarg); @@ -322,6 +367,21 @@ int main(int argc, char *argv[]) } } + if (f_opt == true && is_appstream == false) { + fprintf(stderr, "Note: -f is only applicaple for app stream.\n"); + fprintf(stderr, "Try saflogger -h for more information.\n"); + exit(EXIT_FAILURE); + } + + if (appLogFileCreateAttributes.logFileName != NULL && is_appstream == true) { + size_t len = 0; + if ((len = strlen(appLogFileCreateAttributes.logFileName)) > 255) { + fprintf(stderr, "FILENAME is too long (%zu) (max: 255 characters).\n", len); + fprintf(stderr, "Try saflogger -h for more information.\n"); + exit(EXIT_FAILURE); + } + } + if (optind >= argc) { /* No body of log record */ } @@ -351,8 +411,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - logStreamName.length = strlen((char *)logStreamName.value); - if (logRecord.logHdrType == SA_LOG_NTF_HEADER) { /* Setup some valid values */ logRecord.logHeader.ntfHdr.notificationId = SA_NTF_IDENTIFIER_UNUSED; ------------------------------------------------------------------------------ Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San Francisco, CA to explore cutting-edge tech and listen to tech luminaries present their vision of the future. This family event has something for everyone, including kids. Get more information and register today. http://sdm.link/attshape _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel