OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / sources / lib / libms / alget_write.c
1 // alget_write.c
2 // $Id: alget_write.c,v 1.2 2007/11/01 06:11:01 sendan Exp $
3 // masashi shimakura
4
5 #include<stdio.h>
6 #include<stdlib.h>
7 #include<string.h>
8
9 #include"almemsys.h"
10
11
12 // int alget_write(int, FILE *, int, char, int, int);
13
14
15 // FPから一行ずつ読み出したデータをネゴしながら一定量小分けでsendする関数
16 // mode 1 client -> server でデータを送る場合、最後はserverから受け取って終了 400
17 // mode 0 server -> client の場合、自分からの送信を最後に終了 300
18
19 int alget_write(int sock_fd, FILE * fp, int interval, char delim, int file_len, int mode)
20 {
21 char * swap;
22 char * data;
23 int ch, counts, stat;
24
25 ch = 0;
26 counts = 0;
27 stat = 0;
28 swap = (char *)calloc(BUF_DEFLEN, sizeof(char));
29 data = (char *)calloc(BUF_DEFLEN, sizeof(char));
30
31 while(1){
32
33    if(ch >=0){
34
35       // 行単位で一定量のBUFを作る
36       while(1){
37          swap = safe_fpcat(fp, swap, &ch, BUF_MAX);      // file から一行swapに読む
38          swap = safe_strncat(swap, "\n", BUF_MAX);       // 最後に改行追加
39          data = safe_strncat(data, swap, BUF_MAX);       // data の後ろにつなぐ
40          if( file_len < (int)strlen(data) || ch < 0){    // 4K越えるか、読めない場合
41             break;
42             }
43          }   // while
44
45       swap_mem(data, '\n', (char)delim);  // '\n'を'0x05'に置き換え
46       counts = mem_count(data, (char)delim);            // 最後に0x05がある位置
47       data[counts] = '\n';                              // 最後の0x05を改行に
48       }
49
50    if(1 < (int)strlen(data)){                           // data が1以上なのでdata送信
51       stat = socket_send(sock_fd, data, interval);
52       data[0] = (char)0x00;
53       }
54    else if(ch < 0){                                     // data 1以下なので終了送信
55       if(mode == 1){
56          stat = socket_send(sock_fd, "400OK: stop send data\n", interval);
57          swap = select_fdcat(sock_fd, swap, &stat, BUF_MAX, interval);
58          }
59       else{
60          stat = socket_send(sock_fd, "400OK: stop send data\n", interval);
61          }
62       break;
63       }
64
65    // more を受け取る
66    swap = select_fdcat(sock_fd, swap, &stat, BUF_MAX, interval);
67    if(stat < 0 || 0 != memcmp(swap, "MORE", 4)){
68       stat = socket_send(sock_fd, "500 NG file_send2(): not stat.\n", interval);
69       break;
70       }
71
72    }  // while
73
74 free(swap);
75 free(data);
76
77 return stat;
78 }
79
80
81
82
83
84
85
86
87
88