This is RdistControl.m in view mode; [Download] [Up]
//====================================================================== // // Portions written by FreemanSoft Inc. // // FreemanSoft disclaims any warranty of any kind, expressed or implied, // as to this source code's fitness for any particular use. // // For more information, use the following electronic mail addresses: // // info@FreemanSoft.com general questions // support@FreemanSoft.com technical questions // //====================================================================== /* Written by * Joe Freeman jfreeman@next.com * RdistControl * * This code has no warranty. * It is provided so that the consumer may maintain and modify it * at their own risk. Use this code at your own risk. */ #import "RdistControl.h" #import "Subprocess.h" #import "PreferencesPanel.h" #import "pathutil.h" #import "common.h" #import "rdistControl.h" // strings entries #import "JumpBackControl.h" /*================================================================ * Private methods *================================================================*/ @implementation RdistControl /*================================================================ * all strings related to rdist are right before runPassTwo: *================================================================*/ - (const char *)buttonImageName { return "JumpBack_notext.tiff"; } - (const char *)buttonAltImageName { return "JumpBack_abort.tiff"; } - (const char *)stringsTable { return "rdistControl"; } - free { [[NXApp delegate] dropDragJumpBackController:self]; return [super free]; } /* * try and figure out if the values have changed * support relative and absolute */ - updateFromTextFields:sender { /* first do the simpler dest path */ if (strcmp(dPathList, [destinationText stringValue])) { /* destination path has changed */ strcpy(dPathList, [destinationText stringValue]); } /* then do the more complicated source path */ if (!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_absolute)) { /* running in absolute mode so text field is full path name */ if (strcmp(sPathList, [sourceText stringValue])){ strcpy(sPathList, [sourceText stringValue]); } } else if (!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_relative)) { /* running in relative mode so only append the base name */ if (strcmp(basename(sPathList), [sourceText stringValue])){ strcpy(basename(sPathList), [sourceText stringValue]); } } return self; } /* figure out our current mode (relative or absolute) and * show path names appropriately */ -updateTextFields:sender { [destinationText setStringValue: dPathList]; if (!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_absolute)) { [sourceText setStringValue: sPathList]; } else if (!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_relative)) { [sourceText setStringValue: basename(sPathList)]; } return self; } #define find_string \ "/usr/bin/find %s -type d ! -exec %s {} \\; -print" - runPassOne:sender { char buf[MAXPATHLEN+1]; char fwPath[MAXPATHLEN+1]; /* writable check executable */ /* assume ok */ canContinue = YES; if (!strcmp(NXGetDefaultValue([NXApp appName],find_no_write), yes_str)) { [[NXBundle mainBundle] getPath: fwPath forResource:file_writable_prog ofType:""]; if (fwPath && *fwPath){ [self setState: PASS_1_RUNNING]; [self logIt: start_pass_1_string]; sprintf(buf, find_string, sPathList,fwPath); subprocessObj = [Subprocess new:buf withDelegate:self andPtySupport:NO andStdErr:YES]; } else { [self logIt: missing_file_writable]; [self abortProcess:self]; } return self; } else { return nil; /* didn't run find */ } return self; } #define line_1 "%s -> localhost" #define line_2 " install %s%s ;" #define line_3 " except_pat lost+found ;" #define line_4 " except_pat %s ;" // first param is verify string // second is removestring #define rdist_script_cmd "nice -19 /usr/ucb/rdist%s%s -w -f - " // first is source dir rest as above // must put cd in before nice cause builtin #define rdist_script_rel "cd %s ; nice -19 /usr/ucb/rdist%s%s -w -f - " // delete files in backup but not in src dir #define rdist_remove_old " -R " // don't delete dest files missing from source #define rdist_keep_old " " // run verify mode don't copy anything #define rdist_verify_only " -v" // run and copy #define rdist_execute " " - runPassTwo:sender { char runString[MAXPATHLEN+1]; char scriptString[MAXPATHLEN+1]; char *removeString; /* pointer used to insert -R if needed */ char *verifyString; /* pointer used to insert -v if needed */ int i; char *exemptStrings; /* returned from app delegate */ int exemptCount; /* returned from app delegate */ char buildPattern[MAXPATHLEN+1]; /* loads from except stream */ int charCnt; /* num copied into buildPattern */ removeString = rdist_keep_old; verifyString = rdist_execute; canContinue = YES; [self setState:PASS_2_RUNNING]; /* now start the backup */ [self logIt:start_pass_2_string]; /* does not work for some reason [logText delete:self]; */ if (!strcmp(NXGetDefaultValue([NXApp appName], dup_default ), dup_update)) removeString = rdist_keep_old; else if (!strcmp(NXGetDefaultValue([NXApp appName], dup_default ), dup_exact)) removeString = rdist_remove_old; if (!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_relative)) sprintf(runString, rdist_script_rel, parentname(sPathList), verifyString, removeString ); else sprintf(runString, rdist_script_cmd, verifyString, removeString ); if (debug_level >= debug_except_pat) fprintf(stderr,"subprocess string is \n%s\n",runString); //subprocessObj = [Subprocess new:runString]; //[subprocessObj setDelegate:self]; subprocessObj = [Subprocess new:runString withDelegate:self andPtySupport:NO andStdErr:YES]; if (!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_relative)) sprintf(scriptString,line_1,basename(sPathList) ); else sprintf(scriptString,line_1,[sourceText stringValue]); [subprocessObj send:scriptString]; if (debug_level >= debug_except_pat) fprintf(stderr,"%s\n",scriptString); sprintf(scriptString,line_2, removeString, [destinationText stringValue]); [subprocessObj send:scriptString]; if (debug_level >= debug_except_pat) fprintf(stderr,"%s\n",scriptString); ///sprintf(scriptString,line_3); ///[subprocessObj send:scriptString]; /* grab the global preferences panel and ask it a question */ [[PreferencesPanel new] getExemptString:&exemptStrings length:&exemptCount]; /* * we need to escape for the sprintf and for the shell * that runs these commands * we no longer sprintf into the buffer, so we only need to escape * special characters one time * the \ does not need to be escaped */ charCnt = 0; buildPattern[0] = '\0'; for ( i = 0 ; i <= exemptCount; i++){ /* note: we go one past end of string so catch that first */ /* this is so we can catch files where no final \n */ if ( i == exemptCount || exemptStrings[i] == '\n' ) { if (charCnt > 0 ) { buildPattern[charCnt]= '\0'; sprintf(scriptString,line_4, buildPattern); if (debug_level >= debug_except_pat) fprintf(stderr,"%s\n",scriptString); [subprocessObj send:scriptString]; [self logIt:" exempting: "]; [self logIt:buildPattern]; [self logIt:"\n"]; charCnt = 0; buildPattern[0] = '\0'; } } else if ( exemptStrings[i] == '$' || exemptStrings[i] == '.' || exemptStrings[i] == '^' ){ buildPattern[charCnt++] = '\\'; buildPattern[charCnt++] = exemptStrings[i]; } else if ( exemptStrings[i] == '\\') { buildPattern[charCnt++] = exemptStrings[i]; } else { buildPattern[charCnt++] = exemptStrings[i]; } } /* should free exemptStrings */ sprintf(scriptString,line_4,[destinationText stringValue]); [subprocessObj send:scriptString]; if (debug_level >= debug_except_pat) fprintf(stderr,"%s\n",scriptString); /* this is to try and protect us from the case where the dest * directory is inside the source folder */ if ((!strcmp(NXGetDefaultValue([NXApp appName],path_default), rdist_relative))&& (strlen(parentname(sPathList))<strlen(parentname(dPathList))) ) if (!strncmp(dPathList,parentname(sPathList), strlen(parentname(sPathList)) ) ){ sprintf(scriptString,line_4, &dPathList[strlen(parentname(sPathList))+1]); [subprocessObj send:scriptString]; } [subprocessObj terminateInput]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.