Sophie

Sophie

distrib > Fedora > 13 > x86_64 > by-pkgid > a845ba80102426ee04e71f1a2134abba > files > 38

libburn-devel-0.7.0-1.fc13.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libburn: libburner.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
</div>
<div class="contents">
<h1>libburner.c File Reference</h1><code>#include &quot;../libburn/libburn.h&quot;</code><br/>
<code>#include &lt;stdio.h&gt;</code><br/>
<code>#include &lt;ctype.h&gt;</code><br/>
<code>#include &lt;sys/types.h&gt;</code><br/>
<code>#include &lt;unistd.h&gt;</code><br/>
<code>#include &lt;string.h&gt;</code><br/>
<code>#include &lt;stdlib.h&gt;</code><br/>
<code>#include &lt;time.h&gt;</code><br/>
<code>#include &lt;errno.h&gt;</code><br/>
<code>#include &lt;sys/stat.h&gt;</code><br/>
<code>#include &lt;fcntl.h&gt;</code><br/>
<div class="dynheader">
Include dependency graph for libburner.c:</div>
<div class="dynsection">
<div class="center"><img src="libburner_8c__incl.png" border="0" usemap="#libburner_8c_map" alt=""/></div>
</div>

<p><a href="libburner_8c_source.html">Go to the source code of this file.</a></p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td colspan="2"><h2>Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a3ed4822421dfb49c359b85accd952b56">libburner_aquire_by_adr</a> (char *<a class="el" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1">drive_adr</a>)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">If the persistent drive address is known, then this approach is much more un-obtrusive to the systemwide livestock of drives.  <a href="#a3ed4822421dfb49c359b85accd952b56"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#aa2de071d4fb803b4a171dbc8dc14be5c">libburner_aquire_by_driveno</a> (int *<a class="el" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This method demonstrates how to use libburn without knowing a persistent drive address in advance.  <a href="#aa2de071d4fb803b4a171dbc8dc14be5c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#ab485e1b9ba9572fb7596ffa6d6ff67c7">libburner_aquire_drive</a> (char *<a class="el" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1">drive_adr</a>, int *<a class="el" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">You need to aquire a drive before burning.  <a href="#ab485e1b9ba9572fb7596ffa6d6ff67c7"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a0d4b7dff006b3f1f2aac1acc48ba99df">libburner_blank_disc</a> (struct burn_drive *drive, int blank_fast)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Makes a previously used CD-RW or unformatted DVD-RW ready for thorough re-usal.  <a href="#a0d4b7dff006b3f1f2aac1acc48ba99df"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a42f03141c04bc55410fdc8e93c4f0143">libburner_format</a> (struct burn_drive *drive)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Formats unformatted DVD-RW to profile 0013h "Restricted Overwrite" which needs no blanking for re-use but is not capable of multi-session.  <a href="#a42f03141c04bc55410fdc8e93c4f0143"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#af9c2fc57ed6d8505b22d377daef4914b">libburner_payload</a> (struct burn_drive *drive, char <a class="el" href="libburner_8c.html#a20401aa73b1b1c04c3faddfd1647f302">source_adr</a>[][4096], int <a class="el" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a>, int multi, int <a class="el" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a>, int <a class="el" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a>)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Brings preformatted track images (ISO 9660, audio, .  <a href="#af9c2fc57ed6d8505b22d377daef4914b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a67980a9cee509cf714f67aa96a47c75d">libburner_setup</a> (int argc, char **argv)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Converts command line arguments into above setup parameters.  <a href="#a67980a9cee509cf714f67aa96a47c75d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a3c04138a5bfe5d72780bb7e82a18e627">main</a> (int argc, char **argv)</td></tr>
<tr><td colspan="2"><h2>Variables</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static struct <a class="el" href="structburn__drive__info.html">burn_drive_info</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba">drive_list</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Overview.  <a href="#a271c6b9f59f56d3ac45a173461f3eeba"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static unsigned int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a2ab10011f756aef24f3168d95a5b439b">drive_count</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">If you start a long lasting operation with drive_count &gt; 1 then you are not friendly to the users of other drives on those systems.  <a href="#a2ab10011f756aef24f3168d95a5b439b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#aaee536e445f55d19bfeb431850ec90e4">drive_is_grabbed</a> = 0</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This variable indicates wether the drive is grabbed and must be finally released.  <a href="#aaee536e445f55d19bfeb431850ec90e4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043">current_profile</a> = -1</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A number and a text describing the type of media in aquired drive.  <a href="#aa1a3fe5ef89cfc5713ab70e8b3d41043"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a> [80] = {&quot;&quot;}</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1">drive_adr</a> [BURN_DRIVE_ADR_LEN] = {&quot;&quot;}</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The setup parameters of libburner.  <a href="#adbe410a004b2aefa8868608beb2e5df1"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> = 0</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> = 0</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a20401aa73b1b1c04c3faddfd1647f302">source_adr</a> [99][4096]</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a> = 0</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a8e824cc51e6e6cfc91ac1df7830a70ed">do_multi</a> = 0</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a> = 0</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a> = BURN_MODE1</td></tr>
</table>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="a3ed4822421dfb49c359b85accd952b56"></a><!-- doxytag: member="libburner.c::libburner_aquire_by_adr" ref="a3ed4822421dfb49c359b85accd952b56" args="(char *drive_adr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_aquire_by_adr </td>
          <td>(</td>
          <td class="paramtype">char *&nbsp;</td>
          <td class="paramname"> <em>drive_adr</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>If the persistent drive address is known, then this approach is much more un-obtrusive to the systemwide livestock of drives. </p>
<p>Only the given drive device will be opened during this procedure. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00123">123</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburn_8h_source.html#l00946">BURN_DRIVE_ADR_LEN</a>, <a class="el" href="libburn_8h.html#a1b0e38d691eeb1da5f34a6ef0cc052bc">burn_drive_convert_fs_adr()</a>, <a class="el" href="libburn_8h.html#ae9c75e892e445ff73c38579210ba06a9">burn_drive_scan_and_grab()</a>, and <a class="el" href="libburner_8c_source.html#l00075">drive_is_grabbed</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00101">libburner_aquire_drive()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00124"></a>00124 {
<a name="l00125"></a>00125     <span class="keywordtype">int</span> ret;
<a name="l00126"></a>00126     <span class="keywordtype">char</span> libburn_drive_adr[<a class="code" href="libburn_8h.html#a489ca2111726a034324275aca4ed069c" title="Maximum length+1 to expect with a persistent drive address string.">BURN_DRIVE_ADR_LEN</a>];
<a name="l00127"></a>00127 
<a name="l00128"></a>00128     <span class="comment">/* Some not-so-harmless drive addresses get blocked in this demo */</span>
<a name="l00129"></a>00129     <span class="keywordflow">if</span> (strncmp(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>, <span class="stringliteral">&quot;stdio:/dev/fd/&quot;</span>, 14) == 0 ||
<a name="l00130"></a>00130         strcmp(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>, <span class="stringliteral">&quot;stdio:-&quot;</span>) == 0) {
<a name="l00131"></a>00131         fprintf(stderr, <span class="stringliteral">&quot;Will not work with pseudo-drive &apos;%s&apos;\n&quot;</span>,
<a name="l00132"></a>00132             <a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>);
<a name="l00133"></a>00133         <span class="keywordflow">return</span> 0;
<a name="l00134"></a>00134     }
<a name="l00135"></a>00135 
<a name="l00136"></a>00136     <span class="comment">/* This tries to resolve links or alternative device files */</span>
<a name="l00137"></a>00137     ret = <a class="code" href="libburn_8h.html#a1b0e38d691eeb1da5f34a6ef0cc052bc" title="Try to convert a given existing filesystem address into a persistent drive address...">burn_drive_convert_fs_adr</a>(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>, libburn_drive_adr);  
<a name="l00138"></a>00138     <span class="keywordflow">if</span> (ret&lt;=0) {
<a name="l00139"></a>00139         fprintf(stderr, <span class="stringliteral">&quot;Address does not lead to a CD burner: &apos;%s&apos;\n&quot;</span>,
<a name="l00140"></a>00140                  <a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>);
<a name="l00141"></a>00141         <span class="keywordflow">return</span> 0;
<a name="l00142"></a>00142     }
<a name="l00143"></a>00143     fprintf(stderr,<span class="stringliteral">&quot;Aquiring drive &apos;%s&apos; ...\n&quot;</span>, libburn_drive_adr);
<a name="l00144"></a>00144     ret = <a class="code" href="libburn_8h.html#ae9c75e892e445ff73c38579210ba06a9" title="Aquire a drive with known persistent address.">burn_drive_scan_and_grab</a>(&amp;<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>, libburn_drive_adr, 1);
<a name="l00145"></a>00145     <span class="keywordflow">if</span> (ret &lt;= 0) {
<a name="l00146"></a>00146         fprintf(stderr,<span class="stringliteral">&quot;FAILURE with persistent drive address  &apos;%s&apos;\n&quot;</span>,
<a name="l00147"></a>00147             libburn_drive_adr);
<a name="l00148"></a>00148     } <span class="keywordflow">else</span> {
<a name="l00149"></a>00149         fprintf(stderr,<span class="stringliteral">&quot;Done\n&quot;</span>);
<a name="l00150"></a>00150         <a class="code" href="libburner_8c.html#aaee536e445f55d19bfeb431850ec90e4" title="This variable indicates wether the drive is grabbed and must be finally released...">drive_is_grabbed</a> = 1;
<a name="l00151"></a>00151     }
<a name="l00152"></a>00152     <span class="keywordflow">return</span> ret;
<a name="l00153"></a>00153 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="aa2de071d4fb803b4a171dbc8dc14be5c"></a><!-- doxytag: member="libburner.c::libburner_aquire_by_driveno" ref="aa2de071d4fb803b4a171dbc8dc14be5c" args="(int *driveno)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_aquire_by_driveno </td>
          <td>(</td>
          <td class="paramtype">int *&nbsp;</td>
          <td class="paramname"> <em>driveno</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>This method demonstrates how to use libburn without knowing a persistent drive address in advance. </p>
<p>It has to make sure that after assessing the list of available drives, all unwanted drives get closed again. As long as they are open, no other libburn instance can see them. This is an intended locking feature. The application is responsible for giving up the locks by either <a class="el" href="libburn_8h.html#a765bba03b9f40c07f159ff9ef7db0e09" title="Release a drive.">burn_drive_release()</a> (only after <a class="el" href="libburn_8h.html#a392a1a309e906c35b8e2f31cc3f30969" title="Grab a drive.">burn_drive_grab()</a> !), <a class="el" href="libburn_8h.html#a9ac4cfc83330f237b6b3824e58039775" title="Release memory about a single drive and any exclusive lock on it.">burn_drive_info_forget()</a>, <a class="el" href="libburn_8h.html#acfdda1441d7c2fe226c9efc3a640107c" title="When no longer needed, free a whole burn_drive_info array which was returned by burn_drive_scan()...">burn_drive_info_free()</a>, or <a class="el" href="libburn_8h.html#ab9b933537517c9fda9758a9f2b4af337" title="Shutdown the library.">burn_finish()</a>. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>driveno</em>&nbsp;</td><td>the index number in libburn's drive list. This will get set to 0 on success and will then be the drive index to use in the further dourse of processing. </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>1 success , &lt;= 0 failure </dd></dl>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00168">168</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburn_8h_source.html#l00946">BURN_DRIVE_ADR_LEN</a>, <a class="el" href="libburn_8h.html#a1ccfaccc7c7b10aa7f25bec20cf1b1b2">burn_drive_get_adr()</a>, <a class="el" href="libburn_8h.html#a392a1a309e906c35b8e2f31cc3f30969">burn_drive_grab()</a>, <a class="el" href="libburn_8h.html#a9ac4cfc83330f237b6b3824e58039775">burn_drive_info_forget()</a>, <a class="el" href="libburn_8h.html#a21b480156713f0dbc8a254c24fa9689e">burn_drive_scan()</a>, <a class="el" href="libburn_8h_source.html#l00590">burn_drive_info::drive</a>, <a class="el" href="libburner_8c_source.html#l00071">drive_count</a>, <a class="el" href="libburner_8c_source.html#l00075">drive_is_grabbed</a>, <a class="el" href="libburn_8h_source.html#l00524">burn_drive_info::product</a>, and <a class="el" href="libburn_8h_source.html#l00522">burn_drive_info::vendor</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00101">libburner_aquire_drive()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00169"></a>00169 {
<a name="l00170"></a>00170     <span class="keywordtype">char</span> adr[<a class="code" href="libburn_8h.html#a489ca2111726a034324275aca4ed069c" title="Maximum length+1 to expect with a persistent drive address string.">BURN_DRIVE_ADR_LEN</a>];
<a name="l00171"></a>00171     <span class="keywordtype">int</span> ret, i;
<a name="l00172"></a>00172 
<a name="l00173"></a>00173     printf(<span class="stringliteral">&quot;Beginning to scan for devices ...\n&quot;</span>);
<a name="l00174"></a>00174     <span class="keywordflow">while</span> (!<a class="code" href="libburn_8h.html#a21b480156713f0dbc8a254c24fa9689e" title="Scan for drives.">burn_drive_scan</a>(&amp;<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>, &amp;<a class="code" href="libburner_8c.html#a2ab10011f756aef24f3168d95a5b439b" title="If you start a long lasting operation with drive_count &amp;gt; 1 then you are not friendly...">drive_count</a>))
<a name="l00175"></a>00175         usleep(100002);
<a name="l00176"></a>00176     <span class="keywordflow">if</span> (drive_count &lt;= 0 &amp;&amp; *driveno &gt;= 0) {
<a name="l00177"></a>00177         printf(<span class="stringliteral">&quot;FAILED (no drives found)\n&quot;</span>);
<a name="l00178"></a>00178         <span class="keywordflow">return</span> 0;
<a name="l00179"></a>00179     }
<a name="l00180"></a>00180     printf(<span class="stringliteral">&quot;Done\n&quot;</span>);
<a name="l00181"></a>00181 
<a name="l00182"></a>00182     <span class="comment">/*</span>
<a name="l00183"></a>00183 <span class="comment">    Interactive programs may choose the drive number at this moment.</span>
<a name="l00184"></a>00184 <span class="comment"></span>
<a name="l00185"></a>00185 <span class="comment">    drive[0] to drive[drive_count-1] are struct burn_drive_info</span>
<a name="l00186"></a>00186 <span class="comment">    as defined in  libburn/libburn.h  . This structure is part of API</span>
<a name="l00187"></a>00187 <span class="comment">    and thus will strive for future compatibility on source level.</span>
<a name="l00188"></a>00188 <span class="comment">    Have a look at the info offered.</span>
<a name="l00189"></a>00189 <span class="comment">    Caution: do not take .location for drive address. Always use</span>
<a name="l00190"></a>00190 <span class="comment">        burn_drive_get_adr() or you might become incompatible</span>
<a name="l00191"></a>00191 <span class="comment">        in future.</span>
<a name="l00192"></a>00192 <span class="comment">    Note: bugs with struct burn_drive_info - if any - will not be</span>
<a name="l00193"></a>00193 <span class="comment">        easy to fix. Please report them but also strive for</span>
<a name="l00194"></a>00194 <span class="comment">        workarounds on application level.</span>
<a name="l00195"></a>00195 <span class="comment">    */</span>
<a name="l00196"></a>00196     printf(<span class="stringliteral">&quot;\nOverview of accessible drives (%d found) :\n&quot;</span>,
<a name="l00197"></a>00197         <a class="code" href="libburner_8c.html#a2ab10011f756aef24f3168d95a5b439b" title="If you start a long lasting operation with drive_count &amp;gt; 1 then you are not friendly...">drive_count</a>);
<a name="l00198"></a>00198     printf(<span class="stringliteral">&quot;-----------------------------------------------------------------------------\n&quot;</span>);
<a name="l00199"></a>00199     <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="libburner_8c.html#a2ab10011f756aef24f3168d95a5b439b" title="If you start a long lasting operation with drive_count &amp;gt; 1 then you are not friendly...">drive_count</a>; i++) {
<a name="l00200"></a>00200         <span class="keywordflow">if</span> (<a class="code" href="libburn_8h.html#a1ccfaccc7c7b10aa7f25bec20cf1b1b2" title="Inquire the persistent address of a drive via a given drive_info object.">burn_drive_get_adr</a>(&amp;(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[i]), adr) &lt;=0)
<a name="l00201"></a>00201             strcpy(adr, <span class="stringliteral">&quot;-get_adr_failed-&quot;</span>);
<a name="l00202"></a>00202         printf(<span class="stringliteral">&quot;%d  --drive &apos;%s&apos;  :  &apos;%s&apos;  &apos;%s&apos;\n&quot;</span>,
<a name="l00203"></a>00203             i,adr,<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[i].vendor,<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[i].product);
<a name="l00204"></a>00204     }
<a name="l00205"></a>00205     printf(<span class="stringliteral">&quot;-----------------------------------------------------------------------------\n\n&quot;</span>);
<a name="l00206"></a>00206 
<a name="l00207"></a>00207     <span class="comment">/*</span>
<a name="l00208"></a>00208 <span class="comment">    On multi-drive systems save yourself from sysadmins&apos; revenge.</span>
<a name="l00209"></a>00209 <span class="comment"></span>
<a name="l00210"></a>00210 <span class="comment">    Be aware that you hold reserved all available drives at this point.</span>
<a name="l00211"></a>00211 <span class="comment">    So either make your choice quick enough not to annoy other system</span>
<a name="l00212"></a>00212 <span class="comment">    users, or set free the drives for a while.</span>
<a name="l00213"></a>00213 <span class="comment"></span>
<a name="l00214"></a>00214 <span class="comment">    The tested way of setting free all drives is to shutdown the library</span>
<a name="l00215"></a>00215 <span class="comment">    and to restart when the choice has been made. The list of selectable</span>
<a name="l00216"></a>00216 <span class="comment">    drives should also hold persistent drive addresses as obtained</span>
<a name="l00217"></a>00217 <span class="comment">    above by burn_drive_get_adr(). By such an address one may use</span>
<a name="l00218"></a>00218 <span class="comment">    burn_drive_scan_and_grab() to finally aquire exactly one drive.</span>
<a name="l00219"></a>00219 <span class="comment"></span>
<a name="l00220"></a>00220 <span class="comment">    A not yet tested shortcut should be to call burn_drive_info_free()</span>
<a name="l00221"></a>00221 <span class="comment">    and to call either burn_drive_scan() or burn_drive_scan_and_grab()</span>
<a name="l00222"></a>00222 <span class="comment">    before accessing any drives again.</span>
<a name="l00223"></a>00223 <span class="comment"></span>
<a name="l00224"></a>00224 <span class="comment">    In both cases you have to be aware that the desired drive might get</span>
<a name="l00225"></a>00225 <span class="comment">    aquired in the meantime by another user resp. libburn process.</span>
<a name="l00226"></a>00226 <span class="comment">    */</span>
<a name="l00227"></a>00227 
<a name="l00228"></a>00228     <span class="comment">/* We already made our choice via command line. (default is 0)</span>
<a name="l00229"></a>00229 <span class="comment">       So we just have to keep our desired drive and drop all others.</span>
<a name="l00230"></a>00230 <span class="comment">       No other libburn instance will have a chance to steal our drive.</span>
<a name="l00231"></a>00231 <span class="comment">     */</span>
<a name="l00232"></a>00232     <span class="keywordflow">if</span> (*<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> &lt; 0) {
<a name="l00233"></a>00233         printf(<span class="stringliteral">&quot;Pseudo-drive \&quot;-\&quot; given : bus scanning done.\n&quot;</span>);
<a name="l00234"></a>00234         <span class="keywordflow">return</span> 2; <span class="comment">/* the program will end after this */</span>
<a name="l00235"></a>00235     }
<a name="l00236"></a>00236     <span class="keywordflow">if</span> (drive_count &lt;= *<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>) {
<a name="l00237"></a>00237         fprintf(stderr,
<a name="l00238"></a>00238             <span class="stringliteral">&quot;Found only %d drives. Number %d not available.\n&quot;</span>,
<a name="l00239"></a>00239             drive_count, *<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>);
<a name="l00240"></a>00240         <span class="keywordflow">return</span> 0; <span class="comment">/* the program will end after this */</span>
<a name="l00241"></a>00241     }
<a name="l00242"></a>00242 
<a name="l00243"></a>00243     <span class="comment">/* Drop all drives which we do not want to use */</span>
<a name="l00244"></a>00244     <span class="keywordflow">for</span> (i = 0; i &lt; drive_count; i++) {
<a name="l00245"></a>00245         <span class="keywordflow">if</span> (i == *<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>) <span class="comment">/* the one drive we want to keep */</span>
<a name="l00246"></a>00246     <span class="keywordflow">continue</span>;
<a name="l00247"></a>00247         ret = <a class="code" href="libburn_8h.html#a9ac4cfc83330f237b6b3824e58039775" title="Release memory about a single drive and any exclusive lock on it.">burn_drive_info_forget</a>(&amp;(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[i]),0);
<a name="l00248"></a>00248         <span class="keywordflow">if</span> (ret != 1)
<a name="l00249"></a>00249             fprintf(stderr, <span class="stringliteral">&quot;Cannot drop drive %d. Please report \&quot;ret=%d\&quot; to libburn-hackers@pykix.org\n&quot;</span>,
<a name="l00250"></a>00250                 i, ret);
<a name="l00251"></a>00251         <span class="keywordflow">else</span>
<a name="l00252"></a>00252             printf(<span class="stringliteral">&quot;Dropped unwanted drive %d\n&quot;</span>,i);
<a name="l00253"></a>00253     }
<a name="l00254"></a>00254     <span class="comment">/* Make the one we want ready for blanking or burning */</span>
<a name="l00255"></a>00255     ret= <a class="code" href="libburn_8h.html#a392a1a309e906c35b8e2f31cc3f30969" title="Grab a drive.">burn_drive_grab</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[*<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>].drive, 1);
<a name="l00256"></a>00256     <span class="keywordflow">if</span> (ret != 1)
<a name="l00257"></a>00257         <span class="keywordflow">return</span> 0;
<a name="l00258"></a>00258     <a class="code" href="libburner_8c.html#aaee536e445f55d19bfeb431850ec90e4" title="This variable indicates wether the drive is grabbed and must be finally released...">drive_is_grabbed</a> = 1;
<a name="l00259"></a>00259     <span class="keywordflow">return</span> 1;
<a name="l00260"></a>00260 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="ab485e1b9ba9572fb7596ffa6d6ff67c7"></a><!-- doxytag: member="libburner.c::libburner_aquire_drive" ref="ab485e1b9ba9572fb7596ffa6d6ff67c7" args="(char *drive_adr, int *driveno)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_aquire_drive </td>
          <td>(</td>
          <td class="paramtype">char *&nbsp;</td>
          <td class="paramname"> <em>drive_adr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int *&nbsp;</td>
          <td class="paramname"> <em>driveno</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>You need to aquire a drive before burning. </p>
<p>The API offers this as one compact call and alternatively as application controllable gestures of whitelisting, scanning for drives and finally grabbing one of them.</p>
<p>If you have a persistent address of the drive, then the compact call is to prefer because it only touches one drive. On modern Linux kernels, there should be no fatal disturbance of ongoing burns of other libburn instances with any of our approaches. We use open(O_EXCL) by default. On /dev/hdX it should cooperate with growisofs and some cdrecord variants. On /dev/sgN versus /dev/scdM expect it not to respect other programs. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00101">101</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburn_8h.html#a1627c70c71ec5b6116f8d9d63d229285">burn_disc_get_profile()</a>, <a class="el" href="libburner_8c_source.html#l00078">current_profile</a>, <a class="el" href="libburner_8c_source.html#l00079">current_profile_name</a>, <a class="el" href="libburn_8h_source.html#l00590">burn_drive_info::drive</a>, <a class="el" href="libburner_8c_source.html#l00123">libburner_aquire_by_adr()</a>, and <a class="el" href="libburner_8c_source.html#l00168">libburner_aquire_by_driveno()</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00102"></a>00102 {
<a name="l00103"></a>00103     <span class="keywordtype">int</span> ret;
<a name="l00104"></a>00104 
<a name="l00105"></a>00105     <span class="keywordflow">if</span>(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a> != NULL &amp;&amp; <a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>[0] != 0)
<a name="l00106"></a>00106         ret = <a class="code" href="libburner_8c.html#a3ed4822421dfb49c359b85accd952b56" title="If the persistent drive address is known, then this approach is much more un-obtrusive...">libburner_aquire_by_adr</a>(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>);
<a name="l00107"></a>00107     <span class="keywordflow">else</span>
<a name="l00108"></a>00108         ret = <a class="code" href="libburner_8c.html#aa2de071d4fb803b4a171dbc8dc14be5c" title="This method demonstrates how to use libburn without knowing a persistent drive address...">libburner_aquire_by_driveno</a>(<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>);
<a name="l00109"></a>00109     <span class="keywordflow">if</span> (ret &lt;= 0 || *<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> &lt;= 0)
<a name="l00110"></a>00110         <span class="keywordflow">return</span> ret;
<a name="l00111"></a>00111     <a class="code" href="libburn_8h.html#a1627c70c71ec5b6116f8d9d63d229285" title="Tells the MMC Profile identifier of the loaded media.">burn_disc_get_profile</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[0].drive, &amp;<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a>,
<a name="l00112"></a>00112                  <a class="code" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a>);
<a name="l00113"></a>00113     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a>[0])
<a name="l00114"></a>00114         printf(<span class="stringliteral">&quot;Detected media type: %s\n&quot;</span>, <a class="code" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a>);
<a name="l00115"></a>00115     <span class="keywordflow">return</span> 1;
<a name="l00116"></a>00116 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="a0d4b7dff006b3f1f2aac1acc48ba99df"></a><!-- doxytag: member="libburner.c::libburner_blank_disc" ref="a0d4b7dff006b3f1f2aac1acc48ba99df" args="(struct burn_drive *drive, int blank_fast)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_blank_disc </td>
          <td>(</td>
          <td class="paramtype">struct burn_drive *&nbsp;</td>
          <td class="paramname"> <em>drive</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>blank_fast</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Makes a previously used CD-RW or unformatted DVD-RW ready for thorough re-usal. </p>
<p>To our knowledge it is hardly possible to abort an ongoing blank operation because after start it is entirely handled by the drive. So expect signal handling to wait the normal blanking timespan until it can allow the process to end. External kill -9 will not help the drive. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00271">271</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburn_8h_source.html#l00214">BURN_DISC_APPENDABLE</a>, <a class="el" href="libburn_8h_source.html#l00204">BURN_DISC_BLANK</a>, <a class="el" href="libburn_8h_source.html#l00207">BURN_DISC_EMPTY</a>, <a class="el" href="libburn_8h.html#a7838224062ed72305f3c6b1055cb1a98">burn_disc_erasable()</a>, <a class="el" href="libburn_8h.html#a86a5394e31ab522bca8cc5b7990f1923">burn_disc_erase()</a>, <a class="el" href="libburn_8h_source.html#l00225">BURN_DISC_FULL</a>, <a class="el" href="libburn_8h.html#ac009cc9dfe07c8c0b67f528a369fd511">burn_disc_get_status()</a>, <a class="el" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d">burn_drive_get_status()</a>, <a class="el" href="libburn_8h_source.html#l00255">BURN_DRIVE_IDLE</a>, <a class="el" href="libburner_8c_source.html#l00078">current_profile</a>, <a class="el" href="libburn_8h_source.html#l00616">burn_progress::sector</a>, and <a class="el" href="libburn_8h_source.html#l00613">burn_progress::sectors</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00272"></a>00272 {
<a name="l00273"></a>00273     <span class="keyword">enum</span> <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54" title="Possible status of the drive in regard to the disc in it.">burn_disc_status</a> disc_state;
<a name="l00274"></a>00274     <span class="keyword">struct </span><a class="code" href="structburn__progress.html" title="Operation progress report.">burn_progress</a> p;
<a name="l00275"></a>00275     <span class="keywordtype">double</span> percent = 1.0;
<a name="l00276"></a>00276 
<a name="l00277"></a>00277     disc_state = <a class="code" href="libburn_8h.html#ac009cc9dfe07c8c0b67f528a369fd511" title="Returns what kind of disc a drive is holding.">burn_disc_get_status</a>(drive);
<a name="l00278"></a>00278     printf(
<a name="l00279"></a>00279         <span class="stringliteral">&quot;Drive media status:  %d  (see  libburn/libburn.h  BURN_DISC_*)\n&quot;</span>,
<a name="l00280"></a>00280         disc_state);
<a name="l00281"></a>00281     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x13) {
<a name="l00282"></a>00282         ; <span class="comment">/* formatted DVD-RW will get blanked to sequential state */</span>
<a name="l00283"></a>00283     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (disc_state == <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54a59c757934ef338281512efce4ab6fd93" title="The drive holds a blank disc.">BURN_DISC_BLANK</a>) {
<a name="l00284"></a>00284         fprintf(stderr,
<a name="l00285"></a>00285           <span class="stringliteral">&quot;IDLE: Blank media detected. Will leave it untouched\n&quot;</span>);
<a name="l00286"></a>00286         <span class="keywordflow">return</span> 2;
<a name="l00287"></a>00287     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (disc_state == <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54ae0ea0a584e319ee775062c88975c93cd" title="There is a disc with data on it in the drive.">BURN_DISC_FULL</a> ||
<a name="l00288"></a>00288            disc_state == <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54acda6fac8462fa9affb4bff80daa2ab3f" title="There is an incomplete disc in the drive.">BURN_DISC_APPENDABLE</a>) {
<a name="l00289"></a>00289         ; <span class="comment">/* this is what libburner is willing to blank */</span>
<a name="l00290"></a>00290     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (disc_state == <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54a23eef5011f3aa95ce1858a2930c22c69" title="There is no disc at all in the drive.">BURN_DISC_EMPTY</a>) {
<a name="l00291"></a>00291         fprintf(stderr,<span class="stringliteral">&quot;FATAL: No media detected in drive\n&quot;</span>);
<a name="l00292"></a>00292         <span class="keywordflow">return</span> 0;
<a name="l00293"></a>00293     } <span class="keywordflow">else</span> {
<a name="l00294"></a>00294         fprintf(stderr,
<a name="l00295"></a>00295             <span class="stringliteral">&quot;FATAL: Unsuitable drive and media state\n&quot;</span>);
<a name="l00296"></a>00296         <span class="keywordflow">return</span> 0;
<a name="l00297"></a>00297     }
<a name="l00298"></a>00298     <span class="keywordflow">if</span>(!<a class="code" href="libburn_8h.html#a7838224062ed72305f3c6b1055cb1a98" title="Tells whether a disc can be erased or not.">burn_disc_erasable</a>(drive)) {
<a name="l00299"></a>00299         fprintf(stderr,
<a name="l00300"></a>00300             <span class="stringliteral">&quot;FATAL : Media is not of erasable type\n&quot;</span>);
<a name="l00301"></a>00301         <span class="keywordflow">return</span> 0;
<a name="l00302"></a>00302     }
<a name="l00303"></a>00303     printf(
<a name="l00304"></a>00304           <span class="stringliteral">&quot;Beginning to %s-blank media.\n&quot;</span>, (blank_fast?<span class="stringliteral">&quot;fast&quot;</span>:<span class="stringliteral">&quot;full&quot;</span>));
<a name="l00305"></a>00305     <a class="code" href="libburn_8h.html#a86a5394e31ab522bca8cc5b7990f1923" title="Erase a disc in the drive.">burn_disc_erase</a>(drive, blank_fast);
<a name="l00306"></a>00306     sleep(1);
<a name="l00307"></a>00307     <span class="keywordflow">while</span> (<a class="code" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d" title="Returns the progress and status of a drive.">burn_drive_get_status</a>(drive, &amp;p) != <a class="code" href="libburn_8h.html#a3cb9c75648e773f63911b0975f67802badcb522cf8ccf1349e3d69826c3e1757f" title="The drive is not in an operation.">BURN_DRIVE_IDLE</a>) {
<a name="l00308"></a>00308         <span class="keywordflow">if</span>(p.sectors&gt;0 &amp;&amp; p.sector&gt;=0) <span class="comment">/* display 1 to 99 percent */</span>
<a name="l00309"></a>00309             percent = 1.0 + ((double) p.sector+1.0)
<a name="l00310"></a>00310                      / ((double) p.sectors) * 98.0;
<a name="l00311"></a>00311         printf(<span class="stringliteral">&quot;Blanking  ( %.1f%% done )\n&quot;</span>, percent);
<a name="l00312"></a>00312         sleep(1);
<a name="l00313"></a>00313     }
<a name="l00314"></a>00314     printf(<span class="stringliteral">&quot;Done\n&quot;</span>);
<a name="l00315"></a>00315     <span class="keywordflow">return</span> 1;
<a name="l00316"></a>00316 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="a42f03141c04bc55410fdc8e93c4f0143"></a><!-- doxytag: member="libburner.c::libburner_format" ref="a42f03141c04bc55410fdc8e93c4f0143" args="(struct burn_drive *drive)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_format </td>
          <td>(</td>
          <td class="paramtype">struct burn_drive *&nbsp;</td>
          <td class="paramname"> <em>drive</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Formats unformatted DVD-RW to profile 0013h "Restricted Overwrite" which needs no blanking for re-use but is not capable of multi-session. </p>
<p>Expect a behavior similar to blanking with unusual noises from the drive.</p>
<p>Formats unformatted BD-RE to default size. This will allocate some reserve space, test for bad blocks and make the media ready for writing. Expect a very long run time.</p>
<p>Formats unformatted blank BD-R to hold a default amount of spare blocks for eventual mishaps during writing. If BD-R get written without being formatted, then they get no such reserve and will burn at full speed. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00331">331</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburn_8h_source.html#l00204">BURN_DISC_BLANK</a>, <a class="el" href="libburn_8h.html#a1ac5250deb1dd13d7192f5e834fd5c4d">burn_disc_format()</a>, <a class="el" href="libburn_8h.html#abe718b844984771afe7c38f44e7abbe6">burn_disc_get_formats()</a>, <a class="el" href="libburn_8h.html#a1627c70c71ec5b6116f8d9d63d229285">burn_disc_get_profile()</a>, <a class="el" href="libburn_8h.html#ac009cc9dfe07c8c0b67f528a369fd511">burn_disc_get_status()</a>, <a class="el" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d">burn_drive_get_status()</a>, <a class="el" href="libburn_8h_source.html#l00255">BURN_DRIVE_IDLE</a>, <a class="el" href="libburn_8h_source.html#l01312">BURN_FORMAT_IS_UNFORMATTED</a>, <a class="el" href="libburner_8c_source.html#l00078">current_profile</a>, <a class="el" href="libburner_8c_source.html#l00079">current_profile_name</a>, <a class="el" href="libburn_8h_source.html#l00616">burn_progress::sector</a>, and <a class="el" href="libburn_8h_source.html#l00613">burn_progress::sectors</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00332"></a>00332 {
<a name="l00333"></a>00333     <span class="keyword">struct </span><a class="code" href="structburn__progress.html" title="Operation progress report.">burn_progress</a> p;
<a name="l00334"></a>00334     <span class="keywordtype">double</span> percent = 1.0;
<a name="l00335"></a>00335     <span class="keywordtype">int</span> ret, status, num_formats, format_flag= 0;
<a name="l00336"></a>00336     off_t size = 0;
<a name="l00337"></a>00337     <span class="keywordtype">unsigned</span> dummy;
<a name="l00338"></a>00338     <span class="keyword">enum</span> <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54" title="Possible status of the drive in regard to the disc in it.">burn_disc_status</a> disc_state;
<a name="l00339"></a>00339 
<a name="l00340"></a>00340     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x13) {
<a name="l00341"></a>00341         fprintf(stderr, <span class="stringliteral">&quot;IDLE: DVD-RW media is already formatted\n&quot;</span>);
<a name="l00342"></a>00342         <span class="keywordflow">return</span> 2;
<a name="l00343"></a>00343     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x41 || <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x43) {
<a name="l00344"></a>00344         disc_state = <a class="code" href="libburn_8h.html#ac009cc9dfe07c8c0b67f528a369fd511" title="Returns what kind of disc a drive is holding.">burn_disc_get_status</a>(drive);
<a name="l00345"></a>00345         <span class="keywordflow">if</span> (disc_state != <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54a59c757934ef338281512efce4ab6fd93" title="The drive holds a blank disc.">BURN_DISC_BLANK</a> &amp;&amp; <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x41) {
<a name="l00346"></a>00346             fprintf(stderr,
<a name="l00347"></a>00347                 <span class="stringliteral">&quot;FATAL: BD-R is not blank. Cannot format.\n&quot;</span>);
<a name="l00348"></a>00348             <span class="keywordflow">return</span> 0;
<a name="l00349"></a>00349         }
<a name="l00350"></a>00350         ret = <a class="code" href="libburn_8h.html#abe718b844984771afe7c38f44e7abbe6" title="Inquire the formatting status, the associated sizes and the number of available formats...">burn_disc_get_formats</a>(drive, &amp;status, &amp;size, &amp;dummy,
<a name="l00351"></a>00351                                 &amp;num_formats);
<a name="l00352"></a>00352         <span class="keywordflow">if</span> (ret &gt; 0 &amp;&amp; status != <a class="code" href="libburn_8h.html#a7b6978947a00d7f643003a1103b8a821" title="Possible formatting status values.">BURN_FORMAT_IS_UNFORMATTED</a>) {
<a name="l00353"></a>00353             fprintf(stderr,
<a name="l00354"></a>00354                 <span class="stringliteral">&quot;IDLE: BD media is already formatted\n&quot;</span>);
<a name="l00355"></a>00355             <span class="keywordflow">return</span> 2;
<a name="l00356"></a>00356         }
<a name="l00357"></a>00357         size = 0;           <span class="comment">/* does not really matter */</span>
<a name="l00358"></a>00358         format_flag = 3&lt;&lt;1; <span class="comment">/* format to default size, no quick */</span>
<a name="l00359"></a>00359     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x14) { <span class="comment">/* sequential DVD-RW */</span>
<a name="l00360"></a>00360         size = 128 * 1024 * 1024;
<a name="l00361"></a>00361         format_flag = 1; <span class="comment">/* write initial 128 MiB */</span>
<a name="l00362"></a>00362     } <span class="keywordflow">else</span> {
<a name="l00363"></a>00363         fprintf(stderr, <span class="stringliteral">&quot;FATAL: Can only format DVD-RW or BD\n&quot;</span>);
<a name="l00364"></a>00364         <span class="keywordflow">return</span> 0;
<a name="l00365"></a>00365     }
<a name="l00366"></a>00366 
<a name="l00367"></a>00367     printf(<span class="stringliteral">&quot;Beginning to format media.\n&quot;</span>);
<a name="l00368"></a>00368     <a class="code" href="libburn_8h.html#a1ac5250deb1dd13d7192f5e834fd5c4d" title="Format media for use with libburn.">burn_disc_format</a>(drive, size, format_flag);
<a name="l00369"></a>00369 
<a name="l00370"></a>00370     sleep(1);
<a name="l00371"></a>00371     <span class="keywordflow">while</span> (<a class="code" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d" title="Returns the progress and status of a drive.">burn_drive_get_status</a>(drive, &amp;p) != <a class="code" href="libburn_8h.html#a3cb9c75648e773f63911b0975f67802badcb522cf8ccf1349e3d69826c3e1757f" title="The drive is not in an operation.">BURN_DRIVE_IDLE</a>) {
<a name="l00372"></a>00372         <span class="keywordflow">if</span>(p.sectors&gt;0 &amp;&amp; p.sector&gt;=0) <span class="comment">/* display 1 to 99 percent */</span>
<a name="l00373"></a>00373             percent = 1.0 + ((double) p.sector+1.0)
<a name="l00374"></a>00374                      / ((double) p.sectors) * 98.0;
<a name="l00375"></a>00375         printf(<span class="stringliteral">&quot;Formatting  ( %.1f%% done )\n&quot;</span>, percent);
<a name="l00376"></a>00376         sleep(1);
<a name="l00377"></a>00377     }
<a name="l00378"></a>00378     <a class="code" href="libburn_8h.html#a1627c70c71ec5b6116f8d9d63d229285" title="Tells the MMC Profile identifier of the loaded media.">burn_disc_get_profile</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[0].drive, &amp;<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a>,
<a name="l00379"></a>00379                  <a class="code" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a>);
<a name="l00380"></a>00380     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x14 || <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x13)
<a name="l00381"></a>00381         printf(<span class="stringliteral">&quot;Media type now: %4.4xh  \&quot;%s\&quot;\n&quot;</span>,
<a name="l00382"></a>00382                  <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a>, <a class="code" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a>);
<a name="l00383"></a>00383     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> == 0x14) {
<a name="l00384"></a>00384         fprintf(stderr,
<a name="l00385"></a>00385           <span class="stringliteral">&quot;FATAL: Failed to change media profile to desired value\n&quot;</span>);
<a name="l00386"></a>00386         <span class="keywordflow">return</span> 0;
<a name="l00387"></a>00387     }
<a name="l00388"></a>00388     <span class="keywordflow">return</span> 1;
<a name="l00389"></a>00389 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="af9c2fc57ed6d8505b22d377daef4914b"></a><!-- doxytag: member="libburner.c::libburner_payload" ref="af9c2fc57ed6d8505b22d377daef4914b" args="(struct burn_drive *drive, char source_adr[][4096], int source_adr_count, int multi, int simulate_burn, int all_tracks_type)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_payload </td>
          <td>(</td>
          <td class="paramtype">struct burn_drive *&nbsp;</td>
          <td class="paramname"> <em>drive</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">char&nbsp;</td>
          <td class="paramname"> <em>source_adr</em>[][4096], </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>source_adr_count</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>multi</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>simulate_burn</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>all_tracks_type</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Brings preformatted track images (ISO 9660, audio, . </p>
<p>..) onto media. To make sure a data image is fully readable on any Linux machine, this function adds 300 kiB of padding to the (usualy single) track. Audio tracks get padded to complete their last sector. A fifo of 4 MB is installed between each track and its data source. Each of the 4 MB buffers gets allocated automatically as soon as a track begins to be processed and it gets freed as soon as the track is done. The fifos do not wait for buffer fill but writing starts immediately.</p>
<p>In case of external signals expect abort handling of an ongoing burn to last up to a minute. Wait the normal burning timespan before any kill -9.</p>
<p>For simplicity, this function allows memory leaks in case of failure. In apps which do not abort immediately, one should clean up better. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00407">407</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburn_8h_source.html#l00096">BURN_AUDIO</a>, <a class="el" href="libburn_8h.html#a77730a5108688fbee754fea7b56e048a">burn_disc_add_session()</a>, <a class="el" href="libburn_8h_source.html#l00214">BURN_DISC_APPENDABLE</a>, <a class="el" href="libburn_8h_source.html#l00204">BURN_DISC_BLANK</a>, <a class="el" href="libburn_8h.html#a9514679bfc2d3c3079bb06f0ddfc2216">burn_disc_create()</a>, <a class="el" href="libburn_8h_source.html#l00207">BURN_DISC_EMPTY</a>, <a class="el" href="libburn_8h.html#a7838224062ed72305f3c6b1055cb1a98">burn_disc_erasable()</a>, <a class="el" href="libburn_8h.html#aca06a415d81da71a3fd3aad31e83c698">burn_disc_free()</a>, <a class="el" href="libburn_8h_source.html#l00225">BURN_DISC_FULL</a>, <a class="el" href="libburn_8h.html#ac009cc9dfe07c8c0b67f528a369fd511">burn_disc_get_status()</a>, <a class="el" href="libburn_8h.html#a75d3d59e9c3cd7cd42c9735bee83bd91">burn_disc_write()</a>, <a class="el" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d">burn_drive_get_status()</a>, <a class="el" href="libburn_8h_source.html#l00255">BURN_DRIVE_IDLE</a>, <a class="el" href="libburn_8h.html#a62aa53e04ff9fb848178ab85d38a9c5a">burn_drive_set_speed()</a>, <a class="el" href="libburn_8h_source.html#l00259">BURN_DRIVE_SPAWNING</a>, <a class="el" href="libburn_8h.html#a2e1504f4c949b13cea988e31af9c150a">burn_fd_source_new()</a>, <a class="el" href="libburn_8h.html#af655df46b73a4d774cc1d27b0c57677d">burn_fifo_inquire_status()</a>, <a class="el" href="libburn_8h.html#a2d7a2faac8565ddd40d9e6ddae0bd922">burn_fifo_source_new()</a>, <a class="el" href="libburn_8h_source.html#l00075">BURN_MODE1</a>, <a class="el" href="libburn_8h_source.html#l00059">BURN_POS_END</a>, <a class="el" href="libburn_8h_source.html#l01376">BURN_REASONS_LEN</a>, <a class="el" href="libburn_8h.html#a2062793258361e9e84e7ddbf5f9ab06a">burn_session_add_track()</a>, <a class="el" href="libburn_8h.html#a2dceb26e334833c240391cacfde555f7">burn_session_create()</a>, <a class="el" href="libburn_8h.html#a21765aec4a5b1a9c21c027f855f9c2a0">burn_session_free()</a>, <a class="el" href="libburn_8h.html#a1a03f8b3088b8ce6305e7a48c3e034eb">burn_source_free()</a>, <a class="el" href="libburn_8h_source.html#l00243">BURN_SOURCE_OK</a>, <a class="el" href="libburn_8h.html#aab87a2670415403982e499002fff0ca8">burn_track_create()</a>, <a class="el" href="libburn_8h.html#aef2fd880f00065082691a848edcaf01e">burn_track_define_data()</a>, <a class="el" href="libburn_8h.html#a105c516de4f9242d91f7e92d0b399110">burn_track_free()</a>, <a class="el" href="libburn_8h.html#a27400c91868946c04b013c2cc2ac632a">burn_track_set_source()</a>, <a class="el" href="libburn_8h_source.html#l00147">BURN_WRITE_NONE</a>, <a class="el" href="libburn_8h.html#a88a9d0adaf11e19cb4ed8b08f7740b5b">burn_write_opts_auto_write_type()</a>, <a class="el" href="libburn_8h.html#a1336283a8e59fe7ac187243350e21866">burn_write_opts_free()</a>, <a class="el" href="libburn_8h.html#ad62ba8f5344c36e2faa9aa6208751e0a">burn_write_opts_new()</a>, <a class="el" href="libburn_8h.html#ad04dc50d1223d78a8e8c3134df96fd82">burn_write_opts_set_multi()</a>, <a class="el" href="libburn_8h.html#a8e4ed29facd80f19c866b3686dea125f">burn_write_opts_set_perform_opc()</a>, <a class="el" href="libburn_8h.html#a05f68d91d1074a103fa8e17bb664b6d8">burn_write_opts_set_simulate()</a>, <a class="el" href="libburn_8h.html#a3fdc2e3cc51bec2072ab91b99d4e52d9">burn_write_opts_set_underrun_proof()</a>, <a class="el" href="libburner_8c_source.html#l00078">current_profile</a>, <a class="el" href="libburn_8h_source.html#l00616">burn_progress::sector</a>, <a class="el" href="libburn_8h_source.html#l00613">burn_progress::sectors</a>, and <a class="el" href="libburn_8h_source.html#l00604">burn_progress::track</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00410"></a>00410 {
<a name="l00411"></a>00411     <span class="keyword">struct </span><a class="code" href="structburn__source.html" title="Data source interface for tracks.">burn_source</a> *data_src, *fifo_src[99];
<a name="l00412"></a>00412     <span class="keyword">struct </span>burn_disc *target_disc;
<a name="l00413"></a>00413     <span class="keyword">struct </span>burn_session *session;
<a name="l00414"></a>00414     <span class="keyword">struct </span>burn_write_opts *burn_options;
<a name="l00415"></a>00415     <span class="keyword">enum</span> <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54" title="Possible status of the drive in regard to the disc in it.">burn_disc_status</a> disc_state;
<a name="l00416"></a>00416     <span class="keyword">struct </span>burn_track *track, *tracklist[99];
<a name="l00417"></a>00417     <span class="keyword">struct </span><a class="code" href="structburn__progress.html" title="Operation progress report.">burn_progress</a> progress;
<a name="l00418"></a>00418     time_t start_time;
<a name="l00419"></a>00419     <span class="keywordtype">int</span> last_sector = 0, padding = 0, trackno, unpredicted_size = 0, fd;
<a name="l00420"></a>00420     <span class="keywordtype">int</span> fifo_chunksize = 2352, fifo_chunks = 1783; <span class="comment">/* ~ 4 MB fifo */</span>
<a name="l00421"></a>00421     off_t fixed_size;
<a name="l00422"></a>00422     <span class="keywordtype">char</span> *adr, reasons[<a class="code" href="libburn_8h.html#a109ecdcd00fd30904a76c58040df9b79" title="The length of a rejection reasons string for burn_precheck_write() and burn_write_opts_auto_write_ty...">BURN_REASONS_LEN</a>];
<a name="l00423"></a>00423     <span class="keyword">struct </span>stat stbuf;
<a name="l00424"></a>00424 
<a name="l00425"></a>00425     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a> != <a class="code" href="libburn_8h.html#af52cf0d05e7e207ef4a06c9caad94d9f" title="Track mode - audio 2352 bytes per sector.">BURN_AUDIO</a>) {
<a name="l00426"></a>00426         <a class="code" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a> = <a class="code" href="libburn_8h.html#af2e861349cb91c0af3a482225e3326ae" title="Track mode - mode 1 data 2048 bytes user data, and all the LEC money can buy.">BURN_MODE1</a>;
<a name="l00427"></a>00427         <span class="comment">/* a padding of 300 kiB helps to avoid the read-ahead bug */</span>
<a name="l00428"></a>00428         padding = 300*1024;
<a name="l00429"></a>00429         fifo_chunksize = 2048;
<a name="l00430"></a>00430         fifo_chunks = 2048; <span class="comment">/* 4 MB fifo */</span>
<a name="l00431"></a>00431     }
<a name="l00432"></a>00432 
<a name="l00433"></a>00433     target_disc = <a class="code" href="libburn_8h.html#a9514679bfc2d3c3079bb06f0ddfc2216" title="Create a new disc.">burn_disc_create</a>();
<a name="l00434"></a>00434     session = <a class="code" href="libburn_8h.html#a2dceb26e334833c240391cacfde555f7" title="Create a new session.">burn_session_create</a>();
<a name="l00435"></a>00435     <a class="code" href="libburn_8h.html#a77730a5108688fbee754fea7b56e048a" title="Add a session to a disc at a specific position, increasing the sessions&amp;#39;s reference...">burn_disc_add_session</a>(target_disc, session, <a class="code" href="libburn_8h.html#a57aa6e45b0236acb5fbaa9f44280f6dc">BURN_POS_END</a>);
<a name="l00436"></a>00436 
<a name="l00437"></a>00437     <span class="keywordflow">for</span> (trackno = 0 ; trackno &lt; <a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a>; trackno++) {
<a name="l00438"></a>00438       tracklist[trackno] = track = <a class="code" href="libburn_8h.html#aab87a2670415403982e499002fff0ca8" title="Create a track (for TAO recording, or to put in a session).">burn_track_create</a>();
<a name="l00439"></a>00439       <a class="code" href="libburn_8h.html#aef2fd880f00065082691a848edcaf01e" title="Define the data in a track.">burn_track_define_data</a>(track, 0, padding, 1, <a class="code" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a>);
<a name="l00440"></a>00440 
<a name="l00441"></a>00441       <span class="comment">/* Open file descriptor to source of track data */</span>
<a name="l00442"></a>00442       adr = <a class="code" href="libburner_8c.html#a20401aa73b1b1c04c3faddfd1647f302">source_adr</a>[trackno];
<a name="l00443"></a>00443       fixed_size = 0;
<a name="l00444"></a>00444       <span class="keywordflow">if</span> (adr[0] == <span class="charliteral">&apos;-&apos;</span> &amp;&amp; adr[1] == 0) {
<a name="l00445"></a>00445         fd = 0;
<a name="l00446"></a>00446       } <span class="keywordflow">else</span> {
<a name="l00447"></a>00447         fd = open(adr, O_RDONLY);
<a name="l00448"></a>00448         <span class="keywordflow">if</span> (fd&gt;=0)
<a name="l00449"></a>00449             <span class="keywordflow">if</span> (fstat(fd,&amp;stbuf)!=-1)
<a name="l00450"></a>00450                 <span class="keywordflow">if</span>((stbuf.st_mode&amp;S_IFMT)==S_IFREG)
<a name="l00451"></a>00451                     fixed_size = stbuf.st_size;
<a name="l00452"></a>00452       }
<a name="l00453"></a>00453       <span class="keywordflow">if</span> (fixed_size==0)
<a name="l00454"></a>00454         unpredicted_size = 1;
<a name="l00455"></a>00455 
<a name="l00456"></a>00456       <span class="comment">/* Convert this filedescriptor into a burn_source object */</span>
<a name="l00457"></a>00457       data_src = NULL;
<a name="l00458"></a>00458       <span class="keywordflow">if</span> (fd&gt;=0)
<a name="l00459"></a>00459         data_src = <a class="code" href="libburn_8h.html#a2e1504f4c949b13cea988e31af9c150a" title="Creates a data source for an image file (a track) from an open readable filedescriptor...">burn_fd_source_new</a>(fd, -1, fixed_size);
<a name="l00460"></a>00460       <span class="keywordflow">if</span> (data_src == NULL) {
<a name="l00461"></a>00461         fprintf(stderr,
<a name="l00462"></a>00462                <span class="stringliteral">&quot;FATAL: Could not open data source &apos;%s&apos;.\n&quot;</span>,adr);
<a name="l00463"></a>00463         <span class="keywordflow">if</span>(errno!=0)
<a name="l00464"></a>00464             fprintf(stderr,<span class="stringliteral">&quot;(Most recent system error: %s )\n&quot;</span>,
<a name="l00465"></a>00465                 strerror(errno));
<a name="l00466"></a>00466         <span class="keywordflow">return</span> 0;
<a name="l00467"></a>00467       }
<a name="l00468"></a>00468       <span class="comment">/* Install a fifo object on top of that data source object */</span>
<a name="l00469"></a>00469       fifo_src[trackno] = <a class="code" href="libburn_8h.html#a2d7a2faac8565ddd40d9e6ddae0bd922" title="Creates a fifo which acts as proxy for an already existing data source.">burn_fifo_source_new</a>(data_src,
<a name="l00470"></a>00470                     fifo_chunksize, fifo_chunks, 0);
<a name="l00471"></a>00471       <span class="keywordflow">if</span> (fifo_src[trackno] == NULL) {
<a name="l00472"></a>00472         fprintf(stderr,
<a name="l00473"></a>00473             <span class="stringliteral">&quot;FATAL: Could not create fifo object of 4 MB\n&quot;</span>);
<a name="l00474"></a>00474         <span class="keywordflow">return</span> 0;
<a name="l00475"></a>00475       }
<a name="l00476"></a>00476 
<a name="l00477"></a>00477       <span class="comment">/* Use the fifo object as data source for the track */</span>
<a name="l00478"></a>00478       <span class="keywordflow">if</span> (<a class="code" href="libburn_8h.html#a27400c91868946c04b013c2cc2ac632a" title="Set the track&amp;#39;s data source.">burn_track_set_source</a>(track, fifo_src[trackno])
<a name="l00479"></a>00479                              != <a class="code" href="libburn_8h.html#aa5ddf1fe21e47ff4d4a44262c1d7da9ba936b5414e25492f45a3f240941f3d9a1" title="The source is ok.">BURN_SOURCE_OK</a>) {
<a name="l00480"></a>00480         fprintf(stderr,
<a name="l00481"></a>00481                <span class="stringliteral">&quot;FATAL: Cannot attach source object to track object\n&quot;</span>);
<a name="l00482"></a>00482         <span class="keywordflow">return</span> 0;
<a name="l00483"></a>00483       }
<a name="l00484"></a>00484 
<a name="l00485"></a>00485       <a class="code" href="libburn_8h.html#a2062793258361e9e84e7ddbf5f9ab06a" title="Add a track to a session at specified position.">burn_session_add_track</a>(session, track, <a class="code" href="libburn_8h.html#a57aa6e45b0236acb5fbaa9f44280f6dc">BURN_POS_END</a>);
<a name="l00486"></a>00486       printf(<span class="stringliteral">&quot;Track %d : source is &apos;%s&apos;\n&quot;</span>, trackno+1, adr);
<a name="l00487"></a>00487 
<a name="l00488"></a>00488       <span class="comment">/* Give up local reference to the data burn_source object */</span>
<a name="l00489"></a>00489       <a class="code" href="libburn_8h.html#a1a03f8b3088b8ce6305e7a48c3e034eb" title="Free a burn_source (decrease its refcount and maybe free it).">burn_source_free</a>(data_src);
<a name="l00490"></a>00490       
<a name="l00491"></a>00491     } <span class="comment">/* trackno loop end */</span>
<a name="l00492"></a>00492 
<a name="l00493"></a>00493     <span class="comment">/* Evaluate drive and media */</span>
<a name="l00494"></a>00494     disc_state = <a class="code" href="libburn_8h.html#ac009cc9dfe07c8c0b67f528a369fd511" title="Returns what kind of disc a drive is holding.">burn_disc_get_status</a>(drive);
<a name="l00495"></a>00495     <span class="keywordflow">if</span> (disc_state != <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54a59c757934ef338281512efce4ab6fd93" title="The drive holds a blank disc.">BURN_DISC_BLANK</a> &amp;&amp;
<a name="l00496"></a>00496         disc_state != <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54acda6fac8462fa9affb4bff80daa2ab3f" title="There is an incomplete disc in the drive.">BURN_DISC_APPENDABLE</a>) {
<a name="l00497"></a>00497         <span class="keywordflow">if</span> (disc_state == <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54ae0ea0a584e319ee775062c88975c93cd" title="There is a disc with data on it in the drive.">BURN_DISC_FULL</a>) {
<a name="l00498"></a>00498             fprintf(stderr, <span class="stringliteral">&quot;FATAL: Closed media with data detected. Need blank or appendable media.\n&quot;</span>);
<a name="l00499"></a>00499             <span class="keywordflow">if</span> (<a class="code" href="libburn_8h.html#a7838224062ed72305f3c6b1055cb1a98" title="Tells whether a disc can be erased or not.">burn_disc_erasable</a>(drive))
<a name="l00500"></a>00500                 fprintf(stderr, <span class="stringliteral">&quot;HINT: Try --blank_fast\n\n&quot;</span>);
<a name="l00501"></a>00501         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (disc_state == <a class="code" href="libburn_8h.html#ad6002e7587373e7e9a9efbd22c1e6c54a23eef5011f3aa95ce1858a2930c22c69" title="There is no disc at all in the drive.">BURN_DISC_EMPTY</a>) 
<a name="l00502"></a>00502             fprintf(stderr,<span class="stringliteral">&quot;FATAL: No media detected in drive\n&quot;</span>);
<a name="l00503"></a>00503         <span class="keywordflow">else</span>
<a name="l00504"></a>00504             fprintf(stderr,
<a name="l00505"></a>00505              <span class="stringliteral">&quot;FATAL: Cannot recognize state of drive and media\n&quot;</span>);
<a name="l00506"></a>00506         <span class="keywordflow">return</span> 0;
<a name="l00507"></a>00507     }
<a name="l00508"></a>00508 
<a name="l00509"></a>00509     burn_options = <a class="code" href="libburn_8h.html#ad62ba8f5344c36e2faa9aa6208751e0a" title="Creates a write_opts struct for burning to the specified drive.">burn_write_opts_new</a>(drive);
<a name="l00510"></a>00510     <a class="code" href="libburn_8h.html#a8e4ed29facd80f19c866b3686dea125f" title="Sets whether to use opc or not with the write_opts struct.">burn_write_opts_set_perform_opc</a>(burn_options, 0);
<a name="l00511"></a>00511     <a class="code" href="libburn_8h.html#ad04dc50d1223d78a8e8c3134df96fd82" title="Sets the multi flag which eventually marks the emerging session as not being the...">burn_write_opts_set_multi</a>(burn_options, !!multi);
<a name="l00512"></a>00512     <span class="keywordflow">if</span>(<a class="code" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a>)
<a name="l00513"></a>00513         printf(<span class="stringliteral">&quot;\n*** Will TRY to SIMULATE burning ***\n\n&quot;</span>);
<a name="l00514"></a>00514     <a class="code" href="libburn_8h.html#a05f68d91d1074a103fa8e17bb664b6d8" title="Sets the simulate value for the write_opts struct .">burn_write_opts_set_simulate</a>(burn_options, <a class="code" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a>);
<a name="l00515"></a>00515     <a class="code" href="libburn_8h.html#a62aa53e04ff9fb848178ab85d38a9c5a" title="Sets drive read and write speed Note: &amp;quot;k&amp;quot; is 1000, not 1024.">burn_drive_set_speed</a>(drive, 0, 0);
<a name="l00516"></a>00516     <a class="code" href="libburn_8h.html#a3fdc2e3cc51bec2072ab91b99d4e52d9" title="Controls buffer underrun prevention.">burn_write_opts_set_underrun_proof</a>(burn_options, 1);
<a name="l00517"></a>00517     <span class="keywordflow">if</span> (<a class="code" href="libburn_8h.html#a88a9d0adaf11e19cb4ed8b08f7740b5b" title="As an alternative to burn_write_opts_set_write_type() this function tries to find...">burn_write_opts_auto_write_type</a>(burn_options, target_disc,
<a name="l00518"></a>00518                     reasons, 0) == <a class="code" href="libburn_8h.html#a98506c0d72c878ea6cbecc4004451d9baf43fb685b48fdc83337465457eec54fd" title="In replies this indicates that not any writing will work.">BURN_WRITE_NONE</a>) {
<a name="l00519"></a>00519         fprintf(stderr, <span class="stringliteral">&quot;FATAL: Failed to find a suitable write mode with this media.\n&quot;</span>);
<a name="l00520"></a>00520         fprintf(stderr, <span class="stringliteral">&quot;Reasons given:\n%s\n&quot;</span>, reasons);
<a name="l00521"></a>00521         <span class="keywordflow">return</span> 0;
<a name="l00522"></a>00522     }
<a name="l00523"></a>00523 
<a name="l00524"></a>00524     printf(<span class="stringliteral">&quot;Burning starts. With e.g. 4x media expect up to a minute of zero progress.\n&quot;</span>);
<a name="l00525"></a>00525     start_time = time(0);
<a name="l00526"></a>00526     <a class="code" href="libburn_8h.html#a75d3d59e9c3cd7cd42c9735bee83bd91" title="Write a disc in the drive.">burn_disc_write</a>(burn_options, target_disc);
<a name="l00527"></a>00527 
<a name="l00528"></a>00528     <a class="code" href="libburn_8h.html#a1336283a8e59fe7ac187243350e21866" title="Frees a write_opts struct created with burn_write_opts_new.">burn_write_opts_free</a>(burn_options);
<a name="l00529"></a>00529     <span class="keywordflow">while</span> (<a class="code" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d" title="Returns the progress and status of a drive.">burn_drive_get_status</a>(drive, NULL) == <a class="code" href="libburn_8h.html#a3cb9c75648e773f63911b0975f67802ba9c16cf7335531f54df68a0b280c75898" title="The library is spawning the processes to handle a pending operation (A read/write/etc...">BURN_DRIVE_SPAWNING</a>)
<a name="l00530"></a>00530         usleep(100002);
<a name="l00531"></a>00531     <span class="keywordflow">while</span> (<a class="code" href="libburn_8h.html#a992777abdf1f13f1e2c45271e43e9a3d" title="Returns the progress and status of a drive.">burn_drive_get_status</a>(drive, &amp;progress) != <a class="code" href="libburn_8h.html#a3cb9c75648e773f63911b0975f67802badcb522cf8ccf1349e3d69826c3e1757f" title="The drive is not in an operation.">BURN_DRIVE_IDLE</a>) {
<a name="l00532"></a>00532         <span class="keywordflow">if</span> (progress.sectors &lt;= 0 ||
<a name="l00533"></a>00533             (progress.sector &gt;= progress.sectors - 1 &amp;&amp;
<a name="l00534"></a>00534                  !unpredicted_size) ||
<a name="l00535"></a>00535             (unpredicted_size &amp;&amp; progress.sector == last_sector))
<a name="l00536"></a>00536             printf(
<a name="l00537"></a>00537                  <span class="stringliteral">&quot;Thank you for being patient since %d seconds.&quot;</span>,
<a name="l00538"></a>00538                  (<span class="keywordtype">int</span>) (time(0) - start_time));
<a name="l00539"></a>00539         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(unpredicted_size)
<a name="l00540"></a>00540             printf(<span class="stringliteral">&quot;Track %d : sector %d&quot;</span>, progress.track+1,
<a name="l00541"></a>00541                 progress.sector);
<a name="l00542"></a>00542         <span class="keywordflow">else</span>
<a name="l00543"></a>00543             printf(<span class="stringliteral">&quot;Track %d : sector %d of %d&quot;</span>,progress.track+1,
<a name="l00544"></a>00544                 progress.sector, progress.sectors);
<a name="l00545"></a>00545         last_sector = progress.sector;
<a name="l00546"></a>00546         <span class="keywordflow">if</span> (progress.track &gt;= 0 &amp;&amp; progress.track &lt; source_adr_count) {
<a name="l00547"></a>00547             <span class="keywordtype">int</span> size, free_bytes, ret;
<a name="l00548"></a>00548             <span class="keywordtype">char</span> *status_text;
<a name="l00549"></a>00549     
<a name="l00550"></a>00550             ret = <a class="code" href="libburn_8h.html#af655df46b73a4d774cc1d27b0c57677d" title="Inquires state and fill parameters of a fifo burn_source which was created by burn_fifo_source_new()...">burn_fifo_inquire_status</a>(
<a name="l00551"></a>00551                 fifo_src[progress.track], &amp;size, &amp;free_bytes,
<a name="l00552"></a>00552                 &amp;status_text);
<a name="l00553"></a>00553             <span class="keywordflow">if</span> (ret &gt;= 0 ) 
<a name="l00554"></a>00554                 printf(<span class="stringliteral">&quot;  [fifo %s, %2d%% fill]&quot;</span>, status_text,
<a name="l00555"></a>00555                     (<span class="keywordtype">int</span>) (100.0 - 100.0 *
<a name="l00556"></a>00556                         ((<span class="keywordtype">double</span>) free_bytes) /
<a name="l00557"></a>00557                         (<span class="keywordtype">double</span>) size));
<a name="l00558"></a>00558         } 
<a name="l00559"></a>00559         printf(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00560"></a>00560         sleep(1);
<a name="l00561"></a>00561     }
<a name="l00562"></a>00562     printf(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00563"></a>00563 
<a name="l00564"></a>00564     <span class="keywordflow">for</span> (trackno = 0 ; trackno &lt; source_adr_count; trackno++) {
<a name="l00565"></a>00565         <a class="code" href="libburn_8h.html#a1a03f8b3088b8ce6305e7a48c3e034eb" title="Free a burn_source (decrease its refcount and maybe free it).">burn_source_free</a>(fifo_src[trackno]);
<a name="l00566"></a>00566         <a class="code" href="libburn_8h.html#a105c516de4f9242d91f7e92d0b399110" title="Free a track.">burn_track_free</a>(tracklist[trackno]);
<a name="l00567"></a>00567     }
<a name="l00568"></a>00568     <a class="code" href="libburn_8h.html#a21765aec4a5b1a9c21c027f855f9c2a0" title="Free a session (and decrease reference count on all tracks inside).">burn_session_free</a>(session);
<a name="l00569"></a>00569     <a class="code" href="libburn_8h.html#aca06a415d81da71a3fd3aad31e83c698" title="Delete disc and decrease the reference count on all its sessions.">burn_disc_free</a>(target_disc);
<a name="l00570"></a>00570     <span class="keywordflow">if</span> (multi &amp;&amp; <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> != 0x1a &amp;&amp; <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> != 0x13 &amp;&amp;
<a name="l00571"></a>00571         <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> != 0x12 &amp;&amp; <a class="code" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043" title="A number and a text describing the type of media in aquired drive.">current_profile</a> != 0x43) 
<a name="l00572"></a>00572             <span class="comment">/* not with DVD+RW, formatted DVD-RW, DVD-RAM, BD-RE */</span>
<a name="l00573"></a>00573         printf(<span class="stringliteral">&quot;NOTE: Media left appendable.\n&quot;</span>);
<a name="l00574"></a>00574     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a>)
<a name="l00575"></a>00575         printf(<span class="stringliteral">&quot;\n*** Did TRY to SIMULATE burning ***\n\n&quot;</span>);
<a name="l00576"></a>00576     <span class="keywordflow">return</span> 1;
<a name="l00577"></a>00577 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="a67980a9cee509cf714f67aa96a47c75d"></a><!-- doxytag: member="libburner.c::libburner_setup" ref="a67980a9cee509cf714f67aa96a47c75d" args="(int argc, char **argv)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int libburner_setup </td>
          <td>(</td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>argc</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">char **&nbsp;</td>
          <td class="paramname"> <em>argv</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Converts command line arguments into above setup parameters. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00593">593</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburner_8c_source.html#l00588">all_tracks_type</a>, <a class="el" href="libburn_8h_source.html#l00096">BURN_AUDIO</a>, <a class="el" href="libburn_8h_source.html#l00946">BURN_DRIVE_ADR_LEN</a>, <a class="el" href="libburner_8c_source.html#l00583">do_blank</a>, <a class="el" href="libburner_8c_source.html#l00586">do_multi</a>, <a class="el" href="libburner_8c_source.html#l00581">drive_adr</a>, <a class="el" href="libburner_8c_source.html#l00582">driveno</a>, <a class="el" href="libburner_8c_source.html#l00587">simulate_burn</a>, <a class="el" href="libburner_8c_source.html#l00584">source_adr</a>, and <a class="el" href="libburner_8c_source.html#l00585">source_adr_count</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00594"></a>00594 {
<a name="l00595"></a>00595     <span class="keywordtype">int</span> i, insuffient_parameters = 0, print_help = 0;
<a name="l00596"></a>00596 
<a name="l00597"></a>00597     <span class="keywordflow">for</span> (i = 1; i &lt; argc; ++i) {
<a name="l00598"></a>00598         <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--audio&quot;</span>)) {
<a name="l00599"></a>00599             <a class="code" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a> = <a class="code" href="libburn_8h.html#af52cf0d05e7e207ef4a06c9caad94d9f" title="Track mode - audio 2352 bytes per sector.">BURN_AUDIO</a>;
<a name="l00600"></a>00600 
<a name="l00601"></a>00601         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--blank_fast&quot;</span>)) {
<a name="l00602"></a>00602             <a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> = 1;
<a name="l00603"></a>00603 
<a name="l00604"></a>00604         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--blank_full&quot;</span>)) {
<a name="l00605"></a>00605             <a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> = 2;
<a name="l00606"></a>00606 
<a name="l00607"></a>00607         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--burn_for_real&quot;</span>)) {
<a name="l00608"></a>00608             <a class="code" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a> = 0;
<a name="l00609"></a>00609 
<a name="l00610"></a>00610         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--drive&quot;</span>)) {
<a name="l00611"></a>00611             ++i;
<a name="l00612"></a>00612             <span class="keywordflow">if</span> (i &gt;= argc) {
<a name="l00613"></a>00613                 fprintf(stderr,<span class="stringliteral">&quot;--drive requires an argument\n&quot;</span>);
<a name="l00614"></a>00614                 <span class="keywordflow">return</span> 1;
<a name="l00615"></a>00615             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strcmp(argv[i], <span class="stringliteral">&quot;-&quot;</span>) == 0) {
<a name="l00616"></a>00616                 <a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>[0] = 0;
<a name="l00617"></a>00617                 <a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> = -1;
<a name="l00618"></a>00618             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isdigit(argv[i][0])) {
<a name="l00619"></a>00619                 <a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>[0] = 0;
<a name="l00620"></a>00620                 <a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> = atoi(argv[i]);
<a name="l00621"></a>00621             } <span class="keywordflow">else</span> {
<a name="l00622"></a>00622                 <span class="keywordflow">if</span>(strlen(argv[i]) &gt;= <a class="code" href="libburn_8h.html#a489ca2111726a034324275aca4ed069c" title="Maximum length+1 to expect with a persistent drive address string.">BURN_DRIVE_ADR_LEN</a>) {
<a name="l00623"></a>00623                     fprintf(stderr,<span class="stringliteral">&quot;--drive address too long (max. %d)\n&quot;</span>,
<a name="l00624"></a>00624                             <a class="code" href="libburn_8h.html#a489ca2111726a034324275aca4ed069c" title="Maximum length+1 to expect with a persistent drive address string.">BURN_DRIVE_ADR_LEN</a>-1);
<a name="l00625"></a>00625                     <span class="keywordflow">return</span> 2;
<a name="l00626"></a>00626                 }
<a name="l00627"></a>00627                 strcpy(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>, argv[i]);
<a name="l00628"></a>00628             }
<a name="l00629"></a>00629         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!strcmp(argv[i], <span class="stringliteral">&quot;--format_overwrite&quot;</span>)) ||
<a name="l00630"></a>00630            (!strcmp(argv[i], <span class="stringliteral">&quot;--format&quot;</span>))) {
<a name="l00631"></a>00631             <a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> = 101;
<a name="l00632"></a>00632 
<a name="l00633"></a>00633         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--multi&quot;</span>)) {
<a name="l00634"></a>00634         <a class="code" href="libburner_8c.html#a8e824cc51e6e6cfc91ac1df7830a70ed">do_multi</a> = 1;
<a name="l00635"></a>00635 
<a name="l00636"></a>00636     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--stdin_size&quot;</span>)) { <span class="comment">/* obsoleted */</span>
<a name="l00637"></a>00637         i++;
<a name="l00638"></a>00638 
<a name="l00639"></a>00639         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--try_to_simulate&quot;</span>)) {
<a name="l00640"></a>00640             <a class="code" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a> = 1;
<a name="l00641"></a>00641 
<a name="l00642"></a>00642         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[i], <span class="stringliteral">&quot;--help&quot;</span>)) {
<a name="l00643"></a>00643             print_help = 1;
<a name="l00644"></a>00644 
<a name="l00645"></a>00645         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strncmp(argv[i], <span class="stringliteral">&quot;--&quot;</span>,2)) {
<a name="l00646"></a>00646             fprintf(stderr, <span class="stringliteral">&quot;Unidentified option: %s\n&quot;</span>, argv[i]);
<a name="l00647"></a>00647             <span class="keywordflow">return</span> 7;
<a name="l00648"></a>00648         } <span class="keywordflow">else</span> {
<a name="l00649"></a>00649             <span class="keywordflow">if</span>(strlen(argv[i]) &gt;= 4096) {
<a name="l00650"></a>00650                 fprintf(stderr, <span class="stringliteral">&quot;Source address too long (max. %d)\n&quot;</span>, 4096-1);
<a name="l00651"></a>00651                 <span class="keywordflow">return</span> 5;
<a name="l00652"></a>00652             }
<a name="l00653"></a>00653             <span class="keywordflow">if</span>(<a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a> &gt;= 99) {
<a name="l00654"></a>00654                 fprintf(stderr, <span class="stringliteral">&quot;Too many tracks (max. 99)\n&quot;</span>);
<a name="l00655"></a>00655                 <span class="keywordflow">return</span> 6;
<a name="l00656"></a>00656             }
<a name="l00657"></a>00657             strcpy(<a class="code" href="libburner_8c.html#a20401aa73b1b1c04c3faddfd1647f302">source_adr</a>[<a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a>], argv[i]);
<a name="l00658"></a>00658             <a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a>++;
<a name="l00659"></a>00659         }
<a name="l00660"></a>00660     }
<a name="l00661"></a>00661     insuffient_parameters = 1;
<a name="l00662"></a>00662     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> &lt; 0)
<a name="l00663"></a>00663         insuffient_parameters = 0;
<a name="l00664"></a>00664     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a> &gt; 0)
<a name="l00665"></a>00665         insuffient_parameters = 0; 
<a name="l00666"></a>00666     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a>)
<a name="l00667"></a>00667         insuffient_parameters = 0;
<a name="l00668"></a>00668     <span class="keywordflow">if</span> (print_help || insuffient_parameters ) {
<a name="l00669"></a>00669         printf(<span class="stringliteral">&quot;Usage: %s\n&quot;</span>, argv[0]);
<a name="l00670"></a>00670         printf(<span class="stringliteral">&quot;       [--drive &lt;address&gt;|&lt;driveno&gt;|\&quot;-\&quot;]  [--audio]\n&quot;</span>);
<a name="l00671"></a>00671         printf(<span class="stringliteral">&quot;       [--blank_fast|--blank_full|--format]  [--try_to_simulate]\n&quot;</span>);
<a name="l00672"></a>00672         printf(<span class="stringliteral">&quot;       [--multi]  [&lt;one or more imagefiles&gt;|\&quot;-\&quot;]\n&quot;</span>);
<a name="l00673"></a>00673         printf(<span class="stringliteral">&quot;Examples\n&quot;</span>);
<a name="l00674"></a>00674         printf(<span class="stringliteral">&quot;A bus scan (needs rw-permissions to see a drive):\n&quot;</span>);
<a name="l00675"></a>00675         printf(<span class="stringliteral">&quot;  %s --drive -\n&quot;</span>,argv[0]);
<a name="l00676"></a>00676         printf(<span class="stringliteral">&quot;Burn a file to drive chosen by number, leave appendable:\n&quot;</span>);
<a name="l00677"></a>00677         printf(<span class="stringliteral">&quot;  %s --drive 0 --multi my_image_file\n&quot;</span>, argv[0]);
<a name="l00678"></a>00678         printf(<span class="stringliteral">&quot;Burn a file to drive chosen by persistent address, close:\n&quot;</span>);
<a name="l00679"></a>00679         printf(<span class="stringliteral">&quot;  %s --drive /dev/hdc my_image_file\n&quot;</span>, argv[0]);
<a name="l00680"></a>00680         printf(<span class="stringliteral">&quot;Blank a used CD-RW (is combinable with burning in one run):\n&quot;</span>);
<a name="l00681"></a>00681         printf(<span class="stringliteral">&quot;  %s --drive /dev/hdc --blank_fast\n&quot;</span>,argv[0]);
<a name="l00682"></a>00682         printf(<span class="stringliteral">&quot;Blank a used DVD-RW (is combinable with burning in one run):\n&quot;</span>);
<a name="l00683"></a>00683         printf(<span class="stringliteral">&quot;  %s --drive /dev/hdc --blank_full\n&quot;</span>,argv[0]);
<a name="l00684"></a>00684         printf(<span class="stringliteral">&quot;Format a DVD-RW, BD-RE or BD-R:\n&quot;</span>);
<a name="l00685"></a>00685         printf(<span class="stringliteral">&quot;  %s --drive /dev/hdc --format\n&quot;</span>, argv[0]);
<a name="l00686"></a>00686         printf(<span class="stringliteral">&quot;Burn two audio tracks (to CD only):\n&quot;</span>);
<a name="l00687"></a>00687         printf(<span class="stringliteral">&quot;  lame --decode -t /path/to/track1.mp3 track1.cd\n&quot;</span>);
<a name="l00688"></a>00688         printf(<span class="stringliteral">&quot;  test/dewav /path/to/track2.wav -o track2.cd\n&quot;</span>);
<a name="l00689"></a>00689         printf(<span class="stringliteral">&quot;  %s --drive /dev/hdc --audio track1.cd track2.cd\n&quot;</span>, argv[0]);
<a name="l00690"></a>00690         printf(<span class="stringliteral">&quot;Burn a compressed afio archive on-the-fly:\n&quot;</span>);
<a name="l00691"></a>00691         printf(<span class="stringliteral">&quot;  ( cd my_directory ; find . -print | afio -oZ - ) | \\\n&quot;</span>);
<a name="l00692"></a>00692         printf(<span class="stringliteral">&quot;  %s --drive /dev/hdc -\n&quot;</span>, argv[0]);
<a name="l00693"></a>00693         printf(<span class="stringliteral">&quot;To be read from *not mounted* media via: afio -tvZ /dev/hdc\n&quot;</span>);
<a name="l00694"></a>00694         <span class="keywordflow">if</span> (insuffient_parameters)
<a name="l00695"></a>00695             <span class="keywordflow">return</span> 6;
<a name="l00696"></a>00696     }
<a name="l00697"></a>00697     <span class="keywordflow">return</span> 0;
<a name="l00698"></a>00698 }
</pre></div></p>

</div>
</div>
<a class="anchor" id="a3c04138a5bfe5d72780bb7e82a18e627"></a><!-- doxytag: member="libburner.c::main" ref="a3c04138a5bfe5d72780bb7e82a18e627" args="(int argc, char **argv)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int main </td>
          <td>(</td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>argc</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">char **&nbsp;</td>
          <td class="paramname"> <em>argv</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p><p>Note: driveno might change its value in this call </p>
</p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00701">701</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>References <a class="el" href="libburner_8c_source.html#l00588">all_tracks_type</a>, <a class="el" href="libburn_8h.html#a765bba03b9f40c07f159ff9ef7db0e09">burn_drive_release()</a>, <a class="el" href="libburn_8h.html#ab9b933537517c9fda9758a9f2b4af337">burn_finish()</a>, <a class="el" href="libburn_8h.html#a53b82b88a6ebfa788ace50d890080bc6">burn_initialize()</a>, <a class="el" href="libburn_8h.html#a634106ec331c7b7db40a142c467cfb48">burn_msgs_set_severities()</a>, <a class="el" href="libburn_8h.html#a47b6e05ca3f53ca00f0ef4103eb5cd18">burn_set_signal_handling()</a>, <a class="el" href="libburner_8c_source.html#l00583">do_blank</a>, <a class="el" href="libburner_8c_source.html#l00586">do_multi</a>, <a class="el" href="libburner_8c_source.html#l00581">drive_adr</a>, <a class="el" href="libburner_8c_source.html#l00075">drive_is_grabbed</a>, <a class="el" href="libburner_8c_source.html#l00582">driveno</a>, <a class="el" href="libburner_8c_source.html#l00101">libburner_aquire_drive()</a>, <a class="el" href="libburner_8c_source.html#l00271">libburner_blank_disc()</a>, <a class="el" href="libburner_8c_source.html#l00331">libburner_format()</a>, <a class="el" href="libburner_8c_source.html#l00407">libburner_payload()</a>, <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, <a class="el" href="libburner_8c_source.html#l00587">simulate_burn</a>, <a class="el" href="libburner_8c_source.html#l00584">source_adr</a>, and <a class="el" href="libburner_8c_source.html#l00585">source_adr_count</a>.</p>

<p><div class="fragment"><pre class="fragment"><a name="l00702"></a>00702 {
<a name="l00703"></a>00703     <span class="keywordtype">int</span> ret;
<a name="l00704"></a>00704 
<a name="l00705"></a>00705     ret = <a class="code" href="libburner_8c.html#a67980a9cee509cf714f67aa96a47c75d" title="Converts command line arguments into above setup parameters.">libburner_setup</a>(argc, argv);
<a name="l00706"></a>00706     <span class="keywordflow">if</span> (ret)
<a name="l00707"></a>00707         exit(ret);
<a name="l00708"></a>00708 
<a name="l00709"></a>00709     printf(<span class="stringliteral">&quot;Initializing libburnia-project.org ...\n&quot;</span>);
<a name="l00710"></a>00710     <span class="keywordflow">if</span> (<a class="code" href="libburn_8h.html#a53b82b88a6ebfa788ace50d890080bc6" title="Initialize the library.">burn_initialize</a>())
<a name="l00711"></a>00711         printf(<span class="stringliteral">&quot;Done\n&quot;</span>);
<a name="l00712"></a>00712     <span class="keywordflow">else</span> {
<a name="l00713"></a>00713         printf(<span class="stringliteral">&quot;FAILED\n&quot;</span>);
<a name="l00714"></a>00714         fprintf(stderr,<span class="stringliteral">&quot;\nFATAL: Failed to initialize.\n&quot;</span>);
<a name="l00715"></a>00715         exit(33);
<a name="l00716"></a>00716     }
<a name="l00717"></a>00717 
<a name="l00718"></a>00718     <span class="comment">/* Print messages of severity SORRY or more directly to stderr */</span>
<a name="l00719"></a>00719     <a class="code" href="libburn_8h.html#a634106ec331c7b7db40a142c467cfb48" title="Note: Above version numbers are also recorded in configure.ac because libtool wants...">burn_msgs_set_severities</a>(<span class="stringliteral">&quot;NEVER&quot;</span>, <span class="stringliteral">&quot;SORRY&quot;</span>, <span class="stringliteral">&quot;libburner : &quot;</span>);
<a name="l00720"></a>00720 
<a name="l00721"></a>00721     <span class="comment">/* Activate the default signal handler which eventually will try to</span>
<a name="l00722"></a>00722 <span class="comment">       properly shutdown drive and library on aborting events. */</span>
<a name="l00723"></a>00723     <a class="code" href="libburn_8h.html#a47b6e05ca3f53ca00f0ef4103eb5cd18" title="Control builtin signal handling.">burn_set_signal_handling</a>(<span class="stringliteral">&quot;libburner : &quot;</span>, NULL, 0);
<a name="l00724"></a>00724 <span class="comment"></span>
<a name="l00725"></a>00725 <span class="comment">    /** Note: driveno might change its value in this call */</span>
<a name="l00726"></a>00726     ret = <a class="code" href="libburner_8c.html#ab485e1b9ba9572fb7596ffa6d6ff67c7" title="You need to aquire a drive before burning.">libburner_aquire_drive</a>(<a class="code" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1" title="The setup parameters of libburner.">drive_adr</a>, &amp;<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>);
<a name="l00727"></a>00727     <span class="keywordflow">if</span> (ret&lt;=0) {
<a name="l00728"></a>00728         fprintf(stderr,<span class="stringliteral">&quot;\nFATAL: Failed to aquire drive.\n&quot;</span>);
<a name="l00729"></a>00729         { ret = 34; <span class="keywordflow">goto</span> finish_libburn; }
<a name="l00730"></a>00730     }
<a name="l00731"></a>00731     <span class="keywordflow">if</span> (ret == 2)
<a name="l00732"></a>00732         { ret = 0; <span class="keywordflow">goto</span> release_drive; }
<a name="l00733"></a>00733     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a>) {
<a name="l00734"></a>00734         <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> &gt; 100)
<a name="l00735"></a>00735             ret = <a class="code" href="libburner_8c.html#a42f03141c04bc55410fdc8e93c4f0143" title="Formats unformatted DVD-RW to profile 0013h &amp;quot;Restricted Overwrite&amp;quot; which...">libburner_format</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>].drive);
<a name="l00736"></a>00736         <span class="keywordflow">else</span>
<a name="l00737"></a>00737             ret = <a class="code" href="libburner_8c.html#a0d4b7dff006b3f1f2aac1acc48ba99df" title="Makes a previously used CD-RW or unformatted DVD-RW ready for thorough re-usal.">libburner_blank_disc</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>].drive,
<a name="l00738"></a>00738                             <a class="code" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> == 1);
<a name="l00739"></a>00739         <span class="keywordflow">if</span> (ret&lt;=0)
<a name="l00740"></a>00740             { ret = 36; <span class="keywordflow">goto</span> release_drive; }
<a name="l00741"></a>00741     }
<a name="l00742"></a>00742     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a> &gt; 0) {
<a name="l00743"></a>00743         ret = <a class="code" href="libburner_8c.html#af9c2fc57ed6d8505b22d377daef4914b" title="Brings preformatted track images (ISO 9660, audio, .">libburner_payload</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>].drive,
<a name="l00744"></a>00744                 <a class="code" href="libburner_8c.html#a20401aa73b1b1c04c3faddfd1647f302">source_adr</a>, <a class="code" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a>,
<a name="l00745"></a>00745                 <a class="code" href="libburner_8c.html#a8e824cc51e6e6cfc91ac1df7830a70ed">do_multi</a>, <a class="code" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a>, <a class="code" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a>);
<a name="l00746"></a>00746         <span class="keywordflow">if</span> (ret&lt;=0)
<a name="l00747"></a>00747             { ret = 38; <span class="keywordflow">goto</span> release_drive; }
<a name="l00748"></a>00748     }
<a name="l00749"></a>00749     ret = 0;
<a name="l00750"></a>00750 release_drive:;
<a name="l00751"></a>00751     <span class="keywordflow">if</span> (<a class="code" href="libburner_8c.html#aaee536e445f55d19bfeb431850ec90e4" title="This variable indicates wether the drive is grabbed and must be finally released...">drive_is_grabbed</a>)
<a name="l00752"></a>00752         <a class="code" href="libburn_8h.html#a765bba03b9f40c07f159ff9ef7db0e09" title="Release a drive.">burn_drive_release</a>(<a class="code" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba" title="Overview.">drive_list</a>[<a class="code" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a>].drive, 0);
<a name="l00753"></a>00753 
<a name="l00754"></a>00754 finish_libburn:;
<a name="l00755"></a>00755     <span class="comment">/* This app does not bother to know about exact scan state. </span>
<a name="l00756"></a>00756 <span class="comment">       Better to accept a memory leak here. We are done anyway. */</span>
<a name="l00757"></a>00757     <span class="comment">/* burn_drive_info_free(drive_list); */</span>
<a name="l00758"></a>00758 
<a name="l00759"></a>00759     <a class="code" href="libburn_8h.html#ab9b933537517c9fda9758a9f2b4af337" title="Shutdown the library.">burn_finish</a>();
<a name="l00760"></a>00760     exit(ret);
<a name="l00761"></a>00761 }
</pre></div></p>

</div>
</div>
<hr/><h2>Variable Documentation</h2>
<a class="anchor" id="acdd017f7636e63e635f981e11aca9a22"></a><!-- doxytag: member="libburner.c::all_tracks_type" ref="acdd017f7636e63e635f981e11aca9a22" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#acdd017f7636e63e635f981e11aca9a22">all_tracks_type</a> = BURN_MODE1<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00588">588</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="aa1a3fe5ef89cfc5713ab70e8b3d41043"></a><!-- doxytag: member="libburner.c::current_profile" ref="aa1a3fe5ef89cfc5713ab70e8b3d41043" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#aa1a3fe5ef89cfc5713ab70e8b3d41043">current_profile</a> = -1<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>A number and a text describing the type of media in aquired drive. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00078">78</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00101">libburner_aquire_drive()</a>, <a class="el" href="libburner_8c_source.html#l00271">libburner_blank_disc()</a>, <a class="el" href="libburner_8c_source.html#l00331">libburner_format()</a>, and <a class="el" href="libburner_8c_source.html#l00407">libburner_payload()</a>.</p>

</div>
</div>
<a class="anchor" id="a14fb7b17efb56d94fb7d794053ae045b"></a><!-- doxytag: member="libburner.c::current_profile_name" ref="a14fb7b17efb56d94fb7d794053ae045b" args="[80]" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">char <a class="el" href="libburner_8c.html#a14fb7b17efb56d94fb7d794053ae045b">current_profile_name</a>[80] = {&quot;&quot;}<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00079">79</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00101">libburner_aquire_drive()</a>, and <a class="el" href="libburner_8c_source.html#l00331">libburner_format()</a>.</p>

</div>
</div>
<a class="anchor" id="aec8a1ef7e11653bc93fe1d5b2c63c9d3"></a><!-- doxytag: member="libburner.c::do_blank" ref="aec8a1ef7e11653bc93fe1d5b2c63c9d3" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#aec8a1ef7e11653bc93fe1d5b2c63c9d3">do_blank</a> = 0<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00583">583</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a8e824cc51e6e6cfc91ac1df7830a70ed"></a><!-- doxytag: member="libburner.c::do_multi" ref="a8e824cc51e6e6cfc91ac1df7830a70ed" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#a8e824cc51e6e6cfc91ac1df7830a70ed">do_multi</a> = 0<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00586">586</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="adbe410a004b2aefa8868608beb2e5df1"></a><!-- doxytag: member="libburner.c::drive_adr" ref="adbe410a004b2aefa8868608beb2e5df1" args="[BURN_DRIVE_ADR_LEN]" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">char <a class="el" href="libburner_8c.html#adbe410a004b2aefa8868608beb2e5df1">drive_adr</a>[BURN_DRIVE_ADR_LEN] = {&quot;&quot;}<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>The setup parameters of libburner. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00581">581</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a2ab10011f756aef24f3168d95a5b439b"></a><!-- doxytag: member="libburner.c::drive_count" ref="a2ab10011f756aef24f3168d95a5b439b" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">unsigned int <a class="el" href="libburner_8c.html#a2ab10011f756aef24f3168d95a5b439b">drive_count</a><code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>If you start a long lasting operation with drive_count &gt; 1 then you are not friendly to the users of other drives on those systems. </p>
<p>Beware. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00071">71</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00168">libburner_aquire_by_driveno()</a>.</p>

</div>
</div>
<a class="anchor" id="aaee536e445f55d19bfeb431850ec90e4"></a><!-- doxytag: member="libburner.c::drive_is_grabbed" ref="aaee536e445f55d19bfeb431850ec90e4" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#aaee536e445f55d19bfeb431850ec90e4">drive_is_grabbed</a> = 0<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>This variable indicates wether the drive is grabbed and must be finally released. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00075">75</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00123">libburner_aquire_by_adr()</a>, <a class="el" href="libburner_8c_source.html#l00168">libburner_aquire_by_driveno()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a271c6b9f59f56d3ac45a173461f3eeba"></a><!-- doxytag: member="libburner.c::drive_list" ref="a271c6b9f59f56d3ac45a173461f3eeba" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct <a class="el" href="structburn__drive__info.html">burn_drive_info</a>* <a class="el" href="libburner_8c.html#a271c6b9f59f56d3ac45a173461f3eeba">drive_list</a><code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Overview. </p>
<p>libburner is a minimal demo application for the library libburn as provided on <a href="http://libburnia-project.org">http://libburnia-project.org</a> . It can list the available devices, can blank a CD-RW or DVD-RW, can format DVD-RW and BD, can burn to CD-R, CD-RW, DVD-R, DVD+R, DVD+R/DL, DVD+RW, DVD-RW, DVD-RAM, BD-R, BD-RE. Not supported yet: DVD-R/DL.</p>
<p>It's main purpose, nevertheless, is to show you how to use libburn and also to serve the libburnia team as reference application. <a class="el" href="libburner_8c.html">libburner.c</a> does indeed define the standard way how above three gestures can be implemented and stay upward compatible for a good while.</p>
<p>Before you can do anything, you have to initialize libburn by <a class="el" href="libburn_8h.html#a53b82b88a6ebfa788ace50d890080bc6" title="Initialize the library.">burn_initialize()</a> and provide some signal and abort handling, e.g. by the builtin handler, by <a class="el" href="libburn_8h.html#a47b6e05ca3f53ca00f0ef4103eb5cd18" title="Control builtin signal handling.">burn_set_signal_handling()</a> as it is done in <a class="el" href="libburner_8c.html#a3c04138a5bfe5d72780bb7e82a18e627">main()</a> at the end of this file. Then you aquire a drive in an appropriate way conforming to the API. The two main approaches are shown here in application functions: <a class="el" href="libburner_8c.html#a3ed4822421dfb49c359b85accd952b56" title="If the persistent drive address is known, then this approach is much more un-obtrusive...">libburner_aquire_by_adr()</a> demonstrates usage as of cdrecord traditions <a class="el" href="libburner_8c.html#aa2de071d4fb803b4a171dbc8dc14be5c" title="This method demonstrates how to use libburn without knowing a persistent drive address...">libburner_aquire_by_driveno()</a> demonstrates a scan-and-choose approach With that aquired drive you can blank a CD-RW <a class="el" href="libburner_8c.html#a0d4b7dff006b3f1f2aac1acc48ba99df" title="Makes a previously used CD-RW or unformatted DVD-RW ready for thorough re-usal.">libburner_blank_disc()</a> or you can format a DVD-RW to profile "Restricted Overwrite" (needed once) or an unused BD to default size with spare blocks <a class="el" href="libburner_8c.html#a42f03141c04bc55410fdc8e93c4f0143" title="Formats unformatted DVD-RW to profile 0013h &quot;Restricted Overwrite&quot; which...">libburner_format()</a> With the aquired drive you can burn to CD, DVD, BD <a class="el" href="libburner_8c.html#af9c2fc57ed6d8505b22d377daef4914b" title="Brings preformatted track images (ISO 9660, audio, .">libburner_payload()</a> When everything is done, <a class="el" href="libburner_8c.html#a3c04138a5bfe5d72780bb7e82a18e627">main()</a> releases the drive and shuts down libburn: <a class="el" href="libburn_8h.html#a765bba03b9f40c07f159ff9ef7db0e09" title="Release a drive.">burn_drive_release()</a>; <a class="el" href="libburn_8h.html#ab9b933537517c9fda9758a9f2b4af337" title="Shutdown the library.">burn_finish()</a> See this for the decisive API specs . <a class="el" href="libburn_8h.html">libburn.h</a> is The Original For simplicity i use global variables to represent the drives. Drives are systemwide global, so we do not give away much of good style. This list will hold the drives known to libburn. This might be all CD drives of the system and thus might impose severe impact on the system. </p>

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00067">67</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

</div>
</div>
<a class="anchor" id="ae62e41d8013871fadd6094bf505bf0e3"></a><!-- doxytag: member="libburner.c::driveno" ref="ae62e41d8013871fadd6094bf505bf0e3" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#ae62e41d8013871fadd6094bf505bf0e3">driveno</a> = 0<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00582">582</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a0987fdf0d2c39990a6de69c649f4d470"></a><!-- doxytag: member="libburner.c::simulate_burn" ref="a0987fdf0d2c39990a6de69c649f4d470" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#a0987fdf0d2c39990a6de69c649f4d470">simulate_burn</a> = 0<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00587">587</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a20401aa73b1b1c04c3faddfd1647f302"></a><!-- doxytag: member="libburner.c::source_adr" ref="a20401aa73b1b1c04c3faddfd1647f302" args="[99][4096]" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">char <a class="el" href="libburner_8c.html#a20401aa73b1b1c04c3faddfd1647f302">source_adr</a>[99][4096]<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00584">584</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
<a class="anchor" id="a896ce0b6e3a7f1c4aa381a351f45106b"></a><!-- doxytag: member="libburner.c::source_adr_count" ref="a896ce0b6e3a7f1c4aa381a351f45106b" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="libburner_8c.html#a896ce0b6e3a7f1c4aa381a351f45106b">source_adr_count</a> = 0<code> [static]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="libburner_8c_source.html#l00585">585</a> of file <a class="el" href="libburner_8c_source.html">libburner.c</a>.</p>

<p>Referenced by <a class="el" href="libburner_8c_source.html#l00593">libburner_setup()</a>, and <a class="el" href="libburner_8c_source.html#l00701">main()</a>.</p>

</div>
</div>
</div>
<hr size="1"/><address style="text-align: right;"><small>Generated on 30 Sep 2009 for libburn by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>