OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / libms / safe_fdcat.c
1 // safe_fdcat.c
2 // masashi shimakura 20140223
3
4 #include<stdio.h>
5 #include<string.h>
6 #include<stdlib.h>
7 #include<errno.h>
8 #include<unistd.h>
9
10 #include "libms.h"
11
12
13 char * safe_fdcat(int sk, char * all_data, int * stat, int max_len, int interval)
14 {
15 char buff[BUF_DEFLEN];
16 int indata, allcu;
17
18 allcu = 0;
19
20 if(all_data == NULL){
21    all_data = (char *)calloc(BUF_DEFLEN, sizeof(char));
22    }
23 else{
24    all_data = null_free(all_data);
25    }
26
27 while(1){
28    if((indata = socket_reads(sk, buff, sizeof(buff), interval)) > 0){
29       if(NULL != (strchr(buff, (int)'\n'))){
30          allcu = allcu + indata;
31          #ifdef SOCKET_BUG
32          fprintf(stderr,"safe_fdcat(1): 改行読んだし 脱出! 全部で %d バイト読んだよ!\n", allcu);
33          #endif
34          buff[indata] = (char)0x00;
35          all_data = safe_strncat(all_data, buff, BUF_MAX);
36          break;
37          }
38       else{
39          allcu = allcu + indata;
40          #ifdef SOCKET_BUG
41          fprintf(stderr,"sfe_fdcat(2): %d バイト足して、いまんとこ %d バイト読んだよ!\n",
42            indata, allcu);
43          #endif
44          buff[indata] = (char)0x00;
45          all_data = safe_strncat(all_data, buff, BUF_MAX);
46          if(allcu > max_len){
47             #ifdef SOCKET_BUG
48             fprintf(stderr,"safe_fdcat(3): たいへんだぁー! %d も読んでるよ、おなかいっぱい\n", allcu);
49             #endif
50             all_data = safe_memcpy(all_data, "\n", BUF_MAX);
51             allcu = -1;
52             break;
53             }
54          }
55       }
56    else{
57       #ifdef SOCKET_BUG
58       fprintf(stderr,"safe_fdcat(4): recv失敗したし 脱出! \n");
59       #endif
60       allcu = -1;
61       all_data = safe_memcpy(all_data, "\n", BUF_MAX);
62       break;
63       }
64    }  // while()
65
66
67 * stat = allcu;
68 return all_data;
69
70 }
71
72
73