getprocentry-legacy.c (2036B)
1 // $Id$ --*- c++ -*-- 2 3 // Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 #include "utils-legacy.h" 24 #include "internal.h" 25 #include "vserver-internal.h" 26 27 #include <string.h> 28 #include <sys/stat.h> 29 #include <fcntl.h> 30 #include <errno.h> 31 #include <unistd.h> 32 33 static volatile size_t proc_bufsize = 4097; 34 35 size_t 36 utilvserver_getProcEntryBufsize() 37 { 38 return proc_bufsize; 39 } 40 41 char * 42 utilvserver_getProcEntry(pid_t pid, 43 char *str, 44 char *buf, size_t bufsize) 45 { 46 char status_name[ sizeof("/proc//status") + sizeof(unsigned int)*3 + 1 ]; 47 int fd; 48 size_t len; 49 char * res = 0; 50 51 if (pid<0 || (uint32_t)(pid)>99999) { 52 errno = EBADR; 53 return 0; 54 } 55 56 if (pid==0) strcpy(status_name, "/proc/self/status"); 57 else { 58 strcpy(status_name, "/proc/"); 59 len = utilvserver_fmt_uint(status_name+sizeof("/proc/")-1, pid); 60 strcpy(status_name+sizeof("/proc/")+len-1, "/status"); 61 } 62 63 fd = open(status_name, O_RDONLY); 64 if (fd==-1) return 0; 65 66 len = read(fd, buf, bufsize); 67 close(fd); 68 69 if (len<bufsize) { 70 buf[len] = '\0'; 71 if (str) 72 res = strstr(buf, str) + strlen(str); 73 else 74 res = buf; 75 } 76 else if (len!=(size_t)-1) { 77 if (proc_bufsize==bufsize) 78 proc_bufsize = bufsize * 2 - 1; 79 80 errno = EAGAIN; 81 } 82 83 return res; 84 }