| 1447 |
*dst = '\0'; |
*dst = '\0'; |
| 1448 |
} |
} |
| 1449 |
|
|
| 1450 |
|
// Percent-encodeされた文字列srcをデコードしてdstにコピーする。 |
| 1451 |
|
// dstlenはdstのサイズ。これより結果が長い場合、その分は切り捨てられる。 |
| 1452 |
|
static void percent_decode(char *dst, int dstlen, char *src) { |
| 1453 |
|
if (src == NULL || dst == NULL || dstlen < 1) { |
| 1454 |
|
return; |
| 1455 |
|
} |
| 1456 |
|
|
| 1457 |
|
while (*src != 0 && dstlen > 1) { |
| 1458 |
|
if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) { |
| 1459 |
|
src++; *dst = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4; |
| 1460 |
|
src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0'); |
| 1461 |
|
src++; dst++; |
| 1462 |
|
} |
| 1463 |
|
else { |
| 1464 |
|
*dst++ = *src++; |
| 1465 |
|
} |
| 1466 |
|
dstlen--; |
| 1467 |
|
} |
| 1468 |
|
*dst = 0; |
| 1469 |
|
return; |
| 1470 |
|
} |
| 1471 |
|
|
| 1472 |
/* returns 1 if the option text must be deleted */ |
/* returns 1 if the option text must be deleted */ |
| 1473 |
static int parse_option(PTInstVar pvar, char FAR * option) |
static int parse_option(PTInstVar pvar, char FAR * option) |
| 1474 |
{ |
{ |
| 1669 |
// ':'以降はパスワード |
// ':'以降はパスワード |
| 1670 |
if ((p3 = strchr(p, ':')) != NULL) { |
if ((p3 = strchr(p, ':')) != NULL) { |
| 1671 |
*p3 = 0; |
*p3 = 0; |
| 1672 |
strcpy_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1); |
percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1); |
| 1673 |
pvar->ssh2_autologin = 1; |
pvar->ssh2_autologin = 1; |
| 1674 |
} |
} |
| 1675 |
strcpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), p); |
percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p); |
| 1676 |
// p が host part の先頭('@'の次の文字)を差すようにする |
// p が host part の先頭('@'の次の文字)を差すようにする |
| 1677 |
p = p2 + 1; |
p = p2 + 1; |
| 1678 |
} |
} |