Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37380950
en ru br
Репозитории ALT
S:2.3-alt1.qa1
5.1: 2.3-alt1
4.0: 2.3-alt0.M40.1
www.altlinux.org/Changes

Группа :: Система/Ядро и оборудование
Пакет: cpqarrayd

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: cpqarrayd-2.3-message-overrun.patch
Скачать


diff -ruN cpqarrayd-2.3-save/cciss_functions.c cpqarrayd-2.3/cciss_functions.c
--- cpqarrayd-2.3-save/cciss_functions.c	2007-12-03 17:06:22.000000000 +0000
+++ cpqarrayd-2.3/cciss_functions.c	2009-08-27 09:34:23.000000000 +0100
@@ -161,17 +161,18 @@
 	iocommand.buf = buffer;
 
 	result = ioctl (device_fd, CCISS_PASSTHRU, &iocommand);
-	if (result < 0)
-	{
+	if (result < 0) {
 		perror (" * ioctl failed");
 		return -1;
 	}
 
 	if (iocommand.error_info.CommandStatus == 1) {
 		printf (" * Command succeeded with dataoverrun (code %d)\n", iocommand.error_info.CommandStatus);
+		return 1;
 	}
 	else if (iocommand.error_info.CommandStatus == 2) {
 		printf (" * Command succeeded with dataunderrun (code %d)\n", iocommand.error_info.CommandStatus);
+		return 2;
 	}
 	else if (iocommand.error_info.CommandStatus != 0)
 	{
diff -ruN cpqarrayd-2.3-save/cciss_structs.h cpqarrayd-2.3/cciss_structs.h
--- cpqarrayd-2.3-save/cciss_structs.h	2005-12-16 11:17:44.000000000 +0000
+++ cpqarrayd-2.3/cciss_structs.h	2009-08-27 09:34:23.000000000 +0100
@@ -37,9 +37,9 @@
 #define CISS_MAX_PHYS_LUN       1024
 
 #define CompareEvent(event,par_class,par_subclass,par_detail) \
-                     ((event.class.class==par_class) && \
-					 (event.class.subclass == par_subclass) && \
-					 (event.class.detail == par_detail))
+                     ((event->class.class==par_class) && \
+					 (event->class.subclass == par_subclass) && \
+					 (event->class.detail == par_detail))
 
 #pragma pack(1) /* these structures must be byte aligned */
 typedef struct _cciss_event_physicaldrivechange {
diff -ruN cpqarrayd-2.3-save/discover.c cpqarrayd-2.3/discover.c
--- cpqarrayd-2.3-save/discover.c	2009-08-26 21:37:55.000000000 +0100
+++ cpqarrayd-2.3/discover.c	2009-08-27 09:35:03.000000000 +0100
@@ -300,7 +300,7 @@
 int cciss_interrogate_controller (struct opts opts, const char *devicefile) {
   int devicefd;
   cciss_report_logicallun_struct logicalluns;
-  cciss_event_type event;
+  cciss_event_type *event;
   int listlength = 0;
   int result;
   
@@ -328,13 +328,14 @@
   if (opts.verbose) printf("  Found a CCISS Controller (%d Logical drives)\n",
 			   ctrls_found[ctrls_found_num].num_logd_found);
 
-  result = cciss_get_event(devicefd, 1, &event);
+  event = malloc(sizeof(cciss_event_type));
+  result = cciss_get_event(devicefd, 1, event);
   while (!CompareEvent(event,0,0,0)) {
     printf ("DEBUG: Discarding old event %d/%d/%d\n",
-	    event.class.class, event.class.subclass, event.class.detail);
-    result = cciss_get_event(devicefd, 0, &event);
+	    event->class.class, event->class.subclass, event->class.detail);
+    result = cciss_get_event(devicefd, 0, event);
   }
-
+  free(event);
   close (devicefd);
 
   ctrls_found_num++;
diff -ruN cpqarrayd-2.3-save/status.c cpqarrayd-2.3/status.c
--- cpqarrayd-2.3-save/status.c	2009-08-26 21:37:55.000000000 +0100
+++ cpqarrayd-2.3/status.c	2009-08-27 09:34:23.000000000 +0100
@@ -27,6 +27,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <errno.h>
 #include <string.h>
 #if defined(HAVE_LINUX_COMPILER_H)
   #include <linux/compiler.h>
@@ -59,7 +60,7 @@
   ida_ioctl_t io, io2;
   int status, nr_blks, blks_tr, trap_stat;
   float pvalue;
-  char statusmsg[1024];
+  char *statusmsg;
   int counter;
   
     
@@ -135,19 +136,26 @@
 		    ctrls_found[ctrl_cntr].log_disk[logd_cntr].status, status,
 		    pvalue);
 	  }
-	  sprintf(statusmsg, statusstr[status], ctrl_cntr, logd_cntr, pvalue);
-	  if (opts.debug) {
-	      printf("DEBUG: sending traps.\n");
-	  }
-	  /* Send a trap, syslog if send_trap returns !0. */
-	  if (trap_stat = sendtrap(opts, "beheer", status, statusmsg)) {
-	    syslog(LOG_WARNING, 
-		   "problem sending snmp trap (sendtrap() returned %d)\n",
-		   trap_stat);
+	  if (asprintf(&statusmsg, statusstr[status], ctrl_cntr, logd_cntr, pvalue) > 0) {
 	    if (opts.debug) {
-	      printf("DEBUG: Problem sending snmp trap",
-		     "(sendtrap() returned %d)\n", 
+	      printf("DEBUG: sending traps.\n");
+	    }
+	    /* Send a trap, syslog if send_trap returns !0. */
+	    if (trap_stat = sendtrap(opts, "beheer", status, statusmsg)) {
+	      syslog(LOG_WARNING, 
+		     "problem sending snmp trap (sendtrap() returned %d)\n",
 		     trap_stat);
+	      if (opts.debug) {
+		printf("DEBUG: Problem sending snmp trap",
+		       "(sendtrap() returned %d)\n", 
+		       trap_stat);
+	      }
+	    }
+	    free(statusmsg);
+	  } else {
+	    syslog(LOG_ERR, "Cannot allocate memory for statusmsg");
+	    if (opts.debug) {
+	      printf ("Cannot allocate memory for statusmsg\n");
 	    }
 	  }
 	}
@@ -164,21 +172,28 @@
 		    ctrls_found[ctrl_cntr].log_disk[logd_cntr].pvalue,
 		    pvalue);
 	  }
-	  sprintf(statusmsg, statusstr[status], ctrl_cntr, logd_cntr, pvalue);
-	  if (opts.debug) {
-	      printf("DEBUG: sending traps.\n");
-	  }
-	  if (trap_stat = sendtrap(opts, "beheer", status, statusmsg)) {
-	    syslog(LOG_WARNING,
-		   "problem sending snmp trap (sendtrap() returned %d)\n",
-		   trap_stat);
+	  if (asprintf(&statusmsg, statusstr[status], ctrl_cntr, logd_cntr, pvalue) > 0) {
 	    if (opts.debug) {
-	      printf("DEBUG: Problem sending snmp trap ",
-		     "(sendtrap() returned %d)\n",
+	      printf("DEBUG: sending traps.\n");
+	    }
+	    if (trap_stat = sendtrap(opts, "beheer", status, statusmsg)) {
+	      syslog(LOG_WARNING,
+		     "problem sending snmp trap (sendtrap() returned %d)\n",
 		     trap_stat);
+	      if (opts.debug) {
+		printf("DEBUG: Problem sending snmp trap ",
+		       "(sendtrap() returned %d)\n",
+		       trap_stat);
+	      }
+	    }
+	    free(statusmsg);
+	    ctrls_found[ctrl_cntr].log_disk[logd_cntr].pvalue = pvalue;
+	  } else {
+	    syslog(LOG_ERR, "Cannot allocate memory for statusmsg");
+	    if (opts.debug) {
+	      printf ("Cannot allocate memory for statusmsg\n");
 	    }
 	  }
-	  ctrls_found[ctrl_cntr].log_disk[logd_cntr].pvalue = pvalue;
 	}
 	ctrls_found[ctrl_cntr].log_disk[logd_cntr].status = status;
     }
@@ -198,73 +213,96 @@
   int logd_cntr;
   int status, nr_blks, blks_tr, trap_stat;
   float pvalue;
-  char statusmsg[1024];
+  char *statusmsg;
   int counter;
-  cciss_event_type event;
+  cciss_event_type *event;
   
     
-  for ( ctrl_cntr=0;
-        ctrl_cntr <  ctrls_found_num;
-        ctrl_cntr++) {
+  for ( ctrl_cntr=0; ctrl_cntr <  ctrls_found_num; ctrl_cntr++) {
+
     if (ctrls_found[ctrl_cntr].ctrl_type != CTRLTYPE_CCISS) {
       break;
     }
 
-    devicefd = open (ctrls_found[ctrl_cntr].devicefile, O_RDONLY);
+    if (opts.debug) {
+      printf ("Open device %s\n", ctrls_found[ctrl_cntr].devicefile);
+    }
+
+    if ((devicefd = open (ctrls_found[ctrl_cntr].devicefile, O_RDONLY)) == -1) {
+      syslog(LOG_ERR, "Cannot open %s because %s", ctrls_found[ctrl_cntr].devicefile, strerror(errno));
+      if (opts.debug) {
+	printf ("Cannot open %s because %s", ctrls_found[ctrl_cntr].devicefile, strerror(errno));
+      }
+      continue;
+    }
     
-    result = cciss_get_event(devicefd, 0, &event);
+    event = malloc(sizeof(cciss_event_type));
+    result = cciss_get_event(devicefd, 0, event);
     while (!CompareEvent(event,0,0,0)) {
       printf ("DEBUG: Got event %d/%d/%d\n",
-	      event.class.class, event.class.subclass, event.class.detail);
+	      event->class.class, event->class.subclass, event->class.detail);
       if (CompareEvent(event,5,0,0)) {
-	snprintf(statusmsg, 2048, "CCISS controler %s logical volume %d changed state to %s.",
-		 ctrls_found[ctrl_cntr].devicefile,
-		 event.detail.logstatchange.logicaldrivenumber,
-		 logicaldrivestatusstr[event.detail.logstatchange.newlogicaldrivestate]);
-	status = event.detail.logstatchange.newlogicaldrivestate;
-	syslog(LOG_WARNING, statusmsg);
-	if (opts.debug) {
-	  printf (statusmsg);
-	}
-	if (trap_stat = sendtrap(opts, "public", status, statusmsg)) {
-	  syslog(LOG_WARNING, 
-		 "problem sending snmp trap (sendtrap() returned %d)\n",
-		 trap_stat);
+	if(asprintf(&statusmsg, "CCISS controler %s logical volume %d changed state to %s.",
+		    ctrls_found[ctrl_cntr].devicefile,
+		    event->detail.logstatchange.logicaldrivenumber,
+		    logicaldrivestatusstr[event->detail.logstatchange.newlogicaldrivestate]) > 0) {
+	  status = event->detail.logstatchange.newlogicaldrivestate;
+	  syslog(LOG_WARNING, statusmsg);
 	  if (opts.debug) {
-	    printf("DEBUG: Problem sending snmp trap",
-		   "(sendtrap() returned %d)\n", 
+	    printf ("%s\n", statusmsg);
+	  }
+	  if (trap_stat = sendtrap(opts, "public", status, statusmsg)) {
+	    syslog(LOG_WARNING, 
+		   "problem sending snmp trap (sendtrap() returned %d)\n",
 		   trap_stat);
+	    if (opts.debug) {
+	      printf("DEBUG: Problem sending snmp trap",
+		     "(sendtrap() returned %d)\n", 
+		     trap_stat);
+	    }
+	  }
+	  free(statusmsg);
+	} else {
+	  syslog(LOG_ERR, "Cannot allocate memory for statusmsg");
+	  if (opts.debug) {
+	    printf ("Cannot allocate memory for statusmsg\n");
 	  }
 	}
       }
       else {
-	snprintf(statusmsg, 2048, "CCISS controler %s reported: %s.",
-		 ctrls_found[ctrl_cntr].devicefile,
-		 event.mesgstring);
-	status = 255;
-	syslog(LOG_WARNING, statusmsg);
-	if (opts.debug) {
-	  printf (statusmsg);
-	}
-	if (trap_stat = sendtrap(opts, "public", status, statusmsg)) {
-	  syslog(LOG_WARNING, 
-		 "problem sending snmp trap (sendtrap() returned %d)\n",
-		 trap_stat);
+	if(asprintf(statusmsg, "CCISS controler %s reported: %s.",
+		    ctrls_found[ctrl_cntr].devicefile,
+		    event->mesgstring) > 0) {
+	  status = 255;
+	  syslog(LOG_WARNING, statusmsg);
 	  if (opts.debug) {
-	    printf("DEBUG: Problem sending snmp trap",
-		   "(sendtrap() returned %d)\n", 
+	    printf (statusmsg);
+	  }
+	  if (trap_stat = sendtrap(opts, "public", status, statusmsg)) {
+	    syslog(LOG_WARNING, 
+		   "problem sending snmp trap (sendtrap() returned %d)\n",
 		   trap_stat);
+	    if (opts.debug) {
+	      printf("DEBUG: Problem sending snmp trap",
+		     "(sendtrap() returned %d)\n", 
+		     trap_stat);
+	    }
+	  }
+	  free(statusmsg);
+	} else {
+	  syslog(LOG_ERR, "Cannot allocate memory for statusmsg");
+	  if (opts.debug) {
+	    printf ("Cannot allocate memory for statusmsg\n");
 	  }
 	}
       }
-      result = cciss_get_event(devicefd, 0, &event);
+      result = cciss_get_event(devicefd, 0, event);
     }
-
+    free(event);
     close (devicefd);
   }
 
   return 1;
- 
 }
 
 
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin