1 | /* |
1 | /* |
2 | * static char *rcsid_init_c = |
2 | * static char *rcsid_init_c = |
3 | * "$Id: image.C,v 1.1 2006/08/13 17:16:05 elmex Exp $"; |
3 | * "$Id: image.C,v 1.2 2006/08/29 08:01:38 root Exp $"; |
4 | */ |
4 | */ |
5 | |
5 | |
6 | /* |
6 | /* |
7 | CrossFire, A Multiplayer game for X-windows |
7 | CrossFire, A Multiplayer game for X-windows |
8 | |
8 | |
… | |
… | |
82 | void free_socket_images(void) |
82 | void free_socket_images(void) |
83 | { |
83 | { |
84 | int num,q; |
84 | int num,q; |
85 | |
85 | |
86 | for(num=0;num<MAX_FACE_SETS; num++) { |
86 | for(num=0;num<MAX_FACE_SETS; num++) { |
87 | if (facesets[num].prefix) { |
87 | if (facesets[num].prefix) { |
88 | for (q=0; q<nrofpixmaps; q++) |
88 | for (q=0; q<nrofpixmaps; q++) |
89 | if (facesets[num].faces[q].data) free(facesets[num].faces[q].data); |
89 | if (facesets[num].faces[q].data) free(facesets[num].faces[q].data); |
90 | free(facesets[num].prefix); |
90 | free(facesets[num].prefix); |
91 | free(facesets[num].fullname); |
91 | free(facesets[num].fullname); |
92 | free(facesets[num].size); |
92 | free(facesets[num].size); |
93 | free(facesets[num].extension); |
93 | free(facesets[num].extension); |
94 | free(facesets[num].comment); |
94 | free(facesets[num].comment); |
95 | free(facesets[num].faces); |
95 | free(facesets[num].faces); |
96 | } |
96 | } |
97 | } |
97 | } |
98 | } |
98 | } |
99 | |
99 | |
100 | /** |
100 | /** |
101 | * This returns the set we will actually use when sending |
101 | * This returns the set we will actually use when sending |
… | |
… | |
118 | * loop. |
118 | * loop. |
119 | */ |
119 | */ |
120 | if (faceset==0) return 0; |
120 | if (faceset==0) return 0; |
121 | |
121 | |
122 | if (!facesets[faceset].prefix) { |
122 | if (!facesets[faceset].prefix) { |
123 | LOG(llevError,"get_face_fallback called with unused set (%d)?\n", faceset); |
123 | LOG(llevError,"get_face_fallback called with unused set (%d)?\n", faceset); |
124 | return 0; /* use default set */ |
124 | return 0; /* use default set */ |
125 | } |
125 | } |
126 | if (facesets[faceset].faces[imageno].data) return faceset; |
126 | if (facesets[faceset].faces[imageno].data) return faceset; |
127 | return get_face_fallback(facesets[faceset].fallback, imageno); |
127 | return get_face_fallback(facesets[faceset].fallback, imageno); |
128 | } |
128 | } |
129 | |
129 | |
… | |
… | |
141 | |
141 | |
142 | /* proper case - falls back to base set */ |
142 | /* proper case - falls back to base set */ |
143 | if (fallback == 0) return; |
143 | if (fallback == 0) return; |
144 | |
144 | |
145 | if (!facesets[fallback].prefix) { |
145 | if (!facesets[fallback].prefix) { |
146 | LOG(llevError,"Face set %d falls to non set faceset %d\n", faceset, fallback); |
146 | LOG(llevError,"Face set %d falls to non set faceset %d\n", faceset, fallback); |
147 | abort(); |
147 | abort(); |
148 | } |
148 | } |
149 | togo--; |
149 | togo--; |
150 | if (togo == 0) { |
150 | if (togo == 0) { |
151 | LOG(llevError,"Infinite loop found in facesets. aborting.\n"); |
151 | LOG(llevError,"Infinite loop found in facesets. aborting.\n"); |
152 | abort(); |
152 | abort(); |
153 | } |
153 | } |
154 | check_faceset_fallback(fallback, togo); |
154 | check_faceset_fallback(fallback, togo); |
155 | } |
155 | } |
156 | |
156 | |
157 | #define MAX_IMAGE_SIZE 10000 |
157 | #define MAX_IMAGE_SIZE 10000 |
… | |
… | |
182 | int num,len,compressed, fileno,i, badline; |
182 | int num,len,compressed, fileno,i, badline; |
183 | |
183 | |
184 | memset(facesets, 0, sizeof(facesets)); |
184 | memset(facesets, 0, sizeof(facesets)); |
185 | sprintf(filename,"%s/image_info",settings.datadir); |
185 | sprintf(filename,"%s/image_info",settings.datadir); |
186 | if ((infile=open_and_uncompress(filename, 0, &compressed))==NULL) { |
186 | if ((infile=open_and_uncompress(filename, 0, &compressed))==NULL) { |
187 | LOG(llevError,"Unable to open %s\n", filename); |
187 | LOG(llevError,"Unable to open %s\n", filename); |
188 | abort(); |
188 | abort(); |
189 | } |
189 | } |
190 | while (fgets(buf, HUGE_BUF-1, infile)!=NULL) { |
190 | while (fgets(buf, HUGE_BUF-1, infile)!=NULL) { |
191 | badline=0; |
191 | badline=0; |
192 | |
192 | |
193 | if (buf[0] == '#') continue; |
193 | if (buf[0] == '#') continue; |
194 | if (!(cps[0] = strtok(buf, ":"))) badline=1; |
194 | if (!(cps[0] = strtok(buf, ":"))) badline=1; |
195 | for (i=1; i<7; i++) { |
195 | for (i=1; i<7; i++) { |
196 | if (!(cps[i] = strtok(NULL, ":"))) badline=1; |
196 | if (!(cps[i] = strtok(NULL, ":"))) badline=1; |
197 | } |
197 | } |
198 | if (badline) { |
198 | if (badline) { |
199 | LOG(llevError,"Bad line in image_info file, ignoring line:\n %s", buf); |
199 | LOG(llevError,"Bad line in image_info file, ignoring line:\n %s", buf); |
200 | } else { |
200 | } else { |
201 | len = atoi(cps[0]); |
201 | len = atoi(cps[0]); |
202 | if (len >=MAX_FACE_SETS) { |
202 | if (len >=MAX_FACE_SETS) { |
203 | LOG(llevError,"To high a setnum in image_info file: %d > %d\n", |
203 | LOG(llevError,"To high a setnum in image_info file: %d > %d\n", |
204 | len, MAX_FACE_SETS); |
204 | len, MAX_FACE_SETS); |
205 | abort(); |
205 | abort(); |
206 | } |
206 | } |
207 | facesets[len].prefix = strdup_local(cps[1]); |
207 | facesets[len].prefix = strdup_local(cps[1]); |
208 | facesets[len].fullname = strdup_local(cps[2]); |
208 | facesets[len].fullname = strdup_local(cps[2]); |
209 | facesets[len].fallback = atoi(cps[3]); |
209 | facesets[len].fallback = atoi(cps[3]); |
210 | facesets[len].size = strdup_local(cps[4]); |
210 | facesets[len].size = strdup_local(cps[4]); |
211 | facesets[len].extension = strdup_local(cps[5]); |
211 | facesets[len].extension = strdup_local(cps[5]); |
212 | facesets[len].comment = strdup_local(cps[6]); |
212 | facesets[len].comment = strdup_local(cps[6]); |
213 | } |
213 | } |
214 | } |
214 | } |
215 | close_and_delete(infile,compressed); |
215 | close_and_delete(infile,compressed); |
216 | for (i=0; i<MAX_FACE_SETS; i++) { |
216 | for (i=0; i<MAX_FACE_SETS; i++) { |
217 | if (facesets[i].prefix) check_faceset_fallback(i, MAX_FACE_SETS); |
217 | if (facesets[i].prefix) check_faceset_fallback(i, MAX_FACE_SETS); |
218 | } |
218 | } |
219 | /* Loaded the faceset information - now need to load up the |
219 | /* Loaded the faceset information - now need to load up the |
220 | * actual faces. |
220 | * actual faces. |
221 | */ |
221 | */ |
222 | |
222 | |
223 | for (fileno=0; fileno<MAX_FACE_SETS; fileno++) { |
223 | for (fileno=0; fileno<MAX_FACE_SETS; fileno++) { |
224 | /* if prefix is not set, this is not used */ |
224 | /* if prefix is not set, this is not used */ |
225 | if (!facesets[fileno].prefix) continue; |
225 | if (!facesets[fileno].prefix) continue; |
226 | facesets[fileno].faces = (FaceInfo *) calloc(nrofpixmaps, sizeof(FaceInfo)); |
226 | facesets[fileno].faces = (FaceInfo *) calloc(nrofpixmaps, sizeof(FaceInfo)); |
227 | |
227 | |
228 | sprintf(filename,"%s/crossfire.%d",settings.datadir, fileno); |
228 | sprintf(filename,"%s/crossfire.%d",settings.datadir, fileno); |
229 | LOG(llevDebug,"Loading image file %s\n", filename); |
229 | LOG(llevDebug,"Loading image file %s\n", filename); |
230 | |
230 | |
231 | if ((infile = open_and_uncompress(filename,0,&compressed))==NULL) { |
231 | if ((infile = open_and_uncompress(filename,0,&compressed))==NULL) { |
232 | LOG(llevError,"Unable to open %s\n", filename); |
232 | LOG(llevError,"Unable to open %s\n", filename); |
233 | abort(); |
233 | abort(); |
234 | } |
234 | } |
235 | while(fgets(buf, HUGE_BUF-1, infile)!=NULL) { |
235 | while(fgets(buf, HUGE_BUF-1, infile)!=NULL) { |
236 | if(strncmp(buf,"IMAGE ",6)!=0) { |
236 | if(strncmp(buf,"IMAGE ",6)!=0) { |
237 | LOG(llevError,"read_client_images:Bad image line - not IMAGE, instead\n%s",buf); |
237 | LOG(llevError,"read_client_images:Bad image line - not IMAGE, instead\n%s",buf); |
238 | abort(); |
238 | abort(); |
239 | } |
239 | } |
240 | num = atoi(buf+6); |
240 | num = atoi(buf+6); |
241 | if (num<0 || num>=nrofpixmaps) { |
241 | if (num<0 || num>=nrofpixmaps) { |
242 | LOG(llevError,"read_client_images: Image num %d not in 0..%d\n%s", |
242 | LOG(llevError,"read_client_images: Image num %d not in 0..%d\n%s", |
243 | num,nrofpixmaps,buf); |
243 | num,nrofpixmaps,buf); |
244 | abort(); |
244 | abort(); |
245 | } |
245 | } |
246 | /* Skip accross the number data */ |
246 | /* Skip accross the number data */ |
247 | for (cp=buf+6; *cp!=' '; cp++) ; |
247 | for (cp=buf+6; *cp!=' '; cp++) ; |
248 | len = atoi(cp); |
248 | len = atoi(cp); |
249 | if (len==0 || len>MAX_IMAGE_SIZE) { |
249 | if (len==0 || len>MAX_IMAGE_SIZE) { |
250 | LOG(llevError,"read_client_images: length not valid: %d > %d \n%s", |
250 | LOG(llevError,"read_client_images: length not valid: %d > %d \n%s", |
251 | len,MAX_IMAGE_SIZE,buf); |
251 | len,MAX_IMAGE_SIZE,buf); |
252 | abort(); |
252 | abort(); |
253 | } |
253 | } |
254 | /* We don't actualy care about the name if the image that |
254 | /* We don't actualy care about the name if the image that |
255 | * is embedded in the image file, so just ignore it. |
255 | * is embedded in the image file, so just ignore it. |
256 | */ |
256 | */ |
257 | facesets[fileno].faces[num].datalen = len; |
257 | facesets[fileno].faces[num].datalen = len; |
258 | facesets[fileno].faces[num].data = (uint8*) malloc(len); |
258 | facesets[fileno].faces[num].data = (uint8*) malloc(len); |
259 | if ((i=fread(facesets[fileno].faces[num].data, len, 1, infile))!=1) { |
259 | if ((i=fread(facesets[fileno].faces[num].data, len, 1, infile))!=1) { |
260 | LOG(llevError,"read_client_images: Did not read desired amount of data, wanted %d, got %d\n%s", |
260 | LOG(llevError,"read_client_images: Did not read desired amount of data, wanted %d, got %d\n%s", |
261 | len, i, buf); |
261 | len, i, buf); |
262 | abort(); |
262 | abort(); |
263 | } |
263 | } |
264 | facesets[fileno].faces[num].checksum=0; |
264 | facesets[fileno].faces[num].checksum=0; |
265 | for (i=0; i<len; i++) { |
265 | for (i=0; i<len; i++) { |
266 | ROTATE_RIGHT(facesets[fileno].faces[num].checksum); |
266 | ROTATE_RIGHT(facesets[fileno].faces[num].checksum); |
267 | facesets[fileno].faces[num].checksum += facesets[fileno].faces[num].data[i]; |
267 | facesets[fileno].faces[num].checksum += facesets[fileno].faces[num].data[i]; |
268 | facesets[fileno].faces[num].checksum &= 0xffffffff; |
268 | facesets[fileno].faces[num].checksum &= 0xffffffff; |
269 | } |
269 | } |
270 | } |
270 | } |
271 | close_and_delete(infile,compressed); |
271 | close_and_delete(infile,compressed); |
272 | } /* For fileno < MAX_FACE_SETS */ |
272 | } /* For fileno < MAX_FACE_SETS */ |
273 | } |
273 | } |
274 | |
274 | |
275 | /** |
275 | /** |
276 | * Client tells us what type of faces it wants. Also sets |
276 | * Client tells us what type of faces it wants. Also sets |
… | |
… | |
283 | char tmp[256]; |
283 | char tmp[256]; |
284 | |
284 | |
285 | int mask =(atoi(buf) & CF_FACE_CACHE), mode=(atoi(buf) & ~CF_FACE_CACHE); |
285 | int mask =(atoi(buf) & CF_FACE_CACHE), mode=(atoi(buf) & ~CF_FACE_CACHE); |
286 | |
286 | |
287 | if (mode==CF_FACE_NONE) { |
287 | if (mode==CF_FACE_NONE) { |
288 | ns->facecache=1; |
288 | ns->facecache=1; |
289 | } else if (mode!=CF_FACE_PNG) { |
289 | } else if (mode!=CF_FACE_PNG) { |
290 | sprintf(tmp,"drawinfo %d %s", NDI_RED,"Warning - send unsupported face mode. Will use Png"); |
290 | sprintf(tmp,"drawinfo %d %s", NDI_RED,"Warning - send unsupported face mode. Will use Png"); |
291 | Write_String_To_Socket(ns, tmp, strlen(tmp)); |
291 | Write_String_To_Socket(ns, tmp, strlen(tmp)); |
292 | #ifdef ESRV_DEBUG |
292 | #ifdef ESRV_DEBUG |
293 | LOG(llevDebug,"SetFaceMode: Invalid mode from client: %d\n", mode); |
293 | LOG(llevDebug,"SetFaceMode: Invalid mode from client: %d\n", mode); |
294 | #endif |
294 | #endif |
295 | } |
295 | } |
296 | if (mask) { |
296 | if (mask) { |
297 | ns->facecache=1; |
297 | ns->facecache=1; |
298 | } |
298 | } |
299 | } |
299 | } |
300 | |
300 | |
301 | /** |
301 | /** |
302 | * Client has requested pixmap that it somehow missed getting. |
302 | * Client has requested pixmap that it somehow missed getting. |
… | |
… | |
308 | { |
308 | { |
309 | long tmpnum = atoi(buff); |
309 | long tmpnum = atoi(buff); |
310 | short facenum=tmpnum & 0xffff; |
310 | short facenum=tmpnum & 0xffff; |
311 | |
311 | |
312 | if(facenum!=0) |
312 | if(facenum!=0) |
313 | esrv_send_face(ns, facenum,1); |
313 | esrv_send_face(ns, facenum,1); |
314 | } |
314 | } |
315 | |
315 | |
316 | /** |
316 | /** |
317 | * Sends a face to a client if they are in pixmap mode |
317 | * Sends a face to a client if they are in pixmap mode |
318 | * nothing gets sent in bitmap mode. |
318 | * nothing gets sent in bitmap mode. |
… | |
… | |
326 | { |
326 | { |
327 | SockList sl; |
327 | SockList sl; |
328 | char fallback; |
328 | char fallback; |
329 | |
329 | |
330 | if (face_num <= 0 || face_num >= nrofpixmaps) { |
330 | if (face_num <= 0 || face_num >= nrofpixmaps) { |
331 | LOG(llevError,"esrv_send_face (%d) out of bounds??\n",face_num); |
331 | LOG(llevError,"esrv_send_face (%d) out of bounds??\n",face_num); |
332 | return; |
332 | return; |
333 | } |
333 | } |
334 | |
334 | |
335 | sl.buf = (unsigned char*) malloc(MAXSOCKBUF); |
335 | sl.buf = (unsigned char*) malloc(MAXSOCKBUF); |
336 | fallback = get_face_fallback(ns->faceset, face_num); |
336 | fallback = get_face_fallback(ns->faceset, face_num); |
337 | |
337 | |
338 | if (facesets[fallback].faces[face_num].data == NULL) { |
338 | if (facesets[fallback].faces[face_num].data == NULL) { |
339 | LOG(llevError,"esrv_send_face: faces[%d].data == NULL\n",face_num); |
339 | LOG(llevError,"esrv_send_face: faces[%d].data == NULL\n",face_num); |
340 | return; |
340 | return; |
341 | } |
341 | } |
342 | |
342 | |
343 | if (ns->facecache && !nocache) { |
343 | if (ns->facecache && !nocache) { |
344 | if (ns->image2) |
344 | if (ns->image2) |
345 | strcpy((char*)sl.buf, "face2 "); |
345 | strcpy((char*)sl.buf, "face2 "); |
346 | else if (ns->sc_version >= 1026) |
346 | else if (ns->sc_version >= 1026) |
347 | strcpy((char*)sl.buf, "face1 "); |
347 | strcpy((char*)sl.buf, "face1 "); |
348 | else |
348 | else |
349 | strcpy((char*)sl.buf, "face "); |
349 | strcpy((char*)sl.buf, "face "); |
350 | |
350 | |
351 | sl.len=strlen((const char*)sl.buf); |
351 | sl.len=strlen((const char*)sl.buf); |
352 | SockList_AddShort(&sl, face_num); |
352 | SockList_AddShort(&sl, face_num); |
353 | if (ns->image2) |
353 | if (ns->image2) |
354 | SockList_AddChar(&sl, fallback); |
354 | SockList_AddChar(&sl, fallback); |
355 | if (ns->sc_version >= 1026) |
355 | if (ns->sc_version >= 1026) |
356 | SockList_AddInt(&sl, facesets[fallback].faces[face_num].checksum); |
356 | SockList_AddInt(&sl, facesets[fallback].faces[face_num].checksum); |
357 | strcpy((char*)sl.buf + sl.len, new_faces[face_num].name); |
357 | strcpy((char*)sl.buf + sl.len, new_faces[face_num].name); |
358 | sl.len += strlen(new_faces[face_num].name); |
358 | sl.len += strlen(new_faces[face_num].name); |
359 | Send_With_Handling(ns, &sl); |
359 | Send_With_Handling(ns, &sl); |
360 | } |
360 | } |
361 | else { |
361 | else { |
362 | if (ns->image2) |
362 | if (ns->image2) |
363 | strcpy((char*)sl.buf, "image2 "); |
363 | strcpy((char*)sl.buf, "image2 "); |
364 | else |
364 | else |
365 | strcpy((char*)sl.buf, "image "); |
365 | strcpy((char*)sl.buf, "image "); |
366 | sl.len=strlen((char*)sl.buf); |
366 | sl.len=strlen((char*)sl.buf); |
367 | SockList_AddInt(&sl, face_num); |
367 | SockList_AddInt(&sl, face_num); |
368 | if (ns->image2) |
368 | if (ns->image2) |
369 | SockList_AddChar(&sl, fallback); |
369 | SockList_AddChar(&sl, fallback); |
370 | SockList_AddInt(&sl, facesets[fallback].faces[face_num].datalen); |
370 | SockList_AddInt(&sl, facesets[fallback].faces[face_num].datalen); |
371 | memcpy(sl.buf+sl.len, facesets[fallback].faces[face_num].data, |
371 | memcpy(sl.buf+sl.len, facesets[fallback].faces[face_num].data, |
372 | facesets[fallback].faces[face_num].datalen); |
372 | facesets[fallback].faces[face_num].datalen); |
373 | sl.len += facesets[fallback].faces[face_num].datalen; |
373 | sl.len += facesets[fallback].faces[face_num].datalen; |
374 | Send_With_Handling(ns, &sl); |
374 | Send_With_Handling(ns, &sl); |
375 | } |
375 | } |
376 | ns->faces_sent[face_num] |= NS_FACESENT_FACE; |
376 | ns->faces_sent[face_num] |= NS_FACESENT_FACE; |
377 | free(sl.buf); |
377 | free(sl.buf); |
378 | } |
378 | } |
379 | |
379 | |
… | |
… | |
390 | |
390 | |
391 | sl.buf = (unsigned char *) malloc(MAXSOCKBUF); |
391 | sl.buf = (unsigned char *) malloc(MAXSOCKBUF); |
392 | |
392 | |
393 | sprintf((char*)sl.buf,"replyinfo image_info\n%d\n%d\n", nrofpixmaps-1, bmaps_checksum); |
393 | sprintf((char*)sl.buf,"replyinfo image_info\n%d\n%d\n", nrofpixmaps-1, bmaps_checksum); |
394 | for (i=0; i<MAX_FACE_SETS; i++) { |
394 | for (i=0; i<MAX_FACE_SETS; i++) { |
395 | if (facesets[i].prefix) { |
395 | if (facesets[i].prefix) { |
396 | sprintf((char*)sl.buf + strlen((const char*)sl.buf), "%d:%s:%s:%d:%s:%s:%s", |
396 | sprintf((char*)sl.buf + strlen((const char*)sl.buf), "%d:%s:%s:%d:%s:%s:%s", |
397 | i, facesets[i].prefix, facesets[i].fullname, facesets[i].fallback, |
397 | i, facesets[i].prefix, facesets[i].fullname, facesets[i].fallback, |
398 | facesets[i].size, facesets[i].extension, facesets[i].comment); |
398 | facesets[i].size, facesets[i].extension, facesets[i].comment); |
399 | } |
399 | } |
400 | } |
400 | } |
401 | sl.len = strlen((const char*)sl.buf); |
401 | sl.len = strlen((const char*)sl.buf); |
402 | Send_With_Handling(ns, &sl); |
402 | Send_With_Handling(ns, &sl); |
403 | free(sl.buf); |
403 | free(sl.buf); |
404 | } |
404 | } |
… | |
… | |
422 | |
422 | |
423 | sl.buf = (unsigned char *) malloc(MAXSOCKBUF); |
423 | sl.buf = (unsigned char *) malloc(MAXSOCKBUF); |
424 | |
424 | |
425 | start = atoi(params); |
425 | start = atoi(params); |
426 | for (cp = params; *cp != '\0'; cp++) |
426 | for (cp = params; *cp != '\0'; cp++) |
427 | if (*cp == ' ') break; |
427 | if (*cp == ' ') break; |
428 | |
428 | |
429 | stop = atoi(cp); |
429 | stop = atoi(cp); |
430 | if (stop < start || *cp == '\0' || (stop-start)>1000 || stop >= nrofpixmaps) { |
430 | if (stop < start || *cp == '\0' || (stop-start)>1000 || stop >= nrofpixmaps) { |
431 | sprintf(buf,"replyinfo image_sums %d %d", start, stop); |
431 | sprintf(buf,"replyinfo image_sums %d %d", start, stop); |
432 | cs_write_string(ns, buf, strlen(buf)); |
432 | cs_write_string(ns, buf, strlen(buf)); |
433 | return; |
433 | return; |
434 | } |
434 | } |
435 | sprintf((char*)sl.buf,"replyinfo image_sums %d %d ", start, stop); |
435 | sprintf((char*)sl.buf,"replyinfo image_sums %d %d ", start, stop); |
436 | |
436 | |
437 | sl.len = strlen((const char*)sl.buf); |
437 | sl.len = strlen((const char*)sl.buf); |
438 | |
438 | |
439 | for (i=start; i<=stop; i++) { |
439 | for (i=start; i<=stop; i++) { |
440 | SockList_AddShort(&sl, i); |
440 | SockList_AddShort(&sl, i); |
441 | ns->faces_sent[i] |= NS_FACESENT_FACE; |
441 | ns->faces_sent[i] |= NS_FACESENT_FACE; |
442 | |
442 | |
443 | qq = get_face_fallback(ns->faceset, i); |
443 | qq = get_face_fallback(ns->faceset, i); |
444 | SockList_AddInt(&sl, facesets[qq].faces[i].checksum); |
444 | SockList_AddInt(&sl, facesets[qq].faces[i].checksum); |
445 | SockList_AddChar(&sl, qq); |
445 | SockList_AddChar(&sl, qq); |
446 | |
446 | |
447 | qq = strlen(new_faces[i].name); |
447 | qq = strlen(new_faces[i].name); |
448 | SockList_AddChar(&sl, ( char )( qq + 1 )); |
448 | SockList_AddChar(&sl, ( char )( qq + 1 )); |
449 | strcpy((char*)sl.buf + sl.len, new_faces[i].name); |
449 | strcpy((char*)sl.buf + sl.len, new_faces[i].name); |
450 | sl.len += qq; |
450 | sl.len += qq; |
451 | SockList_AddChar(&sl, 0); |
451 | SockList_AddChar(&sl, 0); |
452 | } |
452 | } |
453 | /* It would make more sense to catch this pre-emptively in the code above. |
453 | /* It would make more sense to catch this pre-emptively in the code above. |
454 | * however, if this really happens, we probably just want to cut down the |
454 | * however, if this really happens, we probably just want to cut down the |
455 | * size to less than 1000, since that is what we claim the protocol would |
455 | * size to less than 1000, since that is what we claim the protocol would |
456 | * support. |
456 | * support. |
457 | */ |
457 | */ |
458 | if (sl.len >= MAXSOCKBUF) { |
458 | if (sl.len >= MAXSOCKBUF) { |
459 | LOG(llevError,"send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF); |
459 | LOG(llevError,"send_image_send: buffer overrun, %d > %d\n", sl.len, MAXSOCKBUF); |
460 | abort(); |
460 | abort(); |
461 | } |
461 | } |
462 | Send_With_Handling(ns, &sl); |
462 | Send_With_Handling(ns, &sl); |
463 | free(sl.buf); |
463 | free(sl.buf); |
464 | } |
464 | } |