osaf/tools/safntf/include/ntfclient.h |   1 +
 osaf/tools/safntf/ntfsend/ntfsend.c   |  36 ++++++++++++++++++++++++++++++++--
 osaf/tools/safntf/src/ntfclient.c     |  28 +++++++++++++++++++++++++-
 3 files changed, 60 insertions(+), 5 deletions(-)


Added validation for notificationType also, got missed in V1.

This patch adds validation for following attributes:
1)probableCause,
2)eventType
3)perceivedSeverity/severity.
4)eventTime.
5)notificationType.

Also ntfsubcribe prints event time in human readable form also.

diff --git a/osaf/tools/safntf/include/ntfclient.h 
b/osaf/tools/safntf/include/ntfclient.h
--- a/osaf/tools/safntf/include/ntfclient.h
+++ b/osaf/tools/safntf/include/ntfclient.h
@@ -130,5 +130,6 @@ typedef SaUint16T saNotificationFlagsT;
 /* used by ntfread and ntfsend */
 void getVendorId(SaNtfClassIdT *notificationClassId);
 int get_long_digit(char *str, long *val);
+int get_long_long_digit(char *str, long long *val);
 
 #endif
diff --git a/osaf/tools/safntf/ntfsend/ntfsend.c 
b/osaf/tools/safntf/ntfsend/ntfsend.c
--- a/osaf/tools/safntf/ntfsend/ntfsend.c
+++ b/osaf/tools/safntf/ntfsend/ntfsend.c
@@ -773,6 +773,7 @@ sendNotification(const saNotificationAll
 int main(int argc, char *argv[])
 {
        long value;
+       long long valuell;
        char *endptr;
        int current_option;
        SaBoolT optionFlag = SA_FALSE;
@@ -849,12 +850,28 @@ int main(int argc, char *argv[])
                                myNotificationParams.eventType = 
(SaNtfEventTypeT)atoi(optarg);
                                /* No default value */
                                myNotificationFlags = 0x0000;
+                               if ((myNotificationParams.eventType < 
SA_NTF_ALARM_NOTIFICATIONS_START) ||
+                                               (myNotificationParams.eventType 
> SA_NTF_ALARM_ENVIRONMENT)) {
+                                       fprintf(stderr,"invalid value for 
eventType\n");
+                                       exit(EXIT_FAILURE);
+                               }
+       
                                break;
                        case 'E':
-                               myNotificationParams.eventTime = 
(SaTimeT)atoll(optarg);
+                               if (get_long_long_digit(optarg, &valuell)) {
+                                       myNotificationParams.eventTime = 
valuell;
+                               } else {
+                                       fprintf(stderr,"invalid input for 
time\n");
+                                       exit(EXIT_FAILURE);
+                               }
                                break;
                        case 'p':
                                myNotificationParams.probableCause = 
(SaNtfProbableCauseT)atoi(optarg);
+                               if ((myNotificationParams.probableCause < 
SA_NTF_ADAPTER_ERROR) ||
+                                       (myNotificationParams.probableCause > 
SA_NTF_UNSPECIFIED_REASON)) {
+                                       fprintf(stderr,"invalid value for 
probableCause\n");
+                                       exit(EXIT_FAILURE);
+                               }
                                break;
                        case 'r':
                                if (get_long_digit(optarg, &value)) {
@@ -871,10 +888,23 @@ int main(int argc, char *argv[])
                        case 's':
                                myNotificationParams.perceivedSeverity = 
(SaNtfSeverityT)atoi(optarg);
                                myNotificationParams.severity = 
(SaNtfSeverityT)atoi(optarg);
+                               if ((myNotificationParams.severity < 
SA_NTF_SEVERITY_CLEARED) ||
+                                               (myNotificationParams.severity 
> SA_NTF_SEVERITY_CRITICAL)) {
+                                       fprintf(stderr,"invalid value for 
perceivedSeverity/severity\n");
+                                       exit(EXIT_FAILURE);
+                               }
                                break;
                        case 'T':
-                               value = strtol(optarg, &endptr, 16);
-                               myNotificationParams.notificationType = 
(SaNtfNotificationTypeT)value;
+                               value = (SaNtfNotificationTypeT)strtol(optarg, 
&endptr, 16);
+                               if ((value != SA_NTF_TYPE_OBJECT_CREATE_DELETE) 
&& 
+                                               (value != 
SA_NTF_TYPE_ATTRIBUTE_CHANGE) && 
+                                               (value != 
SA_NTF_TYPE_STATE_CHANGE) && 
+                                               (value != SA_NTF_TYPE_ALARM) && 
+                                               (value != 
SA_NTF_TYPE_SECURITY_ALARM)) {
+                                       fprintf(stderr,"invalid value for 
notificationType\n");
+                                       exit(EXIT_FAILURE);
+                               }
+                               myNotificationParams.notificationType = value;
                                break;
                        case ':':
                                (void)printf("Option -%c requires an 
argument!!!!\n", optopt);
diff --git a/osaf/tools/safntf/src/ntfclient.c 
b/osaf/tools/safntf/src/ntfclient.c
--- a/osaf/tools/safntf/src/ntfclient.c
+++ b/osaf/tools/safntf/src/ntfclient.c
@@ -634,6 +634,7 @@ static void print_header(const SaNtfNoti
                  SaNtfSubscriptionIdT subscriptionId,
                  SaNtfNotificationTypeT notificationType)
 {
+       static char time[32];
        if (verbose) {
                printf("notificationID = %d\n",
                       (int)*(notificationHeader->notificationId));
@@ -675,8 +676,12 @@ static void print_header(const SaNtfNoti
                       notificationHeader->notificationClassId->minorId);
        }
 
-       if (verbose)
-               printf("eventTime = %lld\n", *notificationHeader->eventTime);
+       if (verbose) { 
+               time_t time_in_secs = 
*notificationHeader->eventTime/SA_TIME_ONE_SECOND;
+               /*Print time in human readable form also .*/
+               (void)strftime(time, sizeof(time), "%a %b %d %T %Z %Y", 
localtime(&time_in_secs));      
+               printf("eventTime = %lld 
(%s)\n",*notificationHeader->eventTime, time);
+       }
 
        if (notificationHeader->lengthAdditionalText > 0)
                printf("additionalText = \"%s\"\n",
@@ -1010,3 +1015,22 @@ void getVendorId(SaNtfClassIdT * notific
        }
        free(p);
 }
+
+int get_long_long_digit(char *str, long long *val)
+{
+       char *endptr;
+       errno = 0;      
+       *val = strtoll(str, &endptr, 0);
+
+       if ((errno == ERANGE ) || (errno != 0 && *val == 0)) {
+               perror("strtoll");
+               return 0;
+       }
+       if (endptr == str) {
+               fprintf(stderr, "No digits were found\n");
+               return 0;
+       }
+       if (*endptr != '\0')    /* other chars than digits */
+               return 0;
+       return 1;
+}

------------------------------------------------------------------------------
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to