diskid.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:15k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)diskid.c 1.20 00/01/13 Copyright 1998 J. Schilling */
  2. #ifndef lint
  3. static char sccsid[] =
  4. "@(#)diskid.c 1.20 00/01/13 Copyright 1998 J. Schilling";
  5. #endif
  6. /*
  7.  * Disk Idientification Method
  8.  *
  9.  * Copyright (c) 1998 J. Schilling
  10.  */
  11. /*
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; see the file COPYING.  If not, write to
  24.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  */
  26. #include <mconfig.h>
  27. #include <stdio.h>
  28. #include <standard.h>
  29. #include <sys/types.h>
  30. #include <utypes.h>
  31. #include "cdrecord.h"
  32. EXPORT void pr_manufacturer __PR((msf_t *mp, BOOL rw, BOOL audio));
  33. EXPORT int manufacturer_id __PR((msf_t *mp));
  34. EXPORT long disk_rcap __PR((msf_t *mp, long maxblock, BOOL rw, BOOL audio));
  35. struct disk_man {
  36. msf_t mi_msf;
  37. char mi_num;
  38. char *mi_name;
  39. };
  40. /*
  41.  * Illegal (old) Manufacturer.
  42.  */
  43. LOCAL char m_ill[] = "Unknown old Manufacturer code";
  44. /*
  45.  * Permanent codes.
  46.  */
  47. LOCAL char m_kingpro[] = "King Pro Mediatek Inc.";
  48. LOCAL char m_custpo[] = "Customer Pressing Oosterhout";
  49. LOCAL char m_taeil[] = "Taeil Media Co.,Ltd.";
  50. LOCAL char m_doremi[] = "Doremi Media Co., Ltd.";
  51. LOCAL char m_xcitec[] = "Xcitec Inc.";
  52. LOCAL char m_leaddata[] = "Lead Data Inc.";
  53. LOCAL char m_fuji[] = "FUJI Photo Film Co., Ltd.";
  54. LOCAL char m_hitachi[] = "Hitachi Maxell, Ltd.";
  55. LOCAL char m_kodakjp[] = "Kodak Japan Limited";
  56. LOCAL char m_mitsui[] = "Mitsui Chemicals, Inc.";
  57. LOCAL char m_pioneer[] = "Pioneer Video Corporation";
  58. LOCAL char m_plasmon[] = "Plasmon Data systems Ltd.";
  59. LOCAL char m_princo[] = "Princo Corporation";
  60. LOCAL char m_ricoh[] = "Ricoh Company Limited";
  61. LOCAL char m_skc[] = "SKC Co., Ltd.";
  62. LOCAL char m_tyuden[] = "Taiyo Yuden Company Limited";
  63. LOCAL char m_tdk[] = "TDK Corporation";
  64. LOCAL char m_mitsubishi[] = "Mitsubishi Chemical Corporation";
  65. LOCAL char m_auvistar[] = "Auvistar Industry Co.,Ltd.";
  66. LOCAL char m_gigastore[] = "GIGASTORAGE CORPORATION";
  67. LOCAL char m_fornet[] = "FORNET INTERNATIONAL PTE LTD.";
  68. LOCAL char m_cmc[] = "CMC Magnetics Corporation";
  69. LOCAL char m_odm[] = "Optical Disc Manufacturing Equipment";
  70. LOCAL char m_ritek[] = "Ritek Co.";
  71. /*
  72.  * Tentative codes.
  73.  */
  74. LOCAL char m_hile[] = "Hile Optical Disc Technology Corp.";
  75. LOCAL char m_friendly[] = "Friendly CD-Tek Co.";
  76. LOCAL char m_soundsound[] = "Sound Sound Multi-Media Development Limited";
  77. LOCAL char m_kdg[] = "kdg mediatech AG";
  78. LOCAL char m_seantram[] = "Seantram Technology Inc.";
  79. LOCAL char m_eximpo[] = "EXIMPO";
  80. LOCAL char m_delphi[] = "DELPHI TECHNOLOGY INC.";
  81. LOCAL char m_harmonic[] = "Harmonic Hall Optical Disc Ltd.";
  82. LOCAL char m_guannyinn[] = "Guann Yinn Co.,Ltd.";
  83. LOCAL char m_optime[] = "Opti.Me.S. S.p.A.";
  84. LOCAL char m_nacar[] = "Nacar Media srl";
  85. LOCAL char m_optrom[] = "OPTROM.INC.";
  86. LOCAL char m_audiodis[] = "AUDIO DISTRIBUTORS CO., LTD.";
  87. LOCAL char m_acer[] = "Acer Media Technology, Inc.";
  88. LOCAL char m_woongjin[] = "Woongjin Media corp";
  89. LOCAL char m_infodisk[] = "INFODISC Technology Co., Ltd.";
  90. LOCAL char m_unitech[] = "UNITECH JAPAN INC.";
  91. LOCAL char m_ams[] = "AMS Technology Inc.";
  92. LOCAL char m_vanguard[] = "Vanguard Disc Inc.";
  93. LOCAL char m_grandadv[] = "Grand Advance Technology Ltd.";
  94. LOCAL char m_digitalstor[] = "DIGITAL STORAGE TECHNOLOGY CO.,LTD";
  95. LOCAL char m_matsushita[] = "Matsushita Electric Industrial Co.,Ltd.";
  96. LOCAL char m_albrechts[] = "CDA Datentr鋑er Albrechts GmbH.";
  97. LOCAL char m_xalbrechts[] = "??? CDA Datentr鋑er Albrechts GmbH.";
  98. LOCAL char m_prodisc[] = "Prodisc Technology Inc.";
  99. LOCAL char m_postech[] = "POSTECH Corporation";
  100. #ifdef used
  101. LOCAL char m_ncolumbia[] = "NIPPON COLUMBIA CO.,LTD.";
  102. #endif
  103. LOCAL char m_odc[] = "OPTICAL DISC CORPRATION";
  104. LOCAL char m_sony[] = "SONY Corporation";
  105. LOCAL char m_cis[] = "CIS Technology Inc.";
  106. LOCAL char m_csitaly[] = "Computer Support Italy s.r.l.";
  107. LOCAL char m_mmmm[] = "Multi Media Masters & Machinary SA";
  108. /*
  109.  * Guessed codes.
  110.  */
  111. /*LOCAL char m_seantram[] = "Seantram Technology Inc.";*/
  112. /*
  113.  * Old (illegal) code table. It lists single specific codes (97:xx:yy).
  114.  */
  115. LOCAL struct disk_man odman[] = {
  116. /*
  117.  * Illegal (old) codes.
  118.  */
  119. {{97, 25, 00}, 80, "ILLEGAL: TDK ???" },
  120. {{97, 25, 15},  0, m_ill },
  121. {{97, 27, 00}, 81, "ILLEGAL: Old Ritek Co.???" },
  122. {{97, 27, 25},  0, m_ill },
  123. {{97, 30, 00},  0, m_ill },
  124. {{97, 33, 00}, 82, "ILLEGAL: Old CDA Datentr鋑er Albrechts GmbH." },
  125. {{97, 35, 44},  0, m_ill },
  126. {{97, 39, 00},  0, m_ill },
  127. {{97, 45, 36},  0, "ILLEGAL: Old Kodak Photo CD" },
  128. {{97, 47, 00},  0, m_ill },
  129. {{97, 47, 30},  0, m_ill },
  130. {{97, 48, 14},  0, m_ill },
  131. {{97, 48, 33},  0, m_ill },
  132. {{97, 49, 00},  0, m_ill },
  133. {{97, 54, 00},  0, m_ill },
  134. {{97, 55, 06},  0, m_ill },
  135. {{97, 57, 00},  0, m_ill },
  136. /*
  137.  * List end marker
  138.  */
  139. {{00, 00, 00}, 0, NULL },
  140. };
  141. /*
  142.  * Actual code table. It lists code ranges (97:xx:y0 - 97:xx:y9).
  143.  *
  144.  * Note that dp->mi_msf.msf_frame needs to be always rounded down
  145.  * to 0 even for media that has e.g. 97:27/01 in the official table.
  146.  */
  147. LOCAL struct disk_man dman[] = {
  148. /*
  149.  * Permanent codes.
  150.  */
  151. {{97, 28, 40}, 36, m_kingpro },
  152. {{97, 23, 60}, 49, m_custpo },
  153. {{97, 29, 00}, 37, m_taeil },
  154. {{97, 26, 10}, 19, m_postech },
  155. {{97, 47, 40}, 19, m_postech },
  156. {{97, 24, 10}, 24, m_sony },
  157. /* {{97, 46, 10}, 24, m_sony },*/
  158. {{97, 23, 10}, 33, m_doremi },
  159. {{97, 25, 60}, 30, m_xcitec },
  160. {{97, 45, 60}, 30, m_xcitec },
  161. {{97, 26, 50}, 10, m_leaddata },
  162. {{97, 48, 60}, 10, m_leaddata },
  163. {{97, 26, 40},  6, m_fuji },
  164. {{97, 46, 40},  6, m_fuji },
  165. {{97, 25, 20},  8, m_hitachi },
  166. {{97, 47, 10},  8, m_hitachi },
  167. {{97, 27, 40},  9, m_kodakjp },
  168. {{97, 48, 10},  9, m_kodakjp },
  169. {{97, 27, 50}, 12, m_mitsui },
  170. {{97, 48, 50}, 12, m_mitsui },
  171. {{97, 27, 30}, 17, m_pioneer },
  172. {{97, 48, 30}, 17, m_pioneer },
  173. {{97, 27, 10}, 18, m_plasmon },
  174. {{97, 48, 20}, 18, m_plasmon },
  175. {{97, 27, 20}, 20, m_princo },
  176. {{97, 47, 20}, 20, m_princo },
  177. {{97, 27, 60}, 21, m_ricoh },
  178. {{97, 48, 00}, 21, m_ricoh },
  179. {{97, 26, 20}, 23, m_skc },
  180. {{97, 24, 00}, 25, m_tyuden },
  181. {{97, 46, 00}, 25, m_tyuden },
  182. {{97, 32, 00}, 26, m_tdk },
  183. {{97, 49, 00}, 26, m_tdk },
  184. {{97, 34, 20}, 11, m_mitsubishi },
  185. {{97, 50, 20}, 11, m_mitsubishi },
  186. {{97, 28, 30},  1, m_auvistar },
  187. {{97, 46, 50},  1, m_auvistar },
  188. {{97, 28, 10},  7, m_gigastore },
  189. {{97, 49, 10},  7, m_gigastore },
  190. {{97, 26, 00},  5, m_fornet },
  191. {{97, 45, 00},  5, m_fornet },
  192. {{97, 26, 60},  3, m_cmc },
  193. {{97, 46, 60},  3, m_cmc },
  194. {{97, 21, 40}, 16, m_odm },
  195. {{97, 31, 00}, 22, m_ritek },
  196. {{97, 47, 50}, 22, m_ritek },
  197. {{97, 28, 20}, 13, m_mmmm },
  198. {{97, 46, 20}, 13, m_mmmm },
  199. {{97, 32, 10}, 27, m_prodisc },
  200. /*
  201.  * Tentative codes.
  202.  */
  203. {{97, 29, 30}, 57, m_hile },
  204. {{97, 51, 50}, 57, m_hile },
  205. {{97, 28, 60}, 56, m_friendly },
  206. {{97, 21, 50}, 55, m_soundsound },
  207. {{97, 24, 40}, 54, m_kdg },
  208. {{97, 22, 10}, 53, m_seantram },
  209. {{97, 22, 30}, 52, m_eximpo },
  210. {{97, 28, 50}, 51, m_delphi },
  211. {{97, 29, 00}, 50, m_harmonic },
  212. {{97, 15, 10}, 22, m_ritek },
  213. {{97, 45, 50}, 48, m_guannyinn },
  214. {{97, 24, 50}, 48, m_guannyinn },
  215. {{97, 49, 30}, 47, m_optime },
  216. {{97, 28, 00}, 47, m_optime },
  217. {{97, 23, 20}, 46, m_nacar },
  218. {{97, 23, 50}, 45, m_optrom },
  219. {{97, 23, 30}, 44, m_audiodis },
  220. {{97, 22, 60}, 43, m_acer },
  221. {{97, 45, 20}, 43, m_acer },
  222. {{97, 15, 00}, 26, m_tdk },
  223. {{97, 15, 20}, 11, m_mitsubishi },
  224. {{97, 22, 00}, 39, m_woongjin },
  225. {{97, 25, 30}, 40, m_infodisk },
  226. {{97, 51, 20}, 40, m_infodisk },
  227. {{97, 24, 30}, 41, m_unitech },
  228. {{97, 25, 50}, 42, m_ams },
  229. {{97, 29, 10}, 38, m_vanguard },
  230. {{97, 50, 10}, 38, m_vanguard },
  231. {{97, 31, 30}, 35, m_grandadv },
  232. {{97, 51, 10}, 35, m_grandadv },
  233. {{97, 49, 20}, 36, m_kingpro },
  234. {{97, 27, 00}, 34, m_digitalstor }, /* in reality 27/01    */
  235. {{97, 48, 40}, 34, m_digitalstor }, /* XXX was m_ncolumbia */
  236. {{97, 23, 00}, 31, m_matsushita },
  237. {{97, 49, 60}, 31, m_matsushita },
  238. {{97, 30, 10}, 32, m_albrechts }, /* XXX was m_ncolumbia */
  239. {{97, 50, 30}, 32, m_albrechts },
  240. {{97, 47, 60}, 27, m_prodisc },
  241. /* {{97, 30, 10}, 14, m_ncolumbia },*/
  242. /* {{97, 48, 40}, 14, m_ncolumbia },*/
  243. {{97, 26, 30}, 15, m_odc },
  244. {{97, 22, 40},  2, m_cis },
  245. {{97, 45, 40},  2, m_cis },
  246. {{97, 24, 20},  4, m_csitaly },
  247. {{97, 46, 30},  4, m_csitaly },
  248. /*
  249.  * Guessed codes.
  250.  */
  251. {{97, 20, 10}, 32, m_xalbrechts }, /* XXX guess */
  252. {{97, 23, 40}, 32, m_xalbrechts }, /* XXX guess */
  253. {{97, 24, 40}, 29, "????? Princo Corporation" }, /* XXX guess */
  254. {{97, 28, 00}, 28, "?????" }, /* XXX guess */
  255. /*
  256.  * List end marker
  257.  */
  258. {{00, 00, 00},  0, NULL },
  259. };
  260. EXPORT void
  261. pr_manufacturer(mp, rw, audio)
  262. msf_t *mp;
  263. BOOL rw;
  264. BOOL audio;
  265. {
  266. struct disk_man * dp;
  267. int frame;
  268. int type;
  269. char *tname;
  270. /* printf("pr_manufacturer rw: %d audio: %dn", rw, audio);*/
  271. type = mp->msf_frame % 10;
  272. frame = mp->msf_frame - type;
  273. if (type < 5) {
  274. tname = "Long strategy type (Cyanine, AZO or similar)";
  275. } else {
  276. tname = "Short strategy type (Phthalocyanine or similar)";
  277. }
  278. dp = odman;
  279. while (dp->mi_msf.msf_min != 0) {
  280. if (mp->msf_min == dp->mi_msf.msf_min &&
  281. mp->msf_sec == dp->mi_msf.msf_sec &&
  282. mp->msf_frame == dp->mi_msf.msf_frame) {
  283. /*
  284.  * Note that dp->mi_msf.msf_frame is always rounded
  285.  * down to 0 even for media that has 97:27/01 in the
  286.  * official table.
  287.  */
  288. if (!rw)
  289. printf("Disk type unknownn");
  290. else
  291. printf("Disk type: phase changen");
  292. printf("Manuf. index: %dn", dp->mi_num);
  293. printf("Manufacturer: %sn", dp->mi_name);
  294. return;
  295. }
  296. dp++;
  297. }
  298. dp = dman;
  299. while (dp->mi_msf.msf_min != 0) {
  300. if (mp->msf_min == dp->mi_msf.msf_min &&
  301. mp->msf_sec == dp->mi_msf.msf_sec &&
  302. frame == dp->mi_msf.msf_frame) {
  303. if (!rw)
  304. printf("Disk type: %sn", tname);
  305. else
  306. printf("Disk type: phase changen");
  307. printf("Manuf. index: %dn", dp->mi_num);
  308. printf("Manufacturer: %sn", dp->mi_name);
  309. return;
  310. }
  311. dp++;
  312. }
  313. printf("Disk type unknownn");
  314. printf("Manufacturer unknown (not in table)n");
  315. }
  316. EXPORT int
  317. manufacturer_id(mp)
  318. msf_t *mp;
  319. {
  320. struct disk_man * dp;
  321. int frame;
  322. int type;
  323. type = mp->msf_frame % 10;
  324. frame = mp->msf_frame - type;
  325. dp = odman;
  326. while (dp->mi_msf.msf_min != 0) {
  327. if (mp->msf_min == dp->mi_msf.msf_min &&
  328. mp->msf_sec == dp->mi_msf.msf_sec &&
  329. mp->msf_frame == dp->mi_msf.msf_frame) {
  330. return (dp->mi_num);
  331. }
  332. dp++;
  333. }
  334. dp = dman;
  335. while (dp->mi_msf.msf_min != 0) {
  336. if (mp->msf_min == dp->mi_msf.msf_min &&
  337. mp->msf_sec == dp->mi_msf.msf_sec &&
  338. frame == dp->mi_msf.msf_frame) {
  339. /*
  340.  * Note that dp->mi_msf.msf_frame is always rounded
  341.  * down to 0 even for media that has 97:27/01 in the
  342.  * official table.
  343.  */
  344. return (dp->mi_num);
  345. }
  346. dp++;
  347. }
  348. return (-1);
  349. }
  350. struct disk_rcap {
  351. msf_t ci_msf;
  352. long ci_cap;
  353. long ci_rcap;
  354. };
  355. LOCAL struct disk_rcap rcap[] = {
  356. {{97, 31, 00}, 359849, 368923 }, /*! Arita CD-R 80      */
  357. {{97, 26, 50}, 359849, 369096 }, /*! Lead Data CD-R 80      */
  358. {{97, 26, 12}, 359849, 368000 }, /*X POSTECH 80 Min      */
  359. {{97, 25, 00}, 359849, 374002 }, /* TDK 80 Minuten      */
  360. {{97, 20, 14}, 359700, 376386 }, /*! Albrechts DataFile Plus  */
  361. {{97, 35, 44}, 359100, 368791 }, /*! NoName BC-1 700 Mb/80 Min */
  362. {{97, 26, 60}, 337350, 349030 }, /* Koch gr黱 CD-R74PRO      */
  363. {{97, 26, 50}, 337050, 351205 }, /* Saba      */
  364. {{97, 26, 00}, 337050, 351411 }, /*!DGN (FORNET)      */
  365. {{97, 22, 40}, 336631, 349971 }, /* Targa gr黱 CD-R74      */
  366. {{97, 26, 50}, 336631, 351727 }, /*! Sunstar (Lead Data)      */
  367. {{97, 26, 55}, 336631, 350474 }, /*! NoName ZAP (Lead Data)   */
  368. {{97, 27, 28}, 336601, 346489 }, /*! BTC CD-R (Princo)      */
  369. {{97, 27, 30}, 336601, 351646 }, /*! Pioneer blau CDM-W74S     */
  370. {{97, 27, 31}, 336601, 351379 }, /* Pioneer blau CDM-W74S     */
  371. {{97, 27, 33}, 336601, 347029 }, /*! Pioneer braun CDM-V74S   */
  372. {{97, 26, 40}, 336225, 346210 }, /* Fuji Silver Disk      */
  373. {{97, 28, 10}, 336225, 348757 }, /*!GigaStorage Cursor CD-R   */
  374. {{97, 31, 00}, 336225, 345460 }, /* Arita gr黱      */
  375. {{97, 25, 28}, 336075, 352879 }, /* Maxell gold CD-R74G      */
  376. {{97, 24, 01}, 336075, 346856 }, /*!Philips Premium Silver    */
  377. {{97, 24, 00}, 336075, 346741 }, /* Philips gr黱 CD-R74      */
  378. {{97, 22, 41}, 335206, 349385 }, /* Octek gr黱      */
  379. {{97, 34, 20}, 335100, 342460 }, /* Verbatim DataLifePlus     */
  380. {{97, 33, 00}, 335100, 344634 }, /*!ITS Singapore (braun/gr黱)*/
  381. {{97, 32, 19}, 335100, 343921 }, /*!Prodisc silber/silber     */
  382. {{97, 25, 21}, 335100, 346013 }, /* Maxell gr黱 CD-R74XL      */
  383. {{97, 27, 00}, 335100, 353448 }, /* TDK gr黱 CD-RXG74      */
  384. {{97, 27, 31}, 335100, 351862 }, /*!Maxell CD-R74MU (Musik)   */
  385. {{97, 27, 33}, 335100, 351336 }, /* Pioneer RDD-74A      */
  386. {{97, 26, 60}, 334259, 349036 }, /* BASF gr黱      */
  387. {{97, 28, 21}, 333976, 348217 }, /*! Noname-B (MMMM)      */
  388. {{97, 28, 20}, 333976, 346485 }, /* Koch  gr黱  CD-R74 PRO    */
  389. {{97, 32, 00}, 333975, 345736 }, /* Imation 3M      */
  390. {{97, 32, 00}, 333975, 348835 }, /* TDK Reflex X     CD-R74   */
  391. {{97, 30, 18}, 333899, 344857 }, /* HiSpace  gr黱      */
  392. {{97, 27, 66}, 333750, 352726 }, /*!Philips Megalife (Musik)  */
  393. {{97, 28, 43}, 333750, 345344 }, /*!MMore CD-R      */
  394. {{97, 27, 65}, 333750, 348343 }, /* Ricoh gold      */
  395. {{97, 27, 00}, 333750, 336246 }, /* BestMedia gr黱   CD-R74   */
  396. {{97, 27, 28}, 333491, 347473 }, /* Fuji gr黱 (alt)      */
  397. {{97, 24, 48}, 333491, 343519 }, /* BASF (alt)      */
  398. {{97, 27, 55}, 333235, 343270 }, /* Teac gold CD-R74      */
  399. {{97, 27, 45}, 333226, 343358 }, /* Kodak gold      */
  400. {{97, 28, 20}, 333226, 346483 }, /* SAST gr黱      */
  401. {{97, 27, 45}, 333226, 343357 }, /* Mitsumi gold      */
  402. {{97, 28, 25}, 333226, 346481 }, /* Cedar Gr黱      */
  403. {{97, 23, 00}, 333226, 346206 }, /* Fuji gr黱 (alt)      */
  404. {{97, 33, 00}, 333225, 349623 }, /* DataFile Albrechts      */
  405. {{97, 24, 24}, 333198, 342536 }, /*!SUN CD Recordable      */
  406. {{97, 27, 19}, 332850, 348442 }, /* Plasmon gold PCD-R74      */
  407. {{97, 32, 00}, 96600,  106502 }, /* TDK 80mm (for music only) */
  408. /*
  409.  * List end marker
  410.  */
  411. {{00, 00, 00}, 0L, 0L },
  412. };
  413. EXPORT long
  414. disk_rcap(mp, maxblock, rw, audio)
  415. msf_t *mp;
  416. long maxblock;
  417. BOOL rw;
  418. BOOL audio;
  419. {
  420. struct disk_rcap * dp;
  421. dp = rcap;
  422. while (dp->ci_msf.msf_min != 0) {
  423. if (mp->msf_min == dp->ci_msf.msf_min &&
  424. mp->msf_sec == dp->ci_msf.msf_sec &&
  425. mp->msf_frame == dp->ci_msf.msf_frame &&
  426. maxblock == dp->ci_cap)
  427. return (dp->ci_rcap);
  428. dp++;
  429. }
  430. return (0L);
  431. }