summaryrefslogtreecommitdiffstats
path: root/mga-bg-res/mga-bg-res.c
blob: 6061587f008ee170d61da65c41ef5f9913f7ee02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#define PATH "/usr/share/mga/backgrounds/"
#define DSTLINK PATH"default.jpg"
#define SRCLINK_PREFIX PATH"Mageia-Default-"
#define SRCLINK_SUFFIX ".jpg"
#define SRCLINK SRCLINK_PREFIX"%s"SRCLINK_SUFFIX
#define RESSIZE 20
#define SRCSIZE (RESSIZE+strlen(SRCLINK_PREFIX)+strlen(SRCLINK_SUFFIX) + 1)
#define ALLOWCHARS "0123456789x"

int main(int argc, char* argv[]) {
	char src[SRCSIZE];
	char res[RESSIZE];
	int l;

	// check argument
	if (argc != 2) {
		fprintf(stderr, "Need a resolution argument, eg: '1920x1080'.\n");
		return 1;
	}

	// get the res (max RESSIZE)
	l = snprintf(res, RESSIZE, argv[1]);
	if (l < 5) {
		fprintf(stderr, "Malformed resolution argument, eg: '1920x1080'.\n");
		return 2;
	}

	// to be sure, set the last char as 0
	if (l < RESSIZE)
		res[l] = 0;
	else
		res[RESSIZE-1] = 0;

	// check if the resolution contains acceptable chars
	l = strspn(res, ALLOWCHARS);
	if (l < 5) {
		fprintf(stderr, "Malformed resolution argument, eg: '1920x1080'.\n");
		return 2;
	}

	// to be sure, set the last char as 0
	if (l < RESSIZE)
		res[l] = 0;
	else
		res[RESSIZE-1] = 0;

	// create target string
	if (snprintf(src, SRCSIZE, SRCLINK, res) < 0) {
		fprintf(stderr, "Unknown error determining symlink target.\n");
		return 3;
	}

	// check if symlink target exists
	if (access(src, F_OK) < 0) {
		fprintf(stderr, "No image for this resolution.\n");
		return 0;
	}

	// set symlink
	if (symlink(src, DSTLINK) < 0) {
		if (errno != EEXIST) {
			fprintf(stderr, "Symlink could not be set: %s.\n", strerror(errno));
			return 4;
		}

		// since the destination exists, remove and try again
		if (unlink(DSTLINK) < 0) {
			fprintf(stderr, "Symlink could not be forced: %s.\n", strerror(errno));
			return 5;
		}
		if (symlink(src, DSTLINK) < 0) {
			fprintf(stderr, "Unknown error during forced symlink: %s.\n", strerror(errno));
			return 6;
		}
	}
	return 0;
}