From 76e9c5c254f618b90542b3e309ac5e3a0a888786 Mon Sep 17 00:00:00 2001 From: Theodore Tso Date: Thu, 17 Apr 1997 15:25:56 +0000 Subject: [PATCH] Add MIT's version server include files and libraries git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@10071 dc483132-0cff-0310-8789-dd5450dbe970 --- src/mit/windows/include/v.h | 102 ++++++++++++++++++ src/mit/windows/include/vs.h | 181 ++++++++++++++++++++++++++++++++ src/mit/windows/include/vs_nt.h | 42 ++++++++ src/mit/windows/lib/vsnt.lib | Bin 0 -> 9490 bytes src/mit/windows/lib/vswin.lib | Bin 0 -> 7189 bytes 5 files changed, 325 insertions(+) create mode 100644 src/mit/windows/include/v.h create mode 100644 src/mit/windows/include/vs.h create mode 100644 src/mit/windows/include/vs_nt.h create mode 100644 src/mit/windows/lib/vsnt.lib create mode 100644 src/mit/windows/lib/vswin.lib diff --git a/src/mit/windows/include/v.h b/src/mit/windows/include/v.h new file mode 100644 index 000000000..dbe250b91 --- /dev/null +++ b/src/mit/windows/include/v.h @@ -0,0 +1,102 @@ +#include "mitcpyrt.h" +/* v.h -- header for vlib.c */ + +#ifndef _VERSION_INC +#define _VERSION_INC + +/* + * values for op_code field + */ + +enum v_op_code + { + V_CHECK, /* op codes from server to client */ + V_CHECK_AND_LOG, + V_LOG, + V_LOG_PANIC, + V_OK, /* op codes from client to server */ + V_ERROR, + V_BAD_OP_CODE /* make sure this one is last */ + }; + +/* + * Values for status field + */ + + +#define V_REQUIRED 'R' /* new verison is absolutely required!! */ +#define V_RECOMMENDED 'r' /* new version is recommended. */ +#define V_OPTIONAL 'o' /* new version is optional */ +#define V_UP_TO_DATE 'u' +#define V_NEW_DOCUMENTATION 'd' +#define V_MESSAGE 'm' /* arbitrary message */ +#define V_BAD_STATUS '?' /* make sure this one is last */ + +static struct + { + char status; + char *status_name; + } version_status[] = + { + V_REQUIRED, "required", + V_RECOMMENDED, "recommended", + V_OPTIONAL, "optional", + V_UP_TO_DATE, "up_to_date", + V_NEW_DOCUMENTATION, "new_documentation", + V_MESSAGE, "message", + V_BAD_STATUS, "bad_status" + }; + +#define V_MAXDATA 700 + + +/* + * The general strategy here is we have two formats, a parsed format and a network format... + * "v_info" is parsed, and "v_pkt" is for the network. Note that the total size of all the + * strings in "v_info" had better fit into V_MAXDATA or we'll have some trouble assembling + * the packet. In a future protocol version, perhaps we'll actually USE the packet sequencing + * fields we've already declared, and send things in multiple packets.... + */ + +struct v_info + { + char *appl_name; /* Typically, these are pointers into */ + char *appl_vers; /* a struct v_pkt's */ + char *platform; /* data field (and are null-terminated strings) */ + char *status; /* status of this version */ + /* this string should be length 1, eg, V_OPTIONAL */ + char *message; + }; + +struct v_pkt + { + unsigned short protocol_version; + unsigned short packet_number; + unsigned short number_of_packets; + unsigned short op_code; + unsigned long seq; + char data[V_MAXDATA]; /* buffer of null delimited strings */ + }; + +#ifdef TEST +# define VERSION_FILE "/afs/net/project/net_dev/versions/test-version.txt" +# define VERSION_DB_FILE "/afs/net/project/net_dev/versions/test-db" +#else +# define VERSION_FILE "/afs/net/project/net_dev/version_db/version.txt" +# define VERSION_DB_FILE "/afs/net/project/net_dev/version_db/db" +#endif + +#define VERSION_LOG_DIR "/site/versions/" +#define VERSION_ERROR_LOG "bad-requests" +#define VERSION_SERVER_HOST "versions.mit.edu" +#define VERSION_SERVER_PORT 8500 +#define VERSION_CLIENT_PORT (VERSION_SERVER_PORT+1) +#define VERSION_PROTOCOL_VERSION 1 +#define V_BASE_SIZE (sizeof(struct v_pkt)-V_MAXDATA) +#define DLM ':' +#define KEY_SIZE 100 +#define LOG_CLASS LOG_LOCAL4 + +#define V_MACOS "MacOS" +#endif /* _VERSION_INC */ +/* end of file */ diff --git a/src/mit/windows/include/vs.h b/src/mit/windows/include/vs.h new file mode 100644 index 000000000..5204582f6 --- /dev/null +++ b/src/mit/windows/include/vs.h @@ -0,0 +1,181 @@ +#include "mitcpyrt.h" + + + /* + *---------------------------------------------------------------- + * + * $Source$ + * $Revision$ + * $Date$ + * $State$ + * $Author$ Jason Sachs (nosaj) + * $Locker$ + * + * $Log$ + * Revision 1.1 1997/04/17 15:25:52 tytso + * Add MIT's version server include files and libraries. + * + * Revision 1.3 92/08/27 10:44:51 pbh + * alpha 0.2a check in + * rebuilt manually + * + * Revision 0.1 92/08/25 10:00:20 pbh + * alpha 0.1a + */ + + + +/* vs.h -- defines for the Version Server checking routines. */ + +/* jms 6/3/92 */ + +#ifndef VS_HEADER_STUFF +#define VS_HEADER_STUFF + +#include "v.h" +#include + +typedef unsigned char VS_Status; +typedef unsigned long VS_Request; /* For compatibility reasons */ + +#if defined(WINDOWS) || defined(MEWEL) + #ifdef VS_INCWINDOWS + #include + #endif /* should we include windows.h here? */ +#else + #ifndef FAR /* il 7/25/95 */ + #define FAR + /* no need for that here */ + #endif + + #ifndef BOOL /* il 7/25/95 */ + #define BOOL int + #endif + + #ifndef NULL + #define NULL 0 + #endif /* Null */ + +#endif + +/* patch for nt. il 7/24/95 -- adding nt */ +#include "vs_nt.h" + +typedef struct v_req_info VS_ReqInfo, *VS_ReqInfoPtr; +#define VS_NAT_ReqInfoPtr VS_ReqInfo * + +#if defined(MEWEL) || defined(WINDOWS) + #if defined(WIN32) /* il 7/27/95 -- added nt */ + #define RequestAlloc (VS_Request) LocalAlloc + #define RequestLock(request) (VS_ReqInfoPtr) LocalLock((LOCALHANDLE)(request)) + #define RequestFree(request) LocalFree((LOCALHANDLE)(request)) + #define RequestUnlock(request) LocalUnlock((LOCALHANDLE)(request)) + #else + #define RequestAlloc (VS_Request) LocalAlloc + #define RequestLock(request) (VS_ReqInfoPtr) LocalLock((LOCALHANDLE)(LOWORD(request))) + #define RequestFree(request) LocalFree((LOCALHANDLE)(LOWORD(request))) + #define RequestUnlock(request) LocalUnlock((LOCALHANDLE)(LOWORD(request))) + #endif +#else + #define RequestAlloc(flags,size) (VS_Request) malloc(size) + #define RequestLock (char *) + #define RequestFree(request) free((char *) request) + #define RequestUnlock(request) /* nothin' */ +#endif /* jms 08/13/93 */ + +/* status codes */ + +#define V_E_SELECT 255 +#define V_E_TIMEOUT 254 +#define V_E_SELECT_STRANGEFD 253 +#define V_E_RECVFROM 252 +#define V_E_UNKNOWN 251 +#define V_E_BAD_OP_CODE 250 +#define V_E_HOSTNOTFOUND 249 +#define V_E_SOCKET 248 +#define V_E_BIND 247 +#define V_E_SENDTO 246 +#define V_E_DLLNOTFOUND 245 +#define V_E_NOMEMORY 244 +#define V_E_CANCEL 243 + +#define VSR_OK 0 + +/* classifications of errors */ + +#define V_C_NOERROR 0 +#define V_C_TRY_AGAIN 1 +#define V_C_DEFINITE 2 +#define V_C_FAIL 3 + +extern VS_Status _far _cdecl err_classify(VS_Status error); +#if defined(MEWEL) || defined(WINDOWS) +/* jms 2/16/93 */ +extern BOOL _far _cdecl v_complain(VS_Status error, LPSTR inifilename); +#endif + +#define V_TRY_AGAIN(status) (err_classify(status)==V_C_TRY_AGAIN) +#define V_FAIL(status) (err_classify(status)==V_C_FAIL) +#define V_DEFINITE(status) (err_classify(status)==V_C_DEFINITE) + +#define V_STATUS(vinfo) ((VS_Status)*((vinfo).status)) + /* grumble... this abstraction should be in v.h... */ + +/* the main routines */ + +#if defined(MEWEL) || defined(WINDOWS) +#ifndef NOCODECOVER +extern VS_Request _far _cdecl VSFormRequest(char FAR *name, char FAR *version, + char FAR *ininame, char FAR *codecover, HWND hWnd, + int HowToCheck); +#else +extern VS_Request _far _cdecl VSFormRequest(char FAR *name, char FAR *version, + char FAR *ininame, HWND hWnd, + int HowToCheck); +#endif + +#else +extern VS_Request _far _cdecl VSFormRequest(char *name, char *version, int HowToCheck); +#endif + +extern VS_Status _far _cdecl VSProcessRequest(VS_Request request); +#if defined(WINDOWS) || defined(MEWEL) +extern void _far _cdecl WinVSReportRequest(VS_Request request, HWND hWnd, char FAR *title); +extern void _far _cdecl TTChangeRegistration(char FAR *ininame, HWND hWnd, LPSTR DlgBoxName); +extern BOOL _far _cdecl v_complain(VS_Status error, LPSTR inifilename); +#else +extern void _far _cdecl TTYVSReportRequest(VS_Request request); +#endif +extern void _far _cdecl VSDestroyRequest(VS_Request request); +extern void _far _cdecl PickVersionServer(char FAR *name); +#define HNAMESIZE 40 /* max. chars in the VS server name. */ +#define HSPSIZE 2 /* no. chars in send packets option */ + +#ifndef VS_INTERNAL +extern VS_Request _far _cdecl MakeRequest( VS_Status status ); +extern VS_Status _far _cdecl ReqStatus ( VS_Request hrequest ); +#endif + +#endif /* VS_HEADER_STUFF */ + +/* + * The application should call the first two routines, and optionally + * the third, in order. It should only quit if CheckVS returns V_REQUIRED. + * If this is a Windows/Mewel program, a call to PostQuitMessage(0) is the + * best way to do things, unless some cleanup needs to be done... but the + * Version Server checking should be done as early as possible so this + * shouldn't be a problem. + */ + +#if 0 +/* here's an example: */ + VS_Request request; + VS_Status status; + + request = VSFormRequest(APPLICATION_NAME, APP_VER, "1st alpha"); + status = VSProcessRequest(request); + WinVSReportRequest(request, hMainWin, "Version Server Status Report"); + if (status == V_REQUIRED) + PostQuitMessage(0); /* This is an outdated version of TechInfo! */ + VSDestroyRequest(request); +#endif diff --git a/src/mit/windows/include/vs_nt.h b/src/mit/windows/include/vs_nt.h new file mode 100644 index 000000000..d1f9c6d01 --- /dev/null +++ b/src/mit/windows/include/vs_nt.h @@ -0,0 +1,42 @@ +#include "mitcpyrt.h" + +/* il 7/24/95 -- adding nt */ + +#ifndef _vs_nt_h_ +#define _ve_nt_h_ + +#ifdef _WIN32 + + + +/* the #undef instructions are not needed, but left to avoid possible + * conflicts with windows.h's similar definitions */ + +#undef FAR +#undef far +#undef _far +#undef __far + +#define FAR +#define far +#define _far +#define __far + +#undef _osmajor +#undef _osmanor +#define _osmajor _winmajor +#define _osminor _winminor + +#undef _fstrlen +#undef _fstrcat +#define _fstrlen strlen +#define _fstrcat strcat + +#include + + +#undef WINDOWS +#define WINDOWS + +#endif +#endif diff --git a/src/mit/windows/lib/vsnt.lib b/src/mit/windows/lib/vsnt.lib new file mode 100644 index 0000000000000000000000000000000000000000..badf6d4595bffc5be35dde49b8e4ad871e7aab99 GIT binary patch literal 9490 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 literal 0 HcmV?d00001 diff --git a/src/mit/windows/lib/vswin.lib b/src/mit/windows/lib/vswin.lib new file mode 100644 index 0000000000000000000000000000000000000000..561f7849fed2a6f044ed7f7eb2a80077498d8207 GIT binary patch literal 7189 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