2011-03-30 12:46:40 +00:00
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
|
|
|
|
|
|
|
void
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
int swapfd, cswfd;
|
2011-08-22 08:03:15 +00:00
|
|
|
char buf[1024], *p;
|
|
|
|
Dir *d;
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-08-22 08:03:15 +00:00
|
|
|
ARGBEGIN {
|
|
|
|
} ARGEND;
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-08-22 08:03:15 +00:00
|
|
|
if(argc != 1){
|
2020-03-10 17:09:34 +00:00
|
|
|
fprint(2, "usage: swap file\n");
|
2011-08-22 08:03:15 +00:00
|
|
|
exits("usage");
|
2011-03-30 12:46:40 +00:00
|
|
|
}
|
|
|
|
|
2011-08-22 08:03:15 +00:00
|
|
|
swapfd = -1;
|
|
|
|
if(d = dirstat(p = *argv)){
|
|
|
|
if(d->mode & DMDIR){
|
|
|
|
p = getenv("sysname");
|
|
|
|
if(p == 0)
|
|
|
|
p = "swap";
|
|
|
|
snprint(buf, sizeof buf, "%s/%sXXXXXXX", *argv, p);
|
|
|
|
p = mktemp(buf);
|
|
|
|
} else
|
|
|
|
swapfd = open(p, ORDWR);
|
2011-03-30 12:46:40 +00:00
|
|
|
}
|
2011-08-22 08:03:15 +00:00
|
|
|
if(d == nil || (d->mode & DMDIR)){
|
|
|
|
if((swapfd = create(p, ORDWR|ORCLOSE, 0600)) >= 0){
|
|
|
|
Dir nd;
|
|
|
|
|
|
|
|
nulldir(&nd);
|
|
|
|
nd.mode = DMTMP|0600;
|
|
|
|
dirfwstat(swapfd, &nd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(swapfd < 0)
|
|
|
|
sysfatal("%r");
|
|
|
|
if(fd2path(swapfd, p = buf, sizeof buf))
|
|
|
|
sysfatal("fd2path: %r");
|
|
|
|
if(putenv("swap", p) < 0)
|
|
|
|
sysfatal("putenv: %r");
|
2011-03-30 12:46:40 +00:00
|
|
|
|
|
|
|
print("swap: %s\n", p);
|
|
|
|
|
2011-08-22 08:03:15 +00:00
|
|
|
if((cswfd = open("/dev/swap", OWRITE)) < 0)
|
|
|
|
sysfatal("open: %r");
|
|
|
|
if(fprint(cswfd, "%d", swapfd) < 0)
|
|
|
|
sysfatal("write: %r");
|
2011-03-30 12:46:40 +00:00
|
|
|
|
|
|
|
exits(0);
|
|
|
|
}
|