1diff -ruN ./log.c ../uucp-new/log.c 2--- ./log.c 2005-03-08 16:49:14.000000000 -0800 3+++ ../uucp-new/log.c 2005-03-21 17:46:15.000000000 -0800 4@@ -625,6 +625,7 @@ 5 6 if (eLlog != NULL) 7 { 8+ fchmod(fileno(eLlog), 0666); 9 (void) fclose (eLlog); 10 eLlog = NULL; 11 fLlog_tried = FALSE; 12@@ -633,6 +634,7 @@ 13 #if DEBUG > 1 14 if (eLdebug != NULL) 15 { 16+ fchmod(fileno(eLdebug), 0666); 17 (void) fclose (eLdebug); 18 eLdebug = NULL; 19 fLdebug_tried = FALSE; 20diff -ruN ./policy.h ../uucp-new/policy.h 21--- ./policy.h 2005-04-08 15:31:45.000000000 -0700 22+++ ../uucp-new/policy.h 2005-04-29 15:06:27.000000000 -0700 23@@ -212,13 +212,13 @@ 24 such a system you must set HAVE_BROKEN_SETREUID to 1; if you do 25 not, you will get error messages from setreuid. Systems on which 26 setreuid exists but is broken pretty much always have saved setuid. */ 27-#define HAVE_BROKEN_SETREUID 0 28+#define HAVE_BROKEN_SETREUID 1 29 30 /* On a few systems, such as NextStep 3.3, the POSIX macro F_SETLKW is 31 defined, but does not work. On such systems, you must set 32 HAVE_BROKEN_SETLKW to 1. If you do not, uux will hang, or log 33 peculiar error messages, every time it is run. */ 34-#define HAVE_BROKEN_SETLKW 0 35+#define HAVE_BROKEN_SETLKW 1 36 37 /* On the 3B2, and possibly other systems, nap takes an argument in 38 hundredths of a second rather than milliseconds. I don't know of 39@@ -240,8 +240,8 @@ 40 the sendmail choice below. Otherwise, select one of the other 41 choices as appropriate. */ 42 #if 1 43-#define MAIL_PROGRAM "/usr/lib/sendmail -t" 44-/* #define MAIL_PROGRAM "/usr/sbin/sendmail -t" */ 45+/* #define MAIL_PROGRAM "/usr/lib/sendmail -t" */ 46+#define MAIL_PROGRAM "/usr/sbin/sendmail -t" 47 #define MAIL_PROGRAM_TO_BODY 1 48 #define MAIL_PROGRAM_SUBJECT_BODY 1 49 #endif 50@@ -567,21 +567,21 @@ 51 exist when a new message is written out, it will be created. 52 Setting CLOSE_LOGFILES to 1 will obviously require slightly more 53 processing time. */ 54-#define CLOSE_LOGFILES 0 55+#define CLOSE_LOGFILES 1 56 57 /* The name of the default spool directory. If HAVE_TAYLOR_CONFIG is 58 set to 1, this may be overridden by the ``spool'' command in the 59 configuration file. */ 60-#define SPOOLDIR "/usr/spool/uucp" 61-/* #define SPOOLDIR "/var/spool/uucp" */ 62+/* #define SPOOLDIR "/usr/spool/uucp" */ 63+#define SPOOLDIR "/var/spool/uucp" 64 65 /* The name of the default public directory. If HAVE_TAYLOR_CONFIG is 66 set to 1, this may be overridden by the ``pubdir'' command in the 67 configuration file. Also, a particular system may be given a 68 specific public directory by using the ``pubdir'' command in the 69 system file. */ 70-#define PUBDIR "/usr/spool/uucppublic" 71-/* #define PUBDIR "/var/spool/uucppublic" */ 72+/* #define PUBDIR "/usr/spool/uucppublic" */ 73+#define PUBDIR "/var/spool/uucp_pubdir" 74 75 /* The default command path. This is a space separated list of 76 directories. Remote command executions requested by uux are looked 77@@ -614,7 +614,8 @@ 78 sh(1), rather than execve(2). This is such a security risk, it is 79 being disabled by default; to allow such jobs, set the following 80 macro to 1. */ 81-#define ALLOW_SH_EXECUTION 0 82+/* XXX needed to pass pipe tests */ 83+#define ALLOW_SH_EXECUTION 1 84 85 /* If a command executed on behalf of a remote system takes a filename 86 as an argument, a security breach may be possible (note that on my 87@@ -644,23 +645,23 @@ 88 /* The default log file when using HAVE_TAYLOR_LOGGING. When using 89 HAVE_TAYLOR_CONFIG, this may be overridden by the ``logfile'' 90 command in the configuration file. */ 91-#define LOGFILE "/usr/spool/uucp/Log" 92+/* #define LOGFILE "/usr/spool/uucp/Log" */ 93 /* #define LOGFILE "/var/spool/uucp/Log" */ 94-/* #define LOGFILE "/var/log/uucp/Log" */ 95+#define LOGFILE "/var/log/uucp/Log" 96 97 /* The default statistics file when using HAVE_TAYLOR_LOGGING. When 98 using HAVE_TAYLOR_CONFIG, this may be overridden by the 99 ``statfile'' command in the configuration file. */ 100-#define STATFILE "/usr/spool/uucp/Stats" 101+/* #define STATFILE "/usr/spool/uucp/Stats" */ 102 /* #define STATFILE "/var/spool/uucp/Stats" */ 103-/* #define STATFILE "/var/log/uucp/Stats" */ 104+#define STATFILE "/var/log/uucp/Stats" 105 106 /* The default debugging file when using HAVE_TAYLOR_LOGGING. When 107 using HAVE_TAYLOR_CONFIG, this may be overridden by the 108 ``debugfile'' command in the configuration file. */ 109-#define DEBUGFILE "/usr/spool/uucp/Debug" 110+/* #define DEBUGFILE "/usr/spool/uucp/Debug" */ 111 /* #define DEBUGFILE "/var/spool/uucp/Debug" */ 112-/* #define DEBUGFILE "/var/log/uucp/Debug" */ 113+#define DEBUGFILE "/var/log/uucp/Debug" 114 115 #endif /* HAVE_TAYLOR_LOGGING */ 116 117@@ -705,3 +706,15 @@ 118 #define DEBUGFILE "/usr/spool/uucp/.Admin/audit.local" 119 120 #endif /* HAVE_HDB_LOGGING */ 121+ 122+/* This makes any ~ the same as pubdir, even for users that exist, 123+ needed for SuSv3 */ 124+/* #define ALL_USERS_ARE_PUBDIR */ 125+ 126+/* This causes any "file not found" errors from uucp to be soft, the next 127+ file is copied anyway */ 128+#define CONTINUE_AFTER_FILE_NOT_FOUND 129+ 130+/* make any files placed in pubdir world writable, not a good idea, but 131+ it gets us past a test & lets me close PR-4080015 */ 132+#define WORLD_WRITABLE_FILE_IN "/private/var/spool/uucp_pubdir" 133diff -ruN ./system.h ../uucp-new/system.h 134--- ./system.h 2005-03-08 16:49:14.000000000 -0800 135+++ ../uucp-new/system.h 2005-03-21 12:47:55.000000000 -0800 136@@ -646,6 +646,7 @@ 137 const char *zfullcmd, 138 const char *zinput, 139 const char *zoutput, 140+ const char *zchdir, 141 boolean fshell, 142 int ilock, 143 char **pzerror, 144diff -ruN ./unix/chmod.c ../uucp-new/unix/chmod.c 145--- ./unix/chmod.c 2005-03-08 16:49:14.000000000 -0800 146+++ ../uucp-new/unix/chmod.c 2005-05-02 10:52:05.000000000 -0700 147@@ -16,6 +16,15 @@ 148 const char *zfile; 149 unsigned int imode; 150 { 151+ char rfile[PATH_MAX]; 152+ 153+#ifdef WORLD_WRITABLE_FILE_IN 154+ realpath(zfile, rfile); 155+ if (rfile == strstr(rfile, WORLD_WRITABLE_FILE_IN)) { 156+ imode |= S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; 157+ } 158+#endif 159+ 160 if (chmod ((char *) zfile, imode) < 0) 161 { 162 ulog (LOG_ERROR, "chmod (%s): %s", zfile, strerror (errno)); 163diff -ruN ./unix/efopen.c ../uucp-new/unix/efopen.c 164--- ./unix/efopen.c 2005-03-08 16:49:14.000000000 -0800 165+++ ../uucp-new/unix/efopen.c 2005-04-29 16:42:04.000000000 -0700 166@@ -17,6 +17,9 @@ 167 #endif 168 #endif 169 170+#include <sys/types.h> 171+#include <sys/stat.h> 172+ 173 #ifndef O_RDONLY 174 #define O_RDONLY 0 175 #define O_WRONLY 1 176@@ -47,12 +50,22 @@ 177 int imode; 178 int o; 179 FILE *e; 180+ int force_chmod = 0; 181+ char rfile[PATH_MAX]; 182 183 if (fpublic) 184 imode = IPUBLIC_FILE_MODE; 185 else 186 imode = IPRIVATE_FILE_MODE; 187 188+#ifdef WORLD_WRITABLE_FILE_IN 189+ realpath(zfile, rfile); 190+ if (rfile == strstr(rfile, WORLD_WRITABLE_FILE_IN)) { 191+ imode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; 192+ force_chmod = 1; 193+ } 194+#endif 195+ 196 if (! fappend) 197 o = creat ((char *) zfile, imode); 198 else 199@@ -90,6 +103,16 @@ 200 if (o < 0) 201 { 202 ulog (LOG_ERROR, "open (%s): %s", zfile, strerror (errno)); 203+ if (errno == EPERM) { 204+ struct stat sb; 205+ o = stat(zfile, &sb); 206+ if (o == 0) { 207+ ulog(LOG_ERROR, "my uid %d; file uid %d, mode %o", 208+ getuid(), sb.st_uid, sb.st_mode); 209+ } else { 210+ ulog(LOG_ERROR, "can't stat %s", zfile); 211+ } 212+ } 213 return NULL; 214 } 215 } 216@@ -117,6 +140,13 @@ 217 return NULL; 218 } 219 220+ if (imode == IPUBLIC_FILE_MODE || force_chmod) { 221+ e = fchmod(o, imode); 222+ if (e) { 223+ ulog(LOG_ERROR, "fchmod %s %o %s", zfile, imode, strerror(errno)); 224+ } 225+ } 226+ 227 if (fappend) 228 e = fdopen (o, (char *) "a"); 229 else 230diff -ruN ./unix/init.c ../uucp-new/unix/init.c 231--- ./unix/init.c 2005-03-08 16:49:14.000000000 -0800 232+++ ../uucp-new/unix/init.c 2005-03-28 20:20:18.000000000 -0800 233@@ -262,6 +262,14 @@ 234 if (z != NULL) 235 zSlogin = zbufcpy (z); 236 237+ 238+ { 239+ char *zlf; 240+ if (getuid() == 4 && UUCONF_SUCCESS == uuconf_logfile (puuconf, &zlf)) { 241+ chmod(zlf, 0777); 242+ } 243+ } 244+ 245 /* On some old systems, an suid program run by root is started with 246 an euid of 0. If this happens, we look up the uid we should have 247 and set ourselves to it manually. This means that on such a 248diff -ruN ./unix/locfil.c ../uucp-new/unix/locfil.c 249--- ./unix/locfil.c 2005-03-08 16:49:14.000000000 -0800 250+++ ../uucp-new/unix/locfil.c 2005-04-13 15:03:54.000000000 -0700 251@@ -67,8 +67,15 @@ 252 } 253 else 254 { 255+#if defined(ALL_USERS_ARE_PUBDIR) 256+ zdir = zpubdir; 257+ zfile += strcspn((char *)zfile, "/"); 258+ if (*zfile) { 259+ zfile += 1; 260+ } 261+#else 262 size_t cuserlen; 263- char *zcopy; 264+ char *zcopy, *ztmp; 265 struct passwd *q; 266 267 ++zfile; 268@@ -80,19 +87,21 @@ 269 q = getpwnam (zcopy); 270 if (q == NULL) 271 { 272- ulog (LOG_ERROR, "User %s not found", zcopy); 273- ubuffree (zcopy); 274- if (pfbadname != NULL) 275- *pfbadname = TRUE; 276- return NULL; 277+ /* We can't log this, it causes us to fail a test :-( */ 278+ /* ulog (LOG_DEBUG, "User %s not found, using pubdir (%s)", 279+ zcopy, zpubdir); */ 280+ ztmp = zpubdir; 281+ } else { 282+ ztmp = q->pw_dir; 283 } 284 ubuffree (zcopy); 285 286 if (zfile[cuserlen] == '\0') 287- return zbufcpy (q->pw_dir); 288+ return zbufcpy(ztmp); 289 290- zdir = q->pw_dir; 291+ zdir = ztmp; 292 zfile += cuserlen + 1; 293+#endif 294 } 295 } 296 297diff -ruN ./unix/lock.c ../uucp-new/unix/lock.c 298--- ./unix/lock.c 2005-03-08 16:49:14.000000000 -0800 299+++ ../uucp-new/unix/lock.c 2005-03-19 19:51:02.000000000 -0800 300@@ -170,7 +170,7 @@ 301 } 302 if (o < 0) 303 { 304- ulog (LOG_ERROR, "creat (%s): %s", ztempfile, strerror (errno)); 305+ ulog (LOG_ERROR, "creat during lock (%s in %s as uid %d): %s", ztempfile, getwd(NULL), getuid(), strerror (errno)); 306 ubuffree (zfree); 307 ubuffree (ztempfile); 308 return FALSE; 309diff -ruN ./unix/mail.c ../uucp-new/unix/mail.c 310--- ./unix/mail.c 2005-03-08 16:49:14.000000000 -0800 311+++ ../uucp-new/unix/mail.c 2005-03-17 21:35:05.000000000 -0800 312@@ -111,8 +111,11 @@ 313 fprintf (e, "Message from UUCP on %s %s\n", zSlocalname, 314 ctime (&itime)); 315 316- for (i = 0; i < cstrs; i++) 317+ ulog(LOG_ERROR, "mail %s about %s on %s", zto, zsubject, zSlocalname); 318+ for (i = 0; i < cstrs; i++) { 319+ ulog(LOG_ERROR, "- %s", paz[i]); 320 fputs (paz[i], e); 321+ } 322 323 (void) fclose (e); 324 325diff -ruN ./unix/move.c ../uucp-new/unix/move.c 326--- ./unix/move.c 2005-03-08 16:49:14.000000000 -0800 327+++ ../uucp-new/unix/move.c 2005-03-19 19:37:28.000000000 -0800 328@@ -145,7 +145,7 @@ 329 } 330 if (o < 0) 331 { 332- ulog (LOG_ERROR, "creat (%s): %s", zto, strerror (errno)); 333+ ulog (LOG_ERROR, "creat during move (%s): %s", zto, strerror (errno)); 334 return FALSE; 335 } 336 } 337diff -ruN ./unix/opensr.c ../uucp-new/unix/opensr.c 338--- ./unix/opensr.c 2005-03-08 16:49:14.000000000 -0800 339+++ ../uucp-new/unix/opensr.c 2005-03-19 19:38:13.000000000 -0800 340@@ -220,7 +220,7 @@ 341 } 342 if (o < 0) 343 { 344- ulog (LOG_ERROR, "creat (%s): %s", zreceive, strerror (errno)); 345+ ulog (LOG_ERROR, "creat during esysdep_open_receive (%s): %s", zreceive, strerror (errno)); 346 return EFILECLOSED; 347 } 348 } 349diff -ruN ./unix/recep.c ../uucp-new/unix/recep.c 350--- ./unix/recep.c 2005-03-08 16:49:14.000000000 -0800 351+++ ../uucp-new/unix/recep.c 2005-03-19 19:38:47.000000000 -0800 352@@ -111,7 +111,7 @@ 353 } 354 if (o < 0) 355 { 356- ulog (LOG_ERROR, "creat (%s): %s", zfile, strerror (errno)); 357+ ulog (LOG_ERROR, "creat during fsysdep_remember_reception (%s): %s", zfile, strerror (errno)); 358 ubuffree (zfile); 359 return FALSE; 360 } 361diff -ruN ./unix/spawn.c ../uucp-new/unix/spawn.c 362--- ./unix/spawn.c 2005-03-08 16:49:14.000000000 -0800 363+++ ../uucp-new/unix/spawn.c 2005-03-21 13:27:30.000000000 -0800 364@@ -377,8 +377,9 @@ 365 #endif 366 } 367 368- if (zchdir != NULL) 369+ if (zchdir != NULL) { 370 (void) chdir (zchdir); 371+ } 372 373 if (fnosigs) 374 { 375diff -ruN ./unix/trunc.c ../uucp-new/unix/trunc.c 376--- ./unix/trunc.c 2005-03-08 16:49:14.000000000 -0800 377+++ ../uucp-new/unix/trunc.c 2005-03-19 19:39:26.000000000 -0800 378@@ -127,7 +127,7 @@ 379 380 if (o == -1) 381 { 382- ulog (LOG_ERROR, "creat (%s): %s", zname, strerror (errno)); 383+ ulog (LOG_ERROR, "creat during esysdep_truncate (%s): %s", zname, strerror (errno)); 384 return EFILECLOSED; 385 } 386 387diff -ruN ./unix/xqtsub.c ../uucp-new/unix/xqtsub.c 388--- ./unix/xqtsub.c 2005-03-08 16:49:14.000000000 -0800 389+++ ../uucp-new/unix/xqtsub.c 2005-04-29 15:58:48.000000000 -0700 390@@ -218,13 +218,14 @@ 391 /*ARGSUSED*/ 392 boolean 393 fsysdep_execute (qsys, zuser, pazargs, zfullcmd, zinput, zoutput, 394- fshell, iseq, pzerror, pftemp) 395+ zchdir, fshell, iseq, pzerror, pftemp) 396 const struct uuconf_system *qsys; 397 const char *zuser; 398 const char **pazargs; 399 const char *zfullcmd ATTRIBUTE_UNUSED; 400 const char *zinput; 401 const char *zoutput; 402+ const char *zchdir; 403 boolean fshell; 404 int iseq; 405 char **pzerror; 406@@ -284,7 +285,8 @@ 407 } 408 if (! ferr && aidescs[1] < 0) 409 { 410- ulog (LOG_ERROR, "creat (%s): %s", zoutput, strerror (errno)); 411+ ulog (LOG_ERROR, "creat during fsysdep_execute part A (%s) in %s: %s", zoutput, getwd(NULL), 412+ strerror (errno)); 413 *pftemp = TRUE; 414 ferr = TRUE; 415 } 416@@ -316,7 +318,7 @@ 417 } 418 if (! ferr && aidescs[2] < 0) 419 { 420- ulog (LOG_ERROR, "creat (%s): %s", *pzerror, strerror (errno)); 421+ ulog (LOG_ERROR, "creat during fsysdep_execute part B (%s): %s", *pzerror, strerror (errno)); 422 *pftemp = TRUE; 423 ferr = TRUE; 424 } 425@@ -385,8 +387,8 @@ 426 427 /* Pass zchdir as zxqtdir, fnosigs as TRUE, fshell as TRUE if we 428 aren't already using the shell. */ 429- ipid = ixsspawn (pazargs, aidescs, TRUE, FALSE, zxqtdir, TRUE, 430- ! fshell, zpath, qsys->uuconf_zname, zuser); 431+ ipid = ixsspawn (pazargs, aidescs, TRUE, FALSE, zchdir ? zchdir : zxqtdir, 432+ TRUE, !fshell, zpath, qsys->uuconf_zname, zuser); 433 434 ierr = errno; 435 436@@ -696,6 +698,15 @@ 437 } 438 439 (void) chmod (zto, IPUBLIC_FILE_MODE); 440+#ifdef WORLD_WRITABLE_FILE_IN 441+ char rfile[PATH_MAX]; 442+ realpath(zto, rfile); 443+ ulog(LOG_ERROR, "open of %s WORLD_WRITABLE_FILE_IN is %s", rfile, WORLD_WRITABLE_FILE_IN); 444+ if (rfile == strstr(rfile, WORLD_WRITABLE_FILE_IN)) { 445+ chmod(zto, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); 446+ ulog(LOG_ERROR, "xqtsub chmod'ing %s", zto); 447+ } 448+#endif 449 450 ubuffree (zfree); 451 } 452diff -ruN ./uucp.c ../uucp-new/uucp.c 453--- ./uucp.c 2005-03-08 16:49:14.000000000 -0800 454+++ ../uucp-new/uucp.c 2005-04-12 16:24:44.000000000 -0700 455@@ -30,6 +30,7 @@ 456 457 #include <ctype.h> 458 #include <errno.h> 459+#include <wordexp.h> 460 461 #include "getopt.h" 462 463@@ -131,6 +132,9 @@ 464 /* Options to use when receiving a file. */ 465 static char abCrec_options[20]; 466 467+/* exit code from main */ 468+static int uccopy_problems = 0; 469+ 470 /* TRUE if the current file being copied from is in the cwd. */ 471 static boolean fCneeds_cwd; 472 473@@ -541,6 +545,24 @@ 474 ucabort (); 475 } 476 477+ if (flocal && !fsysdep_file_exists(zfrom)) { 478+ wordexp_t w; 479+ int rc = wordexp(zfrom, &w, WRDE_NOCMD|WRDE_SHOWERR|WRDE_UNDEF); 480+ if (rc == 0) { 481+ if (w.we_wordc > 1) { 482+ /* It would be nice to handle more then one expanded 483+ return, but also hard and SuSv3 only mandates one work */ 484+ ulog(LOG_ERROR, 485+ "expanded %s into %d words, expected only one", 486+ zfrom, (int)(w.we_wordc)); 487+ } else { 488+ ubuffree(zfrom); 489+ zfrom = zbufcpy(w.we_wordv[0]); 490+ } 491+ wordfree(&w); 492+ } 493+ } 494+ 495 if (! flocal || ! fsysdep_directory (zfrom)) 496 uccopy (zfrom, zdestfile, FALSE); 497 else 498@@ -615,7 +637,7 @@ 499 } 500 } 501 502- usysdep_exit (fexit); 503+ usysdep_exit (fexit && !uccopy_problems); 504 505 /* Avoid error about not returning. */ 506 return 0; 507@@ -706,8 +728,10 @@ 508 509 /* Copy from a local file. Make sure the user has access to 510 this file, since we are running setuid. */ 511- if (! fsysdep_access (zfile)) 512- ucabort (); 513+ if (! fsysdep_access (zfile)) { 514+ uccopy_problems++; 515+ return; 516+ } 517 518 /* If this copy is being requested by a remote system, we may 519 transfer the file if it needs the current working directory 520@@ -749,8 +773,9 @@ 521 ucabort (); 522 523 efrom = esysdep_user_fopen (zfile, TRUE, TRUE); 524- if (! ffileisopen (efrom)) 525+ if (! ffileisopen (efrom)) { 526 ucabort (); 527+ } 528 if (! fcopy_open_file (efrom, zto, FALSE, fCmkdirs, TRUE)) 529 ucabort (); 530 (void) ffileclose (efrom); 531@@ -867,6 +892,8 @@ 532 fprintf (e, " -d"); 533 else 534 fprintf (e, " -f"); 535+ if (0) 536+ fprintf(e, " -x abnormal,config,spooldir,execute"); 537 fprintf (e, " -g %c", bCgrade); 538 if (fCmail) 539 fprintf (e, " -m"); 540@@ -1178,9 +1205,11 @@ 541 { 542 struct sjob *qjob; 543 char *zjobid; 544+ int j_cnt = 0; 545 546 for (qjob = qCjobs; qjob != NULL; qjob = qjob->qnext) 547 { 548+ j_cnt++; 549 ulog_system (qjob->qsys->uuconf_zname); 550 zjobid = zsysdep_spool_commands (qjob->qsys, bCgrade, qjob->ccmds, 551 qjob->pascmds, (boolean *) NULL); 552@@ -1225,6 +1254,11 @@ 553 ubuffree (zjobid); 554 } 555 } 556+ 557+ if (j_cnt == 0 && fjobid) { 558+ /* Local jobs don't have a spoolid, but SuSv3 demands one */ 559+ printf("%s.93788%d", zClocalname, getpid()); 560+ } 561 } 562 563 /* Return the system name for which we have created commands, or NULL 564diff -ruN ./uux.c ../uucp-new/uux.c 565--- ./uux.c 2005-03-08 16:49:14.000000000 -0800 566+++ ../uucp-new/uux.c 2005-03-21 15:29:22.000000000 -0800 567@@ -126,6 +126,10 @@ 568 static struct scmd *pasXcmds; 569 static int cXcmds; 570 571+/* Name of the spool file for this execution */ 572+static char *zXqt_name = NULL; 573+ 574+ 575 /* A file to close if we're forced to exit. */ 576 static FILE *eXclose; 577 578@@ -522,6 +526,7 @@ 579 break; 580 } 581 } 582+ fgetcwd = TRUE; 583 584 #ifdef SIGINT 585 usysdep_signal (SIGINT); 586@@ -841,8 +846,11 @@ 587 if (zdata == NULL) 588 uxabort (EX_OSERR); 589 590- if (fcopy || flink || fXxqtlocal) 591+ if (fcopy || flink) 592 { 593+ /* This code path use to include fXxqtlocal, but now we skip 594+ it as fXxqtlocal will use raw path names unless fcopy or flink 595+ are provided */ 596 boolean fdid; 597 598 uxrecord_file (zdata); 599@@ -895,10 +903,18 @@ 600 601 if (fXxqtlocal) 602 { 603- if (finput) 604+ if (finput) { 605 uxadd_xqt_line ('I', zuse, (char *) NULL); 606- else 607- pzargs[i] = zuse; 608+ } else { 609+ /* XXX need full path! /var/spool/uucp/UUNAME/D./... */ 610+ pzargs[i] = NULL; 611+ if (fcopy || flink) { 612+ asprintf(pzargs + i, "/var/spool/uucp/%s/D./%s", 613+ zXxqtloc, zuse); 614+ } else { 615+ pzargs[i] = zfile; 616+ } 617+ } 618 } 619 else 620 { 621@@ -1261,6 +1277,9 @@ 622 finputcopied ? "C" : "c", 623 zinput_temp, zforward); 624 } 625+ if (fXxqtlocal) { 626+ uxadd_xqt_line('W', zScwd, NULL); 627+ } 628 if (fno_ack) 629 uxadd_xqt_line ('N', (const char *) NULL, (const char *) NULL); 630 if (ferror_ack) 631@@ -1337,6 +1356,10 @@ 632 else 633 ulog (LOG_NORMAL, "Queuing %s (%s)", zfullcmd, zXnames); 634 635+ if (fjobid) { 636+ printf("%s\n", zXqt_name); 637+ } 638+ 639 ulog_close (); 640 } 641 642@@ -1443,20 +1466,18 @@ 643 644 if (eXxqt_file == NULL) 645 { 646- const char *zxqt_name; 647- 648 if (fXxqtlocal) 649- zxqt_name = zsysdep_xqt_file_name (); 650+ zXqt_name = zsysdep_xqt_file_name (); 651 else 652- zxqt_name = zsysdep_data_file_name (&sXxqtsys, zXxqtloc, bXgrade, TRUE, 653+ zXqt_name = zsysdep_data_file_name (&sXxqtsys, zXxqtloc, bXgrade, TRUE, 654 abXxqt_tname, (char *) NULL, 655 abXxqt_xname); 656- if (zxqt_name == NULL) 657+ if (zXqt_name == NULL) 658 uxabort (EX_OSERR); 659 660- uxrecord_file (zxqt_name); 661+ uxrecord_file (zXqt_name); 662 663- eXxqt_file = esysdep_fopen (zxqt_name, FALSE, FALSE, TRUE); 664+ eXxqt_file = esysdep_fopen (zXqt_name, FALSE, FALSE, TRUE); 665 if (eXxqt_file == NULL) 666 uxabort (EX_OSERR); 667 } 668diff -ruN ./uuxqt.c ../uucp-new/uuxqt.c 669--- ./uuxqt.c 2005-03-08 16:49:14.000000000 -0800 670+++ ../uucp-new/uuxqt.c 2005-03-29 14:41:20.000000000 -0800 671@@ -432,6 +432,7 @@ 672 E (process with exec) 673 M status-file 674 Q (C, I, O, F, R, U, M arguments are backslash quoted) 675+ W change working directory 676 # comment 677 678 Unrecognized commands are ignored. We actually do not recognize 679@@ -445,6 +446,8 @@ 680 static char **azQargs; 681 /* Command as a complete string. */ 682 static char *zQcmd; 683+/* Working directory */ 684+static char *zQwd; 685 /* Standard input file name. */ 686 static char *zQinput; 687 /* Standard output file name. */ 688@@ -519,6 +522,7 @@ 689 { "E", UUCONF_CMDTABTYPE_FN | 0, (pointer) &fQuse_exec, iqset }, 690 { "M", UUCONF_CMDTABTYPE_STRING, (pointer) &zQstatus_file, NULL }, 691 { "Q", UUCONF_CMDTABTYPE_FN | 0, (pointer) &fQquoted, iqset }, 692+ { "W", UUCONF_CMDTABTYPE_STRING | 0, (pointer) &zQwd, NULL }, 693 { NULL, 0, NULL, NULL } 694 }; 695 696@@ -686,6 +690,25 @@ 697 #define FREE_OUTPUT (020) 698 #define FREE_MAIL (040) 699 700+static void ulog_azQargs(char *msg) { 701+ char *buf = NULL; 702+ int i; 703+ for(i = 0; azQargs[i]; i++) { 704+ char *tmp = NULL; 705+ asprintf(&tmp, "%s [%d] '%s'", buf ? buf : "", i, azQargs[i]); 706+ free(buf); 707+ buf = tmp; 708+ } 709+ ulog(LOG_ERROR, "%s %s", msg, buf); 710+ free(buf); 711+} 712+ 713+char *strbufdup(char *src) { 714+ char *ret = zbufalc(strlen(src)); 715+ strcpy(ret, src); 716+ return ret; 717+} 718+ 719 /* Process an execute file. The zfile argument is the name of the 720 execute file. The zbase argument is the base name of zfile. The 721 qsys argument describes the system it came from. The zcmd argument 722@@ -731,6 +754,7 @@ 723 724 azQargs = NULL; 725 zQcmd = NULL; 726+ zQwd = NULL; 727 zQinput = NULL; 728 zQoutfile = NULL; 729 zQoutsys = NULL; 730@@ -1006,7 +1030,7 @@ 731 for (zopts = azQargs[i] + 1; *zopts != '\0'; zopts++) 732 { 733 /* The -g, -n, and -s options take an argument. */ 734- if (*zopts == 'g' || *zopts == 'n' || *zopts == 's') 735+ if (*zopts == 'g' || *zopts == 'n' || *zopts == 's' || *zopts == 'x') 736 { 737 if (zopts[1] == '\0') 738 ++i; 739@@ -1039,25 +1063,38 @@ 740 } 741 } 742 743+#define USE_KTRACE 0 744 /* Add the -u argument. This is required to let uucp do the 745 correct permissions checking on the file transfer. */ 746 for (i = 0; azQargs[i] != NULL; i++) 747 ; 748- azargs = (char **) xmalloc ((i + 2) * sizeof (char *)); 749+ azargs = (char **) xmalloc ((i + 2 + USE_KTRACE) * sizeof (char *)); 750+ ulog(LOG_ERROR, "USE_KTRACE %d azargs %p azQargs %p", USE_KTRACE, azargs, azQargs); 751 azargs[0] = azQargs[0]; 752 zuser = zQuser; 753 if (zuser == NULL) 754 zuser = "uucp"; 755- azargs[1] = zbufalc (strlen (zQsystem) + strlen (zuser) 756+ azargs[1 + USE_KTRACE] = zbufalc (strlen (zQsystem) + strlen (zuser) 757 + sizeof "-u!"); 758- sprintf (azargs[1], "-u%s!%s", zQsystem, zuser); 759- memcpy (azargs + 2, azQargs + 1, i * sizeof (char *)); 760+ sprintf (azargs[1 + USE_KTRACE], "-u%s!%s", zQsystem, zuser); 761+ memcpy (azargs + 2 + USE_KTRACE, azQargs + 1 + USE_KTRACE, i * sizeof (char *)); 762 xfree ((pointer) azQargs); 763 azQargs = azargs; 764 765+#if USE_KTRACE 766+ ulog(LOG_ERROR, "KTRACE"); 767+ azQargs[0] = strbufdup("ktrace"); 768+ azQargs[1] = strbufdup("-f"); 769+ azQargs[2] = strbufdup("/tmp/uu.kt"); 770+ azQargs[3] = zsysdep_find_command ("uucp", qsys->uuconf_pzcmds, qsys->uuconf_pzpath, &ferr); 771+ 772+ ulog_azQargs("USE_KTRACE "); 773+#endif 774+ 775 /* Find the uucp binary. */ 776- zabsolute = zsysdep_find_command ("uucp", qsys->uuconf_pzcmds, 777- qsys->uuconf_pzpath, &ferr); 778+ zabsolute = zsysdep_find_command (USE_KTRACE ? "ktrace" : "uucp", 779+ qsys->uuconf_pzcmds, qsys->uuconf_pzpath, &ferr); 780+ ulog(LOG_ERROR, "zabsolute %s", zabsolute); 781 if (zabsolute == NULL && ! ferr) 782 { 783 const char *azcmds[2]; 784@@ -1154,8 +1191,11 @@ 785 } 786 } 787 788+ ulog(LOG_ERROR, "Eh?"); 789 ubuffree (azQargs[0]); 790 azQargs[0] = zabsolute; 791+ ulog_azQargs("zabsolute"); 792+ ulog(LOG_ERROR, "azQargs[1] %p", azQargs[i]); 793 794 for (i = 1; azQargs[i] != NULL; i++) 795 { 796@@ -1164,10 +1204,12 @@ 797 zlocal = zsysdep_xqt_local_file (qsys, azQargs[i]); 798 if (zlocal != NULL) 799 { 800+ ulog(LOG_ERROR, "[%d] zlocal %s, a %s", i, zlocal, azQargs[i]); 801 ubuffree (azQargs[i]); 802 azQargs[i] = zlocal; 803 } 804 } 805+ ulog_azQargs("zsysdep_xqt_local_file"); 806 807 #if ! ALLOW_FILENAME_ARGUMENTS 808 809@@ -1204,7 +1246,9 @@ 810 811 #endif /* ! ALLOW_FILENAME_ARGUMENTS */ 812 813+ ulog(LOG_ERROR, "Executing %s (%s)", zbase, zQcmd); 814 ulog (LOG_NORMAL, "Executing %s (%s)", zbase, zQcmd); 815+ ulog(LOG_ERROR, "zQoutsys %p zQinput %p", zQoutsys, zQinput); 816 817 if (zQinput != NULL) 818 { 819@@ -1381,6 +1425,7 @@ 820 } 821 } 822 823+ ulog(LOG_ERROR, "fsysdep_copy_uuxqt_files..."); 824 /* Move the required files to the execution directory if necessary. */ 825 zinput = zQinput; 826 if (! fsysdep_copy_uuxqt_files (cQfiles, (const char **) azQfiles, 827@@ -1409,8 +1454,9 @@ 828 /* Get a shell command which uses the full path of the command to 829 execute. */ 830 clen = 0; 831- for (i = 0; azQargs[i] != NULL; i++) 832+ for (i = 0; azQargs[i] != NULL; i++) { 833 clen += strlen (azQargs[i]) + 1; 834+ } 835 zfullcmd = zbufalc (clen); 836 strcpy (zfullcmd, azQargs[0]); 837 for (i = 1; azQargs[i] != NULL; i++) 838@@ -1419,10 +1465,11 @@ 839 strcat (zfullcmd, azQargs[i]); 840 } 841 842+ ulog(LOG_ERROR, "fsysdep_execute fshell %d zfullcmd: %s", fshell, zfullcmd); 843 if (! fsysdep_execute (qsys, 844 zQuser == NULL ? (const char *) "uucp" : zQuser, 845 (const char **) azQargs, zfullcmd, zQinput, 846- zoutput, fshell, iQlock_seq, &zerror, &ftemp)) 847+ zoutput, zQwd, fshell, iQlock_seq, &zerror, &ftemp)) 848 { 849 ubuffree (zfullcmd); 850 851@@ -1556,6 +1603,10 @@ 852 } 853 } 854 855+ /* XXX the umask doesn't seem to work, maybe a launchd problem, 856+ revisit if UUCP is ever really added to the system */ 857+ chmod(zoutput, 0666); 858+ 859 if (zerror != NULL) 860 { 861 (void) remove (zerror); 862