/* * Hostname display utility * * Copyright 2008 Andrew Riedi * Copyright 2010-2011 Andrew Nguyen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include "wine/port.h" #include <stdarg.h> #if defined(__MINGW32__) || defined (_MSC_VER) #include <winsock2.h> #elif defined(HAVE_UNISTD_H) #include <unistd.h> #endif #include <windef.h> #include <winbase.h> #include <wincon.h> #include <winnls.h> #include <winuser.h> #include <wine/unicode.h> #include "hostname.h" static int hostname_vprintfW(const WCHAR *msg, va_list va_args) { int wlen; DWORD count, ret; WCHAR msg_buffer[8192]; wlen = vsprintfW(msg_buffer, msg, va_args); ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL); if (!ret) { DWORD len; char *msgA; /* On Windows WriteConsoleW() fails if the output is redirected. So fall * back to WriteFile(), assuming the console encoding is still the right * one in that case. */ len = WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, NULL, 0, NULL, NULL); msgA = HeapAlloc(GetProcessHeap(), 0, len); if (!msgA) return 0; WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, msgA, len, NULL, NULL); WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE); HeapFree(GetProcessHeap(), 0, msgA); } return count; } static int hostname_printfW(const WCHAR *msg, ...) { va_list va_args; int len; va_start(va_args, msg); len = hostname_vprintfW(msg, va_args); va_end(va_args); return len; } static int hostname_message_printfW(int msg, ...) { va_list va_args; WCHAR msg_buffer[8192]; int len; LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR)); va_start(va_args, msg); len = hostname_vprintfW(msg_buffer, va_args); va_end(va_args); return len; } static int hostname_message(int msg) { static const WCHAR formatW[] = {'%','s',0}; WCHAR msg_buffer[8192]; LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR)); return hostname_printfW(formatW, msg_buffer); } static void display_computer_name(void) { static const WCHAR fmtW[] = {'%','s','\r','\n',0}; char nameA[256]; WCHAR nameW[256]; gethostname(nameA, sizeof(nameA)); MultiByteToWideChar(CP_UNIXCP, 0, nameA, sizeof(nameA), nameW, sizeof(nameW)/sizeof(WCHAR)); hostname_printfW(fmtW, nameW); } int wmain(int argc, WCHAR *argv[]) { if (argc > 1) { static const WCHAR slashHelpW[] = {'/','?',0}; unsigned int i; if (!strncmpW(argv[1], slashHelpW, sizeof(slashHelpW)/sizeof(WCHAR) - 1)) { hostname_message(STRING_USAGE); return 1; } for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { switch (argv[i][1]) { case 's': /* Ignore the option and continue processing. */ break; case '?': hostname_message(STRING_USAGE); return 1; default: hostname_message_printfW(STRING_INVALID_OPTION, argv[i][1]); hostname_message(STRING_USAGE); return 1; } } else { hostname_message(STRING_CANNOT_SET_HOSTNAME); hostname_message(STRING_USAGE); return 1; } } } display_computer_name(); return 0; }