source: trunk/third/sysinfo/kvmlib.c @ 12269

Revision 12269, 3.2 KB checked in by ghudson, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12268, which included commits to RCS files with non-trunk default branches.
Line 
1/*
2 * Copyright (c) 1992-1998 Michael A. Cooper.
3 * This software may be freely used and distributed provided it is not
4 * sold for profit or used in part or in whole for commercial gain
5 * without prior written agreement, and the author is credited
6 * appropriately.
7 */
8
9#ifndef lint
10static char *RCSid = "$Revision: 1.1.1.3 $";
11#endif
12
13#include "defs.h"
14
15#if defined(NEED_KVM)
16
17#include <stdio.h>
18#include <sys/errno.h>
19#include "kvm.h"
20
21#ifndef SYSFAIL
22#define SYSFAIL -1
23#endif
24
25#if defined(DEBUG) && !defined(SYSERR)
26extern int errno;
27extern char sys_errlist[];
28#define SYSERR sys_errlist[errno]
29#endif
30
31char *strdup();
32
33#if     !defined(NAMELIST)
34#define NAMELIST        "/vmunix"
35#endif  /* NAMELIST */
36#if     !defined(KMEMFILE)
37#define KMEMFILE        "/dev/kmem"
38#endif  /* KMEMFILE */
39
40/*
41 * Close things down.
42 */
43extern int kvm_close(kd)
44    kvm_t                      *kd;
45{
46    if (!kd)
47        return(-1);
48
49    if (kd->kmemd)
50        close(kd->kmemd);
51    if (kd->namelist)
52        free(kd->namelist);
53    if (kd->vmfile)
54        free(kd->vmfile);
55
56    free(kd);
57
58    return(0);
59}
60
61/*
62 * Open things up.
63 */
64extern kvm_t *kvm_open(NameList, CoreFile, SwapFile, Flag, ErrStr)
65    char                       *NameList;
66    char                       *CoreFile;
67    char                       *SwapFile;
68    int                         Flag;
69    char                       *ErrStr;
70{
71    kvm_t *kd;
72
73    if ((kd = (kvm_t *) malloc(sizeof(kvm_t))) == NULL) {
74#ifdef DEBUG
75        fprintf(stderr, "kvm_open() malloc %d bytes failed!\n", sizeof(kvm_t));
76#endif
77        return((kvm_t *) NULL);
78    }
79
80    if (NameList)
81        kd->namelist = strdup(NameList);
82    else
83        kd->namelist = strdup(NAMELIST);
84
85    if (CoreFile)
86        kd->vmfile = strdup(CoreFile);
87    else
88        kd->vmfile = strdup(KMEMFILE);
89
90    if ((kd->kmemd = open(kd->vmfile, Flag, 0)) == SYSFAIL) {
91#ifdef DEBUG
92        fprintf(stderr, "kvm_open() open '%s' failed: %s.\n", kd->vmfile,
93                SYSERR);
94#endif
95        return((kvm_t *) NULL);
96    }
97
98    return(kd);
99}
100
101/*
102 * KVM read function
103 */
104extern int kvm_read(kd, Addr, Buf, NBytes)
105    kvm_t                      *kd;
106    KVMaddr_t                   Addr;
107    void                       *Buf;
108    size_t                      NBytes;
109{
110    size_t                      RetVal;
111
112    if (!kd) {
113#ifdef DEBUG
114        fprintf(stderr, "kvm_read(): invalid kd param\n");
115#endif
116        return(SYSFAIL);
117    }
118
119    if (lseek(kd->kmemd, Addr, 0) == SYSFAIL) {
120#ifdef DEBUG
121        fprintf(stderr, "kvm_read(): lseek failed (desc %d addr 0x%x): %s\n",
122                kd->kmemd, Addr, SYSERR);
123#endif
124        return(SYSFAIL);
125    }
126
127    if ((RetVal = read(kd->kmemd, Buf, NBytes)) != NBytes) {
128#ifdef DEBUG
129        fprintf(stderr,
130                "kvm_read(): read failed (desc %d buf 0x%x size %d): %s\n",
131                kd->kmemd, Buf, NBytes, SYSERR);
132#endif
133        return(SYSFAIL);
134    }
135
136    return(RetVal);
137}
138
139/*
140 * KVM write function
141 */
142extern int kvm_write(kd, Addr, Buf, NBytes)
143     kvm_t                     *kd;
144     unsigned long              Addr;
145     char                      *Buf;
146     unsigned                   NBytes;
147{
148    unsigned                    ret;
149
150    if (!kd) {
151        return(SYSFAIL);
152    }
153
154    if (lseek(kd->kmemd, Addr, 0) == SYSFAIL) {
155        return(SYSFAIL);
156    }
157
158    if ((ret = write(kd->kmemd, Buf, NBytes)) != NBytes) {
159        return(SYSFAIL);
160    }
161
162    return(ret);
163}
164
165/*
166 * Perform an nlist()
167 */
168#if     defined(HAVE_NLIST)
169extern int kvm_nlist(kd, nl)
170     kvm_t                     *kd;
171     nlist_t                   *nl;
172{
173     int status;
174
175    if (!kd)
176        return(SYSFAIL);
177
178    return(NLIST_FUNC(kd->namelist, nl));
179}
180#endif  /* HAVE_NLIST */
181
182#endif /* NEED_KVM */
Note: See TracBrowser for help on using the repository browser.