It's fairly obvious that no one has tried to upload a driver
authorGerald Carter <jerry@samba.org>
Thu, 27 Jun 2002 18:10:56 +0000 (18:10 +0000)
committerGerald Carter <jerry@samba.org>
Thu, 27 Jun 2002 18:10:56 +0000 (18:10 +0000)
to a Samba print server running HEAD in a while.  This has been broken
since tridge's changes to make_connection() to not do the chdir()
to the connect_path.  Sorry it took me so long to get around to fixing it.

The problem occured with our internal use of make_connection().

jerry

source/printing/nt_printing.c
source/smbd/service.c

index 08d5ea430a512b5f5cf1296aeba5cf3ae086caa3..0ec960b3f06e85e550978336c6f7ae376737a79b 100644 (file)
@@ -1064,7 +1064,7 @@ static uint32 get_correct_cversion(fstring architecture, fstring driverpath_in,
        /* Null password is ok - we are already an authenticated user... */
        null_pw = data_blob(NULL, 0);
        become_root();
-       conn = make_connection("print$", null_pw, "A:", user->vuid, &nt_status);
+       conn = make_connection_with_chdir("print$", null_pw, "A:", user->vuid, &nt_status);
        unbecome_root();
 
        if (conn == NULL) {
@@ -1382,7 +1382,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
 
        become_root();
        null_pw = data_blob(NULL, 0);
-       conn = make_connection("print$", null_pw, "A:", user->vuid, &nt_status);
+       conn = make_connection_with_chdir("print$", null_pw, "A:", user->vuid, &nt_status);
        unbecome_root();
 
        if (conn == NULL) {
index caf1cef17a597808c4e3e7ca97fa0e2fad3c3301..590e4cedfc8f02822b7b413bcbca3be992b00934 100644 (file)
@@ -704,6 +704,34 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
        return(conn);
 }
 
+/***************************************************************************************
+ Simple wrapper function for make_connection() to include a call to 
+ vfs_chdir()
+ **************************************************************************************/
+connection_struct *make_connection_with_chdir(const char *service_in, DATA_BLOB password, 
+                                  char *dev, uint16 vuid, NTSTATUS *status)
+{
+       connection_struct *conn = NULL;
+       
+       conn = make_connection(service_in, password, dev, vuid, status);
+       
+       /*
+        * make_connection() does not change the directory for us any more
+        * so we have to do it as a separate step  --jerry
+        */
+        
+       if (vfs_ChDir(conn,conn->connectpath) != 0) {
+               DEBUG(0,("move_driver_to_download_area: Can't change directory to %s for [print$] (%s)\n",
+                        conn->connectpath,strerror(errno)));
+               yield_connection(conn, lp_servicename(SNUM(conn)));
+               conn_free(conn);
+               return NULL;
+       }
+       
+       return conn;
+}
+
 /****************************************************************************
  Make a connection to a service.
  *