source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecs/rpc/tSocketServer.c@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 7.5 KB
Line 
1/*
2 * TECS Generator
3 * Generator for TOPPERS Embedded Component System
4 *
5 * Copyright (C) 2008-2013 by TOPPERS Project
6 *--
7 * 上記著作権者
8は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再é…
11å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再é…
17å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
18å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
19 * 者
20マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
25 * と.
26 * (a) 再é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
28マニュアルなど)に,上記の著
29 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
30 * (b) 再é…
31å¸ƒã®å½¢æ…
32‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
33 * 報告すること.
34 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35 * 害からも,上記著作権者
36およびTOPPERSプロジェクトをå…
37è²¬ã™ã‚‹ã“と.
38 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
39 * 由に基づく請求からも,上記著作権者
40およびTOPPERSプロジェクトを
41 * å…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
47 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
48 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49 * の責任を負わない.
50 *
51 * $Id: tSocketServer.c 270 2017-02-09 04:03:47Z coas-nagasima $
52 */
53
54/* #[<PREAMBLE>]#
55 * #[<...>]# から #[</...>]# で囲まれたコメントは編集しないでください
56 * tecsmerge によるマージに使用されます
57 *
58 * 属性アクセスマクロ #_CAAM_#
59 * portNo int16_t ATTR_portNo
60 * sd int_t VAR_sd
61 *
62 * #[</PREAMBLE>]# */
63
64#include "tSocketServer_tecsgen.h"
65
66#include <errno.h>
67#include <fcntl.h>
68#include <sys/socket.h>
69#include <sys/types.h>
70#include <arpa/inet.h>
71#include <unistd.h>
72#include "errno2ER.h"
73
74#ifndef E_OK
75#define E_OK 0 /* 正常終了 */
76#define E_ID (-18) /* 不正ID番号 */
77#endif
78
79
80/* 受け口関数 #_TEPF_# */
81/* #[<ENTRY_PORT>]# eC1
82 * entry port: eC1
83 * signature: sChannel
84 * context: task
85 * #[</ENTRY_PORT>]# */
86
87/* #[<ENTRY_FUNC>]# eC1_send
88 * name: eC1_send
89 * global_name: tSocketServer_eC1_send
90 * oneway: false
91 * #[</ENTRY_FUNC>]# */
92ER
93eC1_send(CELLIDX idx, const int8_t* buf, int16_t size, TMO tmo)
94{
95 ER ercd = E_OK;
96 CELLCB *p_cellcb;
97 int sz;
98
99 if (VALID_IDX(idx)) {
100 p_cellcb = GET_CELLCB(idx);
101 }
102 else {
103 return(E_ID);
104 }
105
106 /* ここに処理本体を記述します */
107#ifdef DEBUG
108 syslog( LOG_INFO, "tSocketServer: send" );
109 {
110 int i;
111 for( i = 0; i < size; i++ ){
112 printf( "%02X ", (unsigned char)buf[i] );
113 if( i % 8 == 7 )
114 putchar( '\n' );
115 }
116 putchar( '\n' );
117 }
118#endif
119 while(size>0){
120 if((sz=write( VAR_sd, buf, (size_t)size )) < 0 ){
121 ercd = errno2ER( errno );
122 break;
123 }
124 else{
125 size -= sz;
126 }
127 }
128
129 return(ercd);
130}
131
132/* #[<ENTRY_FUNC>]# eC1_flush
133 * name: eC1_flush
134 * global_name: tSocketServer_eC1_flush
135 * oneway: false
136 * #[</ENTRY_FUNC>]# */
137ER
138eC1_flush(CELLIDX idx, TMO tmo)
139{
140 ER ercd = E_OK;
141 CELLCB *p_cellcb;
142 if (VALID_IDX(idx)) {
143 p_cellcb = GET_CELLCB(idx);
144 }
145 else {
146 return(E_ID);
147 }
148
149 /* ここに処理本体を記述します */
150
151 return(ercd);
152}
153
154/* #[<ENTRY_FUNC>]# eC1_receive
155 * name: eC1_receive
156 * global_name: tSocketServer_eC1_receive
157 * oneway: false
158 * #[</ENTRY_FUNC>]# */
159ER_UINT
160eC1_receive(CELLIDX idx, int8_t* buf, int16_t size, TMO tmo)
161{
162 ER ercd = E_OK;
163 ER_UINT sz;
164 CELLCB *p_cellcb;
165
166 if (VALID_IDX(idx)) {
167 p_cellcb = GET_CELLCB(idx);
168 }
169 else {
170 return(E_ID);
171 }
172
173 /* ここに処理本体を記述します */
174 if( (sz=read( VAR_sd, buf, (size_t)size )) < 0 )
175 ercd = errno2ER( errno );
176 else
177 ercd = sz;
178
179 return(ercd);
180}
181
182/* #[<ENTRY_FUNC>]# eC1_end_receive
183 * name: eC1_end_receive
184 * global_name: tSocketServer_eC1_end_receive
185 * oneway: false
186 * #[</ENTRY_FUNC>]# */
187ER
188eC1_end_receive(CELLIDX idx)
189{
190 ER ercd = E_OK;
191 CELLCB *p_cellcb;
192 if (VALID_IDX(idx)) {
193 p_cellcb = GET_CELLCB(idx);
194 }
195 else {
196 return(E_ID);
197 }
198
199 /* ここに処理本体を記述します */
200
201 return(ercd);
202}
203
204/* #[<ENTRY_FUNC>]# eC1_reset
205 * name: eC1_reset
206 * global_name: tSocketServer_eC1_reset
207 * oneway: false
208 * #[</ENTRY_FUNC>]# */
209ER
210eC1_reset(CELLIDX idx)
211{
212 ER ercd = E_OK;
213 CELLCB *p_cellcb;
214 if (VALID_IDX(idx)) {
215 p_cellcb = GET_CELLCB(idx);
216 }
217 else {
218 return(E_ID);
219 }
220
221 /* ここに処理本体を記述します */
222 syslog( LOG_INFO, "tSocketServer: reset" );
223
224 return(ercd);
225}
226
227/* #[<ENTRY_PORT>]# eOpener
228 * entry port: eOpener
229 * signature: sServerChannelOpener
230 * context: task
231 * #[</ENTRY_PORT>]# */
232
233/* #[<ENTRY_FUNC>]# eOpener_open
234 * name: eOpener_open
235 * global_name: tSocketServer_eOpener_open
236 * oneway: false
237 * #[</ENTRY_FUNC>]# */
238ER
239eOpener_open(CELLIDX idx)
240{
241 ER ercd = E_OK;
242 CELLCB *p_cellcb;
243 int ssoc, soc;
244 struct sockaddr_in addr={ AF_INET };
245
246 if (VALID_IDX(idx)) {
247 p_cellcb = GET_CELLCB(idx);
248 }
249 else {
250 return(E_ID);
251 }
252
253 /* ここに処理本体を記述します #_TEFB_# */
254 syslog( LOG_INFO, "tSocketServer: open" );
255
256 ssoc=socket(AF_INET,SOCK_STREAM,0);
257 if(ssoc<0){
258 ercd = errno2ER( errno );
259 syslog( LOG_INFO, "tSocketServer: socket failed" );
260 return ercd;
261 }
262
263 addr.sin_port = htons(ATTR_portNo);
264 addr.sin_addr.s_addr = INADDR_ANY;
265 if(bind(ssoc,(struct sockaddr*)&addr,sizeof(addr))<0){
266 ercd = errno2ER( errno );
267 syslog( LOG_INFO, "tSocketServer: bind failed" );
268 return ercd;
269 }
270
271 if(listen(ssoc, 1 )<0){
272 ercd = errno2ER( errno );
273 syslog( LOG_INFO, "tSocketServer: listen failed" );
274 return ercd;
275 }
276
277 soc=accept(ssoc, NULL, NULL);
278 if(soc<0){
279 ercd = errno2ER( errno );
280 syslog( LOG_INFO, "tSocketServer: accept failed" );
281 return ercd;
282 }
283 syslog( LOG_INFO, "tSocketServer: accepted" );
284
285 close( ssoc );
286 VAR_sd = soc;
287
288 return(ercd);
289}
290
291/* #[<ENTRY_FUNC>]# eOpener_close
292 * name: eOpener_close
293 * global_name: tSocketServer_eOpener_close
294 * oneway: false
295 * #[</ENTRY_FUNC>]# */
296ER
297eOpener_close(CELLIDX idx)
298{
299 ER ercd = E_OK;
300 CELLCB *p_cellcb;
301 if (VALID_IDX(idx)) {
302 p_cellcb = GET_CELLCB(idx);
303 }
304 else {
305 return(E_ID);
306 }
307
308 /* ここに処理本体を記述します #_TEFB_# */
309 syslog( LOG_INFO, "tSocketServer: close" );
310 if( close( VAR_sd ) < 0 )
311 ercd = errno2ER( errno );
312
313 return(ercd);
314}
315
316/* #[<POSTAMBLE>]#
317 * これより下に非受け口関数を書きます
318 * #[</POSTAMBLE>]#*/
Note: See TracBrowser for help on using the repository browser.