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-fix_recreating_failure_in_ctm_ctm__pass2.c (+35 lines)
Line 0 Link Here
1
--- ctm/ctm_pass2.c.ORI	2023-12-29 08:41:10.082775000 +0100
2
+++ ctm/ctm_pass2.c	2023-12-29 08:43:18.156987000 +0100
3
@@ -15,6 +15,8 @@
4
 #include "ctm.h"
5
 #define BADREAD 32
6
 
7
+char LastRemoved[ PATH_MAX + 1 ] = "";
8
+
9
 /*---------------------------------------------------------------------------*/
10
 /* Pass2 -- Validate the incoming CTM-file.
11
  */
12
@@ -86,6 +88,11 @@
13
 	    switch (j & CTM_F_MASK) {
14
 		case CTM_F_Name:
15
 		    GETNAMECOPY(name,sep,j,0);
16
+
17
+		    /* If we remove anything, record its name */
18
+		    if( strcmp(sp->Key,"FR") == 0 || strcmp(sp->Key,"DR") == 0 || strcmp(sp->Key,"LR") == 0 )
19
+		      strncpy( LastRemoved, name, sizeof LastRemoved -1 );
20
+
21
 		    /* If `keep' was specified, we won't remove any files,
22
 		       so don't check if the file exists */
23
 		    if (KeepIt &&
24
@@ -104,6 +111,11 @@
25
 
26
 		    /* XXX Check DR DM rec's for parent-dir */
27
 		    if(j & CTM_Q_Name_New) {
28
+
29
+			/* Don't check for existence of the new item if it had
30
+			   been removed just before. */
31
+			if( strcmp( LastRemoved, name ) != 0 )
32
+
33
 			/* XXX Check DR FR rec's for item */
34
 			if(-1 != stat(name,&st)) {
35
 			    fprintf(stderr,"  %s: %s exists.\n",
(-)misc/ctm/files/patch-r04-fix_ignoring_to_few_changes_in_mkCTM_mkctm.c (+38 lines)
Line 0 Link Here
1
--- mkCTM/mkctm.c.ORI	2023-12-29 08:47:22.656993000 +0100
2
+++ mkCTM/mkctm.c	2023-12-29 08:48:29.101390000 +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
@@ -769,7 +839,7 @@
31
 		errx(1, "damage of %d would exceed %d files", 
32
 			damage, damage_limit);
33
 /* change <= 2 means no change because of .ctm_status and .svn_revision */
34
-	} else if (change < 3) {
35
+	} else if (change < 1 + Have_ctm_status + Have_svn_revision ) {
36
 		errx(4, "no changes");
37
 	} else {
38
 		printf("CTM_END ");
(-)misc/ctm/files/patch-r10-add_symlink_handling_to_mkCTM_mkctm.c (+94 lines)
Line 0 Link Here
1
--- mkCTM/mkctm.c.ORI	2023-12-29 09:07:16.210417000 +0100
2
+++ mkCTM/mkctm.c	2023-12-29 09:07:16.211918000 +0100
3
@@ -155,6 +155,39 @@
4
 		strcpy(p, name);  strcat(p, de->d_name); strcat(p, "/");
5
 		DoDir(dir1, dir2, p);
6
 		s_same_dirs++;
7
+
8
+	} else if( de->d_type == DT_LNK ) {
9
+
10
+	  char	  lbuf1[ PATH_MAX ];
11
+	  char	  lbuf2[ PATH_MAX ];
12
+	  char*	  buf1;
13
+	  char*	  buf2;
14
+	  ssize_t ret1, ret2;
15
+
16
+	  if( asprintf( &buf1, "%s/%s/%s", dir1, name, de->d_name ) <= 0 )
17
+	    err( 3, "asprintf: %s", dir2 );
18
+	  if( asprintf( &buf2, "%s/%s/%s", dir2, name, de->d_name ) <= 0 )
19
+	    err( 3, "asprintf: %s", dir2 );
20
+
21
+	  if( (ret1 = readlink( buf1, lbuf1, sizeof lbuf1 - 1 )) == -1 )
22
+	    err( 3, "readlink: %s", buf1 );
23
+	  lbuf1[ ret1 ] = '\0';
24
+	  if( (ret2 = readlink( buf2, lbuf2, sizeof lbuf2 - 1 )) == -1 )
25
+	    err( 3, "readlink: %s", buf2 );
26
+	  lbuf2[ ret2 ] = '\0';
27
+
28
+	  if( strcmp( lbuf1, lbuf2 ) == 0 )
29
+	    return;
30
+
31
+	  change++;
32
+
33
+	  printf( "CTMLR %s%s\n", name, de->d_name );
34
+	  name_stat("CTMLM", dir2, name, de);
35
+	  printf( " %s\n", lbuf2 );
36
+
37
+	  free( buf1 );
38
+	  free( buf2 );
39
+
40
 	} else {
41
 		char *buf1 = alloca(strlen(dir1) + strlen(name) + 
42
 			strlen(de->d_name) + 3);
43
@@ -326,6 +359,25 @@
44
 		putchar('\n');
45
 		s_new_dirs++;
46
 		DoDir(dir1, dir2, p);
47
+
48
+	} else if( de->d_type == DT_LNK ) {
49
+
50
+	  char*	  buf2;
51
+	  char	  lbuf[ PATH_MAX ];
52
+	  ssize_t ret;
53
+
54
+	  if( asprintf( &buf2, "%s/%s/%s", dir2, name, de->d_name ) <= 0 )
55
+	    err( 3, "asprintf: %s", dir2 );
56
+
57
+	  if( (ret = readlink( buf2, lbuf, sizeof lbuf - 1 )) == -1 )
58
+	    err( 3, "readlink: %s", buf2 );
59
+	  lbuf[ ret ] = '\0';
60
+
61
+	  name_stat( "CTMLM", dir2, name, de );
62
+	  printf( " %s\n", lbuf );
63
+
64
+	  free( buf2 );
65
+
66
 	} else if (de->d_type == DT_REG) {
67
 		char *buf2 = alloca(strlen(dir2) + strlen(name) + 
68
 			strlen(de->d_name) + 3);
69
@@ -373,6 +425,14 @@
70
 			fprintf(stderr, "CTMDR %s%s\n", name, de->d_name);
71
 		}
72
 		s_del_dirs++;
73
+
74
+	} else if( de->d_type == DT_LNK ) {
75
+
76
+	  printf( "CTMLR %s%s\n", name, de->d_name );
77
+	  fprintf( logfile, "CTMLR %s%s\n", name, de->d_name );
78
+	  if( verbose > 1 )
79
+	    fprintf( stderr, "CTMLR %s%s\n", name, de->d_name );
80
+
81
 	} else if (de->d_type == DT_REG) {
82
 		char *buf1 = alloca(strlen(dir1) + strlen(name) + 
83
 			strlen(de->d_name) + 3);
84
@@ -436,6 +496,10 @@
85
 			nl[*i]->d_type = IFTODT(StatFile(buf)->st_mode);
86
 		if (nl[*i]->d_type == DT_REG || nl[*i]->d_type == DT_DIR)
87
 			break;
88
+
89
+		if( nl[*i]->d_type == DT_LNK )
90
+		  break;
91
+
92
 		(*wrong)++;
93
 		if (verbose > 0)
94
 			fprintf(stderr, "Wrong %s\n", buf);
(-)misc/ctm/files/patch-r11-add_symlink_handling_to_ctm (+286 lines)
Line 0 Link Here
1
--- ctm/ctm.h.ORI	2023-12-29 08:53:14.808809000 +0100
2
+++ ctm/ctm.h	2023-12-29 08:53:14.827122000 +0100
3
@@ -25,6 +25,7 @@
4
 #include <sys/file.h>
5
 #include <sys/time.h>
6
 #include <stdint.h>
7
+#include <limits.h>
8
 
9
 #define VERSION "2.0"
10
 
11
@@ -43,6 +44,7 @@
12
 #define CTM_F_Bytes		0x07
13
 #define CTM_F_Release		0x08
14
 #define CTM_F_Forward		0x09
15
+#define CTM_F_Targetname	0x0a
16
 
17
 /* The qualifiers... */
18
 #define CTM_Q_MASK		0xff00
19
@@ -51,6 +53,7 @@
20
 #define CTM_Q_Name_New		0x0400
21
 #define CTM_Q_Name_Subst	0x0800
22
 #define CTM_Q_Name_Svnbase	0x1000
23
+#define CTM_Q_Name_Link		0x2000
24
 #define CTM_Q_MD5_After		0x0100
25
 #define CTM_Q_MD5_Before	0x0200
26
 #define CTM_Q_MD5_Chunk		0x0400
27
--- ctm/ctm_syntax.c.ORI	2023-12-29 08:53:14.816487000 +0100
28
+++ ctm/ctm_syntax.c	2023-12-29 08:59:53.103142000 +0100
29
@@ -68,6 +68,13 @@
30
 static int ctmSV[] = /* Forward to svnadmin load */
31
     { Name|Dir|Svnbase, Release, Count, Forward|SVN, 0 };
32
 
33
+static int ctmLM[] = /* Link Make */
34
+    { Name|CTM_Q_Name_Link|New, Uid, Gid, Mode, CTM_F_Targetname, 0 };
35
+
36
+static int ctmLR[] = /* Link Remove */
37
+    { Name|CTM_Q_Name_Link, 0 };
38
+
39
+
40
 struct CTM_Syntax Syntax[] = {
41
     { "FM",  	ctmFM },
42
     { "FS",  	ctmFS },
43
@@ -79,4 +86,6 @@
44
     { "DR",  	ctmDR },
45
     { "TR",  	ctmTR },
46
     { "SV",  	ctmSV },
47
+    { "LM",  	ctmLM },
48
+    { "LR",  	ctmLR },
49
     { 0,    	0} };
50
--- ctm/ctm_pass1.c.ORI	2023-12-29 08:53:14.811803000 +0100
51
+++ ctm/ctm_pass1.c	2023-12-29 08:53:14.827382000 +0100
52
@@ -27,6 +27,7 @@
53
     int i,j,sep;
54
     intmax_t cnt, rel;
55
     u_char *md5=0,*name=0,*trash=0;
56
+    u_char* targetname = NULL;
57
     struct CTM_Syntax *sp;
58
     int slashwarn=0, match=0, total_matches=0;
59
     unsigned current;
60
@@ -71,6 +72,7 @@
61
 	Delete(md5);
62
 	Delete(name);
63
 	Delete(trash);
64
+	Delete( targetname );
65
 	cnt = -1;
66
 	/* if a filter list is defined we assume that all pathnames require
67
 	   an action opposite to that requested by the first filter in the
68
@@ -224,6 +226,9 @@
69
 			return Exit_Garbage;
70
 		    }
71
 		    GETFORWARD(cnt,NULL);
72
+		    break;
73
+		case CTM_F_Targetname:
74
+		    GETFIELDCOPY( targetname, sep );
75
 		    break;
76
 		default:
77
 			fprintf(stderr,"List = 0x%x\n",j);
78
--- ctm/ctm_pass2.c.ORI	2023-12-29 08:53:14.823718000 +0100
79
+++ ctm/ctm_pass2.c	2023-12-29 08:53:14.827299000 +0100
80
@@ -117,14 +117,14 @@
81
 			if( strcmp( LastRemoved, name ) != 0 )
82
 
83
 			/* XXX Check DR FR rec's for item */
84
-			if(-1 != stat(name,&st)) {
85
+			if(-1 != lstat(name,&st)) {
86
 			    fprintf(stderr,"  %s: %s exists.\n",
87
 				sp->Key,name);
88
 			    ret |= Exit_Forcible;
89
 			}
90
 			break;
91
 		    }
92
-		    if(-1 == stat(name,&st)) {
93
+		    if(-1 == lstat(name,&st)) {
94
 			fprintf(stderr,"  %s: %s doesn't exist.\n",
95
 			    sp->Key,name);
96
 		        if (sp->Key[1] == 'R')
97
@@ -173,10 +173,18 @@
98
 			}
99
 			break;
100
 		    }
101
+		    if( j & CTM_Q_Name_Link ) {
102
+		      if( ( st.st_mode & S_IFMT ) != S_IFLNK ) {
103
+			fprintf( stderr, "  %s: %s exist, but isn't link.\n", sp->Key,name );
104
+			ret |= Exit_NotOK;
105
+		      }
106
+		      break;
107
+		    }
108
 		    break;
109
 		case CTM_F_Uid:
110
 		case CTM_F_Gid:
111
 		case CTM_F_Mode:
112
+		case CTM_F_Targetname:
113
 		    GETFIELD(p,sep);
114
 		    break;
115
 		case CTM_F_MD5:
116
--- ctm/ctm_pass3.c.ORI	2023-12-29 08:53:14.814984000 +0100
117
+++ ctm/ctm_pass3.c	2023-12-29 08:59:08.227903000 +0100
118
@@ -23,7 +23,7 @@
119
 settime(const char *name, const struct timeval *times)
120
 {
121
 	if (SetTime)
122
-	    if (utimes(name,times)) {
123
+	    if (lutimes(name,times)) {
124
 		warn("utimes(): %s", name);
125
 		return -1;
126
 	    }
127
@@ -33,7 +33,7 @@
128
 int
129
 setmodefromchar(const char *name, const u_char *mode)
130
 {
131
-	return chmod(name, strtol(mode, NULL, 8));
132
+	return lchmod(name, strtol(mode, NULL, 8));
133
 }
134
 
135
 int
136
@@ -45,6 +45,7 @@
137
     intmax_t cnt,rel;
138
     char *svn_command = NULL;
139
     u_char *md5=0,*md5before=0,*trash=0,*name=0,*uid=0,*gid=0,*mode=0;
140
+    u_char* targetname = NULL;
141
     struct CTM_Syntax *sp;
142
     FILE *ed=0, *fd_to;
143
     struct stat st;
144
@@ -124,6 +125,7 @@
145
 	Delete(md5before);
146
 	Delete(trash);
147
 	Delete(name);
148
+	Delete( targetname );
149
 	cnt = -1;
150
 
151
 	GETFIELD(p,' ');
152
@@ -198,6 +200,10 @@
153
 			}
154
 		    }
155
 		    break;
156
+		case CTM_F_Targetname:
157
+		  //GETNAMECOPY( targetname, sep, j, Verbose );
158
+		  GETFIELDCOPY( targetname, sep );
159
+		  break;
160
 		default: WRONG
161
 		}
162
 	    }
163
@@ -337,6 +343,70 @@
164
 	}
165
 	if(!strcmp(sp->Key,"TR") || !strcmp(sp->Key,"SV"))
166
 	    continue;
167
+
168
+
169
+	if( strcmp( sp->Key, "LR" ) == 0 ) {
170
+
171
+	  if( KeepIt ) {
172
+	    if( Verbose > 1 )
173
+	      printf( " <%s> not removed\n", name );
174
+
175
+	  } else {
176
+	    if( unlink( name )) {
177
+	      fprintf( stderr, "unlink %s: %s\n", name, strerror( errno ));
178
+	      WRONG
179
+	    }
180
+	  }
181
+
182
+	  continue;
183
+	}
184
+
185
+
186
+	if( strcmp( sp->Key, "LM" ) == 0 ) {
187
+
188
+	  char* bn;				// basename
189
+	  char  cwd[ PATH_MAX ];
190
+
191
+	  if( getcwd( cwd, sizeof cwd ) == NULL ) {
192
+	    fprintf( stderr, "getcwd: %s\n", strerror( errno ) );
193
+	    WRONG
194
+	  }
195
+
196
+	  if( (bn = strrchr( name, '/' )) == NULL )	// no path component
197
+	    bn = name;					// basename
198
+
199
+	  else {					// have path component
200
+	    *bn++ = '\0';				// terminate path component
201
+	    if( chdir( name )) {
202
+	      fprintf( stderr, "chdir %s: %s\n", name, strerror( errno ));
203
+	      WRONG
204
+	    }
205
+	  }
206
+
207
+	  if( symlink( targetname, bn )) {
208
+	    fprintf( stderr, "symlink %s to %s: %s\n", targetname, bn, strerror( errno ));
209
+	    WRONG
210
+	  }
211
+
212
+	  if( chdir( cwd )) {				// go back
213
+	    fprintf( stderr, "chdir %s: %s\n", cwd, strerror( errno ));
214
+	    WRONG
215
+	  }
216
+
217
+	  *--bn = '/';					// restore name with path
218
+	  if( lstat( name, &st )) {
219
+	    fprintf( stderr, "stat %s: %s\n", name, strerror( errno ));
220
+	    WRONG
221
+	  } else if( (st.st_mode & S_IFMT) != S_IFLNK ) {
222
+	    fprintf( stderr, "%s: no link\n", name );
223
+	    WRONG
224
+	  }
225
+
226
+	  if( settime( name, times )) WRONG
227
+	  if( setmodefromchar( name, mode )) WRONG
228
+	  continue;
229
+	}
230
+
231
 	WRONG
232
     }
233
 
234
--- ctm/ctm_passb.c.ORI	2023-04-25 21:04:20.000000000 +0200
235
+++ ctm/ctm_passb.c	2023-12-29 09:03:07.551061000 +0100
236
@@ -26,6 +26,7 @@
237
     MD5_CTX ctx;
238
     int i,j,sep,cnt;
239
     u_char *md5=0,*md5before=0,*trash=0,*name=0,*uid=0,*gid=0,*mode=0;
240
+    u_char* targetname = NULL;
241
     struct CTM_Syntax *sp;
242
     FILE *b = 0;	/* backup command */
243
     u_char buf[BUFSIZ];
244
@@ -57,6 +58,7 @@
245
 	Delete(md5before);
246
 	Delete(trash);
247
 	Delete(name);
248
+	Delete( targetname );
249
 	cnt = -1;
250
 
251
 	GETFIELD(p,' ');
252
@@ -90,6 +92,7 @@
253
 		    break;
254
 		case CTM_F_Count: GETBYTECNT(cnt,sep); break;
255
 		case CTM_F_Bytes: GETDATA(trash,cnt); break;
256
+		case CTM_F_Targetname: GETFIELDCOPY( targetname, sep ); break;
257
 		default: WRONG
258
 		}
259
 	    }
260
@@ -98,7 +101,7 @@
261
 	if(name[j] == '/') name[j] = '\0';
262
 
263
 	if (KeepIt && 
264
-	    (!strcmp(sp->Key,"DR") || !strcmp(sp->Key,"FR")))
265
+	    (!strcmp(sp->Key,"DR") || !strcmp(sp->Key,"LR") || !strcmp(sp->Key,"FR")))
266
 	    continue;
267
 		
268
 	/* match the name against the elements of the filter list.  The
269
@@ -113,7 +116,9 @@
270
 	if (CTM_FILTER_DISABLE == match)
271
 		continue;
272
 
273
+	// Do we have to backup symlinks???
274
 	if (!strcmp(sp->Key,"FS") || !strcmp(sp->Key,"FN") ||
275
+	    !strcmp(sp->Key,"LR") || 
276
 	    !strcmp(sp->Key,"AS") || !strcmp(sp->Key,"DR") || 
277
 	    !strcmp(sp->Key,"FR")) {
278
 	    /* send name to the archiver for a backup */
279
@@ -135,6 +140,7 @@
280
     Delete(md5before);
281
     Delete(trash);
282
     Delete(name);
283
+    Delete( targetname );
284
 
285
     q = MD5End (&ctx,md5_1);
286
     GETFIELD(p,'\n');			/* <MD5> */
(-)misc/ctm/files/patch-r20-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