View | Details | Raw Unified | Return to bug 275921 | Differences between
and this patch

Collapse All | Expand All

(-)misc/ctm/files/patch-r01_fix_warnings_in_mkCTM_mkctm.c (+20 lines)
Line 0 Link Here
1
--- mkCTM/mkctm.c.ORI	2023-12-24 08:11:59.287756000 +0100
2
+++ mkCTM/mkctm.c	2023-12-24 08:14:49.514747000 +0100
3
@@ -113,7 +113,7 @@
4
 }
5
 
6
 int
7
-dirselect(struct dirent *de)
8
+dirselect(const struct dirent *de)
9
 {
10
 	if (!strcmp(de->d_name, "."))	return 0;
11
 	if (!strcmp(de->d_name, ".."))	return 0;
12
@@ -221,7 +221,7 @@
13
 
14
 		{
15
 			u_long l = s2.st_size + 2;
16
-			u_char *cmd = alloca(strlen(buf1)+strlen(buf2)+100);
17
+			char *cmd = alloca(strlen(buf1)+strlen(buf2)+100);
18
 			u_char *ob = malloc(l), *p;
19
 			int j;
20
 			FILE *F;
(-)misc/ctm/files/patch-r02-fix_logf_name_clash_in_mkCTM_mkctm.c (+120 lines)
Line 0 Link Here
1
--- mkCTM/mkctm.c.ORI	2023-12-24 08:03:42.335824000 +0100
2
+++ mkCTM/mkctm.c	2023-12-24 08:04:21.959999000 +0100
3
@@ -42,7 +42,7 @@
4
 int	damage, damage_limit;
5
 int	change;
6
 
7
-FILE	*logf;
8
+FILE	*logfile;
9
 
10
 u_long s1_ignored,	s2_ignored;
11
 u_long s1_bogus,	s2_bogus;
12
@@ -134,7 +134,7 @@
13
 	printf("%s %s%s %u %u %o", 
14
 	    pfx, name, de->d_name, 
15
 	    st->st_uid, st->st_gid, st->st_mode & ~S_IFMT);
16
-	fprintf(logf, "%s %s%s\n", pfx, name, de->d_name);
17
+	fprintf(logfile, "%s %s%s\n", pfx, name, de->d_name);
18
 	if (verbose > 1) {
19
 		fprintf(stderr, "%s %s%s\n", pfx, name, de->d_name);
20
 	}
21
@@ -362,7 +362,7 @@
22
 		strcpy(p, name);  strcat(p, de->d_name); strcat(p, "/");
23
 		DoDir(dir1, dir2, p);
24
 		printf("CTMDR %s%s\n", name, de->d_name);
25
-		fprintf(logf, "CTMDR %s%s\n", name, de->d_name);
26
+		fprintf(logfile, "CTMDR %s%s\n", name, de->d_name);
27
 		if (verbose > 1) {
28
 			fprintf(stderr, "CTMDR %s%s\n", name, de->d_name);
29
 		}
30
@@ -376,7 +376,7 @@
31
 			strcat(buf1, "/"); strcat(buf1, de->d_name);
32
 		m1 = MD5File(buf1, md5_1);
33
 		printf("CTMFR %s%s %s\n", name, de->d_name, m1);
34
-		fprintf(logf, "CTMFR %s%s %s\n", name, de->d_name, m1);
35
+		fprintf(logfile, "CTMFR %s%s %s\n", name, de->d_name, m1);
36
 		if (verbose > 1) {
37
 			fprintf(stderr, "CTMFR %s%s\n", name, de->d_name);
38
 		}
39
@@ -403,14 +403,14 @@
40
 			if (flag_ignore && 
41
 			    !regexec(&reg_ignore, buf1, 0, 0, 0)) {
42
 				(*ignored)++;
43
-				fprintf(logf, "Ignore %s\n", buf1);
44
+				fprintf(logfile, "Ignore %s\n", buf1);
45
 				if (verbose > 2) {
46
 					fprintf(stderr, "Ignore %s\n", buf1);
47
 				}
48
 			} else if (flag_bogus && 
49
 			    !regexec(&reg_bogus, buf1, 0, 0, 0)) {
50
 				(*bogus)++;
51
-				fprintf(logf, "Bogus %s\n", buf1);
52
+				fprintf(logfile, "Bogus %s\n", buf1);
53
 				fprintf(stderr, "Bogus %s\n", buf1);
54
 				damage++;
55
 			} else {
56
@@ -524,8 +524,8 @@
57
 	strcpy(tmpfilename, tmpdir); strcat(tmpfilename, tmpfilebase);
58
 	mktemp(tmpfilename);
59
 
60
-	snprintf(command,command_size,"tar -C %s -cvf %s %s 2>&%d\n",dir2,tmpfilename,de->d_name,fileno(logf));
61
-	fflush(logf);
62
+	snprintf(command,command_size,"tar -C %s -cvf %s %s 2>&%d\n",dir2,tmpfilename,de->d_name,fileno(logfile));
63
+	fflush(logfile);
64
 	ret_val = system(command);
65
 	if (ret_val!=0) errx(1,"The command \"%s\" failed with return value %d",command,ret_val);
66
 	printf("CTMTR ");
67
@@ -576,8 +576,8 @@
68
 		errx(1,"No db/release in %s",buf2);
69
 
70
 	if (release2 > release1) {
71
-		snprintf(command,command_size,"svnadmin dump %s/%s -r %ld:%ld --incremental --deltas 2>&%d > %s\n",dir2,de->d_name,release1+1,release2,fileno(logf),tmpfilename);
72
-		fflush(logf);
73
+		snprintf(command,command_size,"svnadmin dump %s/%s -r %ld:%ld --incremental --deltas 2>&%d > %s\n",dir2,de->d_name,release1+1,release2,fileno(logfile),tmpfilename);
74
+		fflush(logfile);
75
 		ret_val = system(command);
76
 		if (ret_val!=0) errx(1,"The command \"%s\" failed with return value %d",command,ret_val);
77
 		printf("CTMSV %s %ld ", de->d_name, release1);
78
@@ -723,10 +723,10 @@
79
 			flag_bogus = 1;
80
 			break;
81
 		case 'l':
82
-			logf = fopen(optarg, "w");
83
-			if (!logf)
84
+			logfile = fopen(optarg, "w");
85
+			if (!logfile)
86
 				err(1, "%s", optarg);
87
-			setlinebuf(logf);
88
+			setlinebuf(logfile);
89
 			break;
90
 		case 'q':
91
 			verbose--;
92
@@ -742,8 +742,8 @@
93
 	argc -= optind;
94
 	argv += optind;
95
 
96
-	if (!logf)
97
-		logf = fopen(_PATH_DEVNULL, "w");
98
+	if (!logfile)
99
+		logfile = fopen(_PATH_DEVNULL, "w");
100
 
101
 	setbuf(stdout, 0);
102
 
103
@@ -756,7 +756,7 @@
104
 
105
 	fprintf(stderr, "CTM_BEGIN 2.0 %s %s %s %s\n",
106
 		argv[0], argv[1], argv[2], argv[3]);
107
-	fprintf(logf, "CTM_BEGIN 2.0 %s %s %s %s\n",
108
+	fprintf(logfile, "CTM_BEGIN 2.0 %s %s %s %s\n",
109
 		argv[0], argv[1], argv[2], argv[3]);
110
 	printf("CTM_BEGIN 2.0 %s %s %s %s\n",
111
 		argv[0], argv[1], argv[2], argv[3]);
112
@@ -773,7 +773,7 @@
113
 		errx(4, "no changes");
114
 	} else {
115
 		printf("CTM_END ");
116
-		fprintf(logf, "CTM_END\n");
117
+		fprintf(logfile, "CTM_END\n");
118
 		if (strncmp(argv[0],"svn",3) != 0)
119
 			print_stat(stderr, "END: ");
120
 	}
(-)misc/ctm/files/patch-r03-add_symlink_handling_to_mkCTM_mkctm.c (+129 lines)
Line 0 Link Here
1
--- mkCTM/mkctm.c.ORI	2023-12-24 08:18:13.002347000 +0100
2
+++ mkCTM/mkctm.c	2023-12-23 12:00:57.969387000 +0100
3
@@ -32,6 +32,7 @@
4
 #include <err.h>
5
 #include <paths.h>
6
 #include <signal.h>
7
+#include <limits.h>
8
 
9
 #define DEFAULT_IGNORE	"/CVS$|/\\.#|00_TRANS\\.TBL$"
10
 #define DEFAULT_BOGUS	"\\.core$|\\.orig$|\\.rej$|\\.o$"
11
@@ -41,6 +42,7 @@
12
 int	verbose;
13
 int	damage, damage_limit;
14
 int	change;
15
+int	Have_ctm_status, Have_svn_revision;
16
 
17
 FILE	*logfile;
18
 
19
@@ -138,6 +140,10 @@
20
 	if (verbose > 1) {
21
 		fprintf(stderr, "%s %s%s\n", pfx, name, de->d_name);
22
 	}
23
+	if( strcmp( de->d_name, ".ctm_status" ) == 0 )
24
+	  Have_ctm_status = 1;
25
+	if( strcmp( de->d_name, ".svn_revision" ) == 0 )
26
+	  Have_svn_revision = 1;
27
 }
28
 
29
 void
30
@@ -149,6 +155,38 @@
31
 		strcpy(p, name);  strcat(p, de->d_name); strcat(p, "/");
32
 		DoDir(dir1, dir2, p);
33
 		s_same_dirs++;
34
+
35
+	} else if( de->d_type == DT_LNK ) {
36
+
37
+	  char	  lbuf1[ PATH_MAX ];
38
+	  char	  lbuf2[ PATH_MAX ];
39
+	  char*	  buf1;
40
+	  char*	  buf2;
41
+	  ssize_t ret1, ret2;
42
+
43
+	  if( asprintf( &buf1, "%s/%s/%s", dir1, name, de->d_name ) <= 0 )
44
+	    err( 3, "asprintf: %s", dir2 );
45
+	  if( asprintf( &buf2, "%s/%s/%s", dir2, name, de->d_name ) <= 0 )
46
+	    err( 3, "asprintf: %s", dir2 );
47
+
48
+	  if( (ret1 = readlink( buf1, lbuf1, sizeof lbuf1 - 1 )) == -1 )
49
+	    err( 3, "readlink: %s", buf1 );
50
+	  lbuf1[ ret1 ] = '\0';
51
+	  if( (ret2 = readlink( buf2, lbuf2, sizeof lbuf2 - 1 )) == -1 )
52
+	    err( 3, "readlink: %s", buf2 );
53
+	  lbuf2[ ret2 ] = '\0';
54
+
55
+	  if( strcmp( lbuf1, lbuf2 ) == 0 )
56
+	    return;
57
+
58
+	  change++;
59
+
60
+	  name_stat("CTMLC", dir2, name, de);
61
+	  printf( " %s\n", lbuf2 );
62
+
63
+	  free( buf1 );
64
+	  free( buf2 );
65
+
66
 	} else {
67
 		char *buf1 = alloca(strlen(dir1) + strlen(name) + 
68
 			strlen(de->d_name) + 3);
69
@@ -320,6 +360,25 @@
70
 		putchar('\n');
71
 		s_new_dirs++;
72
 		DoDir(dir1, dir2, p);
73
+
74
+	} else if( de->d_type == DT_LNK ) {
75
+
76
+	  char*	  buf2;
77
+	  char	  lbuf[ PATH_MAX ];
78
+	  ssize_t ret;
79
+
80
+	  if( asprintf( &buf2, "%s/%s/%s", dir2, name, de->d_name ) <= 0 )
81
+	    err( 3, "asprintf: %s", dir2 );
82
+
83
+	  if( (ret = readlink( buf2, lbuf, sizeof lbuf - 1 )) == -1 )
84
+	    err( 3, "readlink: %s", buf2 );
85
+	  lbuf[ ret ] = '\0';
86
+
87
+	  name_stat( "CTMLM", dir2, name, de );
88
+	  printf( " %s\n", lbuf );
89
+
90
+	  free( buf2 );
91
+
92
 	} else if (de->d_type == DT_REG) {
93
 		char *buf2 = alloca(strlen(dir2) + strlen(name) + 
94
 			strlen(de->d_name) + 3);
95
@@ -367,6 +426,14 @@
96
 			fprintf(stderr, "CTMDR %s%s\n", name, de->d_name);
97
 		}
98
 		s_del_dirs++;
99
+
100
+	} else if( de->d_type == DT_LNK ) {
101
+
102
+	  printf( "CTMLR %s%s\n", name, de->d_name );
103
+	  fprintf( logfile, "CTMLR %s%s\n", name, de->d_name );
104
+	  if( verbose > 1 )
105
+	    fprintf( stderr, "CTMLR %s%s\n", name, de->d_name );
106
+
107
 	} else if (de->d_type == DT_REG) {
108
 		char *buf1 = alloca(strlen(dir1) + strlen(name) + 
109
 			strlen(de->d_name) + 3);
110
@@ -430,6 +497,10 @@
111
 			nl[*i]->d_type = IFTODT(StatFile(buf)->st_mode);
112
 		if (nl[*i]->d_type == DT_REG || nl[*i]->d_type == DT_DIR)
113
 			break;
114
+
115
+		if( nl[*i]->d_type == DT_LNK )
116
+		  break;
117
+
118
 		(*wrong)++;
119
 		if (verbose > 0)
120
 			fprintf(stderr, "Wrong %s\n", buf);
121
@@ -769,7 +840,7 @@
122
 		errx(1, "damage of %d would exceed %d files", 
123
 			damage, damage_limit);
124
 /* change <= 2 means no change because of .ctm_status and .svn_revision */
125
-	} else if (change < 3) {
126
+	} else if (change < 1 + Have_ctm_status + Have_svn_revision ) {
127
 		errx(4, "no changes");
128
 	} else {
129
 		printf("CTM_END ");
(-)misc/ctm/files/patch-r04-add_symlink_handling_to_ctm (+294 lines)
Line 0 Link Here
1
--- ctm/ctm_pass3.c.ORI	2023-12-23 11:57:49.599008000 +0100
2
+++ ctm/ctm_pass3.c	2023-12-23 14:10:34.822327000 +0100
3
@@ -23,7 +23,7 @@
4
 settime(const char *name, const struct timeval *times)
5
 {
6
 	if (SetTime)
7
-	    if (utimes(name,times)) {
8
+	    if (lutimes(name,times)) {
9
 		warn("utimes(): %s", name);
10
 		return -1;
11
 	    }
12
@@ -33,7 +33,7 @@
13
 int
14
 setmodefromchar(const char *name, const u_char *mode)
15
 {
16
-	return chmod(name, strtol(mode, NULL, 8));
17
+	return lchmod(name, strtol(mode, NULL, 8));
18
 }
19
 
20
 int
21
@@ -45,6 +45,7 @@
22
     intmax_t cnt,rel;
23
     char *svn_command = NULL;
24
     u_char *md5=0,*md5before=0,*trash=0,*name=0,*uid=0,*gid=0,*mode=0;
25
+    u_char* targetname = NULL;
26
     struct CTM_Syntax *sp;
27
     FILE *ed=0, *fd_to;
28
     struct stat st;
29
@@ -124,6 +125,7 @@
30
 	Delete(md5before);
31
 	Delete(trash);
32
 	Delete(name);
33
+	Delete( targetname );
34
 	cnt = -1;
35
 
36
 	GETFIELD(p,' ');
37
@@ -198,6 +200,10 @@
38
 			}
39
 		    }
40
 		    break;
41
+		case CTM_F_Targetname:
42
+		  //GETNAMECOPY( targetname, sep, j, Verbose );
43
+		  GETFIELDCOPY( targetname, sep );
44
+		  break;
45
 		default: WRONG
46
 		}
47
 	    }
48
@@ -337,6 +343,74 @@
49
 	}
50
 	if(!strcmp(sp->Key,"TR") || !strcmp(sp->Key,"SV"))
51
 	    continue;
52
+
53
+
54
+	if( strcmp( sp->Key, "LR" ) == 0 || strcmp( sp->Key, "LC" ) == 0 ) {
55
+
56
+	  /* Ignore KeepIt if this is a LINKCHANGE command. The whole
57
+	   * KeepIt option ist shitty and should go away...
58
+	   */
59
+	  if( KeepIt && strcmp( sp->Key, "LC" ) != 0 ) {
60
+	    if( Verbose > 1 )
61
+	      printf( " <%s> not removed\n", name );
62
+
63
+	  } else {
64
+	    if( unlink( name )) {
65
+	      fprintf( stderr, "unlink %s: %s\n", name, strerror( errno ));
66
+	      WRONG
67
+	    }
68
+	  }
69
+
70
+	  if( strcmp( sp->Key, "LR" ) == 0 )		// done if it's no LC
71
+	    continue;
72
+	}
73
+
74
+
75
+	if( strcmp( sp->Key, "LM" ) == 0 || strcmp( sp->Key, "LC" ) == 0 ) {
76
+
77
+	  char* bn;					// basename
78
+	  char  cwd[ PATH_MAX ];
79
+
80
+	  if( getcwd( cwd, sizeof cwd ) == NULL ) {
81
+	    fprintf( stderr, "getcwd: %s\n", strerror( errno ) );
82
+	    WRONG
83
+	  }
84
+
85
+	  if( (bn = strrchr( name, '/' )) == NULL )	// no path component
86
+	    bn = name;					// basename
87
+
88
+	  else {					// have path component
89
+	    *bn++ = '\0';				// terminate path component
90
+	    if( chdir( name )) {
91
+	      fprintf( stderr, "chdir %s: %s\n", name, strerror( errno ));
92
+	      WRONG
93
+	    }
94
+	  }
95
+
96
+	  if( symlink( targetname, bn )) {
97
+	    fprintf( stderr, "symlink %s to %s: %s\n", targetname, bn, strerror( errno ));
98
+	    WRONG
99
+	  }
100
+
101
+	  if( chdir( cwd )) {				// go back
102
+	    fprintf( stderr, "chdir %s: %s\n", cwd, strerror( errno ));
103
+	    WRONG
104
+	  }
105
+
106
+	  *--bn = '/';					// restore name with path
107
+	  if( lstat( name, &st )) {
108
+	    fprintf( stderr, "stat %s: %s\n", name, strerror( errno ));
109
+	    WRONG
110
+	  } else if( (st.st_mode & S_IFMT) != S_IFLNK ) {
111
+	    fprintf( stderr, "%s: no link\n", name );
112
+	    WRONG
113
+	  }
114
+
115
+	  if( settime( name, times )) WRONG
116
+	  if( setmodefromchar( name, mode )) WRONG
117
+	  continue;
118
+	}
119
+
120
 	WRONG
121
     }
122
 
123
--- ctm/ctm.h.ORI	2023-12-23 11:57:49.572644000 +0100
124
+++ ctm/ctm.h	2023-12-23 12:47:56.115821000 +0100
125
@@ -25,6 +25,7 @@
126
 #include <sys/file.h>
127
 #include <sys/time.h>
128
 #include <stdint.h>
129
+#include <limits.h>
130
 
131
 #define VERSION "2.0"
132
 
133
@@ -43,6 +45,7 @@
134
 #define CTM_F_Bytes		0x07
135
 #define CTM_F_Release		0x08
136
 #define CTM_F_Forward		0x09
137
+#define CTM_F_Targetname	0x0a
138
 
139
 /* The qualifiers... */
140
 #define CTM_Q_MASK		0xff00
141
@@ -51,6 +54,7 @@
142
 #define CTM_Q_Name_New		0x0400
143
 #define CTM_Q_Name_Subst	0x0800
144
 #define CTM_Q_Name_Svnbase	0x1000
145
+#define CTM_Q_Name_Link		0x2000
146
 #define CTM_Q_MD5_After		0x0100
147
 #define CTM_Q_MD5_Before	0x0200
148
 #define CTM_Q_MD5_Chunk		0x0400
149
--- ctm/ctm_syntax.c.ORI	2023-12-23 11:57:49.601331000 +0100
150
+++ ctm/ctm_syntax.c	2023-12-23 13:52:50.585780000 +0100
151
@@ -68,6 +68,16 @@
152
 static int ctmSV[] = /* Forward to svnadmin load */
153
     { Name|Dir|Svnbase, Release, Count, Forward|SVN, 0 };
154
 
155
+static int ctmLM[] = /* Link Make */
156
+    { Name|CTM_Q_Name_Link|New, Uid, Gid, Mode, CTM_F_Targetname, 0 };
157
+
158
+static int ctmLR[] = /* Link Remove */
159
+    { Name|CTM_Q_Name_Link, 0 };
160
+
161
+static int ctmLC[] = /* Link Change */
162
+    { Name|CTM_Q_Name_Link, Uid, Gid, Mode, CTM_F_Targetname, 0 };
163
+
164
+
165
 struct CTM_Syntax Syntax[] = {
166
     { "FM",  	ctmFM },
167
     { "FS",  	ctmFS },
168
@@ -79,4 +89,7 @@
169
     { "DR",  	ctmDR },
170
     { "TR",  	ctmTR },
171
     { "SV",  	ctmSV },
172
+    { "LM",  	ctmLM },
173
+    { "LR",  	ctmLR },
174
+    { "LC",  	ctmLC },
175
     { 0,    	0} };
176
--- ctm/ctm_pass2.c.ORI	2023-12-24 08:26:35.301188000 +0100
177
+++ ctm/ctm_pass2.c	2023-12-24 08:28:13.320082000 +0100
178
@@ -105,14 +105,14 @@
179
 		    /* XXX Check DR DM rec's for parent-dir */
180
 		    if(j & CTM_Q_Name_New) {
181
 			/* XXX Check DR FR rec's for item */
182
-			if(-1 != stat(name,&st)) {
183
+			if(-1 != lstat(name,&st)) {
184
 			    fprintf(stderr,"  %s: %s exists.\n",
185
 				sp->Key,name);
186
 			    ret |= Exit_Forcible;
187
 			}
188
 			break;
189
 		    }
190
-		    if(-1 == stat(name,&st)) {
191
+		    if(-1 == lstat(name,&st)) {
192
 			fprintf(stderr,"  %s: %s doesn't exist.\n",
193
 			    sp->Key,name);
194
 		        if (sp->Key[1] == 'R')
195
@@ -161,10 +161,18 @@
196
 			}
197
 			break;
198
 		    }
199
+		    if( j & CTM_Q_Name_Link ) {
200
+		      if( ( st.st_mode & S_IFMT ) != S_IFLNK ) {
201
+			fprintf( stderr, "  %s: %s exist, but isn't link.\n", sp->Key,name );
202
+			ret |= Exit_NotOK;
203
+		      }
204
+		      break;
205
+		    }
206
 		    break;
207
 		case CTM_F_Uid:
208
 		case CTM_F_Gid:
209
 		case CTM_F_Mode:
210
+		case CTM_F_Targetname:
211
 		    GETFIELD(p,sep);
212
 		    break;
213
 		case CTM_F_MD5:
214
--- ctm/ctm_pass1.c.ORI	2023-12-23 11:57:49.594016000 +0100
215
+++ ctm/ctm_pass1.c	2023-12-23 14:10:21.518737000 +0100
216
@@ -27,6 +27,7 @@
217
     int i,j,sep;
218
     intmax_t cnt, rel;
219
     u_char *md5=0,*name=0,*trash=0;
220
+    u_char* targetname = NULL;
221
     struct CTM_Syntax *sp;
222
     int slashwarn=0, match=0, total_matches=0;
223
     unsigned current;
224
@@ -71,6 +72,7 @@
225
 	Delete(md5);
226
 	Delete(name);
227
 	Delete(trash);
228
+	Delete( targetname );
229
 	cnt = -1;
230
 	/* if a filter list is defined we assume that all pathnames require
231
 	   an action opposite to that requested by the first filter in the
232
@@ -224,6 +226,9 @@
233
 			return Exit_Garbage;
234
 		    }
235
 		    GETFORWARD(cnt,NULL);
236
+		    break;
237
+		case CTM_F_Targetname:
238
+		    GETFIELDCOPY( targetname, sep );
239
 		    break;
240
 		default:
241
 			fprintf(stderr,"List = 0x%x\n",j);
242
--- ctm/ctm_passb.c.ORI	2023-04-25 21:04:20.000000000 +0200
243
+++ ctm/ctm_passb.c	2023-12-23 14:24:56.893291000 +0100
244
@@ -26,6 +26,7 @@
245
     MD5_CTX ctx;
246
     int i,j,sep,cnt;
247
     u_char *md5=0,*md5before=0,*trash=0,*name=0,*uid=0,*gid=0,*mode=0;
248
+    u_char* targetname = NULL;
249
     struct CTM_Syntax *sp;
250
     FILE *b = 0;	/* backup command */
251
     u_char buf[BUFSIZ];
252
@@ -57,6 +58,7 @@
253
 	Delete(md5before);
254
 	Delete(trash);
255
 	Delete(name);
256
+	Delete( targetname );
257
 	cnt = -1;
258
 
259
 	GETFIELD(p,' ');
260
@@ -90,6 +92,7 @@
261
 		    break;
262
 		case CTM_F_Count: GETBYTECNT(cnt,sep); break;
263
 		case CTM_F_Bytes: GETDATA(trash,cnt); break;
264
+                case CTM_F_Targetname: GETFIELDCOPY( targetname, sep ); break;
265
 		default: WRONG
266
 		}
267
 	    }
268
@@ -98,7 +101,7 @@
269
 	if(name[j] == '/') name[j] = '\0';
270
 
271
 	if (KeepIt && 
272
-	    (!strcmp(sp->Key,"DR") || !strcmp(sp->Key,"FR")))
273
+	    (!strcmp(sp->Key,"DR") || !strcmp(sp->Key,"LR") || !strcmp(sp->Key,"FR")))
274
 	    continue;
275
 		
276
 	/* match the name against the elements of the filter list.  The
277
@@ -113,7 +116,9 @@
278
 	if (CTM_FILTER_DISABLE == match)
279
 		continue;
280
 
281
+	// Do we have to backup symlinks???
282
 	if (!strcmp(sp->Key,"FS") || !strcmp(sp->Key,"FN") ||
283
+	    !strcmp(sp->Key,"LR") || !strcmp(sp->Key,"LC") || 
284
 	    !strcmp(sp->Key,"AS") || !strcmp(sp->Key,"DR") || 
285
 	    !strcmp(sp->Key,"FR")) {
286
 	    /* send name to the archiver for a backup */
287
@@ -135,6 +140,7 @@
288
     Delete(md5before);
289
     Delete(trash);
290
     Delete(name);
291
+    Delete( targetname );
292
 
293
     q = MD5End (&ctx,md5_1);
294
     GETFIELD(p,'\n');			/* <MD5> */
(-)misc/ctm/files/patch-r05-add_ownermail_to_ctm__smail_ctm__smail.c (+156 lines)
Line 0 Link Here
1
--- ctm_smail/ctm_smail.c.ORI	2023-04-25 21:04:20.000000000 +0200
2
+++ ctm_smail/ctm_smail.c	2019-07-29 03:53:20.090358000 +0200
3
@@ -32,18 +32,18 @@
4
 #define LINE_LENGTH	72	/* Chars per encoded line. Divisible by 4. */
5
 
6
 int chop_and_send_or_queue(FILE *dfp, char *delta, off_t ctm_size,
7
-	long max_msg_size, char *mail_alias, char *queue_dir);
8
+	long max_msg_size, char *mail_alias, char *owner_alias, char *queue_dir);
9
 int chop_and_send(FILE *dfp, char *delta, long msg_size, int npieces,
10
-	char *mail_alias);
11
+	char *mail_alias, char *owner_alias);
12
 int chop_and_queue(FILE *dfp, char *delta, long msg_size, int npieces,
13
-	char *mail_alias, char *queue_dir);
14
+	char *mail_alias, char *owner_alias, char *queue_dir);
15
 void clean_up_queue(char *queue_dir);
16
 int encode_body(FILE *sm_fp, FILE *delta_fp, long msg_size, unsigned *sum);
17
-void write_header(FILE *sfp, char *mail_alias, char *delta, int pce,
18
+void write_header(FILE *sfp, char *mail_alias, char *owner_alias, char *delta, int pce,
19
 	int npieces);
20
 void write_trailer(FILE *sfp, unsigned sum);
21
 int apologise(char *delta, off_t ctm_size, long max_ctm_size,
22
-	char *mail_alias, char *queue_dir);
23
+	char *mail_alias, char *owner_alias, char *queue_dir);
24
 FILE *open_sendmail(void);
25
 int close_sendmail(FILE *fp);
26
 
27
@@ -53,6 +53,7 @@
28
     int status = 0;
29
     char *delta_file;
30
     char *mail_alias;
31
+    char *owner_alias = NULL;
32
     long max_msg_size = DEF_MAX_MSG;
33
     long max_ctm_size = 0;
34
     char *log_file = NULL;
35
@@ -63,11 +64,12 @@
36
 
37
     err_prog_name(argv[0]);
38
 
39
-    OPTIONS("[-l log] [-m maxmsgsize] [-c maxctmsize] [-q queuedir] ctm-delta mail-alias")
40
+    OPTIONS("[-l log] [-m maxmsgsize] [-c maxctmsize] [-q queuedir] [-o owner_alias] ctm-delta mail-alias")
41
 	NUMBER('m', max_msg_size)
42
 	NUMBER('c', max_ctm_size)
43
 	STRING('l', log_file)
44
 	STRING('q', queue_dir)
45
+	STRING('o', owner_alias)
46
     ENDOPTS
47
 
48
     if (argc != 3)
49
@@ -91,11 +93,11 @@
50
 	}
51
 
52
     if (max_ctm_size != 0 && sb.st_size > max_ctm_size)
53
-	status = apologise(delta, sb.st_size, max_ctm_size, mail_alias,
54
+	status = apologise(delta, sb.st_size, max_ctm_size, mail_alias, owner_alias,
55
 		queue_dir);
56
     else
57
 	status = chop_and_send_or_queue(dfp, delta, sb.st_size, max_msg_size,
58
-		mail_alias, queue_dir);
59
+		mail_alias, owner_alias, queue_dir);
60
 
61
     fclose(dfp);
62
 
63
@@ -109,7 +111,7 @@
64
  */
65
 int
66
 chop_and_send_or_queue(FILE *dfp, char *delta, off_t ctm_size,
67
-	long max_msg_size, char *mail_alias, char *queue_dir)
68
+	long max_msg_size, char *mail_alias, char *owner_alias, char *queue_dir)
69
     {
70
     int npieces;
71
     long msg_size;
72
@@ -133,10 +135,10 @@
73
 #undef howmany
74
 
75
     if (queue_dir == NULL)
76
-	status = chop_and_send(dfp, delta, msg_size, npieces, mail_alias);
77
+	status = chop_and_send(dfp, delta, msg_size, npieces, mail_alias, owner_alias);
78
     else
79
 	{
80
-	status = chop_and_queue(dfp, delta, msg_size, npieces, mail_alias,
81
+	status = chop_and_queue(dfp, delta, msg_size, npieces, mail_alias, owner_alias,
82
 		queue_dir);
83
 	if (status)
84
 	    clean_up_queue(queue_dir);
85
@@ -152,7 +154,7 @@
86
  */
87
 int
88
 chop_and_send(FILE *dfp, char *delta, long msg_size, int npieces,
89
-	char *mail_alias)
90
+	char *mail_alias, char *owner_alias)
91
     {
92
     int pce;
93
     FILE *sfp;
94
@@ -171,7 +173,7 @@
95
 	if ((sfp = open_sendmail()) == NULL)
96
 	    return 1;
97
 
98
-	write_header(sfp, mail_alias, delta, pce, npieces);
99
+	write_header(sfp, mail_alias, owner_alias, delta, pce, npieces);
100
 	read_error = encode_body(sfp, dfp, msg_size, &sum);
101
 	if (!read_error)
102
 	    write_trailer(sfp, sum);
103
@@ -204,7 +206,7 @@
104
  */
105
 int
106
 chop_and_queue(FILE *dfp, char *delta, long msg_size, int npieces,
107
-	char *mail_alias, char *queue_dir)
108
+	char *mail_alias, char *owner_alias, char *queue_dir)
109
     {
110
     int pce;
111
     FILE *qfp;
112
@@ -228,7 +230,7 @@
113
 	    return 1;
114
 	    }
115
 
116
-	write_header(qfp, mail_alias, delta, pce, npieces);
117
+	write_header(qfp, mail_alias, owner_alias, delta, pce, npieces);
118
 	if (encode_body(qfp, dfp, msg_size, &sum))
119
 	    return 1;
120
 	write_trailer(qfp, sum);
121
@@ -381,9 +383,12 @@
122
  * Write the mail header and data header.
123
  */
124
 void
125
-write_header(FILE *sfp, char *mail_alias, char *delta, int pce, int npieces)
126
+write_header(FILE *sfp, char *mail_alias, char *owner_alias, char *delta, int pce, int npieces)
127
     {
128
-    fprintf(sfp, "From: owner-%s\n", mail_alias);
129
+    if (owner_alias == NULL) 
130
+        fprintf(sfp, "From: owner-%s\n", mail_alias);
131
+    else
132
+        fprintf(sfp, "From: %s\n", owner_alias);
133
     fprintf(sfp, "To: %s\n", mail_alias);
134
     fprintf(sfp, "Subject: ctm-mail %s %d/%d\n\n", delta, pce, npieces);
135
 
136
@@ -406,7 +411,7 @@
137
  * Returns 0 on success, 1 on failure.
138
  */
139
 int
140
-apologise(char *delta, off_t ctm_size, long max_ctm_size, char *mail_alias,
141
+apologise(char *delta, off_t ctm_size, long max_ctm_size, char *mail_alias, char *owner_alias,
142
 	char *queue_dir)
143
     {
144
     FILE *sfp;
145
@@ -430,7 +435,10 @@
146
 	}
147
 
148
 
149
-    fprintf(sfp, "From: owner-%s\n", mail_alias);
150
+    if (owner_alias == NULL)
151
+        fprintf(sfp, "From: owner-%s\n", mail_alias);
152
+    else
153
+        fprintf(sfp, "From: %s\n", owner_alias);
154
     fprintf(sfp, "To: %s\n", mail_alias);
155
     fprintf(sfp, "Subject: ctm-notice %s\n\n", delta);
156
 

Return to bug 275921