X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslurpd%2Fst.c;h=d355ce68a554e0f1f8bafd994a29f8b8ed446e40;hb=a070e6c05ff054ea047defc78fe60ec2d67c4565;hp=d18f5381fd2bb9fefeedbbf2d8c7d0a84ba1b810;hpb=2a869f5a99f537b246ba8640502e2a86117cb6e8;p=openldap diff --git a/servers/slurpd/st.c b/servers/slurpd/st.c index d18f5381fd..d355ce68a5 100644 --- a/servers/slurpd/st.c +++ b/servers/slurpd/st.c @@ -1,5 +1,18 @@ -/* - * Copyright (c) 1996 Regents of the University of Michigan. +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1996 Regents of the University of Michigan. * All rights reserved. * * Redistribution and use in source and binary forms are permitted @@ -9,6 +22,10 @@ * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. */ +/* ACKNOWLEDGEMENTS: + * This work was originally developed by the University of Michigan + * (as part of U-MICH LDAP). + */ /* @@ -19,11 +36,14 @@ #include "portable.h" #include + +#include #include #include #include "slurp.h" #include "globals.h" +#include "lutil.h" /* * Add information about replica host specified by Ri to list @@ -42,28 +62,28 @@ St_add( } /* Serialize access to the St struct */ - pthread_mutex_lock( &(st->st_mutex )); + ldap_pvt_thread_mutex_lock( &(st->st_mutex )); st->st_nreplicas++; ind = st->st_nreplicas - 1; st->st_data = ( Stel ** ) ch_realloc( st->st_data, ( st->st_nreplicas * sizeof( Stel * ))); if ( st->st_data == NULL ) { - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return NULL; } st->st_data[ ind ] = ( Stel * ) ch_malloc( sizeof( Stel ) ); if ( st->st_data[ ind ] == NULL ) { - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return NULL; } st->st_data[ ind ]->hostname = strdup( ri->ri_hostname ); st->st_data[ ind ]->port = ri->ri_port; - memset( st->st_data[ ind ]->last, 0, sizeof( st->st_data[ ind ]->last )); + st->st_data[ ind ]->last = 0; st->st_data[ ind ]->seq = 0; - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return st->st_data[ ind ]; } @@ -84,7 +104,7 @@ St_write ( if ( st == NULL ) { return -1; } - pthread_mutex_lock( &(st->st_mutex )); + ldap_pvt_thread_mutex_lock( &(st->st_mutex )); if ( st->st_fp == NULL ) { /* Open file */ if (( rc = acquire_lock( sglob->slurpd_status_file, &(st->st_fp), @@ -94,7 +114,7 @@ St_write ( "Error: cannot open status file \"%s\": %s\n", sglob->slurpd_status_file, sys_errlist[ errno ], 0 ); st->st_err_logged = 1; - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return -1; } } else { @@ -107,12 +127,13 @@ St_write ( fseek( st->st_fp, 0L, 0 ); for ( i = 0; i < st->st_nreplicas; i++ ) { stel = st->st_data[ i ]; - fprintf( st->st_fp, "%s:%d:%s:%d\n", stel->hostname, stel->port, - stel->last, stel->seq ); + fprintf( st->st_fp, "%s:%d:%ld:%d\n", + stel->hostname, stel->port, + (long) stel->last, stel->seq ); } fflush( st->st_fp ); - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return 0; } @@ -134,10 +155,10 @@ St_update( return -1; } - pthread_mutex_lock( &(st->st_mutex )); - strcpy( stel->last, re->re_timestamp ); + ldap_pvt_thread_mutex_lock( &(st->st_mutex )); + stel->last = re->re_timestamp; stel->seq = re->re_seq; - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return 0; } @@ -163,7 +184,7 @@ St_read( if ( st == NULL ) { return -1; } - pthread_mutex_lock( &(st->st_mutex )); + ldap_pvt_thread_mutex_lock( &(st->st_mutex )); if ( access( sglob->slurpd_status_file, F_OK ) < 0 ) { /* * File doesn't exist, so create it and return. @@ -171,16 +192,17 @@ St_read( if (( fp = fopen( sglob->slurpd_status_file, "w" )) == NULL ) { Debug( LDAP_DEBUG_ANY, "Error: cannot create status file \"%s\"\n", sglob->slurpd_status_file, 0, 0 ); - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return -1; } (void) fclose( fp ); - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); Debug( LDAP_DEBUG_ARGS, "No status file found, defaulting values\n", 0, 0, 0 ); return 0; } if (( rc = acquire_lock( sglob->slurpd_status_file, &fp, &lfp)) < 0 ) { + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return 0; } while ( fgets( buf, sizeof( buf ), fp ) != NULL ) { @@ -209,20 +231,25 @@ St_read( found = 0; for ( i = 0; i < sglob->st->st_nreplicas; i++ ) { + int p; if ( !strcmp( hostname, sglob->st->st_data[ i ]->hostname ) && - atoi( port ) == sglob->st->st_data[ i ]->port ) { + lutil_atoi( &p, port ) == 0 && p == sglob->st->st_data[ i ]->port ) + { found = 1; - strcpy( sglob->st->st_data[ i ]->last, timestamp ); - sglob->st->st_data[ i ]->seq = atoi( seq ); + if ( lutil_atol( &sglob->st->st_data[ i ]->last, timestamp ) != 0 + || lutil_atoi( &sglob->st->st_data[ i ]->seq, seq ) != 0 ) + { + found = 0; + } break; } } if ( found ) { char tbuf[ 255 ]; - sprintf( tbuf, "%s:%s (timestamp %s.%s)", hostname, port, - timestamp, seq ); + sprintf( tbuf, "%s.%s", timestamp, seq ); Debug( LDAP_DEBUG_ARGS, - "Retrieved state information for %s\n", tbuf, 0, 0 ); + "Retrieved state information for %s:%s (timestamp %s)\n", + hostname, port, tbuf ); } else { Debug( LDAP_DEBUG_ANY, "Warning: saved state for %s:%s, not a known replica\n", @@ -230,12 +257,12 @@ St_read( } } (void) relinquish_lock( sglob->slurpd_status_file, fp, lfp); - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return 0; bad: (void) relinquish_lock( sglob->slurpd_status_file, fp, lfp); - pthread_mutex_unlock( &(st->st_mutex )); + ldap_pvt_thread_mutex_unlock( &(st->st_mutex )); return -1; } @@ -250,7 +277,7 @@ St_lock( St *st ) { - return( pthread_mutex_lock( &st->st_mutex )); + return( ldap_pvt_thread_mutex_lock( &st->st_mutex )); } @@ -264,7 +291,7 @@ St_unlock( St *st ) { - return( pthread_mutex_unlock( &st->st_mutex )); + return( ldap_pvt_thread_mutex_unlock( &st->st_mutex )); } @@ -287,7 +314,7 @@ St_init( return -1; } - pthread_mutex_init( &((*st)->st_mutex), pthread_mutexattr_default ); + ldap_pvt_thread_mutex_init( &((*st)->st_mutex) ); (*st)->st_data = NULL; (*st)->st_fp = NULL; (*st)->st_lfp = NULL;