static int send_command_to_daemon(qdb_handle_t h, struct qdb_hdr *hdr, void *data) { /* if commands needs additional data, the last parameter must not be NULL */ assert(data || hdr->data_len == 0); /* This function writes at most QDB_MAX_DATA bytes (3k) at once, * which is atomic on Linux */ if (!QioWriteBuffer(h->write_pipe, hdr, sizeof(*hdr))) { /* some fatal error on previous command (and daemon closed connection) * perhaps? or daemon has restarted */ if (GetLastError() == ERROR_BROKEN_PIPE) { /* try to reconnect */ CloseHandle(h->read_pipe); CloseHandle(h->write_pipe); if (!connect_to_daemon(h)) /* FIXME: register watches again */ /* reconnect failed */ return 0; else { /* try again */ if (!QioWriteBuffer(h->write_pipe, hdr, sizeof(*hdr))) { perror("write to daemon"); return 0; } else return 1; } } else { /* other write error */ perror("write to daemon"); return 0; } } if (data && !QioWriteBuffer(h->write_pipe, data, hdr->data_len)) { /* no recovery after header send, daemon most likely closed connection * in reaction to our data */ perror("write to daemon"); return 0; } return 1; }
BOOL WriteClipboardText(IN HWND window, OUT HANDLE outputFile) { HANDLE clipData; WCHAR *clipText; UCHAR *clipTextUtf8; size_t cbTextUtf8; if (!IsClipboardFormatAvailable(CLIPBOARD_FORMAT)) return FALSE; if (!OpenClipboard(window)) { perror("OpenClipboard"); return FALSE; } clipData = GetClipboardData(CLIPBOARD_FORMAT); if (!clipData) { perror("GetClipboardData"); CloseClipboard(); return FALSE; } clipText = GlobalLock(clipData); if (!clipText) { perror("GlobalLock"); CloseClipboard(); return FALSE; } if (FAILED(ConvertUTF16ToUTF8(clipText, &clipTextUtf8, &cbTextUtf8))) { perror("ConvertUTF16ToUTF8"); GlobalUnlock(clipData); CloseClipboard(); return FALSE; } if (!QioWriteBuffer(outputFile, clipTextUtf8, (DWORD)cbTextUtf8)) { perror("QioWriteBuffer"); GlobalUnlock(clipData); CloseClipboard(); return FALSE; } GlobalUnlock(clipData); CloseClipboard(); return TRUE; }