We can reduce our differences from upstream ksh by simply using their ERROR_translate() function instead of our janky and obsolete msg_translate, we also move DtGetMessage() to msgs.c and lockedfiledescriptors and, unlockfiledescriptors to extra.c to lessen modifications to init.c, which all changes will hopefully be moved elsewhere in the future
227 lines
5.0 KiB
C
227 lines
5.0 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: extra.c /main/4 1995/11/01 15:54:55 rswiston $ */
|
|
|
|
/* Copyright (c) 1991, 1992 UNIX System Laboratories, Inc. */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF */
|
|
/* UNIX System Laboratories, Inc. */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
|
|
#include "defs.h"
|
|
#include "shell.h"
|
|
#include "name.h"
|
|
#include "stdio.h"
|
|
#include "msgs.h"
|
|
|
|
|
|
void
|
|
env_set(
|
|
char *var )
|
|
{
|
|
(void)nv_open(var, sh.var_tree, NV_ASSIGN);
|
|
}
|
|
|
|
void
|
|
env_set_gbl(
|
|
char *vareqval )
|
|
{
|
|
env_set(vareqval);
|
|
}
|
|
|
|
char *
|
|
env_get(
|
|
char *var )
|
|
{
|
|
Namval_t *np;
|
|
char *val;
|
|
|
|
np = nv_search(var,sh.var_tree,0);
|
|
if (np && (val = nv_getval(np)))
|
|
return(val);
|
|
return(NULL);
|
|
}
|
|
|
|
|
|
int
|
|
ksh_eval(
|
|
char *cmd )
|
|
{
|
|
sh_eval(sfopen(NIL(Sfio_t*),cmd,"s"),0);
|
|
sfsync(sh.outpool);
|
|
return(sh.exitval);
|
|
}
|
|
|
|
void
|
|
env_set_var(
|
|
char *var,
|
|
char *val )
|
|
{
|
|
int len;
|
|
char tmp[512];
|
|
char *set = &tmp[0];
|
|
|
|
if ((len = strlen(var) + strlen(val?val:"") + 2) > sizeof(tmp)) /* 11/06 CHANGED */
|
|
set = malloc(len);
|
|
strcpy(set, var);
|
|
strcat(set, "=");
|
|
strcat(set, val?val:""); /* 11/06 CHANGED */
|
|
env_set(set);
|
|
if (set != &tmp[0])
|
|
free(set);
|
|
}
|
|
|
|
void
|
|
env_blank(
|
|
char *var )
|
|
{
|
|
env_set_var(var, "");
|
|
}
|
|
|
|
void
|
|
printerr(
|
|
char *cmd,
|
|
char *msg1,
|
|
char *msg2 )
|
|
{
|
|
if (msg1 == NULL)
|
|
msg1 = "";
|
|
if (msg2 == NULL)
|
|
msg2 = "";
|
|
if (cmd && (strlen(cmd) > 0))
|
|
printf( "%s: %s %s\n", cmd, msg1, msg2);
|
|
else
|
|
printf( "%s %s\n", msg1, msg2);
|
|
}
|
|
|
|
void
|
|
printerrf(
|
|
char *cmd,
|
|
char *fmt,
|
|
char *arg0,
|
|
char *arg1,
|
|
char *arg2,
|
|
char *arg3,
|
|
char *arg4,
|
|
char *arg5,
|
|
char *arg6,
|
|
char *arg7 )
|
|
{
|
|
char buf[2048];
|
|
if (arg0 == NULL)
|
|
arg0 = "";
|
|
if (arg1 == NULL)
|
|
arg1 = "";
|
|
if (arg2 == NULL)
|
|
arg2 = "";
|
|
if (arg3 == NULL)
|
|
arg3 = "";
|
|
if (arg4 == NULL)
|
|
arg4 = "";
|
|
if (arg5 == NULL)
|
|
arg5 = "";
|
|
if (arg6 == NULL)
|
|
arg6 = "";
|
|
if (arg7 == NULL)
|
|
arg7 = "";
|
|
|
|
sprintf(buf, fmt, arg0, arg1, arg2, arg3,arg4, arg5, arg6, arg7);
|
|
if (cmd && (strlen(cmd) > 0))
|
|
printf("%s: %s\n", cmd, buf);
|
|
else
|
|
printf("%s\n", buf);
|
|
}
|
|
|
|
/****************************************************************************
|
|
*
|
|
* The following two functions are ugly, but necessary. Ksh reserves file
|
|
* descriptors 0 - 9 for use by shell scripts, and has intimate knowledge
|
|
* of how and when they were opened. Unfortunately, certain dtksh functions
|
|
* (XtInitialize, catopen, ttdt_open, _DtActionInvoke, others) open file
|
|
* descriptors which are not known to ksh. We can't let these file
|
|
* descriptors fall in the 0 - 9 range, because we can't afford to have
|
|
* the shell script overriding our file descriptors. Therefore, any of
|
|
* our commands which open files must first lock our file descriptors 0 - 9,
|
|
* thus forcing the command to get a file descriptor out of the shell's
|
|
* range. After the command has opened its file descriptor, it then needs
|
|
* to unlock file descriptors 0 - 9, so that the shell script will have
|
|
* access to them again.
|
|
*
|
|
**************************************************************************/
|
|
|
|
|
|
/*
|
|
* Return a list of the file descriptors we had to open, to lock out file
|
|
* descriptors 0 - 9; this list should be freed (and the file descriptors
|
|
* closed) by calling UnlockkshFileDescriptors().
|
|
*/
|
|
|
|
int *LockKshFileDescriptors(void)
|
|
{
|
|
int * fdList;
|
|
int i;
|
|
int fd, newfd;
|
|
|
|
fdList = (int *)malloc(sizeof(int) * 10);
|
|
for (i = 0; i < 10; i++)
|
|
fdList[i] = -1;
|
|
|
|
if ((fd = open("/dev/null", O_RDONLY)) >= 0)
|
|
{
|
|
if (fd < 10)
|
|
{
|
|
fdList[0] = fd;
|
|
for (i = 1; i < 10; i++)
|
|
{
|
|
if ((newfd = dup(fd)) < 10)
|
|
fdList[i] = newfd;
|
|
else
|
|
{
|
|
close(newfd);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
close(fd);
|
|
}
|
|
|
|
return(fdList);
|
|
}
|
|
|
|
void UnlockKshFileDescriptors(int *fdList)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 10; i++)
|
|
{
|
|
if (fdList[i] != (-1))
|
|
close(fdList[i]);
|
|
}
|
|
|
|
free((char *)fdList);
|
|
}
|