File: smartctl.helper.cpp

package info (click to toggle)
etbemon 1.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,624 kB
  • sloc: perl: 18,038; cpp: 546; sh: 428; ansic: 407; makefile: 71
file content (72 lines) | stat: -rw-r--r-- 1,953 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>

void check_device(const char * const dev)
{
  const char * const errmsg = "ERROR: Device \"%s\" didn't match /dev/sd[a-z] /dev/sd[a-z][a-z] /dev/nvme[0-9] /dev/nvme[0-9][0-9]\n";
  if(!strncmp(dev, "/dev/sd", 7))
  {
    if(dev[7] < 'a' || dev[7] > 'z' || (dev[8] && (dev[8] < 'a' || dev[8] > 'z' || dev[9])))
    {
      fprintf(stderr, errmsg, dev);
      exit(1);
    }
  }
  else if(!strncmp(dev, "/dev/nvme", 9))
  {
    if(dev[9] < '0' || dev[9] > '9' || (dev[10] && (dev[10] < '0' || dev[10] > '9' || dev[11])))
    {
      fprintf(stderr, errmsg, dev);
      exit(1);
    }
  }
}
int main(int argc, char **argv)
{
  if(argc != 2)
  {
    fprintf(stderr, "ERROR: Must specify device for smartctl\n");
    return 1;
  }
  char *child_args[5];
  child_args[0] = strdup("/usr/sbin/smartctl");
  if(argv[1][0] == 'M')
  {
    char *buf = strdup(argv[1] + 1);
    char *device = strtok(buf, ",");
    char *id;
    if(!device || strncmp(device, "/dev/sd", 7) || !(id = strtok(NULL, ",")) )
    {
      fprintf(stderr, "ERROR: parameter for MegaRAID must be \"M/dev/sdX,X\"\n");
      return 1;
    }
    check_device(device);
    char *megaraid = (char *)malloc(12 + strlen(id));
    strcpy(megaraid, "-dmegaraid,");
    strcpy(megaraid + 11, id);
    child_args[1] = megaraid;
    child_args[2] = strdup("-a");
    child_args[3] = device;
    child_args[4] = NULL;
  }
  else
  {
    if(strncmp(argv[1], "/dev/sd", 7) && strncmp(argv[1], "/dev/nvme", 9))
    {
      fprintf(stderr, "ERROR: First parameter must specify a /dev/sd or /dev/nvme device\n");
      return 1;
    }
    check_device(argv[1]);
    child_args[1] = strdup("-a");
    child_args[2] = argv[1];
    child_args[3] = NULL;
  }
  execv(child_args[0], (char* const*)child_args);
  fprintf(stderr, "ERROR: Can't execute %s\n", child_args[0]);
  return 1;
}