File: ppc_8c-source.html

package info (click to toggle)
klone 1.1.1.dfsg1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,480 kB
  • ctags: 4,238
  • sloc: ansic: 16,288; makefile: 384; sh: 351
file content (180 lines) | stat: -rw-r--r-- 9,538 bytes parent folder | download
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&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a>&nbsp;/&nbsp;<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. &lt;http://www.koanlogic.com&gt;</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 &lt;u/libu.h&gt;</span>
00013 <span class="preprocessor">#include &lt;<a class="code" href="ppc_8h.html">klone/ppc.h</a>&gt;</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-&gt;ftb[cmd] = cb;
00035     ppc-&gt;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 &lt; 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 &lt; 0 &amp;&amp; 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 &lt; 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 &lt; 0 &amp;&amp; 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 &lt; 0, -1);
00081 
00082     memset(&amp;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>*)&amp;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 &lt;= 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 &lt;= 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 &lt; 0, -1);
00107 
00108     n = ppc_do_read(fd, (<span class="keywordtype">char</span>*)&amp;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 &lt;= 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 &gt; size || h.size &gt; 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 &gt; size || h.size &gt; <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 &lt;= 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-&gt;ftb[cmd] == NULL);
00130 
00131     ppc-&gt;ftb[cmd](ppc, fd, cmd, data, size, ppc-&gt;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">&larr;Products</a>
  </div>
  <div style="text-align:center;">
    &copy; 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
  </div>
</div>

</body>
</html>