SWAPCTL(2) System Calls SWAPCTL(2)

NAME


swapctl - manage swap space

SYNOPSIS


#include <sys/stat.h>
#include <sys/swap.h>

int swapctl(int cmd, void *arg);


DESCRIPTION


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.

RETURN VALUES


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.

ERRORS


Under the following conditions, the function swapctl() fails and sets
errno to:

EEXIST
Part of the range specified by sr_start and sr_length
is already being used for swapping on the specified
resource (SC_ADD).


EFAULT
Either arg, sr_name, or ste_path points to an illegal
address.


EINVAL
The specified function value is not valid, the path
specified is not a swap resource (SC_REMOVE), part of
the range specified by sr_start and sr_length lies
outside the resource specified (SC_ADD), or the
specified swap area is less than one page (SC_ADD).


EISDIR
The path specified for SC_ADD is a directory.


ELOOP
Too many symbolic links were encountered in
translating the pathname provided to SC_ADD or
SC_REMOVE.


ENAMETOOLONG
The length of a component of the path specified for
SC_ADD or SC_REMOVE exceeds NAME_MAX characters or
the length of the path exceeds PATH_MAX characters
and _POSIX_NO_TRUNC is in effect.


ENOENT
The pathname specified for SC_ADD or SC_REMOVE does
not exist.


ENOMEM
An insufficient number of struct swapent structures
were provided to SC_LIST, or there were insufficient
system storage resources available during an SC_ADD
or SC_REMOVE, or the system would not have enough
swap space after an SC_REMOVE.


ENOSYS
The pathname specified for SC_ADD or SC_REMOVE is not
a file or block special device.


ENOTDIR
Pathname provided to SC_ADD or SC_REMOVE contained a
component in the path prefix that was not a
directory.


EPERM
The {PRIV_SYS_MOUNT} was not asserted in the
effective set of the calling process.


EROFS
The pathname specified for SC_ADD is a read-only file
system.


Additionally, the swapctl() function will fail for 32-bit interfaces
if:

EOVERFLOW
The amount of swap space configured on the machine is
too large to be represented by a 32-bit quantity.


EXAMPLES


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);
}


SEE ALSO


privileges(7)

September 25, 1997 SWAPCTL(2)

tribblix@gmail.com :: GitHub :: Privacy