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