| 136 | struct ff_zc_mbuf zc_buf; |
| 137 | |
| 138 | int loop(void *arg) |
| 139 | { |
| 140 | /* Wait for events to happen */ |
| 141 | unsigned nevents = ff_kevent(kq, NULL, 0, events, MAX_EVENTS, NULL); |
| 142 | unsigned i; |
| 143 | |
| 144 | buf_len = sizeof(html) - 1; |
| 145 | buf_tmp = html; |
| 146 | |
| 147 | for (i = 0; i < nevents; ++i) { |
| 148 | struct kevent event = events[i]; |
| 149 | int clientfd = (int)event.ident; |
| 150 | |
| 151 | /* Handle disconnect */ |
| 152 | if (event.flags & EV_EOF) { |
| 153 | /* Simply close socket */ |
| 154 | ff_close(clientfd); |
| 155 | #ifdef INET6 |
| 156 | } else if (clientfd == sockfd || clientfd == sockfd6) { |
| 157 | #else |
| 158 | } else if (clientfd == sockfd) { |
| 159 | #endif |
| 160 | int available = (int)event.data; |
| 161 | do { |
| 162 | int nclientfd = ff_accept(clientfd, NULL, NULL); |
| 163 | if (nclientfd < 0) { |
| 164 | ff_log(FF_LOG_ERR, FF_LOGTYPE_FSTACK_APP, "ff_accept failed:%d, %s\n", errno, |
| 165 | strerror(errno)); |
| 166 | break; |
| 167 | } |
| 168 | |
| 169 | /* Add to event list */ |
| 170 | EV_SET(&kevSet, nclientfd, EVFILT_READ, EV_ADD, 0, 0, NULL); |
| 171 | |
| 172 | if(ff_kevent(kq, &kevSet, 1, NULL, 0, NULL) < 0) { |
| 173 | ff_log(FF_LOG_ERR, FF_LOGTYPE_FSTACK_APP, "ff_kevent error:%d, %s\n", errno, |
| 174 | strerror(errno)); |
| 175 | return -1; |
| 176 | } |
| 177 | |
| 178 | available--; |
| 179 | } while (available); |
| 180 | } else if (event.filter == EVFILT_READ) { |
| 181 | char buf[256]; |
| 182 | size_t readlen = ff_read(clientfd, buf, sizeof(buf)); |
| 183 | #ifdef FSTACK_ZC_SEND |
| 184 | int ret = ff_zc_mbuf_get(&zc_buf, buf_len); |
| 185 | if (ret < 0) { |
| 186 | ff_log(FF_LOG_ERR, FF_LOGTYPE_FSTACK_APP, "ff_zc_mbuf_get failed, len:%d, errno:%d, %s\n", buf_len, errno, strerror(errno)); |
| 187 | exit(1); |
| 188 | } |
| 189 | |
| 190 | /* APP can call ff_zc_mbuf_write multi times */ |
| 191 | int len_part = 1440, off, to_write_len; |
| 192 | for (off = 0; off < buf_len;){ |
| 193 | to_write_len = (buf_len - off) > len_part ? len_part : (buf_len - off); |
| 194 | ret = ff_zc_mbuf_write(&zc_buf, (const char *)buf_tmp + off, to_write_len); |
| 195 | if (ret != to_write_len) { |
nothing calls this directly
no test coverage detected