/* ====================================================================
 * Copyright (c) 1999 The Apache Group.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the Apache Group
 *    for use in the Apache HTTP server project (http://www.apache.org/)."
 *
 * 4. The names "Apache Server" and "Apache Group" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the Apache Group
 *    for use in the Apache HTTP server project (http://www.apache.org/)."
 *
 * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Group.
 * For more information on the Apache Group and the Apache HTTP server
 * project, please see <http://www.apache.org/>.
 *
 */

#include "fileio.h"
#include "apr_file_io.h"
#include "apr_general.h"
#include "apr_lib.h"
#include <string.h>

/* ***APRDOC********************************************************
 * ap_status_t ap_dupfile(ap_file_t *, ap_file_t **)
 *    duplicate the specified file descriptor.
 * arg 1) The file to duplicate.
 * arg 2) The structure to duplicate into. 
 */         
ap_status_t ap_dupfile(struct file_t *old_file, struct file_t **new_file)
{
    char *buf_oflags;
    (*new_file) = (struct file_t *)ap_palloc(old_file->cntxt,
                               sizeof(struct file_t));
    
    if ((*new_file) == NULL) {
        return APR_ENOMEM;
    }
    (*new_file)->cntxt = old_file->cntxt; 
    if (old_file->buffered) {
        switch (old_file->oflags) {
            case O_RDONLY:
                buf_oflags = "r";
                break;
            case O_WRONLY:
                buf_oflags = "w";
                break;
            case O_RDWR:
                buf_oflags = "r+";
                break;
        }
        (*new_file)->filehand = freopen(old_file->fname, buf_oflags, 
                                        old_file->filehand); 
    }
    else {
    (*new_file)->filedes = dup(old_file->filedes); 
    }
    (*new_file)->fname = ap_pstrdup(old_file->cntxt, old_file->fname);
    (*new_file)->buffered = old_file->buffered;
    (*new_file)->protection = old_file->protection;
    (*new_file)->user = old_file->user;
    (*new_file)->group = old_file->group;
    (*new_file)->size = old_file->size;
    (*new_file)->atime = old_file->atime;    
    (*new_file)->mtime = old_file->mtime;
    (*new_file)->ctime = old_file->ctime;
    ap_register_cleanup((*new_file)->cntxt, (void *)(*new_file), file_cleanup, NULL);
    return APR_SUCCESS;
}

