You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

772 lines
34 KiB

14 years ago
  1. /* libdax_msgs
  2. Message handling facility of libburn and libisofs.
  3. Copyright (C) 2006-2016 Thomas Schmitt <scdbackup@gmx.net>,
  4. provided under GPL version 2 or later.
  5. */
  6. /*
  7. *Never* set this macro outside libdax_msgs.c !
  8. The entrails of the message handling facility are not to be seen by
  9. the other library components or the applications.
  10. */
  11. #ifdef LIBDAX_MSGS_H_INTERNAL
  12. #ifndef LIBDAX_MSGS_SINGLE_THREADED
  13. #include <pthread.h>
  14. #endif
  15. struct libdax_msgs_item {
  16. double timestamp;
  17. pid_t process_id;
  18. int origin;
  19. int severity;
  20. int priority;
  21. /* Apply for your developer's error code range at
  22. libburn-hackers@pykix.org
  23. Report introduced codes in the list below. */
  24. int error_code;
  25. char *msg_text;
  26. int os_errno;
  27. struct libdax_msgs_item *prev,*next;
  28. };
  29. struct libdax_msgs {
  30. int refcount;
  31. struct libdax_msgs_item *oldest;
  32. struct libdax_msgs_item *youngest;
  33. int count;
  34. int queue_severity;
  35. int print_severity;
  36. char print_id[81];
  37. #ifndef LIBDAX_MSGS_SINGLE_THREADED
  38. pthread_mutex_t lock_mutex;
  39. #endif
  40. };
  41. #endif /* LIBDAX_MSGS_H_INTERNAL */
  42. #ifndef LIBDAX_MSGS_H_INCLUDED
  43. #define LIBDAX_MSGS_H_INCLUDED 1
  44. #ifndef LIBDAX_MSGS_H_INTERNAL
  45. /* Architectural aspects */
  46. /*
  47. libdax_msgs is designed to serve in libraries which want to offer their
  48. applications a way to control the output of library messages. It shall be
  49. incorporated by an owner, i.e. a software entity which encloses the code
  50. of the .c file.
  51. Owner of libdax_msgs is libburn. A fully compatible variant named libiso_msgs
  52. is owned by libisofs and can get generated by a script of the libburn
  53. project: libburn/libdax_msgs_to_xyz_msgs.sh .
  54. Reason: One cannot link two owners of the same variant together because
  55. both would offer the same functions to the linker. For that situation one
  56. has to create a compatible variant as it is done for libisofs.
  57. Compatible variants may get plugged together by call combinations like
  58. burn_set_messenger(iso_get_messenger());
  59. A new variant would demand a _set_messenger() function if it has to work
  60. with libisofs. If only libburn is planned as link partner then a simple
  61. _get_messenger() does suffice.
  62. Take care to shutdown libburn before its provider of the *_msgs object
  63. gets shut down.
  64. */
  65. /* Public Opaque Handles */
  66. /** A pointer to this is a opaque handle to a message handling facility */
  67. struct libdax_msgs;
  68. /** A pointer to this is a opaque handle to a single message item */
  69. struct libdax_msgs_item;
  70. #endif /* ! LIBDAX_MSGS_H_INTERNAL */
  71. /* Public Macros */
  72. /* Registered Severities */
  73. /* It is well advisable to let applications select severities via strings and
  74. forwarded functions libdax_msgs__text_to_sev(), libdax_msgs__sev_to_text().
  75. These macros are for use by the owner of libdax_msgs.
  76. */
  77. /** Use this to get messages of any severity. Do not use for submitting.
  78. */
  79. #define LIBDAX_MSGS_SEV_ALL 0x00000000
  80. /** Messages of this severity shall transport plain disk file paths
  81. whenever an event of severity SORRY or above is related with an
  82. individual disk file.
  83. No message text shall be added to the file path. The ERRFILE message
  84. shall be issued before the human readable message which carries the
  85. true event severity. That message should contain the file path so it
  86. can be found by strstr(message, path)!=NULL.
  87. The error code shall be the same as with the human readable message.
  88. */
  89. #define LIBDAX_MSGS_SEV_ERRFILE 0x08000000
  90. /** Debugging messages not to be visible to normal users by default
  91. */
  92. #define LIBDAX_MSGS_SEV_DEBUG 0x10000000
  93. /** Update of a progress report about long running actions
  94. */
  95. #define LIBDAX_MSGS_SEV_UPDATE 0x20000000
  96. /** Not so usual events which were gracefully handled
  97. */
  98. #define LIBDAX_MSGS_SEV_NOTE 0x30000000
  99. /** Possibilities to achieve a better result
  100. */
  101. #define LIBDAX_MSGS_SEV_HINT 0x40000000
  102. /** Warnings about problems which could not be handled optimally
  103. */
  104. #define LIBDAX_MSGS_SEV_WARNING 0x50000000
  105. /** Non-fatal error messages indicating that parts of an action failed but
  106. processing may go on if one accepts deviations from the desired result.
  107. SORRY may also be the severity for incidents which are severe enough
  108. for FAILURE but happen within already started irrevocable actions,
  109. like ISO image generation. A precondition for such a severity ease is
  110. that the action can be continued after the incident.
  111. See below MISHAP for what xorriso would need instead of this kind of SORRY
  112. and generates for itself in case of libisofs image generation.
  113. E.g.: A pattern yields no result.
  114. A speed setting cannot be made.
  115. A libisofs input file is inaccessible during image generation.
  116. After SORRY a function should try to go on if that makes any sense
  117. and if no threshold prescribes abort on SORRY. The function should
  118. nevertheless indicate some failure in its return value.
  119. It should - but it does not have to.
  120. */
  121. #define LIBDAX_MSGS_SEV_SORRY 0x60000000
  122. /** A FAILURE (see below) which can be tolerated during long lasting
  123. operations just because they cannot simply be stopped or revoked.
  124. xorriso converts libisofs SORRY messages issued during image generation
  125. into MISHAP messages in order to allow its evaluators to distinguish
  126. image generation problems from minor image composition problems.
  127. E.g.:
  128. A libisofs input file is inaccessible during image generation.
  129. After a MISHAP a function should behave like after SORRY.
  130. */
  131. #define LIBDAX_MSGS_SEV_MISHAP 0x64000000
  132. /** Non-fatal error indicating that an important part of an action failed and
  133. that only a new setup of preconditions will give hope for sufficient
  134. success.
  135. E.g.: No media is inserted in the output drive.
  136. No write mode can be found for inserted media.
  137. A libisofs input file is inaccessible during grafting.
  138. After FAILURE a function should end with a return value indicating failure.
  139. It is at the discretion of the function whether it ends immediately in any
  140. case or whether it tries to go on if the eventual threshold allows.
  141. */
  142. #define LIBDAX_MSGS_SEV_FAILURE 0x68000000
  143. /** An error message which puts the whole operation of the program in question
  144. E.g.: Not enough memory for essential temporary objects.
  145. Irregular errors from resources.
  146. Programming errors (soft assert).
  147. After FATAL a function should end very soon with a return value
  148. indicating severe failure.
  149. */
  150. #define LIBDAX_MSGS_SEV_FATAL 0x70000000
  151. /** A message from an abort handler which will finally finish libburn
  152. */
  153. #define LIBDAX_MSGS_SEV_ABORT 0x71000000
  154. /** A severity to exclude resp. discard any possible message.
  155. Do not use this severity for submitting.
  156. */
  157. #define LIBDAX_MSGS_SEV_NEVER 0x7fffffff
  158. /* Registered Priorities */
  159. /* Priorities are to be selected by the programmers and not by the user. */
  160. #define LIBDAX_MSGS_PRIO_ZERO 0x00000000
  161. #define LIBDAX_MSGS_PRIO_LOW 0x10000000
  162. #define LIBDAX_MSGS_PRIO_MEDIUM 0x20000000
  163. #define LIBDAX_MSGS_PRIO_HIGH 0x30000000
  164. #define LIBDAX_MSGS_PRIO_TOP 0x7ffffffe
  165. /* Do not use this priority for submitting */
  166. #define LIBDAX_MSGS_PRIO_NEVER 0x7fffffff
  167. /* Origin numbers of libburn drives may range from 0 to 1048575 */
  168. #define LIBDAX_MSGS_ORIGIN_DRIVE_BASE 0
  169. #define LIBDAX_MSGS_ORIGIN_DRIVE_TOP 0xfffff
  170. /* Origin numbers of libisofs images may range from 1048575 to 2097152 */
  171. #define LIBDAX_MSGS_ORIGIN_IMAGE_BASE 0x100000
  172. #define LIBDAX_MSGS_ORIGIN_IMAGE_TOP 0x1fffff
  173. /* Public Functions */
  174. /* Calls initiated from inside the direct owner (e.g. from libburn) */
  175. /** Create new empty message handling facility with queue and issue a first
  176. official reference to it.
  177. @param flag Bitfield for control purposes (unused yet, submit 0)
  178. @return >0 success, <=0 failure
  179. */
  180. int libdax_msgs_new(struct libdax_msgs **m, int flag);
  181. /** Destroy a message handling facility and all its eventual messages.
  182. The submitted pointer gets set to NULL.
  183. Actually only the last destroy call of all official references to the
  184. object will really dispose it. All others just decrement the reference
  185. counter.
  186. Call this function only with official reference pointers obtained by
  187. libdax_msgs_new() or libdax_msgs_refer(), and only once per such pointer.
  188. @param flag Bitfield for control purposes (unused yet, submit 0)
  189. @return 1 for success, 0 for pointer to NULL, -1 for fatal error
  190. */
  191. int libdax_msgs_destroy(struct libdax_msgs **m, int flag);
  192. /** Create an official reference to an existing libdax_msgs object. The
  193. references keep the object alive at least until it is released by
  194. a matching number of destroy calls. So each reference MUST be revoked
  195. by exactly one call to libdax_msgs_destroy().
  196. @param pt The pointer to be set and registered
  197. @param m A pointer to the existing object
  198. @param flag Bitfield for control purposes (unused yet, submit 0)
  199. @return 1 for success, 0 for failure
  200. */
  201. int libdax_msgs_refer(struct libdax_msgs **pt, struct libdax_msgs *o, int flag);
  202. /** Submit a message to a message handling facility.
  203. @param origin program specific identification number of the originator of
  204. a message. E.g. drive number. Programs should have an own
  205. range of origin numbers. See above LIBDAX_MSGS_ORIGIN_*_BASE
  206. Use -1 if no number is known.
  207. @param error_code Unique error code. Use only registered codes. See below.
  208. The same unique error_code may be issued at different
  209. occasions but those should be equivalent out of the view
  210. of a libdax_msgs application. (E.g. "cannot open ATA drive"
  211. versus "cannot open SCSI drive" would be equivalent.)
  212. @param severity The LIBDAX_MSGS_SEV_* of the event.
  213. @param priority The LIBDAX_MSGS_PRIO_* number of the event.
  214. @param msg_text Printable and human readable message text.
  215. @param os_errno Eventual error code from operating system (0 if none)
  216. @param flag Bitfield for control purposes
  217. bit0= If direct output to stderr:
  218. CarriageReturn rather than LineFeed
  219. @return 1 on success, 0 on rejection, <0 for severe errors
  220. */
  221. int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
  222. int severity, int priority, char *msg_text,
  223. int os_errno, int flag);
  224. /* Calls from applications (to be forwarded by direct owner) */
  225. /** Convert a registered severity number into a severity name
  226. @param flag Bitfield for control purposes:
  227. bit0= list all severity names in a blank separated string
  228. @return >0 success, <=0 failure
  229. */
  230. int libdax_msgs__sev_to_text(int severity, char **severity_name,
  231. int flag);
  232. /** Convert a severity name into a severity number,
  233. @param flag Bitfield for control purposes (unused yet, submit 0)
  234. @return >0 success, <=0 failure
  235. */
  236. int libdax_msgs__text_to_sev(char *severity_name, int *severity,
  237. int flag);
  238. /** Set minimum severity for messages to be queued (default
  239. LIBDAX_MSGS_SEV_ALL) and for messages to be printed directly to stderr
  240. (default LIBDAX_MSGS_SEV_NEVER).
  241. @param print_id A text of at most 80 characters to be printed before
  242. any eventually printed message (default is "libdax: ").
  243. @param flag Bitfield for control purposes (unused yet, submit 0)
  244. @return always 1 for now
  245. */
  246. int libdax_msgs_set_severities(struct libdax_msgs *m, int queue_severity,
  247. int print_severity, char *print_id, int flag);
  248. /** Obtain a message item that has at least the given severity and priority.
  249. Usually all older messages of lower severity are discarded then. If no
  250. item of sufficient severity was found, all others are discarded from the
  251. queue.
  252. @param flag Bitfield for control purposes (unused yet, submit 0)
  253. @return 1 if a matching item was found, 0 if not, <0 for severe errors
  254. */
  255. int libdax_msgs_obtain(struct libdax_msgs *m, struct libdax_msgs_item **item,
  256. int severity, int priority, int flag);
  257. /** Destroy a message item obtained by libdax_msgs_obtain(). The submitted
  258. pointer gets set to NULL.
  259. Caution: Copy eventually obtained msg_text before destroying the item,
  260. if you want to use it further.
  261. @param flag Bitfield for control purposes (unused yet, submit 0)
  262. @return 1 for success, 0 for pointer to NULL, <0 for severe errors
  263. */
  264. int libdax_msgs_destroy_item(struct libdax_msgs *m,
  265. struct libdax_msgs_item **item, int flag);
  266. /** Obtain from a message item the three application oriented components as
  267. submitted with the originating call of libdax_msgs_submit().
  268. Caution: msg_text becomes a pointer into item, not a copy.
  269. @param flag Bitfield for control purposes (unused yet, submit 0)
  270. @return 1 on success, 0 on invalid item, <0 for servere errors
  271. */
  272. int libdax_msgs_item_get_msg(struct libdax_msgs_item *item,
  273. int *error_code, char **msg_text, int *os_errno,
  274. int flag);
  275. /** Obtain from a message item the submitter identification submitted
  276. with the originating call of libdax_msgs_submit().
  277. @param flag Bitfield for control purposes (unused yet, submit 0)
  278. @return 1 on success, 0 on invalid item, <0 for servere errors
  279. */
  280. int libdax_msgs_item_get_origin(struct libdax_msgs_item *item,
  281. double *timestamp, pid_t *process_id, int *origin,
  282. int flag);
  283. /** Obtain from a message item severity and priority as submitted
  284. with the originating call of libdax_msgs_submit().
  285. @param flag Bitfield for control purposes (unused yet, submit 0)
  286. @return 1 on success, 0 on invalid item, <0 for servere errors
  287. */
  288. int libdax_msgs_item_get_rank(struct libdax_msgs_item *item,
  289. int *severity, int *priority, int flag);
  290. #ifdef LIBDAX_MSGS_________________
  291. /* Registered Error Codes */
  292. Format: error_code (LIBDAX_MSGS_SEV_*,LIBDAX_MSGS_PRIO_*) = explanation
  293. If no severity or priority are fixely associated, use "(,)".
  294. ------------------------------------------------------------------------------
  295. Range "libdax_msgs" : 0x00000000 to 0x0000ffff
  296. 0x00000000 (ALL,ZERO) = Initial setting in new libdax_msgs_item
  297. 0x00000001 (DEBUG,ZERO) = Test error message
  298. 0x00000002 (DEBUG,ZERO) = Debugging message
  299. 0x00000003 (FATAL,HIGH) = Out of virtual memory
  300. 0x00000004 (FATAL,HIGH) = Generic fatal error
  301. ------------------------------------------------------------------------------
  302. Range "elmom" : 0x00010000 to 0x0001ffff
  303. ------------------------------------------------------------------------------
  304. Range "scdbackup" : 0x00020000 to 0x0002ffff
  305. Acessing and defending drives:
  306. 0x00020001 (SORRY,LOW) = Cannot open busy device
  307. 0x00020002 (SORRY,HIGH) = Encountered error when closing drive
  308. 0x00020003 (SORRY,HIGH) = Could not grab drive
  309. 0x00020004 (NOTE,HIGH) = Opened O_EXCL scsi sibling
  310. 0x00020005 (SORRY,HIGH) = Failed to open device
  311. 0x00020006 (FATAL,HIGH) = Too many scsi siblings
  312. 0x00020007 (NOTE,HIGH) = Closed O_EXCL scsi siblings
  313. 0x00020008 (SORRY,HIGH) = Device busy. Failed to fcntl-lock
  314. 0x00020009 (SORRY,HIGH) = Neither stdio-path nor its directory exist
  315. 0x0002000a (FAILURE,HIGH) = Cannot accept '...' as SG_IO CDROM drive
  316. 0x0002000b (FAILURE,HIGH) = File object '...' not found
  317. 0x0002000c (FAILURE,HIGH) = Cannot start device file enumeration
  318. 0x0002000d (FAILURE,HIGH) = Cannot enumerate next device
  319. 0x0002000e (NOTE,HIGH) = Failed to open device during
  320. General library operations:
  321. 0x00020101 (WARNING,HIGH) = Cannot find given worker item
  322. 0x00020102 (SORRY,HIGH) = A drive operation is still going on
  323. 0x00020103 (WARNING,HIGH) = After scan a drive operation is still going on
  324. 0x00020104 (SORRY,HIGH) = NULL pointer caught
  325. 0x00020105 (SORRY,HIGH) = Drive is already released
  326. 0x00020106 (SORRY,HIGH) = Drive is busy on attempt to close
  327. 0x00020107 (WARNING,HIGH) = A drive is still busy on shutdown of library
  328. 0x00020108 (SORRY,HIGH) = Drive is not grabbed on disc status inquiry
  329. 0x00020108 (FATAL,HIGH) = Could not allocate new drive object
  330. 0x00020109 (FATAL,HIGH) = Library not running
  331. 0x0002010a (FATAL,HIGH) = Unsuitable track mode
  332. 0x0002010b (FATAL,HIGH) = Burn run failed
  333. 0x0002010c (FATAL,HIGH) = Failed to transfer command to drive
  334. 0x0002010d (DEBUG,HIGH) = Could not inquire TOC
  335. 0x0002010e (FATAL,HIGH) = Attempt to read ATIP from ungrabbed drive
  336. 0x0002010f (DEBUG,HIGH) = SCSI error condition on command
  337. 0x00020110 (FATAL,HIGH) = Persistent drive address too long
  338. 0x00020111 (FATAL,HIGH) = Could not allocate new auxiliary object
  339. 0x00020112 (SORRY,HIGH) = Bad combination of write_type and block_type
  340. 0x00020113 (FATAL,HIGH) = Drive capabilities not inquired yet
  341. 0x00020114 (SORRY,HIGH) = Attempt to set ISRC with bad data
  342. 0x00020115 (SORRY,HIGH) = Attempt to set track mode to unusable value
  343. 0x00020116 (FATAL,HIGH) = Track mode has unusable value
  344. 0x00020117 (FATAL,HIGH) = toc_entry of drive is already in use
  345. 0x00020118 (DEBUG,HIGH) = Closing track
  346. 0x00020119 (DEBUG,HIGH) = Closing session
  347. 0x0002011a (NOTE,HIGH) = Padding up track to minimum size
  348. 0x0002011b (FATAL,HIGH) = Attempt to read track info from ungrabbed drive
  349. 0x0002011c (FATAL,HIGH) = Attempt to read track info from busy drive
  350. 0x0002011d (FATAL,HIGH) = SCSI error on write
  351. 0x0002011e (SORRY,HIGH) = Unsuitable media detected
  352. 0x0002011f (SORRY,HIGH) = Burning is restricted to a single track
  353. 0x00020120 (NOTE,HIGH) = FORMAT UNIT ignored
  354. 0x00020121 (FATAL,HIGH) = Write preparation setup failed
  355. 0x00020122 (FAILURE,HIGH) = SCSI error on format_unit
  356. 0x00020123 (SORRY,HIGH) = DVD Media are unsuitable for desired track type
  357. 0x00020124 (SORRY,HIGH) = SCSI error on set_streaming
  358. 0x00020125 (SORRY,HIGH) = Write start address not supported
  359. 0x00020126 (SORRY,HIGH) = Write start address not properly aligned
  360. 0x00020127 (NOTE,HIGH) = Write start address is ...
  361. 0x00020128 (FATAL,HIGH) = Unsupported inquiry_type with mmc_get_performance
  362. 0x00020129 (SORRY,HIGH) = Will not format media type
  363. 0x0002012a (FATAL,HIGH) = Cannot inquire write mode capabilities
  364. 0x0002012b (FATAL,HIGH) = Drive offers no suitable write mode with this job
  365. 0x0002012c (SORRY,HIGH) = Too many logical tracks recorded
  366. 0x0002012d (FATAL,HIGH) = Exceeding range of permissible write addresses
  367. 0x0002012e (NOTE,HIGH) = Activated track default size
  368. 0x0002012f (SORRY,HIGH) = SAO is restricted to single fixed size session
  369. 0x00020130 (SORRY,HIGH) = Drive and media state unsuitable for blanking
  370. 0x00020131 (SORRY,HIGH) = No suitable formatting type offered by drive
  371. 0x00020132 (SORRY,HIGH) = Selected format is not suitable for libburn
  372. 0x00020133 (SORRY,HIGH) = Cannot mix data and audio in SAO mode
  373. 0x00020134 (NOTE,HIGH) = Defaulted TAO to DAO
  374. 0x00020135 (SORRY,HIGH) = Cannot perform TAO, job unsuitable for DAO
  375. 0x00020136 (SORRY,HIGH) = DAO burning restricted to single fixed size track
  376. 0x00020137 (HINT,HIGH) = TAO would be possible
  377. 0x00020138 (FATAL,HIGH) = Cannot reserve track
  378. 0x00020139 (SORRY,HIGH) = Write job parameters are unsuitable
  379. 0x0002013a (FATAL,HIGH) = No suitable media detected
  380. 0x0002013b (DEBUG,HIGH) = SCSI command indicates host or driver error
  381. 0x0002013c (SORRY,HIGH) = Malformed capabilities page 2Ah received
  382. 0x0002013d (DEBUG,LOW) = Waiting for free buffer space takes long time
  383. 0x0002013e (SORRY,HIGH) = Timeout with waiting for free buffer. Now disabled
  384. 0x0002013f (DEBUG,LOW) = Reporting total time spent with waiting for buffer
  385. 0x00020140 (FATAL,HIGH) = Drive is busy on attempt to write random access
  386. 0x00020141 (SORRY,HIGH) = Write data count not properly aligned
  387. 0x00020142 (FATAL,HIGH) = Drive is not grabbed on random access write
  388. 0x00020143 (SORRY,HIGH) = Read start address not properly aligned
  389. 0x00020144 (SORRY,HIGH) = SCSI error on read
  390. 0x00020145 (FATAL,HIGH) = Drive is busy on attempt to read data
  391. 0x00020146 (FATAL,HIGH) = Drive is a virtual placeholder
  392. 0x00020147 (SORRY,HIGH) = Cannot address start byte
  393. 0x00020148 (SORRY,HIGH) = Cannot write desired amount of data
  394. 0x00020149 (SORRY,HIGH) = Unsuitable filetype for pseudo-drive
  395. 0x0002014a (SORRY,HIGH) = Cannot read desired amount of data
  396. 0x0002014b (SORRY,HIGH) = Drive is already registered resp. scanned
  397. 0x0002014c (FATAL,HIGH) = Emulated drive caught in SCSI function
  398. 0x0002014d (SORRY,HIGH) = Asynchronous SCSI error
  399. 0x0002014f (SORRY,HIGH) = Timeout with asynchronous SCSI command
  400. 0x00020150 (DEBUG,LOW) = Reporting asynchronous waiting time
  401. 0x00020151 (FAILURE,HIGH) = Read attempt on write-only drive
  402. 0x00020152 (FATAL,HIGH) = Cannot start fifo thread
  403. 0x00020153 (SORRY,HIGH) = Read error on fifo input
  404. 0x00020154 (NOTE,HIGH) = Forwarded input error ends output
  405. 0x00020155 (SORRY,HIGH) = Desired fifo buffer too large
  406. 0x00020156 (SORRY,HIGH) = Desired fifo buffer too small
  407. 0x00020157 (FATAL,HIGH) = burn_source is not a fifo object
  408. 0x00020158 (DEBUG,LOW) = Reporting thread disposal precautions
  409. 0x00020159 (DEBUG,HIGH) = TOC Format 0 returns inconsistent data
  410. 0x0002015a (NOTE,HIGH) = Could not examine busy device
  411. 0x0002015b (HINT,HIGH) = Busy '...' seems to be a hard disk, as '...1' exists
  412. 0x0002015c (FAILURE,HIGH) = Fifo size too small for desired peek buffer
  413. 0x0002015d (FAILURE,HIGH) = Fifo input ended short of desired peek buffer size
  414. 0x0002015e (FATAL,HIGH) = Fifo is already under consumption when peeking
  415. 0x0002015f (MISHAP,HIGH) = Damaged CD table-of-content detected and truncated
  416. 0x00020160 (WARNING,HIGH) = Session without leadout encountered
  417. 0x00020161 (WARNING,HIGH) = Empty session deleted
  418. 0x00020162 (SORRY,HIGH) = BD-R not unformatted blank any more. Cannot format
  419. 0x00020163 (NOTE,HIGH) = Blank BD-R left unformatted for zero spare capacity
  420. 0x00020164 (SORRY,HIGH) = Drive does not format BD-RE without spares
  421. 0x00020165 (WARNING,HIGH) = Drive does not support fast formatting
  422. 0x00020166 (WARNING,HIGH) = Drive does not support full formatting
  423. 0x00020167 (SORRY,HIGH) = Drive does not support non-default formatting
  424. 0x00020168 (FAILURE,HIGH) = Media not properly formatted. Cannot write.
  425. 0x00020169 (WARNING,HIGH) = Last session on media is still open
  426. 0x0002016a (FAILURE,HIGH) = No MMC transport adapter is present
  427. 0x0002016b (WARNING,HIGH) = No MMC transport adapter is present
  428. 0x0002016c (DEBUG,HIGH) = No MMC transport adapter is present
  429. 0x0002016e (DEBUG,HIGH) = MODE SENSE page 2A too short
  430. 0x0002016f (DEBUG,HIGH) = Unable to grab scanned drive
  431. 0x00020170 (NOTE,HIGH) = Closing open session before writing new one
  432. 0x00020171 (NOTE,HIGH) = Closing BD-R with accidentaly open session
  433. 0x00020172 (SORRY,HIGH) = Read start address larger than number of readable blocks
  434. 0x00020173 (FAILURE,HIGH) = Drive tells NWA smaller than last written address
  435. 0x00020174 (SORRY,HIGH) = Fifo alignment does not allow desired read size
  436. 0x00020175 (FATAL,HIGH) = Supporting library is too old
  437. 0x00020176 (NOTE,HIGH) = Stream recording disabled because of small OS buffer
  438. 0x00020177 (ABORT,HIGH) = Urged drive worker threads to do emergency halt
  439. 0x00020178 (DEBUG,HIGH) = Write thread ended
  440. 0x00020179 (FAILURE,HIGH) = Offset source start address is before end of previous source
  441. 0x0002017a (FAILURE,HIGH) = Expected offset source object as parameter
  442. 0x0002017b (WARNING,HIGH) = Sequential BD-R media likely to soon fail writing
  443. 0x0002017c (FAILURE,HIGH) = No valid write type selected
  444. 0x0002017d (FATAL,HIGH) = Invalid file descriptor with stdio pseudo-drive
  445. 0x0002017e (FAILURE,HIGH) = Failed to close track, session, or disc
  446. 0x0002017f (FAILURE,HIGH) = Failed to synchronize drive cache
  447. 0x00020180 (FAILURE,HIGH) = Premature end of input encountered
  448. 0x00020181 (FAILURE,HIGH) = Pseudo-drive is a read-only file. Cannot write.
  449. 0x00020182 (FAILURE,HIGH) = Cannot truncate disk file for pseudo blanking
  450. 0x00020183 (WARNING,HIGH) = Failed to open device (a pseudo-drive) for reading
  451. 0x00020184 (WARNING,HIGH) = No Next-Writable-Address
  452. 0x00020185 (WARNING,HIGH) = Track damaged, not closed and not writable
  453. 0x00020186 (WARNING,HIGH) = Track damaged and not closed
  454. 0x00020187 (NOTE,HIGH) = Track not marked as damaged. No action taken.
  455. 0x00020188 (FAILURE,HIGH) = Cannot close damaged track on given media type
  456. 0x00020189 (FATAL,HIGH) = Drive is already grabbed by libburn
  457. 0x0002018a (SORRY,HIGH) = Timeout exceeded. Retry cancled.
  458. 0x0002018b (FAILURE,HIGH) = Too many CD-TEXT packs
  459. 0x0002018c (FAILURE,HIGH) = CD-TEXT pack type out of range
  460. 0x0002018d (FAILURE,HIGH) = CD-TEXT block number out of range
  461. 0x0002018e (FAILURE,HIGH) = Too many CD-TEXT packs in block
  462. 0x0002018f (FAILURE,HIGH) = CD-TEXT pack CRC mismatch
  463. 0x00020190 (WARNING,HIGH) = CD-TEXT pack CRC mismatch had to be corrected
  464. 0x00020191 (FAILURE,HIGH) = Unknown parameter in text input file
  465. 0x00020192 (FAILURE,HIGH) = Text input file sequence error
  466. 0x00020193 (FAILURE,HIGH) = Text input file readability problem
  467. 0x00020194 (FAILURE,HIGH) = Text input file syntax error or specs violation
  468. 0x00020195 (WARNING,HIGH) = Text input file warning
  469. 0x00020196 (FAILURE,HIGH) = Session has already defined tracks
  470. 0x00020197 (FAILURE,HIGH) = Unsupported text input file feature
  471. 0x00020198 (FAILURE,HIGH) = CD-TEXT pack file readability problem
  472. 0x00020199 (SORRY,HIGH) = Text input file reading aborted
  473. 0x0002019a (SORRY,HIGH) = Bad track index number
  474. 0x0002019b (SORRY,HIGH) = CD track number exceeds range of 1 to 99
  475. 0x0002019c (SORRY,HIGH) = Session has no defined tracks
  476. 0x0002019d (SORRY,HIGH) = Audio read size not properly aligned
  477. 0x0002019e (NOTE,HIGH) = Drive does not support media certification
  478. 0x0002019f (FAILURE,HIGH) = CD-TEXT binary pack array faulty
  479. 0x000201a0 (WARNING,HIGH) = Maximum number of CD-TEXT blocks exceeded
  480. 0x000201a1 (FAILURE,HIGH) = Cannot open disk file for writing
  481. 0x000201a2 (FAILURE,HIGH) = Error while writing to disk file
  482. 0x000201a3 (UPDATE,HIGH) = Progress message of burn_drive_extract_audio()
  483. 0x000201a4 (FAILURE,HIGH) = Failure to read audio sectors
  484. 0x000201a5 (FAILURE,HIGH) = Asynchronous SCSI error
  485. 0x000201a6 (FATAL,HIGH) = Lost connection to drive
  486. 0x000201a7 (FAILURE,HIGH) = SCSI command yielded host problem
  487. 0x000201a8 (FAILURE,HIGH) = SCSI command yielded driver problem
  488. 0x000201a9 (FAILURE,HIGH) = Implausible length from GET CONFIGURATION
  489. 0x000201aa (FAILURE,HIGH) = No CD-TEXT packs in file
  490. libdax_audioxtr:
  491. 0x00020200 (SORRY,HIGH) = Cannot open audio source file
  492. 0x00020201 (SORRY,HIGH) = Audio source file has unsuitable format
  493. 0x00020202 (SORRY,HIGH) = Failed to prepare reading of audio data
  494. ------------------------------------------------------------------------------
  495. Range "vreixo" : 0x00030000 to 0x0003ffff
  496. 0x0003ffff (FAILURE,HIGH) = Operation canceled
  497. 0x0003fffe (FATAL,HIGH) = Unknown or unexpected fatal error
  498. 0x0003fffd (FAILURE,HIGH) = Unknown or unexpected error
  499. 0x0003fffc (FATAL,HIGH) = Internal programming error
  500. 0x0003fffb (FAILURE,HIGH) = NULL pointer where NULL not allowed
  501. 0x0003fffa (FATAL,HIGH) = Memory allocation error
  502. 0x0003fff9 (FATAL,HIGH) = Interrupted by a signal
  503. 0x0003fff8 (FAILURE,HIGH) = Invalid parameter value
  504. 0x0003fff7 (FATAL,HIGH) = Cannot create a needed thread
  505. 0x0003fff6 (FAILURE,HIGH) = Write error
  506. 0x0003fff5 (FAILURE,HIGH) = Buffer read error
  507. 0x0003ffc0 (FAILURE,HIGH) = Trying to add a node already added to another dir
  508. 0x0003ffbf (FAILURE,HIGH) = Node with same name already exist
  509. 0x0003ffbe (FAILURE,HIGH) = Trying to remove a node that was not added to dir
  510. 0x0003ffbd (FAILURE,HIGH) = A requested node does not exist
  511. 0x0003ffbc (FAILURE,HIGH) = Image already bootable
  512. 0x0003ffbb (FAILURE,HIGH) = Trying to use an invalid file as boot image
  513. 0x0003ff80 (FAILURE,HIGH) = Error on file operation
  514. 0x0003ff7f (FAILURE,HIGH) = Trying to open an already openned file
  515. 0x0003ff7e (FAILURE,HIGH) = Access to file is not allowed
  516. 0x0003ff7d (FAILURE,HIGH) = Incorrect path to file
  517. 0x0003ff7c (FAILURE,HIGH) = The file does not exist in the filesystem
  518. 0x0003ff7b (FAILURE,HIGH) = Trying to read or close a file not openned
  519. 0x0003ff7a (FAILURE,HIGH) = Directory used where no dir is expected
  520. 0x0003ff79 (FAILURE,HIGH) = File read error
  521. 0x0003ff78 (FAILURE,HIGH) = Not dir used where a dir is expected
  522. 0x0003ff77 (FAILURE,HIGH) = Not symlink used where a symlink is expected
  523. 0x0003ff76 (FAILURE,HIGH) = Cannot seek to specified location
  524. 0x0003ff75 (HINT,MEDIUM) = File not supported in ECMA-119 tree and ignored
  525. 0x0003ff74 (HINT,MEDIUM) = File bigger than supported by used standard
  526. 0x0003ff73 (MISHAP,HIGH) = File read error during image creation
  527. 0x0003ff72 (HINT,MEDIUM) = Cannot convert filename to requested charset
  528. 0x0003ff71 (SORRY,HIGH) = File cannot be added to the tree
  529. 0x0003ff70 (HINT,MEDIUM) = File path breaks specification constraints
  530. 0x0003ff00 (FAILURE,HIGH) = Charset conversion error
  531. 0x0003feff (FAILURE,HIGH) = Too much files to mangle
  532. 0x0003fec0 (FAILURE,HIGH) = Wrong or damaged Primary Volume Descriptor
  533. 0x0003febf (SORRY,HIGH) = Wrong or damaged RR entry
  534. 0x0003febe (SORRY,HIGH) = Unsupported RR feature
  535. 0x0003febd (FAILURE,HIGH) = Wrong or damaged ECMA-119
  536. 0x0003febc (FAILURE,HIGH) = Unsupported ECMA-119 feature
  537. 0x0003febb (SORRY,HIGH) = Wrong or damaged El-Torito catalog
  538. 0x0003feba (SORRY,HIGH) = Unsupported El-Torito feature
  539. 0x0003feb9 (SORRY,HIGH) = Cannot patch isolinux boot image
  540. 0x0003feb8 (SORRY,HIGH) = Unsupported SUSP feature
  541. 0x0003feb7 (WARNING,HIGH) = Error on a RR entry that can be ignored
  542. 0x0003feb6 (HINT,MEDIUM) = Error on a RR entry that can be ignored
  543. 0x0003feb5 (WARNING,HIGH) = Multiple ER SUSP entries found
  544. 0x0003feb4 (HINT,MEDIUM) = Unsupported volume descriptor found
  545. 0x0003feb3 (WARNING,HIGH) = El-Torito related warning
  546. 0x0003feb2 (MISHAP,HIGH) = Image write cancelled
  547. 0x0003feb1 (WARNING,HIGH) = El-Torito image is hidden
  548. Outdated codes which may not be re-used for other purposes than
  549. re-instating them, if ever:
  550. X 0x00031001 (SORRY,HIGH) = Cannot read file (ignored)
  551. X 0x00031002 (FATAL,HIGH) = Cannot read file (operation canceled)
  552. X 0x00031000 (FATAL,HIGH) = Unsupported ISO-9660 image
  553. X 0x00031001 (HINT,MEDIUM) = Unsupported Vol Desc that will be ignored
  554. X 0x00031002 (FATAL,HIGH) = Damaged ISO-9660 image
  555. X 0x00031003 (SORRY,HIGH) = Cannot read previous image file
  556. X 0x00030101 (HINT,MEDIUM) = Unsupported SUSP entry that will be ignored
  557. X 0x00030102 (SORRY,HIGH) = Wrong/damaged SUSP entry
  558. X 0x00030103 (WARNING,MEDIUM)= Multiple SUSP ER entries where found
  559. X 0x00030111 (SORRY,HIGH) = Unsupported RR feature
  560. X 0x00030112 (SORRY,HIGH) = Error in a Rock Ridge entry
  561. X 0x00030201 (HINT,MEDIUM) = Unsupported Boot Vol Desc that will be ignored
  562. X 0x00030202 (SORRY,HIGH) = Wrong El-Torito catalog
  563. X 0x00030203 (HINT,MEDIUM) = Unsupported El-Torito feature
  564. X 0x00030204 (SORRY,HIGH) = Invalid file to be an El-Torito image
  565. X 0x00030205 (WARNING,MEDIUM)= Cannot properly patch isolinux image
  566. X 0x00030206 (WARNING,MEDIUM)= Copying El-Torito from a previous image without
  567. X enought info about it
  568. X 0x00030301 (NOTE,MEDIUM) = Unsupported file type for Joliet tree
  569. ------------------------------------------------------------------------------
  570. Range "application" : 0x00040000 to 0x0004ffff
  571. 0x00040000 (ABORT,HIGH) : Application supplied message
  572. 0x00040001 (FATAL,HIGH) : Application supplied message
  573. 0x00040002 (SORRY,HIGH) : Application supplied message
  574. 0x00040003 (WARNING,HIGH) : Application supplied message
  575. 0x00040004 (HINT,HIGH) : Application supplied message
  576. 0x00040005 (NOTE,HIGH) : Application supplied message
  577. 0x00040006 (UPDATE,HIGH) : Application supplied message
  578. 0x00040007 (DEBUG,HIGH) : Application supplied message
  579. 0x00040008 (*,HIGH) : Application supplied message
  580. ------------------------------------------------------------------------------
  581. Range "libisofs-xorriso" : 0x00050000 to 0x0005ffff
  582. This is an alternative representation of libisofs.so.6 error codes in xorriso.
  583. If values returned by iso_error_get_code() do not fit into 0x30000 to 0x3ffff
  584. then they get truncated to 16 bit and mapped into this range.
  585. (This should never need to happen, of course.)
  586. ------------------------------------------------------------------------------
  587. Range "libisoburn" : 0x00060000 to 0x00006ffff
  588. 0x00060000 (*,*) : Message which shall be attributed to libisoburn
  589. >>> the messages of libisoburn need to be registered individually
  590. ------------------------------------------------------------------------------
  591. #endif /* LIBDAX_MSGS_________________ */
  592. #ifdef LIBDAX_MSGS_H_INTERNAL
  593. /* Internal Functions */
  594. /** Lock before doing side effect operations on m */
  595. static int libdax_msgs_lock(struct libdax_msgs *m, int flag);
  596. /** Unlock after effect operations on m are done */
  597. static int libdax_msgs_unlock(struct libdax_msgs *m, int flag);
  598. /** Create new empty message item.
  599. @param link Previous item in queue
  600. @param flag Bitfield for control purposes (unused yet, submit 0)
  601. @return >0 success, <=0 failure
  602. */
  603. static int libdax_msgs_item_new(struct libdax_msgs_item **item,
  604. struct libdax_msgs_item *link, int flag);
  605. /** Destroy a message item obtained by libdax_msgs_obtain(). The submitted
  606. pointer gets set to NULL.
  607. @param flag Bitfield for control purposes (unused yet, submit 0)
  608. @return 1 for success, 0 for pointer to NULL
  609. */
  610. static int libdax_msgs_item_destroy(struct libdax_msgs_item **item, int flag);
  611. #endif /* LIBDAX_MSGS_H_INTERNAL */
  612. #endif /* ! LIBDAX_MSGS_H_INCLUDED */