📄 device.c.htm
字号:
<a class="l" name="54"> 54 </a> * We have the device inquiry strings at this time. This is used to enable<a class="l" name="55"> 55 </a> * us to use older sun drives to extract audio.<a class="l" name="56"> 56 </a> */</span><a class="l" name="57"> 57 </a><b>static</b> <b>int</b><a class="l" name="58"> 58 </a><a href="/source/s?defs=is_old_sun_drive">is_old_sun_drive</a>(<a href="/source/s?defs=cd_device">cd_device</a> *<a href="/source/s?defs=dev">dev</a>)<a class="l" name="59"> 59 </a>{<a class="hl" name="60"> 60 </a> <span class="c">/*<a class="l" name="61"> 61 </a> * If we have a SONY CDU 561, CDU 8012, or TOSHIBA model with XMa we<a class="l" name="62"> 62 </a> * need to handle these drives a bit differently.<a class="l" name="63"> 63 </a> */</span><a class="l" name="64"> 64 </a> <b>if</b> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"SONY"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">8</span>], <span class="n">4</span>) == <span class="n">0</span>) {<a class="l" name="65"> 65 </a> <b>if</b> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"CDU 561"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">16</span>], <span class="n">7</span>) == <span class="n">0</span>)<a class="l" name="66"> 66 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="67"> 67 </a> <b>if</b> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"CDU-8012"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">16</span>], <span class="n">8</span>) == <span class="n">0</span>)<a class="l" name="68"> 68 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="69"> 69 </a> }<a class="hl" name="70"> 70 </a><a class="l" name="71"> 71 </a> <b>if</b> ((<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"TOSHIBA"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">8</span>], <span class="n">7</span>) == <span class="n">0</span>) &&<a class="l" name="72"> 72 </a> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"XM"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">16</span>], <span class="n">2</span>) == <span class="n">0</span>)) {<a class="l" name="73"> 73 </a><a class="l" name="74"> 74 </a> <b>char</b> <a href="/source/s?defs=product_id">product_id</a>[<span class="n">17</span>];<a class="l" name="75"> 75 </a><a class="l" name="76"> 76 </a> <span class="c">/* Changing speed is not allowed for 32X TOSHIBA drives */</span><a class="l" name="77"> 77 </a> <b>if</b> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"SUN32XCD"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">24</span>], <span class="n">8</span>) == <span class="n">0</span>)<a class="l" name="78"> 78 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_cap">d_cap</a> |= <a href="/source/s?defs=DEV_CAP_SETTING_SPEED_NOT_ALLOWED">DEV_CAP_SETTING_SPEED_NOT_ALLOWED</a>;<a class="l" name="79"> 79 </a> (<b>void</b>) <a href="/source/s?defs=strncpy">strncpy</a>(<a href="/source/s?defs=product_id">product_id</a>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">16</span>], <span class="n">16</span>);<a class="hl" name="80"> 80 </a> <a href="/source/s?defs=product_id">product_id</a>[<span class="n">16</span>] = <span class="n">0</span>;<a class="l" name="81"> 81 </a> <b>if</b> (<a href="/source/s?defs=strstr">strstr</a>(<a href="/source/s?defs=product_id">product_id</a>, <span class="s">"SUN"</span>) != <a href="/source/s?defs=NULL">NULL</a>)<a class="l" name="82"> 82 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="83"> 83 </a> }<a class="l" name="84"> 84 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="85"> 85 </a>}<a class="l" name="86"> 86 </a><a class="l" name="87"> 87 </a><span class="c">/*<a class="l" name="88"> 88 </a> * returns a cd_device handle for a node returned by lookup_device()<a class="l" name="89"> 89 </a> * also takes the user supplied name and stores it inside the node<a class="hl" name="90"> 90 </a> */</span><a class="l" name="91"> 91 </a><a href="/source/s?defs=cd_device">cd_device</a> *<a class="l" name="92"> 92 </a><a href="/source/s?defs=get_device">get_device</a>(<b>char</b> *<a href="/source/s?defs=user_supplied">user_supplied</a>, <b>char</b> *<a href="/source/s?defs=node">node</a>)<a class="l" name="93"> 93 </a>{<a class="l" name="94"> 94 </a> <a href="/source/s?defs=cd_device">cd_device</a> *<a href="/source/s?defs=dev">dev</a>;<a class="l" name="95"> 95 </a> <b>int</b> <a href="/source/s?defs=fd">fd</a>;<a class="l" name="96"> 96 </a> <a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=cap">cap</a>;<a class="l" name="97"> 97 </a> <b>char</b> <a href="/source/s?defs=devnode">devnode</a>[<a href="/source/s?defs=PATH_MAX">PATH_MAX</a>];<a class="l" name="98"> 98 </a> <b>int</b> <a href="/source/s?defs=size">size</a>;<a class="l" name="99"> 99 </a> <b>struct</b> <a href="/source/s?defs=dk_minfo">dk_minfo</a> <a href="/source/s?defs=mediainfo">mediainfo</a>;<a class="hl" name="100"> 100 </a> <b>int</b> <a href="/source/s?defs=use_cd_speed">use_cd_speed</a> = <span class="n">0</span>;<a class="l" name="101"> 101 </a><a class="l" name="102"> 102 </a> <span class="c">/*<a class="l" name="103"> 103 </a> * we need to resolve any link paths to avoid fake files<a class="l" name="104"> 104 </a> * such as /<a href="/source/s?path=/dev/">dev</a>/<a href="/source/s?path=/dev/rdsk">rdsk</a>/../../<a href="/source/s?path=/export/">export</a>/<a href="/source/s?path=/export/file">file</a>.<a class="l" name="105"> 105 </a> */</span><a class="l" name="106"> 106 </a><a class="l" name="107"> 107 </a> <a href="/source/s?defs=TRACE">TRACE</a>(<a href="/source/s?defs=traceall_msg">traceall_msg</a>(<span class="s">"get_device(%s, %s)\n"</span>, <a href="/source/s?defs=user_supplied">user_supplied</a> ?<a class="l" name="108"> 108 </a> <a href="/source/s?defs=user_supplied">user_supplied</a> : <span class="s">"<nil>"</span>, <a href="/source/s?defs=node">node</a> ? <a href="/source/s?defs=node">node</a> : <span class="s">"<nil>"</span>));<a class="l" name="109"> 109 </a><a class="hl" name="110"> 110 </a> <a href="/source/s?defs=size">size</a> = <a href="/source/s?defs=resolvepath">resolvepath</a>(<a href="/source/s?defs=node">node</a>, <a href="/source/s?defs=devnode">devnode</a>, <a href="/source/s?defs=PATH_MAX">PATH_MAX</a>);<a class="l" name="111"> 111 </a> <b>if</b> ((<a href="/source/s?defs=size">size</a> <= <span class="n">0</span>) || (<a href="/source/s?defs=size">size</a> >= (<a href="/source/s?defs=PATH_MAX">PATH_MAX</a> - <span class="n">1</span>)))<a class="l" name="112"> 112 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="113"> 113 </a><a class="l" name="114"> 114 </a> <span class="c">/* resolvepath may not return a null terminated string */</span><a class="l" name="115"> 115 </a> <a href="/source/s?defs=devnode">devnode</a>[<a href="/source/s?defs=size">size</a>] = <span class="s">'\0'</span>;<a class="l" name="116"> 116 </a><a class="l" name="117"> 117 </a><a class="l" name="118"> 118 </a> <span class="c">/* the device node must be in /devices/ or /<a href="/source/s?path=/vol/">vol</a>/<a href="/source/s?path=/vol/dev/">dev</a>/<a href="/source/s?path=/vol/dev/rdsk">rdsk</a> */</span><a class="l" name="119"> 119 </a><a class="hl" name="120"> 120 </a> <b>if</b> ((<a href="/source/s?defs=strncmp">strncmp</a>(<a href="/source/s?defs=devnode">devnode</a>, <span class="s">"/devices/"</span>, <span class="n">9</span>) != <span class="n">0</span>) &&<a class="l" name="121"> 121 </a> (<a href="/source/s?defs=strncmp">strncmp</a>(<a href="/source/s?defs=devnode">devnode</a>, <span class="s">"/<a href="/source/s?path=/vol/">vol</a>/<a href="/source/s?path=/vol/dev/">dev</a>/<a href="/source/s?path=/vol/dev/rdsk">rdsk</a>"</span>, <span class="n">13</span>) != <span class="n">0</span>))<a class="l" name="122"> 122 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="123"> 123 </a> <span class="c">/*<a class="l" name="124"> 124 </a> * Since we are currently running with the user euid it is<a class="l" name="125"> 125 </a> * safe to try to open the file without checking access.<a class="l" name="126"> 126 </a> */</span><a class="l" name="127"> 127 </a><a class="l" name="128"> 128 </a> <a href="/source/s?defs=fd">fd</a> = <a href="/source/s?defs=open">open</a>(<a href="/source/s?defs=devnode">devnode</a>, <a href="/source/s?defs=O_RDONLY">O_RDONLY</a>|<a href="/source/s?defs=O_NDELAY">O_NDELAY</a>);<a class="l" name="129"> 129 </a><a class="hl" name="130"> 130 </a> <b>if</b> (<a href="/source/s?defs=fd">fd</a> < <span class="n">0</span>) {<a class="l" name="131"> 131 </a> <a href="/source/s?defs=TRACE">TRACE</a>(<a href="/source/s?defs=traceall_msg">traceall_msg</a>(<span class="s">"Cannot open %s: %s\n"</span>, <a href="/source/s?defs=node">node</a>,<a class="l" name="132"> 132 </a> <a href="/source/s?defs=strerror">strerror</a>(<a href="/source/s?defs=errno">errno</a>)));<a class="l" name="133"> 133 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="134"> 134 </a> }<a class="l" name="135"> 135 </a><a class="l" name="136"> 136 </a> <a href="/source/s?defs=dev">dev</a> = (<a href="/source/s?defs=cd_device">cd_device</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<b>sizeof</b> (<a href="/source/s?defs=cd_device">cd_device</a>));<a class="l" name="137"> 137 </a><a class="l" name="138"> 138 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_node">d_node</a> = (<b>char</b> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=strlen">strlen</a>(<a href="/source/s?defs=devnode">devnode</a>) + <span class="n">1</span>);<a class="l" name="139"> 139 </a> (<b>void</b>) <a href="/source/s?defs=strcpy">strcpy</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_node">d_node</a>, <a href="/source/s?defs=devnode">devnode</a>);<a class="hl" name="140"> 140 </a><a class="l" name="141"> 141 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a> = <a href="/source/s?defs=fd">fd</a>;<a class="l" name="142"> 142 </a><a class="l" name="143"> 143 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=INQUIRY_DATA_LENGTH">INQUIRY_DATA_LENGTH</a>);<a class="l" name="144"> 144 </a><a class="l" name="145"> 145 </a> <b>if</b> (!<a href="/source/s?defs=inquiry">inquiry</a>(<a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>)) {<a class="l" name="146"> 146 </a> <a href="/source/s?defs=TRACE">TRACE</a>(<a href="/source/s?defs=traceall_msg">traceall_msg</a>(<span class="s">"Inquiry failed on device %s\n"</span>, <a href="/source/s?defs=node">node</a>));<a class="l" name="147"> 147 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>) {<a class="l" name="148"> 148 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"USCSI ioctl failed %d\n"</span>,<a class="l" name="149"> 149 </a> <a href="/source/s?defs=uscsi_error">uscsi_error</a>);<a class="hl" name="150"> 150 </a> }<a class="l" name="151"> 151 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>);<a class="l" name="152"> 152 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_node">d_node</a>);<a class="l" name="153"> 153 </a> (<b>void</b>) <a href="/source/s?defs=close">close</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>);<a class="l" name="154"> 154 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=dev">dev</a>);<a class="l" name="155"> 155 </a> <b>return</b> (<a href="/source/s?defs=NULL">NULL</a>);<a class="l" name="156"> 156 </a> }<a class="l" name="157"> 157 </a><a class="l" name="158"> 158 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>) {<a class="l" name="159"> 159 </a> <a href="/source/s?defs=cap">cap</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<span class="n">18</span>);<a class="hl" name="160"> 160 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"Checking device type\n"</span>);<a class="l" name="161"> 161 </a> <b>if</b> (<a href="/source/s?defs=get_mode_page">get_mode_page</a>(<a href="/source/s?defs=fd">fd</a>, <span class="n">0x2A</span>, <span class="n">0</span>, <span class="n">8</span>, <a href="/source/s?defs=cap">cap</a>)) {<a class="l" name="162"> 162 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">2</span>] & <span class="n">0x10</span>)<a class="l" name="163"> 163 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"DVD-R read support\n"</span>);<a class="l" name="164"> 164 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">3</span>] & <span class="n">0x10</span>)<a class="l" name="165"> 165 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"DVD-R write support\n"</span>);<a class="l" name="166"> 166 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">5</span>] & <span class="n">0x4</span>)<a class="l" name="167"> 167 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"R-W supported\n"</span>);<a class="l" name="168"> 168 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">2</span>] & <span class="n">0x20</span>)<a class="l" name="169"> 169 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"DVD-RAM read supported\n"</span>);<a class="hl" name="170"> 170 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">3</span>] & <span class="n">0x20</span>)<a class="l" name="171"> 171 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"DVD-RAM write supported\n"</span>);<a class="l" name="172"> 172 </a> } <b>else</b> {<a class="l" name="173"> 173 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"Could not read mode page 2A! \n"</span>);<a class="l" name="174"> 174 </a> }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -