Here is an implementation of file-retriever in C, since its TODO file
expressed an interest in having one.

2 files attached.


Regards: David Weinehall
-- 
 /> David Weinehall <[EMAIL PROTECTED]> /> Northern lights wander      <\
//  Maintainer of the v2.0 kernel   //  Dance across the winter sky //
\>  http://www.acc.umu.se/~tao/    </   Full colour fire           </
/* file-retriever -- file-retriever for debian-installer
 *
 * Copyright (C) 2002 David Weinehall
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program 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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software Foundation,
 *  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>

#ifdef PATH_MAX
static int pathmax = PATH_MAX;
#else
static int pathmax = 0;
#endif /* PATH_MAX */

#define PATH_MAX_GUESS  1024

int main(int argc, char **argv)
{
        char *oldpath = NULL;
        char *buf = NULL;
        char *wd = NULL;
        char *p = NULL;
        int status = 0;

        errno = 0;

        if (argc != 3) {
                status = EINVAL;
                goto EXIT;
        }

        /* `pwd` */
        if (!pathmax) {
                if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {
                        if (!errno)
                                pathmax = PATH_MAX_GUESS;
                        else
                                goto EXIT;
                } else {
                        pathmax++;
                }
        }

        if (!(buf = malloc(pathmax + 1))) {
                status = errno;
                goto EXIT;
        }

        if (!(wd = getcwd(buf, pathmax))) {
                status = errno;
                goto EXIT;
        }

        /* `pwd`/debs/$1 */
        if (!(oldpath = malloc(strlen(wd) +
                               strlen("/debs/") + strlen(argv[1]) + 1))) {
                status = errno;
                goto EXIT;
        }

        p = oldpath;
        strcpy(p, wd);
        p = oldpath + strlen(oldpath);
        strcpy(p, "/debs/");
        p = oldpath + strlen(oldpath);
        strcpy(p, argv[1]);

        /* ln -sf `pwd`/debs/$1 $2 */
        if (!unlink(argv[2]) && errno && errno != ENOENT) {
                status = errno;
                goto EXIT;
        }

        errno = 0;

        if (!(symlink(oldpath, argv[2])))
                status = errno;

EXIT:
        free(oldpath);
        free(buf);

        return status;
}
# Makefile for file-retriever
# Copyright (C) 2002 David Weinehall

CFLAGS += -O2 -g
CFLAGS += -W -Wall -Wshadow -Wpointer-arith -Wundef -Wcast-align
CFLAGS += -Wbad-function-cast -Wwrite-strings -Wsign-compare
CFLAGS += -Waggregate-return -Wmissing-noreturn -Wnested-externs

TARGETS = file-retriever

.PHONY: bin
bin: $(TARGETS)

$(TARGETS): %: %.c
        $(CC) $(CFLAGS) -o $@ $^

.PHONY: small
small: CFLAGS := -Os $(CFLAGS)
small: $(TARGETS)
        
.PHONY: clean
clean:
        rm -f $(TARGETS) core

Reply via email to