Changeset 133
- Timestamp:
- 10/26/04 10:17:10 (4 years ago)
- Files:
-
- wire/trunk/Makefile.in (modified) (4 diffs)
- wire/trunk/configure.in (modified) (5 diffs)
- wire/trunk/install-sh (modified) (6 diffs)
- wire/trunk/man/wire.1 (modified) (3 diffs)
- wire/trunk/wire/Makefile.in (modified) (2 diffs)
- wire/trunk/wire/client.c (modified) (57 diffs)
- wire/trunk/wire/client.h (modified) (3 diffs)
- wire/trunk/wire/commands.c (modified) (77 diffs)
- wire/trunk/wire/commands.h (modified) (2 diffs)
- wire/trunk/wire/main.c (modified) (82 diffs)
- wire/trunk/wire/main.h (modified) (2 diffs)
- wire/trunk/wire/utility.c (modified) (26 diffs)
- wire/trunk/wire/utility.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
wire/trunk/Makefile.in
r121 r133 44 44 install: all install-man 45 45 @echo "Making $@ in ." 46 46 47 47 $(INSTALL) -m 755 run/wire $(bindir) 48 48 … … 53 53 @echo "" 54 54 @echo "Manual pages have been installed into $(mandir)." 55 55 56 56 install-man: 57 57 $(INSTALL) -m 644 man/wire.1 $(mandir)/man1/ … … 86 86 autoclean: 87 87 @echo "Making $@ in ." 88 88 89 89 $(RM) -rf autom4te.cache 90 90 $(RM) -f autoscan.log configure.scan config.h.in~ … … 92 92 cvsclean: 93 93 @echo "Making $@ in ." 94 94 95 95 $(FIND) . -name .DS_Store -print0 | $(XARGS) -0 $(RM) -f 96 96 $(FIND) . -name CVS -print0 | $(XARGS) -0 $(RM) -rf wire/trunk/configure.in
r132 r133 20 20 AC_DEFUN([WR_MSG_LIB_ERROR], [ 21 21 AC_MSG_ERROR([could not locate $1 22 22 23 23 If you installed $1 into a non-standard directory, please run: 24 24 … … 164 164 ], [ 165 165 AC_MSG_ERROR([no]) 166 ]) 166 ]) 167 167 168 168 … … 189 189 AC_CHECK_LIB([readline], [main], [ 190 190 LIBS="$LIBS -lreadline" 191 191 192 192 AC_MSG_CHECKING([for rl_completion_matches]) 193 193 AC_TRY_RUN([ … … 199 199 int main(void) { 200 200 char **matches = rl_completion_matches("", generator); 201 201 202 202 return 0; 203 203 } … … 205 205 AC_DEFINE([HAVE_RL_COMPLETION_MATCHES], [1], [Define to 1 if you have the `rl_completion_matches' function, and to 0 otherwise.]) 206 206 AC_MSG_RESULT([yes]) 207 207 208 208 ], [ 209 209 AC_MSG_RESULT([no]) wire/trunk/install-sh
r2 r133 116 116 dst=$src 117 117 src="" 118 118 119 119 if [ -d $dst ]; then 120 120 instcmd=: … … 126 126 127 127 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command 128 # might cause directories to be created, which would be especially bad 128 # might cause directories to be created, which would be especially bad 129 129 # if $src (and thus $dsttmp) contains '*'. 130 130 … … 136 136 exit 1 137 137 fi 138 138 139 139 if [ x"$dst" = x ] 140 140 then … … 203 203 # If we're going to rename the final executable, determine the name now. 204 204 205 if [ x"$transformarg" = x ] 205 if [ x"$transformarg" = x ] 206 206 then 207 207 dstfile=`basename $dst` 208 208 else 209 dstfile=`basename $dst $transformbasename | 209 dstfile=`basename $dst $transformbasename | 210 210 sed $transformarg`$transformbasename 211 211 fi … … 213 213 # don't allow the sed command to completely eliminate the filename 214 214 215 if [ x"$dstfile" = x ] 215 if [ x"$dstfile" = x ] 216 216 then 217 217 dstfile=`basename $dst` … … 244 244 245 245 $doit $rmcmd -f $dstdir/$dstfile && 246 $doit $mvcmd $dsttmp $dstdir/$dstfile 246 $doit $mvcmd $dsttmp $dstdir/$dstfile 247 247 248 248 fi && wire/trunk/man/wire.1
r85 r133 46 46 .Nm wire , 47 47 .Pa ~/.wire/bookmark 48 will also be read and interpreted. Note that commands in such files should not be prepended by a 48 will also be read and interpreted. Note that commands in such files should not be prepended by a 49 49 .Sq / 50 50 character. … … 62 62 character conversion system. Please consult the 63 63 .Xr iconv 3 64 manual for valid settings. The default value is 64 manual for valid settings. The default value is 65 65 .Sq ISO-8859-1 , 66 66 which corresponds to ISO Latin 1 and should be okay for most systems. … … 101 101 .Ar path . 102 102 .It Nm help Op Ar command 103 If specified, display help for the command 103 If specified, display help for the command 104 104 .Ar command . 105 105 Otherwise, display a list of available commands. wire/trunk/wire/Makefile.in
r2 r133 49 49 $(LINK) $(OBJECTS) $(LIBS) 50 50 $(CP) wire ../run/ 51 51 52 52 .c.o: 53 53 $(COMPILE) -c $< … … 58 58 distclean: clean 59 59 $(RM) -f wire Makefile config.* 60 $(RM) -f ../run/wire 60 $(RM) -f ../run/wire wire/trunk/wire/client.c
r131 r133 1 /* $Id: client.c,v 1.3 3 2004/10/26 07:33:14morris Exp $ */1 /* $Id: client.c,v 1.34 2004/10/26 08:17:10 morris Exp $ */ 2 2 3 3 /* 4 4 * Copyright (c) 2004 Axel Andersson 5 5 * All rights reserved. 6 * 6 * 7 7 * Redistribution and use in source and binary forms, with or without 8 8 * modification, are permitted provided that the following conditions … … 13 13 * notice, this list of conditions and the following disclaimer in the 14 14 * documentation and/or other materials provided with the distribution. 15 * 15 * 16 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED … … 117 117 if(user->uid == uid) { 118 118 value = user; 119 119 120 120 break; 121 121 } … … 132 132 wr_user_t *user, *value = NULL; 133 133 char *name; 134 134 135 135 /* dequote name */ 136 136 name = ((*rl_filename_dequoting_function) (nick, 0)); … … 141 141 if(strcmp(name, user->nick) == 0) { 142 142 value = user; 143 143 144 144 break; 145 145 } 146 146 } 147 147 WR_LIST_UNLOCK(wr_users); 148 148 149 149 /* free nick */ 150 150 free(name); … … 164 164 if(strcmp(transfer->path, path) == 0) { 165 165 value = transfer; 166 166 167 167 break; 168 168 } … … 184 184 if(transfer->sd == sd) { 185 185 value = transfer; 186 186 187 187 break; 188 188 } … … 204 204 if(transfer->tid == tid) { 205 205 value = transfer; 206 206 207 207 break; 208 208 } … … 218 218 wr_list_node_t *node; 219 219 wr_ignore_t *ignore; 220 220 221 221 /* loop over ignores */ 222 222 WR_LIST_LOCK(wr_ignores); … … 226 226 } 227 227 WR_LIST_UNLOCK(wr_ignores); 228 228 229 229 return false; 230 230 } … … 243 243 length = strlen(text); 244 244 } 245 245 246 246 for(; node != NULL; ) { 247 247 user = WR_LIST_DATA(node); 248 248 node = WR_LIST_NEXT(node); 249 249 250 250 if(strncasecmp(user->nick, text, length) == 0) 251 251 return strdup(user->nick); 252 252 } 253 253 254 254 return NULL; 255 255 } … … 272 272 wr_list_free(&wr_files); 273 273 wr_list_create(&wr_files); 274 274 275 275 /* copy text */ 276 276 path = strdup(deq_text); 277 277 278 278 /* find the path portion of text */ 279 279 if((p = strrchr(path, '/'))) { … … 296 296 /* free copy */ 297 297 free(path); 298 298 299 299 /* list path */ 300 300 wr_send_command("LIST %s%s", … … 304 304 /* enter loop */ 305 305 wr_loop(false, 411, 3.0); 306 306 307 307 /* set first node */ 308 308 node = WR_LIST_FIRST(wr_files); 309 309 } 310 310 311 311 /* get basename */ 312 312 base = basename_np(deq_text); 313 313 length = strlen(base); 314 314 315 315 /* loop & match */ 316 316 for(; node != NULL; ) { 317 317 file = WR_LIST_DATA(node); 318 318 node = WR_LIST_NEXT(node); 319 319 320 320 /* skip non-folders */ 321 321 if(file->type == WR_FILE_FILE && wr_ls_state == WR_LS_COMPLETING_DIRECTORY) 322 322 continue; 323 323 324 324 if(strncasecmp(file->name, base, length) == 0) { 325 325 /* append / if directory */ … … 328 328 else 329 329 rl_completion_append_character = ' '; 330 330 331 331 /* just the filename */ 332 332 if(strlen(saved_path) == 0) 333 333 return strdup(file->name); 334 334 335 335 /* concat path & filename */ 336 336 bytes = strlen(saved_path) + strlen(file->name) + 2; 337 337 match = malloc(bytes); 338 338 snprintf(match, bytes, "%s%s", saved_path, file->name); 339 339 340 340 return match; 341 341 } … … 344 344 /* release dequoted text */ 345 345 free(deq_text); 346 346 347 347 return NULL; 348 348 } … … 359 359 length = strlen(text); 360 360 } 361 361 362 362 for(; node != NULL; ) { 363 363 ignore = WR_LIST_DATA(node); 364 364 node = WR_LIST_NEXT(node); 365 365 366 366 if(strncasecmp(ignore->string, text, length) == 0) 367 367 return strdup(ignore->string); 368 368 } 369 369 370 370 return NULL; 371 371 } … … 391 391 /* copy values */ 392 392 wr_port = port; 393 393 394 394 if(port != 2000) 395 395 snprintf(wr_host, sizeof(wr_host), "%s:%d", host, port); … … 505 505 /* send initial login */ 506 506 wr_send_command("HELLO%s", WR_MESSAGE_SEPARATOR); 507 507 508 508 /* hash the password */ 509 509 memset(wr_password_sha, 0, sizeof(wr_password_sha)); 510 510 511 511 if(strlen(wr_password) > 0) { 512 512 SHA1_Init(&c); 513 513 SHA1_Update(&c, (unsigned char *) wr_password, strlen(wr_password)); 514 514 SHA1_Final(sha, &c); 515 515 516 516 /* map into hexademical characters */ 517 517 for(i = 0; i < SHA_DIGEST_LENGTH; i++) { … … 519 519 wr_password_sha[i+i+1] = hex[sha[i] & 0x0F]; 520 520 } 521 521 522 522 wr_password_sha[i+i] = '\0'; 523 523 } 524 524 525 525 /* set connected */ 526 526 wr_connected = true; … … 534 534 if(SSL_shutdown(wr_ssl) == 0) 535 535 SSL_shutdown(wr_ssl); 536 536 537 537 SSL_free(wr_ssl); 538 538 wr_ssl = NULL; … … 549 549 wr_socket = -1; 550 550 } 551 551 552 552 /* clean up */ 553 553 if(wr_connected) { … … 556 556 wr_printf_prefix("Connection to %s closed\n", 557 557 wr_host); 558 558 559 559 wr_list_free(&wr_users); 560 560 wr_list_free(&wr_files); 561 561 wr_list_free(&wr_transfers); 562 562 563 563 memset(wr_topic, 0, sizeof(wr_topic)); 564 564 565 565 wr_draw_header(); 566 566 wr_draw_transfers(); 567 567 wr_draw_divider(); 568 568 } 569 569 570 570 wr_connected = false; 571 571 wr_received = false; … … 576 576 void wr_close_transfer(wr_transfer_t *transfer) { 577 577 wr_list_node_t *node; 578 578 579 579 /* close SSL */ 580 580 if(transfer->ssl) { 581 581 if(SSL_shutdown(transfer->ssl) == 0) 582 582 SSL_shutdown(transfer->ssl); 583 583 584 584 SSL_free(transfer->ssl); 585 585 transfer->ssl = NULL; 586 586 } 587 587 588 588 /* close TCP */ 589 589 if(transfer->sd != -1) { … … 591 591 transfer->sd = -1; 592 592 } 593 593 594 594 /* close file */ 595 595 if(transfer->fp) { … … 597 597 transfer->fp = NULL; 598 598 } 599 599 600 600 /* remove from list */ 601 601 node = wr_list_get_node(&wr_transfers, transfer); 602 602 603 603 if(node) 604 604 wr_list_delete(&wr_transfers, node); … … 700 700 wr_msg_311(argc, argv); 701 701 break; 702 702 703 703 case 320: 704 704 wr_msg_320(argc, argv); 705 705 break; 706 706 707 707 case 321: 708 708 wr_msg_321(argc, argv); … … 712 712 wr_msg_322(argc, argv); 713 713 break; 714 714 715 715 case 340: 716 716 break; 717 717 718 718 case 341: 719 719 wr_msg_341(argc, argv); 720 720 break; 721 721 722 722 case 400: 723 723 wr_msg_400(argc, argv); 724 724 break; 725 725 726 726 case 401: 727 727 wr_msg_401(argc, argv); 728 728 break; 729 729 730 730 case 402: 731 731 wr_msg_402(argc, argv); 732 732 break; 733 733 734 734 case 410: 735 735 wr_msg_410(argc, argv); 736 736 break; 737 737 738 738 case 411: 739 739 wr_msg_411(argc, argv); … … 821 821 if(arg) 822 822 free(arg); 823 823 824 824 if(argc > 0) 825 825 wr_argv_free(argc, argv); 826 826 827 827 return message; 828 828 } … … 923 923 /* get user */ 924 924 user = wr_get_user(strtoul(argv[1], NULL, 10)); 925 925 926 926 if(user) { 927 927 /* ignore */ 928 928 if(wr_ignore_nick(user->nick)) 929 929 return; 930 930 931 931 /* print */ 932 932 wr_print_say(user->nick, argv[2]); … … 941 941 /* get user */ 942 942 user = wr_get_user(strtoul(argv[1], NULL, 10)); 943 943 944 944 if(user) { 945 945 /* ignore */ 946 946 if(wr_ignore_nick(user->nick)) 947 947 return; 948 948 949 949 /* print */ 950 950 wr_print_me(user->nick, argv[2]); … … 990 990 /* print event */ 991 991 wr_printf_prefix("%s has left\n", user->nick); 992 992 993 993 /* delete user */ 994 994 wr_list_delete(&wr_users, node); … … 1010 1010 wr_printf_prefix("%s is now known as %s\n", 1011 1011 user->nick, argv[4]); 1012 1012 1013 1013 strlcpy(user->nick, argv[4], sizeof(user->nick)); 1014 1014 } … … 1028 1028 /* get user */ 1029 1029 user = wr_get_user(strtoul(argv[0], NULL, 10)); 1030 1030 1031 1031 if(user) { 1032 1032 /* ignore */ 1033 1033 if(wr_ignore_nick(user->nick)) 1034 1034 return; 1035 1035 1036 1036 /* print message */ 1037 1037 wr_printf_prefix("Private message from %s:\n", user->nick); 1038 1038 wr_printf_block("%s", argv[1]); 1039 1039 1040 1040 wr_reply_uid = user->uid; 1041 1041 } … … 1058 1058 victim->nick, killer->nick, argv[2]); 1059 1059 } 1060 1060 1061 1061 if(node) { 1062 1062 /* delete user */ … … 1082 1082 victim->nick, killer->nick, argv[2]); 1083 1083 } 1084 1084 1085 1085 if(node) { 1086 1086 /* delete user */ … … 1104 1104 /* print info */ 1105 1105 wr_printf_prefix("User info for %s:\n", argv[4]); 1106 1106 1107 1107 if(wr_protocol >= 1.1) 1108 1108 wr_printf_block("Status: %s", argv[15]); 1109 1109 1110 1110 wr_printf_block("Login: %s", argv[5]); 1111 1111 wr_printf_block("ID: %s", argv[0]); … … 1124 1124 strftime(ftime, sizeof(ftime), "%a %T %Y", &tm); 1125 1125 wr_printf_block("Idle Time: %s", ftime); 1126 1126 1127 1127 /* print transfers */ 1128 1128 for(n = WR_TRANSFER_DOWNLOAD; n <= WR_TRANSFER_UPLOAD; n++) { … … 1131 1131 else 1132 1132 p = argv[14]; 1133 1133 1134 1134 if(strlen(p) > 0) { 1135 1135 j = 0; 1136 1136 1137 1137 while((ap = strsep(&p, WR_GROUP_SEPARATOR))) { 1138 1138 q = ap; 1139 1139 i = 0; 1140 1140 1141 1141 while((ap = strsep(&q, WR_RECORD_SEPARATOR))) { 1142 1142 switch(i++) { … … 1144 1144 strlcpy(name, basename_np(ap), sizeof(name)); 1145 1145 break; 1146 1146 1147 1147 case 1: 1148 1148 wr_text_format_size(transferred, strtoull(ap, NULL, 10), 1149 1149 sizeof(transferred)); 1150 1150 break; 1151 1151 1152 1152 case 2: 1153 1153 wr_text_format_size(size, strtoull(ap, NULL, 10), 1154 1154 sizeof(size)); 1155 1155 break; 1156 1156 1157 1157 case 3: 1158 1158 wr_text_format_size(speed, strtoul(ap, NULL, 10), … … 1161 1161 } 1162 1162 } 1163 1163 1164 1164 if(j++ == 0) { 1165 1165 if(n == WR_TRANSFER_DOWNLOAD) { … … 1191 1191 if(wr_ignore_nick(user->nick)) 1192 1192 return; 1193 1193 1194 1194 /* print message */ 1195 1195 wr_printf_prefix("Broadcast message from %s:\n", user->nick); … … 1231 1231 struct tm tm; 1232 1232 char ftime[26]; 1233 1233 1234 1234 if(wr_news_count >= 0) { 1235 1235 wr_news_count++; 1236 1236 1237 1237 if(wr_news_count > wr_news_limit) { 1238 1238 wr_printf_prefix("news: Displayed %d %s, use /news -ALL to see more\n", … … 1241 1241 ? "entry" 1242 1242 : "entries"); 1243 1243 1244 1244 wr_news_count = -1; 1245 1245 } else { 1246 1246 wr_iso8601_to_time(argv[1], &tm); 1247 1247 strftime(ftime, sizeof(ftime), "%b %e %T %Y", &tm); 1248 1248 1249 1249 wr_printf_prefix("From %s (%s):\n", argv[0], ftime); 1250 1250 wr_printf_block("%s", argv[2]); … … 1278 1278 wr_transfer_t *transfer; 1279 1279 struct sockaddr_in addr; 1280 1280 1281 1281 /* get transfer */ 1282 1282 transfer = wr_get_transfer(argv[0]); 1283 1283 1284 1284 if(!transfer) 1285 1285 return; … … 1287 1287 /* set state */ 1288 1288 transfer->state = WR_TRANSFER_RUNNING; 1289 1289 1290 1290 /* copy hash */ 1291 1291 strlcpy(transfer->hash, argv[2], sizeof(transfer->hash)); 1292 1292 1293 1293 /* open destination file */ 1294 1294 transfer->fp = fopen(transfer->local_path_partial, "a+"); 1295 1295 1296 1296 if(!transfer->fp) { 1297 1297 wr_printf_prefix("Could not open %s: %s\n", … … 1301 1301 return; 1302 1302 } 1303 1303 1304 1304 /* seek to destination */ 1305 1305 fseeko(transfer->fp, transfer->offset, SEEK_SET); 1306 1306 1307 1307 /* create new socket */ 1308 1308 transfer->sd = socket(AF_INET, SOCK_STREAM, 0); … … 1315 1315 return; 1316 1316 } 1317 1317 1318 1318 /* set new port */ 1319 1319 addr = wr_addr; … … 1360 1360 transfer->hash, 1361 1361 WR_MESSAGE_SEPARATOR); 1362 1362 1363 1363 /* set time */ 1364 1364 transfer->start_time = time(NULL); 1365 1365 1366 1366 /* print status */ 1367 1367 wr_printf_prefix("Starting transfer of \"%s\"\n", … … 1373 1373 void wr_msg_401(int argc, char *argv[]) { 1374 1374 wr_transfer_t *transfer; 1375 1375 1376 1376 /* get transfer */ 1377 1377 transfer = wr_get_transfer(argv[0]); 1378 1378 1379 1379 if(!transfer) 1380 1380 return; 1381 1381 1382 1382 /* set state */ 1383 1383 transfer->state = WR_TRANSFER_QUEUED; 1384 1384 1385 1385 /* set number in queue */ 1386 1386 transfer->queue = strtoul(argv[1], NULL, 10); … … 1410 1410 /* print info */ 1411 1411 wr_printf_prefix("File info for %s:\n", basename_np(argv[0])); 1412 1412 1413 1413 wr_printf(" Path: %s\n", argv[0]); 1414 1414 1415 1415 switch(type) { 1416 1416 case WR_FILE_FILE: 1417 1417 wr_printf(" Kind: File\n"); 1418 1418 break; 1419 1419 1420 1420 case WR_FILE_DIRECTORY: 1421 1421 wr_printf(" Kind: Folder\n"); 1422 1422 break; 1423 1423 1424 1424 case WR_FILE_UPLOADS: 1425 1425 wr_printf(" Kind: Uploads Folder\n"); 1426 1426 break; 1427 1427 1428 1428 case WR_FILE_DROPBOX: 1429 1429 wr_printf(" Kind: Drop Box Folder\n"); 1430 1430 break; 1431 1431 1432 1432 default: 1433 1433 break; 1434 1434 } 1435 1435 1436 1436 wr_printf(" Size: %s\n", size_string); 1437 1437 1438 1438 /* print created time */ 1439 1439 wr_iso8601_to_time(argv[3], &tm); 1440 1440 strftime(ftime, sizeof(ftime), "%b %e %T %Y", &tm); 1441 1441 wr_printf(" Created: %s\n", ftime); 1442 1442 1443 1443 /* print idle time */ 1444 1444 wr_iso8601_to_time(argv[4], &tm); 1445 1445 strftime(ftime, sizeof(ftime), "%b %e %T %Y", &tm); 1446 1446 wr_printf(" Modified: %s\n", ftime); 1447 1447 1448 1448 /* print checksum */ 1449 1449 if(type == WR_FILE_FILE) 1450 1450 wr_printf(" Checksum: %s\n", argv[5]); 1451 1451 1452 1452 /* print comment */ 1453 1453 if(wr_protocol >= 1.1) … … 1461 1461 transfer = wr_get_transfer(argv[0]); 1462 1462 node = wr_list_get_node(&wr_transfers, transfer); 1463 1463 1464 1464 if(transfer) { 1465 1465 /* check that it's a file */ … … 1467 1467 wr_printf_prefix("get: Cannot download directories\n"); 1468 1468 wr_list_delete(&wr_transfers, node); 1469 1469 1470 1470 return; 1471 1471 } 1472 1472 1473 1473 /* set size */ 1474 1474 transfer->size = size; 1475 1475 1476 1476 /* send get command */ 1477 1477 wr_send_command("GET %s%s%llu%s", … … 1488 1488 void wr_msg_410(int argc, char *argv[]) { 1489 1489 wr_file_t *file; 1490 1490 1491 1491 /* create new file */ 1492 1492 file = (wr_file_t *) malloc(sizeof(wr_file_t)); … … 1498 1498 strlcpy(file->path, argv[0], sizeof(file->path)); 1499 1499 strlcpy(file->name, basename_np(argv[0]), sizeof(file->name)); 1500 1500 1501 1501 /* add to list */ 1502 1502 wr_list_add(&wr_files, file); … … 1509 1509 wr_file_t *file; 1510 1510 unsigned int length, max_length = 0; 1511 1511 1512 1512 if(wr_ls_state == WR_LS_LISTING) { 1513 1513 /* find max string length */ … … 1517 1517 max_length = length > max_length ? length : max_length; 1518 1518 } 1519 1519 1520 1520 /* print files */ 1521 1521 wr_printf_prefix("Listing of %s:\n", wr_files_ld); 1522 1522 1523 1523 WR_LIST_FOREACH(wr_files, node, file) 1524 1524 wr_print_file(node->data, max_length); wire/trunk/wire/client.h
r130 r133 1 /* $Id: client.h,v 1.1 6 2004/10/26 07:32:30 morris Exp $ */1 /* $Id: client.h,v 1.17 2004/10/26 08:17:10 morris Exp $ */ 2 2 3 3 /* … … 134 134 wr_transfer_state_t state; 135 135 wr_transfer_type_t type; 136 136 137 137 int sd; 138 138 SSL &nbs
