/*
* $Id$
*
- * Copyright (c) 2001 Michal Moskal <malekith@pld.org.pl>.
+ * Copyright (c) 2001 Michal Moskal <malekith@pld-linux.org>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* 20000 users in system database on Pentium class machine. After static link
* against uClibc it is under 2k on x86. Stdio hasn't been used intentionally.
*
- * Written for PLD GNU/Linux (http://www.pld.org.pl) setup package.
+ * Written for PLD Linux (http://www.pld-linux.org/) setup package.
*
* Compilation against uClibc:
* UCROOT=/usr/lib/bootdisk/usr
* $UCROOT/lib/libc.a -lgcc -o joinpasswd
* strip -R .comment -R .note joinpasswd
*
- * The idea of this program comes from Lukasz Dobrek <dobrek@pld.org.pl>.
+ * The idea of this program comes from Lukasz Dobrek <dobrek@pld-linux.org>.
*
*/
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
+#include <signal.h>
#define FILE1 "/etc/passwd"
#define FILE2 "/etc/shadow"
#define FILE3 "/etc/group"
+#define FILE4 "/etc/gshadow"
+
+/* #define OLD_LOCK */
+
+#define LOCK_FILE "/etc/.pwd.lock"
#define SUFFIX ".rpmnew"
/* maybe "-" or sth? */
*buf = 0;
}
+#ifndef OLD_LOCK
+int lock_fd = -1;
+void noop(int x)
+{
+ (void)x;
+}
+#endif
+
int try_lock(const char *name)
{
+#ifdef OLD_LOCK
char file[strlen(name) + 32], lock[strlen(name) + 32];
char buf[32];
int fd;
oops:
unlink(file);
return -1;
+#else
+ struct flock fl;
+
+ if (lock_fd != -1)
+ return -1;
+ lock_fd = open(LOCK_FILE, O_RDWR|O_CREAT, 0600);
+ if (lock_fd == -1)
+ return -1;
+ signal(SIGALRM, noop);
+ alarm(15);
+ memset(&fl, 0, sizeof(fl));
+ fl.l_type = F_WRLCK;
+ fl.l_whence = SEEK_SET;
+ if (fcntl(lock_fd, F_SETLKW, &fl) != 0) {
+ alarm(0);
+ close(lock_fd);
+ lock_fd = -1;
+ return -1;
+ }
+ alarm(0);
+
+ return 0;
+#endif
}
void unlock(const char *name)
{
+#ifdef OLD_LOCK
char lock[strlen(name) + 32];
strcpy(lock, name);
strcat(lock, ".lock");
unlink(lock);
+#else
+ if (lock_fd != -1)
+ close(lock_fd);
+ lock_fd = -1;
+#endif
}
void lock(const char *name)
close(fd);
#ifndef SILENT
- eputs("marging contest of `");
+ eputs("merging contest of `");
eputs(old_name);
eputs("' with `");
eputs(new_name);
int main()
{
-#if 0
+#if 1
join(FILE1, FILE1 SUFFIX, FILE1 BACKUP);
join(FILE2, FILE2 SUFFIX, FILE2 BACKUP);
join(FILE3, FILE3 SUFFIX, FILE3 BACKUP);
+ join(FILE4, FILE4 SUFFIX, FILE4 BACKUP);
#else
join("test", "test.new", "test.old");
#endif