};
static void
-altos_set_last_windows_error(void)
+_altos_set_last_windows_error(char *file, int line)
{
DWORD error = GetLastError();
TCHAR message[1024];
message,
sizeof (message) / sizeof (TCHAR),
NULL);
+ if (error != ERROR_SUCCESS)
+ printf ("%s:%d %s\n", file, line, message);
altos_set_last_error(error, message);
}
+#define altos_set_last_windows_error() _altos_set_last_windows_error(__FILE__, __LINE__)
+
PUBLIC struct altos_list *
altos_list_start(void)
{
if (!WriteFile(file->handle, data, used, &put, &file->ov_write)) {
if (GetLastError() != ERROR_IO_PENDING) {
altos_set_last_windows_error();
+ printf ("\tflush write error\n");
return LIBALTOS_ERROR;
}
ret = WaitForSingleObject(file->ov_write.hEvent, INFINITE);
case WAIT_OBJECT_0:
if (!GetOverlappedResult(file->handle, &file->ov_write, &put, FALSE)) {
altos_set_last_windows_error();
+ printf ("\tflush result error\n");
return LIBALTOS_ERROR;
}
break;
default:
altos_set_last_windows_error();
+ printf ("\tflush wait error\n");
return LIBALTOS_ERROR;
}
}
{
struct altos_file *file = calloc (1, sizeof (struct altos_file));
char full_name[64];
- DCB dcbSerialParams = {0};
COMMTIMEOUTS timeouts;
if (!file)
FILE_FLAG_OVERLAPPED, NULL);
if (file->handle == INVALID_HANDLE_VALUE) {
altos_set_last_windows_error();
+ printf ("cannot open %s\n", full_name);
free(file);
return NULL;
}
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(file->handle, &timeouts);
- dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
- if (!GetCommState(file->handle, &dcbSerialParams)) {
- altos_set_last_windows_error();
- CloseHandle(file->handle);
- free(file);
- return NULL;
- }
- dcbSerialParams.BaudRate = CBR_9600;
- dcbSerialParams.ByteSize = 8;
- dcbSerialParams.StopBits = ONESTOPBIT;
- dcbSerialParams.Parity = NOPARITY;
- if (!SetCommState(file->handle, &dcbSerialParams)) {
- altos_set_last_windows_error();
- CloseHandle(file->handle);
- free(file);
- return NULL;
- }
-
return file;
}
if (file->handle != INVALID_HANDLE_VALUE) {
CloseHandle(file->handle);
file->handle = INVALID_HANDLE_VALUE;
+ SetEvent(file->ov_read.hEvent);
+ SetEvent(file->ov_write.hEvent);
+ CloseHandle(file->ov_read.hEvent);
+ CloseHandle(file->ov_write.hEvent);
}
}