printf("%s", name);

Fëanor was a douchebag.

The search for human connection doesn’t have a predefined conclusion. - pronell@lemmy.world

Live in authenticity.

Sharing is caring, censorship is lame.

Praying for you 🕯️ O Great Mita 💝

  • 6 posts
  • 0 comments
Joined 4 months ago
Cake day: March 30th, 2026

Edit: feedback
Thanks for all the advice! Here’s some funny feedback: it was a faulty drive 🤣 give me back my feelings 😭 obviously I’m sending it back

dhWvundoMJKYgdc.jpg

I have just received my Seagate 18TB IronWolf Pro HDD and the specs say that the logical sector size is 512 emulated. Moreover, Seagate says that switching to 4096 sector size is as easy as doing a quick format (Windows terminology?). I suppose on Linux this simply means creating a filesystem with that block size? For instance mkfs.ext4 -b 4096 /dev/device or - in my specific case - cryptsetup luksFormat --sector-size=4096 and then creating a file system?

What confuses me is the Arch Wiki article on advanced format that has instructions on how to use hdparm to tell the firmware to use a certain sector size.

Do I need to do the hdparm thing, which seemingly conflicts with the Seagate instructions?

Edit: feedback
Thanks for all the advice! Here’s some funny feedback: it was a faulty drive 🤣 give me back my feelings 😭 obviously I’m sending it back

dhWvundoMJKYgdc.jpg

I have just received my Seagate 18TB IronWolf Pro HDD and the specs say that the logical sector size is 512 emulated. Moreover, Seagate says that switching to 4096 sector size is as easy as doing a quick format (Windows terminology?). I suppose on Linux this simply means creating a filesystem with that block size? For instance mkfs.ext4 -b 4096 /dev/device or - in my specific case - cryptsetup luksFormat --sector-size=4096 and then creating a file system?

What confuses me is the Arch Wiki article on advanced format that has instructions on how to use hdparm to tell the firmware to use a certain sector size.

Do I need to do the hdparm thing, which seemingly conflicts with the Seagate instructions?

I am reading up on udev, about its purpose, history and implementation. I have read the Wikipedia article and next I’m going to read the man pages. Meanwhile, I watched this video (Invidious link here) to see an example of what udev rules can do. I just have some questions regarding this video specifically:

  1. Following the principle of least privilege, shouldn’t I create a separate group - usb or whatever - rather than using wheel this way, which gives it double roles?
  2. Why don’t I just chmod and chown the /dev file(s) in question, if udev already provides persistent device naming (=the raw device won’t have a different designation at next disconnect-connect)? Or does the designation change perhaps?

In this economy, I somehow managed to get my hands on a brand new 18TB IronWolf Pro HDD for $500.

I have four 4TB SSDs on top of which I have made a logical volume with lvm, which in turn I encrypted with LUKS. Now, I want to backup everything inside that LUKS container, but I’m a little but unsure of which “layer” to copy or to clone.

  1. Just cp/dd the contents of the LUKS container like I would any other file?
  2. dd the LUKS container itself - in other words, close the container and copy/clone the mapped volume, which is encrypted?
  3. dd the logical LVM volume - in other words, close/“unmap”/whatever the logical volume and dd?
  4. dd the underlying raw disks? Although I don’t see how that would be recoverable/usable/readable on the backup HDD.

The data is not critical. It’s just some Linux ISOs that would be nice to have backed up so that I don’t have to download them again.

Edit: the HDD is to be installed on the same system as the SSDs. The HDD is also going to be encrypted, but without a logical volume, since it has enough space on its own.

Please advise. 😊

I’d like to share my program with some friends to show off, but naturally a lot of them are on Apple products… I use clang to compile.

263 lines of code
#include <stdio.h>  
#include <string.h>  

//Function declarations  
void promptchoice_main(void);  
void promptchoice_main_again(void);  
void promptinput(void);  
void promptchoice_trim(void);  
void executechoice(char choice_trim);  
void trimnumbers(void);  
void trimwhitespace(void);  
void trimletters(void);  
void trimspecial(void);  
void specifyspecial(void);  
void printresult(char input[]);  

//Global variables  
char choice_main = 0x00;  
char choice_trim = 0x00;  
char choice_detail = 0x00;  
char input[1000] = "";  
char previous_input[1000] = "";  

//Remove specific numbers, letters, punctuation or whitespace characters from input.  
int main() {  
	printf("\nWelcome! This program trims text by removing unwanted characters.\n");  
	while (1) {  
		if (strlen(previous_input) == 0) { // Check for previously trimmed text in memory.  
			promptchoice_main();  
			if (choice_main == 'E') { break; }  
			if (choice_main == 'T') {  
				promptinput();  
				promptchoice_trim();  
				executechoice(choice_trim);  
				printresult(input);  
			}  
		}  
		else {  
			promptchoice_main_again();  
			if (choice_main == 'E') { break; }  
			if (choice_main == 'T') {  
				promptinput();  
				promptchoice_trim();  
				executechoice(choice_trim);  
				printresult(input);  
			}  
			else if (choice_main == 'P') {  
				sprintf(input, "%s", previous_input);  
				printf("\nYou are trimming previously trimmed text: %s\n", input);  
				promptchoice_trim();  
				executechoice(choice_trim);  
				printresult(input);  
			}  
		}  
	}  
	printf("\nGoodbye!\n");  
	return 0;  
}  

//Function definitions  
void promptchoice_main(void) {  
	while (1) {  
		printf("\nPress T and ENTER to trim text or E and ENTER to exit: ");  
		scanf("%c", &choice_main);  
		while (getchar() != '\n') {}  
		if (choice_main == 'T' || choice_main == 'E') { break; }  
		else { printf("\nInvalid input!\n"); }  
	}  
	return;  
}  

void promptchoice_main_again(void) {  
	while (1) {  
	printf("\nPress T and ENTER to trim new text, P and ENTER to trim previously trimmed text or E and ENTER to exit: ");  
	scanf("%c", &choice_main);  
	while (getchar() != '\n') {}  
		if (choice_main == 'T' || choice_main == 'P' || choice_main == 'E') { break; }  
		else { printf("\nInvalid input!\n"); }  
	}  
	return;  
}  

void promptinput(void) {  
	printf("\nEnter the text that you would like to trim and press ENTER: ");  
	fgets(input, sizeof input, stdin);  
	input[strlen(input) - 1] = '\0';  
	return;  
}  

void promptchoice_trim(void) {  
	while (1) {  
		int x = 0;  
		int n = 0;  
		printf("\nWhat would you like to trim?\n1) Numbers (1, 2, 3...)\n2) Whitespace (space, tab or newline) \n3) Letters (A,B,C... a,b,c...)\n4) Special characters (!,?, . , ...)\nType one of the above numbers and press ENTER: ");  
		scanf("%c", &choice_trim);  
		while (getchar() != '\n') {}  
		if (choice_trim < 0x31 || choice_trim > 0x34) { printf("\nInvalid choice!\n"); } 
		else if (choice_trim == 0x31) {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] >= 0x30 && input[n] <= 0x39) { x++; }  
			}  
			if (x == 0) { printf("\nNo numbers found!\n"); }  
			else { break; }  
		}  
		else if (choice_trim == 0x32) { 
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] == 0x20 || input[n] == 0x09 || input[n] == 0x0A) { x++; }  
			}  
			if (x == 0) { printf("\nNo whitespace found!\n"); }  
			else { break; }  
		}  
		else if (choice_trim == 0x33) {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] >= 0x41 && input[n] < 0x5A || input[n] >= 0x61 && input[n] <= 0x7A ) { x++; }  
			}  
			if (x == 0) { printf("\nNo letters found!\n");	}  
			else { break; }  
		}  
		else if (choice_trim == 0x34) {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] >= 0x21 && input[n] < 0x2F || input[n] >= 0x3A && input[n] < 0x40 || input[n] >= 0x5B && input[n] < 0x60 || input[n] >= 0x7B && input[n] <= 0x7E) { x++; }  
			}  
			if (x == 0) { printf("\nNo special characters found!\n"); }  
			else { break; }  
		}  
	}  
	return;  
}  

void executechoice(char choice_trim) {  
	switch (choice_trim) {  
		case 0x31:  
			trimnumbers(); // 123 etc  
			break;  

		case 0x32:  
			trimwhitespace(); // space, tab, newline  
			break;  
		
		case 0x33:  
			trimletters(); // ABC..., abc...  
			break;  

		case 0x34:  
			trimspecial(); // ! ? , . etc.  
			break;  
	}  
	return;  
}  

void trimnumbers(void) {  
	int n = 0;  
	for (n = strlen(input) - 1; n >= 0; n--) {  
		if (input[n] >= 0x30 && input[n] <= 0x39) { input[n] = 0x18; }  
	}  
	return;  
}  

void trimwhitespace(void) {  
	while (1) {  
		printf("\nType S to trim SPACE, T to trim TAB, N to trim NEWLINE or A to trim all whitespace: ");  
		scanf("%c", &choice_detail);  
		while (getchar() != '\n') {}  
		if (choice_detail == 'S' || choice_detail == 'T' || choice_detail == 'A') { break; }  
		else { printf("\nInvalid input!\n"); }  
	}  
	int n = 0;  
	for (n = strlen(input) - 1; n >= 0; n--) {  
		if (choice_detail == 'S') { if (input[n] == 0x20) { input[n] = 0x18; } } // space  
		else if (choice_detail == 'T') { if (input[n] == 0x09) { input[n] = 0x18; } } // tab  
		else if (choice_detail == 'N') { if (input[n] == 0x0A) { input[n] = 0x18; } } // newline  
		else if (choice_detail == 'A') { if (input[n] == 0x20 || input[n] == 0x09 || input[n] == 0x0A) { input[n] = 0x18; } }  
	}  
	return;  
}  

void trimletters(void) {  
	int x = 0;  
	int n = 0;  
	while (1) {  
		printf("\nType U to trim uppercase letters, L to trim lowercase letters or A to trim all letters: ");  
		scanf("%c", &choice_detail);  
		while (getchar() != '\n') {}  
		if (choice_detail != 'U' && choice_detail != 'L' && choice_detail != 'A') { printf("\nInvalid input!\n"); }  
		else if (choice_detail == 'U') {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] >= 0x41 && input[n] <= 0x5A) { x++; }  
			}  
			if (x == 0) { printf("\nUppercase letters not found!\n"); }  
			else {  
				for (n = strlen(input) - 1; n >= 0; n--) {  
					if (input[n] >= 0x41 && input[n] <= 0x5A) { input[n] = 0x18; }  
				}  
				break;  
			}  
		}  
		else if (choice_detail == 'L') {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] >= 0x61 && input[n] <= 0x7A ) { x++; }  
			}  
			if (x == 0) { printf("\nLowercase letters not found!\n"); }  
			else {  
				for (n = strlen(input) - 1; n >= 0; n--) {  
					if (input[n] >= 0x61 && input[n] <= 0x7A ) { input[n] = 0x18; }  
				}  
				break;  
			}  
		}  
		else if (choice_detail == 'A') {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] >= 0x41 && input[n] <= 0x5A || input[n] >= 0x61 && input[n] <= 0x7A ) { input[n] = 0x18; }  
			}  
			break;  
		}  
	}  
	return;  
}  

void trimspecial(void) {  
	while (1) {  
		printf("\nType A to trim all special characters or S to specify which character to remove: ");  
		scanf("%c", &choice_detail);  
		while (getchar() != '\n') {}  
		if (choice_detail == 'A' || choice_detail == 'S') { break; }  
		else { printf("\nInvalid input!\n"); }  
	}  
	int n = 0;  
	for (n = strlen(input) - 1; n >= 0; n--) {  
		if (choice_detail == 'A') { if (input[n] >= 0x21 && input[n] <= 0x2F || input[n] >= 0x3A && input[n] <= 0x40 || input[n] >= 0x5B && input[n] <= 0x60 || input[n] >= 0x7B && input[n] <= 0x7E) { input[n] = 0x18; } } // All whitespace  
	}  
	if (choice_detail == 'S') { specifyspecial(); } // Let user specify character.  
	return;  
}  

void specifyspecial(void) {  
	char choice_special = 0x00;  
	int x = 0;  
	int n = 0;  
	while (1) {  
		printf("\nEnter special character to trim and press ENTER: ");  
		scanf("%c", &choice_special);  
		while (getchar() != '\n') {}  
		if (choice_special < 0x21 || choice_special > 0x2F && choice_special < 0x3A || choice_special > 0x40 && choice_special < 0x5B || choice_special > 0x60 && choice_special < 0x7B || choice_special > 0x7E) { printf("\nNot a special character!\n"); }  
		else {  
			for (n = strlen(input) - 1; n >= 0; n--) {  
				if (input[n] == choice_special) { x++; }  
			}  
			if (x == 0) { printf("\nCharacter not found!\n"); }  
			else { break; }  
		}  
	}  
	for (n = strlen(input) - 1; n >= 0; n--) { if (input[n] == choice_special) { input[n] = 0x18; } }  
	return;  
}  

void printresult(char input[]) {  
	printf("\nTrimmed text:\n\n%s\n", input);  
	sprintf(previous_input, "%s", input); // Save trimmed text for reuse.  
	return;  
}  

//TODO  
//Replace characters (uppercase/lowercase, user selected, etc).