| 1372 |
else { |
else { |
| 1373 |
Key key; // known_hostsに登録されている鍵 |
Key key; // known_hostsに登録されている鍵 |
| 1374 |
int length; |
int length; |
| 1375 |
char filename[MAX_PATH]; |
wchar_t *filename = NULL; |
|
#if _MSC_VER < 1900 // less than VSC2015(VC14.0) |
|
|
char tmp[L_tmpnam]; |
|
|
#endif |
|
| 1376 |
int fd; |
int fd; |
| 1377 |
int amount_written = 0; |
int amount_written = 0; |
| 1378 |
int close_result; |
int close_result; |
| 1379 |
int data_index = 0; |
int data_index = 0; |
| 1380 |
wchar_t *buf; |
char *newfiledata = NULL; |
| 1381 |
wchar_t *filenameW; |
int ret; |
| 1382 |
|
struct _stat fileStat; |
| 1383 |
// 書き込み一時ファイルを開く |
long newFilePos = 0, totalSize; |
| 1384 |
#if _MSC_VER < 1900 // less than VSC2015(VC14.0) |
|
| 1385 |
_getcwd(filename, sizeof(filename)); |
// known_hostsファイルサイズを取得する。 |
| 1386 |
tmpnam_s(tmp, sizeof(tmp)); |
filename = get_home_dir_relative_nameW(name); |
| 1387 |
strcat_s(filename, sizeof(filename), tmp); |
ret = _wstat(filename, &fileStat); |
| 1388 |
#else // VSC2015(VC14.0) or later |
if (ret != 0) { |
| 1389 |
tmpnam_s(filename, sizeof(filename)); |
// error |
| 1390 |
#endif |
goto error; |
|
fd = _open(filename, |
|
|
_O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC, |
|
|
_S_IREAD | _S_IWRITE); |
|
|
|
|
|
if (fd == -1) { |
|
|
if (errno == EACCES) { |
|
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar, |
|
|
"An error occurred while trying to write the host key.\n" |
|
|
"You do not have permission to write to the known-hosts file."); |
|
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
|
|
} else { |
|
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
|
|
"An error occurred while trying to write the host key.\n" |
|
|
"The host key could not be written."); |
|
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
|
|
} |
|
|
return; |
|
| 1391 |
} |
} |
| 1392 |
|
// ファイルデータのメモリを確保する。 |
| 1393 |
|
totalSize = fileStat.st_size; |
| 1394 |
|
newfiledata = malloc(totalSize); |
| 1395 |
|
if (newfiledata == NULL) { |
| 1396 |
|
// error |
| 1397 |
|
goto error; |
| 1398 |
|
} |
| 1399 |
|
|
| 1400 |
|
|
| 1401 |
// ファイルから読み込む |
// ファイルから読み込む |
| 1402 |
memset(&key, 0, sizeof(key)); |
memset(&key, 0, sizeof(key)); |
| 1501 |
// 書き込み処理 |
// 書き込み処理 |
| 1502 |
if (do_write) { |
if (do_write) { |
| 1503 |
length = pvar->hosts_state.file_data_index - data_index; |
length = pvar->hosts_state.file_data_index - data_index; |
|
amount_written = |
|
|
_write(fd, pvar->hosts_state.file_data + data_index, |
|
|
length); |
|
| 1504 |
|
|
| 1505 |
if (amount_written != length) { |
if ((newFilePos + length) >= totalSize) { |
| 1506 |
goto error1; |
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
| 1507 |
} |
"An error occurred while trying to write the host key.\n" |
| 1508 |
|
"The host key could not be written."); |
| 1509 |
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1510 |
|
goto error; |
| 1511 |
|
} |
| 1512 |
|
|
| 1513 |
|
memcpy(newfiledata + newFilePos, |
| 1514 |
|
pvar->hosts_state.file_data + data_index, |
| 1515 |
|
length); |
| 1516 |
|
newFilePos += length; |
| 1517 |
|
|
| 1518 |
} |
} |
| 1519 |
data_index = pvar->hosts_state.file_data_index; |
data_index = pvar->hosts_state.file_data_index; |
| 1520 |
} while (1); // 最後まで読む |
} while (1); // 最後まで読む |
| 1521 |
|
|
| 1522 |
error1: |
finish_read_host_files(pvar, 0); |
| 1523 |
|
|
| 1524 |
|
// 最後にメモリを解放しておく。 |
| 1525 |
|
key_init(&key); |
| 1526 |
|
|
| 1527 |
|
// known_hostsファイルに新しいファイルデータで上書きする。 |
| 1528 |
|
fd = _wopen(filename, |
| 1529 |
|
_O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC, |
| 1530 |
|
_S_IREAD | _S_IWRITE); |
| 1531 |
|
|
| 1532 |
|
if (fd == -1) { |
| 1533 |
|
if (errno == EACCES) { |
| 1534 |
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar, |
| 1535 |
|
"An error occurred while trying to write the host key.\n" |
| 1536 |
|
"You do not have permission to write to the known-hosts file."); |
| 1537 |
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1538 |
|
} |
| 1539 |
|
else { |
| 1540 |
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
| 1541 |
|
"An error occurred while trying to write the host key.\n" |
| 1542 |
|
"The host key could not be written."); |
| 1543 |
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1544 |
|
} |
| 1545 |
|
goto error; |
| 1546 |
|
} |
| 1547 |
|
|
| 1548 |
|
amount_written = _write(fd, newfiledata, newFilePos); |
| 1549 |
close_result = _close(fd); |
close_result = _close(fd); |
| 1550 |
if (amount_written != length || close_result == -1) { |
if (amount_written != newFilePos || close_result == -1) { |
| 1551 |
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
| 1552 |
"An error occurred while trying to write the host key.\n" |
"An error occurred while trying to write the host key.\n" |
| 1553 |
"The host key could not be written."); |
"The host key could not be written."); |
| 1554 |
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1555 |
goto error2; |
goto error; |
| 1556 |
} |
} |
|
|
|
|
// 書き込み一時ファイルからリネーム |
|
|
buf = get_home_dir_relative_nameW(name); |
|
|
_wunlink(buf); |
|
|
filenameW = ToWcharA(filename); |
|
|
_wrename(filenameW, buf); |
|
|
free(buf); |
|
|
free(filenameW); |
|
| 1557 |
|
|
| 1558 |
error2: |
error: |
| 1559 |
_unlink(filename); |
free(filename); |
| 1560 |
|
|
| 1561 |
finish_read_host_files(pvar, 0); |
if (newfiledata) { |
| 1562 |
|
free(newfiledata); |
| 1563 |
|
} |
| 1564 |
|
|
|
// 最後にメモリを解放しておく。 |
|
|
key_init(&key); |
|
| 1565 |
} |
} |
| 1566 |
} |
} |
| 1567 |
|
|
| 1584 |
else { |
else { |
| 1585 |
Key key; // known_hostsに登録されている鍵 |
Key key; // known_hostsに登録されている鍵 |
| 1586 |
int length; |
int length; |
| 1587 |
char filename[MAX_PATH]; |
wchar_t *filename = NULL; |
|
#if _MSC_VER < 1900 // less than VSC2015(VC14.0) |
|
|
char tmp[L_tmpnam]; |
|
|
#endif |
|
| 1588 |
int fd; |
int fd; |
| 1589 |
int amount_written = 0; |
int amount_written = 0; |
| 1590 |
int close_result; |
int close_result; |
| 1591 |
int data_index = 0; |
int data_index = 0; |
| 1592 |
wchar_t *buf; |
char *newfiledata = NULL; |
| 1593 |
wchar_t *filenameW; |
int ret; |
| 1594 |
|
struct _stat fileStat; |
| 1595 |
// 書き込み一時ファイルを開く |
long newFilePos = 0, totalSize; |
| 1596 |
#if _MSC_VER < 1900 // less than VSC2015(VC14.0) |
|
| 1597 |
_getcwd(filename, sizeof(filename)); |
// known_hostsファイルサイズを取得する。 |
| 1598 |
tmpnam_s(tmp, sizeof(tmp)); |
filename = get_home_dir_relative_nameW(name); |
| 1599 |
strcat_s(filename, sizeof(filename), tmp); |
ret = _wstat(filename, &fileStat); |
| 1600 |
#else // VSC2015(VC14.0) or later |
if (ret != 0) { |
| 1601 |
tmpnam_s(filename, sizeof(filename)); |
// error |
| 1602 |
#endif |
goto error; |
| 1603 |
fd = _open(filename, |
} |
| 1604 |
_O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC, |
// ファイルデータのメモリを確保する。 |
| 1605 |
_S_IREAD | _S_IWRITE); |
totalSize = fileStat.st_size; |
| 1606 |
|
newfiledata = malloc(totalSize); |
| 1607 |
if (fd == -1) { |
if (newfiledata == NULL) { |
| 1608 |
if (errno == EACCES) { |
// error |
| 1609 |
UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar, |
goto error; |
|
"An error occurred while trying to write the host key.\n" |
|
|
"You do not have permission to write to the known-hosts file."); |
|
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
|
|
} |
|
|
else { |
|
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
|
|
"An error occurred while trying to write the host key.\n" |
|
|
"The host key could not be written."); |
|
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
|
|
} |
|
|
return; |
|
| 1610 |
} |
} |
| 1611 |
|
|
| 1612 |
// ファイルから読み込む |
// ファイルから読み込む |
| 1709 |
// 書き込み処理 |
// 書き込み処理 |
| 1710 |
if (do_write) { |
if (do_write) { |
| 1711 |
length = pvar->hosts_state.file_data_index - data_index; |
length = pvar->hosts_state.file_data_index - data_index; |
| 1712 |
amount_written = |
|
| 1713 |
_write(fd, pvar->hosts_state.file_data + data_index, |
if ((newFilePos + length) >= totalSize) { |
| 1714 |
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
| 1715 |
|
"An error occurred while trying to write the host key.\n" |
| 1716 |
|
"The host key could not be written."); |
| 1717 |
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1718 |
|
goto error; |
| 1719 |
|
} |
| 1720 |
|
|
| 1721 |
|
memcpy(newfiledata + newFilePos, |
| 1722 |
|
pvar->hosts_state.file_data + data_index, |
| 1723 |
length); |
length); |
| 1724 |
|
|
|
if (amount_written != length) { |
|
|
goto error1; |
|
|
} |
|
| 1725 |
} |
} |
| 1726 |
data_index = pvar->hosts_state.file_data_index; |
data_index = pvar->hosts_state.file_data_index; |
| 1727 |
} while (1); // 最後まで読む |
} while (1); // 最後まで読む |
| 1728 |
|
|
| 1729 |
error1: |
finish_read_host_files(pvar, 0); |
| 1730 |
|
|
| 1731 |
|
// 最後にメモリを解放しておく。 |
| 1732 |
|
key_init(&key); |
| 1733 |
|
|
| 1734 |
|
// known_hostsファイルに新しいファイルデータで上書きする。 |
| 1735 |
|
fd = _wopen(filename, |
| 1736 |
|
_O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC, |
| 1737 |
|
_S_IREAD | _S_IWRITE); |
| 1738 |
|
|
| 1739 |
|
if (fd == -1) { |
| 1740 |
|
if (errno == EACCES) { |
| 1741 |
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar, |
| 1742 |
|
"An error occurred while trying to write the host key.\n" |
| 1743 |
|
"You do not have permission to write to the known-hosts file."); |
| 1744 |
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1745 |
|
} |
| 1746 |
|
else { |
| 1747 |
|
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
| 1748 |
|
"An error occurred while trying to write the host key.\n" |
| 1749 |
|
"The host key could not be written."); |
| 1750 |
|
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1751 |
|
} |
| 1752 |
|
goto error; |
| 1753 |
|
} |
| 1754 |
|
|
| 1755 |
|
amount_written = _write(fd, newfiledata, newFilePos); |
| 1756 |
close_result = _close(fd); |
close_result = _close(fd); |
| 1757 |
if (amount_written != length || close_result == -1) { |
if (amount_written != newFilePos || close_result == -1) { |
| 1758 |
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar, |
| 1759 |
"An error occurred while trying to write the host key.\n" |
"An error occurred while trying to write the host key.\n" |
| 1760 |
"The host key could not be written."); |
"The host key could not be written."); |
| 1761 |
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
notify_nonfatal_error(pvar, pvar->ts->UIMsg); |
| 1762 |
goto error2; |
goto error; |
| 1763 |
} |
} |
|
|
|
|
// 書き込み一時ファイルからリネーム |
|
|
buf = get_home_dir_relative_nameW(name); |
|
|
_wunlink(buf); |
|
|
filenameW = ToWcharA(filename); |
|
|
_wrename(filenameW, buf); |
|
|
free(filenameW); |
|
|
free(buf); |
|
| 1764 |
|
|
| 1765 |
error2: |
error: |
| 1766 |
_unlink(filename); |
free(filename); |
| 1767 |
|
|
| 1768 |
finish_read_host_files(pvar, 0); |
if (newfiledata) { |
| 1769 |
|
free(newfiledata); |
| 1770 |
|
} |
| 1771 |
|
|
|
// 最後にメモリを解放しておく。 |
|
|
key_init(&key); |
|
| 1772 |
} |
} |
| 1773 |
} |
} |
| 1774 |
|
|