source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecs/rpc/tSocketServer.c@ 389

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

ビルドが通るよう更新

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