~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to bin/trampoline/trampoline.c

  • Committer: William Grant
  • Date: 2009-05-31 01:36:47 UTC
  • mto: (1281.1.8 aufsless)
  • mto: This revision was merged to the branch mainline in revision 1300.
  • Revision ID: grantw@unimelb.edu.au-20090531013647-ar21mrde7k394ilv
Make trampoline mount jails new-style (without AUFS).

Show diffs side-by-side

added added

removed removed

Lines of Context:
137
137
    return ptr;
138
138
}
139
139
 
 
140
int checked_mount(const char *source, const char *target,
 
141
                  const char *filesystemtype, unsigned long mountflags,
 
142
                  const void *data)
 
143
{
 
144
    int result = mount(source, target, filesystemtype, mountflags, data);
 
145
    if (result)
 
146
    {
 
147
        syslog(LOG_ERR, "could not mount %s on %s\n", source, target);
 
148
        perror("could not mount");
 
149
        exit(1);
 
150
    }
 
151
 
 
152
    return result;
 
153
}
 
154
 
 
155
 
140
156
/* Find the path of the user components of a jail, given a mountpoint. */
141
157
char *jail_src(const char *jail_src_base, const char *jail_base,
142
158
               const char *jailpath)
147
163
 
148
164
    srclen = strlen(jail_src_base);
149
165
    dstlen = strlen(jail_base);
150
 
    
 
166
 
151
167
    src = die_if_null(malloc(strlen(jailpath) + (srclen - dstlen) + 1));
152
168
    strcpy(src, jail_src_base);
153
169
    strcat(src, jailpath+dstlen);
163
179
{
164
180
    char *jailsrc;
165
181
    char *jaillib;
166
 
    char *mountdata;
 
182
    char *source_bits;
 
183
    char *target_bits;
167
184
 
168
185
    /* Check if there is something useful in the jail. If not, it's probably
169
186
     * not mounted. */
183
200
             }
184
201
             syslog(LOG_NOTICE, "created mountpoint %s\n", jailpath);
185
202
        }
186
 
       
 
203
 
187
204
        jailsrc = jail_src(jail_src_base, jail_base, jailpath);
188
 
        mountdata = die_if_null(malloc(3 + strlen(jailsrc) + 4 + strlen(jail_system) + 3 + 1));
189
 
        sprintf(mountdata, "br:%s=rw:%s=ro", jailsrc, jail_system);
190
 
        if (mount("none", jailpath, "aufs", 0, mountdata))
191
 
        {
192
 
            syslog(LOG_ERR, "could not mount %s\n", jailpath);
193
 
            perror("could not mount");
194
 
            exit(1);
195
 
        } 
 
205
        checked_mount(jail_system, jailpath, NULL, MS_BIND | MS_RDONLY, NULL);
 
206
 
 
207
        source_bits = die_if_null(malloc(strlen(jailsrc) + 5 + 1));
 
208
        target_bits = die_if_null(malloc(strlen(jailpath) + 5 + 1));
 
209
        sprintf(source_bits, "%s/home", jailsrc);
 
210
        sprintf(target_bits, "%s/home", jailpath);
 
211
 
 
212
        checked_mount(source_bits, target_bits, NULL, MS_BIND, NULL);
 
213
 
 
214
        sprintf(source_bits, "%s/tmp", jailsrc);
 
215
        sprintf(target_bits, "%s/tmp", jailpath);
 
216
 
 
217
        checked_mount(source_bits, target_bits, NULL, MS_BIND, NULL);
196
218
 
197
219
        syslog(LOG_INFO, "mounted %s\n", jailpath);
198
220
 
199
221
        free(jailsrc);
200
 
        free(mountdata);
 
222
        free(source_bits);
 
223
        free(target_bits);
201
224
    }
202
225
 
203
226
    free(jaillib);