Package: and Version: 1.2.2-2.1 Severity: normal Hi,
and currently fails to build on Debian GNU/Hurd. Now that we have somewhat of a /proc system, it should sorta work. Attached is a patch to allow it to at least build and run on Debian GNU/Hurd.
Thank you, Barry deFreese
diff -urN repo/and-1.2.2/Makefile ./and-1.2.2/Makefile --- repo/and-1.2.2/Makefile 2009-06-10 15:42:50.000000000 -0400 +++ ./and-1.2.2/Makefile 2009-06-10 14:59:35.000000000 -0400 @@ -126,6 +126,11 @@ CC = cc LD = cc else +ifeq (${ARCH},GNU) + CC = gcc -ansi -pedantic -Wall -g + LD = gcc + LIBS = +else # unsupported architecture CC = false LD = false @@ -137,6 +142,7 @@ endif endif endif +endif # @@ -180,6 +186,8 @@ and-SunOS.o: and.h and-OSF1.c $(CC) -c and-OSF1.c -o and-SunOS.o +and-GNU.o: and.h and-GNU.c + $(CC) -c and-GNU.c # diff -urN repo/and-1.2.2/and-GNU.c ./and-1.2.2/and-GNU.c --- repo/and-1.2.2/and-GNU.c 1969-12-31 19:00:00.000000000 -0500 +++ ./and-1.2.2/and-GNU.c 2009-06-10 15:32:23.000000000 -0400 @@ -0,0 +1,136 @@ +/* + + AND auto nice daemon - renice programs according to their CPU usage. + Copyright (C) 1999-2003 Patrick Schemitz <schem...@users.sourceforge.net> + http://and.sourceforge.net/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <limits.h> +#include <unistd.h> +#include <string.h> +#include <dirent.h> +#include <ctype.h> +#include <syslog.h> +#include <sys/stat.h> +#include <signal.h> +#include <sys/param.h> /* kernel interrupt frequency: HZ */ + + +#include "and.h" + + +/* + + AND -- auto-nice daemon/GNU version. + + GNU-specific AND version. Makes excessive use of the GNU + /proc filesystem and is not portable. + + 1999-2003 Patrick Schemitz, <schem...@users.sourceforge.net> + http://and.sourceforge.net/ + +*/ + + +static DIR *linux_procdir = 0; + + +static struct and_procent linux_proc; + + +int linux_readproc (char *fn) +{ + /* Scan /proc/<pid>/stat file. Format described in proc(5). + l1: pid comm state ppid + l2: pgrp session tty tpgid + l3: flags minflt cminflt majflt cmajflt + l4: utime stime cutime cstime + l5: counter priority + */ + FILE* f; + int i; + long li; + long unsigned u, ujf, sjf; + char state; + char buffer [1024]; + if (!(f = fopen(fn,"rt"))) return 0; + fscanf(f,"%d %1023s %c %d",&(linux_proc.pid),buffer,&state,&(linux_proc.ppid)); + fscanf(f,"%d %d %d %d",&i,&i,&i,&i); + fscanf(f,"%lu %lu %lu %lu %lu",&u,&u,&u,&u,&u); + fscanf(f,"%lu %lu %ld %ld",&ujf,&sjf,&li,&li); + fscanf(f,"%ld %d",&li,&(linux_proc.nice)); + i = feof(f); + fclose(f); + if (i) return 0; + if (state == 'Z') return 0; /* ignore zombies */ + ujf += sjf; /* take into account both usr and sys time */ + ujf /= 60; /* convert jiffies to seconds */ + linux_proc.utime = ujf > INT_MAX ? INT_MAX: (int) ujf; + buffer[strlen(buffer)-1] = 0; /* remove () around command name */ + strncpy(linux_proc.command,&buffer[1],1023); + linux_proc.command[1023] = 0; + and_printf(3, "GNU: process %s pid: %d ppid: %d\n", + linux_proc.command, linux_proc.pid, linux_proc.ppid); + return 1; +} + + +struct and_procent *linux_getnext () +{ + char name [1024]; + struct dirent *entry; + struct stat dirstat; + if (!linux_procdir) return NULL; + while ((entry = readdir(linux_procdir)) != NULL) { /* omit . .. apm bus... */ + if (isdigit(entry->d_name[0])) break; + } + if (!entry) return NULL; + /* stat() /proc/<pid> directory to get uid/gid */ + snprintf(name, 1024, "/proc/%s",entry->d_name); + if (stat(name,&dirstat)) return linux_getnext(); + /* read the job's stat "file" to get command, nice level, etc */ + snprintf(name, 1024, "/proc/%s/stat",entry->d_name); + if (!linux_readproc(name)) return linux_getnext(); + linux_proc.uid = dirstat.st_uid; + linux_proc.gid = dirstat.st_gid; + return &linux_proc; +} + + +struct and_procent *linux_getfirst () +{ + if (linux_procdir) { + rewinddir(linux_procdir); + } else { + linux_procdir = opendir("/proc"); + if (!linux_procdir) { + and_printf(0,"cannot open /proc, aborting.\n"); + abort(); + } + } + return linux_getnext(); +} + + +int main (int argc, char** argv) +{ + and_setprocreader(&linux_getfirst,&linux_getnext); + return and_main(argc,argv); +}