chiark / gitweb /
[PATCH] Add chassis_id program to extras directory
authoratul.sabharwal@intel.com <atul.sabharwal@intel.com>
Thu, 1 Apr 2004 02:18:58 +0000 (18:18 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:35:13 +0000 (21:35 -0700)
extras/chassis_id/Makefile [new file with mode: 0644]
extras/chassis_id/chassis_id.c [new file with mode: 0644]
extras/chassis_id/chassis_id.h [new file with mode: 0644]
extras/chassis_id/provision.tbl [new file with mode: 0644]
extras/chassis_id/table.c [new file with mode: 0644]

diff --git a/extras/chassis_id/Makefile b/extras/chassis_id/Makefile
new file mode 100644 (file)
index 0000000..d3152e8
--- /dev/null
@@ -0,0 +1,26 @@
+#
+#   **
+#   ** (C) 2003 Intel Corporation
+#   **          Atul Sabharwal <atul.sabharwal@intel.com>
+#   **
+#   ** $Id: Makefile,v 1.3 2004/03/22 23:54:54 atul Exp $
+#   **
+#   ** Distributed under the terms of the GNU Public License, v2.0 or
+#   ** later.
+#   **
+#   ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper;
+#   ** with his permission, they have been re-licensed GPL, and his
+#   ** copyright still applies on them. 
+#   **
+#   */
+#
+CFLAGS = -g 
+TARGET = chassis_id
+
+all:   chassis_id  
+
+chassis_id:    chassis_id.c table.c
+       gcc -o $(TARGET) $(CFLAGS) chassis_id.c table.c
+
+clean: 
+       rm -rf core a.out $(TARGET)
diff --git a/extras/chassis_id/chassis_id.c b/extras/chassis_id/chassis_id.c
new file mode 100644 (file)
index 0000000..8f878b2
--- /dev/null
@@ -0,0 +1,112 @@
+
+  /* -*-c-*-: 
+   **
+   ** (C) 2003 Intel Corporation
+   **          Atul Sabharwal <atul.sabharwal@intel.com>
+   **
+   ** $Id: chassis_id.c,v 1.8 2004/03/22 23:33:10 atul Exp $
+   **
+   ** Distributed under the terms of the GNU Public License, v2.0 or
+   ** later.
+   **
+   ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper;
+   ** with his permission, they have been re-licensed GPL, and his
+   ** copyright still applies on them. 
+   **
+   */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include "chassis_id.h"
+
+//#define DEBUG              1
+
+int main(int argc, char **argv, char ** envp)
+{
+     int chassis_num, slot_num, retval, host_num;
+     char disk_snum[255], devpath[255];
+     char * ptr;
+     int disk_index;
+
+      syslog( LOG_PID| LOG_DAEMON| LOG_ERR, "\n%s", "starting chassis_id" );
+
+#if 0
+     ptr = (char *) getenv( "CHASSIS");
+     if( ptr == NULL )
+          return -ERROR_NO_CHASSIS;
+
+     sscanf(ptr, "%d", &chassis_num);
+     #ifdef DEBUG
+        syslog(LOG_PID| LOG_DAEMON| LOG_ERR, "Chassis %d", chassis_num);
+     #endif
+
+
+     ptr = (char *) getenv( "SLOT" );
+     if( ptr== NULL )
+          return -ERROR_NO_SLOT;
+
+     sscanf(ptr, "%d", &slot_num);
+     #ifdef DEBUG
+        syslog( LOG_PID|LOG_DAEMON| LOG_ERR, "Slot %d", slot_num);
+     #endif
+#endif
+     ptr = (char *) getenv( "DEVPATH");
+     if( ptr == NULL )
+          return -ERROR_NO_DEVPATH;
+
+     sscanf(ptr, "%s", &devpath[0]);
+     #ifdef DEBUG
+        syslog( LOG_PID|LOG_DAEMON| LOG_ERR, "Devpath %s", devpath);
+     #endif
+
+     retval = table_init();
+     if(retval < 0 )
+        return -ERROR_BAD_TABLE;
+     
+     getserial_number( devpath, disk_snum);
+     
+
+     /* Now we open the provisioning table t find actual entry for the serial number*/
+     disk_index =  table_find_disk(disk_snum, &host_num, &chassis_num, &slot_num);
+     if ( disk_index == -1 )
+     {
+        //typical provisioning error
+        return -ERROR_NO_DISK;
+     }
+     else
+     {
+        table_select_disk( disk_index );
+     }
+     return 0;
+}
+
+
+/* Run SCSI id to find serial number of the device */
+int getserial_number( char * devpath, char * snumber )
+{
+   FILE *fp; 
+   char vendor [255], model[255], cmd[255];
+   int retval;
+
+   sprintf(cmd, "/sbin/scsi_id -s %s -p 0x80", devpath);
+
+   fp = popen( cmd, "r");
+
+   if (fp == NULL)
+         return -ERROR_BAD_SNUMBER;
+
+   fscanf( fp, "%s %s %s", vendor, model, snumber);
+   #ifdef DEBUG
+       syslog( LOG_PID| LOG_DAEMON| LOG_ERR, "\n%s", snumber );
+   #endif
+
+   retval = pclose(fp);
+   if (retval == -1)
+         return -ERROR_BAD_SNUMBER;
+   else
+         return NO_ERROR;
+
+}
+
diff --git a/extras/chassis_id/chassis_id.h b/extras/chassis_id/chassis_id.h
new file mode 100644 (file)
index 0000000..db5db90
--- /dev/null
@@ -0,0 +1,34 @@
+
+  /* -*-c-*-: 
+   **
+   ** (C) 2003 Intel Corporation
+   **          Atul Sabharwal <atul.sabharwal@intel.com>
+   **
+   ** $Id: chassis_id.h,v 1.1 2004/03/16 18:24:44 atul Exp $
+   **
+   ** Distributed under the terms of the GNU Public License, v2.0 or
+   ** later.
+   **
+   ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper;
+   ** with his permission, they have been re-licensed GPL, and his
+   ** copyright still applies on them. 
+   **
+   */
+
+#ifndef _CHASSIS_ID_H
+#define _CHASSIS_ID_H
+
+//#define DEBUG              1
+#define ERROR              1
+#define ERROR_NO_SLOT      2
+#define ERROR_NO_CHASSIS   3
+#define ERROR_NO_DEVPATH   4
+#define ERROR_BAD_SNUMBER  5
+#define ERROR_NO_DISK      6
+#define ERROR_BAD_TABLE    7
+#define ERROR_BAD_SCAN     8
+#define NO_ERROR           0
+
+extern int table_init();
+
+#endif
diff --git a/extras/chassis_id/provision.tbl b/extras/chassis_id/provision.tbl
new file mode 100644 (file)
index 0000000..c137fd5
--- /dev/null
@@ -0,0 +1,5 @@
+id  host   number_of_disks     chassis#    slot#   serial#                  name
+1    1         2               1           2      3BM07NKA000070456Z6B     disk1
+2    1         2               1           2      3BM07R68000070456ZCK     disk2
+3    2          2              1           3      3EV08ANK00007219JAVA     disk3
+4    2          2              1           4      3EV00NZB000072190Y90     disk4
diff --git a/extras/chassis_id/table.c b/extras/chassis_id/table.c
new file mode 100644 (file)
index 0000000..418497e
--- /dev/null
@@ -0,0 +1,102 @@
+  /* -*-c-*-: 
+   **
+   ** (C) 2003 Intel Corporation
+   **          Atul Sabharwal <atul.sabharwal@intel.com>
+   **
+   ** $Id: table.c,v 1.4 2004/03/18 21:56:24 atul Exp $
+   **
+   ** Distributed under the terms of the GNU Public License, v2.0 or
+   ** later.
+   **
+   ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper;
+   ** with his permission, they have been re-licensed GPL, and his
+   ** copyright still applies on them. 
+   **
+   */
+
+#include <stdio.h>
+#define TABLE_SIZE 100
+#define PROVISION_DB  "/usr/local/bin/provision.tbl"
+
+struct provision_record
+{
+    int  id;
+    int  host_num;          //port # or adaptor number
+    int  num_disks;
+    int  chassis_num;
+    int  slot_num;
+    char serial_num[32];
+    char name[32];
+
+} ptable[TABLE_SIZE];
+
+int ptable_size;
+
+/* Initialize the provisioning table by reading the data from special file provision.tbl *
+   Return error if something does not work appropriately.                                */
+int table_init()
+{
+   FILE *fp;
+   char ptr[255];
+   int i;
+   
+   fp=fopen( PROVISION_DB, "r");
+
+   if ((fp== NULL) || feof(fp))
+        return -1;
+
+   //skip the first line of text which contains descriptive details.
+   fgets(ptr, 80, fp); 
+   i = 0;
+   while (!feof(fp))
+   {
+       fgets(ptr, 80, fp);     
+       sscanf( ptr, "%d %d %d %d %d %s %s", &ptable[i].id, &ptable[i].host_num, 
+            &ptable[i].num_disks, &ptable[i].chassis_num, &ptable[i].slot_num, 
+              ptable[i].serial_num, ptable[i].name );
+       i++;       
+   }  
+
+   ptable_size = i;
+   fclose(fp);
+   return 0;
+}
+
+
+/*  return -1 when no disk found. Otherwise return index of disk */
+int table_find_disk( char * serialnumber , int * host_num, int * chassis_num, int *slot_num)
+{
+    
+   int i;
+   for(i = 0; i < ptable_size; i++)
+   {
+
+      if(strcmp(ptable[i].serial_num, serialnumber) == 0)
+      {
+
+            *host_num =  ptable[i].host_num;
+            *chassis_num =  ptable[i].chassis_num;
+            *slot_num = ptable[i].slot_num;
+            break;
+      }
+   }
+
+   if(i == ptable_size)
+       return -1;
+   else
+       return i;
+}
+
+/* This function is primarily there for passing the selected disk entry to udev so that *
+ * it can create descriptive GDN for it. So, for that we need to output this data to    *
+ * stdout.                                                                              */
+int table_select_disk( int diskindex )
+{
+   printf("%d ", ptable[diskindex].chassis_num);
+   printf("%d ", ptable[diskindex].slot_num);
+   printf("%d ", ptable[diskindex].host_num);
+   printf("%s ", ptable[diskindex].name);
+
+}
+