extract.c revision 402
1238106Sdes#ifndef lint
2238106Sdesstatic const char *rcsid = "$Id: extract.c,v 1.5 1993/09/04 05:06:26 jkh Exp $";
3238106Sdes#endif
4238106Sdes
5238106Sdes/*
6238106Sdes * FreeBSD install - a package for the installation and maintainance
7238106Sdes * of non-core utilities.
8238106Sdes *
9238106Sdes * Redistribution and use in source and binary forms, with or without
10238106Sdes * modification, are permitted provided that the following conditions
11238106Sdes * are met:
12238106Sdes * 1. Redistributions of source code must retain the above copyright
13238106Sdes *    notice, this list of conditions and the following disclaimer.
14238106Sdes * 2. Redistributions in binary form must reproduce the above copyright
15238106Sdes *    notice, this list of conditions and the following disclaimer in the
16238106Sdes *    documentation and/or other materials provided with the distribution.
17238106Sdes *
18238106Sdes * Jordan K. Hubbard
19238106Sdes * 18 July 1993
20238106Sdes *
21238106Sdes * This is the package extraction code for the add module.
22238106Sdes *
23238106Sdes */
24238106Sdes
25238106Sdes#include "lib.h"
26238106Sdes#include "add.h"
27238106Sdes
28238106Sdesvoid
29238106Sdesextract_plist(char *home, Package *pkg)
30238106Sdes{
31238106Sdes    PackingList p = pkg->head;
32238106Sdes    char *last_file;
33238106Sdes
34238106Sdes    /* Reset the world */
35238106Sdes    Owner = NULL;
36238106Sdes    Group = NULL;
37238106Sdes    Mode = NULL;
38238106Sdes    last_file = NULL;
39238106Sdes    Directory = home;
40238106Sdes
41238106Sdes    /* Do it */
42238106Sdes    while (p) {
43238106Sdes	switch(p->type) {
44238106Sdes	case PLIST_NAME:
45238106Sdes	    PkgName = p->name;
46238106Sdes	    if (Verbose)
47238106Sdes		printf("extract: Package name is %s\n", p->name);
48238106Sdes	    break;
49238106Sdes
50238106Sdes	case PLIST_FILE:
51238106Sdes	    last_file = p->name;
52238106Sdes	    if (Verbose)
53238106Sdes		printf("extract: %s/%s\n", Directory, p->name);
54238106Sdes	    if (!Fake) {
55238106Sdes		char try[FILENAME_MAX];
56238106Sdes
57238106Sdes		/* first try to rename it into place */
58238106Sdes		sprintf(try, "%s/%s", Directory, p->name);
59238106Sdes		if (rename(p->name, try) == FAIL)
60238106Sdes		    copy_hierarchy(Directory, p->name, TRUE);
61238106Sdes		apply_perms(Directory, p->name);
62238106Sdes	    }
63238106Sdes	    break;
64238106Sdes
65238106Sdes	case PLIST_CWD:
66238106Sdes	    if (Verbose)
67238106Sdes		printf("extract: CWD to %s\n", p->name);
68238106Sdes	    if (strcmp(p->name, ".")) {
69238106Sdes		if (!Fake && make_hierarchy(p->name) == FAIL)
70238106Sdes		    barf("Unable make directory '%s'.", p->name);
71238106Sdes		Directory = p->name;
72238106Sdes	    }
73238106Sdes	    else
74238106Sdes		Directory = home;
75238106Sdes	    break;
76238106Sdes
77238106Sdes	case PLIST_CMD:
78238106Sdes	    if (Verbose)
79238106Sdes		printf("extract: exec cmd '%s' (lastfile = %s)\n", p->name,
80238106Sdes		       last_file);
81238106Sdes	    if (!Fake && vsystem(p->name, Directory, last_file))
82238106Sdes		whinge("Command '%s' failed.", p->name);
83238106Sdes	    break;
84238106Sdes
85238106Sdes	case PLIST_CHMOD:
86238106Sdes	    Mode = p->name;
87238106Sdes	    break;
88238106Sdes
89238106Sdes	case PLIST_CHOWN:
90238106Sdes	    Owner = p->name;
91238106Sdes	    break;
92238106Sdes
93238106Sdes	case PLIST_CHGRP:
94238106Sdes	    Group = p->name;
95238106Sdes	    break;
96238106Sdes
97238106Sdes	case PLIST_COMMENT:
98238106Sdes	    break;
99238106Sdes
100238106Sdes	case PLIST_IGNORE:
101238106Sdes	    p = p->next;
102238106Sdes	    break;
103238106Sdes	}
104238106Sdes	p = p->next;
105238106Sdes    }
106238106Sdes}
107238106Sdes