blob: e94ce047482ee3181a125f265f665dd4399570da [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* DESCRIPTION:
* Generic ASCII to EBCDIC character conversion. This file defines
* a number of "wrapper" functions to transparently convert between
* ASCII and EBCDIC. Each function calls a platform specific function
* (defined elsewhere) to perform the actual conversion.
* ===========================================================================
*/
/*
* ======================================================================
* Disable the redefinition of the system IO functions, this
* prevents two ATOE functions calling themselves.
* ======================================================================
*/
#undef HY_ATOE
/*
* ======================================================================
* Include all system header files.
* ======================================================================
*/
#define _OPEN_SYS_FILE_EXT /* For SETCVTOFF */
#ifndef __SUSV3 /* For dlfcn.h */
#define __SUSV3
#endif
#include <unistd.h>
#include <fcntl.h> /* <--SETCVTOFF in here */
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <utime.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <stdarg.h>
#include <ctype.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <locale.h>
#include <netdb.h>
#include <dll.h>
#include <errno.h>
#include <iconv.h>
#include <langinfo.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <sys/utsname.h>
#include <sys/ipc.h>
#include <limits.h>
#include <_Ccsid.h>
#include <dlfcn.h>
#define check_fcntl_init() (1)
#define set_SETCVTOFF()
#define use_fcntl (0)
int env_mutex_initialized = 0;
/* Whether file tagging enabled by user */
static int fileTaggingEnabled = 0;
/* CCSID for new files */
static __ccsid_t newFileCCSID = 0;
/*
* ======================================================================
* ASCII<=>EBCDIC translate tables built using iconv()
* ======================================================================
*/
#define BUFLEN 6144
#define CONV_TABLE_SIZE 256
char a2e_tab[CONV_TABLE_SIZE];
char e2a_tab[CONV_TABLE_SIZE];
/*
* ======================================================================
* Define ae2,e2a,a2e_string, e2a_string
* ======================================================================
*/
#include "atoe.h"
int atoe_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
int atoe_fprintf(FILE *, const char *, ...);
struct passwd *etoa_passwd(struct passwd *e_passwd);
/*
* ======================================================================
* A simple linked list of ascii environment variable entries;
* each entry is added as a result of a getenv() or putenv() as
* reflected through the EBCDIC environment maintained by the system.
* This improves performance by having each environment variable
* converted only once, and also avoids storage leaks with repeated
* calls which refer to the same variable.
* ======================================================================
*/
struct ascii_envvar {
struct ascii_envvar *next;
char *name;
char *value;
};
typedef struct ascii_envvar envvar_t;
/* Anchor entry */
envvar_t env_anchor = {NULL, NULL, NULL};
/* Mutex for single-threading list updates */
pthread_mutex_t env_mutex;
char* sysTranslate(const char *source, int length, char *trtable, char* xlate_buf)
{
return sysTranslateASM( source, length, trtable, xlate_buf );
}
/**************************************************************************
* name - enumEnvvar
* description -
* enumEnvvar() takes an input pointer that is either null for
* the first call or contains the result returned from a previous
* call. It will also modify two input pointer parameters to point
* to the current envar name string and the envar value string. The
* strings will contain ascii characters.
* parameters -
* returns -
*************************************************************************/
void *
enumEnvvar(void * input_ptr, char ** name, char ** value) {
if (0 == env_anchor.next ) { /* empty envar list case */
*name = 0;
*value= 0;
return(void *) 0;
}
if (0 == input_ptr) { /* non-empty list, first call case */
*name = env_anchor.name;
*value = env_anchor.value;
return(void *) env_anchor.next;
} else { /* walk the list case */
envvar_t * curr_env= (envvar_t *)input_ptr;
*name = curr_env->name;
*value = curr_env->value;
return(void *) curr_env->next; /* next = 0 signals end of list */
}
}
/**************************************************************************
* name - getEnvvar
* description -
* getEnvvar() - returns a pointer to the ascii_envvar structure
* for the environment variable specified by name, or NULL if there
* is no entry for that name. No need to serialise this code.
* parameters -
* returns -
*************************************************************************/
envvar_t *
getEnvvar(char *name)
{
envvar_t *envvar = env_anchor.next;
while (envvar != NULL) {
if (strcmp(name, envvar->name) == 0)
break;
envvar = envvar->next;
}
return envvar;
}
/**************************************************************************
* name - putEnvvar
* description -
* putEnvvar() - updates the ascii_envvar structure for the variable
* specified by name if it already exists, or creates a new ascii_envvar
* structure if it does not, and returns a pointer to the entry.
* This function is single_threaded.
* parameters -
* returns -
*************************************************************************/
envvar_t *
putEnvvar(char *name, char *value, envvar_t *updvar)
{
envvar_t *envvar;
if (!env_mutex_initialized) {
/* First time in - initialise the mutex */
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutex_init(&env_mutex, &attr);
env_mutex_initialized = 1;
}
/* Grab the lock */
pthread_mutex_lock(&env_mutex);
if (updvar != NULL) {
/* Update the existing entry */
envvar = updvar;
free(envvar->value);
envvar->value = strdup(value);
} else {
/* Add a new entry to the list */
envvar = &env_anchor;
while (envvar->next != NULL) {
envvar = envvar->next;
}
envvar->next = malloc(sizeof(envvar_t));
envvar = envvar->next;
envvar->next = NULL;
envvar->name = strdup(name);
envvar->value = strdup(value);
}
/* Release the lock */
pthread_mutex_unlock(&env_mutex);
return envvar;
}
/**************************************************************************
* name - a2e_func
* description - Function implementation of a2e macro, for use by DLLs
* that don't want to have to link with sysTranslate.o
* parameters - str, ASCII string to convert
* len, Length of str
* returns - Converted EBCDIC string
*************************************************************************/
char *
a2e_func(char *str, int len)
{
return a2e(str, len);
}
/**************************************************************************
* name - e2a_func
* description - Function implementation of e2a macro, for use by DLLs
* that don't want to have to link with sysTranslate.o
* parameters - str, EBCIDC string to convert
* len, Length of str
* returns - Converted ASCII string
*************************************************************************/
char *
e2a_func(char *str, int len)
{
return e2a(str, len);
}
/**************************************************************************
* name - atoe_getenv
* description -
* Returns a pointer to the value of the environment
* variable specified by a_name. The ascii environment is searched first,
* and the value is returned if found. If not, the EBCDIC environment
* is checked, and an ascii entry is created if it is found. If not,
* NULL is returned.
* parameters -
* returns -
*************************************************************************/
char *
atoe_getenv(const char *name)
{
char *value, *e_name, *e_value;
envvar_t *envvar;
if (name == NULL) {
return NULL;
}
if ((envvar = getEnvvar((char *)name)) != NULL) {
/* We already have the variable in ascii */
return envvar->value;
}
/* Get the EBCIDC value from the system */
e_name = a2e_string(name);
e_value = getenv(e_name);
free(e_name);
if (e_value == NULL) {
/* Variable is not currently defined */
return NULL;
}
/* Create a new ascii environment variable entry */
value = e2a_string(e_value);
envvar = putEnvvar((char *)name, value, NULL);
free(value);
return envvar->value;
}
/**************************************************************************
* name - atoe_putenv
* description -
* Issues putenv() to set the system EBCDIC environment
* then updates the ascii environment
* parameters -
* returns -
*************************************************************************/
int
atoe_putenv(const char *envstr)
{
char *w_envstr, *name, *value;
envvar_t *envvar;
int result;
/* Set the system EBCDIC environment - don't free w_envstr as it's memory is held by the environment */
w_envstr = a2e_string(envstr);
result = putenv(w_envstr);
if (result == 0) {
/* Update the ascii environment */
char *asciienv = strdup(envstr);
/*
* The name is everything upto the first '='s character and the value
* is everything after it.
*/
name = asciienv;
value = strchr(asciienv, '=');
*value = '\0'; /* Add '\0' so name is NULL termintated. */
value++; /* Value is now everything after the '='. */
envvar = putEnvvar(name, value, getEnvvar(name));
free(asciienv);
}
return result;
}
/**************************************************************************
* name - atoe_perror
* description -
* parameters -
* returns -
*************************************************************************/
void
atoe_perror( const char *string)
{
char *e;
e = a2e_string(string);
perror(e);
free(e);
return;
}
/**************************************************************************
* name - atoe_enableFileTagging
* description - Enables tagging of all new files to the specified ccsid
* parameters - ccsid - Required CCSID for file tags
* returns - none
*************************************************************************/
void
atoe_setFileTaggingCcsid(void *pccsid) {
__ccsid_t ccsid = *(__ccsid_t*) pccsid;
newFileCCSID = ccsid;
}
/**************************************************************************
* name - fileTagRequired
* description - Determines whether or not a specified file needs tagging
* parameters - filename (platform encoded)
* returns - 1 if file tagging enabled and file doesn't already exist.
* 0 otherwise
*************************************************************************/
static int
fileTagRequired(const char *filename) {
struct stat sbuf;
if (fileTaggingEnabled && newFileCCSID != 0 &&
(stat(filename,&sbuf) == -1 && errno == ENOENT) ) {
return 1;
}
return 0;
}
/**************************************************************************
* name - setFileTag
* description - Sets the file tag to newFileCCSID for the specified file
* descriptor
* parameters - fd - open file descriptor of file for tagging
* returns - none
*************************************************************************/
static void
setFileTag(int fd) {
struct file_tag tag;
tag.ft_ccsid = newFileCCSID;
tag.ft_txtflag = 1;
tag.ft_deferred = 0;
tag.ft_rsvflags = 0;
fcntl(fd, F_SETTAG, &tag);
}
/**************************************************************************
* name - atoe_tagged_open
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_open( const char *fname, int options, ...)
{
int fd;
int mode;
int tagFile;
va_list args;
char *f;
check_fcntl_init();
/* See if the file needs to be tagged */
tagFile = fileTagRequired(fname);
f = a2e_string(fname);
va_start(args,options);
if ( options & O_CREAT ) {
mode = va_arg(args, int);
} else {
mode = 0;
}
va_end(args);
fd = open(f,options,mode);
if ( (fd != -1) && /* file descriptor ok? */
(use_fcntl) ) /* OS level is ok */
{
set_SETCVTOFF();
}
if (fd != -1) { /* file descriptor ok? */
if (tagFile) {
setFileTag(fd);
}
}
free(f);
return fd;
}
/**************************************************************************
* name - atoe_tempnam
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_tempnam( const char *dir, char *pfx)
{
char *tempfn = 0;
char *a = 0;
char *d = a2e_string(dir);
char *p = a2e_string(pfx);
if (( tempfn = tempnam(d,p)) == 0 ) {
atoe_fprintf(stderr,"Creation of temp file %s/%s failed.\n",dir,pfx);
} else {
a = e2a_string(tempfn);
free(tempfn);
}
free(d);
free(p);
return a;
}
/**************************************************************************
* name - atoe_stat
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_stat( const char *pathname, struct stat *sbuf)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = stat(e,sbuf);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_lstat
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_lstat( const char *pathname, struct stat *sbuf)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = lstat(e,sbuf);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_fopen
* description -
* parameters -
* returns -
*************************************************************************/
FILE *
atoe_fopen( const char *filename, char *mode)
{
FILE *outfp;
char *f,*m;
int fd = -1; /* file descriptor */
check_fcntl_init();
f = a2e_string(filename);
m = a2e_string(mode);
outfp = fopen(f,m);
if ( (outfp != NULL) && /* fopen() ok? */
(use_fcntl) && /* OS level is ok */
( (fd = fileno(outfp)) != -1)) /* have a file descriptor? */
{
set_SETCVTOFF();
}
free(f);
free(m);
return outfp;
}
/**************************************************************************
* name - atoe_freopen
* description -
* parameters -
* returns -
*************************************************************************/
FILE *
atoe_freopen(const char *filename, char *mode, FILE *stream)
{
FILE *outfp;
char *f,*m;
int fd = -1; /* file descriptor */
check_fcntl_init();
f = a2e_string(filename);
m = a2e_string(mode);
outfp = freopen(f, m, stream);
if ( (outfp != NULL) && /* fopen() ok? */
(use_fcntl) && /* OS level is ok */
( (fd = fileno(outfp)) != -1)) /* have a file descriptor? */
{
set_SETCVTOFF();
}
free(f);
free(m);
return outfp;
}
/**************************************************************************
* name - atoe_mkdir
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_mkdir( const char *pathname, mode_t mode)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = mkdir(e, mode);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_remove
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_remove( const char *pathname)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = remove(e);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_strerror
* description -
* parameters -
* returns -
*************************************************************************/
#define ERRNO_CACHE_SIZE 250
typedef struct ascii_errno_t {
int errnum;
char *ascii_msg;
} ascii_errno_t;
static ascii_errno_t errno_cache[ERRNO_CACHE_SIZE];
static int errno_cache_next = 0;
static pthread_mutex_t strerror_mutex = PTHREAD_MUTEX_INITIALIZER;
static int strerror_initialized = 0;
char *
atoe_strerror(int errnum)
{
char *a,*e;
int index;
pthread_mutex_lock(&strerror_mutex);
if (0 == strerror_initialized) {
for (index=0; index<ERRNO_CACHE_SIZE; index++) {
errno_cache[index].errnum = -1;
errno_cache[index].ascii_msg = 0;
}
strerror_initialized = 1;
}
for (index=0;
index<ERRNO_CACHE_SIZE, errno_cache[index].errnum!=-1;
index++) {
if (errnum == errno_cache[index].errnum) {
pthread_mutex_unlock(&strerror_mutex);
return errno_cache[index].ascii_msg;
}
}
e = strerror(errnum);
a = e2a_string(e);
errno_cache[errno_cache_next].errnum = errnum;
if (errno_cache[errno_cache_next].ascii_msg)
free(errno_cache[errno_cache_next].ascii_msg);
errno_cache[errno_cache_next].ascii_msg = a;
if (++errno_cache_next == ERRNO_CACHE_SIZE)
errno_cache_next = 0;
pthread_mutex_unlock(&strerror_mutex);
return a;
}
/**************************************************************************
* name - atoe_getcwd
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_getcwd(char *buffer, size_t size)
{
char *abuf;
if (getcwd(buffer,size) == NULL) {
atoe_fprintf(stderr,"atoe_getcwd error: %s\n",
errno==ERANGE ? "buffer too small" : atoe_strerror(errno));
buffer = NULL;
} else {
abuf = e2a(buffer,size);
memcpy(buffer,abuf,size);
free(abuf);
}
return buffer;
}
/**************************************************************************
* name - atoe_fgets
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_fgets (char *buffer, int num, FILE *file)
{
char *abuf;
if (fgets(buffer, num, file)) {
int len = strlen(buffer);
abuf = e2a(buffer,len);
memcpy(buffer,abuf,len);
free(abuf);
return buffer;
}
return(char *)0;
}
/**************************************************************************
* name - atoe_gets
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_gets(char *buffer)
{
char *abuf;
if (gets(buffer)) {
int len = strlen(buffer);
abuf = e2a(buffer,len);
memcpy(buffer,abuf,len);
free(abuf);
return buffer;
}
return(char *)0;
}
/**************************************************************************
* name - atoe_unlink
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_unlink( const char *pathname)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = unlink(e);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_unlink
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_rmdir( const char *pathname)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = rmdir(e);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_access
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_access( const char *pathname, int how)
{
int rc;
char *e;
e = a2e_string(pathname);
rc = access(e, how);
free(e);
return rc;
}
/**************************************************************************
* name - atoe_opendir
* description -
* parameters -
* returns -
*************************************************************************/
DIR *
atoe_opendir( const char *dirname)
{
DIR *dir;
char *e;
e = a2e_string(dirname);
dir = opendir(e);
free(e);
return dir;
}
/**************************************************************************
* name - atoe_readdir
* description -
* parameters -
* returns -
*************************************************************************/
struct dirent *
atoe_readdir(DIR *dir) {
struct dirent *d;
char * a;
d = readdir(dir);
if (d == NULL) return NULL;
a = e2a_string(d->d_name);
strcpy(d->d_name, a);
free(a);
return d;
}
/**************************************************************************
* name - atoe_realpath
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_realpath(const char *file_name, char *resolved_name)
{
char e_resolved_name[MAXPATHLEN];
char *e_file_name, *p;
e_file_name = a2e_string(file_name);
p = realpath(e_file_name, e_resolved_name);
if (p == NULL) return p;
p = e2a_string(e_resolved_name);
strcpy(resolved_name, p);
free(p);
return resolved_name;
}
/**************************************************************************
* name - atoe_rename
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_rename(const char *oldname, const char *newname)
{
int rc;
char *o,*n;
o = a2e_string(oldname);
n = a2e_string(newname);
rc = rename(o, n);
free(o);
free(n);
return rc;
}
/**************************************************************************
* name - atoe_getpwuid
* description -
* parameters -
* returns -
*************************************************************************/
struct passwd *
atoe_getpwuid(uid_t uid) {
return etoa_passwd(getpwuid(uid));
}
/**************************************************************************
* name - atoe_getpwnam
* description -
* parameters -
* returns -
*************************************************************************/
struct passwd *
atoe_getpwnam(const char *name) {
struct passwd *e_passwd;
char *e_name;
e_name = a2e_string(name);
e_passwd = getpwnam(e_name);
free(e_name);
return etoa_passwd(e_passwd);
}
/**************************************************************************
* name - etoa_passwd
* description -
* parameters -
* returns -
*************************************************************************/
struct passwd *
etoa_passwd(struct passwd *e_passwd) {
struct passwd *a_passwd = NULL;
if (e_passwd != NULL) {
a_passwd = (struct passwd *)malloc(sizeof(struct passwd));
if (a_passwd != NULL) {
a_passwd->pw_name = e2a_string(e_passwd->pw_name);
a_passwd->pw_uid = e_passwd->pw_uid;
a_passwd->pw_gid = e_passwd->pw_gid;
a_passwd->pw_dir = e2a_string(e_passwd->pw_dir);
a_passwd->pw_shell = e2a_string(e_passwd->pw_shell);
}
}
return a_passwd;
}
/**************************************************************************
* name - atoe_getlogin
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_getlogin(void)
{
char *e_login;
char *a_login = NULL;
e_login = getlogin();
if (e_login != NULL) {
a_login = e2a_string(e_login);
}
return a_login;
}
/**************************************************************************
* name - etoa_group
* description -
* parameters -
* returns -
*************************************************************************/
struct group *
e2a_group(struct group *e_group) {
struct group *a_group = NULL;
if (e_group != NULL) {
a_group = (struct group *)malloc(sizeof(struct group));
if (a_group != NULL) {
char **e_member = NULL;
char **a_member = NULL;
int arraySize = 0;
a_group->gr_name = e2a_string(e_group->gr_name);
a_group->gr_gid = e_group->gr_gid;
for(e_member = e_group->gr_mem; *e_member != NULL; e_member++) {
arraySize++;
}
a_group->gr_mem = (char **)malloc((arraySize+1)*sizeof(char*));
if (a_group->gr_mem != NULL) {
for(e_member = e_group->gr_mem, a_member = a_group->gr_mem;
*e_member != NULL;
e_member++, a_member++) {
*a_member = e2a_string(*e_member);
}
*(++a_member) = NULL;
}
}
}
return a_group;
}
/**************************************************************************
* name - atoe_getgrgid
* description -
* parameters -
* returns -
*************************************************************************/
struct group *
atoe_getgrgid(gid_t gid)
{
struct group *e_group;
struct group *a_group = NULL;
e_group = getgrgid(gid);
if (e_group != NULL) {
a_group = e2a_group(e_group);
}
return a_group;
}
/**************************************************************************
* name - atoe_putchar
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_putchar(int ch)
{
return putchar((int)a2e_tab[ch]);
}
/**************************************************************************
* name - atoe_fprintf
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_fprintf(FILE *file, const char *ascii_chars, ...)
{
va_list args;
char buf[BUFLEN];
char *ebuf;
int len;
va_start(args,ascii_chars);
len = atoe_vsnprintf(buf,BUFLEN,ascii_chars,args);
/* Abort if failed... */
if (len == -1) return len;
ebuf = a2e(buf,len);
#pragma convlit(suspend)
len = fprintf(file,"%s", ebuf);
#pragma convlit(resume)
free(ebuf);
va_end(args);
return len;
}
/**************************************************************************
* name - atoe_printf
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_printf( const char *ascii_chars, ...)
{
va_list args;
char buf[BUFLEN];
char *ebuf;
int len;
va_start(args,ascii_chars);
len = atoe_vsnprintf(buf,BUFLEN,ascii_chars,args);
/* Abort if failed... */
if (len==-1) return len;
ebuf = a2e(buf,len);
#pragma convlit(suspend)
len = printf("%s", ebuf);
#pragma convlit(resume)
free(ebuf);
va_end(args);
return len;
}
/*************************************************************************
* name - std_sprintf
* description -
* This function does not need to convert ascii -> EBCDIC
* as there is no IO
* parameters -
* returns -
*************************************************************************/
int
std_sprintf( const char *buf, char *ascii_chars, ...)
{
int len;
va_list args;
va_start(args,ascii_chars);
len = sprintf((char *)buf, ascii_chars,args);
va_end(args);
return len;
}
/**************************************************************************
* name - atoe_sprintf
* description -
* This function does not need to convert ascii -> EBCDIC
* as there is no IO
* parameters -
* returns -
*************************************************************************/
int
atoe_sprintf( const char *buf, char *ascii_chars, ...)
{
int len;
char wrkbuf[BUFLEN];
va_list args;
va_start(args,ascii_chars);
len = atoe_vsnprintf(wrkbuf,BUFLEN,ascii_chars,args);
va_end(args);
if (-1 == len) return len;
strcpy((char *)buf, wrkbuf);
return len;
}
/**************************************************************************
* name - atoe_vprintf
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_vprintf(const char *ascii_chars, va_list args)
{
return atoe_vfprintf(stdout, ascii_chars, args);
}
/**************************************************************************
* name - atoe_vfprintf
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_vfprintf(FILE *file, const char *ascii_chars, va_list args)
{
char buf[BUFLEN];
char *ebuf;
int len;
len = atoe_vsnprintf(buf,BUFLEN,ascii_chars,args);
if (len == -1) return len;
ebuf = a2e(buf,len);
#pragma convlit(suspend)
len = fprintf(file,"%s", ebuf);
#pragma convlit(resume)
free(ebuf);
return len;
}
/**************************************************************************
* name - atoe_vsprintf
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_vsprintf(char *target, const char *ascii_chars, va_list args)
{
char buf[BUFLEN];
int bsize = 0;
bsize = atoe_vsnprintf(buf,BUFLEN,ascii_chars,args);
if (-1 == bsize) return bsize;
strcpy(target,buf);
return(bsize);
}
/**************************************************************************
* name - atoe_sscanf
* description -
* parameters -
* returns -
* RESTRICTIONS - At the time of writing, there is no requirement to support
* character or string formatting, so I have opted to avoid
* the pain of trawling the format string along with the
* argument list in order to convert characters/strings from
* EBCDIC back to ASCII after calling the RTL sscanf().
*************************************************************************/
int
atoe_sscanf(const char *buffer, const char *format, va_list args)
{
char *e_buffer = a2e_string(buffer);
char *e_format = a2e_string(format);
int len = sscanf((const char *)e_buffer, (const char *)e_format, args);
free(e_buffer);
free(e_format);
return len;
}
/**************************************************************************
* name - atoe_strftime
* description -
* parameters -
* returns -
*************************************************************************/
size_t
atoe_strftime(char *buf, size_t buflen,
const char *format, const struct tm *timeptr)
{
size_t num;
char *e,*a;
e = a2e_string(format);
num = strftime(buf, buflen, e, timeptr);
a = e2a(buf,num);
memcpy(buf,a,num);
free(e);
free(a);
return num;
}
/**************************************************************************
* name - atoe_fwrite
* description -
* parameters -
* returns -
*************************************************************************/
size_t
atoe_fwrite(const void *buffer, size_t size, size_t count, FILE *stream)
{
int numwritten;
char *e;
e = a2e((void *)buffer,size*count);
numwritten = fwrite(e,size,count,stream);
free(e);
return numwritten;
}
/**************************************************************************
* name - atoe_fread
* description -
* parameters -
* returns -
*************************************************************************/
size_t
atoe_fread(void *buffer, size_t size, size_t count, FILE *stream)
{
int numread;
char *a;
numread = fread(buffer,size,count,stream);
a = e2a((char *)buffer,numread);
memcpy(buffer,a,numread);
free(a);
return numread;
}
/**************************************************************************
* name - atoe_system
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_system( char * cmd)
{
char *eb;
int result;
eb = a2e_string(cmd);
result = system(eb) ;
free(eb);
return result;
}
/**************************************************************************
* name - atoe_setlocale
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_setlocale(int category, const char *locale)
{
char *eb, *result;
eb = a2e_string(locale);
result = setlocale(category, eb) ;
return e2a_string(result);
}
/**************************************************************************
* name - atoe_ctime
* description -
* parameters -
* returns -
*************************************************************************/
char *
atoe_ctime(const time_t * t_in)
{
char *eb;
eb = ctime(t_in);
return e2a_string(eb);
}
/**************************************************************************
* name - atoe_strtod
* description -
* parameters -
* returns -
*************************************************************************/
double atoe_strtod( char * s, char ** p)
{
char * sebcdic;
char * pebcdic;
double d;
sebcdic = a2e_string(s);
d = strtod(sebcdic,&pebcdic);
if (p != NULL) {
*p = s + (pebcdic - sebcdic);
}
free(sebcdic);
return d;
}
/**************************************************************************
* name - atoe_strtol
* description -
* parameters -
* returns -
*************************************************************************/
int atoe_strtol(const char * s, char ** p, int b)
{
char * sebcdic;
char * pebcdic;
int i;
sebcdic = a2e_string(s);
i = strtol((const char *)sebcdic, &pebcdic, b);
if (p != NULL) {
*p = (char *)s + (pebcdic - sebcdic);
}
free(sebcdic);
return i;
}
/**************************************************************************
* name - atoe_strtoul
* description -
* parameters -
* returns -
*************************************************************************/
unsigned long atoe_strtoul(const char * s, char ** p, int b)
{
char * sebcdic;
char * pebcdic;
unsigned long i;
sebcdic = a2e_string(s);
i = strtoul((const char *)sebcdic, &pebcdic, b);
if (p != NULL) {
*p = (char *)s + (pebcdic - sebcdic);
}
free(sebcdic);
return i;
}
/**************************************************************************
* name - atoe_strtoull
* description -
* parameters -
* returns -
*************************************************************************/
unsigned long long atoe_strtoull(const char * s, char ** p, int b)
{
char * sebcdic;
char * pebcdic;
unsigned long long i;
sebcdic = a2e_string(s);
i = strtoull((const char *)sebcdic, &pebcdic, b);
if (p != NULL) {
*p = (char *)s + (pebcdic - sebcdic);
}
free(sebcdic);
return i;
}
/*************************************************************************
* name - atoe_atof
* description -
* parameters -
* returns -
*************************************************************************/
double
atoe_atof(char * ascii_string)
{
double rc;
char * ebcdic_string;
ebcdic_string = a2e_string(ascii_string);
rc = atof(ebcdic_string);
free(ebcdic_string);
return rc;
}
/**************************************************************************
* name - atoe_atoi
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_atoi(char * ascii_string)
{
int rc;
char * ebcdic_string;
ebcdic_string = a2e_string(ascii_string);
rc = atoi(ebcdic_string);
free(ebcdic_string);
return rc;
}
/*************************************************************************
* name - atoe_atol
* description -
* parameters -
* returns -
*************************************************************************/
long
atoe_atol(char * ascii_string)
{
long rc;
char * ebcdic_string;
ebcdic_string = a2e_string(ascii_string);
rc = atol(ebcdic_string);
free(ebcdic_string);
return rc;
}
/**************************************************************************
* name - atoe_gethostname
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_gethostname(char *name, int namelen)
{
int rc = gethostname(name, namelen);
char *ascii_name = e2a(name, namelen);
strcpy(name, ascii_name);
free(ascii_name);
return rc;
}
/**************************************************************************
* name - atoe_gethostbyname
* description -
* parameters -
* returns -
*************************************************************************/
#define HOSTBYNAME_CACHE_SIZE 50
typedef struct hostbyname_t {
char *hostname;
struct hostent h;
} hostbyname_t;
static hostbyname_t hostbyname_cache[HOSTBYNAME_CACHE_SIZE];
static int hostbyname_cache_next = 0;
static pthread_mutex_t hostbyname_mutex = PTHREAD_MUTEX_INITIALIZER;
static int hostbyname_initialized = 0;
struct hostent*
atoe_gethostbyname(const char *hostname) {
char *h;
struct hostent *hostptr = NULL, *hostptr_a = NULL;
int index;
pthread_mutex_lock(&hostbyname_mutex);
if (0 == hostbyname_initialized) {
/* initialize cache in static storage */
for (index=0; index<HOSTBYNAME_CACHE_SIZE; index++) {
hostbyname_cache[index].hostname = NULL;
memset(&hostbyname_cache[index].h, 0, sizeof(struct hostent));
}
hostbyname_initialized = 1;
}
/* see if we are already using a cache entry for this hostname */
for (index=0;
index<HOSTBYNAME_CACHE_SIZE, hostbyname_cache[index].hostname!=NULL;
index++) {
if (0 == strcmp(hostname, hostbyname_cache[index].hostname)) {
hostptr_a = &hostbyname_cache[index].h;
break;
}
}
if (NULL == hostptr_a) {
/* use next cache slot for this hostname */
if (hostbyname_cache[hostbyname_cache_next].hostname) {
free(hostbyname_cache[hostbyname_cache_next].hostname);
}
hostbyname_cache[hostbyname_cache_next].hostname = strdup(hostname);
if (!hostbyname_cache[hostbyname_cache_next].hostname) {
pthread_mutex_unlock(&hostbyname_mutex);
return NULL;
}
hostptr_a = &hostbyname_cache[hostbyname_cache_next].h;
if (++hostbyname_cache_next == HOSTBYNAME_CACHE_SIZE) {
hostbyname_cache_next = 0;
}
}
/* convert the input hostname to ebcdic */
h = a2e_string(hostname);
/* and issue the system call */
hostptr = gethostbyname(h);
/* don't need the ebcdic copy of hostname any more */
free(h);
/* if the system call worked save the results, otherwise return NULL */
if (hostptr) {
/* if we're re-using a cache slot, free any previously saved name */
if (hostptr_a->h_name) {
free(hostptr_a->h_name);
}
/* copy the system returned hostent into our cache */
memcpy(hostptr_a, hostptr, sizeof(struct hostent));
/* convert the system returned name to ascii and save it in our cache */
hostptr_a->h_name = e2a_string(hostptr->h_name);
/* if everything worked return the address of the cache entry */
if (hostptr_a->h_name) {
hostptr = hostptr_a;
} else {
hostptr = NULL;
}
}
pthread_mutex_unlock(&hostbyname_mutex);
return hostptr;
}
/**************************************************************************
* name - atoe_gethostbyname_r
* description -
* parameters -
* returns -
*************************************************************************/
struct hostent*
atoe_gethostbyname_r(char *hostname, struct hostent *hentptr,
char *buf, int bufsize, int *h_error) {
char *h, *h_n;
struct hostent *hostptr;
h = a2e_string(hostname);
if ((hostptr = gethostbyname(h)) == NULL) {
hentptr = NULL;
} else if ((strlen(hostptr->h_name) + 1) > bufsize) {
*h_error = errno = ERANGE;
hentptr = NULL;
} else {
memcpy(hentptr, hostptr, sizeof(struct hostent));
h_n = e2a_string(hostptr->h_name);
strcpy(buf, h_n);
free(h_n);
hentptr->h_name = buf;
}
free(h);
return hentptr;
}
/**************************************************************************
* name - atoe_gethostbyaddr
* description -
* parameters -
* returns -
*************************************************************************/
struct hostent*
atoe_gethostbyaddr(const void *address, int addrlen, int domain,
struct hostent *hentptr, char *buf, int bufsize,
int *h_error) {
char *h_n;
struct hostent *hostptr;
if ((hostptr = gethostbyaddr(address,addrlen,domain)) == NULL){
hentptr = NULL;
} else if ((strlen(hostptr->h_name) + 1) > bufsize) {
*h_error = errno = ERANGE;
hentptr = NULL;
} else {
memcpy(hentptr, hostptr, sizeof(struct hostent));
h_n = e2a_string(hostptr->h_name);
strcpy(buf, h_n);
free(h_n);
hentptr->h_name = buf;
}
return hentptr;
}
/**************************************************************************
* name - atoe_getprotobyname
* description -
* parameters -
* returns -
*************************************************************************/
struct protoent *
atoe_getprotobyname(const char *name) {
struct protoent *pent;
char *e_name, *p_n;
e_name = a2e_string((char *)name);
if ((pent = getprotobyname(e_name)) != 0) {
p_n = e2a_string(pent->p_name);
pent->p_name = p_n;
}
free(e_name);
return pent;
}
/**************************************************************************
* name - atoe_inet_addr
* description -
* parameters -
* returns -
*************************************************************************/
unsigned long
atoe_inet_addr(char *hostname)
{
unsigned long iaddr = -1;
char *h = a2e_string(hostname);
iaddr = inet_addr(h);
free(h);
return iaddr;
}
#define _ISALNUM_ASCII 0x0001
#define _ISALPHA_ASCII 0x0002
#define _ISCNTRL_ASCII 0x0004
#define _ISDIGIT_ASCII 0x0008
#define _ISGRAPH_ASCII 0x0010
#define _ISLOWER_ASCII 0x0020
#define _ISPRINT_ASCII 0x0040
#define _ISPUNCT_ASCII 0x0080
#define _ISSPACE_ASCII 0x0100
#define _ISUPPER_ASCII 0x0200
#define _ISXDIGIT_ASCII 0x0400
#define _XUPPER_ASCII 0xdf
#define _XLOWER_ASCII 0x20
/* Check for iconv_init() already done */
int iconv_initialised = 0;
/* Table for integer test macros */
int _ascii_is_tab[CONV_TABLE_SIZE];
#pragma convlit(suspend)
/**************************************************************************
* name - iconv_init
* description -
* Allocate code conversion descriptors for iconv()
* and build translate tables.
* parameters -
* returns -
*************************************************************************/
int
iconv_init(void)
{
char *asciiSet = "ISO8859-1";
char *defaultSet = "IBM-1047";
char *ebcdicSet, *inptr, *outptr;
size_t inleft, outleft;
iconv_t atoe_cd = (iconv_t)(-1);
iconv_t etoa_cd = (iconv_t)(-1);
char init_tab[CONV_TABLE_SIZE];
int i;
/* Need to save start locale setting */
char *slc = NULL;
/* Get the current locale setting */
char *clc = setlocale(LC_ALL, NULL);
if (iconv_initialised) {
return 0;
}
/*
* Test whether we're running with an DBCS codepage
* If so, use default IBM-1047 EBCDIC SBCS codepage to build translate table.
*/
{
char a[] = {97,0}; /* ASCII "a" */
/* Copy the start locale setting to reset it later */
slc = strdup(clc);
if ( !slc ) return -1;
/* Set the locale to whatever is set by the env. vars */
setlocale(LC_ALL, "") ;
if (( __atoe(a) < 1) && (errno == EINVAL)) {
/* The current locale does not describe a single-byte character set.*/
/* This test does not always give the correct result*/
ebcdicSet = defaultSet;
} else {
char *encoding = NULL;
char *lc;
char *p;
int i;
lc = getenv("LC_ALL");
if (lc == NULL) {
lc = getenv("LC_CTYPE");
if (lc == NULL) {
lc = getenv("LANG");
}
}
if (lc != NULL) {
/* We now have a string with the format
* language_region.encoding@variant any part of which
* may be missing. We need to extract the encoding part
*/
lc = strdup(lc);
if ((p = strchr(lc, '.')) != NULL) {
encoding = p+1;
}
if ((p = strchr(lc, '@')) != NULL) {
*p = '\0';
}
}
lc = encoding;
/* If lc is still NULL or we have "C" encoding
* use the default encoding.
*/
if (lc == NULL || !strcmp(lc, "C")) {
ebcdicSet = defaultSet;
} else {
ebcdicSet = lc;
}
}
}
/* reset the locale to start setting */
clc = setlocale(LC_ALL, slc );
free( slc );
if (((etoa_cd = iconv_open(asciiSet, ebcdicSet)) == (iconv_t)(-1)) ||
((atoe_cd = iconv_open(ebcdicSet, asciiSet)) == (iconv_t)(-1))) {
/* Retry with default ebcdicSet */
if (strcmp(ebcdicSet,defaultSet) == 0) {
return -1;
}
/* Close conversion descriptors just in case one of them succeeded */
if (etoa_cd != (iconv_t)(-1)) {
iconv_close(etoa_cd);
}
if (atoe_cd != (iconv_t)(-1)) {
iconv_close(atoe_cd);
}
if (((etoa_cd = iconv_open(asciiSet, defaultSet)) == (iconv_t)(-1)) ||
((atoe_cd = iconv_open(defaultSet, asciiSet)) == (iconv_t)(-1))) {
return -1;
}
}
/* Build initial table x'00' - x'ff' */
for (i = 0; i < CONV_TABLE_SIZE; i++) {
init_tab[i] = i;
}
/* Create conversion table for ASCII=>EBCDIC */
inptr = init_tab;
outptr = a2e_tab;
inleft = outleft = CONV_TABLE_SIZE;
if (iconv(atoe_cd, &inptr, &inleft, &outptr, &outleft) == -1) {
/* atoe conversion failed */
if (errno == E2BIG) {
/* The EBCDIC codepage is probably DBCS */
/* Close conversion descriptors */
iconv_close(atoe_cd);
iconv_close(etoa_cd);
/* Retry with default IBM-1047 */
if (((etoa_cd = iconv_open(asciiSet, defaultSet)) == (iconv_t)(-1)) ||
((atoe_cd = iconv_open(defaultSet, asciiSet)) == (iconv_t)(-1))) {
return -1;
}
inptr = init_tab;
outptr = a2e_tab;
inleft = outleft = CONV_TABLE_SIZE;
if (iconv(atoe_cd, &inptr, &inleft, &outptr, &outleft) == -1) {
return -1;
}
}
}
/* Create conversion table for EBCDIC=>ASCII */
inptr = init_tab;
outptr = e2a_tab;
inleft = outleft = CONV_TABLE_SIZE;
/* Try to create a complete translate table for this codepage */
/* if an EILSEQ return is received for a codepoint bypass and */
/* move on to the next one. */
while (inleft>0) {
size_t ret;
ret = iconv(etoa_cd, &inptr, &inleft, &outptr, &outleft);
if (ret != (size_t)-1) break;
if (errno == EILSEQ) {
inptr += 1;
inleft -= 1;
outptr += 1;
outleft -= 1;
}
else {
/* etoa conversion failed */
return -1;
}
}
/* Close conversion descriptors */
iconv_close(atoe_cd);
iconv_close(etoa_cd);
/* Build integer test macros flag table */
for (i = 0; i < CONV_TABLE_SIZE; i++) {
_ascii_is_tab[i] = 0;
if (isalnum(a2e_tab[i])) _ascii_is_tab[i] |= _ISALNUM_ASCII;
if (isalpha(a2e_tab[i])) _ascii_is_tab[i] |= _ISALPHA_ASCII;
if (iscntrl(a2e_tab[i])) _ascii_is_tab[i] |= _ISCNTRL_ASCII;
if (isdigit(a2e_tab[i])) _ascii_is_tab[i] |= _ISDIGIT_ASCII;
if (isgraph(a2e_tab[i])) _ascii_is_tab[i] |= _ISGRAPH_ASCII;
if (islower(a2e_tab[i])) _ascii_is_tab[i] |= _ISLOWER_ASCII;
if (isprint(a2e_tab[i])) _ascii_is_tab[i] |= _ISPRINT_ASCII;
if (ispunct(a2e_tab[i])) _ascii_is_tab[i] |= _ISPUNCT_ASCII;
if (isspace(a2e_tab[i])) _ascii_is_tab[i] |= _ISSPACE_ASCII;
if (isupper(a2e_tab[i])) _ascii_is_tab[i] |= _ISUPPER_ASCII;
if (isxdigit(a2e_tab[i])) _ascii_is_tab[i] |= _ISXDIGIT_ASCII;
}
/* If we get here, then we are initialised. */
iconv_initialised = 1;
return 0;
}
#pragma convlit(resume)
/**************************************************************************
* name - atoe_dlopen
* description - Load the DLL specified in dllName by converting it to EBCDIC,
* then calling the system dlopen
* parameters - dllName the DLL name
* mode describes the mode by which the DLL will be loaded
* returns - a handle to the loaded DLL if successful, NULL otherwise
*************************************************************************/
void*
atoe_dlopen(const char * dllName, int mode)
{
void *handle;
char *d = a2e_string(dllName);
handle = dlopen(d, mode);
free(d);
return handle;
}
void *
atoe_dlsym(void *descriptor, const char *name)
{
void *address;
char *ebcdicName = a2e_string(name);
address = dlsym(descriptor, ebcdicName);
free(ebcdicName);
return address;
}
/**************************************************************************
* name - atoe_dllload
* description -
* parameters -
* returns -
*************************************************************************/
dllhandle*
atoe_dllload(char * dllName)
{
dllhandle *handle;
char *d = a2e_string(dllName);
handle = dllload(d);
free(d);
return handle;
}
void *atoe_dllqueryvar(dllhandle* dllHandle, char* varName)
{
char *n = a2e_string(varName);
void *r = dllqueryvar(dllHandle, n);
free(n);
return r;
}
void (*
atoe_dllqueryfn(dllhandle* dllHandle, char* funcName)) ()
{
char *n = a2e_string(funcName);
void (*r)() = dllqueryfn(dllHandle, n);
free(n);
return r;
}
/**************************************************************************
* name - atoe_execv
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_execv (const char *path, char *const argv[])
{
char *ebcdicPath = a2e_string(path);
char **ebcdicArgv;
int size = 0, i, rc;
/* Calculate the size of argv. argv always ends with a null pointer. */
while (*(argv+size)) {
size++;
}
/* Allocate space for the new array and populate */
ebcdicArgv = (char**) malloc(size+1);
for (i=0; i<size; i++) {
*(ebcdicArgv+i) = strdup(a2e_string(argv[i]));
}
/* Null terminate the new array */
*(ebcdicArgv+size) = NULL;
rc = execv(ebcdicPath, ebcdicArgv);
return rc;
}
/**************************************************************************
* name - atoe_execvp
* description -
* parameters -
* returns -
*************************************************************************/
int
atoe_execvp (const char *file, char *const argv[])
{
char *ebcdicFile = a2e_string(file);
char **ebcdicArgv;
int size = 0, i, rc;
/* Calculate the size of argv. argv always ends with a null pointer. */
while (*(argv+size)) {
size++;
}
/* Allocate space for the new array and populate */
ebcdicArgv = (char**) malloc(size+1);
for (i=0; i<size; i++) {
*(ebcdicArgv+i) = strdup(a2e_string(argv[i]));
}
/* Null terminate the new array */
*(ebcdicArgv+size) = NULL;
rc = execvp(ebcdicFile, ebcdicArgv);
return rc;
}
/**************************************************************************
* name - etoa_uname
* description -
* parameters -
* returns -
*************************************************************************/
int
etoa_uname(struct utsname *a) {
struct utsname e;
int rc = 0;
rc = uname(&e);
if (rc == 0 && a != NULL) {
char *temp = NULL;
temp = e2a_string(e.sysname);
strcpy(a->sysname,temp);
free(temp);
temp = e2a_string(e.nodename);
strcpy(a->nodename,temp);
free(temp);
temp = e2a_string(e.release);
strcpy(a->release,temp);
free(temp);
temp = e2a_string(e.version);
strcpy(a->version,temp);
free(temp);
temp = e2a_string(e.machine);
strcpy(a->machine,temp);
free(temp);
}
return rc;
}
/**************************************************************************
* name - etoa_nl_langinfo
* description -
* parameters -
* returns -
*************************************************************************/
char *
etoa_nl_langinfo(int nl_item) {
char *retVal = NULL;
retVal = nl_langinfo(nl_item);
return(retVal != NULL) ? e2a_string(retVal) : NULL;
}
/*********************************************************************/
/* name - atoe_utimes */
/* */
/* description - provide a version of the utimes() system function */
/* that converts the specified path from an ascii to */
/* an ebcdic string. */
/* */
/* parameters - path: ascii string representing the path name */
/* times: times to be used in setting the modification */
/* times of the specified file */
/* */
/* returns - int: 0 (success) or -1 (failure) */
/*********************************************************************/
int atoe_utimes(const char *path, const struct timeval *times)
{
char *ep;
ep = a2e_string(path);
return utimes(ep, times);
}
/*********************************************************************/
/* name - atoe_utime */
/* */
/* description - provide a version of the utime() system function */
/* that converts the specified path from an ascii to */
/* an ebcdic string. */
/* */
/* parameters - path: ascii string representing the path name */
/* buf: times to be used in setting the modification */
/* and access times of the specified file */
/* */
/* returns - int: 0 (success) or -1 (failure) */
/*********************************************************************/
int atoe_utime(const char *path, const struct utimebuf *buf)
{
char *ep;
ep = a2e_string(path);
return utime(ep, buf);
}
/*********************************************************************/
/* name - atoe_chmod */
/* */
/* description - provide a version of the chmod() system function */
/* that converts the specified path from an ascii to */
/* an ebcdic string. */
/* */
/* parameters - path: ascii string representing the path name */
/* mode: bit set representing mode to be set on the */
/* specified file */
/* */
/* returns - int: 0 (success) or -1 (failure) */
/*********************************************************************/
int atoe_chmod(const char *path, mode_t mode)
{
char *ep;
ep = a2e_string(path);
return chmod(ep, mode);
}
/*********************************************************************/
/* name - atoe_chdir */
/* */
/* description - provide a version of the chdir() system function */
/* that converts the specified path from an ascii to */
/* an ebcdic string. */
/* */
/* parameters - path: ascii string representing the path name */
/* */
/* returns - int: 0 (success) or -1 (failure) */
/*********************************************************************/
int atoe_chdir(const char *path)
{
int rc;
char *ep;
ep = a2e_string(path);
rc = chdir(ep);
free(ep);
return rc;
}
/*********************************************************************/
/* name - atoe_chown */
/* */
/* description - provide a version of the chown() system function */
/* that converts the specified path from an ascii to */
/* an ebcdic string. */
/* */
/* parameters - path: ascii string representing the path name */
/* uid: new user id (-1 for no change) */
/* gid: new group id (-1 for no change) */
/* */
/* returns - int: 0 (success) or -1 (failure) */
/*********************************************************************/
int atoe_chown(const char *path, uid_t uid, gid_t gid)
{
int rc;
char *ep;
ep = a2e_string(path);
rc = chown(ep, uid, gid);
free(ep);
return rc;
}
/**************************************************************************
* name - atoe_ftok
* description -
* parameters -
* returns -
*************************************************************************/
key_t atoe_ftok(const char *pathname, int id)
{
key_t key;
char *e;
e = a2e_string(pathname);
key = ftok(e, id);
free(e);
return key;
}
/**************************************************************************
* name - etoa___osname
* description -
* parameters -
* returns -
*************************************************************************/
int
etoa___osname(struct utsname *a) {
struct utsname e;
int rc = 0;
rc = __osname(&e);
if (rc == 0 && a != NULL) {
char *temp = NULL;
temp = e2a_string(e.sysname);
strcpy(a->sysname,temp);
free(temp);
temp = e2a_string(e.nodename);
strcpy(a->nodename,temp);
free(temp);
temp = e2a_string(e.release);
strcpy(a->release,temp);
free(temp);
temp = e2a_string(e.version);
strcpy(a->version,temp);
free(temp);
temp = e2a_string(e.machine);
strcpy(a->machine,temp);
free(temp);
}
return rc;
}
/* END OF FILE */