Universität Ulm, SAI, Übungen zu Systemnahe Software I

Lösungsbeispiel zu Blatt 9 (Aufgabe 13): replace

Dateien ins Archiv kopieren.

replace.h

/*
 *      replace.h       - Headerfile for SAM replace function.
 *
 *      Martin Hasch, University of Ulm, January 1997.
 */

#include        "names.h"

/*
 *      Replace given files in archive, create archive if necessary.
 *      If any files are inaccessible return ECODE_ERROR, on success
 *      return ECODE_SUCCESS, on serious problems abort program.
 */
int replace(char *archive, names_List list);

replace.c

/*
 *      replace.c       - SAM replace function.
 *
 *      Martin Hasch, University of Ulm, January 1997.
 */

#include        <stdio.h>
#include        "sam.h"
#include        "names.h"
#include        "parser.h"
#include        "replace.h"

/*
 *      Replace given files in archive, create archive if necessary.
 *      If any files are inaccessible return ECODE_ERROR, on success
 *      return ECODE_SUCCESS, on serious problems abort program.
 */
int replace(char *archive, names_List list)
{
        parser_Locator oldarch;
        parser_Locator tmparch;
        sam_Header header;
        names_List thisname;
        int badfiles = 0;

        parser_openreadwrite(archive, /*create==*/1, &oldarch, &tmparch);
        while ( parser_getheader(oldarch, &header) ) {
                if ( (thisname = names_get(list, header.sam_name)) != NULL ) {
                        if ( parser_copyin(tmparch, thisname->nl_filename,
                                        thisname->nl_name) ) {
                                parser_skipbody(oldarch, &header);
                        } else {
                                ++badfiles;
                                parser_preserve(oldarch, tmparch, &header);
                        }
                        list = names_delete(list, thisname);
                } else {
                        parser_preserve(oldarch, tmparch, &header);
                }
        }
        thisname = list;
        while ( thisname != NULL ) {
                if ( !parser_copyin(tmparch, thisname->nl_filename,
                                thisname->nl_name) )
                        ++badfiles;
                thisname = thisname->nl_next;
        }
        parser_closeandcopy(oldarch, tmparch);

        return badfiles? ECODE_ERROR: ECODE_SUCCESS;
}

<- Alle Module
Martin Hasch, Februar 1997