chiark / gitweb /
[PATCH] clean up chassis_id coding style.
[elogind.git] / extras / chassis_id / chassis_id.c
1 /* -*-c-*-: 
2  **
3  ** (C) 2003 Intel Corporation
4  **          Atul Sabharwal <atul.sabharwal@intel.com>
5  **
6  ** Distributed under the terms of the GNU Public License, v2.0 or
7  ** later.
8  **
9  ** Many parts heavily based on test-skeleton.c, by Ulrich Drepper;
10  ** with his permission, they have been re-licensed GPL, and his
11  ** copyright still applies on them
12  **
13  */
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <syslog.h>
18
19 #include "chassis_id.h"
20
21 //#define DEBUG              1
22
23 int main(int argc, char **argv, char ** envp)
24 {
25         int chassis_num, slot_num, retval, host_num;
26         char disk_snum[255], devpath[255];
27         char *ptr;
28         int disk_index;
29
30         syslog( LOG_PID| LOG_DAEMON| LOG_ERR, "\n%s", "starting chassis_id" );
31
32 #if 0
33         ptr = getenv("CHASSIS");
34         if (ptr == NULL)
35                 return -ERROR_NO_CHASSIS;
36
37         sscanf(ptr, "%d", &chassis_num);
38         #ifdef DEBUG
39         syslog(LOG_PID| LOG_DAEMON| LOG_ERR, "Chassis %d", chassis_num);
40         #endif
41
42
43         ptr = getenv("SLOT");
44         if (ptr== NULL)
45                 return -ERROR_NO_SLOT;
46
47         sscanf(ptr, "%d", &slot_num);
48         #ifdef DEBUG
49         syslog( LOG_PID|LOG_DAEMON| LOG_ERR, "Slot %d", slot_num);
50         #endif
51 #endif
52         ptr = getenv("DEVPATH");
53         if (ptr == NULL)
54                 return -ERROR_NO_DEVPATH;
55
56         sscanf(ptr, "%s", &devpath[0]);
57         #ifdef DEBUG
58         syslog(LOG_PID|LOG_DAEMON| LOG_ERR, "Devpath %s", devpath);
59         #endif
60
61         retval = table_init();
62         if (retval < 0)
63         return -ERROR_BAD_TABLE;
64
65         getserial_number(devpath, disk_snum);
66
67         /* Now we open the provisioning table t find actual entry for the serial number*/
68         disk_index =  table_find_disk(disk_snum, &host_num, &chassis_num, &slot_num);
69         if ( disk_index == -1 ) {
70                 // typical provisioning error
71                 return -ERROR_NO_DISK;
72         } else {
73                 table_select_disk( disk_index );
74         }
75         return 0;
76 }
77
78
79 /* Run SCSI id to find serial number of the device */
80 int getserial_number( char * devpath, char * snumber )
81 {
82         FILE *fp;
83         char vendor[255], model[255], cmd[255];
84         int retval;
85
86         sprintf(cmd, "/sbin/scsi_id -s %s -p 0x80", devpath);
87
88         fp = popen(cmd, "r");
89
90         if (fp == NULL)
91                 return -ERROR_BAD_SNUMBER;
92
93         fscanf(fp, "%s %s %s", vendor, model, snumber);
94         #ifdef DEBUG
95         syslog(LOG_PID| LOG_DAEMON| LOG_ERR, "\n%s", snumber );
96         #endif
97
98         retval = pclose(fp);
99         if (retval == -1)
100                 return -ERROR_BAD_SNUMBER;
101         else
102                 return NO_ERROR;
103 }
104