11e72d8d2Sderaadt /*
21e72d8d2Sderaadt * win32.c
31e72d8d2Sderaadt * - utility functions for cvs under win32
41e72d8d2Sderaadt *
51e72d8d2Sderaadt */
61e72d8d2Sderaadt
71e72d8d2Sderaadt #include <ctype.h>
8c26070a5Stholo #include <stdio.h>
9c26070a5Stholo #include <conio.h>
101e72d8d2Sderaadt
111e72d8d2Sderaadt #define WIN32_LEAN_AND_MEAN
121e72d8d2Sderaadt #include <windows.h>
131e72d8d2Sderaadt
141e72d8d2Sderaadt #include <config.h>
152286d8edStholo #include <winsock.h>
162286d8edStholo #include <stdlib.h>
171e72d8d2Sderaadt
18c71bc7e2Stholo #include "cvs.h"
19c71bc7e2Stholo
202770ece5Stholo void
init_winsock()212770ece5Stholo init_winsock ()
222770ece5Stholo {
232770ece5Stholo WSADATA data;
242770ece5Stholo
252770ece5Stholo if (WSAStartup (MAKEWORD (1, 1), &data))
262770ece5Stholo {
272770ece5Stholo fprintf (stderr, "cvs: unable to initialize winsock\n");
282770ece5Stholo exit (1);
292770ece5Stholo }
302770ece5Stholo }
312770ece5Stholo
32c71bc7e2Stholo void
wnt_cleanup(void)33c71bc7e2Stholo wnt_cleanup (void)
34c71bc7e2Stholo {
35c71bc7e2Stholo if (WSACleanup ())
36c71bc7e2Stholo {
37c71bc7e2Stholo #ifdef SERVER_ACTIVE
38c71bc7e2Stholo if (server_active || error_use_protocol)
39c71bc7e2Stholo /* FIXME: how are we supposed to report errors? As of now
40c71bc7e2Stholo (Sep 98), error() can in turn call us (if it is out of
41c71bc7e2Stholo memory) and in general is built on top of lots of
42c71bc7e2Stholo stuff. */
43c71bc7e2Stholo ;
44c71bc7e2Stholo else
45c71bc7e2Stholo #endif
46c71bc7e2Stholo fprintf (stderr, "cvs: cannot WSACleanup: %s\n",
47c71bc7e2Stholo sock_strerror (WSAGetLastError ()));
48c71bc7e2Stholo }
49c71bc7e2Stholo }
50c71bc7e2Stholo
sleep(unsigned seconds)511e72d8d2Sderaadt unsigned sleep(unsigned seconds)
521e72d8d2Sderaadt {
531e72d8d2Sderaadt Sleep(1000*seconds);
541e72d8d2Sderaadt return 0;
551e72d8d2Sderaadt }
561e72d8d2Sderaadt
57*43c1707eStholo /*
58*43c1707eStholo * Sleep at least useconds microseconds.
59*43c1707eStholo */
usleep(unsigned long useconds)60*43c1707eStholo int usleep(unsigned long useconds)
61*43c1707eStholo {
62*43c1707eStholo /* Not very accurate, but it gets the job done */
63*43c1707eStholo Sleep(useconds/1000 + (useconds%1000 ? 1 : 0));
64*43c1707eStholo return 0;
65*43c1707eStholo }
66*43c1707eStholo
671e72d8d2Sderaadt #if 0
68c71bc7e2Stholo
69c71bc7e2Stholo /* WinSock has a gethostname. But note that WinSock gethostname may
70c71bc7e2Stholo want to talk to the network, which is kind of bogus in the
71c71bc7e2Stholo non-client/server case. I'm not sure I can think of any obvious
72c71bc7e2Stholo solution. Most of the ways I can think of to figure out whether
73c71bc7e2Stholo to call gethostname or GetComputerName seem kind of kludgey, and/or
74c71bc7e2Stholo might result in picking the name in a potentially confusing way
75c71bc7e2Stholo (I'm not sure exactly how the name(s) are set). */
76c71bc7e2Stholo
771e72d8d2Sderaadt int gethostname(char* name, int namelen)
781e72d8d2Sderaadt {
791e72d8d2Sderaadt DWORD dw = namelen;
801e72d8d2Sderaadt BOOL ret = GetComputerName(name, &dw);
811e72d8d2Sderaadt namelen = dw;
821e72d8d2Sderaadt return (ret) ? 0 : -1;
831e72d8d2Sderaadt }
841e72d8d2Sderaadt #endif
851e72d8d2Sderaadt
win32getlogin()861e72d8d2Sderaadt char *win32getlogin()
871e72d8d2Sderaadt {
881e72d8d2Sderaadt static char name[256];
891e72d8d2Sderaadt DWORD dw = 256;
901e72d8d2Sderaadt GetUserName (name, &dw);
912286d8edStholo if (name[0] == '\0')
922286d8edStholo return NULL;
932286d8edStholo else
941e72d8d2Sderaadt return name;
951e72d8d2Sderaadt }
961e72d8d2Sderaadt
971e72d8d2Sderaadt
981e72d8d2Sderaadt pid_t
getpid()991e72d8d2Sderaadt getpid ()
1001e72d8d2Sderaadt {
1011e72d8d2Sderaadt return (pid_t) GetCurrentProcessId();
1021e72d8d2Sderaadt }
103c26070a5Stholo
104c26070a5Stholo char *
getpass(const char * prompt)105c26070a5Stholo getpass (const char *prompt)
106c26070a5Stholo {
107c26070a5Stholo static char pwd_buf[128];
108c26070a5Stholo size_t i;
109c26070a5Stholo
110c26070a5Stholo fputs (prompt, stderr);
111c26070a5Stholo fflush (stderr);
112c26070a5Stholo for (i = 0; i < sizeof (pwd_buf) - 1; ++i)
113c26070a5Stholo {
114c26070a5Stholo pwd_buf[i] = _getch ();
115c26070a5Stholo if (pwd_buf[i] == '\r')
116c26070a5Stholo break;
117c26070a5Stholo }
118c26070a5Stholo pwd_buf[i] = '\0';
119c26070a5Stholo fputs ("\n", stderr);
120c26070a5Stholo return pwd_buf;
121c26070a5Stholo }
122