diff options
| author | Mattias Andrée <maandree@kth.se> | 2021-04-11 07:14:05 +0200 | 
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2021-04-11 07:14:05 +0200 | 
| commit | 40543c028b6848161ceba3373d1245daafecb10e (patch) | |
| tree | 0c30af801b77702f6c5ea44e81af432c0128a218 | |
| parent | Improve set-contact-addresses so it can edit a looked up value (diff) | |
| download | contacts-40543c028b6848161ceba3373d1245daafecb10e.tar.gz contacts-40543c028b6848161ceba3373d1245daafecb10e.tar.bz2 contacts-40543c028b6848161ceba3373d1245daafecb10e.tar.xz | |
Improve set-contact-blocks so it can edit a looked up value
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
| -rw-r--r-- | set-contact-blocks.c | 117 | 
1 files changed, 82 insertions, 35 deletions
| diff --git a/set-contact-blocks.c b/set-contact-blocks.c index 31e6626..ac0f595 100644 --- a/set-contact-blocks.c +++ b/set-contact-blocks.c @@ -1,29 +1,40 @@  /* See LICENSE file for copyright and license details. */  #include "common.h" -USAGE("[-a ask-at | -A ask-at] [-s service | -S service] [-t type | -T type] " -      "[-u unblock-at | -U unblock-at] [-y style | -Y style] contact-id"); +USAGE("[-a ask-at] [-A ask-at] [-s service] [-S service] [-t type] [-T type] " +      "[-u unblock-at] [-U unblock-at] [-y style] [-Y style] contact-id");  int  main(int argc, char *argv[])  { -	int edit_srv = 0, edit_type = 0, edit_style = 0, edit_ask = 0, edit_ublk = 0; -	int edit = 0, explicit = 1; +	int add = 1, edit = 0, explicit = 1, lookup_explicit = 1;  	enum libcontacts_block_type shadow_block = LIBCONTACTS_BLOCK_IGNORE; +	enum libcontacts_block_type lookup_shadow_block = LIBCONTACTS_BLOCK_IGNORE;  	time_t soft_unblock = 0, hard_unblock = 0; +	time_t lookup_soft_unblock = 0, lookup_hard_unblock = 0;  	const char *srv = NULL, *type = NULL, *style = NULL, *ask = NULL, *ublk = NULL; +	const char *lookup_srv = NULL, *lookup_type = NULL, *lookup_style = NULL; +	const char *lookup_ask = NULL, *lookup_ublk = NULL;  	struct passwd *user;  	struct libcontacts_contact contact;  	char *p;  	size_t i;  	ARGBEGIN { +	case 'a': +		add = 0; +		if (lookup_ask) +			usage(); +		lookup_ask = ARG(); +		if (!isdigit(*lookup_ask)) +			usage(); +		lookup_soft_unblock = (time_t)strtoumax(lookup_ask, &p, 10); +		if (errno || *p) +			usage(); +		break;  	case 'A': -		edit_ask = 1;  		edit = 1; -		/* fall through */ -	case 'a':  		if (ask)  			usage();  		ask = ARG(); @@ -33,29 +44,43 @@ main(int argc, char *argv[])  		if (errno || *p)  			usage();  		break; +	case 's': +		add = 0; +		if (lookup_srv) +			usage(); +		lookup_srv = ARG(); +		break;  	case 'S': -		edit_srv = 1;  		edit = 1; -		/* fall through */ -	case 's':  		if (srv)  			usage();  		srv = ARG();  		break; +	case 't': +		add = 0; +		if (lookup_type) +			usage(); +		lookup_type = ARG(); +		break;  	case 'T': -		edit_type = 1;  		edit = 1; -		/* fall through */ -	case 't':  		if (type)  			usage();  		type = ARG();  		break; +	case 'u': +		add = 0; +		if (lookup_ublk) +			usage(); +		lookup_ublk = ARG(); +		if (!isdigit(*lookup_ublk)) +			usage(); +		lookup_hard_unblock = (time_t)strtoumax(lookup_ublk, &p, 10); +		if (errno || *p) +			usage(); +		break;  	case 'U': -		edit_ublk = 1;  		edit = 1; -		/* fall through */ -	case 'u':  		if (ublk)  			usage();  		ublk = ARG(); @@ -65,11 +90,14 @@ main(int argc, char *argv[])  		if (errno || *p)  			usage();  		break; +	case 'y': +		add = 0; +		if (lookup_style) +			usage(); +		lookup_style = ARG(); +		break;  	case 'Y': -		edit_style = 1;  		edit = 1; -		/* fall through */ -	case 'y':  		if (style)  			usage();  		style = ARG(); @@ -78,20 +106,41 @@ main(int argc, char *argv[])  		usage();  	} ARGEND; -	if ((!srv || edit_srv) && (!type || edit_type) && (!style || edit_style) && -	    (!ask || edit_ask) && (!ublk || edit_ublk)) +	if (add)  		edit = 0;  	if (argc != 1 || !*argv[0] || strchr(argv[0], '/'))  		usage(); +	if (lookup_type) { +		if (!strcmp(lookup_type, "explicit")) +			lookup_explicit = 1; +		else if (!strcmp(lookup_type, "shadow")) +			lookup_explicit = 0; +		else +			eprintf("value of -t shall be either \"explicit\" or \"shadow\"\n"); +	} +  	if (type) {  		if (!strcmp(type, "explicit"))  			explicit = 1;  		else if (!strcmp(type, "shadow"))  			explicit = 0;  		else -			eprintf("value of -%c shall be either \"explicit\" or \"shadow\"\n", edit_type ? 'T' : 't'); +			eprintf("value of -T shall be either \"explicit\" or \"shadow\"\n"); +	} + +	if (lookup_style) { +		if (!strcmp(lookup_style, "silent")) +			lookup_shadow_block = LIBCONTACTS_SILENT; +		else if (!strcmp(lookup_style, "as-off")) +			lookup_shadow_block = LIBCONTACTS_BLOCK_OFF; +		else if (!strcmp(lookup_style, "as-busy")) +			lookup_shadow_block = LIBCONTACTS_BLOCK_BUSY; +		else if (!strcmp(lookup_style, "ignore")) +			lookup_shadow_block = LIBCONTACTS_BLOCK_IGNORE; +		else +			eprintf("value of -y shall be either \"silent\", \"as-off\", \"as-busy\", or \"ignore\"\n");  	}  	if (style) { @@ -103,10 +152,8 @@ main(int argc, char *argv[])  			shadow_block = LIBCONTACTS_BLOCK_BUSY;  		else if (!strcmp(style, "ignore"))  			shadow_block = LIBCONTACTS_BLOCK_IGNORE; -		else if (edit_style) -			eprintf("value of -Y shall be either \"silent\", \"as-off\", \"as-busy\", or \"ignore\"\n");  		else -			eprintf("value of -y shall be either \"silent\", \"as-off\", \"as-busy\", or \"ignore\"\n"); +			eprintf("value of -Y shall be either \"silent\", \"as-off\", \"as-busy\", or \"ignore\"\n");  	}  	errno = 0; @@ -119,27 +166,27 @@ main(int argc, char *argv[])  	if (edit && contact.blocks) {  		for (i = 0; contact.blocks[i]; i++) { -			if (srv && !edit_srv && strcmpnul(contact.blocks[i]->service, srv)) +			if (lookup_srv && strcmpnul(contact.blocks[i]->service, lookup_srv))  				continue; -			if (type && !edit_type && contact.blocks[i]->explicit != explicit) +			if (lookup_type && contact.blocks[i]->explicit != lookup_explicit)  				continue; -			if (style && !edit_style && contact.blocks[i]->shadow_block != shadow_block) +			if (lookup_style && contact.blocks[i]->shadow_block != lookup_shadow_block)  				continue; -			if (ask && !edit_ask && contact.blocks[i]->soft_unblock != soft_unblock) +			if (lookup_ask && contact.blocks[i]->soft_unblock != lookup_soft_unblock)  				continue; -			if (ublk && !edit_ublk && contact.blocks[i]->hard_unblock != hard_unblock) +			if (lookup_ublk && contact.blocks[i]->hard_unblock != lookup_hard_unblock)  				continue; -			if (edit_srv) { +			if (srv) {  				free(contact.blocks[i]->service);  				contact.blocks[i]->service = estrdup(srv);  			} -			if (edit_type) +			if (type)  				contact.blocks[i]->explicit = explicit; -			if (edit_style) +			if (style)  				contact.blocks[i]->shadow_block = shadow_block; -			if (edit_ask) +			if (ask)  				contact.blocks[i]->soft_unblock = soft_unblock; -			if (edit_ublk) +			if (ublk)  				contact.blocks[i]->hard_unblock = hard_unblock;  		}  	} else if (!edit) { | 
