oh, and if I ever get the login confirmation for their stupid bugsite I'll subit it upstream, since you ports guys subscribe to that school of futility :)
-Bob * Bob Beck <b...@obtuse.com> [2009-04-06 09:16]: > * Matthias Kilian <k...@outback.escape.de> [2009-04-05 13:20]: > > On Sun, Apr 05, 2009 at 12:43:07PM -0600, Bob Beck wrote: > > > Someone please have a look, and either commit it or tell me to. > > > > If you add the following patch to the port's makefile, it's ok: > > > > > Ok, how's this.. changed a bit anyway, so we use arc4random_uniform > > Index: Makefile > =================================================================== > RCS file: /cvs/ports/audio/mpd/Makefile,v > retrieving revision 1.16 > diff -u -r1.16 Makefile > --- Makefile 28 Oct 2008 15:21:48 -0000 1.16 > +++ Makefile 6 Apr 2009 15:09:54 -0000 > @@ -2,7 +2,7 @@ > > COMMENT= Music Player Daemon > DISTNAME= mpd-0.13.2 > -PKGNAME= ${DISTNAME}p2 > +PKGNAME= ${DISTNAME}p3 > CATEGORIES= audio > HOMEPAGE= http://www.musicpd.org/ > MAINTAINER= Tobias Ulmer <tobi...@tmux.org> > Index: patches/patch-src_playlist_c > =================================================================== > RCS file: patches/patch-src_playlist_c > diff -N patches/patch-src_playlist_c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-src_playlist_c 6 Apr 2009 15:09:54 -0000 > @@ -0,0 +1,80 @@ > +--- src/playlist.c.orig Fri Jun 13 22:16:16 2008 > ++++ src/playlist.c Mon Apr 6 08:57:25 2009 > +@@ -77,6 +77,13 @@ > + static int playPlaylistOrderNumber(int fd, int orderNum); > + static void randomizeOrder(int start, int end); > + > ++#ifdef __OpenBSD__ > ++#define RANDOM_UB(n) (arc4random_uniform(n)) > ++#else > ++#define RANDOM_UB(n) (random() % (n)) > ++#endif > ++ > ++ > + static void incrPlaylistVersion(void) > + { > + static unsigned long max = ((mpd_uint32) 1 << 31) - 1; > +@@ -647,7 +654,7 @@ > + else > + start = playlist.current + 1; > + if (start < playlist.length) { > +- swap = random() % (playlist.length - start); > ++ swap = RANDOM_UB(playlist.length - start); > + swap += start; > + swapOrder(playlist.length - 1, swap); > + } > +@@ -1189,15 +1196,23 @@ > + } > + } > + > +- for (i = start; i <= end; i++) { > +- ri = random() % (end - start + 1) + start; > +- if (ri == playlist.current) > +- playlist.current = i; > +- else if (i == playlist.current) > +- playlist.current = ri; > +- swapOrder(i, ri); > ++ /* > ++ * Shuffle the Order. > ++ * Use an unbiased Fisher-Yates shuffle. > ++ */ > ++ i = end + 1; > ++ while (i > start + 1) { > ++ ri = RANDOM_UB(i - start); /* 0 <= ri <= len */ > ++ ri += start; > ++ i--; /* i is now the last pertinent index */ > ++ if (i != ri) { /* do nothing if i == ri */ > ++ if (ri == playlist.current) > ++ playlist.current = i; > ++ else if (i == playlist.current) > ++ playlist.current = ri; > ++ swapOrder(i, ri); > ++ } > + } > +- > + } > + > + int setPlaylistRandomStatus(int fd, int status) > +@@ -1281,12 +1296,17 @@ > + i = 0; > + playlist.current = -1; > + } > +- /* shuffle the rest of the list */ > +- for (; i < playlist.length; i++) { > +- ri = random() % (playlist.length - 1) + 1; > +- swapSongs(i, ri); > ++ /* > ++ * shuffle the rest of the list > ++ * Use an unbiased Fisher-Yates shuffle. > ++ */ > ++ i = playlist.length; > ++ while (i > 1) { > ++ ri = RANDOM_UB(i); /* 0 <= ri <= len */ > ++ i--; /* i is now the last pertinent index */ > ++ if (i != ri) /* do nothing if i == ri */ > ++ swapSongs(i, ri); > + } > +- > + incrPlaylistVersion(); > + } > + > -- #!/usr/bin/perl if ((not 0 && not 1) != (! 0 && ! 1)) { print "Larry and Tom must smoke some really primo stuff...\n"; }