~serge-hallyn/ubuntu/quantal/lxc/lxc-fixapi

« back to all changes in this revision

Viewing changes to .pc/0005-fix-sshd-template.patch/src/lxc/utils.c

  • Committer: Package Import Robot
  • Author(s): Serge Hallyn
  • Date: 2012-04-26 15:18:35 UTC
  • mfrom: (3.1.41 sid)
  • Revision ID: package-import@ubuntu.com-20120426151835-3vz6kb4m90gb26js
Tags: 0.8.0~rc1-4ubuntu1
* Merge from unstable.  Remaining changes:
  - control:
    - update maintainer
    - Build-Depends: add dh-apparmor and libapparmor-dev
    - lxc Depends: add bridge-utils, dnsmasq-base, iptables, rsync
    - lxc Recommends: add cgroup-lite | cgroup-bin, openssl
    - lxc Suggests: add btrfs-tools, lvm2, qemu-user-static
    - lxc Conflicts: remove (cgroup-bin)
  - Add lxc-start-ephemeral and lxc-wait to debian/local
  - apparmor:
    - add lxc.apparmor, lxc-containers.apparmor,
      lxc-default.apparmor, and new lxc.apparmor.in
  - add debian/lxc.conf (default container creation config file)
  - debian/lxc.install.in:
    * add lxc-start-ephemeral
    * add debian/lxc.conf
    * skip lxc-debconf*
    * skip lxc-ls (Use upstream's)
  - debian/lxc*.install.in: use '*', not @DEB_HOST_MULTIARCH@
  - Use our own completely different lxc.postinst and lxc.postrm
  - remove lxc.templates
  - debian/rules:
    * add DEB_DH_INSTALLINIT_ARGS = --upstart-only
    * don't do debconf stuff
    * add debian/*.apparmor.in to files processed under
      override_dh_auto_clean
    * don't comment out ubuntu or busybox templates
    * do apparmor stuff and install our own lxc-wait under override_dh_install
    * install our upstart scripts in override_dh_installinit
  - add lxc.default, lxc.lxc-net.upstart, lxc.upstart under
    debian/

* patches kept:
  - 0013-lxc-create-use-default-config.patch (needed manual rebase)
  - 0030-ubuntu-template-fail.patch
  - 0031-ubuntu-template-resolvconf.patch
  - 0044-lxc-destroy-rm-autos
  - debian/patches/0045-fix-other-templates
  - debian/patches/0046-lxc-clone-change-hwaddr
  - debian/patches/0047-bindhome-check-shell
  - debian/patches/0049-ubuntu-template-sudo-and-cleanup
  - debian/patches/0050-clone-lvm-sizes
  - debian/patches/0052-ubuntu-bind-user-conflict
  - debian/patches/0053-lxc-start-pin-rootfs
  - debian/patches/0054-ubuntu-debug
  - debian/patches/0055-ubuntu-handle-badgrp
  - debian/patches/0056-dont-watch-utmp
  - debian/patches/0057-update-manpages
  - debian/patches/0058-fixup-ubuntu-cloud
  - debian/patches/0059-reenable-daily-cloudimg
  - debian/patches/0060-lxc-shutdown
  - debian/patches/0061-lxc-start-apparmor
  - debian/patches/0062-templates-relative-paths
  - debian/patches/0063-check-apparmor-enabled
  - debian/patches/0064-apparmor-mount-proc
  - debian/patches/0065-fix-bindhome-relpath
  - debian/patches/0066-confile-typo
  - debian/patches/0067-templates-lxc-profile
  - debian/patches/0068-fix-lxc-config-layout 
  - debian/patches/0069-ubuntu-cloud-fix
  - debian/patches/0070-templates-rmdir-dev-shm
  - debian/patches/0071-ubuntu-cloud-fix-image-extraction
  - debian/patches/0072-lxc-shutdown-help
  - debian/patches/0073-lxc-destroy-waits-before-destroy
  - mark all patches which have been forwarded as such, refresh all
* 0074-lxc-execute-find-init: lxc-init had moved.  Introduce a function in
  lxc-execute to go find it.  Otherwise lxc-execute for any older releases
  will fail.
* 0075-lxc-ls-bash: lxc-ls needs bash, not sh
* add debian/lxc.apparmor.in so DEB_HOST_MULTIARCH can be expanded
* 0076-fix-sprintfs:  - check return values for all sprintfs and snprintfs
  which could overflow (LP: #988918)
* 0077-execute-without-rootfs: let lxc-execute succeed with no rootfs
  (LP: #981955)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * lxc: linux Container library
3
 
 *
4
 
 * (C) Copyright IBM Corp. 2007, 2008
5
 
 *
6
 
 * Authors:
7
 
 * Daniel Lezcano <dlezcano at fr.ibm.com>
8
 
 *
9
 
 * This library is free software; you can redistribute it and/or
10
 
 * modify it under the terms of the GNU Lesser General Public
11
 
 * License as published by the Free Software Foundation; either
12
 
 * version 2.1 of the License, or (at your option) any later version.
13
 
 *
14
 
 * This library is distributed in the hope that it will be useful,
15
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 
 * Lesser General Public License for more details.
18
 
 *
19
 
 * You should have received a copy of the GNU Lesser General Public
20
 
 * License along with this library; if not, write to the Free Software
21
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
 
 */
23
 
 
24
 
#define _GNU_SOURCE
25
 
#include <errno.h>
26
 
#include <unistd.h>
27
 
#include <stdlib.h>
28
 
#include <stddef.h>
29
 
#include <sys/types.h>
30
 
#include <sys/stat.h>
31
 
#include <sys/mman.h>
32
 
#include <sys/param.h>
33
 
#include <sys/mount.h>
34
 
#include <dirent.h>
35
 
#include <fcntl.h>
36
 
#include <libgen.h>
37
 
 
38
 
#include "log.h"
39
 
 
40
 
lxc_log_define(lxc_utils, lxc);
41
 
 
42
 
int lxc_copy_file(const char *srcfile, const char *dstfile)
43
 
{
44
 
        void *srcaddr = NULL, *dstaddr;
45
 
        struct stat stat;
46
 
        int srcfd, dstfd, ret = -1;
47
 
        char c = '\0';
48
 
 
49
 
        dstfd = open(dstfile, O_CREAT | O_EXCL | O_RDWR, 0600);
50
 
        if (dstfd < 0) {
51
 
                SYSERROR("failed to creat '%s'", dstfile);
52
 
                goto out;
53
 
        }
54
 
 
55
 
        srcfd = open(srcfile, O_RDONLY);
56
 
        if (srcfd < 0) {
57
 
                SYSERROR("failed to open '%s'", srcfile);
58
 
                goto err;
59
 
        }
60
 
 
61
 
        if (fstat(srcfd, &stat)) {
62
 
                SYSERROR("failed to stat '%s'", srcfile);
63
 
                goto err;
64
 
        }
65
 
 
66
 
        if (!stat.st_size) {
67
 
                INFO("copy '%s' which is an empty file", srcfile);
68
 
                ret = 0;
69
 
                goto out_close;
70
 
        }
71
 
 
72
 
        if (lseek(dstfd, stat.st_size - 1, SEEK_SET) < 0) {
73
 
                SYSERROR("failed to seek dest file '%s'", dstfile);
74
 
                goto err;
75
 
        }
76
 
 
77
 
        /* fixup length */
78
 
        if (write(dstfd, &c, 1) < 0) {
79
 
                SYSERROR("failed to write to '%s'", dstfile);
80
 
                goto err;
81
 
        }
82
 
 
83
 
        srcaddr = mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, srcfd, 0L);
84
 
        if (srcaddr == MAP_FAILED) {
85
 
                SYSERROR("failed to mmap '%s'", srcfile);
86
 
                goto err;
87
 
        }
88
 
 
89
 
        dstaddr = mmap(NULL, stat.st_size, PROT_WRITE, MAP_SHARED, dstfd, 0L);
90
 
        if (dstaddr == MAP_FAILED) {
91
 
                SYSERROR("failed to mmap '%s'", dstfile);
92
 
                goto err;
93
 
        }
94
 
 
95
 
        ret = 0;
96
 
 
97
 
        memcpy(dstaddr, srcaddr, stat.st_size);
98
 
 
99
 
        munmap(dstaddr, stat.st_size);
100
 
out_mmap:
101
 
        if (srcaddr)
102
 
                munmap(srcaddr, stat.st_size);
103
 
out_close:
104
 
        close(dstfd);
105
 
        close(srcfd);
106
 
out:
107
 
        return ret;
108
 
err:
109
 
        unlink(dstfile);
110
 
        goto out_mmap;
111
 
}
112
 
 
113
 
static int mount_fs(const char *source, const char *target, const char *type)
114
 
{
115
 
        /* the umount may fail */
116
 
        if (umount(target))
117
 
                WARN("failed to unmount %s : %s", target, strerror(errno));
118
 
 
119
 
        if (mount(source, target, type, 0, NULL)) {
120
 
                ERROR("failed to mount %s : %s", target, strerror(errno));
121
 
                return -1;
122
 
        }
123
 
 
124
 
        DEBUG("'%s' mounted on '%s'", source, target);
125
 
 
126
 
        return 0;
127
 
}
128
 
 
129
 
extern int lxc_setup_fs(void)
130
 
{
131
 
        if (mount_fs("proc", "/proc", "proc"))
132
 
                return -1;
133
 
 
134
 
        if (mount_fs("shmfs", "/dev/shm", "tmpfs"))
135
 
                return -1;
136
 
 
137
 
        /* If we were able to mount /dev/shm, then /dev exists */
138
 
        if (access("/dev/mqueue", F_OK) && mkdir("/dev/mqueue", 0666)) {
139
 
                SYSERROR("failed to create '/dev/mqueue'");
140
 
                return -1;
141
 
        }
142
 
 
143
 
        if (mount_fs("mqueue", "/dev/mqueue", "mqueue"))
144
 
                return -1;
145
 
 
146
 
        return 0;
147
 
}
148
 
 
149
 
/* borrowed from iproute2 */
150
 
extern int get_u16(ushort *val, const char *arg, int base)
151
 
{
152
 
        unsigned long res;
153
 
        char *ptr;
154
 
 
155
 
        if (!arg || !*arg)
156
 
                return -1;
157
 
 
158
 
        res = strtoul(arg, &ptr, base);
159
 
        if (!ptr || ptr == arg || *ptr || res > 0xFFFF)
160
 
                return -1;
161
 
 
162
 
        *val = res;
163
 
 
164
 
        return 0;
165
 
}
166
 
 
167
 
extern int mkdir_p(char *dir, mode_t mode)
168
 
{
169
 
        int ret;
170
 
        char *d;
171
 
 
172
 
        if (!strcmp(dir, "/"))
173
 
                return 0;
174
 
 
175
 
        d = strdup(dir);
176
 
        if (!d)
177
 
                return -1;
178
 
 
179
 
        ret = mkdir_p(dirname(d), mode);
180
 
        free(d);
181
 
        if (ret)
182
 
                return -1;
183
 
 
184
 
        if (!access(dir, F_OK))
185
 
                return 0;
186
 
 
187
 
        if (mkdir(dir, mode)) {
188
 
                SYSERROR("failed to create directory '%s'\n", dir);
189
 
                return -1;
190
 
        }
191
 
 
192
 
        return 0;
193
 
}