+/* setup_uhha(): Check characters in hwaddr, and make sure it's not
+ * a duplicate.
+ */
+int setup_uhha(struct query *q, char **argv, client *cl)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ char *hwaddr = argv[1];
+ int count;
+ EXEC SQL END DECLARE SECTION;
+ char *p;
+
+ if (*hwaddr && strcasecmp(hwaddr, "unknown"))
+ {
+ for (p = hwaddr; *p; p++)
+ {
+ if (isupper(*p))
+ *p = tolower(*p);
+ if (!isxdigit(*p))
+ return MR_BAD_CHAR;
+ }
+ if (p != hwaddr + 12)
+ return MR_ADDRESS;
+
+ EXEC SQL SELECT COUNT(hwaddr) INTO :count
+ FROM machine WHERE hwaddr = :hwaddr;
+ if (count)
+ return MR_NOT_UNIQUE;
+ }
+
+ return MR_SUCCESS;
+}
+
+/* setup_aprn(): Make sure name/duplexname don't conflict with
+ * anything. If [ANY] was specified for the spooling host, pick the
+ * least loaded print server that serves this kind of printer.
+ */
+int setup_aprn(struct query *q, char **argv, client *cl)
+{
+ int best = -1, row;
+ char *p;
+ EXEC SQL BEGIN DECLARE SECTION;
+ int mid, usage, count;
+ char types[STRINGS_STRING_SIZE], *hwaddr, *name, *duplexname, *oldname;
+ EXEC SQL END DECLARE SECTION;
+
+ /* Check for aprn or uprn. */
+ if (q->type == APPEND)
+ row = 0;
+ else
+ row = 1;
+
+ name = argv[PRN_NAME + row];
+ duplexname = argv[PRN_DUPLEXNAME + row];
+ oldname = argv[0];
+
+ if (!*name)
+ return MR_BAD_CHAR;
+ else
+ {
+ if (q->type == APPEND)
+ {
+ EXEC SQL SELECT COUNT(name) INTO :count FROM printers
+ WHERE name = :name OR duplexname = :name;
+ }
+ else
+ {
+ EXEC SQL SELECT COUNT(name) INTO :count FROM printers
+ WHERE ( name = :name OR duplexname = :name )
+ AND name != :oldname;
+ }
+ if (dbms_errno)
+ return mr_errcode;
+ if (count)
+ return MR_NOT_UNIQUE;
+ }
+
+ if (*duplexname)
+ {
+ if (q->type == APPEND)
+ {
+ EXEC SQL SELECT COUNT(name) INTO :count FROM printers
+ WHERE name = :duplexname OR duplexname = :duplexname;
+ }
+ else
+ {
+ EXEC SQL SELECT COUNT(name) INTO :count FROM printers
+ WHERE ( name = :duplexname OR duplexname = :duplexname )
+ AND name != :oldname;
+ }
+
+ if (dbms_errno)
+ return mr_errcode;
+ if (count)
+ return MR_NOT_UNIQUE;
+ }
+
+ if (!strcmp(name, duplexname))
+ return MR_NOT_UNIQUE;
+
+ mid = *(int *)argv[PRN_RM + row];
+ if (mid == -1)
+ {
+ EXEC SQL DECLARE csr_rm CURSOR FOR
+ SELECT ps.mach_id, s.string FROM printservers ps, strings s
+ WHERE ps.mach_id IN
+ ( SELECT mach_id FROM serverhosts WHERE service = 'PRINT'
+ AND enable = 1 )
+ AND ps.printer_types = s.string_id;
+ if (dbms_errno)
+ return mr_errcode;
+ EXEC SQL OPEN csr_rm;
+ if (dbms_errno)
+ return mr_errcode;
+
+ while (1)
+ {
+ EXEC SQL FETCH csr_rm INTO :mid, :types;
+ if (sqlca.sqlcode)
+ break;
+
+ for (p = strtok(types, ", "); p; p = strtok(NULL, ", "))
+ {
+ if (!strcasecmp(argv[PRN_TYPE + row], p))
+ {
+ EXEC SQL SELECT COUNT(name) INTO :usage
+ FROM printers WHERE rm = :mid;
+
+ if (best < 0 || usage < best)
+ {
+ best = usage;
+ *(int *)argv[PRN_RM + row] = mid;
+ break;
+ }
+ }
+ }
+ }
+ EXEC SQL CLOSE csr_rm;
+ if (dbms_errno)
+ return mr_errcode;
+
+ if (best == -1)
+ return MR_SERVICE;
+ }
+ else
+ {
+ EXEC SQL SELECT mach_id INTO :mid FROM printservers
+ WHERE mach_id = :mid;
+ if (sqlca.sqlcode)
+ return MR_SERVICE;
+ }
+
+ return MR_SUCCESS;
+}
+
+int setup_dpsv(struct query *q, char **argv, client *cl)
+{
+ int id;
+ EXEC SQL BEGIN DECLARE SECTION;
+ int cnt;
+ EXEC SQL END DECLARE SECTION;
+
+ id = *(int *)argv[0];
+
+ EXEC SQL SELECT COUNT(rm) INTO :cnt FROM printers
+ WHERE rm = :id;
+ if (cnt > 0)
+ return MR_IN_USE;
+
+ return MR_SUCCESS;
+}
+
+int setup_dcon(struct query *q, char *argv[], client *cl)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int id, cnt;
+ char containername[CONTAINERS_NAME_SIZE];
+ EXEC SQL END DECLARE SECTION;
+
+ id = *(int *)argv[0];
+ /* check to see if there are machines in this container */
+ EXEC SQL SELECT COUNT(mach_id) INTO :cnt FROM mcntmap
+ WHERE cnt_id = :id;
+ if (cnt > 0)
+ return MR_IN_USE;
+
+ /* check to see if there are subcontainers in this container */
+
+ /* get the container name */
+
+ EXEC SQL SELECT name INTO :containername
+ FROM containers
+ WHERE cnt_id = :id;
+
+ /* trim off the trailing spaces */
+ strcpy(containername, strtrim(containername));
+
+ EXEC SQL SELECT COUNT(cnt_id) INTO :cnt FROM containers
+ WHERE name LIKE :containername || '/' || '%';
+
+ if (cnt > 0)
+ return MR_IN_USE;
+
+ if (dbms_errno)
+ return mr_errcode;
+ return MR_SUCCESS;
+}
+