aboutsummaryrefslogtreecommitdiff
path: root/ports-mgmt/portmanager
diff options
context:
space:
mode:
authorMarcus Alves Grando <mnag@FreeBSD.org>2005-11-11 00:32:35 +0000
committerMarcus Alves Grando <mnag@FreeBSD.org>2005-11-11 00:32:35 +0000
commite461ef72df5534e270b5f1ab3d4d9183047533f5 (patch)
tree29699d1738ff00c5d25e82fbac778f90a72c699a /ports-mgmt/portmanager
parentbfb2d623240b5002358b7c42a99f70561314aeda (diff)
downloadports-e461ef72df5534e270b5f1ab3d4d9183047533f5.tar.gz
ports-e461ef72df5534e270b5f1ab3d4d9183047533f5.zip
Update to 0.3.3_3
* Adds ability to stop programs like postfix from running during upgrade then restarts them afterwards. See pm-020.conf-example or man page for instructions * Fixes reported bug where -slid option removes the wrong port * May fix a reported segfault at: MGPMrCreateAllUpdateStatusDb.c:162 since user didn't include portmanager version or uname -a output can't be certain fix is good PR: 88800 Submitted by: Michael C. Shultz <ringworm01@gmail.com> (maintainer)
Notes
Notes: svn path=/head/; revision=147866
Diffstat (limited to 'ports-mgmt/portmanager')
-rw-r--r--ports-mgmt/portmanager/Makefile2
-rw-r--r--ports-mgmt/portmanager/files/patch-0.3.3_3719
2 files changed, 720 insertions, 1 deletions
diff --git a/ports-mgmt/portmanager/Makefile b/ports-mgmt/portmanager/Makefile
index 902ab7d1223b..58745119eaee 100644
--- a/ports-mgmt/portmanager/Makefile
+++ b/ports-mgmt/portmanager/Makefile
@@ -7,7 +7,7 @@
PORTNAME= portmanager
PORTVERSION= 0.3.3
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= sysutils
MASTER_SITES= http://portmanager.sunsite.dk/distfiles/ \
${MASTER_SITE_SOURCEFORGE}
diff --git a/ports-mgmt/portmanager/files/patch-0.3.3_3 b/ports-mgmt/portmanager/files/patch-0.3.3_3
new file mode 100644
index 000000000000..f4893c3dbae3
--- /dev/null
+++ b/ports-mgmt/portmanager/files/patch-0.3.3_3
@@ -0,0 +1,719 @@
+diff -ruN ../0.3.3_2/libMGPM/src/MGPMrCreateAllUpdateStatusDb.c ./libMGPM/src/MGPMrCreateAllUpdateStatusDb.c
+--- ../0.3.3_2/libMGPM/src/MGPMrCreateAllUpdateStatusDb.c Tue Nov 8 17:05:25 2005
++++ ./libMGPM/src/MGPMrCreateAllUpdateStatusDb.c Thu Nov 10 07:57:49 2005
+@@ -159,7 +159,9 @@
+ availablePortsDbIDX = 1;
+ while( availablePortsDbIDX < availablePortsDbQTY )
+ {
+- if( strncmp( MGdbGet( property->availablePortsDb, availablePortsDbIDX, property->fieldAvailablePortsDbFlag ), "0", 1 ) == 0 )
++ if( MGdbGet( property->availablePortsDb, availablePortsDbIDX, property->fieldAvailablePortsDbFlag )
++ &&
++ strncmp( MGdbGet( property->availablePortsDb, availablePortsDbIDX, property->fieldAvailablePortsDbFlag ), "0", 1 ) == 0 )
+ {
+ strcpy( availablePortDir, MGdbGet( property->availablePortsDb, availablePortsDbIDX, property->fieldAvailablePortsDbPortDir ) );
+ strcpy( availablePortName, MGdbGet( property->availablePortsDb, availablePortsDbIDX, property->fieldAvailablePortsDbPortName ) );
+diff -ruN ../0.3.3_2/libMGPM/src/MGPMrReadConfigure.c ./libMGPM/src/MGPMrReadConfigure.c
+--- ../0.3.3_2/libMGPM/src/MGPMrReadConfigure.c Tue Nov 8 17:05:25 2005
++++ ./libMGPM/src/MGPMrReadConfigure.c Wed Nov 9 20:01:21 2005
+@@ -93,6 +93,24 @@
+ strcat( command, property->configConfFileName );
+ system( command );
+ }
++ strcpy( command, "chmod 0600 " );
++ strcat( command, property->configConfFileName );
++ system( command );
++
++ strcpy( command, "chmod 0600 " );
++ strcat( command, property->configConfFileName );
++ strcat( command, ".SAMPLE " );
++ system( command );
++
++ strcpy( command, "chown root:wheel " );
++ strcat( command, property->configConfFileName );
++ system( command );
++
++ strcpy( command, "chown root:wheel " );
++ strcat( command, property->configConfFileName );
++ strcat( command, ".SAMPLE " );
++ system( command );
++
+ /*********************/
+ /* parse pm-020.conf */
+ /*********************/
+diff -ruN ../0.3.3_2/libMGPM/src/MGPMrShowLeavesDelete.c ./libMGPM/src/MGPMrShowLeavesDelete.c
+--- ../0.3.3_2/libMGPM/src/MGPMrShowLeavesDelete.c Tue Nov 8 17:05:25 2005
++++ ./libMGPM/src/MGPMrShowLeavesDelete.c Thu Nov 10 01:03:17 2005
+@@ -30,17 +30,17 @@
+ #include <libMGPM.h>
+ #include <sgtty.h>
+
+-int nuke( char* leafPortDirPtr );
++int nuke( char* leafPortDir );
+ int rebuildDb( structProperty* property, int* installedPortsDbQTY );
+-int removePort( structProperty* property, char* leafPortNamePtr, int installedPortsDbIDX );
++int removePort( structProperty* property, char* leafPortName, int installedPortsDbIDX );
+
+ int MGPMrShowLeavesDelete( structProperty* property )
+ {
+ char exact[] = "exact";
+ char id[] = "MGPMrShowLeavesDelete";
+ char* command = NULL;
+- char* leafPortDirPtr = NULL;
+- char* leafPortNamePtr = NULL;
++ char* leafPortDir = NULL;
++ char* leafPortName = NULL;
+ char* pkgDescFile = NULL;
+ char* portDirPtr = NULL;
+ char* portTypePtr = NULL;
+@@ -49,8 +49,10 @@
+ int installedPortsDbQTY = 0;
+ int key = 1;
+
+- pkgDescFile = (char*)calloc( bufferSize, 1 );
+- command = (char*)calloc( bufferSize, 1 );
++ command = calloc( bufferSize, 1 );
++ leafPortDir = calloc( bufferSize, 1 );
++ leafPortName = calloc( bufferSize, 1 );
++ pkgDescFile = calloc( bufferSize, 1 );
+
+ if( ( property->ignoreDb = MGdbOpen( property->ignoreDbFileName ) ) == NULL )
+ {
+@@ -84,8 +86,8 @@
+ installedPortsDbIDX = 1;
+ while( installedPortsDbIDX < installedPortsDbQTY )
+ {
+- leafPortDirPtr = MGdbGet( property->installedPortsDb, installedPortsDbIDX, property->fieldInstalledPortsDbPortDir );
+- leafPortNamePtr = MGdbGet( property->installedPortsDb, installedPortsDbIDX, property->fieldInstalledPortsDbPortName );
++ strcpy( leafPortDir, MGdbGet( property->installedPortsDb, installedPortsDbIDX, property->fieldInstalledPortsDbPortDir ) );
++ strcpy( leafPortName, MGdbGet( property->installedPortsDb, installedPortsDbIDX, property->fieldInstalledPortsDbPortName ) );
+
+ /*
+ * check for no run depends
+@@ -93,7 +95,7 @@
+ MGdbGoTop( property->dependencyPortsDb );
+ portDirPtr = MGdbSeek( property->dependencyPortsDb,
+ property->fieldDependencyDbDependencyPortDir,
+- leafPortDirPtr,
++ leafPortDir,
+ property->fieldDependencyDbDependencyPortDir,
+ exact );
+
+@@ -105,7 +107,7 @@
+ MGdbGoTop( property->availableDependenciesDb );
+ portTypePtr = MGdbSeek( property->availableDependenciesDb,
+ property->fieldAvailableDependenciesDbDependencyDir,
+- leafPortDirPtr,
++ leafPortDir,
+ property->fieldAvailableDependenciesDbDependType,
+ exact );
+
+@@ -113,7 +115,7 @@
+ {
+ portTypePtr = MGdbSeek( property->availableDependenciesDb,
+ property->fieldAvailableDependenciesDbDependencyDir,
+- leafPortDirPtr,
++ leafPortDir,
+ property->fieldAvailableDependenciesDbDependType,
+ exact );
+ }
+@@ -132,11 +134,11 @@
+ fprintf( stdout, "however, other ports may rely on these to build.\"\n" );
+ fprintf( stdout, "%s\n", SINGLE_LINES );
+
+- fprintf( stdout, "%s dir -=> %s\n\n", leafPortNamePtr, leafPortDirPtr );
++ fprintf( stdout, "%s dir -=> %s\n\n", leafPortName, leafPortDir );
+ while( fflush( stdout ) );
+
+ strcpy( pkgDescFile, PORTSDIR );
+- strcat( pkgDescFile, leafPortDirPtr );
++ strcat( pkgDescFile, leafPortDir );
+ strcat( pkgDescFile, "/pkg-descr" );
+
+ if( MGrIfFileExist( pkgDescFile ) )
+@@ -150,7 +152,7 @@
+ {
+ strcpy( command, "grep COMMENT " );
+ strcat( command, PORTSDIR );
+- strcat( command, leafPortDirPtr );
++ strcat( command, leafPortDir );
+ strcat( command, "/Makefile" );
+ system( command );
+ }
+@@ -167,48 +169,48 @@
+ }
+ case KEY_SPACE:
+ {
+- MGdbAdd( property->ignoreDb, leafPortDirPtr, "-slid <SPACE> skipped", NULL );
+- fprintf( stdout, "<SPACE> Skipping %s\n\n", leafPortNamePtr );
++ MGdbAdd( property->ignoreDb, leafPortDir, "-slid <SPACE> skipped", NULL );
++ fprintf( stdout, "<SPACE> Skipping %s\n\n", leafPortName );
+ break;
+ }
+ case KEY_n:
+ {
+ /* nuke() */
+- fprintf( stdout, "<n> Nuking %s\n\n", leafPortNamePtr );
+- removePort( property, leafPortNamePtr, installedPortsDbIDX );
+- nuke( leafPortDirPtr );
++ fprintf( stdout, "<n> Nuking %s\n\n", leafPortName );
++ removePort( property, leafPortName, installedPortsDbIDX );
++ nuke( leafPortDir );
+ rebuildDb( property, &installedPortsDbQTY );
+ break;
+ }
+ case KEY_N:
+ {
+ /* nuke() */
+- fprintf( stdout, "<N> Nuking %s\n\n", leafPortNamePtr );
+- removePort( property, leafPortNamePtr, installedPortsDbIDX );
+- nuke( leafPortDirPtr );
++ fprintf( stdout, "<N> Nuking %s\n\n", leafPortName );
++ removePort( property, leafPortName, installedPortsDbIDX );
++ nuke( leafPortDir );
+ rebuildDb( property, &installedPortsDbQTY );
+ break;
+ }
+ case KEY_x:
+ {
+ /* delete() */
+- fprintf( stdout, "<x> Removing %s\n\n", leafPortNamePtr );
+- removePort( property, leafPortNamePtr, installedPortsDbIDX );
++ fprintf( stdout, "<x> Removing %s\n\n", leafPortName );
++ removePort( property, leafPortName, installedPortsDbIDX );
+ rebuildDb( property, &installedPortsDbQTY );
+ break;
+ }
+ case KEY_X:
+ {
+ /* delete() */
+- fprintf( stdout, "<X> Removing %s\n\n", leafPortNamePtr );
+- removePort( property, leafPortNamePtr, installedPortsDbIDX );
++ fprintf( stdout, "<X> Removing %s\n\n", leafPortName );
++ removePort( property, leafPortName, installedPortsDbIDX );
+ rebuildDb( property, &installedPortsDbQTY );
+ break;
+ }
+ default:
+ {
+- MGdbAdd( property->ignoreDb, leafPortDirPtr, "-slid <DEFAULT> skipped", NULL );
+- fprintf( stdout, "Skipping %s\n\n", leafPortNamePtr );
++ MGdbAdd( property->ignoreDb, leafPortDir, "-slid <DEFAULT> skipped", NULL );
++ fprintf( stdout, "Skipping %s\n\n", leafPortName );
+ break;
+ }
+ }
+@@ -221,6 +223,9 @@
+ MGdbDestroy( property->ignoreDb );
+ MGdbDestroy( property->installedPortsDb );
+ free( command );
++ free( leafPortDir );
++ free( leafPortName );
++ free( pkgDescFile );
+ return(0);
+ }
+
+@@ -266,7 +271,7 @@
+ }
+
+ /***********************************************************************/
+-int nuke( char* leafPortDirPtr )
++int nuke( char* leafPortDir )
+ {
+ char* command = NULL;
+
+@@ -274,7 +279,7 @@
+
+ strcpy( command, "cd " );
+ strcat( command, PORTSDIR );
+- strcat( command, leafPortDirPtr );
++ strcat( command, leafPortDir );
+ strcat( command, "; make distclean" );
+ fprintf( stdout, "\nexecuting: %s\n", command );
+ while( fflush( stdout ) );
+diff -ruN ../0.3.3_2/libMGPM/src/MGPMrUpdate.c ./libMGPM/src/MGPMrUpdate.c
+--- ../0.3.3_2/libMGPM/src/MGPMrUpdate.c Wed Nov 9 13:24:45 2005
++++ ./libMGPM/src/MGPMrUpdate.c Wed Nov 9 21:54:00 2005
+@@ -41,10 +41,15 @@
+ char* buffer;
+ char* command;
+ char* commandRestart;
++ char* installedPortName;
+ char* newPortDir;
+ char* newPortName;
+ char* optionsCheck;
+ char* optionsDir;
++ char* startPortCmd;
++ char* startPortDir;
++ char* stopPortCmd;
++ char* stopPortDir;
+ char* workDir;
+ } structLocalProperty;
+
+@@ -58,6 +63,8 @@
+ char BROKEN[] = "BROKEN";
+ char FORBIDDEN[] = "FORBIDDEN";
+ char IGNORE[] = "IGNORE";
++ char START[] = "/START";
++ char STOP[] = "/STOP";
+ char backUp[] = "--back-up";
+ char bu[] = "-bu";
+ char exact[] = "exact";
+@@ -71,11 +78,12 @@
+ char* availableDependenciesDbDependencyDirPtr = NULL;
+ char* availableDependenciesDbDependencyNamePtr = NULL;
+ char* bufferBase = NULL;
+- char* installedPortsDbPortNamePtr = NULL;
+ char* ipPtr = NULL;
+ char* oldPortDirPtr = NULL;
+ char* options = NULL;
+ char* stinker = NULL;
++ char* startPortDirPtr = NULL;
++ char* stopPortDirPtr = NULL;
+ char* strikePtr = NULL;
+ int availableDependenciesDbIDX = 0;
+ int availableDependenciesDbQTY = 0;
+@@ -99,12 +107,17 @@
+ localProperty.buffer = (char*)calloc( bufferSize, 1 );
+ localProperty.command = (char*)calloc( bufferSize, 1 );
+ localProperty.commandRestart = (char*)calloc( bufferSize, 1 );
++ localProperty.installedPortName = (char*)calloc( 511, 1 );
+ localProperty.newPortDir = (char*)calloc( 511, 1 );
+ localProperty.newPortName = (char*)calloc( 511, 1 );
+ localProperty.optionsCheck = (char*)calloc( 511, 1 );
+ localProperty.optionsDir = (char*)calloc( 511, 1 );
++ localProperty.startPortCmd = (char*)calloc( 511, 1 );
++ localProperty.startPortDir = (char*)calloc( 511, 1 );
++ localProperty.stopPortCmd = (char*)calloc( 511, 1 );
++ localProperty.stopPortDir = (char*)calloc( 511, 1 );
+ localProperty.workDir = (char*)calloc( 511, 1 );
+-
++
+ property->availableDependenciesDb = MGdbOpen( property->availableDependenciesDbFileName );
+ property->availablePortsDb = MGdbOpen( property->availablePortsDbFileName );
+ property->commandLineDb = MGdbOpen( property->commandLineDbFileName );
+@@ -179,6 +192,63 @@
+ strcpy( localProperty.beforeOptionsFileSize, MGrIntToString( MGrFileSize( localProperty.optionsDir ) ) );
+
+ /*
++ * gather stop/start instructions if they exist
++ */
++ MGdbGoTop( property->configDb );
++ while( MGdbSeek( property->configDb,
++ property->fieldConfigDbKey,
++ STOP,
++ property->fieldConfigDbKey,
++ exact )
++ &&
++ strncmp( oldPortDir,
++ MGdbGet( property->configDb,
++ MGdbGetRecno( property->configDb ) - 1,
++ property->fieldConfigDbValue ),
++ strlen( oldPortDir ) ) == 0 )
++ {
++ stopPortDirPtr = MGdbGet( property->configDb,
++ MGdbGetRecno( property->configDb ) - 1,
++ property->fieldConfigDbValue );
++ if( stopPortDirPtr[strlen( oldPortDir )] == SPACE )
++ {
++ strncpy( localProperty.stopPortDir, stopPortDirPtr, strlen( oldPortDir ) );
++ strcpy( localProperty.stopPortCmd, stopPortDirPtr + strlen( oldPortDir ) + 1 );
++ break;
++ }
++ else
++ {
++ break;
++ }
++ }
++ MGdbGoTop( property->configDb );
++ while( MGdbSeek( property->configDb,
++ property->fieldConfigDbKey,
++ START,
++ property->fieldConfigDbKey,
++ exact )
++ &&
++ strncmp( oldPortDir,
++ MGdbGet( property->configDb,
++ MGdbGetRecno( property->configDb ) - 1,
++ property->fieldConfigDbValue ),
++ strlen( oldPortDir ) ) == 0 )
++ {
++ startPortDirPtr = MGdbGet( property->configDb,
++ MGdbGetRecno( property->configDb ) - 1,
++ property->fieldConfigDbValue );
++ if( startPortDirPtr[strlen( oldPortDir )] == SPACE )
++ {
++ strncpy( localProperty.startPortDir, startPortDirPtr, strlen( oldPortDir ) );
++ strcpy( localProperty.startPortCmd, startPortDirPtr + strlen( oldPortDir ) + 1 );
++ }
++ else
++ {
++ break;
++ }
++ }
++
++ /*
+ * Do update in interactive mode (command line switch -ui )
+ */
+ if( property->interactive )
+@@ -346,6 +416,16 @@
+ * options changed so need to purge oldPortDir's records
+ * from availablePortsDb and availableDependenciesDb
+ */
++ if( property->log )
++ {
++ strcpy( localProperty.command, "echo \" options changed so returning " );
++ strcat( localProperty.command, oldPortName );
++ strcat( localProperty.command, " " );
++ strcat( localProperty.command, oldPortDir );
++ strcat( localProperty.command, " to out of date pool " );
++ strcat( localProperty.command, " \">> /var/log/portmanager.log" );
++ system( localProperty.command );
++ }
+ property->optionsChanged = 1;
+ MGdbGoTop( property->availablePortsDb );
+ while( MGdbSeek( property->availablePortsDb,
+@@ -519,12 +599,13 @@
+ installedPortsDbQTY = MGdbGetRecordQty( property->installedPortsDb );
+ while( installedPortsDbIDX < installedPortsDbQTY )
+ {
+- installedPortsDbPortNamePtr = MGdbGet( property->installedPortsDb, installedPortsDbIDX,
+- property->fieldInstalledPortsDbPortName );
+- stinker = strstr( bufferBase, installedPortsDbPortNamePtr );
++ strcpy( localProperty.installedPortName, MGdbGet( property->installedPortsDb,
++ installedPortsDbIDX,
++ property->fieldInstalledPortsDbPortName ) );
++ stinker = strstr( bufferBase, localProperty.installedPortName );
+ if( stinker )
+ {
+- fprintf( stdout, "OK to remove conflicting port %s Yy/Nn/Aa [Y]\? ", installedPortsDbPortNamePtr );
++ fprintf( stdout, "OK to remove conflicting port %s Yy/Nn/Aa [Y]\? ", localProperty.installedPortName );
+ while( fflush( stdout ) );
+ if( property->autoConflicts == 0 )
+ {
+@@ -585,7 +666,7 @@
+ }
+ }
+ strcpy( localProperty.command, "pkg_delete -f " );
+- strcat( localProperty.command, installedPortsDbPortNamePtr );
++ strcat( localProperty.command, localProperty.installedPortName );
+ fprintf( stdout, "executing: %s\n", localProperty.command );
+ while( fflush( stdout ) );
+ errorCode = system( localProperty.command );
+@@ -918,6 +999,56 @@
+ }
+ else
+ {
++ /*
++ * use localProperty.stopPortCmd if it is defined
++ */
++ if( strcmp( oldPortDir, localProperty.stopPortDir ) == 0 )
++ {
++ fprintf( stdout, "%s %s info: running %s stop command %s\n",
++ id,
++ PACKAGE_VERSION,
++ localProperty.stopPortDir,
++ localProperty.stopPortCmd );
++ while( fflush( stdout ) );
++
++ localProperty.buffer[0] = 0;
++ pHandle = popen( localProperty.stopPortCmd, "r" );
++ fread( localProperty.buffer, bufferSize, 1, pHandle );
++ pclose( pHandle );
++/*
++ idx = 0;
++ while( idx < bufferSize )
++ {
++ if( localProperty.buffer[idx] == LINEFEED
++ ||
++ localProperty.buffer[idx] == TAB
++ ||
++ localProperty.buffer[idx] == SPACE )
++ {
++ localProperty.buffer[idx] = 0;
++ break;
++ }
++ idx++;
++ }
++*/
++ if( property->log )
++ {
++ strcpy( localProperty.command, "echo \" stopping " );
++ strcat( localProperty.command, oldPortName );
++ strcat( localProperty.command, " " );
++ strcat( localProperty.command, oldPortDir );
++ strcat( localProperty.command, " execution by running " );
++ strcat( localProperty.command, localProperty.stopPortCmd );
++ strcat( localProperty.command, " \">> /var/log/portmanager.log" );
++ system( localProperty.command );
++ }
++ fprintf( stdout, "%s reply: %s\n", localProperty.stopPortCmd, localProperty.buffer );
++ while( fflush( stdout ) );
++ }
++
++ /*
++ * remove old port
++ */
+ strcpy( localProperty.command, "pkg_delete -f ");
+ strcat( localProperty.command, oldPortName);
+ fprintf( stdout, "%s\n", SINGLE_LINES );
+@@ -1041,6 +1172,54 @@
+ system( localProperty.command );
+ }
+ }
++
++ /*
++ * use localProperty.startPortCmd if it is defined
++ */
++ if( strcmp( oldPortDir, localProperty.startPortDir ) == 0 )
++ {
++ fprintf( stdout, "%s %s info: running %s start command %s\n",
++ id,
++ PACKAGE_VERSION,
++ localProperty.startPortDir,
++ localProperty.startPortCmd );
++ while( fflush( stdout ) );
++ localProperty.buffer[0] = 0;
++ pHandle = popen( localProperty.startPortCmd, "r" );
++ fread( localProperty.buffer, bufferSize, 1, pHandle );
++ pclose( pHandle );
++/*
++ idx = 0;
++ while( idx < bufferSize )
++ {
++ if( localProperty.buffer[idx] == LINEFEED
++ ||
++ localProperty.buffer[idx] == TAB
++ ||
++ localProperty.buffer[idx] == SPACE )
++ {
++ localProperty.buffer[idx] = 0;
++ break;
++ }
++ idx++;
++ }
++*/
++ if( property->log )
++ {
++ strcpy( localProperty.command, "echo \" starting " );
++ strcat( localProperty.command, oldPortName );
++ strcat( localProperty.command, " " );
++ strcat( localProperty.command, oldPortDir );
++ strcat( localProperty.command, " execution by running " );
++ strcat( localProperty.command, localProperty.startPortCmd );
++ strcat( localProperty.command, " \">> /var/log/portmanager.log" );
++ system( localProperty.command );
++ }
++
++ fprintf( stdout, "%s reply: %s\n", localProperty.startPortCmd, localProperty.buffer );
++ while( fflush( stdout ) );
++ }
++
+ /************************************************************************/
+ /* Command "13" make package */
+ /************************************************************************/
+@@ -1229,10 +1408,15 @@
+ free( localProperty->buffer );
+ free( localProperty->command );
+ free( localProperty->commandRestart );
++ free( localProperty->installedPortName );
+ free( localProperty->newPortDir );
+ free( localProperty->newPortName );
+ free( localProperty->optionsCheck );
+ free( localProperty->optionsDir );
++ free( localProperty->startPortCmd );
++ free( localProperty->startPortDir );
++ free( localProperty->stopPortCmd );
++ free( localProperty->stopPortDir );
+ free( localProperty->workDir );
+
+ return(0);
+diff -ruN ../0.3.3_2/portmanager/pm-020.conf.SAMPLE ./portmanager/pm-020.conf.SAMPLE
+--- ../0.3.3_2/portmanager/pm-020.conf.SAMPLE Tue Nov 8 17:05:25 2005
++++ ./portmanager/pm-020.conf.SAMPLE Wed Nov 9 14:22:48 2005
+@@ -1,42 +1,40 @@
+-#............................................
+-# port manager example configuration file ver 0.2.0
+-#............................................................
+-# the format of portmanager.conf is critical!
+-#
+-# 1. Comments delimited with # should be ok
+-# 2. No leading white space( space or tabs )
+-# 3. Placement of "|" is critical here is the format:
+ #
+-# [port category dir/port dir] | [ all port build options go here ] |
++# port manager example configuration file ver 0.2.0
+ #
+-# 4. white space between port options is ok, and between final "|" and
+-# the start of a comment
++
++CATEGORY/PORT|OPTION=| # do not delete this line!
++
+ #
+-# example:
+-#............................................................
+ # port | options |
+-#............................................................
+-#x11-toolkits/vte|WITH_GLX=yes -DNOCLEAN| # some comment.......
+-#java/jdk14|-DMINIMAL| # anothe comment....
+-#............................................................
+-CATEGORY/PORT|OPTION=| # do not delete this line!
++#
+
+-#####################
+-# custom settings #
+-# remove "#" to use #
+-#####################
+ #textproc/docproj|JADETEX=no|
+ #java/jdk14|-DMINIMAL|
+ #textproc/libxml2|THREADS=off SCHEMA=on MEM_DEBUG=off XMLLINT_HIST=off THREAD_ALLOC=off|
++
+ #
++# do not let portmanager update the following ports
+ #
+-##
+-##do not let portmanager update the following ports
++
+ #IGNORE|editors/openoffice-1.1|
+ #IGNORE|java/jdk14|
+
+-
+-
++#
++# STOP/START these programs if they are updated
++#
++# Stop command will be run after program is built, before
++# old installed version is removed
++#
++# Start command will be run after rebuilt program is
++# installed and successfully registerd
++#
++# note:
++# must have leading "/" in /{category}/{port dir}
++# anything after /{category}/{port dir} is run as
++# a sh shell command
++#
++#STOP|/mail/postfix /usr/local/sbin/postfix stop|
++#START|/mail/postfix /usr/local/sbin/postfix start|
+
+
+
+diff -ruN ../0.3.3_2/portmanager/portmanager.1 ./portmanager/portmanager.1
+--- ../0.3.3_2/portmanager/portmanager.1 Tue Nov 8 17:05:25 2005
++++ ./portmanager/portmanager.1 Wed Nov 9 18:49:17 2005
+@@ -128,24 +128,6 @@
+ .sp
+ http://portmanager.sunsite.dk/
+ .sp
+- \fBMail lists\fR
+-.sp
+-portmanager-questions@sunsite.dk
+-.sp
+-To subscribe send an empty message to:
+- portmanager-questions-subscribe@sunsite.dk
+-.sp
+- archive: http://www.mail-archive.com/portmanager-questions%40sunsite.dk/
+-.sp
+-.sp
+-If you would like to joint portmanager's development team let us know at:
+-portmanager-devel@sunsite.dk
+-.sp
+-To subscribe send an empty message to:
+- portmanager-devel-subscribe@sunsite.dk
+-.sp
+- archive: http://www.mail-archive.com/portmanager-devel%40sunsite.dk/
+-.sp
+ .\"=======================================================================
+ .\".Sh IMPLEMENTATION NOTES
+ .\"=======================================================================
+@@ -166,35 +148,44 @@
+ .sp
+ pm\&-020.conf example:
+ .sp
+- # the format of pm\&-020.conf is critical
+ #
+- # 1. Comments delimited with # should be ok
+- # 2. No leading white space( space or tabs )
+- # 3. Placement of \&"\&|\&" is critical here is the format:
+- #
+- # [port category dir/port dir] \&| [ all port build options go here ] \&|
+- #
+- # 4. white space between port options is ok, and between final \&"\&|\&" and
+- # the start of a comment
+- #
+- # example:
+- #............................................................
+- # port \&| options \&|
+- #............................................................
+- #x11\&-toolkits/vte\&|WITH_GLX=yes \&-DNOCLEAN\&| # some comment.......
+- #java/jdk14\&|\&-DMINIMAL\&| # another comment....
+- #............................................................
+- CATEGORY/PORT\&|OPTION=\&| # do not delete this line
+- #
+- devel/sdl12\&|WITH_NAS=yes\&|
+- editors/openoffice\&-1.1\&|WITH_TTF_BYTECODE_ENABLED=yes\&|
+- java/jdk14\&|WITH_IPV6=yes\&|
+- multimedia/avifile\&|WITH_OPTIMIZED_CFLAGS=yes\&|
+- local/sysutils/portmanager\&|PREFIX=/home/mike/TEMP\&|
+- #
+- #do not let portmanager update the following ports
+- IGNORE\&|editors/openoffice\&-1.1\&|
+- IGNORE\&|java/jdk14\&|
++ # port manager example configuration file ver 0.2.0
++ #
++.sp
++ CATEGORY/PORT\&|OPTION=\&| # do not delete this line!
++.sp
++ #
++ # port \&| options \&|
++ #
++.sp
++ #textproc/docproj\&|JADETEX=no\&|
++ #java/jdk14\&|-DMINIMAL\&|
++ #textproc/libxml2\&|THREADS=off SCHEMA=on MEM_DEBUG=off THREAD_ALLOC=off\&|
++.sp
++ #
++ # do not let portmanager update the following ports
++ #
++.sp
++ #IGNORE\&|editors/openoffice-1.1\&|
++ #IGNORE\&|java/jdk14\&|
++.sp
++ #
++ # STOP/START these programs if they are updated
++ #
++ # Stop command will be run after program is built, before
++ # old installed version is removed
++ #
++ # Start command will be run after rebuilt program is
++ # installed and successfully registerd
++ #
++ # note:
++ # must have leading \&"/\&" in /{category}/{port dir}
++ # anything after /{category}/{port dir} is run as
++ # a sh shell command
++ #
++ #STOP\&|/mail/postfix /usr/local/sbin/postfix stop\&|
++ #START\&|/mail/postfix /usr/local/sbin/postfix start\&|
++.sp
+ .\"=======================================================================
+ .Sh DIAGNOSTICS
+ Detail of how portmanager works
+diff -ruN ../0.3.3_2/programmer-notes.txt ./programmer-notes.txt
+--- ../0.3.3_2/programmer-notes.txt Wed Nov 9 13:24:45 2005
++++ ./programmer-notes.txt Wed Nov 9 22:32:39 2005
+@@ -275,6 +275,15 @@
+ A) Creates database of Installed ports, checks/handles installed ports
+ that are no longerin the ports tree.
+
++=====================================
++
++Bring Joy <clarity256@yahoo.com>
++
++It actually is a good idea, but not so simple to implement. The ports system only
++knows what the current dist file so won't tell you if one is out of date, have to
++do some extra digging for that. Still an option to clean old distfiles and old
++packages as you go would be really nice so I will add your iidea to the long term
++goals list.
+
+ ************** JAVA notes *******************
+