cdesktopenv/cde/programs/dtksh/extra.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);
}