1*dd7c9be3SJavier Martinez Canillas // SPDX-License-Identifier: GPL-2.0-or-later 2*dd7c9be3SJavier Martinez Canillas /* 3*dd7c9be3SJavier Martinez Canillas * Program that atomically exchanges two paths using 4*dd7c9be3SJavier Martinez Canillas * the renameat2() system call RENAME_EXCHANGE flag. 5*dd7c9be3SJavier Martinez Canillas * 6*dd7c9be3SJavier Martinez Canillas * Copyright 2022 Red Hat Inc. 7*dd7c9be3SJavier Martinez Canillas * Author: Javier Martinez Canillas <javierm@redhat.com> 8*dd7c9be3SJavier Martinez Canillas */ 9*dd7c9be3SJavier Martinez Canillas 10*dd7c9be3SJavier Martinez Canillas #define _GNU_SOURCE 11*dd7c9be3SJavier Martinez Canillas #include <fcntl.h> 12*dd7c9be3SJavier Martinez Canillas #include <stdio.h> 13*dd7c9be3SJavier Martinez Canillas #include <stdlib.h> 14*dd7c9be3SJavier Martinez Canillas print_usage(const char * program)15*dd7c9be3SJavier Martinez Canillasvoid print_usage(const char *program) 16*dd7c9be3SJavier Martinez Canillas { 17*dd7c9be3SJavier Martinez Canillas printf("Usage: %s [oldpath] [newpath]\n", program); 18*dd7c9be3SJavier Martinez Canillas printf("Atomically exchange oldpath and newpath\n"); 19*dd7c9be3SJavier Martinez Canillas } 20*dd7c9be3SJavier Martinez Canillas main(int argc,char * argv[])21*dd7c9be3SJavier Martinez Canillasint main(int argc, char *argv[]) 22*dd7c9be3SJavier Martinez Canillas { 23*dd7c9be3SJavier Martinez Canillas int ret; 24*dd7c9be3SJavier Martinez Canillas 25*dd7c9be3SJavier Martinez Canillas if (argc != 3) { 26*dd7c9be3SJavier Martinez Canillas print_usage(argv[0]); 27*dd7c9be3SJavier Martinez Canillas exit(EXIT_FAILURE); 28*dd7c9be3SJavier Martinez Canillas } 29*dd7c9be3SJavier Martinez Canillas 30*dd7c9be3SJavier Martinez Canillas ret = renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_EXCHANGE); 31*dd7c9be3SJavier Martinez Canillas if (ret) { 32*dd7c9be3SJavier Martinez Canillas perror("rename exchange failed"); 33*dd7c9be3SJavier Martinez Canillas exit(EXIT_FAILURE); 34*dd7c9be3SJavier Martinez Canillas } 35*dd7c9be3SJavier Martinez Canillas 36*dd7c9be3SJavier Martinez Canillas exit(EXIT_SUCCESS); 37*dd7c9be3SJavier Martinez Canillas } 38