2 /* -------------------------------------------------------------------------- */
14 /* -------------------------------------------------------------------------- */
16 static fd_set rd_fd_set;
17 static fd_set wr_fd_set;
18 static fd_set ex_fd_set;
20 /* -------------------------------------------------------------------------- */
22 static void signal_terminate(int);
23 static void signal_alarm(int);
24 static void signal_other(int);
25 static void set_timeval_ms(struct timeval* t, int ms);
27 /* -------------------------------------------------------------------------- */
29 void init_thread(void)
31 signal(SIGTERM, signal_terminate);
32 signal(SIGINT, signal_terminate);
33 signal(SIGQUIT, signal_terminate);
34 signal(SIGALRM, signal_alarm);
35 signal(SIGPIPE, signal_other);
36 signal(SIGCHLD, SIG_IGN);
37 signal(SIGHUP, SIG_IGN);
38 signal(SIGUSR1, SIG_IGN);
39 signal(SIGUSR2, SIG_IGN);
53 /* -------------------------------------------------------------------------- */
55 OTHER_THREAD void signal_terminate(int signum)
60 OTHER_THREAD void signal_alarm(int signum)
65 OTHER_THREAD void signal_other(int signum)
70 /* -------------------------------------------------------------------------- */
72 void set_callback(k_channel* chan, int rdwr)
74 if(rdwr & SETCB_RD) FD_SET(chan->priv->SOCK, &rd_fd_set);
75 if(rdwr & SETCB_WR) FD_SET(chan->priv->SOCK, &wr_fd_set);
78 void un_set_callback(k_channel* chan, int rdwr)
80 if(rdwr & SETCB_RD) FD_CLR(chan->priv->SOCK, &rd_fd_set);
81 if(rdwr & SETCB_WR) FD_CLR(chan->priv->SOCK, &wr_fd_set);
84 void poller(int no_block)
93 for(chan=k_channels; chan; chan=chan->next){
94 if(chan->priv->state==CHAN_CLOSE) continue;
95 if(highest < chan->priv->SOCK) highest=chan->priv->SOCK;
99 struct timeval* tp=&t;
100 set_timeval_ms(tp, no_block? 0: LOOP_TICK);
103 select(0, 0, 0, 0, tp);
105 if(!no_block) do_regular_things();
109 int len=select(highest+1, &rd, &wr, &ex, tp);
119 if(ERRNO==INTERRUPTED) return;
120 log_net_err("select", ERRNO);
126 for(chan=k_channels; chan; chan=chan->next){
127 if(FD_ISSET(chan->priv->SOCK, &ex)){
128 exception_socket(chan);
131 if(FD_ISSET(chan->priv->SOCK, &wr)){
132 int err; socklen_t len=sizeof(int);
133 if(getsockopt(chan->priv->SOCK,
135 SO_ERROR, &err, &len) || err){
136 exception_socket(chan);
140 writeable_socket(chan);
143 if(FD_ISSET(chan->priv->SOCK, &rd)){
144 readable_socket(chan);
149 void set_timeval_ms(struct timeval* t, int ms)
152 t->tv_usec=(ms-(t->tv_sec)*1000)*1000;
155 char* str_error(int e)
160 /* -------------------------------------------------------------------------- */
162 void stat_only(char* fullname, k_stat* kstat)
166 if(stat(fullname, &s)) return;
167 kstat->type=s.st_mode & 0170000;
168 kstat->size=s.st_size;
169 kstat->time=s.st_mtime;
170 kstat->perm=s.st_mode & 0007777;
173 FILE_T stat_open(char* fullname, k_stat* kstat)
175 stat_only(fullname, kstat);
176 if(!kstat->type) return 0;
177 FILE_T filehandle=open(fullname, O_RDONLY);
178 if(filehandle<0) return 0;
182 FILE_T open_only(char* fullname, int wr)
184 int rw=wr? O_RDWR|O_CREAT|O_TRUNC: O_RDONLY;
185 FILE_T filehandle=open(fullname, rw, 0644);
186 if(filehandle<0) return 0;
190 void* mmap_malloc(void* s, size_t size, int prot, int f, char* fullname, int o)
192 FILE_T fh=open(fullname, O_RDONLY, 0644);
193 if(fh<0) return MAP_FAILED;
195 char* data=k_malloc(size);
199 len=read(fh, data+charsread, size-charsread);
200 if(len< 0 && FERRNO(len)==EINTR) continue;
203 } while(charsread<size);
206 if(len<0 || charsread!=size){ k_free(data); return MAP_FAILED; }
210 void* mmap_name(void* s, size_t size, int prot, int f, char* fullname, int o)
212 if(!size) return MAP_FAILED;
213 int w=(prot & PROT_WRITE);
214 FILE_T fh=open(fullname, (w? O_RDWR|O_CREAT: O_RDONLY), 0644);
215 if(fh<0) return MAP_FAILED;
216 return mmap(s, size, prot, f, fh, o);
219 /* -------------------------------------------------------------------------- */
221 EXPORT void k_random_bytes(char* buf, size_t size)
223 *(short*)buf=getpid();
224 if(size!=2) k_log_err("Linux randomness not implemented yet!");
227 /* -------------------------------------------------------------------------- */
229 EXPORT void* k_malloc(size_t size)
231 void* p=malloc(size);
238 EXPORT void* k_realloc(void* o, size_t size)
240 void* p=realloc(o, size);
247 EXPORT void k_free(void* o)
252 EXPORT char* k_strdup(char* s)
262 EXPORT void* k_memdup(void* s, size_t size)
264 void* p=malloc(size);
272 /* -------------------------------------------------------------------------- */