File: hotplug.c

package info (click to toggle)
murasaki 0.5.4-2.1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 296 kB
  • ctags: 281
  • sloc: ansic: 1,608; makefile: 213; sh: 143
file content (150 lines) | stat: -rw-r--r-- 3,352 bytes parent folder | download
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 *  Copyright (c) by Shuu Yamaguchi <shuu@dotaster.com>
 *
 *  $Id: hotplug.c,v 3.8 2002/01/21 17:41:36 shuu Exp shuu $
 *
 *  Can be freely distributed and used under the terms of the GNU GPL.
 */
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<syslog.h>
#include	<unistd.h>

#include	"murasaki.h"

#define	EXEC_PATH		MU_CONF_DIR ":" MU_BIN_DIR ":"
#define	HOTPLUG_MAX_ARGS	3

#define	LOG_LEVEL	LOG_CONS

#ifdef	DEBUG
#define	DPRINTF( args... )		syslog(args)
#define	DPRINT_ARGS(name,arg)	print_args((name),(arg))
#else
#define	DPRINTF( args... )
#define	DPRINT_ARGS(name,arg)
#endif

struct arg_command {
	char *arg;
	char *cmd;
};

struct arg_command cmd_table[] = {
	{MU_ARG_USB,	MU_MURASAKI "." MU_ARG_USB},
	{MU_ARG_PCI,	MU_MURASAKI "." MU_ARG_PCI},
	{MU_ARG_NET,	MU_MURASAKI "." MU_ARG_NET},
	{MU_ARG_IEEE1394,	MU_MURASAKI "." MU_ARG_IEEE1394},
	{NULL,NULL}
};

static int
add_path(char **env)
{
	char *newpath;
	int i;

	for(i = 0;env[i] != NULL;i++) {
		if (strncmp("PATH=",env[i],sizeof("PATH=")-1) == 0)
			break;
	}
	/* 
	 * need to reallocate env if env[i] == NULL
	 * but, I think it should be error.
	 */ 
	if (env[i] == NULL)
		return -1;
	newpath = malloc(sizeof("PATH=") - 1 + sizeof(EXEC_PATH) - 1 + strlen(env[i]) + 1);
	if (newpath == NULL)
		return -1;
	strcpy(newpath,"PATH=");
	strcpy(newpath+sizeof("PATH=")-1,EXEC_PATH);
	strcpy(newpath+sizeof("PATH=")-1+sizeof(EXEC_PATH)-1,env[i]+sizeof("PATH=")-1);
	DPRINTF(LOG_LEVEL,"path = \"%s\"",newpath);
	env[i] = newpath;

	return 0;
}

#ifdef	DEBUG
static void
print_args(char *name,char **av)
{
	int i;

	for(i = 0;av[i] != NULL;i++)
		syslog(LOG_LEVEL,"%s[%d] = \"%s\"\n",name,i,av[i]);

}
#endif

static void
usage(void)
{
	printf("Usage: hotplug usb|pci|net|ieee1394\n");
	exit(1);
}

int
main(int argc,char **argv,char **env)
{
	char *cmd[HOTPLUG_MAX_ARGS];
	int idx;

	if (argc == 1) {
		usage();
	}
	openlog("hotplug",LOG_PID|LOG_CONS,LOG_DAEMON);
	
	if (add_path(env) == -1) {
		exit(1);
	}
	DPRINT_ARGS("argv",argv);

	cmd[1] = NULL;
	for (idx = 0;cmd_table[idx].arg != NULL;idx++) {
		if (strcmp(argv[1],cmd_table[idx].arg) == 0) {
			cmd[0] = cmd_table[idx].cmd;
#ifdef	DEBUG
			switch(idx) {
			case 0:	/* USB */
				DPRINTF(LOG_LEVEL,"%s ACTION=%s PRODUCT=%s TYPE=%s INTERFACE=%s DEVFS=%s DEVICE=%s",
					argv[1],getenv("ACTION"),getenv("PRODUCT"),
					getenv("TYPE"),getenv("INTERFACE"),getenv("DEVFS"),
					getenv("DEVICE"));
					break;
			case 1:	/* PCI */
				DPRINTF(LOG_LEVEL,"%s ACTION=%s PCI_CLASS=%s PCI_ID=%s PCI_SUBSYS_ID=%s PCI_SLOT_NAME=%s",
					argv[1],getenv("ACTION"),getenv("PCI_CLASS"),
					getenv("PCI_ID"),getenv("PCI_SUBSYS_ID"),
					getenv("PCI_SLOT_NAME"));
					break;
			case 2:	/* NET */
				DPRINTF(LOG_LEVEL,"%s ACTION=%s INTERFACE=%s",
					argv[1],getenv("ACTION"),getenv("INTERFACE"));
					break;
			case 3:	/* IEEE1394 */
				DPRINTF(LOG_LEVEL,"%s ACTION=%s VENDOR_ID=%s GUID=%s SPECIFIER_ID=%s VERSION=%s",
					argv[1],getenv("ACTION"),getenv("VENDOR_ID"),
					getenv("GUID"),getenv("SPECIFIER_ID"),getenv("VERSION"));
			}
#endif
			break;
		}
	}
	if (cmd_table[idx].arg == NULL) {
		syslog(LOG_LEVEL,"unknown argument");
#ifdef	DEBUG
		print_args("argv",argv);
		print_args("env",env);
#endif
		exit(1);
	}
	closelog();
	DPRINT_ARGS("cmd",cmd);
	execvp(cmd[0],cmd);

	/* not reached */
	return 0;
}