1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>KLone: ppc.c Source File</title>
<link href="kl.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.9.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a> / <a class="el" href="dir_000003.html">kloned</a></div>
<h1>ppc.c</h1><a href="ppc_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * Copyright (c) 2005, 2006 by KoanLogic s.r.l. <http://www.koanlogic.com></span>
00003 <span class="comment"> * All rights reserved.</span>
00004 <span class="comment"> *</span>
00005 <span class="comment"> * This file is part of KLone, and as such it is subject to the license stated</span>
00006 <span class="comment"> * in the LICENSE file which you have received as part of this distribution.</span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * $Id: ppc.c,v 1.12 2006/01/09 12:38:38 tat Exp $</span>
00009 <span class="comment"> */</span>
00010
00011 <span class="preprocessor">#include "klone_conf.h"</span>
00012 <span class="preprocessor">#include <u/libu.h></span>
00013 <span class="preprocessor">#include <<a class="code" href="ppc_8h.html">klone/ppc.h</a>></span>
00014
00015 <span class="keyword">struct </span>ppc_header_s
00016 {
00017 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cmd;
00018 size_t size;
00019 };
00020
<a name="l00021"></a><a class="code" href="ppc_8c.html#a0">00021</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>ppc_header_s <a class="code" href="ppc_8c.html#a0">ppc_header_t</a>;
00022
00023 <span class="keyword">struct </span>ppc_s
00024 {
00025 <a class="code" href="ppc_8h.html#a1">ppc_cb_t</a> ftb[256]; <span class="comment">/* function pointers */</span>
00026 <span class="keywordtype">void</span> *arg[256]; <span class="comment">/* opaque function arguments */</span>
00027 };
00028
<a name="l00029"></a><a class="code" href="ppc_8h.html#a5">00029</a> <span class="keywordtype">int</span> <a class="code" href="ppc_8h.html#a5">ppc_register</a>(<a class="code" href="ppc_8h.html#a0">ppc_t</a> *ppc, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cmd, ppc_cb_t cb, <span class="keywordtype">void</span> *arg)
00030 {
00031 dbg_err_if (ppc == NULL);
00032 dbg_err_if (cb == NULL);
00033
00034 ppc->ftb[cmd] = cb;
00035 ppc->arg[cmd] = arg;
00036
00037 <span class="keywordflow">return</span> 0;
00038 err:
00039 <span class="keywordflow">return</span> ~0;
00040 }
00041
00042 <span class="keyword">static</span> ssize_t ppc_do_read(<span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> *data, size_t size)
00043 {
00044 ssize_t n;
00045
00046 dbg_return_if (fd < 0, -1);
00047 dbg_return_if (data == NULL, -1);
00048
00049 again:
00050 n = read(fd, data, size);
00051 <span class="keywordflow">if</span>(n < 0 && errno == EINTR)
00052 <span class="keywordflow">goto</span> again;
00053
00054 <span class="keywordflow">return</span> n;
00055 }
00056
00057 <span class="keyword">static</span> ssize_t ppc_do_write(<span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> *data, size_t size)
00058 {
00059 ssize_t n;
00060
00061 dbg_return_if (fd < 0, -1);
00062 dbg_return_if (data == NULL, -1);
00063
00064 again:
00065 n = write(fd, data, size);
00066 <span class="keywordflow">if</span>(n < 0 && errno == EINTR)
00067 <span class="keywordflow">goto</span> again;
00068
00069 <span class="keywordflow">return</span> n;
00070 }
00071
<a name="l00072"></a><a class="code" href="ppc_8h.html#a7">00072</a> ssize_t <a class="code" href="ppc_8h.html#a7">ppc_write</a>(<a class="code" href="ppc_8h.html#a0">ppc_t</a> *ppc, <span class="keywordtype">int</span> fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cmd, <span class="keywordtype">char</span> *data,
00073 size_t size)
00074 {
00075 ssize_t n;
00076 <a class="code" href="ppc_8c.html#a0">ppc_header_t</a> h;
00077
00078 dbg_return_if (ppc == NULL, -1);
00079 dbg_return_if (data == NULL, -1);
00080 dbg_return_if (fd < 0, -1);
00081
00082 memset(&h, 0, <span class="keyword">sizeof</span>(<a class="code" href="ppc_8c.html#a0">ppc_header_t</a>));
00083 h.cmd = cmd;
00084 h.size = size;
00085
00086 n = ppc_do_write(fd, (<span class="keywordtype">char</span>*)&h, <span class="keyword">sizeof</span>(<a class="code" href="ppc_8c.html#a0">ppc_header_t</a>));
00087 <span class="keywordflow">if</span>(n <= 0) <span class="comment">/* error */</span>
00088 <span class="keywordflow">return</span> n;
00089
00090 n = ppc_do_write(fd, data, size);
00091 <span class="keywordflow">if</span>(n <= 0) <span class="comment">/* error */</span>
00092 <span class="keywordflow">return</span> n;
00093
00094 <span class="keywordflow">return</span> 1;
00095 }
00096
<a name="l00097"></a><a class="code" href="ppc_8h.html#a8">00097</a> ssize_t <a class="code" href="ppc_8h.html#a8">ppc_read</a>(<a class="code" href="ppc_8h.html#a0">ppc_t</a> *ppc, <span class="keywordtype">int</span> fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *pcmd, <span class="keywordtype">char</span> *data,
00098 size_t size)
00099 {
00100 <a class="code" href="ppc_8c.html#a0">ppc_header_t</a> h;
00101 ssize_t n;
00102
00103 dbg_return_if (ppc == NULL, -1);
00104 dbg_return_if (pcmd == NULL, -1);
00105 dbg_return_if (data == NULL, -1);
00106 dbg_return_if (fd < 0, -1);
00107
00108 n = ppc_do_read(fd, (<span class="keywordtype">char</span>*)&h, <span class="keyword">sizeof</span>(<a class="code" href="ppc_8c.html#a0">ppc_header_t</a>));
00109 <span class="keywordflow">if</span>(n <= 0) <span class="comment">/* error or eof */</span>
00110 <span class="keywordflow">return</span> n;
00111
00112 <span class="comment">/* buffer too small or cmd bigger then max allowed size */</span>
00113 <span class="keywordflow">if</span>(h.size > size || h.size > PPC_MAX_DATA_SIZE)
00114 dbg(<span class="stringliteral">"ppc error h.cmd: %d h.size: %lu"</span>, h.cmd, h.size);
00115 dbg_return_if(h.size > size || h.size > <a class="code" href="ppc_8h.html#a9a2">PPC_MAX_DATA_SIZE</a>, -1);
00116
00117 n = ppc_do_read(fd, data, h.size);
00118 <span class="keywordflow">if</span>(n <= 0) <span class="comment">/* error or eof */</span>
00119 <span class="keywordflow">return</span> n;
00120
00121 *pcmd = h.cmd;
00122
00123 <span class="keywordflow">return</span> h.size;
00124 }
00125
<a name="l00126"></a><a class="code" href="ppc_8h.html#a6">00126</a> <span class="keywordtype">int</span> <a class="code" href="ppc_8h.html#a6">ppc_dispatch</a>(<a class="code" href="ppc_8h.html#a0">ppc_t</a> *ppc, <span class="keywordtype">int</span> fd, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cmd, <span class="keywordtype">char</span> *data, size_t size)
00127 {
00128 dbg_err_if (ppc == NULL);
00129 dbg_err_if (ppc->ftb[cmd] == NULL);
00130
00131 ppc->ftb[cmd](ppc, fd, cmd, data, size, ppc->arg[cmd]);
00132
00133 <span class="keywordflow">return</span> 0;
00134 err:
00135 <span class="keywordflow">return</span> ~0;
00136 }
00137
<a name="l00138"></a><a class="code" href="ppc_8h.html#a4">00138</a> <span class="keywordtype">int</span> <a class="code" href="ppc_8h.html#a4">ppc_free</a>(<a class="code" href="ppc_8h.html#a0">ppc_t</a> *ppc)
00139 {
00140 U_FREE(ppc);
00141 <span class="keywordflow">return</span> 0;
00142 }
00143
<a name="l00144"></a><a class="code" href="ppc_8h.html#a3">00144</a> <span class="keywordtype">int</span> <a class="code" href="ppc_8h.html#a3">ppc_create</a>(<a class="code" href="ppc_8h.html#a0">ppc_t</a> **pppc)
00145 {
00146 <a class="code" href="ppc_8h.html#a0">ppc_t</a> *ppc = NULL;
00147
00148 dbg_err_if (pppc == NULL);
00149
00150 ppc = u_zalloc(<span class="keyword">sizeof</span>(<a class="code" href="ppc_8h.html#a0">ppc_t</a>));
00151 dbg_err_if(ppc == NULL);
00152
00153 *pppc = ppc;
00154
00155 <span class="keywordflow">return</span> 0;
00156 err:
00157 <span class="keywordflow">return</span> ~0;
00158 }
00159
</pre></div><hr>
<div>
<div style="text-align:left">
<a href="http://www.koanlogic.com/kl/cont/gb/html/products.html">←Products</a>
</div>
<div style="text-align:center;">
© 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
</div>
</div>
</body>
</html>
|