Copyright 1989 AT&T Copyright (c) 1997, Sun Microsystems, Inc. All Rights Reserved
The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
#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
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.
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\en"); 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\en"); exit(3); } /* allocate num+1 string holders */ if ((strtab = (char *) malloc((num + 1) * MAXSTRSIZE)) == (void *) 0) { fprintf(stderr, "Malloc Failed\en"); 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\en", s->swt_ent[i].ste_path, s->swt_ent[i].ste_pages); }
privileges(5)