Home | History | Annotate | Download | only in lpadmin
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     28 /*	All Rights Reserved   */
     29 
     30 
     31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     32 
     33 #include <stdio.h>
     34 #include <string.h>
     35 #include <errno.h>
     36 #include <limits.h>
     37 #include <sys/types.h>
     38 #include <stdlib.h>
     39 #include <libintl.h>
     40 
     41 #include "lp.h"
     42 #include "class.h"
     43 #include "printers.h"
     44 #include "msgs.h"
     45 
     46 char **
     47 pick_opts(char * infile_opts, char ** new_opts)
     48 {
     49 	char * flasts = NULL;
     50 	char * old_opt;
     51 	char ** final_opts = NULL;
     52 	int key_len;
     53 	int keyfound = 0;
     54 	char ** head;
     55 
     56 	if (infile_opts == NULL || new_opts == NULL) {
     57 	(void) printf("lpadmin error: Cannot process -o options");
     58 		return (NULL);
     59 	}
     60 
     61 	head = new_opts;
     62 	for (; *new_opts != NULL; new_opts++) {
     63 		if (strlen(*new_opts) > (strcspn(*new_opts, "=") + 1)) {
     64 			if ((addlist(&final_opts, *new_opts)) != 0) {
     65 				fprintf(stderr,
     66 				    gettext("lpadmin: System Error %d\n"),
     67 				    errno);
     68 
     69 				return (NULL);
     70 			}
     71 		}
     72 	}
     73 	/*
     74 	 * For each currently set option, ie, those already in the file,
     75 	 * compare to new list from lpadmin (new_opts).
     76 	 */
     77 	for (old_opt = strtok_r(infile_opts, LP_SEP, &flasts);
     78 		old_opt != NULL; old_opt = strtok_r(NULL, LP_SEP, &flasts)) {
     79 
     80 		keyfound = 0;
     81 
     82 		for (new_opts = head; *new_opts != NULL; new_opts++) {
     83 
     84 			key_len = strcspn(*new_opts, "=");
     85 			/*
     86 			 * if the keys match, and the the key from the
     87 			 * lpadmin -o has a value, take the new value from
     88 			 * lpadmin
     89 			 */
     90 			if ((strncmp(old_opt, *new_opts, key_len + 1)) == 0) {
     91 				keyfound++;
     92 			}
     93 		}
     94 		if (keyfound == 0) {
     95 			if ((addlist(&final_opts, old_opt)) != 0) {
     96 				fprintf(stderr,
     97 				    gettext("lpadmin: System Error %d\n"),
     98 				    errno);
     99 
    100 				return (NULL);
    101 			}
    102 		}
    103 
    104 	}
    105 
    106 	return (final_opts);
    107 }
    108