2 /* -------------------------------------------------------------------------- */
12 #include <sys/types.h>
16 /* -------------------------------------------------------------------------- */
18 static fd_set rd_fd_set;
19 static fd_set wr_fd_set;
20 static fd_set ex_fd_set;
22 /* -------------------------------------------------------------------------- */
24 static void signal_terminate(int);
25 static void signal_alarm(int);
26 static void signal_other(int);
27 static void set_timeval_ms(struct timeval* t, int ms);
29 /* -------------------------------------------------------------------------- */
31 void init_thread(void)
33 signal(SIGTERM, signal_terminate);
34 signal(SIGINT, signal_terminate);
35 signal(SIGQUIT, signal_terminate);
36 signal(SIGALRM, signal_alarm);
37 signal(SIGPIPE, signal_other);
38 signal(SIGCHLD, SIG_IGN);
39 signal(SIGHUP, SIG_IGN);
40 signal(SIGUSR1, SIG_IGN);
41 signal(SIGUSR2, SIG_IGN);
55 /* -------------------------------------------------------------------------- */
57 OTHER_THREAD void signal_terminate(int signum)
62 OTHER_THREAD void signal_alarm(int signum)
67 OTHER_THREAD void signal_other(int signum)
72 /* -------------------------------------------------------------------------- */
74 void set_callback(k_channel* chan, int rdwr)
76 if(rdwr & SETCB_RD) FD_SET(chan->priv->SOCK, &rd_fd_set);
77 if(rdwr & SETCB_WR) FD_SET(chan->priv->SOCK, &wr_fd_set);
80 void un_set_callback(k_channel* chan, int rdwr)
82 if(rdwr & SETCB_RD) FD_CLR(chan->priv->SOCK, &rd_fd_set);
83 if(rdwr & SETCB_WR) FD_CLR(chan->priv->SOCK, &wr_fd_set);
86 void poller(int no_block)
95 for(chan=k_channels; chan; chan=chan->next){
96 if(chan->priv->state==CHAN_CLOSE) continue;
97 if(highest < chan->priv->SOCK) highest=chan->priv->SOCK;
101 struct timeval* tp=&t;
102 set_timeval_ms(tp, no_block? 0: LOOP_TICK);
105 select(0, 0, 0, 0, tp);
107 if(!no_block) do_regular_things();
111 int len=select(highest+1, &rd, &wr, &ex, tp);
121 if(ERRNO==INTERRUPTED) return;
122 log_net_err("select", ERRNO);
128 for(chan=k_channels; chan; chan=chan->next){
129 if(FD_ISSET(chan->priv->SOCK, &ex)){
130 exception_socket(chan);
133 if(FD_ISSET(chan->priv->SOCK, &wr)){
134 int err; socklen_t len=sizeof(int);
135 if(getsockopt(chan->priv->SOCK,
137 SO_ERROR, &err, &len) || err){
138 exception_socket(chan);
142 writeable_socket(chan);
145 if(FD_ISSET(chan->priv->SOCK, &rd)){
146 readable_socket(chan);
151 void set_timeval_ms(struct timeval* t, int ms)
154 t->tv_usec=(ms-(t->tv_sec)*1000)*1000;
157 char* str_error(int e)
162 /* -------------------------------------------------------------------------- */
164 void stat_only(char* fullname, k_stat* kstat)
168 if(stat(fullname, &s)) return;
169 kstat->type=s.st_mode & 0170000;
170 kstat->size=s.st_size;
171 kstat->time=s.st_mtime;
172 kstat->perm=s.st_mode & 0007777;
175 FILE_T stat_open(char* fullname, k_stat* kstat)
177 stat_only(fullname, kstat);
178 if(!kstat->type) return 0;
179 FILE_T filehandle=open(fullname, O_RDONLY);
180 if(filehandle<0) return 0;
184 FILE_T open_only(char* fullname, int wr)
186 int rw=wr? O_RDWR|O_CREAT|O_TRUNC: O_RDONLY;
187 FILE_T filehandle=open(fullname, rw, 0644);
188 if(filehandle<0) return 0;
192 void* mmap_malloc(void* s, size_t size, int prot, int f, char* fullname, int o)
194 FILE_T fh=open(fullname, O_RDONLY, 0644);
195 if(fh<0) return MAP_FAILED;
197 char* data=k_malloc(size);
201 len=read(fh, data+charsread, size-charsread);
202 if(len< 0 && FERRNO(len)==EINTR) continue;
205 } while(charsread<size);
208 if(len<0 || charsread!=size){ k_free(data); return MAP_FAILED; }
212 void* mmap_name(void* s, size_t size, int prot, int f, char* fullname, int o)
214 if(!size) return MAP_FAILED;
215 int w=(prot & PROT_WRITE);
216 FILE_T fh=open(fullname, (w? O_RDWR|O_CREAT: O_RDONLY), 0644);
217 if(fh<0) return MAP_FAILED;
218 return mmap(s, size, prot, f, fh, o);
221 /* -------------------------------------------------------------------------- */
223 EXPORT void k_random_bytes(char* buf, size_t size)
225 *(short*)buf=getpid();
226 if(size!=2) k_log_err("Linux randomness not implemented yet!");
229 /* -------------------------------------------------------------------------- */
231 EXPORT void* k_malloc(size_t size)
233 void* p=malloc(size);
240 EXPORT void* k_realloc(void* o, size_t size)
242 void* p=realloc(o, size);
249 EXPORT void k_free(void* o)
254 EXPORT char* k_strdup(char* s)
264 EXPORT void* k_memdup(void* s, size_t size)
266 void* p=malloc(size);
274 /* -------------------------------------------------------------------------- */