jacc

Jabber/XMPP client for Plan 9
git clone git://r-36.net/jacc
Log | Files | Refs | LICENSE

dat.c (4449B)


      1 /*
      2  * Copy me if you can.
      3  * by 20h
      4  */
      5 
      6 #include <u.h>
      7 #include <libc.h>
      8 #include "dat.h"
      9 
     10 char *wdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 0};
     11 char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
     12 			   "Sep", "Oct", "Nov", "Dec", 0};
     13 
     14 int
     15 fileexists(char *path)
     16 {
     17 	uchar buf[STATMAX];
     18 	int fd;
     19 
     20 	fd = stat(path, buf, STATMAX);
     21 	if(fd < 0)
     22 		return 0;
     23 
     24 	close(fd);
     25 	return 1;
     26 }
     27 
     28 void
     29 playmp3(char *file)
     30 {
     31 	char cmd[256];
     32 
     33 	if(!fileexists("/dev/audio"))
     34 		return;
     35 
     36 	memset(cmd, 0, 256);
     37 	strncpy(cmd, file, 255);
     38 	if(getenv("home") != nil){
     39 		snprint(cmd, 255, "%s/audio/%s", getenv("home"), file);
     40 		if(!fileexists(cmd))
     41 			strncpy(cmd, file, 255);
     42 	}
     43 	if(!fileexists(cmd))
     44 		return;
     45 
     46 	if(fork() == 0)
     47 		execl("/bin/madplay", "madplay", "-Q", cmd, 0);
     48 	wait();
     49 }
     50 
     51 void *
     52 reallocj(void *p, int s, short d)
     53 {
     54 	p = realloc(p, s);
     55 	if(p == nil)
     56 		sysfatal("realloc: %r");
     57 
     58 	if(d != 0)
     59 		memset(p, 0, s);
     60 
     61 	return (void *)p;
     62 }
     63 
     64 void
     65 killproc(int p)
     66 {
     67 	char *e;
     68 	int fd;
     69 
     70 	e = mallocz(65, 2);
     71 	snprint(e, 64, "/proc/%d/ctl", p);
     72 
     73 	fd = open(e, OWRITE);
     74 	if(fd != -1){
     75 		write(fd, "kill", 4);
     76 		close(fd);
     77 	}
     78 	free(e);
     79 }
     80 
     81 char *
     82 setwindowlbl(char *w)
     83 {
     84 	int s;
     85 
     86 	s = open("/dev/label", OWRITE);
     87 	if(s < 0)
     88 		return nil;
     89 
     90 	write(s, w, strlen(w));
     91 
     92 	close(s);
     93 	return w;
     94 }
     95 
     96 char *
     97 getwindowlbl(void)
     98 {
     99 	int s;
    100 	char *ret;
    101 	short i;
    102 
    103 	s = open("/dev/label", OREAD);
    104 	if(s < 0)
    105 		return nil;
    106 
    107 	i = 0;
    108 	ret = malloc(0);
    109 	while(realloc(ret, ++i) != nil && read(s, &ret[i - 1], 1) > 0 &&
    110 			i < 513);
    111 
    112 	ret[i - 1] = '\0';
    113 
    114 	close(s);
    115 	return ret;
    116 }
    117 
    118 char *
    119 mktmstmp(char bord, char bord_e)
    120 {
    121 	Tm *tim;
    122 	char *ret;
    123 
    124 	ret = reallocj(nil, 32, 2);
    125 	tim = localtime(time(0));
    126 	snprint(ret, 31, "%c%.2d:%.2d%c ", bord, tim->hour, tim->min, bord_e);
    127 
    128 	return ret;
    129 }
    130 
    131 char *
    132 setchan(char *old, char *new)
    133 {
    134 	old = reallocj(old, strlen(new) + 1, 2);
    135 	strcpy(old, new);
    136 
    137 	return old;
    138 }
    139 
    140 char *
    141 printjid(char *user, char *serv, char *reso)
    142 {
    143 	char *ret;
    144 	int i;
    145 
    146 	if(user == nil || serv == nil)
    147 		return nil;
    148 
    149 	i = strlen(user) + strlen(serv) + 3 + ((reso != nil) ? strlen(reso) : 0);
    150 
    151 	ret = reallocj(nil, i, 2);
    152 	snprint(ret, i, "%s@%s%s%s", user, serv, (reso != nil) ? "/" : "\0",
    153 				((reso != nil) ? reso : ""));
    154 
    155 	return ret;
    156 }
    157 
    158 char *
    159 getarg(char *b, char n, char t)
    160 {
    161 	char *ret, delim;
    162 
    163 	ret = nil;
    164 
    165 	while(n-- > 0){
    166 		if(*b == '\'' || *b == '\"'){
    167 			delim = *b;
    168 			b++;
    169 			ret = strchr(b, delim);
    170 		} else
    171 			ret = strchr(b, ' ');
    172 		if(ret == nil)
    173 			return nil;
    174 
    175 		b = ret + 1;
    176 	}
    177 
    178 	if(t == 0)
    179 		b = strchr(ret + 1, ' ');
    180 	else
    181 		b = nil;
    182 
    183 	if(b == nil)
    184 		ret = strdup(ret + 1);
    185 	else {
    186 		n = *b;
    187 		*b = '\0';
    188 		ret = strdup(ret + 1);
    189 		*b = n;
    190 	}
    191 
    192 	ret = filterhin(ret, 2);
    193 
    194 	return ret;
    195 }
    196 
    197 void
    198 readwrite(int sock, int fd)
    199 {
    200 	char *b;
    201 	int l;
    202 
    203 	l = 2048;
    204 	b = reallocj(nil, 2048, 2);
    205 	while(l == 2048){
    206 		l = read(fd, b, 2048);
    207 		if(l > 0)
    208 			write(sock, b, l);
    209 	}
    210 
    211 	free(b);
    212 	return;
    213 }
    214 
    215 char *
    216 getmonth(int m)
    217 {
    218 	if(m > 11 || m < 0)
    219 		return nil;
    220 
    221 	return month[m];
    222 }
    223 
    224 char *
    225 getday(int d)
    226 {
    227 	if(d > 6 || d < 0)
    228 		return nil;
    229 
    230 	return wdays[d];
    231 }
    232 
    233 char *
    234 filterhin(char *in, int a)
    235 {
    236 	char *ret, *z;
    237 	int l;
    238 
    239 	l = 0;
    240 	ret = reallocj(nil, 1, 0);
    241 	z = in;
    242 
    243 	while(*in != '\0'){
    244 		switch(*in){
    245 		case '<':
    246 			l += 4;
    247 			ret = reallocj(ret, l + 1, 0);
    248 			strncpy(&ret[l - 4], "&lt;", 4);
    249 			break;
    250 		case '&':
    251 			l += 5;
    252 			ret = reallocj(ret, l + 1, 0);
    253 			strncpy(&ret[l - 5], "&amp;", 5);
    254 			break;
    255 		case '>':
    256 			l += 4;
    257 			ret = reallocj(ret, l + 1, 0);
    258 			strncpy(&ret[l - 4], "&gt;", 4);
    259 			break;
    260 		case '"':
    261 			l += 6;
    262 			ret = reallocj(ret, l + 1, 0);
    263 			strncpy(&ret[l - 6], "&quot;", 6);
    264 			break;
    265 		default:
    266 			ret = reallocj(ret, ++l + 1, 0);
    267 			ret[l - 1] = *in;
    268 			break;
    269 		}
    270 		in++;
    271 	}
    272 	ret[l] = '\0';
    273 
    274 	if(a != 0)
    275 		free(z);
    276 
    277 	return ret;
    278 }
    279 
    280 char *
    281 filterzur(char *out)
    282 {
    283 	char *a, *b;
    284 	int changed;
    285 
    286 	changed = 1;
    287 
    288 	while(changed){
    289 		changed = 0;
    290 		if((a = strstr(out, "&lt;")) != nil) {
    291 			*a = '<';
    292 			strcpy(a + 1, a + 4);
    293 			changed = 1;
    294 		}
    295 		if((a = strstr(out, "&gt;")) != nil) {
    296 			*a = '>';
    297 			strcpy(a + 1, a + 4);
    298 			changed = 1;
    299 		}
    300 		if((a = strstr(out, "&quot;")) != nil) {
    301 			*a = '"';
    302 			strcpy(a + 1, a + 6);
    303 			changed = 1;
    304 		}
    305 		if((a = strstr(out, "&amp;")) != nil) {
    306 			*a = '&';
    307 			strcpy(a + 1, a + 5);
    308 			changed = 1;
    309 		}
    310 		if((a = strstr(out, "text/x-aolrtf;")) != nil) {
    311 			b = strchr(a, ':');
    312 			if(b != nil) {
    313 				strcpy(a, b + 2);
    314 				changed = 1;
    315 			}
    316 		}
    317 	}
    318 
    319 	return out;
    320 }