ret = send (s, (char *) &len, 4, 0); // Send length over the socket
if (ret < 0) {
- my_perror("sending token length");
+ errno = WSAGetLastError();
+ my_perror("sending token length");
return -1;
} else if (ret != 4) {
OkMsgBox ("sending token length: %d of %d bytes written\n",
ret = send (s, tok->value, tok->length, 0); // Send the data
if (ret < 0) {
+ errno = WSAGetLastError();
my_perror("sending token data");
return -1;
} else if (ret != tok->length) {
int ret;
unsigned long len;
- ret = recv (s, (char *) &tok->length, 4, 0);
+ ret = recv (s, (char *) &len, 4, 0);
if (ret < 0) {
+ errno = WSAGetLastError();
my_perror("reading token length");
return -1;
} else if (ret != 4) {
return -1;
}
- len = ntohl(tok->length);
+ len = ntohl(len);
tok->length = (size_t) len;
tok->value = (char *) malloc(tok->length);
if (tok->value == NULL) {
ret = recv (s, (char *) tok->value, tok->length, 0);
if (ret < 0) {
+ errno = WSAGetLastError();
my_perror("reading token data");
free(tok->value);
return -1;
break;
}
}
-
+/*+*************************************************************************
+**
+** OkMsgBox
+**
+** A MessageBox version of printf
+**
+***************************************************************************/
void
OkMsgBox (char *format, ...) {
char buf[256]; // Message goes into here
args = (char *) &format + sizeof(format);
vsprintf (buf, format, args);
- MessageBox(NULL, buf, NULL, MB_OK);
+ MessageBox(NULL, buf, "", MB_OK);
}
-
+/*+*************************************************************************
+**
+** My_perror
+**
+** A windows conversion of perror displaying the output into a MessageBox.
+**
+***************************************************************************/
void
my_perror (char *msg) {
char *err;
** GSS test - Windows scaffolding to test the gssapi dll
**
** Given a hostname it does the equivalent of the Unix command
-** ./gss-client <hostname> host@<hostname> "msg"
+** ./gss-client [-port <port>] <hostname> host@<hostname> "msg"
**
***************************************************************************/
-
#include <windows.h>
#include <stdio.h>
#include "gss.h"
#define GSS_OK 100
#define GSS_CANCEL 101
-char szConnectName[256];
-char szServiceName[256];
+#define GSSAPI_INI "kerberos.ini" // Which INI file
+#define INI_HOSTS "GSSAPI Hosts" // INI file section
+#define INI_HOST "Host" // INI file line label
+
+#define MAX_HOSTS 9
+char hosts[MAX_HOSTS][128];
+
+char szHost[128]; // GSSAPI Host to connect to
+char szServiceName[128]; // Service to do
+int port = 0; // Which port to use
-int PASCAL
+static void do_gssapi_test (char *name);
+static void parse_name (char *name);
+static int read_hosts(void);
+static void write_hosts (void);
+static void update_hosts (char *name);
+static void fill_combo (HWND hDlg);
+
+/*+*************************************************************************
+**
+** WinMain
+**
+** Sets up the Dialog that drives our program
+**
+***************************************************************************/
+int PASCAL
WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
HANDLE hInstance, hPrevInstance;
LPSTR lpszCmdLine;
int nCmdShow;
{
- int n; // Return value
FARPROC lpfnDlgProc;
lpfnDlgProc = MakeProcInstance(OpenGssapiDlg, hInstance);
- n = DialogBox (hInstance, "OPENGSSAPIDLG", NULL, lpfnDlgProc);
+ DialogBox (hInstance, "OPENGSSAPIDLG", NULL, lpfnDlgProc);
FreeProcInstance(lpfnDlgProc);
- if (n) {
- strcpy (szServiceName, "host@");
- strcat (szServiceName, szConnectName);
- n = gss (szConnectName, szServiceName, "Test Gssapi Message", 0);
- if (n)
- MessageBox (NULL, "gss failed", "", IDOK | MB_ICONINFORMATION);
- }
-
return 0;
}
+/*+*************************************************************************
+**
+** Do_gssapi_test
+**
+** Does the actual call to GSS-client
+**
+***************************************************************************/
+void
+do_gssapi_test (char *name) {
+ int n; // Return value
+ HCURSOR hcursor; // For the hourglass cursor
-/*+***************************************************************************
-
- FUNCTION: OpenGssapiDlg(HWND, unsigned, WORD, LONG)
-
- PURPOSE: Processes messages for "Open Gssapi Connection" dialog box
-
- MESSAGES:
+ parse_name(name); // Get host, service and port
- WM_INITDIALOG - initialize dialog box
- WM_COMMAND - Input received
+ hcursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
+ n = gss (szHost, szServiceName, "Test Gssapi Message", port);
+ SetCursor(hcursor);
-****************************************************************************/
+ if (n)
+ MessageBox (NULL, "gss failed", "", IDOK | MB_ICONINFORMATION);
+}
-BOOL FAR PASCAL OpenGssapiDlg(
+/*+*************************************************************************
+**
+** OpenGssapiDlg(HWND, unsigned, WORD, LONG)
+**
+** Processes messages for "Open Gssapi Connection" dialog box
+**
+** Messages:
+** WM_INITDIALOG - initialize dialog box
+** WM_COMMAND - Input received
+**
+***************************************************************************/
+BOOL FAR PASCAL
+OpenGssapiDlg(
HWND hDlg,
WORD message,
WORD wParam,
LONG lParam)
{
- HDC hDC;
- int xExt, yExt;
- DWORD Ext;
-// HWND hEdit;
-// int n;
-// int iHostNum = 0;
-// char tmpName[128];
-// char tmpBuf[80];
-// char *tmpCommaLoc;
-
- switch (message) {
+ HDC hDC; // For getting graphic info
+ DWORD Ext; // Size of dialog
+ int xExt, yExt; // Size broken apart
+ char hostname[128]; // What the user typed
+ switch (message) {
case WM_INITDIALOG:
+ /*
+ ** First center the dialog
+ */
hDC = GetDC(hDlg);
Ext = GetDialogBaseUnits();
xExt = (190 *LOWORD(Ext)) /4 ;
(GetSystemMetrics(SM_CXSCREEN)/2)-(xExt/2),
(GetSystemMetrics(SM_CYSCREEN)/2)-(yExt/2),
0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
- ReleaseDC(hDlg, hDC);
-// GetPrivateProfileString(INI_HOSTS, INI_HOST "0", "", tmpName,
-// 128, TELNET_INI);
-// if (tmpName[0]) {
-// tmpCommaLoc = strchr(tmpName, ',');
-// if (tmpCommaLoc)
-// *tmpCommaLoc = '\0';
-// SetDlgItemText(hDlg, GSS_CONNECT_NAME, tmpName);
-// }
-// hEdit = GetWindow(GetDlgItem(hDlg, GSS_CONNECT_NAME), GW_CHILD);
-// while (TRUE) {
-// wsprintf(tmpBuf, INI_HOST "%d", iHostNum++);
-// GetPrivateProfileString(INI_HOSTS, tmpBuf, "", tmpName,
-// 128, TELNET_INI);
-// tmpCommaLoc = strchr(tmpName, ',');
-// if (tmpCommaLoc)
-// *tmpCommaLoc = '\0';
-// if (tmpName[0])
-// SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_ADDSTRING, 0,
-// (LPARAM) ((LPSTR) tmpName));
-// else
-// break;
-// }
-// SendMessage(hEdit, WM_USER+1, NULL, NULL);
+ ReleaseDC(hDlg, hDC);
+
+ read_hosts (); // Get the host list
+ fill_combo (hDlg); // Put into combo box
+
SendMessage(hDlg, WM_SETFOCUS, NULL, NULL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
- case GSS_CANCEL:
+ case GSS_CANCEL: // Only way out of the dialog
+ case IDCANCEL: // From the menu
EndDialog(hDlg, FALSE);
break;
-
+
case GSS_OK:
- GetDlgItemText(hDlg, GSS_CONNECT_NAME, szConnectName, 256);
- if (! *szConnectName) {
+ GetDlgItemText(hDlg, GSS_CONNECT_NAME, hostname, 128);
+ SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_SHOWDROPDOWN,
+ FALSE, NULL);
+
+ if (! *hostname) {
MessageBox(hDlg, "You must enter a host name",
NULL, MB_OK);
break;
}
- EndDialog(hDlg, TRUE);
+ do_gssapi_test (hostname); // Test GSSAPI
+ update_hosts (hostname); // Add it to the host list
+ fill_combo (hDlg); // Update the combo box
+
+ //EndDialog(hDlg, TRUE);
break;
- }
- return (FALSE);
+ }
+ return FALSE;
}
- return(FALSE);
+ return FALSE;
+
+}
+/*+*************************************************************************
+**
+** Parse_name
+**
+** Turns NAME which the user entered into host, service and port.
+** The host is up to first space, port is after that and service is made
+** from host.
+**
+***************************************************************************/
+static void
+parse_name (char *name) {
+ char *ptr;
-} /* OpenGssapiDlg */
+ strcpy (szHost, name);
+ ptr = strchr (szHost, ' '); // Is there a port???
+ if (ptr) { // Yep, start parsing it
+ port = atoi (ptr+1);
+ *ptr = '\0';
+ }
+ wsprintf (szServiceName, "host@%s", szHost); // Make the service name
+}
+/*+*************************************************************************
+**
+** Read_hosts
+**
+** Reads all the hosts listed in the INI file.
+**
+***************************************************************************/
+static int
+read_hosts (void) {
+ int i; // Index
+ char buff[10];
+
+ for (i = 0; MAX_HOSTS; ++i) { // Read this many entries
+ wsprintf (buff, INI_HOST "%d", i);
+ GetPrivateProfileString(INI_HOSTS, buff, "", hosts[i], 128, GSSAPI_INI);
+ if (*hosts[i] == '\0') // No more entries???
+ break;
+ }
+
+ return i;
+}
+/*+*************************************************************************
+**
+** Write_hosts
+**
+** Writes the hosts list back to the ini file.
+**
+***************************************************************************/
+static void
+write_hosts () {
+ int i; // Index
+ char buff[10];
+
+ for (i = 0; i < MAX_HOSTS; ++i) {
+ if (*hosts[i] == '\0') // End of the list?
+ break;
+ wsprintf (buff, INI_HOST "%d", i);
+ WritePrivateProfileString(INI_HOSTS, buff, hosts[i], GSSAPI_INI);
+ }
+}
+/*+*************************************************************************
+**
+** Update_hosts
+**
+** Updates the host list with the new NAME the user typed.
+**
+***************************************************************************/
+static void
+update_hosts (char *name) {
+ int i; // Index
+
+ for (i = 0; i < MAX_HOSTS-1; ++i) { // Find it in the list
+ if (! _stricmp (name, hosts[i])) // A match
+ break;
+ if (*hosts[i] == '\0') // End of the list
+ break;
+ }
+ memmove (hosts[1], hosts[0], i * sizeof(hosts[0])); // Move the data down
+ strcpy (hosts[0], name); // Insert this item
+
+ write_hosts ();
+}
+/*+*************************************************************************
+**
+** Fill_combo
+**
+** Fills the combo box with the contents of the host list. Item 0 goes
+** into the edit portion and the rest go into the libt box.
+**
+***************************************************************************/
+static void
+fill_combo (HWND hDlg) {
+ int i; // Index
+
+ SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_RESETCONTENT, NULL, NULL);
+
+ SetDlgItemText(hDlg, GSS_CONNECT_NAME, hosts[0]);
+ SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_SETEDITSEL, NULL, NULL);
+
+ for (i = 1; i < MAX_HOSTS; ++i) { // Fill in the list box
+ if (*hosts[i] == '\0')
+ break;
+ SendDlgItemMessage(hDlg, GSS_CONNECT_NAME, CB_ADDSTRING, 0,
+ (LPARAM) ((LPSTR) hosts[i]));
+ }
+}