SWAPCTL(2) | System Calls | SWAPCTL(2) |
swapctl - manage swap space
#include <sys/stat.h> #include <sys/swap.h> int swapctl(int cmd, void *arg);
The swapctl() function adds, deletes, or returns information about swap resources. cmd specifies one of the following options contained in <sys/swap.h>:
SC_ADD /* add a resource for swapping */ SC_LIST /* list the resources for swapping */ SC_REMOVE /* remove a resource for swapping */ SC_GETNSWP /* return number of swap resources */
When SC_ADD or SC_REMOVE is specified, arg is a pointer to a swapres structure containing the following members:
char *sr_name; /* pathname of resource */ off_t sr_start; /* offset to start of swap area */ off_t sr_length; /* length of swap area */
The sr_start and sr_length members are specified in 512-byte blocks. A swap resource can only be removed by specifying the same values for the sr_start and sr_length members as were specified when it was added. Swap resources need not be removed in the order in which they were added.
When SC_LIST is specified, arg is a pointer to a swaptable structure containing the following members:
int swt_n; /* number of swapents following */ struct swapent swt_ent[]; /* array of swt_n swapents */
A swapent structure contains the following members:
char *ste_path; /* name of the swap file */ off_t ste_start; /* starting block for swapping */ off_t ste_length; /* length of swap area */ long ste_pages; /* number of pages for swapping */ long ste_free; /* number of ste_pages free */ long ste_flags; /* ST_INDEL bit set if swap file */
/* is now being deleted */
The SC_LIST function causes swapctl() to return at most swt_n entries. The return value of swapctl() is the number actually returned. The ST_INDEL bit is turned on in ste_flags if the swap file is in the process of being deleted.
When SC_GETNSWP is specified, swapctl() returns as its value the number of swap resources in use. arg is ignored for this operation.
The SC_ADD and SC_REMOVE functions will fail if calling process does not have appropriate privileges.
Upon successful completion, the function swapctl() returns a value of 0 for SC_ADD or SC_REMOVE, the number of struct swapent entries actually returned for SC_LIST, or the number of swap resources in use for SC_GETNSWP. Upon failure, the function swapctl() returns a value of −1 and sets errno to indicate an error.
Under the following conditions, the function swapctl() fails and sets errno to:
EEXIST
EFAULT
EINVAL
EISDIR
ELOOP
ENAMETOOLONG
ENOENT
ENOMEM
ENOSYS
ENOTDIR
EPERM
EROFS
Additionally, the swapctl() function will fail for 32-bit interfaces if:
EOVERFLOW
Example 1 The usage of the SC_GETNSWP and SC_LIST commands.
The following example demonstrates the usage of the SC_GETNSWP and SC_LIST commands.
#include <sys/stat.h> #include <sys/swap.h> #include <stdio.h> #define MAXSTRSIZE 80 main(argc, argv)
int argc;
char *argv[]; {
swaptbl_t *s;
int i, n, num;
char *strtab; /* string table for path names */ again:
if ((num = swapctl(SC_GETNSWP, 0)) == -1) {
perror("swapctl: GETNSWP");
exit(1);
}
if (num == 0) {
fprintf(stderr, "No Swap Devices Configured\n");
exit(2);
}
/* allocate swaptable for num+1 entries */
if ((s = (swaptbl_t *)
malloc(num * sizeof(swapent_t) +
sizeof(struct swaptable))) ==
(void *) 0) {
fprintf(stderr, "Malloc Failed\n");
exit(3);
}
/* allocate num+1 string holders */
if ((strtab = (char *)
malloc((num + 1) * MAXSTRSIZE)) == (void *) 0) {
fprintf(stderr, "Malloc Failed\n");
exit(3);
}
/* initialize string pointers */
for (i = 0; i < (num + 1); i++) {
s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
}
s->swt_n = num + 1;
if ((n = swapctl(SC_LIST, s)) < 0) {
perror("swapctl");
exit(1);
}
if (n > num) { /* more were added */
free(s);
free(strtab);
goto again;
}
for (i = 0; i < n; i++)
printf("%s %ld\n",
s->swt_ent[i].ste_path, s->swt_ent[i].ste_pages); }
September 25, 1997 | OmniOS |