Files
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

460 lines
11 KiB
C

static char sccsid[] = "@(#)72 1.5 src/bos/usr/bin/mkusrprof/mkusrprof.c, rcs, bos411, 9428A410j 11/21/93 15:22:42";
/*
* COMPONENT_NAME: RCS
*
* FUNCTIONS: if
* main
* usage
* validate
*
* ORIGINS: 27
*
* IBM CONFIDENTIAL -- (IBM Confidential Restricted when
* combined with the aggregated modules for this product)
* SOURCE MATERIALS
*
* (C) COPYRIGHT International Business Machines Corp. 1993
* All Rights Reserved
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <pwd.h>
#include <userprofiles.h>
/* include file for message texts */
#include <mkusrprof_msg.h>
nl_catd scmc_catd; /* Cat descriptor for scmc conversion */
#include <locale.h>
#include <nl_types.h>
#define FAIL -1
#define SUCCESS 0
#define ROOT 0
#define ODMDIR "/etc/objrepos"
#define PWFILE "/etc/passwd"
extern int optind;
extern char *optarg;
/* prototypes */
void colon_check(char *);
void usage();
int main(int, char*arg[]);
int validate(int, char *);
int lock_id; /* lock id used by odm_lock and odm_unlock */
int link_flag = 0; /* check to see if we get the right parms passed */
int support_flag = 0; /* check to see if we get the right parms passed */
void usage()
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof, M_MSG_1,
"Usage: mkusrprof -m l\n\t\t"
"-n Name\n\t\t"
"-t Connection_Type\n\t\t"
"-d Connection_Description\n\t\t"
"-e telnet { -s Server_Name } | -e hcon { -h HCON_Sessions } |\n\t\t"
"-r RecordType|\n"
"Usage: mkusrprof -m s\n\t\t"
"-n Name\n\t\t"
"-i { motif | ascii }\n\t\t"
"-t Connection_Type\n\t\t"
"-d Connection_Description\n\t\t"
"-u UserID\n\t\t"
"-s Server_Name\n\t\t"
"-c [ CustomerID ]\n\t\t"
"-p [ Password ]\n\t\t"
"-r RecordType\n") );
catclose(scmc_catd);
exit(FAIL);
}
int validate(int uid, char *name)
{
struct passwd *user;
int got_a_match = 0;
if ((user = getpwnam(name)) == NULL)
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof,M_MSG_2, "User name was not found in the password file.\n") );
catclose(scmc_catd);
exit(FAIL);
}
if (user->pw_uid == uid)
got_a_match++;
if (got_a_match || (uid == ROOT))
return(0);
else
return(FAIL);
}
int main(int argc, char *argv[])
{
char *error_message; /* error message pointer for odm errors */
int c; /* used for command line processing */
int add_rtn; /* return from adding to the odm database */
int return_status; /* return from retrieving odm error message */
int n_flag = 0; /* flags to let me know if we have these */
int i_flag = 0; /* command line options sent to this pgm */
int r_flag = 0; /* n_flag = name, i_flag = interface, s_flag */
int s_flag = 0; /* n_flag = name, i_flag = interface, s_flag */
int t_flag = 0; /* = support, t_flag = connection type */
int d_flag = 0; /* d_flag = connection description */
int e_flag = 0; /* e_flag = emulator, h_flag = hostname */
int h_flag = 0; /* m_flag = mode (link or support) */
int m_flag = 0; /* r_flag = record type */
int c_flag = 0; /* customer flag */
int u_flag = 0; /* userid flag */
int p_flag = 0; /* password flag */
int z_flag = 0; /* zero field flag */
int record_type;
int interface_str_is_ok = 0;
int mode_is_ok = 0;
int uid; /* user id */
int updatable; /* is the user able to update the user id */
struct userprofiles user_profile;
struct userprofiles my_usr_prof;
struct userprofiles *usr_prof_ptr;
char name_str[9]; /* arrays to hold strings from the command */
char conn_type_str[7]; /* line - names are descriptive */
char conn_desc_str[65];
char emulator_str[7];
char hostname_str[256];
char server_str[128];
char interface_str[6];
char type_str[7];
char custid_str[9];
char passwd_str[33];
char userid_str[9];
char srchstr[128];
char mode_str[2];
char sessions_str[20];
/* make sure all arrays contain nulls */
bzero(custid_str,9);
bzero(passwd_str,33);
bzero(userid_str,9);
bzero(name_str,9);
bzero(conn_type_str,7);
bzero(conn_desc_str,65);
bzero(emulator_str,7);
bzero(hostname_str,256);
bzero(server_str,128);
bzero(interface_str,6);
bzero(type_str,7);
bzero(srchstr,128);
bzero(mode_str,2);
bzero(sessions_str,20);
bzero(user_profile,sizeof(struct userprofiles));
bzero(my_usr_prof,sizeof(struct userprofiles));
(void) setlocale(LC_ALL,"");
scmc_catd = catopen("mkusrprof.cat",NL_CAT_LOCALE);
/* not even close to enough args */
if (argc < 2)
usage();
uid = getuid();
odm_initialize();
odm_set_path(ODMDIR);
/* parse the command line and get options */
while ((c = getopt(argc,argv,"c:d:e:h:i:m:n:p:r:s:t:u:z")) != EOF)
switch (c)
{
/* set flag if we get the option */
/* copy the option into the array */
/* do this for each case below */
case 'c':
colon_check(optarg);
c_flag++;
strncpy(custid_str,optarg,8);
break;
case 'd':
colon_check(optarg);
d_flag++;
strncpy(conn_desc_str,optarg,64);
break;
case 'e':
colon_check(optarg);
e_flag++;
strncpy(emulator_str,optarg,6);
break;
case 'h': /* hcon sessions */
colon_check(optarg);
h_flag++;
strncpy(sessions_str,optarg,19);
break;
case 'i':
colon_check(optarg);
i_flag++;
strncpy(interface_str,optarg,5);
if (strcmp(interface_str,"motif") == 0)
interface_str_is_ok++;
if (strcmp(interface_str,"ascii") == 0)
interface_str_is_ok++;
if (!interface_str_is_ok)
{
usage();
}
break;
case 'm':
colon_check(optarg);
m_flag++;
if (optarg[0] == 'l')
{
link_flag++;
mode_is_ok++;
}
if (optarg[0] == 's')
{
support_flag++;
mode_is_ok++;
}
break;
case 'n':
colon_check(optarg);
n_flag++;
strncpy(name_str,optarg,8);
break;
case 'p':
colon_check(optarg);
p_flag++;
strncpy(passwd_str,optarg,32);
break;
case 'r':
colon_check(optarg);
r_flag++;
record_type = atoi(optarg);
break;
case 's':
colon_check(optarg);
s_flag++;
strncpy(server_str,optarg,127);
break;
case 't':
colon_check(optarg);
t_flag++;
strncpy(conn_type_str,optarg,6);
break;
case 'u':
colon_check(optarg);
u_flag++;
strncpy(userid_str,optarg,8);
break;
default: /* unknown option - give usage */
usage();
break;
}
/* validate users ablility */
/* to update this profile */
if((updatable = validate(uid,name_str)) != 0)
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof, M_MSG_3,
"You are not permitted to create this profile,"
" check ownership\n") );
usage();
}
if (!mode_is_ok)
{
usage();
}
if (support_flag && !n_flag)
{
usage();
}
if (link_flag && !n_flag)
{
usage();
}
if (n_flag && link_flag)
{
if (!t_flag || !e_flag || !r_flag)
{
usage();
}
/* copy to the record, we have an argument */
/* for each of the following elements */
sprintf(srchstr,"UserName = %s and Emulator = %s"
" and ConnType = %s",
name_str,emulator_str,conn_type_str);
usr_prof_ptr = odm_get_obj(userprofiles_CLASS,
srchstr,&my_usr_prof,TRUE);
if (usr_prof_ptr != NULL)
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof,M_MSG_5, "This user type profile has already been defined.\n"));
catclose(scmc_catd);
exit(FAIL);
}
strcpy(user_profile.UserName,name_str);
strcpy(user_profile.ConnType,conn_type_str);
strcpy(user_profile.ConnDesc,conn_desc_str);
strcpy(user_profile.Emulator,emulator_str);
strcpy(user_profile.Server,server_str);
user_profile.RecordType = record_type;
if (h_flag)
strcpy(user_profile.Sessions,sessions_str);
if ((lock_id = odm_lock(ODMDIR,ODM_NOWAIT)) < 0)
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof,M_MSG_6, "Unable to obtain a lock on the odm database.\n") );
catclose(scmc_catd);
exit(FAIL);
}
else
{
/* got a lock so add the user profile */
add_rtn = odm_add_obj(userprofiles_CLASS,&user_profile);
/* check the return code from the add for failure */
if (add_rtn == -1)
{
return_status = odm_err_msg(odmerrno,
&error_message);
if (return_status < 0)
fprintf(stderr, catgets(scmc_catd,
MS_mkusrprof,M_MSG_7,
"Retrieval of error "
"message failed.\n") );
else
fprintf(stderr,error_message);
catclose(scmc_catd);
exit(FAIL);
}
odm_unlock(lock_id);
}
catclose(scmc_catd);
exit(SUCCESS);
} /* end of link and name */
if (n_flag && support_flag)
{
if (!t_flag || !s_flag || !i_flag || !r_flag)
{
usage();
}
/* copy to the record, we have an argument */
/* for each of the following elements */
sprintf(srchstr,"UserName = %s and ConnType = %s"
" and Interface = %s",
name_str,conn_type_str,interface_str);
usr_prof_ptr = odm_get_obj
(userprofiles_CLASS,srchstr,
&my_usr_prof,TRUE);
if (usr_prof_ptr != NULL)
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof,M_MSG_5,
"This user type profile has already been defined.\n") );
catclose(scmc_catd);
exit(FAIL);
}
strcpy(user_profile.UserName,name_str);
strcpy(user_profile.Userid,userid_str);
strcpy(user_profile.ConnType,conn_type_str);
strcpy(user_profile.ConnDesc,conn_desc_str);
strcpy(user_profile.Server,server_str);
strcpy(user_profile.Interface,interface_str);
user_profile.RecordType = record_type;
strcpy(user_profile.Custid,custid_str);
strcpy(user_profile.Password,passwd_str);
if ((lock_id = odm_lock(ODMDIR,ODM_NOWAIT)) < 0)
{
fprintf(stderr, catgets(scmc_catd, MS_mkusrprof,M_MSG_6, "Unable to obtain a lock on the odm database.\n") );
catclose(scmc_catd);
exit(FAIL);
}
else
{
/* got a lock so update the user profile */
add_rtn = odm_add_obj(userprofiles_CLASS,&user_profile);
if (add_rtn == -1)
{
return_status = odm_err_msg(odmerrno,
&error_message);
if (return_status < 0)
fprintf(stderr, catgets(scmc_catd,
MS_mkusrprof,M_MSG_7,
"Retrieval of error "
"message failed.\n") );
else
fprintf(stderr,error_message);
catclose(scmc_catd);
exit(FAIL);
}
/* release the odm database */
odm_unlock(lock_id);
}
catclose(scmc_catd);
exit(SUCCESS);
} /* end of support and name */
}
/****************************************/
/* this function checks for an imbedded */
/* colon in the optarg or optarg string */
/****************************************/
void colon_check(char *optarg_string)
{
if (strchr(optarg_string,':') != NULL)
{
fprintf(stderr, catgets(scmc_catd,MS_mkusrprof, M_MSG_8,
"Error adding %s;\nCharacter : is invalid.\n"),
optarg_string);
exit(FAIL);
}
}