mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
7e6ad5100c
Most function and variable definitions are now preceded by its extern definition, for error checking. Retyped a number of functions, usually to return void. Fixed a number of printf format errors. API changes (in ldap/include): Added avl_dup_ok, avl_prefixapply, removed ber_fatten (probably typo for ber_flatten), retyped ldap_sort_strcasecmp, grew lutil.h. A number of `extern' declarations are left (some added by protoize), to be cleaned away later. Mostly strdup(), strcasecmp(), mktemp(), optind, optarg, errno.
167 lines
3.9 KiB
C
167 lines
3.9 KiB
C
#if !defined(lint)
|
|
static char copyright[] = "Copyright 1992 The University of Adelaide";
|
|
#endif
|
|
|
|
/*
|
|
* U T I L
|
|
*
|
|
* Author: Mark R. Prior
|
|
* Communications and Systems Branch
|
|
* Information Technology Division
|
|
* The University of Adelaide
|
|
* E-mail: mrp@itd.adelaide.edu.au
|
|
* Date: November 1992
|
|
* Version: 1.7
|
|
* Description:
|
|
* Some routines that I use in most my LDAP playthings :-)
|
|
*
|
|
* Redistribution and use in source and binary forms are permitted
|
|
* provided that the above copyright notice and this paragraph are
|
|
* duplicated in all such forms and that any documentation,
|
|
* advertising materials, and other materials related to such
|
|
* distribution and use acknowledge that the software was developed
|
|
* by the University of Adelaide. The name of the University may not
|
|
* be used to endorse or promote products derived from this software\
|
|
* without specific prior written permission.
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
*/
|
|
|
|
#include "portable.h"
|
|
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <ctype.h>
|
|
#if defined(SYS5) || defined(XOS_2)
|
|
#include <termio.h>
|
|
#else
|
|
#include <sgtty.h>
|
|
#endif
|
|
#include <time.h>
|
|
#if defined(INTERNATIONAL)
|
|
#include <langinfo.h>
|
|
#include <locale.h>
|
|
#endif
|
|
#include <ac/unistd.h>
|
|
|
|
static void handler(int sig);
|
|
|
|
char *
|
|
lowerCase( char *string )
|
|
{
|
|
char *s;
|
|
|
|
for ( s = string; s != NULL && *s != '\0'; s++ )
|
|
if ( isupper( *s ) )
|
|
*s = tolower( *s );
|
|
return string;
|
|
}
|
|
|
|
char *
|
|
convertTime( char *date, char *locale )
|
|
{
|
|
/*
|
|
* A quick hack to convert the time from the format Quipu uses into
|
|
* a more normal representation.
|
|
*/
|
|
struct tm *tm;
|
|
time_t time;
|
|
static char result[BUFSIZ];
|
|
int UTCOffset;
|
|
|
|
/*
|
|
* Get local timezone information, we need to apply this to the
|
|
* zulu time that Quipu uses later.
|
|
*/
|
|
time = 0;
|
|
tm = localtime(&time);
|
|
UTCOffset = tm->tm_gmtoff;
|
|
sscanf( date, "%2d%2d%2d%2d%2d%2dZ",
|
|
&tm->tm_year, &tm->tm_mon, &tm->tm_mday,
|
|
&tm->tm_hour, &tm->tm_min, &tm->tm_sec );
|
|
tm->tm_mon--;
|
|
tm->tm_isdst = 0;
|
|
tm->tm_gmtoff = 0;
|
|
time = mktime(tm);
|
|
time += UTCOffset;
|
|
tm = localtime(&time);
|
|
#if defined(INTERNATIONAL)
|
|
setlocale(LC_TIME, locale);
|
|
strftime(result, sizeof(result), nl_langinfo(D_T_FMT), tm);
|
|
#else
|
|
strftime(result, sizeof(result), "%c", tm);
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
static long interrupt;
|
|
|
|
char *
|
|
getPassword( char *prompt )
|
|
{
|
|
#if defined(SYS5) || defined(XOS_2)
|
|
struct termios ttyb;
|
|
#else
|
|
struct sgttyb ttyb;
|
|
#endif
|
|
FILE *input;
|
|
struct sigvec ovec, vec;
|
|
unsigned long flags;
|
|
int c, idx;
|
|
static char buffer[BUFSIZ + 1];
|
|
|
|
if ( ( input = fopen( "/dev/tty", "r" ) ) == NULL )
|
|
input = stdin;
|
|
else
|
|
setbuf( input, (char *) NULL );
|
|
vec.sv_handler = handler;
|
|
vec.sv_mask = 0;
|
|
vec.sv_flags = SV_INTERRUPT;
|
|
sigvec( SIGINT, &vec, &ovec );
|
|
interrupt = 0;
|
|
#if defined(SYS5) || defined(XOS_2)
|
|
ioctl( fileno( input ), TCGETS, &ttyb );
|
|
flags = ttyb.c_lflag;
|
|
ttyb.c_lflags &= ~ ( ECHO | ECHOE | ECHOK | ECHONL );
|
|
ioctl( fileno( input ), TCSETSF, &ttyb );
|
|
#else
|
|
ioctl( fileno( input ), TIOCGETP, &ttyb );
|
|
flags = ttyb.sg_flags;
|
|
ttyb.sg_flags &= ~ ECHO;
|
|
ioctl( fileno( input ), TIOCSETN, &ttyb );
|
|
#endif
|
|
fputs( prompt, stderr );
|
|
idx = 0;
|
|
while ( !interrupt && ( c = getc( input ) ) != EOF ) {
|
|
if ( c == '\n' || c == '\r' )
|
|
break;
|
|
if ( idx < BUFSIZ )
|
|
buffer[idx++] = c;
|
|
}
|
|
if ( interrupt )
|
|
buffer[0] = '\0';
|
|
else
|
|
buffer[idx] = '\0';
|
|
#if defined(SYS5) || defined(XOS_2)
|
|
ttyb.c_lflag = flags;
|
|
ioctl( fileno( input ), TCSETSW, &ttyb );
|
|
#else
|
|
ttyb.sg_flags = flags;
|
|
ioctl( fileno( input ), TIOCSETN, &ttyb );
|
|
#endif
|
|
putc( '\n', stderr );
|
|
sigvec( SIGINT, &ovec, (struct sigvec *) NULL );
|
|
if ( input != stdin )
|
|
fclose( input );
|
|
if ( interrupt )
|
|
kill( getpid(), SIGINT );
|
|
return buffer;
|
|
}
|
|
|
|
static void
|
|
handler( int sig )
|
|
{
|
|
++interrupt;
|
|
}
|