1 diff -urN screen-3.9.8.org/Makefile.in screen-3.9.8/Makefile.in
2 --- screen-3.9.8.org/Makefile.in Sun Dec 3 12:12:06 2000
3 +++ screen-3.9.8/Makefile.in Sun Dec 3 12:15:50 2000
5 ETCSCREENRC = `sed < config.h -n -e '/define ETCSCREENRC/s/^.*"\([^"]*\)"/\1/p'`
9 +CFLAGS = @CFLAGS@ @USEPAM@
13 +LIBS = @LIBS@ @LIBPAM@
17 diff -urN screen-3.9.8.org/attacher.c screen-3.9.8/attacher.c
18 --- screen-3.9.8.org/attacher.c Sun Dec 3 12:12:05 2000
19 +++ screen-3.9.8/attacher.c Sun Dec 3 12:12:24 2000
25 +#include <security/pam_appl.h>
30 static sigret_t AttacherSigInt __P(SIGPROTOARG);
36 +static char *PAM_password;
37 +static char *PAM_name;
41 static int ContinuePlease;
47 +static int PAM_conv (int num_msg,
48 + const struct pam_message **msg,
49 + struct pam_response **resp,
50 + void *appdata_ptr) {
52 + struct pam_response *reply = NULL;
54 + reply = malloc(sizeof(struct pam_response)*num_msg);
55 + if (!reply) return PAM_CONV_ERR;
56 + #define COPY_STRING(s) (s) ? strdup(s) : NULL
58 + for (replies = 0; replies < num_msg; replies++) {
59 + switch (msg[replies]->msg_style) {
60 + case PAM_PROMPT_ECHO_OFF:
61 + /* wants password */
62 + reply[replies].resp_retcode = PAM_SUCCESS;
63 + reply[replies].resp = COPY_STRING(PAM_password);
66 + /* ignore the informational mesage */
67 + /* but first clear out any drek left by malloc */
68 + reply[replies].resp = NULL;
70 + case PAM_PROMPT_ECHO_ON:
71 + /* user name given to PAM already */
74 + /* unknown or PAM_ERROR_MSG */
76 + return PAM_CONV_ERR;
83 +static struct pam_conv PAM_conversation = {
90 /* -- original copyright by Luigi Cannelloni 1985 (luigi@faui70.UUCP) -- */
94 char fullname[100], *cp1, message[100 + 100];
95 - char *pass, mypass[9];
99 + pam_handle_t *pamh = NULL;
102 +#endif /* USE_PAM */
104 pass = ppp->pw_passwd;
107 + /* if we're using PAM this will evaluate to true. which we don't want. */
108 if (pass == 0 || *pass == 0)
110 if ((pass = getpass("Key: ")))
115 +#endif /* USE_PAM */
117 debug("screen_builtin_lck looking in gcos field\n");
118 strncpy(fullname, ppp->pw_gecos, sizeof(fullname) - 9);
120 AttacherFinit(SIGARG);
125 + PAM_name=ppp->pw_name;
127 + pam_error = pam_start("screen", PAM_name, &PAM_conversation, &pamh);
129 + if (pam_error == PAM_SUCCESS) {
130 + pam_error = pam_authenticate(pamh, 0);
131 + pam_end(pamh, PAM_SUCCESS);
132 + if (pam_error == PAM_SUCCESS) {
133 + memset(cp1,0,strlen(cp1));
134 + PAM_password = NULL;
141 if (!strncmp(crypt(cp1, pass), pass, strlen(pass)))
143 if (!strcmp(cp1, mypass))
147 debug("screen_builtin_lck: NO!!!!!\n");
149 debug("password ok.\n");
150 diff -urN screen-3.9.8.org/config.h.in screen-3.9.8/config.h.in
151 --- screen-3.9.8.org/config.h.in Sun Dec 3 12:12:06 2000
152 +++ screen-3.9.8/config.h.in Sun Dec 3 12:12:24 2000
155 #undef HAVE_SVR4_PTYS
158 + * define HAVE_GETPT if you have the getpt() function.
163 * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen
164 * to unusual environments. E.g. For SunOs the defaults are "qpr" and
165 diff -urN screen-3.9.8.org/configure.in screen-3.9.8/configure.in
166 --- screen-3.9.8.org/configure.in Sun Dec 3 12:12:06 2000
167 +++ screen-3.9.8/configure.in Sun Dec 3 12:12:24 2000
169 [echo "$1" 1>&AC_FD_MSG
172 +AC_ARG_WITH(libpam, [ --with-libpam use libpam for PAM support])
175 dnl Extract version from patchlevel.h
178 if test -c /dev/ptmx ; then
179 AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],AC_DEFINE(HAVE_SVR4_PTYS))
181 +AC_CHECK_FUNCS(getpt)
183 AC_CHECKING(for ptyranges)
184 if test -d /dev/ptym ; then
185 @@ -1044,6 +1047,31 @@
192 +if test "$with_libpam" = "yes"; then
193 + dnl AC_CHECK_LIB(pam, pam_start, AC_DEFINE(PAM) LIBPAM=-lpam)
194 + dnl the above doesn't work as there is no libpam.a (only .so)
195 + dnl XXX - libpam_misc is probably Linux-PAM specific
196 + LIBPAM="-lpam -lpam_misc -ldl"
199 +# AC_CACHE_CHECK(whether pam_strerror needs two arguments,
200 +# ac_cv_pam_strerror_needs_two_args,
202 +# [#include <security/pam_appl.h>],
203 +# [ pam_handle_t *pamh; pam_strerror(pamh, PAM_SUCCESS);
205 +# ac_cv_pam_strerror_needs_two_args=yes,
206 +# ac_cv_pam_strerror_needs_two_args=no
209 +# if test "$ac_cv_pam_strerror_needs_two_args" = "yes"; then
210 +# AC_DEFINE(PAM_STRERROR_NEEDS_TWO_ARGS)
215 dnl AC_CHECK_HEADER(shadow.h, AC_DEFINE(SHADOWPW))
216 AC_CHECKING(getspnam)
218 diff -urN screen-3.9.8.org/etc/etcscreenrc screen-3.9.8/etc/etcscreenrc
219 --- screen-3.9.8.org/etc/etcscreenrc Sun Dec 3 12:12:06 2000
220 +++ screen-3.9.8/etc/etcscreenrc Sun Dec 3 12:12:24 2000
223 # This is a global screenrc file
224 -# Install this file as /usr/local/etc/screenrc. See config.h
225 +# Install this file as /etc/screenrc. See config.h
227 # Flaws of termcap and standard settings are done here.
228 # Note: This file should not be shared between different hosts.
230 # colon takes a parameter since screen-3.8.6
231 bind 'R' colon "screen -ln rlogin faui -8^b^b^b"
234 +# On Debian GNU/Linux, `<--' (Backspace key) should send char `\177':
235 +bindkey -k kb stuff "\177"
236 diff -urN screen-3.9.8.org/fileio.c screen-3.9.8/fileio.c
237 --- screen-3.9.8.org/fileio.c Sun Dec 3 12:12:05 2000
238 +++ screen-3.9.8/fileio.c Sun Dec 3 12:12:24 2000
241 strncpy(fn, BufferFile, sizeof(fn) - 1);
242 fn[sizeof(fn) - 1] = 0;
243 - public = !strcmp(fn, DEFAULT_BUFFERFILE);
244 + public = !strcmp(fn, bufferfile);
246 exists = !lstat(fn, &stb);
247 if (public && exists && (S_ISLNK(stb.st_mode) || stb.st_nlink > 1))
248 diff -urN screen-3.9.8.org/os.h screen-3.9.8/os.h
249 --- screen-3.9.8.org/os.h Sun Dec 3 12:12:05 2000
250 +++ screen-3.9.8/os.h Sun Dec 3 12:12:23 2000
254 # include <strings.h>
255 +# if defined(__GLIBC__) && (__GLIBC__ >= 2)
256 +# include <string.h>
260 # if defined(SVR4) || defined(NEWSOS)
261 diff -urN screen-3.9.8.org/process.c screen-3.9.8/process.c
262 --- screen-3.9.8.org/process.c Sun Dec 3 12:12:05 2000
263 +++ screen-3.9.8/process.c Sun Dec 3 12:12:24 2000
264 @@ -1944,7 +1944,7 @@
268 - BufferFile = SaveStr(DEFAULT_BUFFERFILE);
269 + BufferFile = SaveStr(bufferfile);
270 else if (ParseSaveStr(act, &BufferFile))
273 diff -urN screen-3.9.8.org/pty.c screen-3.9.8/pty.c
274 --- screen-3.9.8.org/pty.c Sun Dec 3 12:12:05 2000
275 +++ screen-3.9.8/pty.c Sun Dec 3 12:12:24 2000
276 @@ -242,11 +242,15 @@
280 - int unlockpt __P((int)), grantpt __P((int));
281 + int unlockpt __P((int)), grantpt __P((int)), getpt __P((void));
282 sigret_t (*sigcld)__P(SIGPROTOARG);
285 + if ((f = getpt()) == -1)
287 strcpy(PtyName, "/dev/ptmx");
288 if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
293 diff -urN screen-3.9.8.org/screen.c screen-3.9.8/screen.c
294 --- screen-3.9.8.org/screen.c Sun Dec 3 12:12:05 2000
295 +++ screen-3.9.8/screen.c Sun Dec 3 12:15:09 2000
300 +char bufferfile[MAXPATHLEN];
302 extern char *blank, *null, Term[], screenterm[], **environ, Termcap[];
311 struct spwd *sss = NULL;
312 static char *spw = NULL;
313 @@ -274,13 +275,19 @@
318 if (ppp->pw_passwd[0] == '#' && ppp->pw_passwd[1] == '#' &&
319 strcmp(ppp->pw_passwd + 2, ppp->pw_name) == 0)
321 - for (; n < 13; n++)
322 + else if (!strncmp(ppp->pw_passwd, "$1$", 3)) { /* MD5-based passwords */
326 + for (; n < len; n++)
328 char c = ppp->pw_passwd[n];
329 if (!(c == '.' || c == '/' || c == '$' ||
330 + (len == 34 && c == '$') ||
331 (c >= '0' && c <= '9') ||
332 (c >= 'a' && c <= 'z') ||
333 (c >= 'A' && c <= 'Z')))
335 logtstamp_string = SaveStr("-- %n:%t -- time-stamp -- %M/%d/%y %c:%s --\n");
336 hstatusstring = SaveStr("%h");
337 captionstring = SaveStr("%3n %t");
339 - BufferFile = SaveStr(DEFAULT_BUFFERFILE);
348 + snprintf(bufferfile,sizeof(bufferfile),"%s/.screen-exchange", home);
350 oumask = umask(0); /* well, unsigned never fails? jw. */
353 Panic(0, "'%s' must be a directory.", SockDir);
354 if (eff_uid == 0 && real_uid && st.st_uid != eff_uid)
355 Panic(0, "Directory '%s' must be owned by root.", SockDir);
356 - n = (eff_uid == 0 && (real_uid || (st.st_mode & 0775) != 0775)) ? 0755 :
357 - (eff_gid == st.st_gid && eff_gid != real_gid) ? 0775 :
358 + n = (eff_gid == st.st_gid && eff_gid != real_gid) ? 0775 :
359 + (eff_uid == 0 && (real_uid || (st.st_mode & 0777) != 0777)) ? 0755 :
361 if ((st.st_mode & 0777) != n)
362 Panic(0, "Directory '%s' must have mode %03o.", SockDir, n);
363 diff -urN screen-3.9.8.org/screen.h screen-3.9.8/screen.h
364 --- screen-3.9.8.org/screen.h Sun Dec 3 12:12:05 2000
365 +++ screen-3.9.8/screen.h Sun Dec 3 12:12:23 2000
370 +extern char bufferfile[MAXPATHLEN];
373 # define STATIC /* a function that the debugger should see */
374 diff -urN screen-3.9.8.org/terminfo/screencap screen-3.9.8/terminfo/screencap
375 --- screen-3.9.8.org/terminfo/screencap Sun Dec 3 12:12:06 2000
376 +++ screen-3.9.8/terminfo/screencap Sun Dec 3 12:12:24 2000
378 :AL=\E[%dL:dl=\E[M:DL=\E[%dM:cs=\E[%i%d;%dr:dc=\E[P:\
379 :DC=\E[%dP:im=\E[4h:ei=\E[4l:IC=\E[%d@:\
380 :ks=\E[?1h\E=:ke=\E[?1l\E>:vb=\Eg:\
381 - :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\
382 + :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=\177:\
383 :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
384 :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\
385 :kh=\E[1~:kI=\E[2~:kD=\E[3~:kH=\E[4~:@7=\E[4~:kP=\E[5~:\
386 diff -urN screen-3.9.8.org/terminfo/screeninfo.src screen-3.9.8/terminfo/screeninfo.src
387 --- screen-3.9.8.org/terminfo/screeninfo.src Sun Dec 3 12:12:06 2000
388 +++ screen-3.9.8/terminfo/screeninfo.src Sun Dec 3 12:12:24 2000
390 dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
391 enacs=\E(B\E)0, home=\E[H,
392 ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
393 - ind=\n, is2=\E)0, kbs=\b, kcub1=\EOD, kcud1=\EOB,
394 + ind=\n, is2=\E)0, kbs=\177, kcub1=\EOD, kcud1=\EOB,
395 kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP,
396 kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ,
397 kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~,
399 dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
400 enacs=\E(B\E)0, home=\E[H,
401 ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
402 - ind=\n, is2=\E)0, kbs=\b, kcub1=\EOD, kcud1=\EOB,
403 + ind=\n, is2=\E)0, kbs=\177, kcub1=\EOD, kcud1=\EOB,
404 kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kf1=\EOP,
405 kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ,
406 kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~,
407 diff -urN screen-3.9.8.org/window.c screen-3.9.8/window.c
408 --- screen-3.9.8.org/window.c Sun Dec 3 12:12:05 2000
409 +++ screen-3.9.8/window.c Sun Dec 3 12:12:24 2000
410 @@ -1517,6 +1517,12 @@
414 + if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag))
416 + Msg(errno, "TIOCPKT ioctl on parent");
423 @@ -1553,6 +1559,14 @@
424 evdeq(&pwin->p_writeev);
431 + if (ioctl(w->w_ptyfd, TIOCPKT, (char *)&flag))
432 + Msg(errno, "TIOCPKT reset on parent failed");
434 +#endif /* TIOCPKT */