xref: /openbsd-src/gnu/usr.bin/cvs/windows-NT/win32.c (revision 43c1707e6f6829177cb1974ee6615ce6c1307689)
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