1*8eea8e29Sap /*
2*8eea8e29Sap  * CDDL HEADER START
3*8eea8e29Sap  *
4*8eea8e29Sap  * The contents of this file are subject to the terms of the
5*8eea8e29Sap  * Common Development and Distribution License, Version 1.0 only
6*8eea8e29Sap  * (the "License").  You may not use this file except in compliance
7*8eea8e29Sap  * with the License.
8*8eea8e29Sap  *
9*8eea8e29Sap  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*8eea8e29Sap  * or http://www.opensolaris.org/os/licensing.
11*8eea8e29Sap  * See the License for the specific language governing permissions
12*8eea8e29Sap  * and limitations under the License.
13*8eea8e29Sap  *
14*8eea8e29Sap  * When distributing Covered Code, include this CDDL HEADER in each
15*8eea8e29Sap  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*8eea8e29Sap  * If applicable, add the following below this CDDL HEADER, with the
17*8eea8e29Sap  * fields enclosed by brackets "[]" replaced with your own identifying
18*8eea8e29Sap  * information: Portions Copyright [yyyy] [name of copyright owner]
19*8eea8e29Sap  *
20*8eea8e29Sap  * CDDL HEADER END
21*8eea8e29Sap  */
22*8eea8e29Sap /*
23*8eea8e29Sap  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*8eea8e29Sap  * Use is subject to license terms.
25*8eea8e29Sap  */
26*8eea8e29Sap 
27*8eea8e29Sap #include "devfsadm.h"
28*8eea8e29Sap #include <stdio.h>
29*8eea8e29Sap #include <stdlib.h>
30*8eea8e29Sap #include <limits.h>
31*8eea8e29Sap #include <string.h>
32*8eea8e29Sap 
33*8eea8e29Sap #define	DCAM_RE_STRING_LEN	64
34*8eea8e29Sap 
35*8eea8e29Sap #define	DCAM_STR_LINK_RE	"^dcam([0-9]+)$"
36*8eea8e29Sap #define	DCAM_CTL_LINK_RE	"^dcamctl([0-9]+)$"
37*8eea8e29Sap 
38*8eea8e29Sap static int dcam1394_process(di_minor_t minor, di_node_t node);
39*8eea8e29Sap 
40*8eea8e29Sap static devfsadm_create_t dcam1394_cbt[] = {
41*8eea8e29Sap 	{
42*8eea8e29Sap 		"firewire",
43*8eea8e29Sap 		NULL,
44*8eea8e29Sap 		"dcam",
45*8eea8e29Sap 		DRV_RE,
46*8eea8e29Sap 		ILEVEL_0,
47*8eea8e29Sap 		dcam1394_process
48*8eea8e29Sap 	}
49*8eea8e29Sap };
50*8eea8e29Sap 
51*8eea8e29Sap static char *debug_mid = "dcam1394_mid";
52*8eea8e29Sap 
53*8eea8e29Sap DEVFSADM_CREATE_INIT_V0(dcam1394_cbt);
54*8eea8e29Sap 
55*8eea8e29Sap 
56*8eea8e29Sap static devfsadm_remove_t dcam1394_remove_cbt[] = {
57*8eea8e29Sap 	{
58*8eea8e29Sap 		"firewire",
59*8eea8e29Sap 		DCAM_STR_LINK_RE,
60*8eea8e29Sap 		RM_PRE | RM_HOT | RM_ALWAYS,
61*8eea8e29Sap 		ILEVEL_0,
62*8eea8e29Sap 		devfsadm_rm_all
63*8eea8e29Sap 	},
64*8eea8e29Sap 	{
65*8eea8e29Sap 		"firewire",
66*8eea8e29Sap 		DCAM_CTL_LINK_RE,
67*8eea8e29Sap 		RM_PRE | RM_HOT | RM_ALWAYS,
68*8eea8e29Sap 		ILEVEL_0,
69*8eea8e29Sap 		devfsadm_rm_all
70*8eea8e29Sap 	}
71*8eea8e29Sap };
72*8eea8e29Sap 
73*8eea8e29Sap DEVFSADM_REMOVE_INIT_V0(dcam1394_remove_cbt);
74*8eea8e29Sap 
75*8eea8e29Sap int
minor_init(void)76*8eea8e29Sap minor_init(void)
77*8eea8e29Sap {
78*8eea8e29Sap 	devfsadm_print(debug_mid, "dcam1394_link: minor_init\n");
79*8eea8e29Sap 	return (DEVFSADM_SUCCESS);
80*8eea8e29Sap }
81*8eea8e29Sap 
82*8eea8e29Sap int
minor_fini(void)83*8eea8e29Sap minor_fini(void)
84*8eea8e29Sap {
85*8eea8e29Sap 	devfsadm_print(debug_mid, "dcam1394_link: minor_fini\n");
86*8eea8e29Sap 	return (DEVFSADM_SUCCESS);
87*8eea8e29Sap }
88*8eea8e29Sap 
89*8eea8e29Sap 
90*8eea8e29Sap /*
91*8eea8e29Sap  * This function is called for every dcam1394 minor node.
92*8eea8e29Sap  * Calls enumerate to assign a logical dcam1394 id, and then
93*8eea8e29Sap  * devfsadm_mklink to make the link.
94*8eea8e29Sap  */
95*8eea8e29Sap static int
dcam1394_process(di_minor_t minor,di_node_t node)96*8eea8e29Sap dcam1394_process(di_minor_t minor, di_node_t node)
97*8eea8e29Sap {
98*8eea8e29Sap 	char m_name[PATH_MAX], restring0[DCAM_RE_STRING_LEN];
99*8eea8e29Sap 	char l_path[PATH_MAX], p_path[PATH_MAX], *buf, *devfspath;
100*8eea8e29Sap 	devfsadm_enumerate_t re[1];
101*8eea8e29Sap 
102*8eea8e29Sap 	(void) strcpy(m_name, di_minor_name(minor));
103*8eea8e29Sap 
104*8eea8e29Sap 	if (strcmp(di_driver_name(node), "dcam1394") != 0) {
105*8eea8e29Sap 	    return (DEVFSADM_CONTINUE);
106*8eea8e29Sap 	}
107*8eea8e29Sap 
108*8eea8e29Sap 	if (strncmp(m_name, "dcamctl", 7) == 0) {
109*8eea8e29Sap 		(void) snprintf(restring0, DCAM_RE_STRING_LEN,
110*8eea8e29Sap 				DCAM_CTL_LINK_RE);
111*8eea8e29Sap 	} else if (strncmp(m_name, "dcam", 4) == 0) {
112*8eea8e29Sap 		(void) snprintf(restring0, DCAM_RE_STRING_LEN,
113*8eea8e29Sap 				DCAM_STR_LINK_RE);
114*8eea8e29Sap 	} else {
115*8eea8e29Sap 		return (DEVFSADM_CONTINUE);
116*8eea8e29Sap 	}
117*8eea8e29Sap 
118*8eea8e29Sap 	re[0].re	= restring0;
119*8eea8e29Sap 	re[0].subexp	= 1;
120*8eea8e29Sap 	re[0].flags	= MATCH_ALL;
121*8eea8e29Sap 
122*8eea8e29Sap 	devfsadm_print(debug_mid,
123*8eea8e29Sap 	    "dcam1394_process: path %s\n", di_devfs_path(node));
124*8eea8e29Sap 
125*8eea8e29Sap 	(void) strcpy(p_path, devfspath = di_devfs_path(node));
126*8eea8e29Sap 	(void) strcat(p_path, ":");
127*8eea8e29Sap 	(void) strcat(p_path, di_minor_name(minor));
128*8eea8e29Sap 	di_devfs_path_free(devfspath);
129*8eea8e29Sap 
130*8eea8e29Sap 	/*
131*8eea8e29Sap 	 * Build the physical path from the components, omitting
132*8eea8e29Sap 	 * minor name field.  Find the logical dcam1394 id, and
133*8eea8e29Sap 	 * stuff it in buf.
134*8eea8e29Sap 	 */
135*8eea8e29Sap 	if (devfsadm_enumerate_int(p_path, 0, &buf, re, 1)) {
136*8eea8e29Sap 		devfsadm_print(debug_mid,
137*8eea8e29Sap 		    "dcam1394_process: exit/continue\n");
138*8eea8e29Sap 		return (DEVFSADM_CONTINUE);
139*8eea8e29Sap 	}
140*8eea8e29Sap 
141*8eea8e29Sap 	devfsadm_print(debug_mid, "dcam1394_process: p_path=%s buf=%s\n",
142*8eea8e29Sap 	    p_path, buf);
143*8eea8e29Sap 
144*8eea8e29Sap 	if (strncmp(di_minor_name(minor), "dcamctl", 7) == 0)
145*8eea8e29Sap 		(void) snprintf(l_path, PATH_MAX, "dcamctl%s", buf);
146*8eea8e29Sap 	else
147*8eea8e29Sap 		(void) snprintf(l_path, PATH_MAX, "dcam%s", buf);
148*8eea8e29Sap 
149*8eea8e29Sap 	(void) devfsadm_mklink(l_path, node, minor, 0);
150*8eea8e29Sap 
151*8eea8e29Sap 	free(buf);
152*8eea8e29Sap 
153*8eea8e29Sap 	return (DEVFSADM_CONTINUE);
154*8eea8e29Sap }
155