mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-16 11:36:19 +07:00
[PATCH] Add chassis_id program to extras directory
This commit is contained in:
parent
52a8572366
commit
fa5acd760d
26
extras/chassis_id/Makefile
Normal file
26
extras/chassis_id/Makefile
Normal file
@ -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)
|
112
extras/chassis_id/chassis_id.c
Normal file
112
extras/chassis_id/chassis_id.c
Normal file
@ -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;
|
||||
|
||||
}
|
||||
|
34
extras/chassis_id/chassis_id.h
Normal file
34
extras/chassis_id/chassis_id.h
Normal file
@ -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
|
5
extras/chassis_id/provision.tbl
Normal file
5
extras/chassis_id/provision.tbl
Normal file
@ -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
|
102
extras/chassis_id/table.c
Normal file
102
extras/chassis_id/table.c
Normal file
@ -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);
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user