Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 2269bb274471fd2722517c2c0b740d7f > files > 154

rpm-devel-4.0.4-19mdk.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>lib/rpmchecksig.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.17 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>lib/rpmchecksig.c</h1><a href="lib_2rpmchecksig_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 
00006 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span>
00007 
00008 <span class="preprocessor">#include &lt;<a class="code" href="rpmcli_8h.html">rpmcli.h</a>&gt;</span>
00009 
00010 <span class="preprocessor">#include "<a class="code" href="rpmlead_8h.html">rpmlead.h</a>"</span>
00011 <span class="preprocessor">#include "<a class="code" href="signature_8h.html">signature.h</a>"</span>
00012 <span class="preprocessor">#include "<a class="code" href="misc_8h.html">misc.h</a>"</span>       <span class="comment">/* XXX for makeTempFile() */</span>
00013 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00014 
00015 <span class="comment">/*@access Header@*/</span>             <span class="comment">/* XXX compared with NULL */</span>
00016 <span class="comment">/*@access FD_t@*/</span>               <span class="comment">/* XXX compared with NULL */</span>
00017 
<a name="l00018"></a><a class="code" href="lib_2rpmchecksig_8c.html#a0">00018</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(<a class="code" href="struct__FD__s.html">FD_t</a> *fdp, <span class="keyword">const</span> <span class="keywordtype">char</span> **fnp, <span class="keywordtype">int</span> flags,
00019                 <span class="comment">/*@unused@*/</span> <span class="keywordtype">int</span> rc)
00020         <span class="comment">/*@globals rpmGlobalMacroContext, fileSystem @*/</span>
00021         <span class="comment">/*@modifies *fdp, *fnp, rpmGlobalMacroContext, fileSystem @*/</span>
00022 {
00023     <span class="keyword">const</span> <span class="keywordtype">char</span> *fn;
00024     <a class="code" href="struct__FD__s.html">FD_t</a> fd;
00025 
00026     <span class="keywordflow">if</span> (fdp == NULL) {  <span class="comment">/* programmer error */</span>
00027         <span class="keywordflow">return</span> 1;
00028     }
00029 
00030     <span class="comment">/* close and reset *fdp to NULL */</span>
00031     <span class="keywordflow">if</span> (*fdp &amp;&amp; (fnp == NULL || *fnp == NULL)) {
00032         (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(*fdp);
00033         *fdp = NULL;
00034         <span class="keywordflow">return</span> 0;
00035     }
00036 
00037     <span class="comment">/* open a file and set *fdp */</span>
00038     <span class="keywordflow">if</span> (*fdp == NULL &amp;&amp; fnp &amp;&amp; *fnp) {
00039         fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(*fnp, ((flags &amp; O_WRONLY) ? <span class="stringliteral">"w.ufdio"</span> : <span class="stringliteral">"r.ufdio"</span>));
00040         <span class="keywordflow">if</span> (fd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(fd)) {
00041             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a63">RPMERR_OPEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: open failed: %s\n"</span>), *fnp,
00042                 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd));
00043             <span class="keywordflow">return</span> 1;
00044         }
00045         *fdp = fd;
00046         <span class="keywordflow">return</span> 0;
00047     }
00048 
00049     <span class="comment">/* open a temp file */</span>
00050     <span class="keywordflow">if</span> (*fdp == NULL &amp;&amp; (fnp == NULL || *fnp == NULL)) {
00051         fn = NULL;
00052         <span class="keywordflow">if</span> (<a class="code" href="lib_2misc_8c.html#a8">makeTempFile</a>(NULL, (fnp ? &amp;fn : NULL), &amp;fd)) {
00053             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a74">RPMERR_MAKETEMP</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"makeTempFile failed\n"</span>));
00054             <span class="keywordflow">return</span> 1;
00055         }
00056         <span class="keywordflow">if</span> (fnp)
00057             *fnp = fn;
00058         *fdp = <a class="code" href="rpmio_8h.html#a5">fdLink</a>(fd, <span class="stringliteral">"manageFile return"</span>);
00059         (void) <a class="code" href="rpmio_8h.html#a6">fdFree</a>(fd, <span class="stringliteral">"manageFile return"</span>);
00060         <span class="keywordflow">return</span> 0;
00061     }
00062 
00063     <span class="comment">/* no operation */</span>
00064     <span class="keywordflow">if</span> (*fdp &amp;&amp; fnp &amp;&amp; *fnp) {
00065         <span class="keywordflow">return</span> 0;
00066     }
00067 
00068     <span class="comment">/* XXX never reached */</span>
00069     <span class="keywordflow">return</span> 1;
00070 }
00071 
<a name="l00072"></a><a class="code" href="lib_2rpmchecksig_8c.html#a1">00072</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(<a class="code" href="struct__FD__s.html">FD_t</a> *sfdp, <span class="keyword">const</span> <span class="keywordtype">char</span> **sfnp,
00073         <a class="code" href="struct__FD__s.html">FD_t</a> *tfdp, <span class="keyword">const</span> <span class="keywordtype">char</span> **tfnp)
00074         <span class="comment">/*@modifies *sfdp, *sfnp, *tfdp, *tfnp, fileSystem @*/</span>
00075 {
00076     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> buffer[BUFSIZ];
00077     ssize_t count;
00078     <span class="keywordtype">int</span> rc = 1;
00079 
00080     <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(sfdp, sfnp, O_RDONLY, 0))
00081         <span class="keywordflow">goto</span> exit;
00082     <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(tfdp, tfnp, O_WRONLY|O_CREAT|O_TRUNC, 0))
00083         <span class="keywordflow">goto</span> exit;
00084 
00085     <span class="keywordflow">while</span> ((count = <a class="code" href="group__rpmio.html#a77">Fread</a>(buffer, <span class="keyword">sizeof</span>(buffer[0]), <span class="keyword">sizeof</span>(buffer), *sfdp)) &gt; 0) {
00086         <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a78">Fwrite</a>(buffer, <span class="keyword">sizeof</span>(buffer[0]), count, *tfdp) != count) {
00087             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a75">RPMERR_FWRITE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Fwrite failed: %s\n"</span>), *tfnp,
00088                 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(*tfdp));
00089             <span class="keywordflow">goto</span> exit;
00090         }
00091     }
00092     <span class="keywordflow">if</span> (count &lt; 0) {
00093         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a76">RPMERR_FREAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Fread failed: %s\n"</span>), *sfnp, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(*sfdp));
00094         <span class="keywordflow">goto</span> exit;
00095     }
00096 
00097     rc = 0;
00098 
00099 exit:
00100     <span class="keywordflow">if</span> (*sfdp)  (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(sfdp, NULL, 0, rc);
00101     <span class="keywordflow">if</span> (*tfdp)  (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(tfdp, NULL, 0, rc);
00102     <span class="keywordflow">return</span> rc;
00103 }
00104 
<a name="l00105"></a><a class="code" href="group__rpmcli.html#a38">00105</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a38">rpmReSign</a>(<a class="code" href="group__rpmcli.html#a17">rpmResignFlags</a> flags, <span class="keywordtype">char</span> * passPhrase, <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv)
00106 {
00107     <a class="code" href="struct__FD__s.html">FD_t</a> fd = NULL;
00108     <a class="code" href="struct__FD__s.html">FD_t</a> ofd = NULL;
00109     <span class="keyword">struct </span><a class="code" href="structrpmlead.html">rpmlead</a> lead, *l = &amp;lead;
00110     <a class="code" href="header_8h.html#a9">int_32</a> sigtag;
00111     <span class="keyword">const</span> <span class="keywordtype">char</span> *rpm, *trpm;
00112     <span class="keyword">const</span> <span class="keywordtype">char</span> *sigtarget = NULL;
00113     <span class="keywordtype">char</span> tmprpm[1024+1];
00114     <a class="code" href="structheaderToken.html">Header</a> sig = NULL;
00115     <span class="keywordtype">void</span> * uh = NULL;
00116     <a class="code" href="header_8h.html#a9">int_32</a> uht, uhc;
00117     <span class="keywordtype">int</span> res = <a class="code" href="system_8h.html#a3">EXIT_FAILURE</a>;
00118     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc;
00119     <span class="keywordtype">int</span> xx;
00120     
00121     tmprpm[0] = <span class="charliteral">'\0'</span>;
00122     <span class="keywordflow">if</span> (argv)
00123     <span class="keywordflow">while</span> ((rpm = *argv++) != NULL) {
00124 
00125         fprintf(stdout, <span class="stringliteral">"%s:\n"</span>, rpm);
00126 
00127         <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;fd, &amp;rpm, O_RDONLY, 0))
00128             <span class="keywordflow">goto</span> exit;
00129 
00130         memset(l, 0, <span class="keyword">sizeof</span>(*l));
00131         <span class="keywordflow">if</span> (<a class="code" href="group__lead.html#a1">readLead</a>(fd, l)) {
00132             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a77">RPMERR_READLEAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: readLead failed\n"</span>), rpm);
00133             <span class="keywordflow">goto</span> exit;
00134         }
00135         <span class="keywordflow">switch</span> (l-&gt;<a class="code" href="structrpmlead.html#m1">major</a>) {
00136         <span class="keywordflow">case</span> 1:
00137             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a85">RPMERR_BADSIGTYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Can't sign v1.0 RPM\n"</span>), rpm);
00138             <span class="keywordflow">goto</span> exit;
00139             <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>;
00140         <span class="keywordflow">case</span> 2:
00141             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a85">RPMERR_BADSIGTYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: Can't re-sign v2.0 RPM\n"</span>), rpm);
00142             <span class="keywordflow">goto</span> exit;
00143             <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>;
00144         <span class="keywordflow">default</span>:
00145             <span class="keywordflow">break</span>;
00146         }
00147 
00148         rc = <a class="code" href="group__signature.html#a5">rpmReadSignature</a>(fd, &amp;sig, l-&gt;<a class="code" href="structrpmlead.html#m7">signature_type</a>);
00149         <span class="keywordflow">if</span> (!(rc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || rc == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>)) {
00150             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: rpmReadSignature failed\n"</span>), rpm);
00151             <span class="keywordflow">goto</span> exit;
00152         }
00153         <span class="keywordflow">if</span> (sig == NULL) {
00154             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: No signature available\n"</span>), rpm);
00155             <span class="keywordflow">goto</span> exit;
00156         }
00157 
00158         <span class="comment">/* Write the header and archive to a temp file */</span>
00159         <span class="comment">/* ASSERT: ofd == NULL &amp;&amp; sigtarget == NULL */</span>
00160         <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(&amp;fd, &amp;rpm, &amp;ofd, &amp;sigtarget))
00161             <span class="keywordflow">goto</span> exit;
00162         <span class="comment">/* Both fd and ofd are now closed. sigtarget contains tempfile name. */</span>
00163         <span class="comment">/* ASSERT: fd == NULL &amp;&amp; ofd == NULL */</span>
00164 
00165         <span class="comment">/* Dump the immutable region (if present). */</span>
00166         <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a40">headerGetEntry</a>(sig, <a class="code" href="rpmlib_8h.html#a494a95">RPMTAG_HEADERSIGNATURES</a>, &amp;uht, &amp;uh, &amp;uhc)) {
00167             <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi;
00168             <a class="code" href="header_8h.html#a9">int_32</a> tag, type, count;
00169             <a class="code" href="header_8h.html#a17">hPTR_t</a> ptr;
00170             <a class="code" href="structheaderToken.html">Header</a> oh;
00171             <a class="code" href="structheaderToken.html">Header</a> nh;
00172 
00173             nh = <a class="code" href="group__header.html#a51">headerNew</a>();
00174             <span class="keywordflow">if</span> (nh == NULL) {
00175                 uh = <a class="code" href="group__header.html#a83">headerFreeData</a>(uh, uht);
00176                 <span class="keywordflow">goto</span> exit;
00177             }
00178 
00179             oh = <a class="code" href="group__header.html#a31">headerCopyLoad</a>(uh);
00180             <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(oh);
00181                 <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &amp;tag, &amp;type, &amp;ptr, &amp;count);
00182                 ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>(ptr, type))
00183             {
00184                 <span class="keywordflow">if</span> (ptr)
00185                     xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(nh, tag, type, ptr, count);
00186             }
00187             hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi);
00188             oh = <a class="code" href="group__header.html#a16">headerFree</a>(oh);
00189 
00190             sig = <a class="code" href="group__header.html#a16">headerFree</a>(sig);
00191             sig = <a class="code" href="group__header.html#a14">headerLink</a>(nh);
00192             nh = <a class="code" href="group__header.html#a16">headerFree</a>(nh);
00193         }
00194 
00195         <span class="comment">/* Eliminate broken digest values. */</span>
00196         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>);
00197         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>);
00198         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a406">RPMSIGTAG_BADSHA1_1</a>);
00199         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a407">RPMSIGTAG_BADSHA1_2</a>);
00200 
00201         <span class="comment">/* Toss and recalculate header+payload size and digests. */</span>
00202         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>);
00203         xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>, passPhrase);
00204         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>);
00205         xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>, passPhrase);
00206 <span class="preprocessor">#ifdef  NOTYET  </span><span class="comment">/* XXX leave new-fangled header-only digest in place. */</span>
00207         xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a408">RPMSIGTAG_SHA1</a>);
00208         xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, <a class="code" href="group__signature.html#a11a408">RPMSIGTAG_SHA1</a>, passPhrase);
00209 <span class="preprocessor">#endif</span>
00210 <span class="preprocessor"></span>
00211         <span class="keywordflow">if</span> ((sigtag = <a class="code" href="group__signature.html#a8">rpmLookupSignatureType</a>(<a class="code" href="signature_8h.html#a0">RPMLOOKUPSIG_QUERY</a>)) &gt; 0) {
00212 <span class="preprocessor">#ifdef  NOTYET  </span><span class="comment">/* XXX leave new-fangled header-only signatures in place. */</span>
00213             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>:
00214                 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a409">RPMSIGTAG_DSA</a>);
00215                 <span class="comment">/*@fallthrough@*/</span>
00216             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>:
00217             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>:
00218                 xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, <a class="code" href="group__signature.html#a11a410">RPMSIGTAG_RSA</a>);
00219                 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00220             }
00221 <span class="preprocessor">#endif</span>
00222 <span class="preprocessor"></span>            xx = <a class="code" href="group__header.html#a28">headerRemoveEntry</a>(sig, sigtag);
00223             xx = <a class="code" href="group__signature.html#a7">rpmAddSignature</a>(sig, sigtarget, sigtag, passPhrase);
00224         }
00225 
00226         <span class="comment">/* Reallocate the signature into one contiguous region. */</span>
00227         sig = <a class="code" href="group__header.html#a30">headerReload</a>(sig, <a class="code" href="rpmlib_8h.html#a494a95">RPMTAG_HEADERSIGNATURES</a>);
00228         <span class="keywordflow">if</span> (sig == NULL)        <span class="comment">/* XXX can't happen */</span>
00229             <span class="keywordflow">goto</span> exit;
00230 
00231         <span class="comment">/* Write the lead/signature of the output rpm */</span>
00232         strcpy(tmprpm, rpm);
00233         strcat(tmprpm, <span class="stringliteral">".XXXXXX"</span>);
00234         (void) <span class="comment">/*@-unrecog@*/</span> mktemp(tmprpm) <span class="comment">/*@=unrecog@*/</span>;
00235         trpm = tmprpm;
00236 
00237         <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;ofd, &amp;trpm, O_WRONLY|O_CREAT|O_TRUNC, 0))
00238             <span class="keywordflow">goto</span> exit;
00239 
00240         l-&gt;<a class="code" href="structrpmlead.html#m7">signature_type</a> = <a class="code" href="group__signature.html#a12a11">RPMSIGTYPE_HEADERSIG</a>;
00241         <span class="keywordflow">if</span> (<a class="code" href="group__lead.html#a0">writeLead</a>(ofd, l)) {
00242             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a78">RPMERR_WRITELEAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: writeLead failed: %s\n"</span>), trpm,
00243                 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(ofd));
00244             <span class="keywordflow">goto</span> exit;
00245         }
00246 
00247         <span class="keywordflow">if</span> (<a class="code" href="group__signature.html#a6">rpmWriteSignature</a>(ofd, sig)) {
00248             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: rpmWriteSignature failed: %s\n"</span>), trpm,
00249                 <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(ofd));
00250             <span class="keywordflow">goto</span> exit;
00251         }
00252 
00253         <span class="comment">/* Append the header and archive from the temp file */</span>
00254         <span class="comment">/* ASSERT: fd == NULL &amp;&amp; ofd != NULL */</span>
00255         <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(&amp;fd, &amp;sigtarget, &amp;ofd, &amp;trpm))
00256             <span class="keywordflow">goto</span> exit;
00257         <span class="comment">/* Both fd and ofd are now closed. */</span>
00258         <span class="comment">/* ASSERT: fd == NULL &amp;&amp; ofd == NULL */</span>
00259 
00260         <span class="comment">/* Clean up intermediate target */</span>
00261         (void) unlink(sigtarget);
00262         sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget);
00263 
00264         <span class="comment">/* Move final target into place. */</span>
00265         (void) unlink(rpm);
00266         (void) rename(trpm, rpm);
00267         tmprpm[0] = <span class="charliteral">'\0'</span>;
00268     }
00269 
00270     res = 0;
00271 
00272 exit:
00273     <span class="keywordflow">if</span> (fd)     (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;fd, NULL, 0, res);
00274     <span class="keywordflow">if</span> (ofd)    (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;ofd, NULL, 0, res);
00275 
00276     sig = <a class="code" href="group__signature.html#a9">rpmFreeSignature</a>(sig);
00277 
00278     <span class="keywordflow">if</span> (sigtarget) {
00279         (void) unlink(sigtarget);
00280         sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget);
00281     }
00282     <span class="keywordflow">if</span> (tmprpm[0] != <span class="charliteral">'\0'</span>) {
00283         (void) unlink(tmprpm);
00284         tmprpm[0] = <span class="charliteral">'\0'</span>;
00285     }
00286 
00287     <span class="keywordflow">return</span> res;
00288 }
00289 
<a name="l00290"></a><a class="code" href="group__rpmcli.html#a37">00290</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a37">rpmCheckSig</a>(<a class="code" href="group__rpmcli.html#a16">rpmCheckSigFlags</a> flags, <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv)
00291 {
00292     <a class="code" href="struct__FD__s.html">FD_t</a> fd = NULL;
00293     <a class="code" href="struct__FD__s.html">FD_t</a> ofd = NULL;
00294     <span class="keywordtype">int</span> res2, res3;
00295     <span class="keyword">struct </span><a class="code" href="structrpmlead.html">rpmlead</a> lead, *l = &amp;lead;
00296     <span class="keyword">const</span> <span class="keywordtype">char</span> *rpm = NULL;
00297     <span class="keywordtype">char</span> result[8*BUFSIZ];
00298     <span class="keyword">const</span> <span class="keywordtype">char</span> * sigtarget = NULL;
00299     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> buffer[8192];
00300     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> missingKeys[7164];
00301     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> untrustedKeys[7164];
00302     <a class="code" href="structheaderToken.html">Header</a> sig;
00303     <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi;
00304     <a class="code" href="header_8h.html#a9">int_32</a> tag, type, count;
00305     <span class="keyword">const</span> <span class="keywordtype">void</span> * ptr;
00306     <span class="keywordtype">int</span> res = 0;
00307     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc;
00308 
00309     <span class="keywordflow">if</span> (argv)
00310     <span class="keywordflow">while</span> ((rpm = *argv++) != NULL) {
00311 
00312         <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;fd, &amp;rpm, O_RDONLY, 0)) {
00313             res++;
00314             <span class="keywordflow">goto</span> bottom;
00315         }
00316 
00317         memset(l, 0, <span class="keyword">sizeof</span>(*l));
00318         <span class="keywordflow">if</span> (<a class="code" href="group__lead.html#a1">readLead</a>(fd, l)) {
00319             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a77">RPMERR_READLEAD</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: readLead failed\n"</span>), rpm);
00320             res++;
00321             <span class="keywordflow">goto</span> bottom;
00322         }
00323         <span class="keywordflow">switch</span> (l-&gt;<a class="code" href="structrpmlead.html#m1">major</a>) {
00324         <span class="keywordflow">case</span> 1:
00325             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a85">RPMERR_BADSIGTYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: No signature available (v1.0 RPM)\n"</span>), rpm);
00326             res++;
00327             <span class="keywordflow">goto</span> bottom;
00328             <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>;
00329         <span class="keywordflow">default</span>:
00330             <span class="keywordflow">break</span>;
00331         }
00332 
00333         rc = <a class="code" href="group__signature.html#a5">rpmReadSignature</a>(fd, &amp;sig, l-&gt;<a class="code" href="structrpmlead.html#m7">signature_type</a>);
00334         <span class="keywordflow">if</span> (!(rc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || rc == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>)) {
00335             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: rpmReadSignature failed\n"</span>), rpm);
00336             res++;
00337             <span class="keywordflow">goto</span> bottom;
00338         }
00339         <span class="keywordflow">if</span> (sig == NULL) {
00340             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a86">RPMERR_SIGGEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: No signature available\n"</span>), rpm);
00341             res++;
00342             <span class="keywordflow">goto</span> bottom;
00343         }
00344         <span class="comment">/* Write the header and archive to a temp file */</span>
00345         <span class="comment">/* ASSERT: ofd == NULL &amp;&amp; sigtarget == NULL */</span>
00346         <span class="keywordflow">if</span> (<a class="code" href="lib_2rpmchecksig_8c.html#a1">copyFile</a>(&amp;fd, &amp;rpm, &amp;ofd, &amp;sigtarget)) {
00347             res++;
00348             <span class="keywordflow">goto</span> bottom;
00349         }
00350         <span class="comment">/* Both fd and ofd are now closed. sigtarget contains tempfile name. */</span>
00351         <span class="comment">/* ASSERT: fd == NULL &amp;&amp; ofd == NULL */</span>
00352 
00353         res2 = 0;
00354         missingKeys[0] = <span class="charliteral">'\0'</span>;
00355         untrustedKeys[0] = <span class="charliteral">'\0'</span>;
00356         sprintf(buffer, <span class="stringliteral">"%s:%c"</span>, rpm, (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>() ? <span class="charliteral">'\n'</span> : <span class="charliteral">' '</span>) );
00357 
00358         <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(sig);
00359             <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &amp;tag, &amp;type, &amp;ptr, &amp;count);
00360             ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>(ptr, type))
00361         {
00362             <span class="keywordflow">switch</span> (tag) {
00363             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>:        <span class="comment">/* XXX legacy */</span>
00364             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>:
00365                 <span class="keywordflow">if</span> (!(flags &amp; <a class="code" href="group__rpmcli.html#a43a64">CHECKSIG_PGP</a>)) 
00366                      <span class="keywordflow">continue</span>;
00367                 <span class="keywordflow">break</span>;
00368             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>:
00369                 <span class="keywordflow">if</span> (!(flags &amp; <a class="code" href="group__rpmcli.html#a43a66">CHECKSIG_GPG</a>)) 
00370                      <span class="keywordflow">continue</span>;
00371                 <span class="keywordflow">break</span>;
00372             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>:
00373             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>:
00374             <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>:
00375                 <span class="keywordflow">if</span> (!(flags &amp; <a class="code" href="group__rpmcli.html#a43a65">CHECKSIG_MD5</a>)) 
00376                      <span class="keywordflow">continue</span>;
00377                 <span class="keywordflow">break</span>;
00378             <span class="keywordflow">default</span>:
00379                 <span class="keywordflow">continue</span>;
00380                 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>;
00381             }
00382             <span class="keywordflow">if</span> (ptr == NULL) <span class="keywordflow">continue</span>;  <span class="comment">/* XXX can't happen */</span>
00383 
00384             <span class="keywordflow">if</span> ((res3 = <a class="code" href="group__signature.html#a19">rpmVerifySignature</a>(sigtarget, tag, ptr, count, 
00385                                            result))) {
00386                 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) {
00387                     strcat(buffer, result);
00388                     res2 = 1;
00389                 } <span class="keywordflow">else</span> {
00390                     <span class="keywordtype">char</span> *tempKey;
00391                     <span class="keywordflow">switch</span> (tag) {
00392                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>:
00393                         strcat(buffer, <span class="stringliteral">"SIZE "</span>);
00394                         res2 = 1;
00395                         <span class="keywordflow">break</span>;
00396                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>:
00397                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>:
00398                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>:
00399                         strcat(buffer, <span class="stringliteral">"MD5 "</span>);
00400                         res2 = 1;
00401                         <span class="keywordflow">break</span>;
00402                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>:      <span class="comment">/* XXX legacy */</span>
00403                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>:
00404                         <span class="keywordflow">switch</span> (res3) {
00405                         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a510a414">RPMSIG_NOKEY</a>:
00406                             res2 = 1;
00407                             <span class="comment">/*@fallthrough@*/</span>
00408                         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a510a415">RPMSIG_NOTTRUSTED</a>:
00409                         {   <span class="keywordtype">int</span> offset = 7;
00410                             strcat(buffer, <span class="stringliteral">"(PGP) "</span>);
00411                             tempKey = strstr(result, <span class="stringliteral">"Key ID"</span>);
00412                             <span class="keywordflow">if</span> (tempKey == NULL) {
00413                                 tempKey = strstr(result, <span class="stringliteral">"keyid:"</span>);
00414                                 offset = 9;
00415                             }
00416                             <span class="keywordflow">if</span> (tempKey) {
00417                               <span class="keywordflow">if</span> (res3 == <a class="code" href="rpmlib_8h.html#a510a414">RPMSIG_NOKEY</a>) {
00418                                 strcat(missingKeys, <span class="stringliteral">" PGP#"</span>);
00419                                 <span class="comment">/*@-compdef@*/</span>
00420                                 strncat(missingKeys, tempKey + offset, 8);
00421                                 <span class="comment">/*@=compdef@*/</span>
00422                               } <span class="keywordflow">else</span> {
00423                                 strcat(untrustedKeys, <span class="stringliteral">" PGP#"</span>);
00424                                 <span class="comment">/*@-compdef@*/</span>
00425                                 strncat(untrustedKeys, tempKey + offset, 8);
00426                                 <span class="comment">/*@=compdef@*/</span>
00427                               }
00428                             }
00429                         }   <span class="keywordflow">break</span>;
00430                         <span class="keywordflow">default</span>:
00431                             strcat(buffer, <span class="stringliteral">"PGP "</span>);
00432                             res2 = 1;
00433                             <span class="keywordflow">break</span>;
00434                         }
00435                         <span class="keywordflow">break</span>;
00436                       <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>:
00437                         <span class="comment">/* Do not consider this a failure */</span>
00438                         <span class="keywordflow">switch</span> (res3) {
00439                         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a510a414">RPMSIG_NOKEY</a>:
00440                             strcat(buffer, <span class="stringliteral">"(GPG) "</span>);
00441                             strcat(missingKeys, <span class="stringliteral">" GPG#"</span>);
00442                             tempKey = strstr(result, <span class="stringliteral">"key ID"</span>);
00443                             <span class="keywordflow">if</span> (tempKey)
00444                                 <span class="comment">/*@-compdef@*/</span>
00445                                 strncat(missingKeys, tempKey+7, 8);
00446                                 <span class="comment">/*@=compdef@*/</span>
00447                             res2 = 1;
00448                             <span class="keywordflow">break</span>;
00449                         <span class="keywordflow">default</span>:
00450                             strcat(buffer, <span class="stringliteral">"GPG "</span>);
00451                             res2 = 1;
00452                             <span class="keywordflow">break</span>;
00453                         }
00454                         <span class="keywordflow">break</span>;
00455                       <span class="keywordflow">default</span>:
00456                         strcat(buffer, <span class="stringliteral">"?UnknownSignatureType? "</span>);
00457                         res2 = 1;
00458                         <span class="keywordflow">break</span>;
00459                     }
00460                 }
00461             } <span class="keywordflow">else</span> {
00462                 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) {
00463                     strcat(buffer, result);
00464                 } <span class="keywordflow">else</span> {
00465                     <span class="keywordflow">switch</span> (tag) {
00466                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a398">RPMSIGTAG_SIZE</a>:
00467                         strcat(buffer, <span class="stringliteral">"size "</span>);
00468                         <span class="keywordflow">break</span>;
00469                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a401">RPMSIGTAG_LEMD5_2</a>:
00470                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a399">RPMSIGTAG_LEMD5_1</a>:
00471                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a402">RPMSIGTAG_MD5</a>:
00472                         strcat(buffer, <span class="stringliteral">"md5 "</span>);
00473                         <span class="keywordflow">break</span>;
00474                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a404">RPMSIGTAG_PGP5</a>:        <span class="comment">/* XXX legacy */</span>
00475                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a400">RPMSIGTAG_PGP</a>:
00476                         strcat(buffer, <span class="stringliteral">"pgp "</span>);
00477                         <span class="keywordflow">break</span>;
00478                     <span class="keywordflow">case</span> <a class="code" href="group__signature.html#a11a403">RPMSIGTAG_GPG</a>:
00479                         strcat(buffer, <span class="stringliteral">"gpg "</span>);
00480                         <span class="keywordflow">break</span>;
00481                     <span class="keywordflow">default</span>:
00482                         strcat(buffer, <span class="stringliteral">"??? "</span>);
00483                         <span class="keywordflow">break</span>;
00484                     }
00485                 }
00486             }
00487         }
00488         hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi);
00489         res += res2;
00490         (void) unlink(sigtarget);
00491         sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget);
00492 
00493         <span class="keywordflow">if</span> (res2) {
00494             <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) {
00495                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s"</span>, (<span class="keywordtype">char</span> *)buffer);
00496             } <span class="keywordflow">else</span> {
00497                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s%s%s%s%s%s%s%s\n"</span>, (<span class="keywordtype">char</span> *)buffer,
00498                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"NOT OK"</span>),
00499                         (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (MISSING KEYS:"</span>) : <span class="stringliteral">""</span>,
00500                         (<span class="keywordtype">char</span> *)missingKeys,
00501                         (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">") "</span>) : <span class="stringliteral">""</span>,
00502                         (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (UNTRUSTED KEYS:"</span>) : <span class="stringliteral">""</span>,
00503                         (<span class="keywordtype">char</span> *)untrustedKeys,
00504                         (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">")"</span>) : <span class="stringliteral">""</span>);
00505 
00506             }
00507         } <span class="keywordflow">else</span> {
00508             <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) {
00509                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s"</span>, (<span class="keywordtype">char</span> *)buffer);
00510             } <span class="keywordflow">else</span> {
00511                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a87">RPMERR_SIGVFY</a>, <span class="stringliteral">"%s%s%s%s%s%s%s%s\n"</span>, (<span class="keywordtype">char</span> *)buffer,
00512                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"OK"</span>),
00513                         (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (MISSING KEYS:"</span>) : <span class="stringliteral">""</span>,
00514                         (<span class="keywordtype">char</span> *)missingKeys,
00515                         (missingKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">") "</span>) : <span class="stringliteral">""</span>,
00516                         (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">" (UNTRUSTED KEYS:"</span>) : <span class="stringliteral">""</span>,
00517                         (<span class="keywordtype">char</span> *)untrustedKeys,
00518                         (untrustedKeys[0] != <span class="charliteral">'\0'</span>) ? <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">")"</span>) : <span class="stringliteral">""</span>);
00519             }
00520         }
00521 
00522     bottom:
00523         <span class="keywordflow">if</span> (fd)         (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;fd, NULL, 0, 0);
00524         <span class="keywordflow">if</span> (ofd)        (void) <a class="code" href="lib_2rpmchecksig_8c.html#a0">manageFile</a>(&amp;ofd, NULL, 0, 0);
00525         <span class="keywordflow">if</span> (sigtarget) {
00526             (void) unlink(sigtarget);
00527             sigtarget = <a class="code" href="poptint_8h.html#a14">_free</a>(sigtarget);
00528         }
00529     }
00530 
00531     <span class="keywordflow">return</span> res;
00532 }
</pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:14:58 2002 for rpm by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.17 </small></address>
</body>
</html>