~ubuntu-branches/ubuntu/hardy/util-linux/hardy-security

« back to all changes in this revision

Viewing changes to mount/swapon.c

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2008-03-21 10:20:36 UTC
  • Revision ID: james.westby@ubuntu.com-20080321102036-0fl883e1alxha2tc
Tags: 2.13.1-3ubuntu1
* New Debian version: remaining ubuntu changes:
  - use libvolume-id instead of libblkid
  - udev hooks

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
#include <errno.h>
11
11
#include <sys/stat.h>
12
12
#include <unistd.h>
 
13
#include <sys/types.h>
 
14
#include <sys/wait.h>
 
15
#include <fcntl.h>
13
16
#include "xmalloc.h"
14
17
#include "swap_constants.h"
15
18
#include "nls.h"
17
20
#include "realpath.h"
18
21
#include "mount_paths.h"
19
22
 
 
23
#define PATH_MKSWAP     "/sbin/mkswap"
 
24
 
20
25
#ifdef HAVE_SYS_SWAP_H
21
26
# include <sys/swap.h>
22
27
#endif
158
163
}
159
164
 
160
165
static int
 
166
swap_is_suspend(const char *device) {
 
167
        const char *type = fsprobe_get_fstype_by_devname(device);
 
168
 
 
169
        return (type && strcmp(type, "suspend") == 0) ? 1 : 0;
 
170
}
 
171
 
 
172
/* calls mkswap */
 
173
static int
 
174
swap_reinitialize(const char *device) {
 
175
        const char *label = fsprobe_get_label_by_devname(device);
 
176
        const char *uuid  = fsprobe_get_uuid_by_devname(device);
 
177
        pid_t pid;
 
178
        int status, ret;
 
179
        char *cmd[7];
 
180
        int idx=0;
 
181
 
 
182
        switch((pid=fork())) {
 
183
        case -1: /* fork error */
 
184
                fprintf(stderr, _("%s: cannot fork: %s\n"),
 
185
                        progname, strerror(errno));
 
186
                return -1;
 
187
 
 
188
        case 0: /* child */
 
189
                cmd[idx++] = PATH_MKSWAP;
 
190
                if (label && *label) {
 
191
                        cmd[idx++] = "-L";
 
192
                        cmd[idx++] = (char *) label;
 
193
                }
 
194
                if (uuid && *uuid) {
 
195
                        cmd[idx++] = "-U";
 
196
                        cmd[idx++] = (char *) uuid;
 
197
                }
 
198
                cmd[idx++] = (char *) device;
 
199
                cmd[idx++] = NULL;
 
200
                execv(cmd[0], cmd);
 
201
                perror("execv");
 
202
                exit(1); /* error  */
 
203
 
 
204
        default: /* parent */
 
205
                do {
 
206
                        if ((ret = waitpid(pid, &status, 0)) < 0
 
207
                                        && errno == EINTR)
 
208
                                continue;
 
209
                        else if (ret < 0) {
 
210
                                fprintf(stderr, _("%s: waitpid: %s\n"),
 
211
                                        progname, strerror(errno));
 
212
                                return -1;
 
213
                        }
 
214
                } while (0);
 
215
 
 
216
                /* mkswap returns: 0=suss, 1=error */
 
217
                if (WIFEXITED(status) && WEXITSTATUS(status)==0)
 
218
                        return 0; /* ok */
 
219
        }
 
220
        return -1; /* error */
 
221
}
 
222
 
 
223
static int
161
224
do_swapon(const char *orig_special, int prio, int canonic) {
162
225
        int status;
163
226
        struct stat st;
179
242
                return -1;
180
243
        }
181
244
 
 
245
        /* We have to reinitialize swap with old (=useless) software suspend
 
246
         * data. The problem is that if we don't do it, then we get data
 
247
         * corruption the next time an attempt at unsuspending is made.
 
248
         */
 
249
        if (swap_is_suspend(special)) {
 
250
                fprintf(stdout, _("%s: %s: software suspend data detected. "
 
251
                                        "Reinitializing the swap.\n"),
 
252
                        progname, special);
 
253
                if (swap_reinitialize(special) < 0)
 
254
                        return -1;
 
255
        }
 
256
 
182
257
        /* people generally dislike this warning - now it is printed
183
258
           only when `verbose' is set */
184
259
        if (verbose) {