Update.
* Versions.def: Add GLIBC_2.1.1 to libpthread. * iconvdata/Makefile (modules): Add KOI8-U. (distribute): Add koi8-u.c. (gen-8bit-gap-modules): Add koi8-u. * iconvdata/gconv-modules: Add KOI8-U entries. * iconvdata/koi8-u.c: New file. 1999-04-13 Thorsten Kukuk <kukuk@suse.de> * sunrpc/auth_des.c: 64bit fixes, security fixes. * sunrpc/auth_none.c: Pretty print. * sunrpc/auth_unix.c: Likewise. * sunrpc/authdes_prot.c: Likewise. * sunrpc/authuxprot.c: Likewise. * sunrpc/bindrsvprt.c: Likewise. * sunrpc/clnt_gen.c: Likewise. * sunrpc/rpc/xdr.h: Likewise. * sunrpc/rpc/auth_des.h: Add rpc_timeval struct. * sunrpc/rpc_cmsg.c: Don't use *long pointers. * sunrpc/rtime.c: Use new rpc_timeval. * sunrpc/svc_authux.c: Don't use *long pointers. * sunrpc/svcauth_des.c: Likewise + security fixes. * sunrpc/xdr_mem.c: Don't use *long pointers. * sunrpc/xdr_rec.c: Likewise. * sunrpc/xdr_sizeof.c: Likewise. * sunrpc/xdr_stdio.c: Likewise. 1999-04-15 Ulrich Drepper <drepper@cygnus.com>
This commit is contained in:
parent
a548696234
commit
f8afba91cf
30
ChangeLog
30
ChangeLog
@ -1,3 +1,33 @@
|
|||||||
|
1999-04-15 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* Versions.def: Add GLIBC_2.1.1 to libpthread.
|
||||||
|
|
||||||
|
* iconvdata/Makefile (modules): Add KOI8-U.
|
||||||
|
(distribute): Add koi8-u.c.
|
||||||
|
(gen-8bit-gap-modules): Add koi8-u.
|
||||||
|
* iconvdata/gconv-modules: Add KOI8-U entries.
|
||||||
|
* iconvdata/koi8-u.c: New file.
|
||||||
|
|
||||||
|
1999-04-13 Thorsten Kukuk <kukuk@suse.de>
|
||||||
|
|
||||||
|
* sunrpc/auth_des.c: 64bit fixes, security fixes.
|
||||||
|
* sunrpc/auth_none.c: Pretty print.
|
||||||
|
* sunrpc/auth_unix.c: Likewise.
|
||||||
|
* sunrpc/authdes_prot.c: Likewise.
|
||||||
|
* sunrpc/authuxprot.c: Likewise.
|
||||||
|
* sunrpc/bindrsvprt.c: Likewise.
|
||||||
|
* sunrpc/clnt_gen.c: Likewise.
|
||||||
|
* sunrpc/rpc/xdr.h: Likewise.
|
||||||
|
* sunrpc/rpc/auth_des.h: Add rpc_timeval struct.
|
||||||
|
* sunrpc/rpc_cmsg.c: Don't use *long pointers.
|
||||||
|
* sunrpc/rtime.c: Use new rpc_timeval.
|
||||||
|
* sunrpc/svc_authux.c: Don't use *long pointers.
|
||||||
|
* sunrpc/svcauth_des.c: Likewise + security fixes.
|
||||||
|
* sunrpc/xdr_mem.c: Don't use *long pointers.
|
||||||
|
* sunrpc/xdr_rec.c: Likewise.
|
||||||
|
* sunrpc/xdr_sizeof.c: Likewise.
|
||||||
|
* sunrpc/xdr_stdio.c: Likewise.
|
||||||
|
|
||||||
1999-04-15 Ulrich Drepper <drepper@cygnus.com>
|
1999-04-15 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* sunrpc/clnt_udp.c (clntudp_call): Move initialization of anyup
|
* sunrpc/clnt_udp.c (clntudp_call): Move initialization of anyup
|
||||||
|
@ -55,6 +55,7 @@ libnss_nisplus {
|
|||||||
libpthread {
|
libpthread {
|
||||||
GLIBC_2.0
|
GLIBC_2.0
|
||||||
GLIBC_2.1 GLIBC_2.0
|
GLIBC_2.1 GLIBC_2.0
|
||||||
|
GLIBC_2.1.1 GLIBC_2.1
|
||||||
}
|
}
|
||||||
libresolv {
|
libresolv {
|
||||||
GLIBC_2.0
|
GLIBC_2.0
|
||||||
|
@ -44,7 +44,7 @@ modules := ISO8859-1 ISO8859-2 ISO8859-3 ISO8859-4 ISO8859-5 \
|
|||||||
GOST_19768-74 GREEK-CCITT GREEK7 GREEK7-OLD INIS INIS-8 \
|
GOST_19768-74 GREEK-CCITT GREEK7 GREEK7-OLD INIS INIS-8 \
|
||||||
INIS-CYRILLIC ISO_6937-2 ISO_2033 ISO_5427 ISO_5427-EXT \
|
INIS-CYRILLIC ISO_6937-2 ISO_2033 ISO_5427 ISO_5427-EXT \
|
||||||
ISO_5428 ISO_10367-BOX MAC-IS MAC-UK NATS-DANO NATS-SEFI \
|
ISO_5428 ISO_10367-BOX MAC-IS MAC-UK NATS-DANO NATS-SEFI \
|
||||||
SAMI-WS2 ISO-IR-197 TIS-620
|
SAMI-WS2 ISO-IR-197 TIS-620 KOI8-U
|
||||||
|
|
||||||
modules.so := $(addsuffix .so, $(modules))
|
modules.so := $(addsuffix .so, $(modules))
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ distribute := gconv-modules extra-module.mk gap.awk gaptab.awk \
|
|||||||
jis0208.c jis0208.h jis0212.c jis0212.h johab.c koi-8.c \
|
jis0208.c jis0208.h jis0212.c jis0212.h johab.c koi-8.c \
|
||||||
koi8-r.c ksc5601.c ksc5601.h latin-greek.c latin-greek-1.c \
|
koi8-r.c ksc5601.c ksc5601.h latin-greek.c latin-greek-1.c \
|
||||||
macintosh.c mac-is.c mac-uk.c nats-dano.c nats-sefi.c sjis.c \
|
macintosh.c mac-is.c mac-uk.c nats-dano.c nats-sefi.c sjis.c \
|
||||||
t.61.c uhc.c sami-ws2.c iso-ir-197.c tis-620.c
|
t.61.c uhc.c sami-ws2.c iso-ir-197.c tis-620.c koi8-u.c
|
||||||
|
|
||||||
# We build the transformation modules only when we build shared libs.
|
# We build the transformation modules only when we build shared libs.
|
||||||
ifeq (yes,$(build-shared))
|
ifeq (yes,$(build-shared))
|
||||||
@ -151,7 +151,7 @@ gen-8bit-gap-modules := koi8-r latin-greek latin-greek-1 ibm256 ibm273 \
|
|||||||
inis-cyrillic iso_2033 iso_5427 iso_5427-ext \
|
inis-cyrillic iso_2033 iso_5427 iso_5427-ext \
|
||||||
iso_5428 iso_10367-box mac-is nats-dano nats-sefi \
|
iso_5428 iso_10367-box mac-is nats-dano nats-sefi \
|
||||||
iso8859-13 iso8859-14 iso8859-15 mac-uk sami-ws2 \
|
iso8859-13 iso8859-14 iso8859-15 mac-uk sami-ws2 \
|
||||||
iso-ir-197 cp1258 tis-620
|
iso-ir-197 cp1258 tis-620 koi8-u
|
||||||
|
|
||||||
gen-special-modules := iso8859-7jp
|
gen-special-modules := iso8859-7jp
|
||||||
|
|
||||||
|
@ -1139,3 +1139,7 @@ alias TIS620.2533-0// TIS-620//
|
|||||||
alias ISO-IR-166// TIS-620//
|
alias ISO-IR-166// TIS-620//
|
||||||
module TIS-620// INTERNAL TIS-620 1
|
module TIS-620// INTERNAL TIS-620 1
|
||||||
module INTERNAL TIS-620// TIS-620 1
|
module INTERNAL TIS-620// TIS-620 1
|
||||||
|
|
||||||
|
# from to module cost
|
||||||
|
module KOI8-U// INTERNAL KOI8-U 1
|
||||||
|
module INTERNAL KOI8-U// KOI8-U 1
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
/* Conversion from and to KOI8-U.
|
||||||
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -16,11 +18,12 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#ifndef _SEMAPHORE_H
|
#include <stdint.h>
|
||||||
# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
/* Specify the conversion table. */
|
||||||
|
#define TABLES <koi8-u.h>
|
||||||
|
|
||||||
typedef struct {
|
#define CHARSET_NAME "KOI8-U//"
|
||||||
long int sem_status;
|
#define HAS_HOLES 0 /* All 256 character are defined. */
|
||||||
} sem_t;
|
|
||||||
|
#include <8bit-gap.c>
|
@ -24,7 +24,7 @@ subdir := linuxthreads
|
|||||||
linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
|
linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
|
||||||
Banner)
|
Banner)
|
||||||
|
|
||||||
headers := pthread.h semaphore.h bits/semaphore.h
|
headers := pthread.h semaphore.h
|
||||||
distribute := internals.h queue.h restart.h spinlock.h
|
distribute := internals.h queue.h restart.h spinlock.h
|
||||||
|
|
||||||
routines := weaks no-tsd
|
routines := weaks no-tsd
|
||||||
|
@ -101,4 +101,7 @@ libpthread {
|
|||||||
__libc_current_sigrtmin; __libc_current_sigrtmax;
|
__libc_current_sigrtmin; __libc_current_sigrtmax;
|
||||||
__libc_allocate_rtsig;
|
__libc_allocate_rtsig;
|
||||||
}
|
}
|
||||||
|
GLIBC_2.1.1 {
|
||||||
|
sem_close; sem_open; sem_unlink;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,9 +32,9 @@ int sem_init(sem_t *sem, int pshared, unsigned int value)
|
|||||||
errno = ENOSYS;
|
errno = ENOSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
__pthread_init_lock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
sem->sem_value = value;
|
sem->__sem_value = value;
|
||||||
sem->sem_waiting = NULL;
|
sem->__sem_waiting = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,23 +42,23 @@ int sem_wait(sem_t * sem)
|
|||||||
{
|
{
|
||||||
volatile pthread_descr self = thread_self();
|
volatile pthread_descr self = thread_self();
|
||||||
|
|
||||||
__pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self);
|
__pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
|
||||||
if (sem->sem_value > 0) {
|
if (sem->__sem_value > 0) {
|
||||||
sem->sem_value--;
|
sem->__sem_value--;
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
enqueue(&sem->sem_waiting, self);
|
enqueue(&sem->__sem_waiting, self);
|
||||||
/* Wait for sem_post or cancellation */
|
/* Wait for sem_post or cancellation */
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
suspend_with_cancellation(self);
|
suspend_with_cancellation(self);
|
||||||
/* This is a cancellation point */
|
/* This is a cancellation point */
|
||||||
if (THREAD_GETMEM(self, p_canceled)
|
if (THREAD_GETMEM(self, p_canceled)
|
||||||
&& THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
|
&& THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) {
|
||||||
/* Remove ourselves from the waiting list if we're still on it */
|
/* Remove ourselves from the waiting list if we're still on it */
|
||||||
__pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self);
|
__pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
|
||||||
remove_from_queue(&sem->sem_waiting, self);
|
remove_from_queue(&sem->__sem_waiting, self);
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
pthread_exit(PTHREAD_CANCELED);
|
pthread_exit(PTHREAD_CANCELED);
|
||||||
}
|
}
|
||||||
/* We got the semaphore */
|
/* We got the semaphore */
|
||||||
@ -69,15 +69,15 @@ int sem_trywait(sem_t * sem)
|
|||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
__pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, NULL);
|
__pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, NULL);
|
||||||
if (sem->sem_value == 0) {
|
if (sem->__sem_value == 0) {
|
||||||
errno = EAGAIN;
|
errno = EAGAIN;
|
||||||
retval = -1;
|
retval = -1;
|
||||||
} else {
|
} else {
|
||||||
sem->sem_value--;
|
sem->__sem_value--;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
}
|
}
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,19 +88,19 @@ int sem_post(sem_t * sem)
|
|||||||
struct pthread_request request;
|
struct pthread_request request;
|
||||||
|
|
||||||
if (THREAD_GETMEM(self, p_in_sighandler) == NULL) {
|
if (THREAD_GETMEM(self, p_in_sighandler) == NULL) {
|
||||||
__pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self);
|
__pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self);
|
||||||
if (sem->sem_waiting == NULL) {
|
if (sem->__sem_waiting == NULL) {
|
||||||
if (sem->sem_value >= SEM_VALUE_MAX) {
|
if (sem->__sem_value >= SEM_VALUE_MAX) {
|
||||||
/* Overflow */
|
/* Overflow */
|
||||||
errno = ERANGE;
|
errno = ERANGE;
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sem->sem_value++;
|
sem->__sem_value++;
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
} else {
|
} else {
|
||||||
th = dequeue(&sem->sem_waiting);
|
th = dequeue(&sem->__sem_waiting);
|
||||||
__pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock);
|
__pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock);
|
||||||
restart(th);
|
restart(th);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -122,15 +122,33 @@ int sem_post(sem_t * sem)
|
|||||||
|
|
||||||
int sem_getvalue(sem_t * sem, int * sval)
|
int sem_getvalue(sem_t * sem, int * sval)
|
||||||
{
|
{
|
||||||
*sval = sem->sem_value;
|
*sval = sem->__sem_value;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sem_destroy(sem_t * sem)
|
int sem_destroy(sem_t * sem)
|
||||||
{
|
{
|
||||||
if (sem->sem_waiting != NULL) {
|
if (sem->__sem_waiting != NULL) {
|
||||||
errno = EBUSY;
|
__set_errno (EBUSY);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sem_t *sem_open(const char *name, int oflag, ...)
|
||||||
|
{
|
||||||
|
__set_errno (ENOSYS);
|
||||||
|
return SEM_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sem_close(sem_t *sem)
|
||||||
|
{
|
||||||
|
__set_errno (ENOSYS);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sem_unlink(const char *name)
|
||||||
|
{
|
||||||
|
__set_errno (ENOSYS);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@ -18,24 +18,62 @@
|
|||||||
#include <features.h>
|
#include <features.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <limits.h>
|
#ifndef _PTHREAD_DESCR_DEFINED
|
||||||
|
/* Thread descriptors. Needed for `sem_t' definition. */
|
||||||
|
typedef struct _pthread_descr_struct *_pthread_descr;
|
||||||
|
# define _PTHREAD_DESCR_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SEM_VALUE_MAX INT_MAX
|
/* System specific semaphore definition. */
|
||||||
|
typedef struct
|
||||||
typedef struct {
|
{
|
||||||
struct { long status; int spinlock; } sem_lock;
|
struct
|
||||||
int sem_value;
|
{
|
||||||
_pthread_descr sem_waiting;
|
long int status;
|
||||||
|
int spinlock;
|
||||||
|
} __sem_lock;
|
||||||
|
int __sem_value;
|
||||||
|
_pthread_descr __sem_waiting;
|
||||||
} sem_t;
|
} sem_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Value returned if `sem_open' failed. */
|
||||||
|
#define SEM_FAILED ((sem_t *) NULL)
|
||||||
|
|
||||||
|
/* Maximum value the semaphore can have. */
|
||||||
|
#define SEM_VALUE_MAX ((int) ((~0u) >> 1))
|
||||||
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
extern int sem_init __P((sem_t *__sem, int __pshared, unsigned int __value));
|
/* Initialize semaphore object SEM to VALUE. If PSHARED then share it
|
||||||
extern int sem_destroy __P((sem_t *__sem));
|
with other processes. */
|
||||||
extern int sem_wait __P((sem_t *__sem));
|
extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
|
||||||
extern int sem_trywait __P((sem_t *__sem));
|
|
||||||
extern int sem_post __P((sem_t *__sem));
|
/* Free resources associated with semaphore object SEM. */
|
||||||
extern int sem_getvalue __P((sem_t *__sem, int *__sval));
|
extern int sem_destroy __P ((sem_t *__sem));
|
||||||
|
|
||||||
|
/* Open a named semaphore NAME with open flaot OFLAG. */
|
||||||
|
extern sem_t *sem_open __P ((__const char *__name, int __oflag, ...));
|
||||||
|
|
||||||
|
/* Close descriptor for named semaphore SEM. */
|
||||||
|
extern int sem_close __P ((sem_t *__sem));
|
||||||
|
|
||||||
|
/* Remove named semaphore NAME. */
|
||||||
|
extern int sem_unlink __P ((__const char *__name));
|
||||||
|
|
||||||
|
/* Wait for SEM being posted. */
|
||||||
|
extern int sem_wait __P ((sem_t *__sem));
|
||||||
|
|
||||||
|
/* Test whether SEM is posted. */
|
||||||
|
extern int sem_trywait __P ((sem_t *__sem));
|
||||||
|
|
||||||
|
/* Post SEM. */
|
||||||
|
extern int sem_post __P ((sem_t *__sem));
|
||||||
|
|
||||||
|
/* Get current value of SEM and store it in *SVAL. */
|
||||||
|
extern int sem_getvalue __P ((sem_t *__sem, int *__sval));
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
#ifndef _SEMAPHORE_H
|
|
||||||
# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Due to the implementation of the load-locked/store-conditional
|
|
||||||
instructions, we cannot pack semaphores closer than a cache line
|
|
||||||
or risk threads deadlocking on unrelated semaphores. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long int sem_status;
|
|
||||||
long int sem_reserved[3];
|
|
||||||
} sem_t;
|
|
@ -1,32 +0,0 @@
|
|||||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
#ifndef _SEMAPHORE_H
|
|
||||||
# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Due to the implementation of the load-locked/store-conditional
|
|
||||||
instructions, we cannot pack semaphores closer than a cache line
|
|
||||||
or risk threads deadlocking on unrelated semaphores. */
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int sem_status;
|
|
||||||
int sem_reserved[7];
|
|
||||||
} sem_t;
|
|
@ -29,8 +29,11 @@ struct _pthread_fastlock
|
|||||||
int __spinlock; /* For compare-and-swap emulation */
|
int __spinlock; /* For compare-and-swap emulation */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef _PTHREAD_DESCR_DEFINED
|
||||||
/* Thread descriptors */
|
/* Thread descriptors */
|
||||||
typedef struct _pthread_descr_struct *_pthread_descr;
|
typedef struct _pthread_descr_struct *_pthread_descr;
|
||||||
|
# define _PTHREAD_DESCR_DEFINED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Attributes for threads. */
|
/* Attributes for threads. */
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public License as
|
|
||||||
published by the Free Software Foundation; either version 2 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
#ifndef _SEMAPHORE_H
|
|
||||||
# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long int sem_status;
|
|
||||||
int sem_spinlock;
|
|
||||||
} sem_t;
|
|
@ -1,6 +1,3 @@
|
|||||||
#if defined(LIBC_SCCS) && !defined(lint)
|
|
||||||
static char sccsid[] = "@(#)auth_des.c 2.2 88/07/29 4.0 RPCSRC; from 1.9 88/02/08 SMI";
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -55,7 +52,6 @@ static char sccsid[] = "@(#)auth_des.c 2.2 88/07/29 4.0 RPCSRC; from 1.9 88/02/0
|
|||||||
|
|
||||||
#define debug(msg) /* printf("%s\n", msg) */
|
#define debug(msg) /* printf("%s\n", msg) */
|
||||||
|
|
||||||
extern int rtime (struct sockaddr_in *, struct timeval *, struct timeval *);
|
|
||||||
extern bool_t xdr_authdes_cred (XDR *, struct authdes_cred *);
|
extern bool_t xdr_authdes_cred (XDR *, struct authdes_cred *);
|
||||||
extern bool_t xdr_authdes_verf (XDR *, struct authdes_verf *);
|
extern bool_t xdr_authdes_verf (XDR *, struct authdes_verf *);
|
||||||
|
|
||||||
@ -67,7 +63,7 @@ static bool_t authdes_marshal (AUTH *, XDR *);
|
|||||||
static bool_t authdes_validate (AUTH *, struct opaque_auth *);
|
static bool_t authdes_validate (AUTH *, struct opaque_auth *);
|
||||||
static bool_t authdes_refresh (AUTH *);
|
static bool_t authdes_refresh (AUTH *);
|
||||||
static void authdes_destroy (AUTH *);
|
static void authdes_destroy (AUTH *);
|
||||||
static bool_t synchronize (struct sockaddr *, struct timeval *)
|
static bool_t synchronize (struct sockaddr *, struct rpc_timeval *)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
static struct auth_ops authdes_ops = {
|
static struct auth_ops authdes_ops = {
|
||||||
@ -90,11 +86,11 @@ struct ad_private {
|
|||||||
uint32_t ad_window; /* client specified window */
|
uint32_t ad_window; /* client specified window */
|
||||||
bool_t ad_dosync; /* synchronize? */
|
bool_t ad_dosync; /* synchronize? */
|
||||||
struct sockaddr ad_syncaddr; /* remote host to synch with */
|
struct sockaddr ad_syncaddr; /* remote host to synch with */
|
||||||
struct timeval ad_timediff; /* server's time - client's time */
|
struct rpc_timeval ad_timediff; /* server's time - client's time */
|
||||||
u_long ad_nickname; /* server's nickname for client */
|
uint32_t ad_nickname; /* server's nickname for client */
|
||||||
struct authdes_cred ad_cred; /* storage for credential */
|
struct authdes_cred ad_cred; /* storage for credential */
|
||||||
struct authdes_verf ad_verf; /* storage for verifier */
|
struct authdes_verf ad_verf; /* storage for verifier */
|
||||||
struct timeval ad_timestamp; /* timestamp sent */
|
struct rpc_timeval ad_timestamp; /* timestamp sent */
|
||||||
des_block ad_xkey; /* encrypted conversation key */
|
des_block ad_xkey; /* encrypted conversation key */
|
||||||
u_char ad_pkey[1024]; /* Servers actual public key */
|
u_char ad_pkey[1024]; /* Servers actual public key */
|
||||||
};
|
};
|
||||||
@ -115,7 +111,7 @@ authdes_create (const char *servername, u_int window,
|
|||||||
netobj pkey;
|
netobj pkey;
|
||||||
|
|
||||||
if (!getpublickey (servername, pkey_data))
|
if (!getpublickey (servername, pkey_data))
|
||||||
return (NULL);
|
return NULL;
|
||||||
|
|
||||||
pkey.n_bytes = (char *) pkey_data;
|
pkey.n_bytes = (char *) pkey_data;
|
||||||
pkey.n_len = strlen ((char *) pkey_data) + 1;
|
pkey.n_len = strlen ((char *) pkey_data) + 1;
|
||||||
@ -135,6 +131,13 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window,
|
|||||||
*/
|
*/
|
||||||
auth = ALLOC (AUTH);
|
auth = ALLOC (AUTH);
|
||||||
ad = ALLOC (struct ad_private);
|
ad = ALLOC (struct ad_private);
|
||||||
|
|
||||||
|
if (auth == NULL || ad == NULL)
|
||||||
|
{
|
||||||
|
debug ("authdes_create: out of memory");
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
memset (ad, 0, sizeof (struct ad_private));
|
memset (ad, 0, sizeof (struct ad_private));
|
||||||
memcpy (ad->ad_pkey, pkey->n_bytes, pkey->n_len);
|
memcpy (ad->ad_pkey, pkey->n_bytes, pkey->n_len);
|
||||||
if (!getnetname (namebuf))
|
if (!getnetname (namebuf))
|
||||||
@ -145,8 +148,7 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window,
|
|||||||
ad->ad_servernamelen = strlen (servername);
|
ad->ad_servernamelen = strlen (servername);
|
||||||
ad->ad_servername = mem_alloc (ad->ad_servernamelen + 1);
|
ad->ad_servername = mem_alloc (ad->ad_servernamelen + 1);
|
||||||
|
|
||||||
if (auth == NULL || ad == NULL || ad->ad_fullname == NULL ||
|
if (ad->ad_fullname == NULL || ad->ad_servername == NULL)
|
||||||
ad->ad_servername == NULL)
|
|
||||||
{
|
{
|
||||||
debug ("authdes_create: out of memory");
|
debug ("authdes_create: out of memory");
|
||||||
goto failed;
|
goto failed;
|
||||||
@ -155,8 +157,8 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window,
|
|||||||
/*
|
/*
|
||||||
* Set up private data
|
* Set up private data
|
||||||
*/
|
*/
|
||||||
bcopy (namebuf, ad->ad_fullname, ad->ad_fullnamelen + 1);
|
memcpy (ad->ad_fullname, namebuf, ad->ad_fullnamelen + 1);
|
||||||
bcopy (servername, ad->ad_servername, ad->ad_servernamelen + 1);
|
memcpy (ad->ad_servername, servername, ad->ad_servernamelen + 1);
|
||||||
ad->ad_timediff.tv_sec = ad->ad_timediff.tv_usec = 0;
|
ad->ad_timediff.tv_sec = ad->ad_timediff.tv_usec = 0;
|
||||||
if (syncaddr != NULL)
|
if (syncaddr != NULL)
|
||||||
{
|
{
|
||||||
@ -172,7 +174,7 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window,
|
|||||||
if (key_gendes (&auth->ah_key) < 0)
|
if (key_gendes (&auth->ah_key) < 0)
|
||||||
{
|
{
|
||||||
debug ("authdes_create: unable to gen conversation key");
|
debug ("authdes_create: unable to gen conversation key");
|
||||||
return (NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -189,7 +191,7 @@ authdes_pk_create (const char *servername, netobj *pkey, u_int window,
|
|||||||
if (!authdes_refresh (auth))
|
if (!authdes_refresh (auth))
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
return (auth);
|
return auth;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
if (auth != NULL)
|
if (auth != NULL)
|
||||||
@ -202,7 +204,7 @@ failed:
|
|||||||
FREE (ad->ad_servername, ad->ad_servernamelen + 1);
|
FREE (ad->ad_servername, ad->ad_servernamelen + 1);
|
||||||
FREE (ad, sizeof (struct ad_private));
|
FREE (ad, sizeof (struct ad_private));
|
||||||
}
|
}
|
||||||
return (NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -215,7 +217,7 @@ failed:
|
|||||||
*/
|
*/
|
||||||
/*ARGSUSED */
|
/*ARGSUSED */
|
||||||
static void
|
static void
|
||||||
authdes_nextverf (AUTH * auth)
|
authdes_nextverf (AUTH *auth)
|
||||||
{
|
{
|
||||||
/* what the heck am I supposed to do??? */
|
/* what the heck am I supposed to do??? */
|
||||||
}
|
}
|
||||||
@ -226,7 +228,7 @@ authdes_nextverf (AUTH * auth)
|
|||||||
* 2. Marshal
|
* 2. Marshal
|
||||||
*/
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
authdes_marshal (AUTH * auth, XDR * xdrs)
|
authdes_marshal (AUTH *auth, XDR *xdrs)
|
||||||
{
|
{
|
||||||
struct ad_private *ad = AUTH_PRIVATE (auth);
|
struct ad_private *ad = AUTH_PRIVATE (auth);
|
||||||
struct authdes_cred *cred = &ad->ad_cred;
|
struct authdes_cred *cred = &ad->ad_cred;
|
||||||
@ -235,15 +237,16 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
|
|||||||
des_block ivec;
|
des_block ivec;
|
||||||
int status;
|
int status;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
register long *ixdr;
|
register int32_t *ixdr;
|
||||||
|
struct timeval tval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Figure out the "time", accounting for any time difference
|
* Figure out the "time", accounting for any time difference
|
||||||
* with the server if necessary.
|
* with the server if necessary.
|
||||||
*/
|
*/
|
||||||
__gettimeofday (&ad->ad_timestamp, (struct timezone *) NULL);
|
__gettimeofday (&tval, (struct timezone *) NULL);
|
||||||
ad->ad_timestamp.tv_sec += ad->ad_timediff.tv_sec;
|
ad->ad_timestamp.tv_sec = tval.tv_sec + ad->ad_timediff.tv_sec;
|
||||||
ad->ad_timestamp.tv_usec += ad->ad_timediff.tv_usec;
|
ad->ad_timestamp.tv_usec = tval.tv_usec + ad->ad_timediff.tv_usec;
|
||||||
if (ad->ad_timestamp.tv_usec >= MILLION)
|
if (ad->ad_timestamp.tv_usec >= MILLION)
|
||||||
{
|
{
|
||||||
ad->ad_timestamp.tv_usec -= MILLION;
|
ad->ad_timestamp.tv_usec -= MILLION;
|
||||||
@ -255,9 +258,9 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
|
|||||||
* encrypt them.
|
* encrypt them.
|
||||||
* XXX We have a real Year 2038 problem here.
|
* XXX We have a real Year 2038 problem here.
|
||||||
*/
|
*/
|
||||||
ixdr = (long *) cryptbuf;
|
ixdr = (int32_t *) cryptbuf;
|
||||||
IXDR_PUT_LONG (ixdr, ad->ad_timestamp.tv_sec);
|
IXDR_PUT_INT32 (ixdr, ad->ad_timestamp.tv_sec);
|
||||||
IXDR_PUT_LONG (ixdr, ad->ad_timestamp.tv_usec);
|
IXDR_PUT_INT32 (ixdr, ad->ad_timestamp.tv_usec);
|
||||||
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
|
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
|
||||||
{
|
{
|
||||||
IXDR_PUT_U_INT32 (ixdr, ad->ad_window);
|
IXDR_PUT_U_INT32 (ixdr, ad->ad_window);
|
||||||
@ -267,14 +270,13 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
|
|||||||
2 * sizeof (des_block), DES_ENCRYPT | DES_HW, (char *) &ivec);
|
2 * sizeof (des_block), DES_ENCRYPT | DES_HW, (char *) &ivec);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
status = ecb_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
|
||||||
status = ecb_crypt ((char *) &auth->ah_key, (char *) cryptbuf,
|
sizeof (des_block), DES_ENCRYPT | DES_HW);
|
||||||
sizeof (des_block), DES_ENCRYPT | DES_HW);
|
|
||||||
}
|
|
||||||
if (DES_FAILED (status))
|
if (DES_FAILED (status))
|
||||||
{
|
{
|
||||||
debug ("authdes_marshal: DES encryption failure");
|
debug ("authdes_marshal: DES encryption failure");
|
||||||
return (FALSE);
|
return FALSE;
|
||||||
}
|
}
|
||||||
ad->ad_verf.adv_xtimestamp = cryptbuf[0];
|
ad->ad_verf.adv_xtimestamp = cryptbuf[0];
|
||||||
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
|
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
|
||||||
@ -293,13 +295,9 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
|
|||||||
* authentication data.
|
* authentication data.
|
||||||
*/
|
*/
|
||||||
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
|
if (ad->ad_cred.adc_namekind == ADN_FULLNAME)
|
||||||
{
|
len = ((1 + 1 + 2 + 1) * BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
|
||||||
len = ((1 + 1 + 2 + 1) * BYTES_PER_XDR_UNIT + ad->ad_fullnamelen);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
len = (1 + 1) * BYTES_PER_XDR_UNIT;
|
||||||
len = (1 + 1) * BYTES_PER_XDR_UNIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ixdr = xdr_inline (xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL)
|
if ((ixdr = xdr_inline (xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL)
|
||||||
{
|
{
|
||||||
@ -325,6 +323,7 @@ authdes_marshal (AUTH * auth, XDR * xdrs)
|
|||||||
ATTEMPT (xdr_putint32 (xdrs, &len));
|
ATTEMPT (xdr_putint32 (xdrs, &len));
|
||||||
}
|
}
|
||||||
ATTEMPT (xdr_authdes_verf (xdrs, verf));
|
ATTEMPT (xdr_authdes_verf (xdrs, verf));
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -338,15 +337,15 @@ authdes_validate (AUTH *auth, struct opaque_auth *rverf)
|
|||||||
struct ad_private *ad = AUTH_PRIVATE (auth);
|
struct ad_private *ad = AUTH_PRIVATE (auth);
|
||||||
struct authdes_verf verf;
|
struct authdes_verf verf;
|
||||||
int status;
|
int status;
|
||||||
register u_long *ixdr;
|
register uint32_t *ixdr;
|
||||||
|
|
||||||
if (rverf->oa_length != (2 + 1) * BYTES_PER_XDR_UNIT)
|
if (rverf->oa_length != (2 + 1) * BYTES_PER_XDR_UNIT)
|
||||||
return (FALSE);
|
return FALSE;
|
||||||
|
|
||||||
ixdr = (u_long *) rverf->oa_base;
|
ixdr = (uint32_t *) rverf->oa_base;
|
||||||
verf.adv_xtimestamp.key.high = (u_long) * ixdr++;
|
verf.adv_xtimestamp.key.high = *ixdr++;
|
||||||
verf.adv_xtimestamp.key.low = (u_long) * ixdr++;
|
verf.adv_xtimestamp.key.low = *ixdr++;
|
||||||
verf.adv_int_u = (u_long) * ixdr++; /* nickname not XDR'd ! */
|
verf.adv_int_u = *ixdr++; /* nickname not XDR'd ! */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decrypt the timestamp
|
* Decrypt the timestamp
|
||||||
@ -363,15 +362,15 @@ authdes_validate (AUTH *auth, struct opaque_auth *rverf)
|
|||||||
/*
|
/*
|
||||||
* xdr the decrypted timestamp
|
* xdr the decrypted timestamp
|
||||||
*/
|
*/
|
||||||
ixdr = (u_long *) verf.adv_xtimestamp.c;
|
ixdr = (uint32_t *) verf.adv_xtimestamp.c;
|
||||||
verf.adv_timestamp.tv_sec = IXDR_GET_LONG (ixdr) + 1;
|
verf.adv_timestamp.tv_sec = IXDR_GET_U_INT32 (ixdr) + 1;
|
||||||
verf.adv_timestamp.tv_usec = IXDR_GET_LONG (ixdr);
|
verf.adv_timestamp.tv_usec = IXDR_GET_U_INT32 (ixdr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* validate
|
* validate
|
||||||
*/
|
*/
|
||||||
if (memcmp ((char *) &ad->ad_timestamp, (char *) &verf.adv_timestamp,
|
if (memcmp ((char *) &ad->ad_timestamp, (char *) &verf.adv_timestamp,
|
||||||
sizeof (struct timeval)) != 0)
|
sizeof (struct rpc_timeval)) != 0)
|
||||||
{
|
{
|
||||||
debug ("authdes_validate: verifier mismatch\n");
|
debug ("authdes_validate: verifier mismatch\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -395,8 +394,7 @@ authdes_refresh (AUTH *auth)
|
|||||||
struct ad_private *ad = AUTH_PRIVATE (auth);
|
struct ad_private *ad = AUTH_PRIVATE (auth);
|
||||||
struct authdes_cred *cred = &ad->ad_cred;
|
struct authdes_cred *cred = &ad->ad_cred;
|
||||||
|
|
||||||
if (ad->ad_dosync &&
|
if (ad->ad_dosync && !synchronize (&ad->ad_syncaddr, &ad->ad_timediff))
|
||||||
!synchronize (&ad->ad_syncaddr, &ad->ad_timediff))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Hope the clocks are synced!
|
* Hope the clocks are synced!
|
||||||
@ -438,10 +436,10 @@ authdes_destroy (AUTH *auth)
|
|||||||
*/
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
internal_function
|
internal_function
|
||||||
synchronize (struct sockaddr *syncaddr, struct timeval *timep)
|
synchronize (struct sockaddr *syncaddr, struct rpc_timeval *timep)
|
||||||
{
|
{
|
||||||
struct timeval mytime;
|
struct timeval mytime;
|
||||||
struct timeval timeout;
|
struct rpc_timeval timeout;
|
||||||
|
|
||||||
timeout.tv_sec = RTIME_TIMEOUT;
|
timeout.tv_sec = RTIME_TIMEOUT;
|
||||||
timeout.tv_usec = 0;
|
timeout.tv_usec = 0;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)auth_none.c 2.1 88/07/29 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,16 +26,13 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
/*
|
||||||
static char sccsid[] = "@(#)auth_none.c 1.19 87/08/11 Copyr 1984 Sun Micro";
|
* Copyright (C) 1984, Sun Microsystems, Inc.
|
||||||
#endif
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* auth_none.c
|
* auth_none.c
|
||||||
* Creates a client authentication handle for passing "null"
|
* Creates a client authentication handle for passing "null"
|
||||||
* credentials and verifiers to remote systems.
|
* credentials and verifiers to remote systems.
|
||||||
*
|
|
||||||
* Copyright (C) 1984, Sun Microsystems, Inc.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rpc/types.h>
|
#include <rpc/types.h>
|
||||||
@ -53,8 +49,7 @@ static bool_t authnone_marshal (AUTH *, XDR *);
|
|||||||
static bool_t authnone_validate (AUTH *, struct opaque_auth *);
|
static bool_t authnone_validate (AUTH *, struct opaque_auth *);
|
||||||
static bool_t authnone_refresh (AUTH *);
|
static bool_t authnone_refresh (AUTH *);
|
||||||
|
|
||||||
static struct auth_ops ops =
|
static struct auth_ops ops = {
|
||||||
{
|
|
||||||
authnone_verf,
|
authnone_verf,
|
||||||
authnone_marshal,
|
authnone_marshal,
|
||||||
authnone_validate,
|
authnone_validate,
|
||||||
@ -63,12 +58,11 @@ static struct auth_ops ops =
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct authnone_private
|
static struct authnone_private
|
||||||
{
|
{
|
||||||
AUTH no_client;
|
AUTH no_client;
|
||||||
char marshalled_client[MAX_MARSHEL_SIZE];
|
char marshalled_client[MAX_MARSHEL_SIZE];
|
||||||
u_int mcnt;
|
u_int mcnt;
|
||||||
}
|
} *authnone_private;
|
||||||
*authnone_private;
|
|
||||||
|
|
||||||
AUTH *
|
AUTH *
|
||||||
authnone_create (void)
|
authnone_create (void)
|
||||||
@ -106,9 +100,8 @@ authnone_marshal (AUTH *client, XDR *xdrs)
|
|||||||
struct authnone_private *ap = authnone_private;
|
struct authnone_private *ap = authnone_private;
|
||||||
|
|
||||||
if (ap == 0)
|
if (ap == 0)
|
||||||
return (0);
|
return 0;
|
||||||
return ((*xdrs->x_ops->x_putbytes) (xdrs,
|
return (*xdrs->x_ops->x_putbytes) (xdrs, ap->marshalled_client, ap->mcnt);
|
||||||
ap->marshalled_client, ap->mcnt));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)auth_unix.c 2.2 88/08/01 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,20 +26,16 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
/*
|
||||||
static char sccsid[] = "@(#)auth_unix.c 1.19 87/08/11 Copyr 1984 Sun Micro";
|
* Copyright (C) 1984, Sun Microsystems, Inc.
|
||||||
#endif
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* auth_unix.c, Implements UNIX style authentication parameters.
|
* auth_unix.c, Implements UNIX style authentication parameters.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1984, Sun Microsystems, Inc.
|
|
||||||
*
|
|
||||||
* The system is very weak. The client uses no encryption for it's
|
* The system is very weak. The client uses no encryption for it's
|
||||||
* credentials and only sends null verifiers. The server sends backs
|
* credentials and only sends null verifiers. The server sends backs
|
||||||
* null verifiers or optionally a verifier that suggests a new short hand
|
* null verifiers or optionally a verifier that suggests a new short hand
|
||||||
* for the credentials.
|
* for the credentials.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
@ -63,8 +58,7 @@ static bool_t authunix_validate (AUTH *, struct opaque_auth *);
|
|||||||
static bool_t authunix_refresh (AUTH *);
|
static bool_t authunix_refresh (AUTH *);
|
||||||
static void authunix_destroy (AUTH *);
|
static void authunix_destroy (AUTH *);
|
||||||
|
|
||||||
static struct auth_ops auth_unix_ops =
|
static struct auth_ops auth_unix_ops = {
|
||||||
{
|
|
||||||
authunix_nextverf,
|
authunix_nextverf,
|
||||||
authunix_marshal,
|
authunix_marshal,
|
||||||
authunix_validate,
|
authunix_validate,
|
||||||
@ -75,14 +69,13 @@ static struct auth_ops auth_unix_ops =
|
|||||||
/*
|
/*
|
||||||
* This struct is pointed to by the ah_private field of an auth_handle.
|
* This struct is pointed to by the ah_private field of an auth_handle.
|
||||||
*/
|
*/
|
||||||
struct audata
|
struct audata {
|
||||||
{
|
struct opaque_auth au_origcred; /* original credentials */
|
||||||
struct opaque_auth au_origcred; /* original credentials */
|
struct opaque_auth au_shcred; /* short hand cred */
|
||||||
struct opaque_auth au_shcred; /* short hand cred */
|
u_long au_shfaults; /* short hand cache faults */
|
||||||
u_long au_shfaults; /* short hand cache faults */
|
char au_marshed[MAX_AUTH_BYTES];
|
||||||
char au_marshed[MAX_AUTH_BYTES];
|
u_int au_mpos; /* xdr pos at end of marshed */
|
||||||
u_int au_mpos; /* xdr pos at end of marshed */
|
};
|
||||||
};
|
|
||||||
#define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private)
|
#define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private)
|
||||||
|
|
||||||
static bool_t marshal_new_auth (AUTH *) internal_function;
|
static bool_t marshal_new_auth (AUTH *) internal_function;
|
||||||
@ -93,12 +86,8 @@ static bool_t marshal_new_auth (AUTH *) internal_function;
|
|||||||
* Returns an auth handle with the given stuff in it.
|
* Returns an auth handle with the given stuff in it.
|
||||||
*/
|
*/
|
||||||
AUTH *
|
AUTH *
|
||||||
authunix_create (machname, uid, gid, len, aup_gids)
|
authunix_create (char *machname, uid_t uid, gid_t gid, int len,
|
||||||
char *machname;
|
gid_t *aup_gids)
|
||||||
uid_t uid;
|
|
||||||
gid_t gid;
|
|
||||||
int len;
|
|
||||||
gid_t *aup_gids;
|
|
||||||
{
|
{
|
||||||
struct authunix_parms aup;
|
struct authunix_parms aup;
|
||||||
char mymem[MAX_AUTH_BYTES];
|
char mymem[MAX_AUTH_BYTES];
|
||||||
@ -146,12 +135,13 @@ authunix_create (machname, uid, gid, len, aup_gids)
|
|||||||
abort ();
|
abort ();
|
||||||
au->au_origcred.oa_length = len = XDR_GETPOS (&xdrs);
|
au->au_origcred.oa_length = len = XDR_GETPOS (&xdrs);
|
||||||
au->au_origcred.oa_flavor = AUTH_UNIX;
|
au->au_origcred.oa_flavor = AUTH_UNIX;
|
||||||
if ((au->au_origcred.oa_base = mem_alloc ((u_int) len)) == NULL)
|
au->au_origcred.oa_base = mem_alloc ((u_int) len);
|
||||||
|
if (au->au_origcred.oa_base == NULL)
|
||||||
{
|
{
|
||||||
(void) fprintf (stderr, _("authunix_create: out of memory\n"));
|
(void) fputs (_("authunix_create: out of memory\n"), stderr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
bcopy (mymem, au->au_origcred.oa_base, (u_int) len);
|
memcpy(au->au_origcred.oa_base, mymem, (u_int) len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set auth handle to reflect new cred.
|
* set auth handle to reflect new cred.
|
||||||
@ -317,13 +307,10 @@ marshal_new_auth (AUTH *auth)
|
|||||||
xdrmem_create (xdrs, au->au_marshed, MAX_AUTH_BYTES, XDR_ENCODE);
|
xdrmem_create (xdrs, au->au_marshed, MAX_AUTH_BYTES, XDR_ENCODE);
|
||||||
if ((!xdr_opaque_auth (xdrs, &(auth->ah_cred))) ||
|
if ((!xdr_opaque_auth (xdrs, &(auth->ah_cred))) ||
|
||||||
(!xdr_opaque_auth (xdrs, &(auth->ah_verf))))
|
(!xdr_opaque_auth (xdrs, &(auth->ah_verf))))
|
||||||
{
|
perror (_("auth_none.c - Fatal marshalling problem"));
|
||||||
perror (_("auth_none.c - Fatal marshalling problem"));
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
au->au_mpos = XDR_GETPOS (xdrs);
|
||||||
au->au_mpos = XDR_GETPOS (xdrs);
|
|
||||||
}
|
|
||||||
XDR_DESTROY (xdrs);
|
XDR_DESTROY (xdrs);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
#if defined(LIBC_SCCS) && !defined(lint)
|
|
||||||
static char sccsid[] = "@(#)authdes_prot.c 2.1 88/07/29 4.0 RPCSRC; from 1.6 88/02/08 SMI";
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -32,7 +29,6 @@ static char sccsid[] = "@(#)authdes_prot.c 2.1 88/07/29 4.0 RPCSRC; from 1.6 88/
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1988 by Sun Microsystems, Inc.
|
* Copyright (c) 1988 by Sun Microsystems, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* authdes_prot.c, XDR routines for DES authentication
|
* authdes_prot.c, XDR routines for DES authentication
|
||||||
*/
|
*/
|
||||||
@ -45,7 +41,7 @@ static char sccsid[] = "@(#)authdes_prot.c 2.1 88/07/29 4.0 RPCSRC; from 1.6 88/
|
|||||||
#define ATTEMPT(xdr_op) if (!(xdr_op)) return (FALSE)
|
#define ATTEMPT(xdr_op) if (!(xdr_op)) return (FALSE)
|
||||||
|
|
||||||
bool_t
|
bool_t
|
||||||
xdr_authdes_cred (XDR * xdrs, struct authdes_cred *cred)
|
xdr_authdes_cred (XDR *xdrs, struct authdes_cred *cred)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Unrolled xdr
|
* Unrolled xdr
|
||||||
@ -68,7 +64,7 @@ xdr_authdes_cred (XDR * xdrs, struct authdes_cred *cred)
|
|||||||
|
|
||||||
|
|
||||||
bool_t
|
bool_t
|
||||||
xdr_authdes_verf (register XDR * xdrs, register struct authdes_verf * verf)
|
xdr_authdes_verf (register XDR *xdrs, register struct authdes_verf *verf)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Unrolled xdr
|
* Unrolled xdr
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)authunix_prot.c 2.1 88/07/29 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,18 +26,14 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
/*
|
||||||
static char sccsid[] = "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro";
|
* Copyright (C) 1984, Sun Microsystems, Inc.
|
||||||
#endif
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* authunix_prot.c
|
* authunix_prot.c
|
||||||
* XDR for UNIX style authentication parameters for RPC
|
* XDR for UNIX style authentication parameters for RPC
|
||||||
*
|
|
||||||
* Copyright (C) 1984, Sun Microsystems, Inc.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <rpc/types.h>
|
#include <rpc/types.h>
|
||||||
#include <rpc/xdr.h>
|
#include <rpc/xdr.h>
|
||||||
#include <rpc/auth.h>
|
#include <rpc/auth.h>
|
||||||
|
@ -26,17 +26,14 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
|
||||||
static char sccsid[] = "@(#)bindresvport.c 2.2 88/07/29 4.0 RPCSRC 1.8 88/02/08 SMI";
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1987 by Sun Microsystems, Inc.
|
* Copyright (c) 1987 by Sun Microsystems, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/errno.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
@ -49,9 +46,6 @@ bindresvport (int sd, struct sockaddr_in *sin)
|
|||||||
int res;
|
int res;
|
||||||
static short port;
|
static short port;
|
||||||
struct sockaddr_in myaddr;
|
struct sockaddr_in myaddr;
|
||||||
#ifndef errno
|
|
||||||
extern int errno;
|
|
||||||
#endif
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define STARTPORT 600
|
#define STARTPORT 600
|
||||||
@ -69,13 +63,15 @@ bindresvport (int sd, struct sockaddr_in *sin)
|
|||||||
__set_errno (EPFNOSUPPORT);
|
__set_errno (EPFNOSUPPORT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (port == 0)
|
if (port == 0)
|
||||||
{
|
{
|
||||||
port = (__getpid () % NPORTS) + STARTPORT;
|
port = (__getpid () % NPORTS) + STARTPORT;
|
||||||
}
|
}
|
||||||
res = -1;
|
res = -1;
|
||||||
__set_errno (EADDRINUSE);
|
__set_errno (EADDRINUSE);
|
||||||
for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++)
|
|
||||||
|
for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; ++i)
|
||||||
{
|
{
|
||||||
sin->sin_port = htons (port++);
|
sin->sin_port = htons (port++);
|
||||||
if (port > ENDPORT)
|
if (port > ENDPORT)
|
||||||
@ -84,5 +80,6 @@ bindresvport (int sd, struct sockaddr_in *sin)
|
|||||||
}
|
}
|
||||||
res = bind (sd, sin, sizeof (struct sockaddr_in));
|
res = bind (sd, sin, sizeof (struct sockaddr_in));
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)clnt_generic.c 2.2 88/08/01 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,12 +26,10 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
|
||||||
static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI";
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1987, Sun Microsystems, Inc.
|
* Copyright (C) 1987, Sun Microsystems, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -48,12 +48,19 @@ struct authdes_cred
|
|||||||
uint32_t adc_nickname;
|
uint32_t adc_nickname;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* A timeval replacement for !32bit platforms */
|
||||||
|
struct rpc_timeval
|
||||||
|
{
|
||||||
|
uint32_t tv_sec; /* Seconds. */
|
||||||
|
uint32_t tv_usec; /* Microseconds. */
|
||||||
|
};
|
||||||
|
|
||||||
/* A des authentication verifier */
|
/* A des authentication verifier */
|
||||||
struct authdes_verf
|
struct authdes_verf
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
struct timeval adv_ctime; /* clear time */
|
struct rpc_timeval adv_ctime; /* clear time */
|
||||||
des_block adv_xtime; /* crypt time */
|
des_block adv_xtime; /* crypt time */
|
||||||
}
|
}
|
||||||
adv_time_u;
|
adv_time_u;
|
||||||
@ -96,8 +103,9 @@ extern int getpublickey __P ((__const char *__name, char *__key));
|
|||||||
extern int getsecretkey __P ((__const char *__name, char *__key,
|
extern int getsecretkey __P ((__const char *__name, char *__key,
|
||||||
__const char *__passwd));
|
__const char *__passwd));
|
||||||
|
|
||||||
extern int rtime __P ((struct sockaddr_in *__addrp, struct timeval *__timep,
|
extern int rtime __P ((struct sockaddr_in *__addrp,
|
||||||
struct timeval *__timeout));
|
struct rpc_timeval *__timep,
|
||||||
|
struct rpc_timeval *__timeout));
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,7 +26,6 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
/* @(#)xdr.h 1.19 87/04/22 SMI */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xdr.h, External Data Representation Serialization Routines.
|
* xdr.h, External Data Representation Serialization Routines.
|
||||||
@ -130,7 +128,7 @@ struct XDR
|
|||||||
/* returns bytes off from beginning */
|
/* returns bytes off from beginning */
|
||||||
bool_t (*x_setpostn) __PMT ((XDR *__xdrs, u_int pos));
|
bool_t (*x_setpostn) __PMT ((XDR *__xdrs, u_int pos));
|
||||||
/* lets you reposition the stream */
|
/* lets you reposition the stream */
|
||||||
long *(*x_inline) __PMT ((XDR *__xdrs, int len));
|
int32_t *(*x_inline) __PMT ((XDR *__xdrs, int len));
|
||||||
/* buf quick ptr to buffered data */
|
/* buf quick ptr to buffered data */
|
||||||
void (*x_destroy) __PMT ((XDR *__xdrs));
|
void (*x_destroy) __PMT ((XDR *__xdrs));
|
||||||
/* free privates of this xdr_stream */
|
/* free privates of this xdr_stream */
|
||||||
@ -162,6 +160,7 @@ typedef bool_t (*xdrproc_t) __PMT ((XDR *, void *,...));
|
|||||||
* Operations defined on a XDR handle
|
* Operations defined on a XDR handle
|
||||||
*
|
*
|
||||||
* XDR *xdrs;
|
* XDR *xdrs;
|
||||||
|
* int32_t *int32p;
|
||||||
* long *longp;
|
* long *longp;
|
||||||
* caddr_t addr;
|
* caddr_t addr;
|
||||||
* u_int len;
|
* u_int len;
|
||||||
|
@ -48,7 +48,7 @@ static char sccsid[] = "@(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro";
|
|||||||
bool_t
|
bool_t
|
||||||
xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
||||||
{
|
{
|
||||||
long *buf;
|
int32_t *buf;
|
||||||
struct opaque_auth *oa;
|
struct opaque_auth *oa;
|
||||||
|
|
||||||
if (xdrs->x_op == XDR_ENCODE)
|
if (xdrs->x_op == XDR_ENCODE)
|
||||||
@ -70,28 +70,24 @@ xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
|||||||
IXDR_PUT_LONG (buf, cmsg->rm_xid);
|
IXDR_PUT_LONG (buf, cmsg->rm_xid);
|
||||||
IXDR_PUT_ENUM (buf, cmsg->rm_direction);
|
IXDR_PUT_ENUM (buf, cmsg->rm_direction);
|
||||||
if (cmsg->rm_direction != CALL)
|
if (cmsg->rm_direction != CALL)
|
||||||
{
|
return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_rpcvers);
|
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_rpcvers);
|
||||||
if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION)
|
if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION)
|
||||||
{
|
return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_prog);
|
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_prog);
|
||||||
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_vers);
|
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_vers);
|
||||||
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_proc);
|
IXDR_PUT_LONG (buf, cmsg->rm_call.cb_proc);
|
||||||
oa = &cmsg->rm_call.cb_cred;
|
oa = &cmsg->rm_call.cb_cred;
|
||||||
IXDR_PUT_ENUM (buf, oa->oa_flavor);
|
IXDR_PUT_ENUM (buf, oa->oa_flavor);
|
||||||
IXDR_PUT_LONG (buf, oa->oa_length);
|
IXDR_PUT_INT32 (buf, oa->oa_length);
|
||||||
if (oa->oa_length)
|
if (oa->oa_length)
|
||||||
{
|
{
|
||||||
bcopy (oa->oa_base, (caddr_t) buf, oa->oa_length);
|
bcopy (oa->oa_base, (caddr_t) buf, oa->oa_length);
|
||||||
buf = (long *) ((char *) buf + RNDUP (oa->oa_length));
|
buf = (int32_t *) ((char *) buf + RNDUP (oa->oa_length));
|
||||||
}
|
}
|
||||||
oa = &cmsg->rm_call.cb_verf;
|
oa = &cmsg->rm_call.cb_verf;
|
||||||
IXDR_PUT_ENUM (buf, oa->oa_flavor);
|
IXDR_PUT_ENUM (buf, oa->oa_flavor);
|
||||||
IXDR_PUT_LONG (buf, oa->oa_length);
|
IXDR_PUT_INT32 (buf, oa->oa_length);
|
||||||
if (oa->oa_length)
|
if (oa->oa_length)
|
||||||
{
|
{
|
||||||
bcopy (oa->oa_base, (caddr_t) buf, oa->oa_length);
|
bcopy (oa->oa_base, (caddr_t) buf, oa->oa_length);
|
||||||
@ -123,13 +119,11 @@ xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
|||||||
cmsg->rm_call.cb_proc = IXDR_GET_LONG (buf);
|
cmsg->rm_call.cb_proc = IXDR_GET_LONG (buf);
|
||||||
oa = &cmsg->rm_call.cb_cred;
|
oa = &cmsg->rm_call.cb_cred;
|
||||||
oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
|
oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
|
||||||
oa->oa_length = IXDR_GET_LONG (buf);
|
oa->oa_length = IXDR_GET_INT32 (buf);
|
||||||
if (oa->oa_length)
|
if (oa->oa_length)
|
||||||
{
|
{
|
||||||
if (oa->oa_length > MAX_AUTH_BYTES)
|
if (oa->oa_length > MAX_AUTH_BYTES)
|
||||||
{
|
return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (oa->oa_base == NULL)
|
if (oa->oa_base == NULL)
|
||||||
{
|
{
|
||||||
oa->oa_base = (caddr_t)
|
oa->oa_base = (caddr_t)
|
||||||
@ -140,9 +134,7 @@ xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
|||||||
{
|
{
|
||||||
if (xdr_opaque (xdrs, oa->oa_base,
|
if (xdr_opaque (xdrs, oa->oa_base,
|
||||||
oa->oa_length) == FALSE)
|
oa->oa_length) == FALSE)
|
||||||
{
|
return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -167,14 +159,12 @@ xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
|
oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
|
||||||
oa->oa_length = IXDR_GET_LONG (buf);
|
oa->oa_length = IXDR_GET_INT32 (buf);
|
||||||
}
|
}
|
||||||
if (oa->oa_length)
|
if (oa->oa_length)
|
||||||
{
|
{
|
||||||
if (oa->oa_length > MAX_AUTH_BYTES)
|
if (oa->oa_length > MAX_AUTH_BYTES)
|
||||||
{
|
return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (oa->oa_base == NULL)
|
if (oa->oa_base == NULL)
|
||||||
{
|
{
|
||||||
oa->oa_base = (caddr_t)
|
oa->oa_base = (caddr_t)
|
||||||
@ -185,9 +175,7 @@ xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
|
|||||||
{
|
{
|
||||||
if (xdr_opaque (xdrs, oa->oa_base,
|
if (xdr_opaque (xdrs, oa->oa_base,
|
||||||
oa->oa_length) == FALSE)
|
oa->oa_length) == FALSE)
|
||||||
{
|
return FALSE;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -70,8 +70,8 @@ do_close (int s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rtime (struct sockaddr_in *addrp, struct timeval *timep,
|
rtime (struct sockaddr_in *addrp, struct rpc_timeval *timep,
|
||||||
struct timeval *timeout)
|
struct rpc_timeval *timeout)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
struct pollfd fd;
|
struct pollfd fd;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)svc_auth_unix.c 2.3 88/08/01 4.0 RPCSRC; from 1.28 88/02/08 SMI */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,9 +26,6 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
|
||||||
static char sccsid[] = "@(#)svc_auth_unix.c 1.28 88/02/08 Copyr 1984 Sun Micro";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* svc_auth_unix.c
|
* svc_auth_unix.c
|
||||||
@ -56,7 +52,7 @@ _svcauth_unix (struct svc_req *rqst, struct rpc_msg *msg)
|
|||||||
enum auth_stat stat;
|
enum auth_stat stat;
|
||||||
XDR xdrs;
|
XDR xdrs;
|
||||||
struct authunix_parms *aup;
|
struct authunix_parms *aup;
|
||||||
long *buf;
|
int32_t *buf;
|
||||||
struct area
|
struct area
|
||||||
{
|
{
|
||||||
struct authunix_parms area_aup;
|
struct authunix_parms area_aup;
|
||||||
@ -78,7 +74,7 @@ _svcauth_unix (struct svc_req *rqst, struct rpc_msg *msg)
|
|||||||
if (buf != NULL)
|
if (buf != NULL)
|
||||||
{
|
{
|
||||||
aup->aup_time = IXDR_GET_LONG (buf);
|
aup->aup_time = IXDR_GET_LONG (buf);
|
||||||
str_len = IXDR_GET_U_LONG (buf);
|
str_len = IXDR_GET_U_INT32 (buf);
|
||||||
if (str_len > MAX_MACHINE_NAME)
|
if (str_len > MAX_MACHINE_NAME)
|
||||||
{
|
{
|
||||||
stat = AUTH_BADCRED;
|
stat = AUTH_BADCRED;
|
||||||
@ -87,10 +83,10 @@ _svcauth_unix (struct svc_req *rqst, struct rpc_msg *msg)
|
|||||||
bcopy ((caddr_t) buf, aup->aup_machname, (u_int) str_len);
|
bcopy ((caddr_t) buf, aup->aup_machname, (u_int) str_len);
|
||||||
aup->aup_machname[str_len] = 0;
|
aup->aup_machname[str_len] = 0;
|
||||||
str_len = RNDUP (str_len);
|
str_len = RNDUP (str_len);
|
||||||
buf = (u_long *) ((char *) buf + str_len);
|
buf = (int32_t *) ((char *) buf + str_len);
|
||||||
aup->aup_uid = IXDR_GET_LONG (buf);
|
aup->aup_uid = IXDR_GET_LONG (buf);
|
||||||
aup->aup_gid = IXDR_GET_LONG (buf);
|
aup->aup_gid = IXDR_GET_LONG (buf);
|
||||||
gid_len = IXDR_GET_U_LONG (buf);
|
gid_len = IXDR_GET_U_INT32 (buf);
|
||||||
if (gid_len > NGRPS)
|
if (gid_len > NGRPS)
|
||||||
{
|
{
|
||||||
stat = AUTH_BADCRED;
|
stat = AUTH_BADCRED;
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
#if defined(LIBC_SCCS) && !defined(lint)
|
|
||||||
static char sccsid[] = "@(#)svcauth_des.c 2.3 89/07/11 4.0 RPCSRC; from 1.15 88/02/08 SMI";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988 by Sun Microsystems, Inc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -34,7 +26,9 @@ static char sccsid[] = "@(#)svcauth_des.c 2.3 89/07/11 4.0 RPCSRC; from 1.15 88/
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1988 by Sun Microsystems, Inc.
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* svcauth_des.c, server-side des authentication
|
* svcauth_des.c, server-side des authentication
|
||||||
*
|
*
|
||||||
@ -62,7 +56,7 @@ static char sccsid[] = "@(#)svcauth_des.c 2.3 89/07/11 4.0 RPCSRC; from 1.15 88/
|
|||||||
|
|
||||||
#define debug(msg) /*printf("svcauth_des: %s\n", msg) */
|
#define debug(msg) /*printf("svcauth_des: %s\n", msg) */
|
||||||
|
|
||||||
#define USEC_PER_SEC ((u_long) 1000000L)
|
#define USEC_PER_SEC ((uint32_t) 1000000L)
|
||||||
#define BEFORE(t1, t2) timercmp(t1, t2, <)
|
#define BEFORE(t1, t2) timercmp(t1, t2, <)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -74,16 +68,16 @@ struct cache_entry
|
|||||||
des_block key; /* conversation key */
|
des_block key; /* conversation key */
|
||||||
char *rname; /* client's name */
|
char *rname; /* client's name */
|
||||||
u_int window; /* credential lifetime window */
|
u_int window; /* credential lifetime window */
|
||||||
struct timeval laststamp; /* detect replays of creds */
|
struct rpc_timeval laststamp; /* detect replays of creds */
|
||||||
char *localcred; /* generic local credential */
|
char *localcred; /* generic local credential */
|
||||||
};
|
};
|
||||||
static struct cache_entry *authdes_cache /* [AUTHDES_CACHESZ] */ ;
|
static struct cache_entry *authdes_cache /* [AUTHDES_CACHESZ] */ ;
|
||||||
static short *authdes_lru /* [AUTHDES_CACHESZ] */ ;
|
static int *authdes_lru /* [AUTHDES_CACHESZ] */ ;
|
||||||
|
|
||||||
static void cache_init (void) internal_function; /* initialize the cache */
|
static void cache_init (void) internal_function; /* initialize the cache */
|
||||||
static short cache_spot (des_block *, char *, struct timeval *)
|
static short cache_spot (des_block *, char *, struct rpc_timeval *)
|
||||||
internal_function; /* find an entry in the cache */
|
internal_function; /* find an entry in the cache */
|
||||||
static void cache_ref (short sid) internal_function;
|
static void cache_ref (uint32_t sid) internal_function;
|
||||||
/* note that sid was ref'd */
|
/* note that sid was ref'd */
|
||||||
|
|
||||||
static void invalidate (char *cred) internal_function;
|
static void invalidate (char *cred) internal_function;
|
||||||
@ -106,18 +100,18 @@ svcauthdes_stats;
|
|||||||
enum auth_stat
|
enum auth_stat
|
||||||
_svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
_svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
||||||
{
|
{
|
||||||
register long *ixdr;
|
register uint32_t *ixdr;
|
||||||
des_block cryptbuf[2];
|
des_block cryptbuf[2];
|
||||||
register struct authdes_cred *cred;
|
register struct authdes_cred *cred;
|
||||||
struct authdes_verf verf;
|
struct authdes_verf verf;
|
||||||
int status;
|
int status;
|
||||||
register struct cache_entry *entry;
|
register struct cache_entry *entry;
|
||||||
short sid = 0;
|
uint32_t sid = 0;
|
||||||
des_block *sessionkey;
|
des_block *sessionkey;
|
||||||
des_block ivec;
|
des_block ivec;
|
||||||
u_int window;
|
u_int window;
|
||||||
struct timeval timestamp;
|
struct rpc_timeval timestamp;
|
||||||
u_long namelen;
|
uint32_t namelen;
|
||||||
struct area
|
struct area
|
||||||
{
|
{
|
||||||
struct authdes_cred area_cred;
|
struct authdes_cred area_cred;
|
||||||
@ -127,6 +121,8 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
|
|
||||||
if (authdes_cache == NULL)
|
if (authdes_cache == NULL)
|
||||||
cache_init ();
|
cache_init ();
|
||||||
|
if (authdes_cache == NULL) /* No free memory */
|
||||||
|
return AUTH_FAILED;
|
||||||
|
|
||||||
area = (struct area *) rqst->rq_clntcred;
|
area = (struct area *) rqst->rq_clntcred;
|
||||||
cred = (struct authdes_cred *) &area->area_cred;
|
cred = (struct authdes_cred *) &area->area_cred;
|
||||||
@ -134,27 +130,30 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
/*
|
/*
|
||||||
* Get the credential
|
* Get the credential
|
||||||
*/
|
*/
|
||||||
ixdr = (long *) msg->rm_call.cb_cred.oa_base;
|
if (msg->rm_call.cb_cred.oa_length <= 0 ||
|
||||||
|
msg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES)
|
||||||
|
return AUTH_BADCRED;
|
||||||
|
|
||||||
|
ixdr = (uint32_t *) msg->rm_call.cb_cred.oa_base;
|
||||||
cred->adc_namekind = IXDR_GET_ENUM (ixdr, enum authdes_namekind);
|
cred->adc_namekind = IXDR_GET_ENUM (ixdr, enum authdes_namekind);
|
||||||
switch (cred->adc_namekind)
|
switch (cred->adc_namekind)
|
||||||
{
|
{
|
||||||
case ADN_FULLNAME:
|
case ADN_FULLNAME:
|
||||||
namelen = IXDR_GET_U_LONG (ixdr);
|
namelen = IXDR_GET_U_INT32 (ixdr);
|
||||||
if (namelen > MAXNETNAMELEN)
|
if (namelen > MAXNETNAMELEN)
|
||||||
{
|
{
|
||||||
return AUTH_BADCRED;
|
return AUTH_BADCRED;
|
||||||
}
|
}
|
||||||
cred->adc_fullname.name = area->area_netname;
|
cred->adc_fullname.name = area->area_netname;
|
||||||
bcopy ((char *) ixdr, cred->adc_fullname.name,
|
bcopy ((char *) ixdr, cred->adc_fullname.name, namelen);
|
||||||
(u_int) namelen);
|
|
||||||
cred->adc_fullname.name[namelen] = 0;
|
cred->adc_fullname.name[namelen] = 0;
|
||||||
ixdr += (RNDUP (namelen) / BYTES_PER_XDR_UNIT);
|
ixdr += (RNDUP (namelen) / BYTES_PER_XDR_UNIT);
|
||||||
cred->adc_fullname.key.key.high = (u_long) * ixdr++;
|
cred->adc_fullname.key.key.high = *ixdr++;
|
||||||
cred->adc_fullname.key.key.low = (u_long) * ixdr++;
|
cred->adc_fullname.key.key.low = *ixdr++;
|
||||||
cred->adc_fullname.window = (u_long) * ixdr++;
|
cred->adc_fullname.window = *ixdr++;
|
||||||
break;
|
break;
|
||||||
case ADN_NICKNAME:
|
case ADN_NICKNAME:
|
||||||
cred->adc_nickname = (u_long) * ixdr++;
|
cred->adc_nickname = *ixdr++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return AUTH_BADCRED;
|
return AUTH_BADCRED;
|
||||||
@ -163,11 +162,14 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
/*
|
/*
|
||||||
* Get the verifier
|
* Get the verifier
|
||||||
*/
|
*/
|
||||||
ixdr = (long *) msg->rm_call.cb_verf.oa_base;
|
if (msg->rm_call.cb_verf.oa_length <= 0 ||
|
||||||
verf.adv_xtimestamp.key.high = (u_long) * ixdr++;
|
msg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES)
|
||||||
verf.adv_xtimestamp.key.low = (u_long) * ixdr++;
|
return AUTH_BADCRED;
|
||||||
verf.adv_int_u = (u_long) * ixdr++;
|
|
||||||
|
|
||||||
|
ixdr = (uint32_t *) msg->rm_call.cb_verf.oa_base;
|
||||||
|
verf.adv_xtimestamp.key.high = *ixdr++;
|
||||||
|
verf.adv_xtimestamp.key.low = *ixdr++;
|
||||||
|
verf.adv_int_u = *ixdr++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the conversation key
|
* Get the conversation key
|
||||||
@ -194,12 +196,18 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* ADN_NICKNAME */
|
{ /* ADN_NICKNAME */
|
||||||
sid = (short) cred->adc_nickname;
|
if (cred->adc_nickname >= AUTHDES_CACHESZ)
|
||||||
if (sid >= AUTHDES_CACHESZ)
|
|
||||||
{
|
{
|
||||||
debug ("bad nickname");
|
debug ("bad nickname");
|
||||||
return AUTH_BADCRED; /* garbled credential */
|
return AUTH_BADCRED; /* garbled credential */
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
sid = cred->adc_nickname;
|
||||||
|
|
||||||
|
/* XXX This could be wrong, but else we have a
|
||||||
|
security problem */
|
||||||
|
if (authdes_cache[sid].rname == NULL)
|
||||||
|
return AUTH_BADCRED;
|
||||||
sessionkey = &authdes_cache[sid].key;
|
sessionkey = &authdes_cache[sid].key;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,10 +226,9 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
(char *) &ivec);
|
(char *) &ivec);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
status = ecb_crypt ((char *) sessionkey, (char *) cryptbuf,
|
||||||
status = ecb_crypt ((char *) sessionkey, (char *) cryptbuf,
|
sizeof (des_block), DES_DECRYPT | DES_HW);
|
||||||
sizeof (des_block), DES_DECRYPT | DES_HW);
|
|
||||||
}
|
|
||||||
if (DES_FAILED (status))
|
if (DES_FAILED (status))
|
||||||
{
|
{
|
||||||
debug ("decryption failure");
|
debug ("decryption failure");
|
||||||
@ -231,9 +238,9 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
/*
|
/*
|
||||||
* XDR the decrypted timestamp
|
* XDR the decrypted timestamp
|
||||||
*/
|
*/
|
||||||
ixdr = (long *) cryptbuf;
|
ixdr = (uint32_t *) cryptbuf;
|
||||||
timestamp.tv_sec = IXDR_GET_LONG (ixdr);
|
timestamp.tv_sec = IXDR_GET_INT32 (ixdr);
|
||||||
timestamp.tv_usec = IXDR_GET_LONG (ixdr);
|
timestamp.tv_usec = IXDR_GET_INT32 (ixdr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for valid credentials and verifiers.
|
* Check for valid credentials and verifiers.
|
||||||
@ -248,20 +255,23 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
|
|
||||||
if (cred->adc_namekind == ADN_FULLNAME)
|
if (cred->adc_namekind == ADN_FULLNAME)
|
||||||
{
|
{
|
||||||
window = IXDR_GET_U_LONG (ixdr);
|
short tmp_spot;
|
||||||
winverf = IXDR_GET_U_LONG (ixdr);
|
|
||||||
|
window = IXDR_GET_U_INT32 (ixdr);
|
||||||
|
winverf = IXDR_GET_U_INT32 (ixdr);
|
||||||
if (winverf != window - 1)
|
if (winverf != window - 1)
|
||||||
{
|
{
|
||||||
debug ("window verifier mismatch");
|
debug ("window verifier mismatch");
|
||||||
return AUTH_BADCRED; /* garbled credential */
|
return AUTH_BADCRED; /* garbled credential */
|
||||||
}
|
}
|
||||||
sid = cache_spot (sessionkey, cred->adc_fullname.name,
|
tmp_spot = cache_spot (sessionkey, cred->adc_fullname.name,
|
||||||
×tamp);
|
×tamp);
|
||||||
if (sid < 0)
|
if (tmp_spot < 0 || tmp_spot > AUTHDES_CACHESZ)
|
||||||
{
|
{
|
||||||
debug ("replayed credential");
|
debug ("replayed credential");
|
||||||
return AUTH_REJECTEDCRED; /* replay */
|
return AUTH_REJECTEDCRED; /* replay */
|
||||||
}
|
}
|
||||||
|
sid = tmp_spot;
|
||||||
nick = 0;
|
nick = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -270,17 +280,16 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
nick = 1;
|
nick = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((u_long) timestamp.tv_usec >= USEC_PER_SEC)
|
if (timestamp.tv_usec >= USEC_PER_SEC)
|
||||||
{
|
{
|
||||||
debug ("invalid usecs");
|
debug ("invalid usecs");
|
||||||
/* cached out (bad key), or garbled verifier */
|
/* cached out (bad key), or garbled verifier */
|
||||||
return nick ? AUTH_REJECTEDVERF : AUTH_BADVERF;
|
return nick ? AUTH_REJECTEDVERF : AUTH_BADVERF;
|
||||||
}
|
}
|
||||||
if (nick && BEFORE (×tamp,
|
if (nick && BEFORE (×tamp, &authdes_cache[sid].laststamp))
|
||||||
&authdes_cache[sid].laststamp))
|
|
||||||
{
|
{
|
||||||
debug ("timestamp before last seen");
|
debug ("timestamp before last seen");
|
||||||
return (AUTH_REJECTEDVERF); /* replay */
|
return AUTH_REJECTEDVERF; /* replay */
|
||||||
}
|
}
|
||||||
__gettimeofday (¤t, (struct timezone *) NULL);
|
__gettimeofday (¤t, (struct timezone *) NULL);
|
||||||
current.tv_sec -= window; /* allow for expiration */
|
current.tv_sec -= window; /* allow for expiration */
|
||||||
@ -295,14 +304,14 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
/*
|
/*
|
||||||
* Set up the reply verifier
|
* Set up the reply verifier
|
||||||
*/
|
*/
|
||||||
verf.adv_nickname = (u_long) sid;
|
verf.adv_nickname = sid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xdr the timestamp before encrypting
|
* xdr the timestamp before encrypting
|
||||||
*/
|
*/
|
||||||
ixdr = (long *) cryptbuf;
|
ixdr = (int32_t *) cryptbuf;
|
||||||
IXDR_PUT_LONG (ixdr, timestamp.tv_sec - 1);
|
IXDR_PUT_INT32 (ixdr, timestamp.tv_sec - 1);
|
||||||
IXDR_PUT_LONG (ixdr, timestamp.tv_usec);
|
IXDR_PUT_INT32 (ixdr, timestamp.tv_usec);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* encrypt the timestamp
|
* encrypt the timestamp
|
||||||
@ -319,10 +328,10 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
/*
|
/*
|
||||||
* Serialize the reply verifier, and update rqst
|
* Serialize the reply verifier, and update rqst
|
||||||
*/
|
*/
|
||||||
ixdr = (long *) msg->rm_call.cb_verf.oa_base;
|
ixdr = (uint32_t *) msg->rm_call.cb_verf.oa_base;
|
||||||
*ixdr++ = (long) verf.adv_xtimestamp.key.high;
|
*ixdr++ = verf.adv_xtimestamp.key.high;
|
||||||
*ixdr++ = (long) verf.adv_xtimestamp.key.low;
|
*ixdr++ = verf.adv_xtimestamp.key.low;
|
||||||
*ixdr++ = (long) verf.adv_int_u;
|
*ixdr++ = verf.adv_int_u;
|
||||||
|
|
||||||
rqst->rq_xprt->xp_verf.oa_flavor = AUTH_DES;
|
rqst->rq_xprt->xp_verf.oa_flavor = AUTH_DES;
|
||||||
rqst->rq_xprt->xp_verf.oa_base = msg->rm_call.cb_verf.oa_base;
|
rqst->rq_xprt->xp_verf.oa_base = msg->rm_call.cb_verf.oa_base;
|
||||||
@ -341,20 +350,17 @@ _svcauth_des (register struct svc_req *rqst, register struct rpc_msg *msg)
|
|||||||
size_t full_len;
|
size_t full_len;
|
||||||
|
|
||||||
cred->adc_fullname.window = window;
|
cred->adc_fullname.window = window;
|
||||||
cred->adc_nickname = (u_long) sid; /* save nickname */
|
cred->adc_nickname = sid; /* save nickname */
|
||||||
if (entry->rname != NULL)
|
if (entry->rname != NULL)
|
||||||
{
|
mem_free (entry->rname, strlen (entry->rname) + 1);
|
||||||
mem_free (entry->rname, strlen (entry->rname) + 1);
|
|
||||||
}
|
|
||||||
full_len = strlen (cred->adc_fullname.name) + 1;
|
full_len = strlen (cred->adc_fullname.name) + 1;
|
||||||
entry->rname = mem_alloc ((u_int) full_len);
|
entry->rname = mem_alloc ((u_int) full_len);
|
||||||
if (entry->rname != NULL)
|
if (entry->rname != NULL)
|
||||||
{
|
memcpy (entry->rname, cred->adc_fullname.name, full_len);
|
||||||
memcpy (entry->rname, cred->adc_fullname.name, full_len);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
debug ("out of memory");
|
debug ("out of memory");
|
||||||
|
return AUTH_FAILED; /* out of memory is bad */
|
||||||
}
|
}
|
||||||
entry->key = *sessionkey;
|
entry->key = *sessionkey;
|
||||||
entry->window = window;
|
entry->window = window;
|
||||||
@ -385,17 +391,17 @@ cache_init (void)
|
|||||||
|
|
||||||
authdes_cache = (struct cache_entry *)
|
authdes_cache = (struct cache_entry *)
|
||||||
mem_alloc (sizeof (struct cache_entry) * AUTHDES_CACHESZ);
|
mem_alloc (sizeof (struct cache_entry) * AUTHDES_CACHESZ);
|
||||||
|
if (authdes_cache == NULL)
|
||||||
|
return;
|
||||||
__bzero ((char *) authdes_cache,
|
__bzero ((char *) authdes_cache,
|
||||||
sizeof (struct cache_entry) * AUTHDES_CACHESZ);
|
sizeof (struct cache_entry) * AUTHDES_CACHESZ);
|
||||||
|
|
||||||
authdes_lru = (short *) mem_alloc (sizeof (short) * AUTHDES_CACHESZ);
|
authdes_lru = (int *) mem_alloc (sizeof (int) * AUTHDES_CACHESZ);
|
||||||
/*
|
/*
|
||||||
* Initialize the lru list
|
* Initialize the lru list
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < AUTHDES_CACHESZ; i++)
|
for (i = 0; i < AUTHDES_CACHESZ; ++i)
|
||||||
{
|
authdes_lru[i] = i;
|
||||||
authdes_lru[i] = i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -405,7 +411,7 @@ cache_init (void)
|
|||||||
static short
|
static short
|
||||||
cache_victim (void)
|
cache_victim (void)
|
||||||
{
|
{
|
||||||
return (authdes_lru[AUTHDES_CACHESZ - 1]);
|
return authdes_lru[AUTHDES_CACHESZ - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -413,15 +419,15 @@ cache_victim (void)
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
internal_function
|
internal_function
|
||||||
cache_ref (register short sid)
|
cache_ref (register uint32_t sid)
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
register short curr;
|
register int curr;
|
||||||
register short prev;
|
register int prev;
|
||||||
|
|
||||||
prev = authdes_lru[0];
|
prev = authdes_lru[0];
|
||||||
authdes_lru[0] = sid;
|
authdes_lru[0] = sid;
|
||||||
for (i = 1; prev != sid; i++)
|
for (i = 1; prev != sid; ++i)
|
||||||
{
|
{
|
||||||
curr = authdes_lru[i];
|
curr = authdes_lru[i];
|
||||||
authdes_lru[i] = prev;
|
authdes_lru[i] = prev;
|
||||||
@ -429,7 +435,6 @@ cache_ref (register short sid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find a spot in the cache for a credential containing
|
* Find a spot in the cache for a credential containing
|
||||||
* the items given. Return -1 if a replay is detected, otherwise
|
* the items given. Return -1 if a replay is detected, otherwise
|
||||||
@ -437,14 +442,15 @@ cache_ref (register short sid)
|
|||||||
*/
|
*/
|
||||||
static short
|
static short
|
||||||
internal_function
|
internal_function
|
||||||
cache_spot (register des_block * key, char *name, struct timeval *timestamp)
|
cache_spot (register des_block *key, char *name,
|
||||||
|
struct rpc_timeval *timestamp)
|
||||||
{
|
{
|
||||||
register struct cache_entry *cp;
|
register struct cache_entry *cp;
|
||||||
register int i;
|
register int i;
|
||||||
register u_long hi;
|
register uint32_t hi;
|
||||||
|
|
||||||
hi = key->key.high;
|
hi = key->key.high;
|
||||||
for (cp = authdes_cache, i = 0; i < AUTHDES_CACHESZ; i++, cp++)
|
for (cp = authdes_cache, i = 0; i < AUTHDES_CACHESZ; ++i, ++cp)
|
||||||
{
|
{
|
||||||
if (cp->key.key.high == hi &&
|
if (cp->key.key.high == hi &&
|
||||||
cp->key.key.low == key->key.low &&
|
cp->key.key.low == key->key.low &&
|
||||||
@ -453,18 +459,17 @@ cache_spot (register des_block * key, char *name, struct timeval *timestamp)
|
|||||||
{
|
{
|
||||||
if (BEFORE (timestamp, &cp->laststamp))
|
if (BEFORE (timestamp, &cp->laststamp))
|
||||||
{
|
{
|
||||||
svcauthdes_stats.ncachereplays++;
|
++svcauthdes_stats.ncachereplays;
|
||||||
return -1; /* replay */
|
return -1; /* replay */
|
||||||
}
|
}
|
||||||
svcauthdes_stats.ncachehits++;
|
++svcauthdes_stats.ncachehits;
|
||||||
return i; /* refresh */
|
return i; /* refresh */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
svcauthdes_stats.ncachemisses++;
|
++svcauthdes_stats.ncachemisses;
|
||||||
return cache_victim (); /* new credential */
|
return cache_victim (); /* new credential */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local credential handling stuff.
|
* Local credential handling stuff.
|
||||||
* NOTE: bsd unix dependent.
|
* NOTE: bsd unix dependent.
|
||||||
@ -527,10 +532,8 @@ authdes_getucred (const struct authdes_cred *adc, uid_t * uid, gid_t * gid,
|
|||||||
*uid = cred->uid = i_uid;
|
*uid = cred->uid = i_uid;
|
||||||
*gid = cred->gid = i_gid;
|
*gid = cred->gid = i_gid;
|
||||||
*grouplen = cred->grouplen = i_grouplen;
|
*grouplen = cred->grouplen = i_grouplen;
|
||||||
for (i = i_grouplen - 1; i >= 0; i--)
|
for (i = i_grouplen - 1; i >= 0; --i)
|
||||||
{
|
cred->groups[i] = groups[i]; /* int to short */
|
||||||
cred->groups[i] = groups[i]; /* int to short */
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (cred->grouplen == UNKNOWN)
|
else if (cred->grouplen == UNKNOWN)
|
||||||
@ -547,10 +550,8 @@ authdes_getucred (const struct authdes_cred *adc, uid_t * uid, gid_t * gid,
|
|||||||
*uid = cred->uid;
|
*uid = cred->uid;
|
||||||
*gid = cred->gid;
|
*gid = cred->gid;
|
||||||
*grouplen = cred->grouplen;
|
*grouplen = cred->grouplen;
|
||||||
for (i = cred->grouplen - 1; i >= 0; i--)
|
for (i = cred->grouplen - 1; i >= 0; --i)
|
||||||
{
|
groups[i] = cred->groups[i]; /* short to int */
|
||||||
groups[i] = cred->groups[i]; /* short to int */
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,8 +560,6 @@ internal_function
|
|||||||
invalidate (char *cred)
|
invalidate (char *cred)
|
||||||
{
|
{
|
||||||
if (cred == NULL)
|
if (cred == NULL)
|
||||||
{
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
((struct bsdcred *) cred)->grouplen = INVALID;
|
((struct bsdcred *) cred)->grouplen = INVALID;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,9 +26,6 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
|
||||||
static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xdr_mem.h, XDR implementation using memory buffers.
|
* xdr_mem.h, XDR implementation using memory buffers.
|
||||||
@ -42,7 +38,6 @@ static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro";
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <rpc/rpc.h>
|
#include <rpc/rpc.h>
|
||||||
|
|
||||||
@ -52,7 +47,7 @@ static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int);
|
|||||||
static bool_t xdrmem_putbytes (XDR *, const char *, u_int);
|
static bool_t xdrmem_putbytes (XDR *, const char *, u_int);
|
||||||
static u_int xdrmem_getpos (const XDR *);
|
static u_int xdrmem_getpos (const XDR *);
|
||||||
static bool_t xdrmem_setpos (XDR *, u_int);
|
static bool_t xdrmem_setpos (XDR *, u_int);
|
||||||
static long *xdrmem_inline (XDR *, int);
|
static int32_t *xdrmem_inline (XDR *, int);
|
||||||
static void xdrmem_destroy (XDR *);
|
static void xdrmem_destroy (XDR *);
|
||||||
static bool_t xdrmem_getint32 (XDR *, int32_t *);
|
static bool_t xdrmem_getint32 (XDR *, int32_t *);
|
||||||
static bool_t xdrmem_putint32 (XDR *, const int32_t *);
|
static bool_t xdrmem_putint32 (XDR *, const int32_t *);
|
||||||
@ -76,13 +71,8 @@ static const struct xdr_ops xdrmem_ops =
|
|||||||
* memory buffer.
|
* memory buffer.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xdrmem_create (xdrs, addr, size, op)
|
xdrmem_create (XDR *xdrs, const caddr_t addr, u_int size, enum xdr_op op)
|
||||||
XDR *xdrs;
|
|
||||||
const caddr_t addr;
|
|
||||||
u_int size;
|
|
||||||
enum xdr_op op;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
xdrs->x_op = op;
|
xdrs->x_op = op;
|
||||||
/* We have to add the const since the `struct xdr_ops' in `struct XDR'
|
/* We have to add the const since the `struct xdr_ops' in `struct XDR'
|
||||||
is not `const'. */
|
is not `const'. */
|
||||||
@ -107,11 +97,8 @@ xdrmem_destroy (XDR *xdrs)
|
|||||||
* point at the next element. Neither object pointed to is const
|
* point at the next element. Neither object pointed to is const
|
||||||
*/
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_getlong (xdrs, lp)
|
xdrmem_getlong (XDR *xdrs, long *lp)
|
||||||
XDR *xdrs;
|
|
||||||
long *lp;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= 4) < 0)
|
if ((xdrs->x_handy -= 4) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*lp = (int32_t) ntohl ((*((int32_t *) (xdrs->x_private))));
|
*lp = (int32_t) ntohl ((*((int32_t *) (xdrs->x_private))));
|
||||||
@ -125,11 +112,8 @@ xdrmem_getlong (xdrs, lp)
|
|||||||
* long pointed at is const
|
* long pointed at is const
|
||||||
*/
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_putlong (xdrs, lp)
|
xdrmem_putlong (XDR *xdrs, const long *lp)
|
||||||
XDR *xdrs;
|
|
||||||
const long *lp;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= 4) < 0)
|
if ((xdrs->x_handy -= 4) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*(int32_t *) xdrs->x_private = htonl (*lp);
|
*(int32_t *) xdrs->x_private = htonl (*lp);
|
||||||
@ -144,12 +128,8 @@ xdrmem_putlong (xdrs, lp)
|
|||||||
* a good idea. None of the things pointed to are const.
|
* a good idea. None of the things pointed to are const.
|
||||||
*/
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_getbytes (xdrs, addr, len)
|
xdrmem_getbytes (XDR *xdrs, caddr_t addr, u_int len)
|
||||||
XDR *xdrs;
|
|
||||||
caddr_t addr;
|
|
||||||
u_int len;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= len) < 0)
|
if ((xdrs->x_handy -= len) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
bcopy (xdrs->x_private, addr, len);
|
bcopy (xdrs->x_private, addr, len);
|
||||||
@ -162,12 +142,8 @@ xdrmem_getbytes (xdrs, addr, len)
|
|||||||
* unaligned data. The source address is const.
|
* unaligned data. The source address is const.
|
||||||
*/
|
*/
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_putbytes (xdrs, addr, len)
|
xdrmem_putbytes (XDR *xdrs, const char *addr, u_int len)
|
||||||
XDR *xdrs;
|
|
||||||
const char *addr;
|
|
||||||
u_int len;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= len) < 0)
|
if ((xdrs->x_handy -= len) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
bcopy (addr, xdrs->x_private, len);
|
bcopy (addr, xdrs->x_private, len);
|
||||||
@ -180,10 +156,8 @@ xdrmem_putbytes (xdrs, addr, len)
|
|||||||
* of xdrs. **FIXME** does this not assume u_int == u_long?
|
* of xdrs. **FIXME** does this not assume u_int == u_long?
|
||||||
*/
|
*/
|
||||||
static u_int
|
static u_int
|
||||||
xdrmem_getpos (xdrs)
|
xdrmem_getpos (const XDR *xdrs)
|
||||||
const XDR *xdrs;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
|
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,17 +182,15 @@ xdrmem_setpos (xdrs, pos)
|
|||||||
/*
|
/*
|
||||||
* xdrs modified
|
* xdrs modified
|
||||||
*/
|
*/
|
||||||
static long *
|
static int32_t *
|
||||||
xdrmem_inline (xdrs, len)
|
xdrmem_inline (XDR *xdrs, int len)
|
||||||
XDR *xdrs;
|
|
||||||
int len;
|
|
||||||
{
|
{
|
||||||
long *buf = 0;
|
int32_t *buf = 0;
|
||||||
|
|
||||||
if (xdrs->x_handy >= len)
|
if (xdrs->x_handy >= len)
|
||||||
{
|
{
|
||||||
xdrs->x_handy -= len;
|
xdrs->x_handy -= len;
|
||||||
buf = (long *) xdrs->x_private;
|
buf = (int32_t *) xdrs->x_private;
|
||||||
xdrs->x_private += len;
|
xdrs->x_private += len;
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
@ -232,7 +204,6 @@ xdrmem_inline (xdrs, len)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_getint32 (XDR *xdrs, int32_t *ip)
|
xdrmem_getint32 (XDR *xdrs, int32_t *ip)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= 4) < 0)
|
if ((xdrs->x_handy -= 4) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*ip = ntohl ((*((int32_t *) (xdrs->x_private))));
|
*ip = ntohl ((*((int32_t *) (xdrs->x_private))));
|
||||||
@ -248,7 +219,6 @@ xdrmem_getint32 (XDR *xdrs, int32_t *ip)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrmem_putint32 (XDR *xdrs, const int32_t *ip)
|
xdrmem_putint32 (XDR *xdrs, const int32_t *ip)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ((xdrs->x_handy -= 4) < 0)
|
if ((xdrs->x_handy -= 4) < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*(int32_t *) xdrs->x_private = htonl (*ip);
|
*(int32_t *) xdrs->x_private = htonl (*ip);
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)xdr_rec.c 2.2 88/08/01 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,9 +26,6 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
|
||||||
static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xdr_rec.c, Implements TCP/IP based XDR streams with a "record marking"
|
* xdr_rec.c, Implements TCP/IP based XDR streams with a "record marking"
|
||||||
@ -64,7 +60,7 @@ static bool_t xdrrec_getbytes (XDR *, caddr_t, u_int);
|
|||||||
static bool_t xdrrec_putbytes (XDR *, const char *, u_int);
|
static bool_t xdrrec_putbytes (XDR *, const char *, u_int);
|
||||||
static u_int xdrrec_getpos (const XDR *);
|
static u_int xdrrec_getpos (const XDR *);
|
||||||
static bool_t xdrrec_setpos (XDR *, u_int);
|
static bool_t xdrrec_setpos (XDR *, u_int);
|
||||||
static long *xdrrec_inline (XDR *, int);
|
static int32_t *xdrrec_inline (XDR *, int);
|
||||||
static void xdrrec_destroy (XDR *);
|
static void xdrrec_destroy (XDR *);
|
||||||
static bool_t xdrrec_getint32 (XDR *, int32_t *);
|
static bool_t xdrrec_getint32 (XDR *, int32_t *);
|
||||||
static bool_t xdrrec_putint32 (XDR *, const int32_t *);
|
static bool_t xdrrec_putint32 (XDR *, const int32_t *);
|
||||||
@ -204,9 +200,7 @@ xdrrec_create (XDR *xdrs, u_int sendsize,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrrec_getlong (xdrs, lp)
|
xdrrec_getlong (XDR *xdrs, long *lp)
|
||||||
XDR *xdrs;
|
|
||||||
long *lp;
|
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
int32_t *buflp = (int32_t *) rstrm->in_finger;
|
int32_t *buflp = (int32_t *) rstrm->in_finger;
|
||||||
@ -231,9 +225,7 @@ xdrrec_getlong (xdrs, lp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrrec_putlong (xdrs, lp)
|
xdrrec_putlong (XDR *xdrs, const long *lp)
|
||||||
XDR *xdrs;
|
|
||||||
const long *lp;
|
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
|
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
|
||||||
@ -283,10 +275,7 @@ xdrrec_getbytes (XDR *xdrs, caddr_t addr, u_int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrrec_putbytes (xdrs, addr, len)
|
xdrrec_putbytes (XDR *xdrs, const char *addr, u_int len)
|
||||||
XDR *xdrs;
|
|
||||||
const char *addr;
|
|
||||||
u_int len;
|
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
u_int current;
|
u_int current;
|
||||||
@ -336,9 +325,7 @@ xdrrec_getpos (const XDR *xdrs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrrec_setpos (xdrs, pos)
|
xdrrec_setpos (XDR *xdrs, u_int pos)
|
||||||
XDR *xdrs;
|
|
||||||
u_int pos;
|
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
u_int currpos = xdrrec_getpos (xdrs);
|
u_int currpos = xdrrec_getpos (xdrs);
|
||||||
@ -377,11 +364,11 @@ xdrrec_setpos (xdrs, pos)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long *
|
static int32_t *
|
||||||
xdrrec_inline (XDR *xdrs, int len)
|
xdrrec_inline (XDR *xdrs, int len)
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
long *buf = NULL;
|
int32_t *buf = NULL;
|
||||||
|
|
||||||
switch (xdrs->x_op)
|
switch (xdrs->x_op)
|
||||||
{
|
{
|
||||||
@ -389,7 +376,7 @@ xdrrec_inline (XDR *xdrs, int len)
|
|||||||
case XDR_ENCODE:
|
case XDR_ENCODE:
|
||||||
if ((rstrm->out_finger + len) <= rstrm->out_boundry)
|
if ((rstrm->out_finger + len) <= rstrm->out_boundry)
|
||||||
{
|
{
|
||||||
buf = (long *) rstrm->out_finger;
|
buf = (int32_t *) rstrm->out_finger;
|
||||||
rstrm->out_finger += len;
|
rstrm->out_finger += len;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -398,7 +385,7 @@ xdrrec_inline (XDR *xdrs, int len)
|
|||||||
if ((len <= rstrm->fbtbc) &&
|
if ((len <= rstrm->fbtbc) &&
|
||||||
((rstrm->in_finger + len) <= rstrm->in_boundry))
|
((rstrm->in_finger + len) <= rstrm->in_boundry))
|
||||||
{
|
{
|
||||||
buf = (long *) rstrm->in_finger;
|
buf = (int32_t *) rstrm->in_finger;
|
||||||
rstrm->fbtbc -= len;
|
rstrm->fbtbc -= len;
|
||||||
rstrm->in_finger += len;
|
rstrm->in_finger += len;
|
||||||
}
|
}
|
||||||
@ -411,8 +398,7 @@ xdrrec_inline (XDR *xdrs, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdrrec_destroy (xdrs)
|
xdrrec_destroy (XDR *xdrs)
|
||||||
XDR *xdrs;
|
|
||||||
{
|
{
|
||||||
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
|
||||||
|
|
||||||
|
@ -70,22 +70,18 @@ x_setpostn (XDR *xdrs, u_int len)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long *
|
static int32_t *
|
||||||
x_inline (XDR *xdrs, int len)
|
x_inline (XDR *xdrs, int len)
|
||||||
{
|
{
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
{
|
return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (xdrs->x_op != XDR_ENCODE)
|
if (xdrs->x_op != XDR_ENCODE)
|
||||||
{
|
return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (len < (int) xdrs->x_base)
|
if (len < (int) xdrs->x_base)
|
||||||
{
|
{
|
||||||
/* x_private was already allocated */
|
/* x_private was already allocated */
|
||||||
xdrs->x_handy += len;
|
xdrs->x_handy += len;
|
||||||
return (long *) xdrs->x_private;
|
return (int32_t *) xdrs->x_private;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -99,7 +95,7 @@ x_inline (XDR *xdrs, int len)
|
|||||||
}
|
}
|
||||||
xdrs->x_base = (caddr_t) len;
|
xdrs->x_base = (caddr_t) len;
|
||||||
xdrs->x_handy += len;
|
xdrs->x_handy += len;
|
||||||
return (long *) xdrs->x_private;
|
return (int32_t *) xdrs->x_private;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/* @(#)xdr_stdio.c 2.1 88/07/29 4.0 RPCSRC */
|
|
||||||
/*
|
/*
|
||||||
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
|
||||||
* unrestricted use provided that this legend is included on all tape
|
* unrestricted use provided that this legend is included on all tape
|
||||||
@ -27,9 +26,6 @@
|
|||||||
* 2550 Garcia Avenue
|
* 2550 Garcia Avenue
|
||||||
* Mountain View, California 94043
|
* Mountain View, California 94043
|
||||||
*/
|
*/
|
||||||
#if !defined(lint) && defined(SCCSIDS)
|
|
||||||
static char sccsid[] = "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xdr_stdio.c, XDR implementation on standard i/o file.
|
* xdr_stdio.c, XDR implementation on standard i/o file.
|
||||||
@ -59,7 +55,7 @@ static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
|
|||||||
static bool_t xdrstdio_putbytes (XDR *, const char *, u_int);
|
static bool_t xdrstdio_putbytes (XDR *, const char *, u_int);
|
||||||
static u_int xdrstdio_getpos (const XDR *);
|
static u_int xdrstdio_getpos (const XDR *);
|
||||||
static bool_t xdrstdio_setpos (XDR *, u_int);
|
static bool_t xdrstdio_setpos (XDR *, u_int);
|
||||||
static long *xdrstdio_inline (XDR *, int);
|
static int32_t *xdrstdio_inline (XDR *, int);
|
||||||
static void xdrstdio_destroy (XDR *);
|
static void xdrstdio_destroy (XDR *);
|
||||||
static bool_t xdrstdio_getint32 (XDR *, int32_t *);
|
static bool_t xdrstdio_getint32 (XDR *, int32_t *);
|
||||||
static bool_t xdrstdio_putint32 (XDR *, const int32_t *);
|
static bool_t xdrstdio_putint32 (XDR *, const int32_t *);
|
||||||
@ -87,12 +83,8 @@ static const struct xdr_ops xdrstdio_ops =
|
|||||||
* Operation flag is set to op.
|
* Operation flag is set to op.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xdrstdio_create (xdrs, file, op)
|
xdrstdio_create (XDR *xdrs, FILE *file, enum xdr_op op)
|
||||||
XDR *xdrs;
|
|
||||||
FILE *file;
|
|
||||||
enum xdr_op op;
|
|
||||||
{
|
{
|
||||||
|
|
||||||
xdrs->x_op = op;
|
xdrs->x_op = op;
|
||||||
/* We have to add the const since the `struct xdr_ops' in `struct XDR'
|
/* We have to add the const since the `struct xdr_ops' in `struct XDR'
|
||||||
is not `const'. */
|
is not `const'. */
|
||||||
@ -107,17 +99,14 @@ xdrstdio_create (xdrs, file, op)
|
|||||||
* Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
|
* Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
xdrstdio_destroy (xdrs)
|
xdrstdio_destroy (XDR *xdrs)
|
||||||
XDR *xdrs;
|
|
||||||
{
|
{
|
||||||
(void) fflush ((FILE *) xdrs->x_private);
|
(void) fflush ((FILE *) xdrs->x_private);
|
||||||
/* xx should we close the file ?? */
|
/* xx should we close the file ?? */
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_getlong (xdrs, lp)
|
xdrstdio_getlong (XDR *xdrs, long *lp)
|
||||||
XDR *xdrs;
|
|
||||||
long *lp;
|
|
||||||
{
|
{
|
||||||
int32_t mycopy;
|
int32_t mycopy;
|
||||||
|
|
||||||
@ -130,7 +119,6 @@ xdrstdio_getlong (xdrs, lp)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_putlong (XDR *xdrs, const long *lp)
|
xdrstdio_putlong (XDR *xdrs, const long *lp)
|
||||||
{
|
{
|
||||||
|
|
||||||
long mycopy = htonl (*lp);
|
long mycopy = htonl (*lp);
|
||||||
lp = &mycopy;
|
lp = &mycopy;
|
||||||
if (fwrite ((caddr_t) lp, 4, 1, (FILE *) xdrs->x_private) != 1)
|
if (fwrite ((caddr_t) lp, 4, 1, (FILE *) xdrs->x_private) != 1)
|
||||||
@ -139,13 +127,10 @@ xdrstdio_putlong (XDR *xdrs, const long *lp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_getbytes (xdrs, addr, len)
|
xdrstdio_getbytes (XDR *xdrs, const caddr_t addr, u_int len)
|
||||||
XDR *xdrs;
|
|
||||||
const caddr_t addr;
|
|
||||||
u_int len;
|
|
||||||
{
|
{
|
||||||
|
if ((len != 0) && (fread (addr, (int) len, 1,
|
||||||
if ((len != 0) && (fread (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
|
(FILE *) xdrs->x_private) != 1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -153,7 +138,8 @@ xdrstdio_getbytes (xdrs, addr, len)
|
|||||||
static bool_t
|
static bool_t
|
||||||
xdrstdio_putbytes (XDR *xdrs, const char *addr, u_int len)
|
xdrstdio_putbytes (XDR *xdrs, const char *addr, u_int len)
|
||||||
{
|
{
|
||||||
if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
|
if ((len != 0) && (fwrite (addr, (int) len, 1,
|
||||||
|
(FILE *) xdrs->x_private) != 1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -170,10 +156,9 @@ xdrstdio_setpos (XDR *xdrs, u_int pos)
|
|||||||
return fseek ((FILE *) xdrs->x_private, (long) pos, 0) < 0 ? FALSE : TRUE;
|
return fseek ((FILE *) xdrs->x_private, (long) pos, 0) < 0 ? FALSE : TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long *
|
static int32_t *
|
||||||
xdrstdio_inline (XDR *xdrs, int len)
|
xdrstdio_inline (XDR *xdrs, int len)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Must do some work to implement this: must insure
|
* Must do some work to implement this: must insure
|
||||||
* enough data in the underlying stdio buffer,
|
* enough data in the underlying stdio buffer,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user