LCOV - code coverage report
Current view: top level - source3/printing - rap_jobid.c (source / functions) Hit Total Coverage
Test: coverage report for master 70ed9daf Lines: 26 79 32.9 %
Date: 2024-01-11 09:59:51 Functions: 2 3 66.7 %

          Line data    Source code
       1             : /*
       2             :  *  Maintain rap vs spoolss jobids
       3             :  *
       4             :  *  This program is free software; you can redistribute it and/or modify
       5             :  *  it under the terms of the GNU General Public License as published by
       6             :  *  the Free Software Foundation; either version 3 of the License, or
       7             :  *  (at your option) any later version.
       8             :  *
       9             :  *  This program is distributed in the hope that it will be useful,
      10             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             :  *  GNU General Public License for more details.
      13             :  *
      14             :  *  You should have received a copy of the GNU General Public License
      15             :  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
      16             :  */
      17             : 
      18             : /*
      19             :    the printing backend revolves around a tdb database that stores the
      20             :    SMB view of the print queue
      21             : 
      22             :    The key for this database is a jobid - a internally generated number that
      23             :    uniquely identifies a print job
      24             : 
      25             :    reading the print queue involves two steps:
      26             :      - possibly running lpq and updating the internal database from that
      27             :      - reading entries from the database
      28             : 
      29             :    jobids are assigned when a job starts spooling.
      30             : */
      31             : 
      32             : #include "rap_jobid.h"
      33             : #include <tdb.h>
      34             : #include "source3/include/util_tdb.h"
      35             : #include "lib/util/string_wrappers.h"
      36             : 
      37             : static TDB_CONTEXT *rap_tdb;
      38             : static uint16_t next_rap_jobid;
      39             : struct rap_jobid_key {
      40             :         fstring sharename;
      41             :         uint32_t  jobid;
      42             : };
      43             : 
      44             : /***************************************************************************
      45             :  Nightmare. LANMAN jobid's are 16 bit numbers..... We must map them to 32
      46             :  bit RPC jobids.... JRA.
      47             : ***************************************************************************/
      48             : 
      49          28 : uint16_t pjobid_to_rap(const char* sharename, uint32_t jobid)
      50             : {
      51           0 :         uint16_t rap_jobid;
      52           0 :         TDB_DATA data, key;
      53           0 :         struct rap_jobid_key jinfo;
      54           0 :         uint8_t buf[2];
      55             : 
      56          28 :         DEBUG(10,("pjobid_to_rap: called.\n"));
      57             : 
      58          28 :         if (!rap_tdb) {
      59             :                 /* Create the in-memory tdb. */
      60          28 :                 rap_tdb = tdb_open_log(NULL, 0, TDB_INTERNAL, (O_RDWR|O_CREAT), 0644);
      61          28 :                 if (!rap_tdb)
      62           0 :                         return 0;
      63             :         }
      64             : 
      65          28 :         ZERO_STRUCT( jinfo );
      66          28 :         fstrcpy( jinfo.sharename, sharename );
      67          28 :         jinfo.jobid = jobid;
      68          28 :         key.dptr = (uint8_t *)&jinfo;
      69          28 :         key.dsize = sizeof(jinfo);
      70             : 
      71          28 :         data = tdb_fetch(rap_tdb, key);
      72          28 :         if (data.dptr && data.dsize == sizeof(uint16_t)) {
      73           0 :                 rap_jobid = SVAL(data.dptr, 0);
      74           0 :                 SAFE_FREE(data.dptr);
      75           0 :                 DEBUG(10,("pjobid_to_rap: jobid %u maps to RAP jobid %u\n",
      76             :                         (unsigned int)jobid, (unsigned int)rap_jobid));
      77           0 :                 return rap_jobid;
      78             :         }
      79          28 :         SAFE_FREE(data.dptr);
      80             :         /* Not found - create and store mapping. */
      81          28 :         rap_jobid = ++next_rap_jobid;
      82          28 :         if (rap_jobid == 0)
      83           0 :                 rap_jobid = ++next_rap_jobid;
      84          28 :         SSVAL(buf,0,rap_jobid);
      85          28 :         data.dptr = buf;
      86          28 :         data.dsize = sizeof(rap_jobid);
      87          28 :         tdb_store(rap_tdb, key, data, TDB_REPLACE);
      88          28 :         tdb_store(rap_tdb, data, key, TDB_REPLACE);
      89             : 
      90          28 :         DEBUG(10,("pjobid_to_rap: created jobid %u maps to RAP jobid %u\n",
      91             :                 (unsigned int)jobid, (unsigned int)rap_jobid));
      92          28 :         return rap_jobid;
      93             : }
      94             : 
      95           0 : bool rap_to_pjobid(uint16_t rap_jobid, fstring sharename, uint32_t *pjobid)
      96             : {
      97           0 :         TDB_DATA data, key;
      98           0 :         uint8_t buf[2];
      99             : 
     100           0 :         DEBUG(10,("rap_to_pjobid called.\n"));
     101             : 
     102           0 :         if (!rap_tdb)
     103           0 :                 return False;
     104             : 
     105           0 :         SSVAL(buf,0,rap_jobid);
     106           0 :         key.dptr = buf;
     107           0 :         key.dsize = sizeof(rap_jobid);
     108           0 :         data = tdb_fetch(rap_tdb, key);
     109           0 :         if ( data.dptr && data.dsize == sizeof(struct rap_jobid_key) )
     110             :         {
     111           0 :                 struct rap_jobid_key *jinfo = (struct rap_jobid_key*)data.dptr;
     112           0 :                 if (sharename != NULL) {
     113           0 :                         fstrcpy( sharename, jinfo->sharename );
     114             :                 }
     115           0 :                 *pjobid = jinfo->jobid;
     116           0 :                 DEBUG(10,("rap_to_pjobid: jobid %u maps to RAP jobid %u\n",
     117             :                         (unsigned int)*pjobid, (unsigned int)rap_jobid));
     118           0 :                 SAFE_FREE(data.dptr);
     119           0 :                 return True;
     120             :         }
     121             : 
     122           0 :         DEBUG(10,("rap_to_pjobid: Failed to lookup RAP jobid %u\n",
     123             :                 (unsigned int)rap_jobid));
     124           0 :         SAFE_FREE(data.dptr);
     125           0 :         return False;
     126             : }
     127             : 
     128         677 : void rap_jobid_delete(const char* sharename, uint32_t jobid)
     129             : {
     130           0 :         TDB_DATA key, data;
     131           0 :         uint16_t rap_jobid;
     132           0 :         struct rap_jobid_key jinfo;
     133           0 :         uint8_t buf[2];
     134             : 
     135         677 :         DEBUG(10,("rap_jobid_delete: called.\n"));
     136             : 
     137         677 :         if (!rap_tdb)
     138         677 :                 return;
     139             : 
     140           0 :         ZERO_STRUCT( jinfo );
     141           0 :         fstrcpy( jinfo.sharename, sharename );
     142           0 :         jinfo.jobid = jobid;
     143           0 :         key.dptr = (uint8_t *)&jinfo;
     144           0 :         key.dsize = sizeof(jinfo);
     145             : 
     146           0 :         data = tdb_fetch(rap_tdb, key);
     147           0 :         if (!data.dptr || (data.dsize != sizeof(uint16_t))) {
     148           0 :                 DEBUG(10,("rap_jobid_delete: cannot find jobid %u\n",
     149             :                         (unsigned int)jobid ));
     150           0 :                 SAFE_FREE(data.dptr);
     151           0 :                 return;
     152             :         }
     153             : 
     154           0 :         DEBUG(10,("rap_jobid_delete: deleting jobid %u\n",
     155             :                 (unsigned int)jobid ));
     156             : 
     157           0 :         rap_jobid = SVAL(data.dptr, 0);
     158           0 :         SAFE_FREE(data.dptr);
     159           0 :         SSVAL(buf,0,rap_jobid);
     160           0 :         data.dptr = buf;
     161           0 :         data.dsize = sizeof(rap_jobid);
     162           0 :         tdb_delete(rap_tdb, key);
     163           0 :         tdb_delete(rap_tdb, data);
     164             : }

Generated by: LCOV version 1.14