-/* xscreensaver, Copyright (c) 1993-1995 Jamie Zawinski <jwz@mcom.com>
+/* xscreensaver, Copyright (c) 1993-1995 Jamie Zawinski <jwz@netscape.com>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* implied warranty.
*/
+/* #### If anyone ever finishes the Athena locking code, remove this.
+ But until then, locking requires Motif.
+ */
+#if defined(NO_MOTIF) && !defined(NO_LOCKING)
+# define NO_LOCKING
+#endif
+
+
+#ifndef NO_LOCKING
+
#if __STDC__
#include <stdlib.h>
#include <unistd.h>
#include <X11/Intrinsic.h>
+#include "xscreensaver.h"
+
+extern char *screensaver_version;
+extern char *progname;
+extern XtAppContext app;
+extern Bool verbose_p;
+
+#ifdef SCO
+/* SCO has some kind of goofy, nonstandard security crap. This stuff was
+ donated by one of their victims, I mean users, Didier Poirot <dp@chorus.fr>.
+ */
+# include <sys/security.h>
+# include <sys/audit.h>
+# include <prot.h>
+#endif
+
#if !__STDC__
# define _NO_PROTO
#endif
-#include <Xm/Xm.h>
-#include <Xm/List.h>
-#include <Xm/TextF.h>
+#ifdef NO_MOTIF
-#include "xscreensaver.h"
+# include <X11/StringDefs.h>
+# include <X11/Xaw/Text.h>
+# include <X11/Xaw/Label.h>
-#ifndef NO_LOCKING
+#else /* Motif */
-Time passwd_timeout;
+# include <Xm/Xm.h>
+# include <Xm/List.h>
+# include <Xm/TextF.h>
-extern char *screensaver_version;
-extern char *progname;
-extern XtAppContext app;
-extern Bool verbose_p;
+#endif /* Motif */
+
+Time passwd_timeout;
extern Widget passwd_dialog;
extern Widget passwd_form;
# define GETPW getpwnam
#endif
+#ifdef SCO
+# define PRPWTYPE struct pr_passwd *
+# define GETPRPW getprpwnam
+#endif
+
Bool
lock_init ()
{
Bool ok = True;
char *u;
PWTYPE p = GETPW ("root");
+
+#ifdef SCO
+ PRPWTYPE prpwd = GETPRPW ("root");
+ if (prpwd && *prpwd->ufld.fd_encrypt)
+ strcpy (root_passwd, prpwd->ufld.fd_encrypt);
+#else /* !SCO */
if (p && p->PWSLOT && p->PWSLOT[0] != '*')
strcpy (root_passwd, p->PWSLOT);
+#endif /* !SCO */
else
{
fprintf (stderr, "%s: couldn't get root's password\n", progname);
/* It has been reported that getlogin() returns the wrong user id on some
very old SGI systems... */
- u = getlogin ();
+ u = (char *) getlogin ();
if (u)
- p = GETPW (u);
+ {
+#ifdef SCO
+ prpwd = GETPRPW (u);
+#endif /* SCO */
+ p = GETPW (u);
+ }
else
{
/* getlogin() fails if not attached to a terminal;
#endif
}
+#ifdef SCO
+ if (prpwd && *prpwd->ufld.fd_encrypt)
+ strcpy (user_passwd, prpwd->ufld.fd_encrypt);
+#else /* !SCO */
if (p && p->PWSLOT &&
/* p->PWSLOT[0] != '*' */ /* sensible */
(strlen (p->PWSLOT) > 4) /* solaris */
)
strcpy (user_passwd, p->PWSLOT);
+#endif /* !SCO */
else
{
fprintf (stderr, "%s: couldn't get password of \"%s\"\n", progname, u);
\f
-#if (XmVersion >= 1002) /* The `destroy' bug apears to be fixed as */
-# define DESTROY_WORKS /* of Motif 1.2.1, but the `verify-callback' */
-#endif /* bug is still present. */
+#if defined(NO_MOTIF) || (XmVersion >= 1002)
+ /* The `destroy' bug apears to be fixed as of Motif 1.2.1, but
+ the `verify-callback' bug is still present. */
+# define DESTROY_WORKS
+#endif
static void
passwd_cancel_cb (button, client_data, call_data)
passwd_state = pw_fail;
}
-#ifdef VERIFY_CALLBACK_WORKS
+#if !defined(NO_MOTIF) && defined(VERIFY_CALLBACK_WORKS)
/* #### It looks to me like adding any modifyVerify callback causes
#### Motif 1.1.4 to free the the TextF_Value() twice. I can't see
static char translations[] = "<Key>:keypress()";
#endif
+static void
+text_field_set_string (widget, text, position)
+ Widget widget;
+ char *text;
+ int position;
+{
+#ifdef NO_MOTIF
+ XawTextBlock block;
+ block.firstPos = 0;
+ block.length = strlen (text);
+ block.ptr = text;
+ block.format = 0;
+ XawTextReplace (widget, 0, -1, &block);
+ XawTextSetInsertionPoint (widget, position);
+#else /* !NO_MOTIF */
+ XmTextFieldSetString (widget, text);
+ XmTextFieldSetInsertionPosition (widget, position);
+#endif /* !NO_MOTIF */
+}
+
+
static void
keypress (w, event, argv, argc)
Widget w;
s [++i] = 0;
while (i--)
s [i] = '*';
- XmTextFieldSetString (passwd_text, s);
- XmTextFieldSetInsertionPosition (passwd_text, j + 1);
+
+ text_field_set_string (passwd_text, s, j + 1);
}
static void
s [i] = 0;
while (i--)
s [i] = '*';
- XmTextFieldSetString (passwd_text, s);
- XmTextFieldSetInsertionPosition (passwd_text, j + 1);
+
+ text_field_set_string (passwd_text, s, j + 1);
}
static void
Cardinal *argc;
{
memset (typed_passwd, 0, sizeof (typed_passwd));
- XmTextFieldSetString (passwd_text, "");
+ text_field_set_string (passwd_text, "", 0);
}
static void
passwd_done_cb (w, 0, 0);
}
-#endif /* !VERIFY_CALLBACK_WORKS */
+#endif /* !VERIFY_CALLBACK_WORKS || NO_MOTIF */
static void
format_into_label (widget, string)
{
char *label;
char buf [255];
- XmString xm_label = 0;
- XmString new_xm_label;
Arg av[10];
int ac = 0;
+
+#ifdef NO_MOTIF
+ XtSetArg (av [ac], XtNlabel, &label); ac++;
+ XtGetValues (widget, av, ac);
+#else /* Motif */
+ XmString xm_label = 0;
+ XmString new_xm_label;
XtSetArg (av [ac], XmNlabelString, &xm_label); ac++;
XtGetValues (widget, av, ac);
XmStringGetLtoR (xm_label, XmSTRING_DEFAULT_CHARSET, &label);
- if (!strcmp (label, XtName (widget)))
+#endif /* Motif */
+
+ if (!label || !strcmp (label, XtName (widget)))
strcpy (buf, "ERROR: RESOURCES ARE NOT INSTALLED CORRECTLY");
else
sprintf (buf, label, string);
- new_xm_label = XmStringCreate (buf, XmSTRING_DEFAULT_CHARSET);
+
ac = 0;
+
+#ifdef NO_MOTIF
+ XtSetArg (av [ac], XtNlabel, buf); ac++;
+#else /* Motif */
+ new_xm_label = XmStringCreate (buf, XmSTRING_DEFAULT_CHARSET);
XtSetArg (av [ac], XmNlabelString, new_xm_label); ac++;
+#endif /* Motif */
+
XtSetValues (widget, av, ac);
+#ifndef NO_MOTIF
XmStringFree (new_xm_label);
+#endif
XtFree (label);
}
if (size > 40) size -= 30;
x = (xgwa.width - size) / 2;
y = (xgwa.height - size) / 2;
- XtSetArg (av [ac], XmNforeground, &fg); ac++;
- XtSetArg (av [ac], XmNbackground, &bg); ac++;
+ XtSetArg (av [ac], XtNforeground, &fg); ac++;
+ XtSetArg (av [ac], XtNbackground, &bg); ac++;
XtGetValues (button, av, ac);
/* if it's black on white, swap it cause it looks better (hack hack) */
if (fg == BlackPixelOfScreen (screen) && bg == WhitePixelOfScreen (screen))
XFreeGC (dpy, erase_gc);
}
+#ifdef NO_MOTIF
+
+static void
+make_passwd_dialog (parent)
+ Widget parent;
+{
+ abort (); /* #### */
+}
+
+#else /* Motif */
+
static void
make_passwd_dialog (parent)
Widget parent;
XtOverrideTranslations (passwd_text, XtParseTranslationTable (translations));
#endif
-#if (XmVersion >= 1002)
+#if !defined(NO_MOTIF) && (XmVersion >= 1002)
/* The focus stuff changed around; this didn't exist in 1.1.5. */
XtVaSetValues (passwd_form, XmNinitialFocus, passwd_text, 0);
#endif
format_into_label (passwd_label1, screensaver_version);
}
+#endif /* Motif */
extern void idle_timer ();
int ac = 0;
XGCValues gcv;
unsigned long fg, bg;
- XtSetArg (av [ac], XmNheight, &d); ac++;
+ XtSetArg (av [ac], XtNheight, &d); ac++;
XtGetValues (passwd_done, av, ac);
ac = 0;
- XtSetArg (av [ac], XmNwidth, &x); ac++;
- XtSetArg (av [ac], XmNheight, &y); ac++;
- XtSetArg (av [ac], XmNforeground, &fg); ac++;
- XtSetArg (av [ac], XmNbackground, &bg); ac++;
+ XtSetArg (av [ac], XtNwidth, &x); ac++;
+ XtSetArg (av [ac], XtNheight, &y); ac++;
+ XtSetArg (av [ac], XtNforeground, &fg); ac++;
+ XtSetArg (av [ac], XtNbackground, &bg); ac++;
XtGetValues (passwd_form, av, ac);
x -= d;
y -= d;
int revert_to;
typed_passwd [0] = 0;
passwd_state = pw_read;
- XmTextFieldSetString (passwd_text, "");
+ text_field_set_string (passwd_text, "", 0);
XGetInputFocus (dpy, &focus, &revert_to);
#ifndef DESTROY_WORKS
pop_up_dialog_box (passwd_dialog, passwd_form, 2);
XtManageChild (passwd_form);
-#if (XmVersion < 1002)
+#if !defined(NO_MOTIF) && (XmVersion < 1002)
/* The focus stuff changed around; this causes problems in 1.2.1
but is necessary in 1.1.5. */
XmProcessTraversal (passwd_text, XmTRAVERSE_CURRENT);
case pw_cancel: lose = 0; break;
default: abort ();
}
+#ifndef NO_MOTIF
XmProcessTraversal (passwd_cancel, 0); /* turn off I-beam */
+#endif
if (lose)
{
- XmTextFieldSetString (passwd_text, lose);
- XmTextFieldSetInsertionPosition (passwd_text, strlen (lose) + 1);
+ text_field_set_string (passwd_text, lose, strlen (lose) + 1);
passwd_idle_timer_tick = 1;
id = XtAppAddTimeOut (app, 3000, passwd_idle_timer, 0);
while (1)
}
}
memset (typed_passwd, 0, sizeof (typed_passwd));
- XmTextFieldSetString (passwd_text, "");
+ text_field_set_string (passwd_text, "", 0);
XtSetKeyboardFocus (parent, None);
#ifdef DESTROY_WORKS