[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#562295: and: FTBFS on GNU/kFreeBSD



Package: and
Version: 1.2.2-3
Severity: important
Tags: patch
User: debian-bsd@lists.debian.org
Usertags: kfreebsd

Hi,

your package FTBFS on GNU/kFreeBSD because it needs a little
buildsys-related porting. I did so by using a variable to gather all CC
settings for architectures supported by Debian (Linux, GNU(/Hurd) and
GNU/kFreeBSD). There's also the '/' pitfall meaning it's needed to tweak
ARCH a bit before using it in a filename. As for the addition of the
and-GNU_kFreeBSD.c file, I've used and-GNU.c

Thanks for considering.

Mraw,
KiBi.
--- a/Makefile
+++ b/Makefile
@@ -89,13 +89,14 @@ MANPAGES=and.8 and.conf.5 and.priorities
 #
 # Determine architecture from uname(1)
 #
-ARCH=$(shell uname)
+ARCH=$(shell uname|sed 's,/,_,')
 
 #
 # Architecture-dependent settings: ANSI C compiler and linker
 #
+DEBIAN_GCC = gcc -ansi -pedantic -Wall -g
 ifeq (${ARCH},Linux)
-  CC = gcc -ansi -pedantic -Wall -g
+  CC = $(DEBIAN_GCC)
   LD = gcc
   LIBS =
 else
@@ -127,7 +128,12 @@ ifeq (${ARCH},IRIX64)
   LD = cc
 else
 ifeq (${ARCH},GNU)
-  CC = gcc -ansi -pedantic -Wall -g
+  CC = $(DEBIAN_GCC)
+  LD = gcc
+  LIBS =
+else
+ifeq (${ARCH},GNU_kFreeBSD)
+  CC = $(DEBIAN_GCC)
   LD = gcc
   LIBS =
 else
@@ -143,6 +149,7 @@ endif
 endif
 endif
 endif
+endif
 
 
 #
@@ -189,6 +196,8 @@ and-SunOS.o: and.h and-OSF1.c
 and-GNU.o: and.h and-GNU.c
 	$(CC) -c and-GNU.c
 
+and-GNU_kFreeBSD.o: and.h and-GNU_kFreeBSD.c
+	$(CC) -c and-GNU_kFreeBSD.c
 
 #
 # Create script for SysV init
--- /dev/null
+++ b/and-GNU_kFreeBSD.c
@@ -0,0 +1,136 @@
+/*
+
+    AND auto nice daemon - renice programs according to their CPU usage.
+    Copyright (C) 1999-2003 Patrick Schemitz <schemitz@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, <schemitz@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);
+}

Reply to: